From 2039567395da75a3ae318fb82738cdcf2caa05a1 Mon Sep 17 00:00:00 2001
From: marha <marha@users.sourceforge.net>
Date: Wed, 30 Mar 2011 06:43:04 +0000
Subject: mesa git update 30 Mar 2011

---
 mesalib/src/mesa/main/api_exec.c                   |  1462 +-
 mesalib/src/mesa/main/attrib.c                     |    21 +-
 mesalib/src/mesa/main/blend.c                      |    37 +-
 mesalib/src/mesa/main/clear.c                      |  1142 +-
 mesalib/src/mesa/main/colortab.c                   |     7 +-
 mesalib/src/mesa/main/dlist.c                      |    27 +
 mesalib/src/mesa/main/enums.c                      | 12601 +++++++++---------
 mesalib/src/mesa/main/extensions.c                 |     4 +-
 mesalib/src/mesa/main/fbobject.c                   |    38 +-
 mesalib/src/mesa/main/ff_fragment_shader.cpp       |  3246 ++---
 mesalib/src/mesa/main/fog.c                        |   403 +-
 mesalib/src/mesa/main/formats.c                    |   100 +-
 mesalib/src/mesa/main/formats.h                    |    15 +-
 mesalib/src/mesa/main/get.c                        |    45 +-
 mesalib/src/mesa/main/glapidispatch.h              |  1290 +-
 mesalib/src/mesa/main/image.c                      |    28 +-
 mesalib/src/mesa/main/macros.h                     |     3 +-
 mesalib/src/mesa/main/mtypes.h                     |    22 +-
 mesalib/src/mesa/main/pack.c                       | 10117 +++++++-------
 mesalib/src/mesa/main/remap_helper.h               | 13186 ++++++++++---------
 mesalib/src/mesa/main/state.c                      |    40 +-
 mesalib/src/mesa/main/texenv.c                     |  2081 +--
 mesalib/src/mesa/main/texfetch.c                   |    86 +-
 mesalib/src/mesa/main/texfetch_tmp.h               |  4273 +++---
 mesalib/src/mesa/main/texformat.c                  |    49 +-
 mesalib/src/mesa/main/teximage.c                   |    31 +-
 mesalib/src/mesa/main/texparam.c                   |    37 +-
 mesalib/src/mesa/main/texstore.c                   |  9565 +++++++-------
 mesalib/src/mesa/main/uniforms.c                   |  3166 ++---
 mesalib/src/mesa/main/version.c                    |   573 +-
 mesalib/src/mesa/program/arbprogparse.c            |   441 +-
 mesalib/src/mesa/program/ir_to_mesa.cpp            |  6641 +++++-----
 mesalib/src/mesa/program/prog_statevars.c          |  2390 ++--
 mesalib/src/mesa/program/prog_statevars.h          |   295 +-
 mesalib/src/mesa/program/programopt.c              |  1339 +-
 mesalib/src/mesa/program/programopt.h              |   106 +-
 mesalib/src/mesa/state_tracker/st_atom_blend.c     |     2 +-
 mesalib/src/mesa/state_tracker/st_atom_depth.c     |   320 +-
 .../src/mesa/state_tracker/st_atom_rasterizer.c    |   554 +-
 mesalib/src/mesa/state_tracker/st_cb_clear.c       |  1202 +-
 mesalib/src/mesa/state_tracker/st_cb_drawpixels.c  |    53 +-
 mesalib/src/mesa/state_tracker/st_cb_readpixels.c  |     7 +-
 mesalib/src/mesa/state_tracker/st_extensions.c     |  1093 +-
 mesalib/src/mesa/state_tracker/st_format.c         |  2596 ++--
 44 files changed, 40803 insertions(+), 39931 deletions(-)

(limited to 'mesalib/src/mesa')

diff --git a/mesalib/src/mesa/main/api_exec.c b/mesalib/src/mesa/main/api_exec.c
index 4101ac424..f7603705b 100644
--- a/mesalib/src/mesa/main/api_exec.c
+++ b/mesalib/src/mesa/main/api_exec.c
@@ -1,730 +1,732 @@
-/*
- * Mesa 3-D graphics library
- * Version:  7.1
- *
- * Copyright (C) 1999-2008  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"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-
-/**
- * \file api_exec.c
- * Initialize dispatch table with the immidiate mode functions.
- */
-
-
-#include "mfeatures.h"
-#include "accum.h"
-#include "api_loopback.h"
-#include "api_exec.h"
-#if FEATURE_ARB_vertex_program || FEATURE_ARB_fragment_program
-#include "arbprogram.h"
-#endif
-#include "atifragshader.h"
-#include "attrib.h"
-#include "blend.h"
-#if FEATURE_ARB_vertex_buffer_object
-#include "bufferobj.h"
-#endif
-#include "arrayobj.h"
-#if FEATURE_draw_read_buffer
-#include "buffers.h"
-#endif
-#include "clear.h"
-#include "clip.h"
-#include "colortab.h"
-#include "condrender.h"
-#include "context.h"
-#include "convolve.h"
-#include "depth.h"
-#include "dlist.h"
-#include "drawpix.h"
-#include "rastpos.h"
-#include "enable.h"
-#include "eval.h"
-#include "get.h"
-#include "feedback.h"
-#include "fog.h"
-#if FEATURE_EXT_framebuffer_object
-#include "fbobject.h"
-#endif
-#include "framebuffer.h"
-#include "hint.h"
-#include "histogram.h"
-#include "imports.h"
-#include "light.h"
-#include "lines.h"
-#include "matrix.h"
-#include "multisample.h"
-#include "pixel.h"
-#include "pixelstore.h"
-#include "points.h"
-#include "polygon.h"
-#include "queryobj.h"
-#include "readpix.h"
-#include "scissor.h"
-#include "stencil.h"
-#include "texenv.h"
-#include "texgetimage.h"
-#include "teximage.h"
-#include "texgen.h"
-#include "texobj.h"
-#include "texparam.h"
-#include "texstate.h"
-#include "texturebarrier.h"
-#include "transformfeedback.h"
-#include "mtypes.h"
-#include "varray.h"
-#include "viewport.h"
-#if FEATURE_NV_vertex_program || FEATURE_NV_fragment_program
-#include "nvprogram.h"
-#endif
-#if FEATURE_ARB_shader_objects
-#include "shaderapi.h"
-#include "uniforms.h"
-#endif
-#include "syncobj.h"
-#include "main/dispatch.h"
-
-
-#if FEATURE_GL
-
-
-/**
- * Initialize a dispatch table with pointers to Mesa's immediate-mode
- * commands.
- *
- * Pointers to glBegin()/glEnd() object commands and a few others
- * are provided via the GLvertexformat interface.
- *
- * \param ctx  GL context to which \c exec belongs.
- * \param exec dispatch table.
- */
-struct _glapi_table *
-_mesa_create_exec_table(void)
-{
-   struct _glapi_table *exec;
-
-   exec = _mesa_alloc_dispatch_table(_gloffset_COUNT);
-   if (exec == NULL)
-      return NULL;
-
-#if _HAVE_FULL_GL
-   _mesa_loopback_init_api_table( exec );
-#endif
-
-   /* load the dispatch slots we understand */
-   SET_AlphaFunc(exec, _mesa_AlphaFunc);
-   SET_BlendFunc(exec, _mesa_BlendFunc);
-   SET_Clear(exec, _mesa_Clear);
-   SET_ClearColor(exec, _mesa_ClearColor);
-   SET_ClearStencil(exec, _mesa_ClearStencil);
-   SET_ColorMask(exec, _mesa_ColorMask);
-   SET_CullFace(exec, _mesa_CullFace);
-   SET_Disable(exec, _mesa_Disable);
-#if FEATURE_draw_read_buffer
-   SET_DrawBuffer(exec, _mesa_DrawBuffer);
-   SET_ReadBuffer(exec, _mesa_ReadBuffer);
-#endif
-   SET_Enable(exec, _mesa_Enable);
-   SET_Finish(exec, _mesa_Finish);
-   SET_Flush(exec, _mesa_Flush);
-   SET_FrontFace(exec, _mesa_FrontFace);
-   SET_Frustum(exec, _mesa_Frustum);
-   SET_GetError(exec, _mesa_GetError);
-   SET_GetFloatv(exec, _mesa_GetFloatv);
-   SET_GetString(exec, _mesa_GetString);
-   SET_LineStipple(exec, _mesa_LineStipple);
-   SET_LineWidth(exec, _mesa_LineWidth);
-   SET_LoadIdentity(exec, _mesa_LoadIdentity);
-   SET_LoadMatrixf(exec, _mesa_LoadMatrixf);
-   SET_LogicOp(exec, _mesa_LogicOp);
-   SET_MatrixMode(exec, _mesa_MatrixMode);
-   SET_MultMatrixf(exec, _mesa_MultMatrixf);
-   SET_Ortho(exec, _mesa_Ortho);
-   SET_PixelStorei(exec, _mesa_PixelStorei);
-   SET_PopMatrix(exec, _mesa_PopMatrix);
-   SET_PushMatrix(exec, _mesa_PushMatrix);
-   SET_Rotatef(exec, _mesa_Rotatef);
-   SET_Scalef(exec, _mesa_Scalef);
-   SET_Scissor(exec, _mesa_Scissor);
-   SET_ShadeModel(exec, _mesa_ShadeModel);
-   SET_StencilFunc(exec, _mesa_StencilFunc);
-   SET_StencilMask(exec, _mesa_StencilMask);
-   SET_StencilOp(exec, _mesa_StencilOp);
-   SET_TexEnvfv(exec, _mesa_TexEnvfv);
-   SET_TexEnvi(exec, _mesa_TexEnvi);
-   SET_TexImage2D(exec, _mesa_TexImage2D);
-   SET_TexParameteri(exec, _mesa_TexParameteri);
-   SET_Translatef(exec, _mesa_Translatef);
-   SET_Viewport(exec, _mesa_Viewport);
-
-   _mesa_init_accum_dispatch(exec);
-   _mesa_init_dlist_dispatch(exec);
-
-   SET_ClearDepth(exec, _mesa_ClearDepth);
-   SET_ClearIndex(exec, _mesa_ClearIndex);
-   SET_ClipPlane(exec, _mesa_ClipPlane);
-   SET_ColorMaterial(exec, _mesa_ColorMaterial);
-   SET_DepthFunc(exec, _mesa_DepthFunc);
-   SET_DepthMask(exec, _mesa_DepthMask);
-   SET_DepthRange(exec, _mesa_DepthRange);
-
-   _mesa_init_drawpix_dispatch(exec);
-   _mesa_init_feedback_dispatch(exec);
-
-   SET_FogCoordPointerEXT(exec, _mesa_FogCoordPointerEXT);
-   SET_Fogf(exec, _mesa_Fogf);
-   SET_Fogfv(exec, _mesa_Fogfv);
-   SET_Fogi(exec, _mesa_Fogi);
-   SET_Fogiv(exec, _mesa_Fogiv);
-   SET_GetClipPlane(exec, _mesa_GetClipPlane);
-   SET_GetBooleanv(exec, _mesa_GetBooleanv);
-   SET_GetDoublev(exec, _mesa_GetDoublev);
-   SET_GetIntegerv(exec, _mesa_GetIntegerv);
-   SET_GetLightfv(exec, _mesa_GetLightfv);
-   SET_GetLightiv(exec, _mesa_GetLightiv);
-   SET_GetMaterialfv(exec, _mesa_GetMaterialfv);
-   SET_GetMaterialiv(exec, _mesa_GetMaterialiv);
-   SET_GetPolygonStipple(exec, _mesa_GetPolygonStipple);
-   SET_GetTexEnvfv(exec, _mesa_GetTexEnvfv);
-   SET_GetTexEnviv(exec, _mesa_GetTexEnviv);
-   SET_GetTexLevelParameterfv(exec, _mesa_GetTexLevelParameterfv);
-   SET_GetTexLevelParameteriv(exec, _mesa_GetTexLevelParameteriv);
-   SET_GetTexParameterfv(exec, _mesa_GetTexParameterfv);
-   SET_GetTexParameteriv(exec, _mesa_GetTexParameteriv);
-   SET_GetTexImage(exec, _mesa_GetTexImage);
-   SET_Hint(exec, _mesa_Hint);
-   SET_IndexMask(exec, _mesa_IndexMask);
-   SET_IsEnabled(exec, _mesa_IsEnabled);
-   SET_LightModelf(exec, _mesa_LightModelf);
-   SET_LightModelfv(exec, _mesa_LightModelfv);
-   SET_LightModeli(exec, _mesa_LightModeli);
-   SET_LightModeliv(exec, _mesa_LightModeliv);
-   SET_Lightf(exec, _mesa_Lightf);
-   SET_Lightfv(exec, _mesa_Lightfv);
-   SET_Lighti(exec, _mesa_Lighti);
-   SET_Lightiv(exec, _mesa_Lightiv);
-   SET_LoadMatrixd(exec, _mesa_LoadMatrixd);
-
-   _mesa_init_eval_dispatch(exec);
-
-   SET_MultMatrixd(exec, _mesa_MultMatrixd);
-
-   _mesa_init_pixel_dispatch(exec);
-
-   SET_PixelStoref(exec, _mesa_PixelStoref);
-   SET_PointSize(exec, _mesa_PointSize);
-   SET_PolygonMode(exec, _mesa_PolygonMode);
-   SET_PolygonOffset(exec, _mesa_PolygonOffset);
-   SET_PolygonStipple(exec, _mesa_PolygonStipple);
-
-   _mesa_init_attrib_dispatch(exec);
-   _mesa_init_rastpos_dispatch(exec);
-
-   SET_ReadPixels(exec, _mesa_ReadPixels);
-   SET_Rotated(exec, _mesa_Rotated);
-   SET_Scaled(exec, _mesa_Scaled);
-   SET_SecondaryColorPointerEXT(exec, _mesa_SecondaryColorPointerEXT);
-   SET_TexEnvf(exec, _mesa_TexEnvf);
-   SET_TexEnviv(exec, _mesa_TexEnviv);
-
-   _mesa_init_texgen_dispatch(exec);
-
-   SET_TexImage1D(exec, _mesa_TexImage1D);
-   SET_TexParameterf(exec, _mesa_TexParameterf);
-   SET_TexParameterfv(exec, _mesa_TexParameterfv);
-   SET_TexParameteriv(exec, _mesa_TexParameteriv);
-   SET_Translated(exec, _mesa_Translated);
-
-   /* 1.1 */
-   SET_BindTexture(exec, _mesa_BindTexture);
-   SET_DeleteTextures(exec, _mesa_DeleteTextures);
-   SET_GenTextures(exec, _mesa_GenTextures);
-#if _HAVE_FULL_GL
-   SET_AreTexturesResident(exec, _mesa_AreTexturesResident);
-   SET_ColorPointer(exec, _mesa_ColorPointer);
-   SET_CopyTexImage1D(exec, _mesa_CopyTexImage1D);
-   SET_CopyTexImage2D(exec, _mesa_CopyTexImage2D);
-   SET_CopyTexSubImage1D(exec, _mesa_CopyTexSubImage1D);
-   SET_CopyTexSubImage2D(exec, _mesa_CopyTexSubImage2D);
-   SET_DisableClientState(exec, _mesa_DisableClientState);
-   SET_EdgeFlagPointer(exec, _mesa_EdgeFlagPointer);
-   SET_EnableClientState(exec, _mesa_EnableClientState);
-   SET_GetPointerv(exec, _mesa_GetPointerv);
-   SET_IndexPointer(exec, _mesa_IndexPointer);
-   SET_InterleavedArrays(exec, _mesa_InterleavedArrays);
-   SET_IsTexture(exec, _mesa_IsTexture);
-   SET_NormalPointer(exec, _mesa_NormalPointer);
-   SET_PrioritizeTextures(exec, _mesa_PrioritizeTextures);
-   SET_TexCoordPointer(exec, _mesa_TexCoordPointer);
-   SET_TexSubImage1D(exec, _mesa_TexSubImage1D);
-   SET_TexSubImage2D(exec, _mesa_TexSubImage2D);
-   SET_VertexPointer(exec, _mesa_VertexPointer);
-#endif
-
-   /* 1.2 */
-#if _HAVE_FULL_GL
-   SET_CopyTexSubImage3D(exec, _mesa_CopyTexSubImage3D);
-   SET_TexImage3D(exec, _mesa_TexImage3D);
-   SET_TexSubImage3D(exec, _mesa_TexSubImage3D);
-#endif
-
-   /* OpenGL 1.2  GL_ARB_imaging */
-   SET_BlendColor(exec, _mesa_BlendColor);
-   SET_BlendEquation(exec, _mesa_BlendEquation);
-   SET_BlendEquationSeparateEXT(exec, _mesa_BlendEquationSeparateEXT);
-
-   _mesa_init_colortable_dispatch(exec);
-   _mesa_init_convolve_dispatch(exec);
-   _mesa_init_histogram_dispatch(exec);
-
-   /* OpenGL 2.0 */
-   SET_StencilFuncSeparate(exec, _mesa_StencilFuncSeparate);
-   SET_StencilMaskSeparate(exec, _mesa_StencilMaskSeparate);
-   SET_StencilOpSeparate(exec, _mesa_StencilOpSeparate);
-
-#if FEATURE_ARB_shader_objects
-   _mesa_init_shader_dispatch(exec);
-   _mesa_init_shader_uniform_dispatch(exec);
-#endif
-
-   /* 2. GL_EXT_blend_color */
-#if 0
-/*    SET_BlendColorEXT(exec, _mesa_BlendColorEXT); */
-#endif
-
-   /* 3. GL_EXT_polygon_offset */
-#if _HAVE_FULL_GL
-   SET_PolygonOffsetEXT(exec, _mesa_PolygonOffsetEXT);
-#endif
-
-   /* 6. GL_EXT_texture3d */
-#if 0
-/*    SET_CopyTexSubImage3DEXT(exec, _mesa_CopyTexSubImage3D); */
-/*    SET_TexImage3DEXT(exec, _mesa_TexImage3DEXT); */
-/*    SET_TexSubImage3DEXT(exec, _mesa_TexSubImage3D); */
-#endif
-
-   /* 11. GL_EXT_histogram */
-#if 0
-   SET_GetHistogramEXT(exec, _mesa_GetHistogram);
-   SET_GetHistogramParameterfvEXT(exec, _mesa_GetHistogramParameterfv);
-   SET_GetHistogramParameterivEXT(exec, _mesa_GetHistogramParameteriv);
-   SET_GetMinmaxEXT(exec, _mesa_GetMinmax);
-   SET_GetMinmaxParameterfvEXT(exec, _mesa_GetMinmaxParameterfv);
-   SET_GetMinmaxParameterivEXT(exec, _mesa_GetMinmaxParameteriv);
-#endif
-
-   /* 14. SGI_color_table */
-#if 0
-   SET_ColorTableSGI(exec, _mesa_ColorTable);
-   SET_ColorSubTableSGI(exec, _mesa_ColorSubTable);
-   SET_GetColorTableSGI(exec, _mesa_GetColorTable);
-   SET_GetColorTableParameterfvSGI(exec, _mesa_GetColorTableParameterfv);
-   SET_GetColorTableParameterivSGI(exec, _mesa_GetColorTableParameteriv);
-#endif
-
-   /* 30. GL_EXT_vertex_array */
-#if _HAVE_FULL_GL
-   SET_ColorPointerEXT(exec, _mesa_ColorPointerEXT);
-   SET_EdgeFlagPointerEXT(exec, _mesa_EdgeFlagPointerEXT);
-   SET_IndexPointerEXT(exec, _mesa_IndexPointerEXT);
-   SET_NormalPointerEXT(exec, _mesa_NormalPointerEXT);
-   SET_TexCoordPointerEXT(exec, _mesa_TexCoordPointerEXT);
-   SET_VertexPointerEXT(exec, _mesa_VertexPointerEXT);
-#endif
-
-   /* 37. GL_EXT_blend_minmax */
-#if 0
-   SET_BlendEquationEXT(exec, _mesa_BlendEquationEXT);
-#endif
-
-   /* 54. GL_EXT_point_parameters */
-#if _HAVE_FULL_GL
-   SET_PointParameterfEXT(exec, _mesa_PointParameterf);
-   SET_PointParameterfvEXT(exec, _mesa_PointParameterfv);
-#endif
-
-   /* 95. GL_ARB_ES2_compatibility */
-   SET_ClearDepthf(exec, _mesa_ClearDepthf);
-   SET_DepthRangef(exec, _mesa_DepthRangef);
-
-   /* 97. GL_EXT_compiled_vertex_array */
-#if _HAVE_FULL_GL
-   SET_LockArraysEXT(exec, _mesa_LockArraysEXT);
-   SET_UnlockArraysEXT(exec, _mesa_UnlockArraysEXT);
-#endif
-
-   /* 148. GL_EXT_multi_draw_arrays */
-#if _HAVE_FULL_GL
-   SET_MultiDrawArraysEXT(exec, _mesa_MultiDrawArraysEXT);
-#endif
-
-   /* 173. GL_INGR_blend_func_separate */
-#if _HAVE_FULL_GL
-   SET_BlendFuncSeparateEXT(exec, _mesa_BlendFuncSeparateEXT);
-#endif
-
-   /* 196. GL_MESA_resize_buffers */
-#if _HAVE_FULL_GL
-   SET_ResizeBuffersMESA(exec, _mesa_ResizeBuffersMESA);
-#endif
-
-   /* 197. GL_MESA_window_pos */
-   /* part of _mesa_init_rastpos_dispatch(exec); */
-
-   /* 200. GL_IBM_multimode_draw_arrays */
-#if _HAVE_FULL_GL
-   SET_MultiModeDrawArraysIBM(exec, _mesa_MultiModeDrawArraysIBM);
-   SET_MultiModeDrawElementsIBM(exec, _mesa_MultiModeDrawElementsIBM);
-#endif
-
-   /* 233. GL_NV_vertex_program */
-#if FEATURE_NV_vertex_program
-   SET_BindProgramNV(exec, _mesa_BindProgram);
-   SET_DeleteProgramsNV(exec, _mesa_DeletePrograms);
-   SET_ExecuteProgramNV(exec, _mesa_ExecuteProgramNV);
-   SET_GenProgramsNV(exec, _mesa_GenPrograms);
-   SET_AreProgramsResidentNV(exec, _mesa_AreProgramsResidentNV);
-   SET_RequestResidentProgramsNV(exec, _mesa_RequestResidentProgramsNV);
-   SET_GetProgramParameterfvNV(exec, _mesa_GetProgramParameterfvNV);
-   SET_GetProgramParameterdvNV(exec, _mesa_GetProgramParameterdvNV);
-   SET_GetProgramivNV(exec, _mesa_GetProgramivNV);
-   SET_GetProgramStringNV(exec, _mesa_GetProgramStringNV);
-   SET_GetTrackMatrixivNV(exec, _mesa_GetTrackMatrixivNV);
-   SET_GetVertexAttribdvNV(exec, _mesa_GetVertexAttribdvNV);
-   SET_GetVertexAttribfvNV(exec, _mesa_GetVertexAttribfvNV);
-   SET_GetVertexAttribivNV(exec, _mesa_GetVertexAttribivNV);
-   SET_GetVertexAttribPointervNV(exec, _mesa_GetVertexAttribPointervNV);
-   SET_IsProgramNV(exec, _mesa_IsProgramARB);
-   SET_LoadProgramNV(exec, _mesa_LoadProgramNV);
-   SET_ProgramEnvParameter4dARB(exec, _mesa_ProgramEnvParameter4dARB); /* alias to ProgramParameter4dNV */
-   SET_ProgramEnvParameter4dvARB(exec, _mesa_ProgramEnvParameter4dvARB);  /* alias to ProgramParameter4dvNV */
-   SET_ProgramEnvParameter4fARB(exec, _mesa_ProgramEnvParameter4fARB);  /* alias to ProgramParameter4fNV */
-   SET_ProgramEnvParameter4fvARB(exec, _mesa_ProgramEnvParameter4fvARB);  /* alias to ProgramParameter4fvNV */
-   SET_ProgramParameters4dvNV(exec, _mesa_ProgramParameters4dvNV);
-   SET_ProgramParameters4fvNV(exec, _mesa_ProgramParameters4fvNV);
-   SET_TrackMatrixNV(exec, _mesa_TrackMatrixNV);
-   SET_VertexAttribPointerNV(exec, _mesa_VertexAttribPointerNV);
-   /* glVertexAttrib*NV functions handled in api_loopback.c */
-#endif
-
-   /* 273. GL_APPLE_vertex_array_object */
-   SET_BindVertexArrayAPPLE(exec, _mesa_BindVertexArrayAPPLE);
-   SET_DeleteVertexArraysAPPLE(exec, _mesa_DeleteVertexArraysAPPLE);
-   SET_GenVertexArraysAPPLE(exec, _mesa_GenVertexArraysAPPLE);
-   SET_IsVertexArrayAPPLE(exec, _mesa_IsVertexArrayAPPLE);
-
-   /* 282. GL_NV_fragment_program */
-#if FEATURE_NV_fragment_program
-   SET_ProgramNamedParameter4fNV(exec, _mesa_ProgramNamedParameter4fNV);
-   SET_ProgramNamedParameter4dNV(exec, _mesa_ProgramNamedParameter4dNV);
-   SET_ProgramNamedParameter4fvNV(exec, _mesa_ProgramNamedParameter4fvNV);
-   SET_ProgramNamedParameter4dvNV(exec, _mesa_ProgramNamedParameter4dvNV);
-   SET_GetProgramNamedParameterfvNV(exec, _mesa_GetProgramNamedParameterfvNV);
-   SET_GetProgramNamedParameterdvNV(exec, _mesa_GetProgramNamedParameterdvNV);
-   SET_ProgramLocalParameter4dARB(exec, _mesa_ProgramLocalParameter4dARB);
-   SET_ProgramLocalParameter4dvARB(exec, _mesa_ProgramLocalParameter4dvARB);
-   SET_ProgramLocalParameter4fARB(exec, _mesa_ProgramLocalParameter4fARB);
-   SET_ProgramLocalParameter4fvARB(exec, _mesa_ProgramLocalParameter4fvARB);
-   SET_GetProgramLocalParameterdvARB(exec, _mesa_GetProgramLocalParameterdvARB);
-   SET_GetProgramLocalParameterfvARB(exec, _mesa_GetProgramLocalParameterfvARB);
-#endif
-
-   /* 262. GL_NV_point_sprite */
-#if _HAVE_FULL_GL
-   SET_PointParameteriNV(exec, _mesa_PointParameteri);
-   SET_PointParameterivNV(exec, _mesa_PointParameteriv);
-#endif
-
-   /* 268. GL_EXT_stencil_two_side */
-#if _HAVE_FULL_GL
-   SET_ActiveStencilFaceEXT(exec, _mesa_ActiveStencilFaceEXT);
-#endif
-
-   /* 285. GL_NV_primitive_restart */
-   SET_PrimitiveRestartIndexNV(exec, _mesa_PrimitiveRestartIndex);
-
-   /* ???. GL_EXT_depth_bounds_test */
-   SET_DepthBoundsEXT(exec, _mesa_DepthBoundsEXT);
-
-   /* 352. GL_EXT_transform_feedback */
-   _mesa_init_transform_feedback_dispatch(exec);
-
-   /* 364. GL_EXT_provoking_vertex */
-   SET_ProvokingVertexEXT(exec, _mesa_ProvokingVertexEXT);
-
-   /* ARB 1. GL_ARB_multitexture */
-#if _HAVE_FULL_GL
-   SET_ActiveTextureARB(exec, _mesa_ActiveTextureARB);
-   SET_ClientActiveTextureARB(exec, _mesa_ClientActiveTextureARB);
-#endif
-
-   /* ARB 3. GL_ARB_transpose_matrix */
-#if _HAVE_FULL_GL
-   SET_LoadTransposeMatrixdARB(exec, _mesa_LoadTransposeMatrixdARB);
-   SET_LoadTransposeMatrixfARB(exec, _mesa_LoadTransposeMatrixfARB);
-   SET_MultTransposeMatrixdARB(exec, _mesa_MultTransposeMatrixdARB);
-   SET_MultTransposeMatrixfARB(exec, _mesa_MultTransposeMatrixfARB);
-#endif
-
-   /* ARB 5. GL_ARB_multisample */
-#if _HAVE_FULL_GL
-   SET_SampleCoverageARB(exec, _mesa_SampleCoverageARB);
-#endif
-
-   /* ARB 12. GL_ARB_texture_compression */
-#if _HAVE_FULL_GL
-   SET_CompressedTexImage3DARB(exec, _mesa_CompressedTexImage3DARB);
-   SET_CompressedTexImage2DARB(exec, _mesa_CompressedTexImage2DARB);
-   SET_CompressedTexImage1DARB(exec, _mesa_CompressedTexImage1DARB);
-   SET_CompressedTexSubImage3DARB(exec, _mesa_CompressedTexSubImage3DARB);
-   SET_CompressedTexSubImage2DARB(exec, _mesa_CompressedTexSubImage2DARB);
-   SET_CompressedTexSubImage1DARB(exec, _mesa_CompressedTexSubImage1DARB);
-   SET_GetCompressedTexImageARB(exec, _mesa_GetCompressedTexImageARB);
-#endif
-
-   /* ARB 14. GL_ARB_point_parameters */
-   /* reuse EXT_point_parameters functions */
-
-   /* ARB 26. GL_ARB_vertex_program */
-   /* ARB 27. GL_ARB_fragment_program */
-#if FEATURE_ARB_vertex_program || FEATURE_ARB_fragment_program
-   /* glVertexAttrib1sARB aliases glVertexAttrib1sNV */
-   /* glVertexAttrib1fARB aliases glVertexAttrib1fNV */
-   /* glVertexAttrib1dARB aliases glVertexAttrib1dNV */
-   /* glVertexAttrib2sARB aliases glVertexAttrib2sNV */
-   /* glVertexAttrib2fARB aliases glVertexAttrib2fNV */
-   /* glVertexAttrib2dARB aliases glVertexAttrib2dNV */
-   /* glVertexAttrib3sARB aliases glVertexAttrib3sNV */
-   /* glVertexAttrib3fARB aliases glVertexAttrib3fNV */
-   /* glVertexAttrib3dARB aliases glVertexAttrib3dNV */
-   /* glVertexAttrib4sARB aliases glVertexAttrib4sNV */
-   /* glVertexAttrib4fARB aliases glVertexAttrib4fNV */
-   /* glVertexAttrib4dARB aliases glVertexAttrib4dNV */
-   /* glVertexAttrib4NubARB aliases glVertexAttrib4NubNV */
-   /* glVertexAttrib1svARB aliases glVertexAttrib1svNV */
-   /* glVertexAttrib1fvARB aliases glVertexAttrib1fvNV */
-   /* glVertexAttrib1dvARB aliases glVertexAttrib1dvNV */
-   /* glVertexAttrib2svARB aliases glVertexAttrib2svNV */
-   /* glVertexAttrib2fvARB aliases glVertexAttrib2fvNV */
-   /* glVertexAttrib2dvARB aliases glVertexAttrib2dvNV */
-   /* glVertexAttrib3svARB aliases glVertexAttrib3svNV */
-   /* glVertexAttrib3fvARB aliases glVertexAttrib3fvNV */
-   /* glVertexAttrib3dvARB aliases glVertexAttrib3dvNV */
-   /* glVertexAttrib4svARB aliases glVertexAttrib4svNV */
-   /* glVertexAttrib4fvARB aliases glVertexAttrib4fvNV */
-   /* glVertexAttrib4dvARB aliases glVertexAttrib4dvNV */
-   /* glVertexAttrib4NubvARB aliases glVertexAttrib4NubvNV */
-   /* glVertexAttrib4bvARB handled in api_loopback.c */
-   /* glVertexAttrib4ivARB handled in api_loopback.c */
-   /* glVertexAttrib4ubvARB handled in api_loopback.c */
-   /* glVertexAttrib4usvARB handled in api_loopback.c */
-   /* glVertexAttrib4uivARB handled in api_loopback.c */
-   /* glVertexAttrib4NbvARB handled in api_loopback.c */
-   /* glVertexAttrib4NsvARB handled in api_loopback.c */
-   /* glVertexAttrib4NivARB handled in api_loopback.c */
-   /* glVertexAttrib4NusvARB handled in api_loopback.c */
-   /* glVertexAttrib4NuivARB handled in api_loopback.c */
-   SET_VertexAttribPointerARB(exec, _mesa_VertexAttribPointerARB);
-   SET_EnableVertexAttribArrayARB(exec, _mesa_EnableVertexAttribArrayARB);
-   SET_DisableVertexAttribArrayARB(exec, _mesa_DisableVertexAttribArrayARB);
-   SET_ProgramStringARB(exec, _mesa_ProgramStringARB);
-   /* glBindProgramARB aliases glBindProgramNV */
-   /* glDeleteProgramsARB aliases glDeleteProgramsNV */
-   /* glGenProgramsARB aliases glGenProgramsNV */
-   /* glIsProgramARB aliases glIsProgramNV */
-   SET_GetVertexAttribdvARB(exec, _mesa_GetVertexAttribdvARB);
-   SET_GetVertexAttribfvARB(exec, _mesa_GetVertexAttribfvARB);
-   SET_GetVertexAttribivARB(exec, _mesa_GetVertexAttribivARB);
-   /* glGetVertexAttribPointervARB aliases glGetVertexAttribPointervNV */
-   SET_ProgramEnvParameter4dARB(exec, _mesa_ProgramEnvParameter4dARB);
-   SET_ProgramEnvParameter4dvARB(exec, _mesa_ProgramEnvParameter4dvARB);
-   SET_ProgramEnvParameter4fARB(exec, _mesa_ProgramEnvParameter4fARB);
-   SET_ProgramEnvParameter4fvARB(exec, _mesa_ProgramEnvParameter4fvARB);
-   SET_ProgramLocalParameter4dARB(exec, _mesa_ProgramLocalParameter4dARB);
-   SET_ProgramLocalParameter4dvARB(exec, _mesa_ProgramLocalParameter4dvARB);
-   SET_ProgramLocalParameter4fARB(exec, _mesa_ProgramLocalParameter4fARB);
-   SET_ProgramLocalParameter4fvARB(exec, _mesa_ProgramLocalParameter4fvARB);
-   SET_GetProgramEnvParameterdvARB(exec, _mesa_GetProgramEnvParameterdvARB);
-   SET_GetProgramEnvParameterfvARB(exec, _mesa_GetProgramEnvParameterfvARB);
-   SET_GetProgramLocalParameterdvARB(exec, _mesa_GetProgramLocalParameterdvARB);
-   SET_GetProgramLocalParameterfvARB(exec, _mesa_GetProgramLocalParameterfvARB);
-   SET_GetProgramivARB(exec, _mesa_GetProgramivARB);
-   SET_GetProgramStringARB(exec, _mesa_GetProgramStringARB);
-#endif
-
-   /* ARB 28. GL_ARB_vertex_buffer_object */
-#if FEATURE_ARB_vertex_buffer_object
-   SET_BindBufferARB(exec, _mesa_BindBufferARB);
-   SET_BufferDataARB(exec, _mesa_BufferDataARB);
-   SET_BufferSubDataARB(exec, _mesa_BufferSubDataARB);
-   SET_DeleteBuffersARB(exec, _mesa_DeleteBuffersARB);
-   SET_GenBuffersARB(exec, _mesa_GenBuffersARB);
-   SET_GetBufferParameterivARB(exec, _mesa_GetBufferParameterivARB);
-   SET_GetBufferPointervARB(exec, _mesa_GetBufferPointervARB);
-   SET_GetBufferSubDataARB(exec, _mesa_GetBufferSubDataARB);
-   SET_IsBufferARB(exec, _mesa_IsBufferARB);
-   SET_MapBufferARB(exec, _mesa_MapBufferARB);
-   SET_UnmapBufferARB(exec, _mesa_UnmapBufferARB);
-#endif
-
-   /* ARB 29. GL_ARB_occlusion_query */
-   _mesa_init_queryobj_dispatch(exec);
-
-   /* ARB 37. GL_ARB_draw_buffers */
-#if FEATURE_draw_read_buffer
-   SET_DrawBuffersARB(exec, _mesa_DrawBuffersARB);
-#endif
-
-   /* GL_ARB_sync */
-   _mesa_init_sync_dispatch(exec);
-
-  /* GL_ATI_fragment_shader */
-   _mesa_init_ati_fragment_shader_dispatch(exec);
-
-  /* GL_ATI_envmap_bumpmap */
-   SET_GetTexBumpParameterivATI(exec, _mesa_GetTexBumpParameterivATI);
-   SET_GetTexBumpParameterfvATI(exec, _mesa_GetTexBumpParameterfvATI);
-   SET_TexBumpParameterivATI(exec, _mesa_TexBumpParameterivATI);
-   SET_TexBumpParameterfvATI(exec, _mesa_TexBumpParameterfvATI);
-
-#if FEATURE_EXT_framebuffer_object
-   SET_IsRenderbufferEXT(exec, _mesa_IsRenderbufferEXT);
-   SET_BindRenderbufferEXT(exec, _mesa_BindRenderbufferEXT);
-   SET_DeleteRenderbuffersEXT(exec, _mesa_DeleteRenderbuffersEXT);
-   SET_GenRenderbuffersEXT(exec, _mesa_GenRenderbuffersEXT);
-   SET_RenderbufferStorageEXT(exec, _mesa_RenderbufferStorageEXT);
-   SET_GetRenderbufferParameterivEXT(exec, _mesa_GetRenderbufferParameterivEXT);
-   SET_IsFramebufferEXT(exec, _mesa_IsFramebufferEXT);
-   SET_BindFramebufferEXT(exec, _mesa_BindFramebufferEXT);
-   SET_DeleteFramebuffersEXT(exec, _mesa_DeleteFramebuffersEXT);
-   SET_GenFramebuffersEXT(exec, _mesa_GenFramebuffersEXT);
-   SET_CheckFramebufferStatusEXT(exec, _mesa_CheckFramebufferStatusEXT);
-   SET_FramebufferTexture1DEXT(exec, _mesa_FramebufferTexture1DEXT);
-   SET_FramebufferTexture2DEXT(exec, _mesa_FramebufferTexture2DEXT);
-   SET_FramebufferTexture3DEXT(exec, _mesa_FramebufferTexture3DEXT);
-   SET_FramebufferRenderbufferEXT(exec, _mesa_FramebufferRenderbufferEXT);
-   SET_GetFramebufferAttachmentParameterivEXT(exec, _mesa_GetFramebufferAttachmentParameterivEXT);
-   SET_GenerateMipmapEXT(exec, _mesa_GenerateMipmapEXT);
-#endif
-
-#if FEATURE_EXT_framebuffer_blit
-   SET_BlitFramebufferEXT(exec, _mesa_BlitFramebufferEXT);
-#endif
-
-   /* GL_EXT_gpu_program_parameters */
-#if FEATURE_ARB_vertex_program || FEATURE_ARB_fragment_program
-   SET_ProgramEnvParameters4fvEXT(exec, _mesa_ProgramEnvParameters4fvEXT);
-   SET_ProgramLocalParameters4fvEXT(exec, _mesa_ProgramLocalParameters4fvEXT);
-#endif
-
-   /* GL_MESA_texture_array / GL_EXT_texture_array */
-#if FEATURE_EXT_framebuffer_object
-   SET_FramebufferTextureLayerEXT(exec, _mesa_FramebufferTextureLayerEXT);
-#endif
-
-   /* GL_ATI_separate_stencil */
-   SET_StencilFuncSeparateATI(exec, _mesa_StencilFuncSeparateATI);
-
-#if FEATURE_ARB_framebuffer_object
-   /* The ARB_fbo functions are the union of
-    * GL_EXT_fbo, GL_EXT_framebuffer_blit, GL_EXT_texture_array
-    */
-   SET_RenderbufferStorageMultisample(exec, _mesa_RenderbufferStorageMultisample);
-#endif
-
-#if FEATURE_ARB_map_buffer_range
-   SET_MapBufferRange(exec, _mesa_MapBufferRange);
-   SET_FlushMappedBufferRange(exec, _mesa_FlushMappedBufferRange);
-#endif
-
-   /* GL_ARB_copy_buffer */
-   SET_CopyBufferSubData(exec, _mesa_CopyBufferSubData);
-
-   /* GL_ARB_vertex_array_object */
-   SET_BindVertexArray(exec, _mesa_BindVertexArray);
-   SET_GenVertexArrays(exec, _mesa_GenVertexArrays);
-
-   /* GL_EXT_draw_buffers2 */
-   SET_ColorMaskIndexedEXT(exec, _mesa_ColorMaskIndexed);
-   SET_GetBooleanIndexedvEXT(exec, _mesa_GetBooleanIndexedv);
-   SET_GetIntegerIndexedvEXT(exec, _mesa_GetIntegerIndexedv);
-   SET_EnableIndexedEXT(exec, _mesa_EnableIndexed);
-   SET_DisableIndexedEXT(exec, _mesa_DisableIndexed);
-   SET_IsEnabledIndexedEXT(exec, _mesa_IsEnabledIndexed);
-
-   /* GL_NV_conditional_render */
-   SET_BeginConditionalRenderNV(exec, _mesa_BeginConditionalRender);
-   SET_EndConditionalRenderNV(exec, _mesa_EndConditionalRender);
-
-#if FEATURE_OES_EGL_image
-   SET_EGLImageTargetTexture2DOES(exec, _mesa_EGLImageTargetTexture2DOES);
-   SET_EGLImageTargetRenderbufferStorageOES(exec, _mesa_EGLImageTargetRenderbufferStorageOES);
-#endif
-
-#if FEATURE_APPLE_object_purgeable
-   SET_ObjectPurgeableAPPLE(exec, _mesa_ObjectPurgeableAPPLE);
-   SET_ObjectUnpurgeableAPPLE(exec, _mesa_ObjectUnpurgeableAPPLE);
-   SET_GetObjectParameterivAPPLE(exec, _mesa_GetObjectParameterivAPPLE);
-#endif
-
-#if FEATURE_ARB_geometry_shader4
-   SET_FramebufferTextureARB(exec, _mesa_FramebufferTextureARB);
-   SET_FramebufferTextureFaceARB(exec, _mesa_FramebufferTextureFaceARB);
-#endif
-
-   /* GL_EXT_texture_integer */
-   SET_ClearColorIiEXT(exec, _mesa_ClearColorIiEXT);
-   SET_ClearColorIuiEXT(exec, _mesa_ClearColorIuiEXT);
-   SET_GetTexParameterIivEXT(exec, _mesa_GetTexParameterIiv);
-   SET_GetTexParameterIuivEXT(exec, _mesa_GetTexParameterIuiv);
-   SET_TexParameterIivEXT(exec, _mesa_TexParameterIiv);
-   SET_TexParameterIuivEXT(exec, _mesa_TexParameterIuiv);
-
-   /* GL_EXT_gpu_shader4 / OpenGL 3.0 */
-   SET_GetVertexAttribIivEXT(exec, _mesa_GetVertexAttribIiv);
-   SET_GetVertexAttribIuivEXT(exec, _mesa_GetVertexAttribIuiv);
-   SET_VertexAttribIPointerEXT(exec, _mesa_VertexAttribIPointer);
-
-   /* GL 3.0 (functions not covered by other extensions) */
-   SET_ClearBufferiv(exec, _mesa_ClearBufferiv);
-   SET_ClearBufferuiv(exec, _mesa_ClearBufferuiv);
-   SET_ClearBufferfv(exec, _mesa_ClearBufferfv);
-   SET_ClearBufferfi(exec, _mesa_ClearBufferfi);
-   SET_GetStringi(exec, _mesa_GetStringi);
-   SET_ClampColor(exec, _mesa_ClampColorARB);
-
-   /* GL_ARB_instanced_arrays */
-   SET_VertexAttribDivisorARB(exec, _mesa_VertexAttribDivisor);
-
-   /* GL_ARB_draw_buffer_blend */
-   SET_BlendFunciARB(exec, _mesa_BlendFunci);
-   SET_BlendFuncSeparateiARB(exec, _mesa_BlendFuncSeparatei);
-   SET_BlendEquationiARB(exec, _mesa_BlendEquationi);
-   SET_BlendEquationSeparateiARB(exec, _mesa_BlendEquationSeparatei);
-
-   /* GL_NV_texture_barrier */
-   SET_TextureBarrierNV(exec, _mesa_TextureBarrierNV);
- 
-   return exec;
-}
-
-#endif /* FEATURE_GL */
+/*
+ * Mesa 3-D graphics library
+ * Version:  7.1
+ *
+ * Copyright (C) 1999-2008  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"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+
+/**
+ * \file api_exec.c
+ * Initialize dispatch table with the immidiate mode functions.
+ */
+
+
+#include "mfeatures.h"
+#include "accum.h"
+#include "api_loopback.h"
+#include "api_exec.h"
+#if FEATURE_ARB_vertex_program || FEATURE_ARB_fragment_program
+#include "arbprogram.h"
+#endif
+#include "atifragshader.h"
+#include "attrib.h"
+#include "blend.h"
+#if FEATURE_ARB_vertex_buffer_object
+#include "bufferobj.h"
+#endif
+#include "arrayobj.h"
+#if FEATURE_draw_read_buffer
+#include "buffers.h"
+#endif
+#include "clear.h"
+#include "clip.h"
+#include "colortab.h"
+#include "condrender.h"
+#include "context.h"
+#include "convolve.h"
+#include "depth.h"
+#include "dlist.h"
+#include "drawpix.h"
+#include "rastpos.h"
+#include "enable.h"
+#include "eval.h"
+#include "get.h"
+#include "feedback.h"
+#include "fog.h"
+#if FEATURE_EXT_framebuffer_object
+#include "fbobject.h"
+#endif
+#include "framebuffer.h"
+#include "hint.h"
+#include "histogram.h"
+#include "imports.h"
+#include "light.h"
+#include "lines.h"
+#include "matrix.h"
+#include "multisample.h"
+#include "pixel.h"
+#include "pixelstore.h"
+#include "points.h"
+#include "polygon.h"
+#include "queryobj.h"
+#include "readpix.h"
+#include "scissor.h"
+#include "stencil.h"
+#include "texenv.h"
+#include "texgetimage.h"
+#include "teximage.h"
+#include "texgen.h"
+#include "texobj.h"
+#include "texparam.h"
+#include "texstate.h"
+#include "texturebarrier.h"
+#include "transformfeedback.h"
+#include "mtypes.h"
+#include "varray.h"
+#include "viewport.h"
+#if FEATURE_NV_vertex_program || FEATURE_NV_fragment_program
+#include "nvprogram.h"
+#endif
+#if FEATURE_ARB_shader_objects
+#include "shaderapi.h"
+#include "uniforms.h"
+#endif
+#include "syncobj.h"
+#include "main/dispatch.h"
+
+
+#if FEATURE_GL
+
+
+/**
+ * Initialize a dispatch table with pointers to Mesa's immediate-mode
+ * commands.
+ *
+ * Pointers to glBegin()/glEnd() object commands and a few others
+ * are provided via the GLvertexformat interface.
+ *
+ * \param ctx  GL context to which \c exec belongs.
+ * \param exec dispatch table.
+ */
+struct _glapi_table *
+_mesa_create_exec_table(void)
+{
+   struct _glapi_table *exec;
+
+   exec = _mesa_alloc_dispatch_table(_gloffset_COUNT);
+   if (exec == NULL)
+      return NULL;
+
+#if _HAVE_FULL_GL
+   _mesa_loopback_init_api_table( exec );
+#endif
+
+   /* load the dispatch slots we understand */
+   SET_AlphaFunc(exec, _mesa_AlphaFunc);
+   SET_BlendFunc(exec, _mesa_BlendFunc);
+   SET_Clear(exec, _mesa_Clear);
+   SET_ClearColor(exec, _mesa_ClearColor);
+   SET_ClearStencil(exec, _mesa_ClearStencil);
+   SET_ColorMask(exec, _mesa_ColorMask);
+   SET_CullFace(exec, _mesa_CullFace);
+   SET_Disable(exec, _mesa_Disable);
+#if FEATURE_draw_read_buffer
+   SET_DrawBuffer(exec, _mesa_DrawBuffer);
+   SET_ReadBuffer(exec, _mesa_ReadBuffer);
+#endif
+   SET_Enable(exec, _mesa_Enable);
+   SET_Finish(exec, _mesa_Finish);
+   SET_Flush(exec, _mesa_Flush);
+   SET_FrontFace(exec, _mesa_FrontFace);
+   SET_Frustum(exec, _mesa_Frustum);
+   SET_GetError(exec, _mesa_GetError);
+   SET_GetFloatv(exec, _mesa_GetFloatv);
+   SET_GetString(exec, _mesa_GetString);
+   SET_LineStipple(exec, _mesa_LineStipple);
+   SET_LineWidth(exec, _mesa_LineWidth);
+   SET_LoadIdentity(exec, _mesa_LoadIdentity);
+   SET_LoadMatrixf(exec, _mesa_LoadMatrixf);
+   SET_LogicOp(exec, _mesa_LogicOp);
+   SET_MatrixMode(exec, _mesa_MatrixMode);
+   SET_MultMatrixf(exec, _mesa_MultMatrixf);
+   SET_Ortho(exec, _mesa_Ortho);
+   SET_PixelStorei(exec, _mesa_PixelStorei);
+   SET_PopMatrix(exec, _mesa_PopMatrix);
+   SET_PushMatrix(exec, _mesa_PushMatrix);
+   SET_Rotatef(exec, _mesa_Rotatef);
+   SET_Scalef(exec, _mesa_Scalef);
+   SET_Scissor(exec, _mesa_Scissor);
+   SET_ShadeModel(exec, _mesa_ShadeModel);
+   SET_StencilFunc(exec, _mesa_StencilFunc);
+   SET_StencilMask(exec, _mesa_StencilMask);
+   SET_StencilOp(exec, _mesa_StencilOp);
+   SET_TexEnvfv(exec, _mesa_TexEnvfv);
+   SET_TexEnvi(exec, _mesa_TexEnvi);
+   SET_TexImage2D(exec, _mesa_TexImage2D);
+   SET_TexParameteri(exec, _mesa_TexParameteri);
+   SET_Translatef(exec, _mesa_Translatef);
+   SET_Viewport(exec, _mesa_Viewport);
+
+   _mesa_init_accum_dispatch(exec);
+   _mesa_init_dlist_dispatch(exec);
+
+   SET_ClearDepth(exec, _mesa_ClearDepth);
+   SET_ClearIndex(exec, _mesa_ClearIndex);
+   SET_ClipPlane(exec, _mesa_ClipPlane);
+   SET_ColorMaterial(exec, _mesa_ColorMaterial);
+   SET_DepthFunc(exec, _mesa_DepthFunc);
+   SET_DepthMask(exec, _mesa_DepthMask);
+   SET_DepthRange(exec, _mesa_DepthRange);
+
+   _mesa_init_drawpix_dispatch(exec);
+   _mesa_init_feedback_dispatch(exec);
+
+   SET_FogCoordPointerEXT(exec, _mesa_FogCoordPointerEXT);
+   SET_Fogf(exec, _mesa_Fogf);
+   SET_Fogfv(exec, _mesa_Fogfv);
+   SET_Fogi(exec, _mesa_Fogi);
+   SET_Fogiv(exec, _mesa_Fogiv);
+   SET_GetClipPlane(exec, _mesa_GetClipPlane);
+   SET_GetBooleanv(exec, _mesa_GetBooleanv);
+   SET_GetDoublev(exec, _mesa_GetDoublev);
+   SET_GetIntegerv(exec, _mesa_GetIntegerv);
+   SET_GetLightfv(exec, _mesa_GetLightfv);
+   SET_GetLightiv(exec, _mesa_GetLightiv);
+   SET_GetMaterialfv(exec, _mesa_GetMaterialfv);
+   SET_GetMaterialiv(exec, _mesa_GetMaterialiv);
+   SET_GetPolygonStipple(exec, _mesa_GetPolygonStipple);
+   SET_GetTexEnvfv(exec, _mesa_GetTexEnvfv);
+   SET_GetTexEnviv(exec, _mesa_GetTexEnviv);
+   SET_GetTexLevelParameterfv(exec, _mesa_GetTexLevelParameterfv);
+   SET_GetTexLevelParameteriv(exec, _mesa_GetTexLevelParameteriv);
+   SET_GetTexParameterfv(exec, _mesa_GetTexParameterfv);
+   SET_GetTexParameteriv(exec, _mesa_GetTexParameteriv);
+   SET_GetTexImage(exec, _mesa_GetTexImage);
+   SET_Hint(exec, _mesa_Hint);
+   SET_IndexMask(exec, _mesa_IndexMask);
+   SET_IsEnabled(exec, _mesa_IsEnabled);
+   SET_LightModelf(exec, _mesa_LightModelf);
+   SET_LightModelfv(exec, _mesa_LightModelfv);
+   SET_LightModeli(exec, _mesa_LightModeli);
+   SET_LightModeliv(exec, _mesa_LightModeliv);
+   SET_Lightf(exec, _mesa_Lightf);
+   SET_Lightfv(exec, _mesa_Lightfv);
+   SET_Lighti(exec, _mesa_Lighti);
+   SET_Lightiv(exec, _mesa_Lightiv);
+   SET_LoadMatrixd(exec, _mesa_LoadMatrixd);
+
+   _mesa_init_eval_dispatch(exec);
+
+   SET_MultMatrixd(exec, _mesa_MultMatrixd);
+
+   _mesa_init_pixel_dispatch(exec);
+
+   SET_PixelStoref(exec, _mesa_PixelStoref);
+   SET_PointSize(exec, _mesa_PointSize);
+   SET_PolygonMode(exec, _mesa_PolygonMode);
+   SET_PolygonOffset(exec, _mesa_PolygonOffset);
+   SET_PolygonStipple(exec, _mesa_PolygonStipple);
+
+   _mesa_init_attrib_dispatch(exec);
+   _mesa_init_rastpos_dispatch(exec);
+
+   SET_ReadPixels(exec, _mesa_ReadPixels);
+   SET_Rotated(exec, _mesa_Rotated);
+   SET_Scaled(exec, _mesa_Scaled);
+   SET_SecondaryColorPointerEXT(exec, _mesa_SecondaryColorPointerEXT);
+   SET_TexEnvf(exec, _mesa_TexEnvf);
+   SET_TexEnviv(exec, _mesa_TexEnviv);
+
+   _mesa_init_texgen_dispatch(exec);
+
+   SET_TexImage1D(exec, _mesa_TexImage1D);
+   SET_TexParameterf(exec, _mesa_TexParameterf);
+   SET_TexParameterfv(exec, _mesa_TexParameterfv);
+   SET_TexParameteriv(exec, _mesa_TexParameteriv);
+   SET_Translated(exec, _mesa_Translated);
+
+   /* 1.1 */
+   SET_BindTexture(exec, _mesa_BindTexture);
+   SET_DeleteTextures(exec, _mesa_DeleteTextures);
+   SET_GenTextures(exec, _mesa_GenTextures);
+#if _HAVE_FULL_GL
+   SET_AreTexturesResident(exec, _mesa_AreTexturesResident);
+   SET_ColorPointer(exec, _mesa_ColorPointer);
+   SET_CopyTexImage1D(exec, _mesa_CopyTexImage1D);
+   SET_CopyTexImage2D(exec, _mesa_CopyTexImage2D);
+   SET_CopyTexSubImage1D(exec, _mesa_CopyTexSubImage1D);
+   SET_CopyTexSubImage2D(exec, _mesa_CopyTexSubImage2D);
+   SET_DisableClientState(exec, _mesa_DisableClientState);
+   SET_EdgeFlagPointer(exec, _mesa_EdgeFlagPointer);
+   SET_EnableClientState(exec, _mesa_EnableClientState);
+   SET_GetPointerv(exec, _mesa_GetPointerv);
+   SET_IndexPointer(exec, _mesa_IndexPointer);
+   SET_InterleavedArrays(exec, _mesa_InterleavedArrays);
+   SET_IsTexture(exec, _mesa_IsTexture);
+   SET_NormalPointer(exec, _mesa_NormalPointer);
+   SET_PrioritizeTextures(exec, _mesa_PrioritizeTextures);
+   SET_TexCoordPointer(exec, _mesa_TexCoordPointer);
+   SET_TexSubImage1D(exec, _mesa_TexSubImage1D);
+   SET_TexSubImage2D(exec, _mesa_TexSubImage2D);
+   SET_VertexPointer(exec, _mesa_VertexPointer);
+#endif
+
+   /* 1.2 */
+#if _HAVE_FULL_GL
+   SET_CopyTexSubImage3D(exec, _mesa_CopyTexSubImage3D);
+   SET_TexImage3D(exec, _mesa_TexImage3D);
+   SET_TexSubImage3D(exec, _mesa_TexSubImage3D);
+#endif
+
+   /* OpenGL 1.2  GL_ARB_imaging */
+   SET_BlendColor(exec, _mesa_BlendColor);
+   SET_BlendEquation(exec, _mesa_BlendEquation);
+   SET_BlendEquationSeparateEXT(exec, _mesa_BlendEquationSeparateEXT);
+
+   _mesa_init_colortable_dispatch(exec);
+   _mesa_init_convolve_dispatch(exec);
+   _mesa_init_histogram_dispatch(exec);
+
+   /* OpenGL 2.0 */
+   SET_StencilFuncSeparate(exec, _mesa_StencilFuncSeparate);
+   SET_StencilMaskSeparate(exec, _mesa_StencilMaskSeparate);
+   SET_StencilOpSeparate(exec, _mesa_StencilOpSeparate);
+
+#if FEATURE_ARB_shader_objects
+   _mesa_init_shader_dispatch(exec);
+   _mesa_init_shader_uniform_dispatch(exec);
+#endif
+
+   /* 2. GL_EXT_blend_color */
+#if 0
+/*    SET_BlendColorEXT(exec, _mesa_BlendColorEXT); */
+#endif
+
+   /* 3. GL_EXT_polygon_offset */
+#if _HAVE_FULL_GL
+   SET_PolygonOffsetEXT(exec, _mesa_PolygonOffsetEXT);
+#endif
+
+   /* 6. GL_EXT_texture3d */
+#if 0
+/*    SET_CopyTexSubImage3DEXT(exec, _mesa_CopyTexSubImage3D); */
+/*    SET_TexImage3DEXT(exec, _mesa_TexImage3DEXT); */
+/*    SET_TexSubImage3DEXT(exec, _mesa_TexSubImage3D); */
+#endif
+
+   /* 11. GL_EXT_histogram */
+#if 0
+   SET_GetHistogramEXT(exec, _mesa_GetHistogram);
+   SET_GetHistogramParameterfvEXT(exec, _mesa_GetHistogramParameterfv);
+   SET_GetHistogramParameterivEXT(exec, _mesa_GetHistogramParameteriv);
+   SET_GetMinmaxEXT(exec, _mesa_GetMinmax);
+   SET_GetMinmaxParameterfvEXT(exec, _mesa_GetMinmaxParameterfv);
+   SET_GetMinmaxParameterivEXT(exec, _mesa_GetMinmaxParameteriv);
+#endif
+
+   /* 14. SGI_color_table */
+#if 0
+   SET_ColorTableSGI(exec, _mesa_ColorTable);
+   SET_ColorSubTableSGI(exec, _mesa_ColorSubTable);
+   SET_GetColorTableSGI(exec, _mesa_GetColorTable);
+   SET_GetColorTableParameterfvSGI(exec, _mesa_GetColorTableParameterfv);
+   SET_GetColorTableParameterivSGI(exec, _mesa_GetColorTableParameteriv);
+#endif
+
+   /* 30. GL_EXT_vertex_array */
+#if _HAVE_FULL_GL
+   SET_ColorPointerEXT(exec, _mesa_ColorPointerEXT);
+   SET_EdgeFlagPointerEXT(exec, _mesa_EdgeFlagPointerEXT);
+   SET_IndexPointerEXT(exec, _mesa_IndexPointerEXT);
+   SET_NormalPointerEXT(exec, _mesa_NormalPointerEXT);
+   SET_TexCoordPointerEXT(exec, _mesa_TexCoordPointerEXT);
+   SET_VertexPointerEXT(exec, _mesa_VertexPointerEXT);
+#endif
+
+   /* 37. GL_EXT_blend_minmax */
+#if 0
+   SET_BlendEquationEXT(exec, _mesa_BlendEquationEXT);
+#endif
+
+   /* 54. GL_EXT_point_parameters */
+#if _HAVE_FULL_GL
+   SET_PointParameterfEXT(exec, _mesa_PointParameterf);
+   SET_PointParameterfvEXT(exec, _mesa_PointParameterfv);
+#endif
+
+   /* 95. GL_ARB_ES2_compatibility */
+   SET_ClearDepthf(exec, _mesa_ClearDepthf);
+   SET_DepthRangef(exec, _mesa_DepthRangef);
+
+   /* 97. GL_EXT_compiled_vertex_array */
+#if _HAVE_FULL_GL
+   SET_LockArraysEXT(exec, _mesa_LockArraysEXT);
+   SET_UnlockArraysEXT(exec, _mesa_UnlockArraysEXT);
+#endif
+
+   /* 148. GL_EXT_multi_draw_arrays */
+#if _HAVE_FULL_GL
+   SET_MultiDrawArraysEXT(exec, _mesa_MultiDrawArraysEXT);
+#endif
+
+   /* 173. GL_INGR_blend_func_separate */
+#if _HAVE_FULL_GL
+   SET_BlendFuncSeparateEXT(exec, _mesa_BlendFuncSeparateEXT);
+#endif
+
+   /* 196. GL_MESA_resize_buffers */
+#if _HAVE_FULL_GL
+   SET_ResizeBuffersMESA(exec, _mesa_ResizeBuffersMESA);
+#endif
+
+   /* 197. GL_MESA_window_pos */
+   /* part of _mesa_init_rastpos_dispatch(exec); */
+
+   /* 200. GL_IBM_multimode_draw_arrays */
+#if _HAVE_FULL_GL
+   SET_MultiModeDrawArraysIBM(exec, _mesa_MultiModeDrawArraysIBM);
+   SET_MultiModeDrawElementsIBM(exec, _mesa_MultiModeDrawElementsIBM);
+#endif
+
+   /* 233. GL_NV_vertex_program */
+#if FEATURE_NV_vertex_program
+   SET_BindProgramNV(exec, _mesa_BindProgram);
+   SET_DeleteProgramsNV(exec, _mesa_DeletePrograms);
+   SET_ExecuteProgramNV(exec, _mesa_ExecuteProgramNV);
+   SET_GenProgramsNV(exec, _mesa_GenPrograms);
+   SET_AreProgramsResidentNV(exec, _mesa_AreProgramsResidentNV);
+   SET_RequestResidentProgramsNV(exec, _mesa_RequestResidentProgramsNV);
+   SET_GetProgramParameterfvNV(exec, _mesa_GetProgramParameterfvNV);
+   SET_GetProgramParameterdvNV(exec, _mesa_GetProgramParameterdvNV);
+   SET_GetProgramivNV(exec, _mesa_GetProgramivNV);
+   SET_GetProgramStringNV(exec, _mesa_GetProgramStringNV);
+   SET_GetTrackMatrixivNV(exec, _mesa_GetTrackMatrixivNV);
+   SET_GetVertexAttribdvNV(exec, _mesa_GetVertexAttribdvNV);
+   SET_GetVertexAttribfvNV(exec, _mesa_GetVertexAttribfvNV);
+   SET_GetVertexAttribivNV(exec, _mesa_GetVertexAttribivNV);
+   SET_GetVertexAttribPointervNV(exec, _mesa_GetVertexAttribPointervNV);
+   SET_IsProgramNV(exec, _mesa_IsProgramARB);
+   SET_LoadProgramNV(exec, _mesa_LoadProgramNV);
+   SET_ProgramEnvParameter4dARB(exec, _mesa_ProgramEnvParameter4dARB); /* alias to ProgramParameter4dNV */
+   SET_ProgramEnvParameter4dvARB(exec, _mesa_ProgramEnvParameter4dvARB);  /* alias to ProgramParameter4dvNV */
+   SET_ProgramEnvParameter4fARB(exec, _mesa_ProgramEnvParameter4fARB);  /* alias to ProgramParameter4fNV */
+   SET_ProgramEnvParameter4fvARB(exec, _mesa_ProgramEnvParameter4fvARB);  /* alias to ProgramParameter4fvNV */
+   SET_ProgramParameters4dvNV(exec, _mesa_ProgramParameters4dvNV);
+   SET_ProgramParameters4fvNV(exec, _mesa_ProgramParameters4fvNV);
+   SET_TrackMatrixNV(exec, _mesa_TrackMatrixNV);
+   SET_VertexAttribPointerNV(exec, _mesa_VertexAttribPointerNV);
+   /* glVertexAttrib*NV functions handled in api_loopback.c */
+#endif
+
+   /* 273. GL_APPLE_vertex_array_object */
+   SET_BindVertexArrayAPPLE(exec, _mesa_BindVertexArrayAPPLE);
+   SET_DeleteVertexArraysAPPLE(exec, _mesa_DeleteVertexArraysAPPLE);
+   SET_GenVertexArraysAPPLE(exec, _mesa_GenVertexArraysAPPLE);
+   SET_IsVertexArrayAPPLE(exec, _mesa_IsVertexArrayAPPLE);
+
+   /* 282. GL_NV_fragment_program */
+#if FEATURE_NV_fragment_program
+   SET_ProgramNamedParameter4fNV(exec, _mesa_ProgramNamedParameter4fNV);
+   SET_ProgramNamedParameter4dNV(exec, _mesa_ProgramNamedParameter4dNV);
+   SET_ProgramNamedParameter4fvNV(exec, _mesa_ProgramNamedParameter4fvNV);
+   SET_ProgramNamedParameter4dvNV(exec, _mesa_ProgramNamedParameter4dvNV);
+   SET_GetProgramNamedParameterfvNV(exec, _mesa_GetProgramNamedParameterfvNV);
+   SET_GetProgramNamedParameterdvNV(exec, _mesa_GetProgramNamedParameterdvNV);
+   SET_ProgramLocalParameter4dARB(exec, _mesa_ProgramLocalParameter4dARB);
+   SET_ProgramLocalParameter4dvARB(exec, _mesa_ProgramLocalParameter4dvARB);
+   SET_ProgramLocalParameter4fARB(exec, _mesa_ProgramLocalParameter4fARB);
+   SET_ProgramLocalParameter4fvARB(exec, _mesa_ProgramLocalParameter4fvARB);
+   SET_GetProgramLocalParameterdvARB(exec, _mesa_GetProgramLocalParameterdvARB);
+   SET_GetProgramLocalParameterfvARB(exec, _mesa_GetProgramLocalParameterfvARB);
+#endif
+
+   /* 262. GL_NV_point_sprite */
+#if _HAVE_FULL_GL
+   SET_PointParameteriNV(exec, _mesa_PointParameteri);
+   SET_PointParameterivNV(exec, _mesa_PointParameteriv);
+#endif
+
+   /* 268. GL_EXT_stencil_two_side */
+#if _HAVE_FULL_GL
+   SET_ActiveStencilFaceEXT(exec, _mesa_ActiveStencilFaceEXT);
+#endif
+
+   /* 285. GL_NV_primitive_restart */
+   SET_PrimitiveRestartIndexNV(exec, _mesa_PrimitiveRestartIndex);
+
+   /* ???. GL_EXT_depth_bounds_test */
+   SET_DepthBoundsEXT(exec, _mesa_DepthBoundsEXT);
+
+   /* 352. GL_EXT_transform_feedback */
+   _mesa_init_transform_feedback_dispatch(exec);
+
+   /* 364. GL_EXT_provoking_vertex */
+   SET_ProvokingVertexEXT(exec, _mesa_ProvokingVertexEXT);
+
+   /* ARB 1. GL_ARB_multitexture */
+#if _HAVE_FULL_GL
+   SET_ActiveTextureARB(exec, _mesa_ActiveTextureARB);
+   SET_ClientActiveTextureARB(exec, _mesa_ClientActiveTextureARB);
+#endif
+
+   /* ARB 3. GL_ARB_transpose_matrix */
+#if _HAVE_FULL_GL
+   SET_LoadTransposeMatrixdARB(exec, _mesa_LoadTransposeMatrixdARB);
+   SET_LoadTransposeMatrixfARB(exec, _mesa_LoadTransposeMatrixfARB);
+   SET_MultTransposeMatrixdARB(exec, _mesa_MultTransposeMatrixdARB);
+   SET_MultTransposeMatrixfARB(exec, _mesa_MultTransposeMatrixfARB);
+#endif
+
+   /* ARB 5. GL_ARB_multisample */
+#if _HAVE_FULL_GL
+   SET_SampleCoverageARB(exec, _mesa_SampleCoverageARB);
+#endif
+
+   /* ARB 12. GL_ARB_texture_compression */
+#if _HAVE_FULL_GL
+   SET_CompressedTexImage3DARB(exec, _mesa_CompressedTexImage3DARB);
+   SET_CompressedTexImage2DARB(exec, _mesa_CompressedTexImage2DARB);
+   SET_CompressedTexImage1DARB(exec, _mesa_CompressedTexImage1DARB);
+   SET_CompressedTexSubImage3DARB(exec, _mesa_CompressedTexSubImage3DARB);
+   SET_CompressedTexSubImage2DARB(exec, _mesa_CompressedTexSubImage2DARB);
+   SET_CompressedTexSubImage1DARB(exec, _mesa_CompressedTexSubImage1DARB);
+   SET_GetCompressedTexImageARB(exec, _mesa_GetCompressedTexImageARB);
+#endif
+
+   /* ARB 14. GL_ARB_point_parameters */
+   /* reuse EXT_point_parameters functions */
+
+   /* ARB 26. GL_ARB_vertex_program */
+   /* ARB 27. GL_ARB_fragment_program */
+#if FEATURE_ARB_vertex_program || FEATURE_ARB_fragment_program
+   /* glVertexAttrib1sARB aliases glVertexAttrib1sNV */
+   /* glVertexAttrib1fARB aliases glVertexAttrib1fNV */
+   /* glVertexAttrib1dARB aliases glVertexAttrib1dNV */
+   /* glVertexAttrib2sARB aliases glVertexAttrib2sNV */
+   /* glVertexAttrib2fARB aliases glVertexAttrib2fNV */
+   /* glVertexAttrib2dARB aliases glVertexAttrib2dNV */
+   /* glVertexAttrib3sARB aliases glVertexAttrib3sNV */
+   /* glVertexAttrib3fARB aliases glVertexAttrib3fNV */
+   /* glVertexAttrib3dARB aliases glVertexAttrib3dNV */
+   /* glVertexAttrib4sARB aliases glVertexAttrib4sNV */
+   /* glVertexAttrib4fARB aliases glVertexAttrib4fNV */
+   /* glVertexAttrib4dARB aliases glVertexAttrib4dNV */
+   /* glVertexAttrib4NubARB aliases glVertexAttrib4NubNV */
+   /* glVertexAttrib1svARB aliases glVertexAttrib1svNV */
+   /* glVertexAttrib1fvARB aliases glVertexAttrib1fvNV */
+   /* glVertexAttrib1dvARB aliases glVertexAttrib1dvNV */
+   /* glVertexAttrib2svARB aliases glVertexAttrib2svNV */
+   /* glVertexAttrib2fvARB aliases glVertexAttrib2fvNV */
+   /* glVertexAttrib2dvARB aliases glVertexAttrib2dvNV */
+   /* glVertexAttrib3svARB aliases glVertexAttrib3svNV */
+   /* glVertexAttrib3fvARB aliases glVertexAttrib3fvNV */
+   /* glVertexAttrib3dvARB aliases glVertexAttrib3dvNV */
+   /* glVertexAttrib4svARB aliases glVertexAttrib4svNV */
+   /* glVertexAttrib4fvARB aliases glVertexAttrib4fvNV */
+   /* glVertexAttrib4dvARB aliases glVertexAttrib4dvNV */
+   /* glVertexAttrib4NubvARB aliases glVertexAttrib4NubvNV */
+   /* glVertexAttrib4bvARB handled in api_loopback.c */
+   /* glVertexAttrib4ivARB handled in api_loopback.c */
+   /* glVertexAttrib4ubvARB handled in api_loopback.c */
+   /* glVertexAttrib4usvARB handled in api_loopback.c */
+   /* glVertexAttrib4uivARB handled in api_loopback.c */
+   /* glVertexAttrib4NbvARB handled in api_loopback.c */
+   /* glVertexAttrib4NsvARB handled in api_loopback.c */
+   /* glVertexAttrib4NivARB handled in api_loopback.c */
+   /* glVertexAttrib4NusvARB handled in api_loopback.c */
+   /* glVertexAttrib4NuivARB handled in api_loopback.c */
+   SET_VertexAttribPointerARB(exec, _mesa_VertexAttribPointerARB);
+   SET_EnableVertexAttribArrayARB(exec, _mesa_EnableVertexAttribArrayARB);
+   SET_DisableVertexAttribArrayARB(exec, _mesa_DisableVertexAttribArrayARB);
+   SET_ProgramStringARB(exec, _mesa_ProgramStringARB);
+   /* glBindProgramARB aliases glBindProgramNV */
+   /* glDeleteProgramsARB aliases glDeleteProgramsNV */
+   /* glGenProgramsARB aliases glGenProgramsNV */
+   /* glIsProgramARB aliases glIsProgramNV */
+   SET_GetVertexAttribdvARB(exec, _mesa_GetVertexAttribdvARB);
+   SET_GetVertexAttribfvARB(exec, _mesa_GetVertexAttribfvARB);
+   SET_GetVertexAttribivARB(exec, _mesa_GetVertexAttribivARB);
+   /* glGetVertexAttribPointervARB aliases glGetVertexAttribPointervNV */
+   SET_ProgramEnvParameter4dARB(exec, _mesa_ProgramEnvParameter4dARB);
+   SET_ProgramEnvParameter4dvARB(exec, _mesa_ProgramEnvParameter4dvARB);
+   SET_ProgramEnvParameter4fARB(exec, _mesa_ProgramEnvParameter4fARB);
+   SET_ProgramEnvParameter4fvARB(exec, _mesa_ProgramEnvParameter4fvARB);
+   SET_ProgramLocalParameter4dARB(exec, _mesa_ProgramLocalParameter4dARB);
+   SET_ProgramLocalParameter4dvARB(exec, _mesa_ProgramLocalParameter4dvARB);
+   SET_ProgramLocalParameter4fARB(exec, _mesa_ProgramLocalParameter4fARB);
+   SET_ProgramLocalParameter4fvARB(exec, _mesa_ProgramLocalParameter4fvARB);
+   SET_GetProgramEnvParameterdvARB(exec, _mesa_GetProgramEnvParameterdvARB);
+   SET_GetProgramEnvParameterfvARB(exec, _mesa_GetProgramEnvParameterfvARB);
+   SET_GetProgramLocalParameterdvARB(exec, _mesa_GetProgramLocalParameterdvARB);
+   SET_GetProgramLocalParameterfvARB(exec, _mesa_GetProgramLocalParameterfvARB);
+   SET_GetProgramivARB(exec, _mesa_GetProgramivARB);
+   SET_GetProgramStringARB(exec, _mesa_GetProgramStringARB);
+#endif
+
+   /* ARB 28. GL_ARB_vertex_buffer_object */
+#if FEATURE_ARB_vertex_buffer_object
+   SET_BindBufferARB(exec, _mesa_BindBufferARB);
+   SET_BufferDataARB(exec, _mesa_BufferDataARB);
+   SET_BufferSubDataARB(exec, _mesa_BufferSubDataARB);
+   SET_DeleteBuffersARB(exec, _mesa_DeleteBuffersARB);
+   SET_GenBuffersARB(exec, _mesa_GenBuffersARB);
+   SET_GetBufferParameterivARB(exec, _mesa_GetBufferParameterivARB);
+   SET_GetBufferPointervARB(exec, _mesa_GetBufferPointervARB);
+   SET_GetBufferSubDataARB(exec, _mesa_GetBufferSubDataARB);
+   SET_IsBufferARB(exec, _mesa_IsBufferARB);
+   SET_MapBufferARB(exec, _mesa_MapBufferARB);
+   SET_UnmapBufferARB(exec, _mesa_UnmapBufferARB);
+#endif
+
+   /* ARB 29. GL_ARB_occlusion_query */
+   _mesa_init_queryobj_dispatch(exec);
+
+   /* ARB 37. GL_ARB_draw_buffers */
+#if FEATURE_draw_read_buffer
+   SET_DrawBuffersARB(exec, _mesa_DrawBuffersARB);
+#endif
+
+   /* GL_ARB_sync */
+   _mesa_init_sync_dispatch(exec);
+
+  /* GL_ATI_fragment_shader */
+   _mesa_init_ati_fragment_shader_dispatch(exec);
+
+  /* GL_ATI_envmap_bumpmap */
+   SET_GetTexBumpParameterivATI(exec, _mesa_GetTexBumpParameterivATI);
+   SET_GetTexBumpParameterfvATI(exec, _mesa_GetTexBumpParameterfvATI);
+   SET_TexBumpParameterivATI(exec, _mesa_TexBumpParameterivATI);
+   SET_TexBumpParameterfvATI(exec, _mesa_TexBumpParameterfvATI);
+
+#if FEATURE_EXT_framebuffer_object
+   SET_IsRenderbufferEXT(exec, _mesa_IsRenderbufferEXT);
+   SET_BindRenderbufferEXT(exec, _mesa_BindRenderbufferEXT);
+   SET_DeleteRenderbuffersEXT(exec, _mesa_DeleteRenderbuffersEXT);
+   SET_GenRenderbuffersEXT(exec, _mesa_GenRenderbuffersEXT);
+   SET_RenderbufferStorageEXT(exec, _mesa_RenderbufferStorageEXT);
+   SET_GetRenderbufferParameterivEXT(exec, _mesa_GetRenderbufferParameterivEXT);
+   SET_IsFramebufferEXT(exec, _mesa_IsFramebufferEXT);
+   SET_BindFramebufferEXT(exec, _mesa_BindFramebufferEXT);
+   SET_DeleteFramebuffersEXT(exec, _mesa_DeleteFramebuffersEXT);
+   SET_GenFramebuffersEXT(exec, _mesa_GenFramebuffersEXT);
+   SET_CheckFramebufferStatusEXT(exec, _mesa_CheckFramebufferStatusEXT);
+   SET_FramebufferTexture1DEXT(exec, _mesa_FramebufferTexture1DEXT);
+   SET_FramebufferTexture2DEXT(exec, _mesa_FramebufferTexture2DEXT);
+   SET_FramebufferTexture3DEXT(exec, _mesa_FramebufferTexture3DEXT);
+   SET_FramebufferRenderbufferEXT(exec, _mesa_FramebufferRenderbufferEXT);
+   SET_GetFramebufferAttachmentParameterivEXT(exec, _mesa_GetFramebufferAttachmentParameterivEXT);
+   SET_GenerateMipmapEXT(exec, _mesa_GenerateMipmapEXT);
+#endif
+
+#if FEATURE_EXT_framebuffer_blit
+   SET_BlitFramebufferEXT(exec, _mesa_BlitFramebufferEXT);
+#endif
+
+   /* GL_EXT_gpu_program_parameters */
+#if FEATURE_ARB_vertex_program || FEATURE_ARB_fragment_program
+   SET_ProgramEnvParameters4fvEXT(exec, _mesa_ProgramEnvParameters4fvEXT);
+   SET_ProgramLocalParameters4fvEXT(exec, _mesa_ProgramLocalParameters4fvEXT);
+#endif
+
+   /* GL_MESA_texture_array / GL_EXT_texture_array */
+#if FEATURE_EXT_framebuffer_object
+   SET_FramebufferTextureLayerEXT(exec, _mesa_FramebufferTextureLayerEXT);
+#endif
+
+   /* GL_ATI_separate_stencil */
+   SET_StencilFuncSeparateATI(exec, _mesa_StencilFuncSeparateATI);
+
+#if FEATURE_ARB_framebuffer_object
+   /* The ARB_fbo functions are the union of
+    * GL_EXT_fbo, GL_EXT_framebuffer_blit, GL_EXT_texture_array
+    */
+   SET_RenderbufferStorageMultisample(exec, _mesa_RenderbufferStorageMultisample);
+#endif
+
+#if FEATURE_ARB_map_buffer_range
+   SET_MapBufferRange(exec, _mesa_MapBufferRange);
+   SET_FlushMappedBufferRange(exec, _mesa_FlushMappedBufferRange);
+#endif
+
+   /* GL_ARB_copy_buffer */
+   SET_CopyBufferSubData(exec, _mesa_CopyBufferSubData);
+
+   /* GL_ARB_vertex_array_object */
+   SET_BindVertexArray(exec, _mesa_BindVertexArray);
+   SET_GenVertexArrays(exec, _mesa_GenVertexArrays);
+
+   /* GL_EXT_draw_buffers2 */
+   SET_ColorMaskIndexedEXT(exec, _mesa_ColorMaskIndexed);
+   SET_GetBooleanIndexedvEXT(exec, _mesa_GetBooleanIndexedv);
+   SET_GetIntegerIndexedvEXT(exec, _mesa_GetIntegerIndexedv);
+   SET_EnableIndexedEXT(exec, _mesa_EnableIndexed);
+   SET_DisableIndexedEXT(exec, _mesa_DisableIndexed);
+   SET_IsEnabledIndexedEXT(exec, _mesa_IsEnabledIndexed);
+
+   /* GL_NV_conditional_render */
+   SET_BeginConditionalRenderNV(exec, _mesa_BeginConditionalRender);
+   SET_EndConditionalRenderNV(exec, _mesa_EndConditionalRender);
+
+#if FEATURE_OES_EGL_image
+   SET_EGLImageTargetTexture2DOES(exec, _mesa_EGLImageTargetTexture2DOES);
+   SET_EGLImageTargetRenderbufferStorageOES(exec, _mesa_EGLImageTargetRenderbufferStorageOES);
+#endif
+
+#if FEATURE_APPLE_object_purgeable
+   SET_ObjectPurgeableAPPLE(exec, _mesa_ObjectPurgeableAPPLE);
+   SET_ObjectUnpurgeableAPPLE(exec, _mesa_ObjectUnpurgeableAPPLE);
+   SET_GetObjectParameterivAPPLE(exec, _mesa_GetObjectParameterivAPPLE);
+#endif
+
+#if FEATURE_ARB_geometry_shader4
+   SET_FramebufferTextureARB(exec, _mesa_FramebufferTextureARB);
+   SET_FramebufferTextureFaceARB(exec, _mesa_FramebufferTextureFaceARB);
+#endif
+
+   SET_ClampColorARB(exec, _mesa_ClampColorARB);
+
+   /* GL_EXT_texture_integer */
+   SET_ClearColorIiEXT(exec, _mesa_ClearColorIiEXT);
+   SET_ClearColorIuiEXT(exec, _mesa_ClearColorIuiEXT);
+   SET_GetTexParameterIivEXT(exec, _mesa_GetTexParameterIiv);
+   SET_GetTexParameterIuivEXT(exec, _mesa_GetTexParameterIuiv);
+   SET_TexParameterIivEXT(exec, _mesa_TexParameterIiv);
+   SET_TexParameterIuivEXT(exec, _mesa_TexParameterIuiv);
+
+   /* GL_EXT_gpu_shader4 / OpenGL 3.0 */
+   SET_GetVertexAttribIivEXT(exec, _mesa_GetVertexAttribIiv);
+   SET_GetVertexAttribIuivEXT(exec, _mesa_GetVertexAttribIuiv);
+   SET_VertexAttribIPointerEXT(exec, _mesa_VertexAttribIPointer);
+
+   /* GL 3.0 (functions not covered by other extensions) */
+   SET_ClearBufferiv(exec, _mesa_ClearBufferiv);
+   SET_ClearBufferuiv(exec, _mesa_ClearBufferuiv);
+   SET_ClearBufferfv(exec, _mesa_ClearBufferfv);
+   SET_ClearBufferfi(exec, _mesa_ClearBufferfi);
+   SET_GetStringi(exec, _mesa_GetStringi);
+   SET_ClampColor(exec, _mesa_ClampColorARB);
+
+   /* GL_ARB_instanced_arrays */
+   SET_VertexAttribDivisorARB(exec, _mesa_VertexAttribDivisor);
+
+   /* GL_ARB_draw_buffer_blend */
+   SET_BlendFunciARB(exec, _mesa_BlendFunci);
+   SET_BlendFuncSeparateiARB(exec, _mesa_BlendFuncSeparatei);
+   SET_BlendEquationiARB(exec, _mesa_BlendEquationi);
+   SET_BlendEquationSeparateiARB(exec, _mesa_BlendEquationSeparatei);
+
+   /* GL_NV_texture_barrier */
+   SET_TextureBarrierNV(exec, _mesa_TextureBarrierNV);
+ 
+   return exec;
+}
+
+#endif /* FEATURE_GL */
diff --git a/mesalib/src/mesa/main/attrib.c b/mesalib/src/mesa/main/attrib.c
index ae7f633b8..340c06c97 100644
--- a/mesalib/src/mesa/main/attrib.c
+++ b/mesalib/src/mesa/main/attrib.c
@@ -879,10 +879,10 @@ _mesa_PopAttrib(void)
 
                color = (const struct gl_colorbuffer_attrib *) attr->data;
                _mesa_ClearIndex((GLfloat) color->ClearIndex);
-               _mesa_ClearColor(color->ClearColor[0],
-                                color->ClearColor[1],
-                                color->ClearColor[2],
-                                color->ClearColor[3]);
+               _mesa_ClearColor(color->ClearColorUnclamped[0],
+                                color->ClearColorUnclamped[1],
+                                color->ClearColorUnclamped[2],
+                                color->ClearColorUnclamped[3]);
                _mesa_IndexMask(color->IndexMask);
                if (!ctx->Extensions.EXT_draw_buffers2) {
                   _mesa_ColorMask((GLboolean) (color->ColorMask[0][0] != 0),
@@ -930,7 +930,7 @@ _mesa_PopAttrib(void)
                      _mesa_DrawBuffer(color->DrawBuffer[0]);
                }
                _mesa_set_enable(ctx, GL_ALPHA_TEST, color->AlphaEnabled);
-               _mesa_AlphaFunc(color->AlphaFunc, color->AlphaRef);
+               _mesa_AlphaFunc(color->AlphaFunc, color->AlphaRefUnclamped);
                if (ctx->Color.BlendEnabled != color->BlendEnabled) {
                   if (ctx->Extensions.EXT_draw_buffers2) {
                      GLuint i;
@@ -976,16 +976,18 @@ _mesa_PopAttrib(void)
                                                  color->Blend[0].EquationA);
                   }
                }
-               _mesa_BlendColor(color->BlendColor[0],
-                                color->BlendColor[1],
-                                color->BlendColor[2],
-                                color->BlendColor[3]);
+               _mesa_BlendColor(color->BlendColorUnclamped[0],
+                                color->BlendColorUnclamped[1],
+                                color->BlendColorUnclamped[2],
+                                color->BlendColorUnclamped[3]);
                _mesa_LogicOp(color->LogicOp);
                _mesa_set_enable(ctx, GL_COLOR_LOGIC_OP,
                                 color->ColorLogicOpEnabled);
                _mesa_set_enable(ctx, GL_INDEX_LOGIC_OP,
                                 color->IndexLogicOpEnabled);
                _mesa_set_enable(ctx, GL_DITHER, color->DitherFlag);
+               _mesa_ClampColorARB(GL_CLAMP_FRAGMENT_COLOR_ARB, color->ClampFragmentColor);
+               _mesa_ClampColorARB(GL_CLAMP_READ_COLOR_ARB, color->ClampReadColor);
             }
             break;
          case GL_CURRENT_BIT:
@@ -1108,6 +1110,7 @@ _mesa_PopAttrib(void)
                /* materials */
                memcpy(&ctx->Light.Material, &light->Material,
                       sizeof(struct gl_material));
+               _mesa_ClampColorARB(GL_CLAMP_VERTEX_COLOR_ARB, light->ClampVertexColor);
             }
             break;
          case GL_LINE_BIT:
diff --git a/mesalib/src/mesa/main/blend.c b/mesalib/src/mesa/main/blend.c
index c74a16803..95c101c34 100644
--- a/mesalib/src/mesa/main/blend.c
+++ b/mesalib/src/mesa/main/blend.c
@@ -513,19 +513,24 @@ _mesa_BlendColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha )
    GET_CURRENT_CONTEXT(ctx);
    ASSERT_OUTSIDE_BEGIN_END(ctx);
 
-   tmp[0] = CLAMP( red,   0.0F, 1.0F );
-   tmp[1] = CLAMP( green, 0.0F, 1.0F );
-   tmp[2] = CLAMP( blue,  0.0F, 1.0F );
-   tmp[3] = CLAMP( alpha, 0.0F, 1.0F );
+   tmp[0] = red;
+   tmp[1] = green;
+   tmp[2] = blue;
+   tmp[3] = alpha;
 
-   if (TEST_EQ_4V(tmp, ctx->Color.BlendColor))
+   if (TEST_EQ_4V(tmp, ctx->Color.BlendColorUnclamped))
       return;
 
    FLUSH_VERTICES(ctx, _NEW_COLOR);
-   COPY_4FV( ctx->Color.BlendColor, tmp );
+   COPY_4FV( ctx->Color.BlendColorUnclamped, tmp );
+
+   ctx->Color.BlendColor[0] = CLAMP(tmp[0], 0.0F, 1.0F);
+   ctx->Color.BlendColor[1] = CLAMP(tmp[1], 0.0F, 1.0F);
+   ctx->Color.BlendColor[2] = CLAMP(tmp[2], 0.0F, 1.0F);
+   ctx->Color.BlendColor[3] = CLAMP(tmp[3], 0.0F, 1.0F);
 
    if (ctx->Driver.BlendColor)
-      (*ctx->Driver.BlendColor)(ctx, tmp);
+      (*ctx->Driver.BlendColor)(ctx, ctx->Color.BlendColor);
 }
 
 
@@ -558,17 +563,16 @@ _mesa_AlphaFunc( GLenum func, GLclampf ref )
    case GL_NOTEQUAL:
    case GL_GEQUAL:
    case GL_ALWAYS:
-      ref = CLAMP(ref, 0.0F, 1.0F);
-
-      if (ctx->Color.AlphaFunc == func && ctx->Color.AlphaRef == ref)
+      if (ctx->Color.AlphaFunc == func && ctx->Color.AlphaRefUnclamped == ref)
          return; /* no change */
 
       FLUSH_VERTICES(ctx, _NEW_COLOR);
       ctx->Color.AlphaFunc = func;
-      ctx->Color.AlphaRef = ref;
+      ctx->Color.AlphaRefUnclamped = ref;
+      ctx->Color.AlphaRef = CLAMP(ref, 0.0F, 1.0F);
 
       if (ctx->Driver.AlphaFunc)
-         ctx->Driver.AlphaFunc(ctx, func, ref);
+         ctx->Driver.AlphaFunc(ctx, func, ctx->Color.AlphaRef);
       return;
 
    default:
@@ -737,7 +741,7 @@ _mesa_ColorMaskIndexed( GLuint buf, GLboolean red, GLboolean green,
 }
 
 
-extern void GLAPIENTRY
+void GLAPIENTRY
 _mesa_ClampColorARB(GLenum target, GLenum clamp)
 {
    GET_CURRENT_CONTEXT(ctx);
@@ -751,12 +755,15 @@ _mesa_ClampColorARB(GLenum target, GLenum clamp)
 
    switch (target) {
    case GL_CLAMP_VERTEX_COLOR_ARB:
+      FLUSH_VERTICES(ctx, _NEW_LIGHT);
       ctx->Light.ClampVertexColor = clamp;
       break;
    case GL_CLAMP_FRAGMENT_COLOR_ARB:
+      FLUSH_VERTICES(ctx, _NEW_FRAG_CLAMP);
       ctx->Color.ClampFragmentColor = clamp;
       break;
    case GL_CLAMP_READ_COLOR_ARB:
+      FLUSH_VERTICES(ctx, _NEW_COLOR);
       ctx->Color.ClampReadColor = clamp;
       break;
    default:
@@ -789,6 +796,7 @@ void _mesa_init_color( struct gl_context * ctx )
    memset(ctx->Color.ColorMask, 0xff, sizeof(ctx->Color.ColorMask));
    ctx->Color.ClearIndex = 0;
    ASSIGN_4V( ctx->Color.ClearColor, 0, 0, 0, 0 );
+   ASSIGN_4V( ctx->Color.ClearColorUnclamped, 0, 0, 0, 0 );
    ctx->Color.AlphaEnabled = GL_FALSE;
    ctx->Color.AlphaFunc = GL_ALWAYS;
    ctx->Color.AlphaRef = 0;
@@ -802,6 +810,7 @@ void _mesa_init_color( struct gl_context * ctx )
       ctx->Color.Blend[i].EquationA = GL_FUNC_ADD;
    }
    ASSIGN_4V( ctx->Color.BlendColor, 0.0, 0.0, 0.0, 0.0 );
+   ASSIGN_4V( ctx->Color.BlendColorUnclamped, 0.0, 0.0, 0.0, 0.0 );
    ctx->Color.IndexLogicOpEnabled = GL_FALSE;
    ctx->Color.ColorLogicOpEnabled = GL_FALSE;
    ctx->Color._LogicOpEnabled = GL_FALSE;
@@ -816,7 +825,9 @@ void _mesa_init_color( struct gl_context * ctx )
    }
 
    ctx->Color.ClampFragmentColor = GL_FIXED_ONLY_ARB;
+   ctx->Color._ClampFragmentColor = GL_TRUE;
    ctx->Color.ClampReadColor = GL_FIXED_ONLY_ARB;
+   ctx->Color._ClampReadColor = GL_TRUE;
 }
 
 /*@}*/
diff --git a/mesalib/src/mesa/main/clear.c b/mesalib/src/mesa/main/clear.c
index ca831476b..fa95e4522 100644
--- a/mesalib/src/mesa/main/clear.c
+++ b/mesalib/src/mesa/main/clear.c
@@ -1,567 +1,575 @@
-/*
- * Mesa 3-D graphics library
- * Version:  7.1
- *
- * Copyright (C) 1999-2007  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"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-
-/**
- * \file clear.c
- * glClearColor, glClearIndex, glClear() functions.
- */
-
-
-
-#include "glheader.h"
-#include "clear.h"
-#include "context.h"
-#include "colormac.h"
-#include "enums.h"
-#include "macros.h"
-#include "mtypes.h"
-#include "state.h"
-
-
-
-#if _HAVE_FULL_GL
-void GLAPIENTRY
-_mesa_ClearIndex( GLfloat c )
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END(ctx);
-
-   if (ctx->Color.ClearIndex == (GLuint) c)
-      return;
-
-   FLUSH_VERTICES(ctx, _NEW_COLOR);
-   ctx->Color.ClearIndex = (GLuint) c;
-}
-#endif
-
-
-/**
- * Specify the clear values for the color buffers.
- *
- * \param red red color component.
- * \param green green color component.
- * \param blue blue color component.
- * \param alpha alpha component.
- *
- * \sa glClearColor().
- *
- * Clamps the parameters and updates gl_colorbuffer_attrib::ClearColor.  On a
- * change, flushes the vertices and notifies the driver via the
- * dd_function_table::ClearColor callback.
- */
-void GLAPIENTRY
-_mesa_ClearColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha )
-{
-   GLfloat tmp[4];
-   GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END(ctx);
-
-   tmp[0] = CLAMP(red,   0.0F, 1.0F);
-   tmp[1] = CLAMP(green, 0.0F, 1.0F);
-   tmp[2] = CLAMP(blue,  0.0F, 1.0F);
-   tmp[3] = CLAMP(alpha, 0.0F, 1.0F);
-
-   if (TEST_EQ_4V(tmp, ctx->Color.ClearColor))
-      return; /* no change */
-
-   FLUSH_VERTICES(ctx, _NEW_COLOR);
-   COPY_4V(ctx->Color.ClearColor, tmp);
-
-   if (ctx->Driver.ClearColor) {
-      /* it's OK to call glClearColor in CI mode but it should be a NOP */
-      (*ctx->Driver.ClearColor)(ctx, ctx->Color.ClearColor);
-   }
-}
-
-
-/**
- * GL_EXT_texture_integer
- */
-void GLAPIENTRY
-_mesa_ClearColorIiEXT(GLint r, GLint g, GLint b, GLint a)
-{
-   GLfloat tmp[4];
-   GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END(ctx);
-
-   tmp[0] = (GLfloat) r;
-   tmp[1] = (GLfloat) g;
-   tmp[2] = (GLfloat) b;
-   tmp[3] = (GLfloat) a;
-
-   if (TEST_EQ_4V(tmp, ctx->Color.ClearColor))
-      return; /* no change */
-
-   FLUSH_VERTICES(ctx, _NEW_COLOR);
-
-   /* XXX we should eventually have a float/int/uint union for
-    * the ctx->Color.ClearColor state.
-    */
-   COPY_4V(ctx->Color.ClearColor, tmp);
-
-   if (ctx->Driver.ClearColor) {
-      ctx->Driver.ClearColor(ctx, ctx->Color.ClearColor);
-   }
-}
-
-
-/**
- * GL_EXT_texture_integer
- */
-void GLAPIENTRY
-_mesa_ClearColorIuiEXT(GLuint r, GLuint g, GLuint b, GLuint a)
-{
-   GLfloat tmp[4];
-   GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END(ctx);
-
-   tmp[0] = (GLfloat) r;
-   tmp[1] = (GLfloat) g;
-   tmp[2] = (GLfloat) b;
-   tmp[3] = (GLfloat) a;
-
-   if (TEST_EQ_4V(tmp, ctx->Color.ClearColor))
-      return; /* no change */
-
-   FLUSH_VERTICES(ctx, _NEW_COLOR);
-
-   /* XXX we should eventually have a float/int/uint union for
-    * the ctx->Color.ClearColor state.
-    */
-   COPY_4V(ctx->Color.ClearColor, tmp);
-
-   if (ctx->Driver.ClearColor) {
-      ctx->Driver.ClearColor(ctx, ctx->Color.ClearColor);
-   }
-}
-
-
-/**
- * Clear buffers.
- * 
- * \param mask bit-mask indicating the buffers to be cleared.
- *
- * Flushes the vertices and verifies the parameter. If __struct gl_contextRec::NewState
- * is set then calls _mesa_update_state() to update gl_frame_buffer::_Xmin,
- * etc. If the rasterization mode is set to GL_RENDER then requests the driver
- * to clear the buffers, via the dd_function_table::Clear callback.
- */ 
-void GLAPIENTRY
-_mesa_Clear( GLbitfield mask )
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
-
-   FLUSH_CURRENT(ctx, 0);
-
-   if (MESA_VERBOSE & VERBOSE_API)
-      _mesa_debug(ctx, "glClear 0x%x\n", mask);
-
-   if (mask & ~(GL_COLOR_BUFFER_BIT |
-                GL_DEPTH_BUFFER_BIT |
-                GL_STENCIL_BUFFER_BIT |
-                GL_ACCUM_BUFFER_BIT)) {
-      /* invalid bit set */
-      _mesa_error( ctx, GL_INVALID_VALUE, "glClear(0x%x)", mask);
-      return;
-   }
-
-   if (ctx->NewState) {
-      _mesa_update_state( ctx );	/* update _Xmin, etc */
-   }
-
-   if (ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
-      _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
-                  "glClear(incomplete framebuffer)");
-      return;
-   }
-
-   if (ctx->DrawBuffer->Width == 0 || ctx->DrawBuffer->Height == 0 ||
-       ctx->DrawBuffer->_Xmin >= ctx->DrawBuffer->_Xmax ||
-       ctx->DrawBuffer->_Ymin >= ctx->DrawBuffer->_Ymax)
-      return;
-
-   if (ctx->RenderMode == GL_RENDER) {
-      GLbitfield bufferMask;
-
-      /* don't clear depth buffer if depth writing disabled */
-      if (!ctx->Depth.Mask)
-         mask &= ~GL_DEPTH_BUFFER_BIT;
-
-      /* Build the bitmask to send to device driver's Clear function.
-       * Note that the GL_COLOR_BUFFER_BIT flag will expand to 0, 1, 2 or 4
-       * of the BUFFER_BIT_FRONT/BACK_LEFT/RIGHT flags, or one of the
-       * BUFFER_BIT_COLORn flags.
-       */
-      bufferMask = 0;
-      if (mask & GL_COLOR_BUFFER_BIT) {
-         GLuint i;
-         for (i = 0; i < ctx->DrawBuffer->_NumColorDrawBuffers; i++) {
-            bufferMask |= (1 << ctx->DrawBuffer->_ColorDrawBufferIndexes[i]);
-         }
-      }
-
-      if ((mask & GL_DEPTH_BUFFER_BIT)
-          && ctx->DrawBuffer->Visual.haveDepthBuffer) {
-         bufferMask |= BUFFER_BIT_DEPTH;
-      }
-
-      if ((mask & GL_STENCIL_BUFFER_BIT)
-          && ctx->DrawBuffer->Visual.haveStencilBuffer) {
-         bufferMask |= BUFFER_BIT_STENCIL;
-      }
-
-      if ((mask & GL_ACCUM_BUFFER_BIT)
-          && ctx->DrawBuffer->Visual.haveAccumBuffer) {
-         bufferMask |= BUFFER_BIT_ACCUM;
-      }
-
-      ASSERT(ctx->Driver.Clear);
-      ctx->Driver.Clear(ctx, bufferMask);
-   }
-}
-
-
-/** Returned by make_color_buffer_mask() for errors */
-#define INVALID_MASK ~0x0
-
-
-/**
- * Convert the glClearBuffer 'drawbuffer' parameter into a bitmask of
- * BUFFER_BIT_x values.
- * Return INVALID_MASK if the drawbuffer value is invalid.
- */
-static GLbitfield
-make_color_buffer_mask(struct gl_context *ctx, GLint drawbuffer)
-{
-   const struct gl_renderbuffer_attachment *att = ctx->DrawBuffer->Attachment;
-   GLbitfield mask = 0x0;
-
-   switch (drawbuffer) {
-   case GL_FRONT:
-      if (att[BUFFER_FRONT_LEFT].Renderbuffer)
-         mask |= BUFFER_BIT_FRONT_LEFT;
-      if (att[BUFFER_FRONT_RIGHT].Renderbuffer)
-         mask |= BUFFER_BIT_FRONT_RIGHT;
-      break;
-   case GL_BACK:
-      if (att[BUFFER_BACK_LEFT].Renderbuffer)
-         mask |= BUFFER_BIT_BACK_LEFT;
-      if (att[BUFFER_BACK_RIGHT].Renderbuffer)
-         mask |= BUFFER_BIT_BACK_RIGHT;
-      break;
-   case GL_LEFT:
-      if (att[BUFFER_FRONT_LEFT].Renderbuffer)
-         mask |= BUFFER_BIT_FRONT_LEFT;
-      if (att[BUFFER_BACK_LEFT].Renderbuffer)
-         mask |= BUFFER_BIT_BACK_LEFT;
-      break;
-   case GL_RIGHT:
-      if (att[BUFFER_FRONT_RIGHT].Renderbuffer)
-         mask |= BUFFER_BIT_FRONT_RIGHT;
-      if (att[BUFFER_BACK_RIGHT].Renderbuffer)
-         mask |= BUFFER_BIT_BACK_RIGHT;
-      break;
-   case GL_FRONT_AND_BACK:
-      if (att[BUFFER_FRONT_LEFT].Renderbuffer)
-         mask |= BUFFER_BIT_FRONT_LEFT;
-      if (att[BUFFER_BACK_LEFT].Renderbuffer)
-         mask |= BUFFER_BIT_BACK_LEFT;
-      if (att[BUFFER_FRONT_RIGHT].Renderbuffer)
-         mask |= BUFFER_BIT_FRONT_RIGHT;
-      if (att[BUFFER_BACK_RIGHT].Renderbuffer)
-         mask |= BUFFER_BIT_BACK_RIGHT;
-      break;
-   default:
-      if (drawbuffer < 0 || drawbuffer >= (GLint)ctx->Const.MaxDrawBuffers) {
-         mask = INVALID_MASK;
-      }
-      else if (att[BUFFER_COLOR0 + drawbuffer].Renderbuffer) {
-         mask |= (BUFFER_BIT_COLOR0 << drawbuffer);
-      }
-   }
-
-   return mask;
-}
-
-
-
-/**
- * New in GL 3.0
- * Clear signed integer color buffer or stencil buffer (not depth).
- */
-void GLAPIENTRY
-_mesa_ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
-
-   FLUSH_CURRENT(ctx, 0);
-
-   if (ctx->NewState) {
-      _mesa_update_state( ctx );
-   }
-
-   switch (buffer) {
-   case GL_STENCIL:
-      if (drawbuffer != 0) {
-         _mesa_error(ctx, GL_INVALID_VALUE, "glClearBufferiv(drawbuffer=%d)",
-                     drawbuffer);
-         return;
-      }
-      else {
-         /* Save current stencil clear value, set to 'value', do the
-          * stencil clear and restore the clear value.
-          * XXX in the future we may have a new ctx->Driver.ClearBuffer()
-          * hook instead.
-          */
-         const GLuint clearSave = ctx->Stencil.Clear;
-         ctx->Stencil.Clear = *value;
-         if (ctx->Driver.ClearStencil)
-            ctx->Driver.ClearStencil(ctx, *value);
-         ctx->Driver.Clear(ctx, BUFFER_BIT_STENCIL);
-         ctx->Stencil.Clear = clearSave;
-         if (ctx->Driver.ClearStencil)
-            ctx->Driver.ClearStencil(ctx, clearSave);
-      }
-      break;
-   case GL_COLOR:
-      {
-         const GLbitfield mask = make_color_buffer_mask(ctx, drawbuffer);
-         if (mask == INVALID_MASK) {
-            _mesa_error(ctx, GL_INVALID_VALUE, "glClearBufferiv(drawbuffer=%d)",
-                        drawbuffer);
-            return;
-         }
-         else if (mask) {
-            /* XXX note: we're putting the integer clear values into the
-             * floating point state var.  This will not always work.  We'll
-             * need a new ctx->Driver.ClearBuffer() hook....
-             */
-            GLclampf clearSave[4];
-            /* save color */
-            COPY_4V(clearSave, ctx->Color.ClearColor);
-            /* set color */
-            COPY_4V_CAST(ctx->Color.ClearColor, value, GLclampf);
-            if (ctx->Driver.ClearColor)
-               ctx->Driver.ClearColor(ctx, ctx->Color.ClearColor);
-            /* clear buffer(s) */
-            ctx->Driver.Clear(ctx, mask);
-            /* restore color */
-            COPY_4V(ctx->Color.ClearColor, clearSave);
-            if (ctx->Driver.ClearColor)
-               ctx->Driver.ClearColor(ctx, clearSave);
-         }
-      }
-      break;
-   default:
-      _mesa_error(ctx, GL_INVALID_ENUM, "glClearBufferiv(buffer=%s)",
-                  _mesa_lookup_enum_by_nr(buffer));
-      return;
-   }
-}
-
-
-/**
- * New in GL 3.0
- * Clear unsigned integer color buffer (not depth, not stencil).
- */
-void GLAPIENTRY
-_mesa_ClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
-
-   FLUSH_CURRENT(ctx, 0);
-
-   if (ctx->NewState) {
-      _mesa_update_state( ctx );
-   }
-
-   switch (buffer) {
-   case GL_COLOR:
-      {
-         const GLbitfield mask = make_color_buffer_mask(ctx, drawbuffer);
-         if (mask == INVALID_MASK) {
-            _mesa_error(ctx, GL_INVALID_VALUE, "glClearBufferuiv(drawbuffer=%d)",
-                        drawbuffer);
-            return;
-         }
-         else if (mask) {
-            /* XXX note: we're putting the uint clear values into the
-             * floating point state var.  This will not always work.  We'll
-             * need a new ctx->Driver.ClearBuffer() hook....
-             */
-            GLclampf clearSave[4];
-            /* save color */
-            COPY_4V(clearSave, ctx->Color.ClearColor);
-            /* set color */
-            COPY_4V_CAST(ctx->Color.ClearColor, value, GLclampf);
-            if (ctx->Driver.ClearColor)
-               ctx->Driver.ClearColor(ctx, ctx->Color.ClearColor);
-            /* clear buffer(s) */
-            ctx->Driver.Clear(ctx, mask);
-            /* restore color */
-            COPY_4V(ctx->Color.ClearColor, clearSave);
-            if (ctx->Driver.ClearColor)
-               ctx->Driver.ClearColor(ctx, clearSave);
-         }
-      }
-      break;
-   default:
-      _mesa_error(ctx, GL_INVALID_ENUM, "glClearBufferuiv(buffer=%s)",
-                  _mesa_lookup_enum_by_nr(buffer));
-      return;
-   }
-}
-
-
-/**
- * New in GL 3.0
- * Clear fixed-pt or float color buffer or depth buffer (not stencil).
- */
-void GLAPIENTRY
-_mesa_ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
-
-   FLUSH_CURRENT(ctx, 0);
-
-   if (ctx->NewState) {
-      _mesa_update_state( ctx );
-   }
-
-   switch (buffer) {
-   case GL_DEPTH:
-      if (drawbuffer != 0) {
-         _mesa_error(ctx, GL_INVALID_VALUE, "glClearBufferfv(drawbuffer=%d)",
-                     drawbuffer);
-         return;
-      }
-      else {
-         /* Save current depth clear value, set to 'value', do the
-          * depth clear and restore the clear value.
-          * XXX in the future we may have a new ctx->Driver.ClearBuffer()
-          * hook instead.
-          */
-         const GLclampd clearSave = ctx->Depth.Clear;
-         ctx->Depth.Clear = *value;
-         if (ctx->Driver.ClearDepth)
-            ctx->Driver.ClearDepth(ctx, *value);
-         ctx->Driver.Clear(ctx, BUFFER_BIT_DEPTH);
-         ctx->Depth.Clear = clearSave;
-         if (ctx->Driver.ClearDepth)
-            ctx->Driver.ClearDepth(ctx, clearSave);
-      }
-      /* clear depth buffer to value */
-      break;
-   case GL_COLOR:
-      {
-         const GLbitfield mask = make_color_buffer_mask(ctx, drawbuffer);
-         if (mask == INVALID_MASK) {
-            _mesa_error(ctx, GL_INVALID_VALUE, "glClearBufferfv(drawbuffer=%d)",
-                        drawbuffer);
-            return;
-         }
-         else if (mask) {
-            GLclampf clearSave[4];
-            /* save color */
-            COPY_4V(clearSave, ctx->Color.ClearColor);
-            /* set color */
-            COPY_4V_CAST(ctx->Color.ClearColor, value, GLclampf);
-            if (ctx->Driver.ClearColor)
-               ctx->Driver.ClearColor(ctx, ctx->Color.ClearColor);
-            /* clear buffer(s) */
-            ctx->Driver.Clear(ctx, mask);
-            /* restore color */
-            COPY_4V(ctx->Color.ClearColor, clearSave);
-            if (ctx->Driver.ClearColor)
-               ctx->Driver.ClearColor(ctx, clearSave);
-         }
-      }
-      break;
-   default:
-      _mesa_error(ctx, GL_INVALID_ENUM, "glClearBufferfv(buffer=%s)",
-                  _mesa_lookup_enum_by_nr(buffer));
-      return;
-   }
-}
-
-
-/**
- * New in GL 3.0
- * Clear depth/stencil buffer only.
- */
-void GLAPIENTRY
-_mesa_ClearBufferfi(GLenum buffer, GLint drawbuffer,
-                    GLfloat depth, GLint stencil)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
-
-   FLUSH_CURRENT(ctx, 0);
-
-   if (buffer != GL_DEPTH_STENCIL) {
-      _mesa_error(ctx, GL_INVALID_ENUM, "glClearBufferfi(buffer=%s)",
-                  _mesa_lookup_enum_by_nr(buffer));
-      return;
-   }
-
-   if (drawbuffer != 0) {
-      _mesa_error(ctx, GL_INVALID_VALUE, "glClearBufferfi(drawbuffer=%d)",
-                  drawbuffer);
-      return;
-   }
-
-   if (ctx->NewState) {
-      _mesa_update_state( ctx );
-   }
-
-   {
-      /* save current clear values */
-      const GLclampd clearDepthSave = ctx->Depth.Clear;
-      const GLuint clearStencilSave = ctx->Stencil.Clear;
-
-      /* set new clear values */
-      ctx->Depth.Clear = depth;
-      ctx->Stencil.Clear = stencil;
-      if (ctx->Driver.ClearDepth)
-         ctx->Driver.ClearDepth(ctx, depth);
-      if (ctx->Driver.ClearStencil)
-         ctx->Driver.ClearStencil(ctx, stencil);
-
-      /* clear buffers */
-      ctx->Driver.Clear(ctx, BUFFER_BIT_DEPTH | BUFFER_BIT_STENCIL);
-
-      /* restore */
-      ctx->Depth.Clear = clearDepthSave;
-      ctx->Stencil.Clear = clearStencilSave;
-      if (ctx->Driver.ClearDepth)
-         ctx->Driver.ClearDepth(ctx, clearDepthSave);
-      if (ctx->Driver.ClearStencil)
-         ctx->Driver.ClearStencil(ctx, clearStencilSave);
-   }
-}
+/*
+ * Mesa 3-D graphics library
+ * Version:  7.1
+ *
+ * Copyright (C) 1999-2007  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"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+
+/**
+ * \file clear.c
+ * glClearColor, glClearIndex, glClear() functions.
+ */
+
+
+
+#include "glheader.h"
+#include "clear.h"
+#include "context.h"
+#include "colormac.h"
+#include "enums.h"
+#include "macros.h"
+#include "mtypes.h"
+#include "state.h"
+
+
+
+#if _HAVE_FULL_GL
+void GLAPIENTRY
+_mesa_ClearIndex( GLfloat c )
+{
+   GET_CURRENT_CONTEXT(ctx);
+   ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+   if (ctx->Color.ClearIndex == (GLuint) c)
+      return;
+
+   FLUSH_VERTICES(ctx, _NEW_COLOR);
+   ctx->Color.ClearIndex = (GLuint) c;
+}
+#endif
+
+
+/**
+ * Specify the clear values for the color buffers.
+ *
+ * \param red red color component.
+ * \param green green color component.
+ * \param blue blue color component.
+ * \param alpha alpha component.
+ *
+ * \sa glClearColor().
+ *
+ * Clamps the parameters and updates gl_colorbuffer_attrib::ClearColor.  On a
+ * change, flushes the vertices and notifies the driver via the
+ * dd_function_table::ClearColor callback.
+ */
+void GLAPIENTRY
+_mesa_ClearColor( GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha )
+{
+   GLfloat tmp[4];
+   GET_CURRENT_CONTEXT(ctx);
+   ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+   tmp[0] = red;
+   tmp[1] = green;
+   tmp[2] = blue;
+   tmp[3] = alpha;
+
+   if (TEST_EQ_4V(tmp, ctx->Color.ClearColorUnclamped))
+      return; /* no change */
+
+   FLUSH_VERTICES(ctx, _NEW_COLOR);
+   COPY_4V(ctx->Color.ClearColorUnclamped, tmp);
+
+   ctx->Color.ClearColor[0] = CLAMP(tmp[0], 0.0F, 1.0F);
+   ctx->Color.ClearColor[1] = CLAMP(tmp[1], 0.0F, 1.0F);
+   ctx->Color.ClearColor[2] = CLAMP(tmp[2], 0.0F, 1.0F);
+   ctx->Color.ClearColor[3] = CLAMP(tmp[3], 0.0F, 1.0F);
+
+   if (ctx->Driver.ClearColor) {
+      /* it's OK to call glClearColor in CI mode but it should be a NOP */
+      /* we pass the clamped color, since all drivers that need this don't
+       * support GL_ARB_color_buffer_float
+       */
+      (*ctx->Driver.ClearColor)(ctx, ctx->Color.ClearColor);
+   }
+}
+
+
+/**
+ * GL_EXT_texture_integer
+ */
+void GLAPIENTRY
+_mesa_ClearColorIiEXT(GLint r, GLint g, GLint b, GLint a)
+{
+   GLfloat tmp[4];
+   GET_CURRENT_CONTEXT(ctx);
+   ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+   tmp[0] = (GLfloat) r;
+   tmp[1] = (GLfloat) g;
+   tmp[2] = (GLfloat) b;
+   tmp[3] = (GLfloat) a;
+
+   if (TEST_EQ_4V(tmp, ctx->Color.ClearColor))
+      return; /* no change */
+
+   FLUSH_VERTICES(ctx, _NEW_COLOR);
+
+   /* XXX we should eventually have a float/int/uint union for
+    * the ctx->Color.ClearColor state.
+    */
+   COPY_4V(ctx->Color.ClearColor, tmp);
+
+   if (ctx->Driver.ClearColor) {
+      ctx->Driver.ClearColor(ctx, ctx->Color.ClearColor);
+   }
+}
+
+
+/**
+ * GL_EXT_texture_integer
+ */
+void GLAPIENTRY
+_mesa_ClearColorIuiEXT(GLuint r, GLuint g, GLuint b, GLuint a)
+{
+   GLfloat tmp[4];
+   GET_CURRENT_CONTEXT(ctx);
+   ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+   tmp[0] = (GLfloat) r;
+   tmp[1] = (GLfloat) g;
+   tmp[2] = (GLfloat) b;
+   tmp[3] = (GLfloat) a;
+
+   if (TEST_EQ_4V(tmp, ctx->Color.ClearColor))
+      return; /* no change */
+
+   FLUSH_VERTICES(ctx, _NEW_COLOR);
+
+   /* XXX we should eventually have a float/int/uint union for
+    * the ctx->Color.ClearColor state.
+    */
+   COPY_4V(ctx->Color.ClearColor, tmp);
+
+   if (ctx->Driver.ClearColor) {
+      ctx->Driver.ClearColor(ctx, ctx->Color.ClearColor);
+   }
+}
+
+
+/**
+ * Clear buffers.
+ * 
+ * \param mask bit-mask indicating the buffers to be cleared.
+ *
+ * Flushes the vertices and verifies the parameter. If __struct gl_contextRec::NewState
+ * is set then calls _mesa_update_state() to update gl_frame_buffer::_Xmin,
+ * etc. If the rasterization mode is set to GL_RENDER then requests the driver
+ * to clear the buffers, via the dd_function_table::Clear callback.
+ */ 
+void GLAPIENTRY
+_mesa_Clear( GLbitfield mask )
+{
+   GET_CURRENT_CONTEXT(ctx);
+   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
+
+   FLUSH_CURRENT(ctx, 0);
+
+   if (MESA_VERBOSE & VERBOSE_API)
+      _mesa_debug(ctx, "glClear 0x%x\n", mask);
+
+   if (mask & ~(GL_COLOR_BUFFER_BIT |
+                GL_DEPTH_BUFFER_BIT |
+                GL_STENCIL_BUFFER_BIT |
+                GL_ACCUM_BUFFER_BIT)) {
+      /* invalid bit set */
+      _mesa_error( ctx, GL_INVALID_VALUE, "glClear(0x%x)", mask);
+      return;
+   }
+
+   if (ctx->NewState) {
+      _mesa_update_state( ctx );	/* update _Xmin, etc */
+   }
+
+   if (ctx->DrawBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) {
+      _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT,
+                  "glClear(incomplete framebuffer)");
+      return;
+   }
+
+   if (ctx->DrawBuffer->Width == 0 || ctx->DrawBuffer->Height == 0 ||
+       ctx->DrawBuffer->_Xmin >= ctx->DrawBuffer->_Xmax ||
+       ctx->DrawBuffer->_Ymin >= ctx->DrawBuffer->_Ymax)
+      return;
+
+   if (ctx->RenderMode == GL_RENDER) {
+      GLbitfield bufferMask;
+
+      /* don't clear depth buffer if depth writing disabled */
+      if (!ctx->Depth.Mask)
+         mask &= ~GL_DEPTH_BUFFER_BIT;
+
+      /* Build the bitmask to send to device driver's Clear function.
+       * Note that the GL_COLOR_BUFFER_BIT flag will expand to 0, 1, 2 or 4
+       * of the BUFFER_BIT_FRONT/BACK_LEFT/RIGHT flags, or one of the
+       * BUFFER_BIT_COLORn flags.
+       */
+      bufferMask = 0;
+      if (mask & GL_COLOR_BUFFER_BIT) {
+         GLuint i;
+         for (i = 0; i < ctx->DrawBuffer->_NumColorDrawBuffers; i++) {
+            bufferMask |= (1 << ctx->DrawBuffer->_ColorDrawBufferIndexes[i]);
+         }
+      }
+
+      if ((mask & GL_DEPTH_BUFFER_BIT)
+          && ctx->DrawBuffer->Visual.haveDepthBuffer) {
+         bufferMask |= BUFFER_BIT_DEPTH;
+      }
+
+      if ((mask & GL_STENCIL_BUFFER_BIT)
+          && ctx->DrawBuffer->Visual.haveStencilBuffer) {
+         bufferMask |= BUFFER_BIT_STENCIL;
+      }
+
+      if ((mask & GL_ACCUM_BUFFER_BIT)
+          && ctx->DrawBuffer->Visual.haveAccumBuffer) {
+         bufferMask |= BUFFER_BIT_ACCUM;
+      }
+
+      ASSERT(ctx->Driver.Clear);
+      ctx->Driver.Clear(ctx, bufferMask);
+   }
+}
+
+
+/** Returned by make_color_buffer_mask() for errors */
+#define INVALID_MASK ~0x0
+
+
+/**
+ * Convert the glClearBuffer 'drawbuffer' parameter into a bitmask of
+ * BUFFER_BIT_x values.
+ * Return INVALID_MASK if the drawbuffer value is invalid.
+ */
+static GLbitfield
+make_color_buffer_mask(struct gl_context *ctx, GLint drawbuffer)
+{
+   const struct gl_renderbuffer_attachment *att = ctx->DrawBuffer->Attachment;
+   GLbitfield mask = 0x0;
+
+   switch (drawbuffer) {
+   case GL_FRONT:
+      if (att[BUFFER_FRONT_LEFT].Renderbuffer)
+         mask |= BUFFER_BIT_FRONT_LEFT;
+      if (att[BUFFER_FRONT_RIGHT].Renderbuffer)
+         mask |= BUFFER_BIT_FRONT_RIGHT;
+      break;
+   case GL_BACK:
+      if (att[BUFFER_BACK_LEFT].Renderbuffer)
+         mask |= BUFFER_BIT_BACK_LEFT;
+      if (att[BUFFER_BACK_RIGHT].Renderbuffer)
+         mask |= BUFFER_BIT_BACK_RIGHT;
+      break;
+   case GL_LEFT:
+      if (att[BUFFER_FRONT_LEFT].Renderbuffer)
+         mask |= BUFFER_BIT_FRONT_LEFT;
+      if (att[BUFFER_BACK_LEFT].Renderbuffer)
+         mask |= BUFFER_BIT_BACK_LEFT;
+      break;
+   case GL_RIGHT:
+      if (att[BUFFER_FRONT_RIGHT].Renderbuffer)
+         mask |= BUFFER_BIT_FRONT_RIGHT;
+      if (att[BUFFER_BACK_RIGHT].Renderbuffer)
+         mask |= BUFFER_BIT_BACK_RIGHT;
+      break;
+   case GL_FRONT_AND_BACK:
+      if (att[BUFFER_FRONT_LEFT].Renderbuffer)
+         mask |= BUFFER_BIT_FRONT_LEFT;
+      if (att[BUFFER_BACK_LEFT].Renderbuffer)
+         mask |= BUFFER_BIT_BACK_LEFT;
+      if (att[BUFFER_FRONT_RIGHT].Renderbuffer)
+         mask |= BUFFER_BIT_FRONT_RIGHT;
+      if (att[BUFFER_BACK_RIGHT].Renderbuffer)
+         mask |= BUFFER_BIT_BACK_RIGHT;
+      break;
+   default:
+      if (drawbuffer < 0 || drawbuffer >= (GLint)ctx->Const.MaxDrawBuffers) {
+         mask = INVALID_MASK;
+      }
+      else if (att[BUFFER_COLOR0 + drawbuffer].Renderbuffer) {
+         mask |= (BUFFER_BIT_COLOR0 << drawbuffer);
+      }
+   }
+
+   return mask;
+}
+
+
+
+/**
+ * New in GL 3.0
+ * Clear signed integer color buffer or stencil buffer (not depth).
+ */
+void GLAPIENTRY
+_mesa_ClearBufferiv(GLenum buffer, GLint drawbuffer, const GLint *value)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
+
+   FLUSH_CURRENT(ctx, 0);
+
+   if (ctx->NewState) {
+      _mesa_update_state( ctx );
+   }
+
+   switch (buffer) {
+   case GL_STENCIL:
+      if (drawbuffer != 0) {
+         _mesa_error(ctx, GL_INVALID_VALUE, "glClearBufferiv(drawbuffer=%d)",
+                     drawbuffer);
+         return;
+      }
+      else {
+         /* Save current stencil clear value, set to 'value', do the
+          * stencil clear and restore the clear value.
+          * XXX in the future we may have a new ctx->Driver.ClearBuffer()
+          * hook instead.
+          */
+         const GLuint clearSave = ctx->Stencil.Clear;
+         ctx->Stencil.Clear = *value;
+         if (ctx->Driver.ClearStencil)
+            ctx->Driver.ClearStencil(ctx, *value);
+         ctx->Driver.Clear(ctx, BUFFER_BIT_STENCIL);
+         ctx->Stencil.Clear = clearSave;
+         if (ctx->Driver.ClearStencil)
+            ctx->Driver.ClearStencil(ctx, clearSave);
+      }
+      break;
+   case GL_COLOR:
+      {
+         const GLbitfield mask = make_color_buffer_mask(ctx, drawbuffer);
+         if (mask == INVALID_MASK) {
+            _mesa_error(ctx, GL_INVALID_VALUE, "glClearBufferiv(drawbuffer=%d)",
+                        drawbuffer);
+            return;
+         }
+         else if (mask) {
+            /* XXX note: we're putting the integer clear values into the
+             * floating point state var.  This will not always work.  We'll
+             * need a new ctx->Driver.ClearBuffer() hook....
+             */
+            GLclampf clearSave[4];
+            /* save color */
+            COPY_4V(clearSave, ctx->Color.ClearColor);
+            /* set color */
+            COPY_4V_CAST(ctx->Color.ClearColor, value, GLclampf);
+            if (ctx->Driver.ClearColor)
+               ctx->Driver.ClearColor(ctx, ctx->Color.ClearColor);
+            /* clear buffer(s) */
+            ctx->Driver.Clear(ctx, mask);
+            /* restore color */
+            COPY_4V(ctx->Color.ClearColor, clearSave);
+            if (ctx->Driver.ClearColor)
+               ctx->Driver.ClearColor(ctx, clearSave);
+         }
+      }
+      break;
+   default:
+      _mesa_error(ctx, GL_INVALID_ENUM, "glClearBufferiv(buffer=%s)",
+                  _mesa_lookup_enum_by_nr(buffer));
+      return;
+   }
+}
+
+
+/**
+ * New in GL 3.0
+ * Clear unsigned integer color buffer (not depth, not stencil).
+ */
+void GLAPIENTRY
+_mesa_ClearBufferuiv(GLenum buffer, GLint drawbuffer, const GLuint *value)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
+
+   FLUSH_CURRENT(ctx, 0);
+
+   if (ctx->NewState) {
+      _mesa_update_state( ctx );
+   }
+
+   switch (buffer) {
+   case GL_COLOR:
+      {
+         const GLbitfield mask = make_color_buffer_mask(ctx, drawbuffer);
+         if (mask == INVALID_MASK) {
+            _mesa_error(ctx, GL_INVALID_VALUE, "glClearBufferuiv(drawbuffer=%d)",
+                        drawbuffer);
+            return;
+         }
+         else if (mask) {
+            /* XXX note: we're putting the uint clear values into the
+             * floating point state var.  This will not always work.  We'll
+             * need a new ctx->Driver.ClearBuffer() hook....
+             */
+            GLclampf clearSave[4];
+            /* save color */
+            COPY_4V(clearSave, ctx->Color.ClearColor);
+            /* set color */
+            COPY_4V_CAST(ctx->Color.ClearColor, value, GLclampf);
+            if (ctx->Driver.ClearColor)
+               ctx->Driver.ClearColor(ctx, ctx->Color.ClearColor);
+            /* clear buffer(s) */
+            ctx->Driver.Clear(ctx, mask);
+            /* restore color */
+            COPY_4V(ctx->Color.ClearColor, clearSave);
+            if (ctx->Driver.ClearColor)
+               ctx->Driver.ClearColor(ctx, clearSave);
+         }
+      }
+      break;
+   default:
+      _mesa_error(ctx, GL_INVALID_ENUM, "glClearBufferuiv(buffer=%s)",
+                  _mesa_lookup_enum_by_nr(buffer));
+      return;
+   }
+}
+
+
+/**
+ * New in GL 3.0
+ * Clear fixed-pt or float color buffer or depth buffer (not stencil).
+ */
+void GLAPIENTRY
+_mesa_ClearBufferfv(GLenum buffer, GLint drawbuffer, const GLfloat *value)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
+
+   FLUSH_CURRENT(ctx, 0);
+
+   if (ctx->NewState) {
+      _mesa_update_state( ctx );
+   }
+
+   switch (buffer) {
+   case GL_DEPTH:
+      if (drawbuffer != 0) {
+         _mesa_error(ctx, GL_INVALID_VALUE, "glClearBufferfv(drawbuffer=%d)",
+                     drawbuffer);
+         return;
+      }
+      else {
+         /* Save current depth clear value, set to 'value', do the
+          * depth clear and restore the clear value.
+          * XXX in the future we may have a new ctx->Driver.ClearBuffer()
+          * hook instead.
+          */
+         const GLclampd clearSave = ctx->Depth.Clear;
+         ctx->Depth.Clear = *value;
+         if (ctx->Driver.ClearDepth)
+            ctx->Driver.ClearDepth(ctx, *value);
+         ctx->Driver.Clear(ctx, BUFFER_BIT_DEPTH);
+         ctx->Depth.Clear = clearSave;
+         if (ctx->Driver.ClearDepth)
+            ctx->Driver.ClearDepth(ctx, clearSave);
+      }
+      /* clear depth buffer to value */
+      break;
+   case GL_COLOR:
+      {
+         const GLbitfield mask = make_color_buffer_mask(ctx, drawbuffer);
+         if (mask == INVALID_MASK) {
+            _mesa_error(ctx, GL_INVALID_VALUE, "glClearBufferfv(drawbuffer=%d)",
+                        drawbuffer);
+            return;
+         }
+         else if (mask) {
+            GLclampf clearSave[4];
+            /* save color */
+            COPY_4V(clearSave, ctx->Color.ClearColor);
+            /* set color */
+            COPY_4V_CAST(ctx->Color.ClearColor, value, GLclampf);
+            if (ctx->Driver.ClearColor)
+               ctx->Driver.ClearColor(ctx, ctx->Color.ClearColor);
+            /* clear buffer(s) */
+            ctx->Driver.Clear(ctx, mask);
+            /* restore color */
+            COPY_4V(ctx->Color.ClearColor, clearSave);
+            if (ctx->Driver.ClearColor)
+               ctx->Driver.ClearColor(ctx, clearSave);
+         }
+      }
+      break;
+   default:
+      _mesa_error(ctx, GL_INVALID_ENUM, "glClearBufferfv(buffer=%s)",
+                  _mesa_lookup_enum_by_nr(buffer));
+      return;
+   }
+}
+
+
+/**
+ * New in GL 3.0
+ * Clear depth/stencil buffer only.
+ */
+void GLAPIENTRY
+_mesa_ClearBufferfi(GLenum buffer, GLint drawbuffer,
+                    GLfloat depth, GLint stencil)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
+
+   FLUSH_CURRENT(ctx, 0);
+
+   if (buffer != GL_DEPTH_STENCIL) {
+      _mesa_error(ctx, GL_INVALID_ENUM, "glClearBufferfi(buffer=%s)",
+                  _mesa_lookup_enum_by_nr(buffer));
+      return;
+   }
+
+   if (drawbuffer != 0) {
+      _mesa_error(ctx, GL_INVALID_VALUE, "glClearBufferfi(drawbuffer=%d)",
+                  drawbuffer);
+      return;
+   }
+
+   if (ctx->NewState) {
+      _mesa_update_state( ctx );
+   }
+
+   {
+      /* save current clear values */
+      const GLclampd clearDepthSave = ctx->Depth.Clear;
+      const GLuint clearStencilSave = ctx->Stencil.Clear;
+
+      /* set new clear values */
+      ctx->Depth.Clear = depth;
+      ctx->Stencil.Clear = stencil;
+      if (ctx->Driver.ClearDepth)
+         ctx->Driver.ClearDepth(ctx, depth);
+      if (ctx->Driver.ClearStencil)
+         ctx->Driver.ClearStencil(ctx, stencil);
+
+      /* clear buffers */
+      ctx->Driver.Clear(ctx, BUFFER_BIT_DEPTH | BUFFER_BIT_STENCIL);
+
+      /* restore */
+      ctx->Depth.Clear = clearDepthSave;
+      ctx->Stencil.Clear = clearStencilSave;
+      if (ctx->Driver.ClearDepth)
+         ctx->Driver.ClearDepth(ctx, clearDepthSave);
+      if (ctx->Driver.ClearStencil)
+         ctx->Driver.ClearStencil(ctx, clearStencilSave);
+   }
+}
diff --git a/mesalib/src/mesa/main/colortab.c b/mesalib/src/mesa/main/colortab.c
index d0c865735..35b3096f6 100644
--- a/mesalib/src/mesa/main/colortab.c
+++ b/mesalib/src/mesa/main/colortab.c
@@ -516,6 +516,7 @@ _mesa_GetColorTable( GLenum target, GLenum format,
    struct gl_texture_unit *texUnit = _mesa_get_current_tex_unit(ctx);
    struct gl_color_table *table = NULL;
    GLfloat rgba[MAX_COLOR_TABLE_SIZE][4];
+   GLbitfield transferOps = 0;
    ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx);
 
    if (ctx->NewState) {
@@ -618,8 +619,12 @@ _mesa_GetColorTable( GLenum target, GLenum format,
    if (!data)
       return;
 
+   /* TODO: is this correct? */
+   if(ctx->Color._ClampReadColor)
+      transferOps |= IMAGE_CLAMP_BIT;
+
    _mesa_pack_rgba_span_float(ctx, table->Size, rgba,
-                              format, type, data, &ctx->Pack, 0x0);
+                              format, type, data, &ctx->Pack, transferOps);
 
    _mesa_unmap_pbo_dest(ctx, &ctx->Pack);
 }
diff --git a/mesalib/src/mesa/main/dlist.c b/mesalib/src/mesa/main/dlist.c
index 3de6832d3..7e86f1d0e 100644
--- a/mesalib/src/mesa/main/dlist.c
+++ b/mesalib/src/mesa/main/dlist.c
@@ -388,6 +388,9 @@ typedef enum
    OPCODE_UNIFORM_3UIV,
    OPCODE_UNIFORM_4UIV,
 
+   /* GL_ARB_color_buffer_float */
+   OPCODE_CLAMP_COLOR,
+
    /* GL_EXT_framebuffer_blit */
    OPCODE_BLIT_FRAMEBUFFER,
 
@@ -6886,6 +6889,22 @@ save_UniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose,
    }
 }
 
+static void GLAPIENTRY
+save_ClampColorARB(GLenum target, GLenum clamp)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   Node *n;
+   ASSERT_OUTSIDE_SAVE_BEGIN_END_AND_FLUSH(ctx);
+   n = alloc_instruction(ctx, OPCODE_CLAMP_COLOR, 2);
+   if (n) {
+      n[1].e = target;
+      n[2].e = clamp;
+   }
+   if (ctx->ExecuteFlag) {
+      CALL_ClampColorARB(ctx->Exec, (target, clamp));
+   }
+}
+
 static void GLAPIENTRY
 save_UseShaderProgramEXT(GLenum type, GLuint program)
 {
@@ -8071,6 +8090,10 @@ execute_list(struct gl_context *ctx, GLuint list)
                                     (n[1].i, n[2].i, n[3].b, n[4].data));
 	    break;
 
+         case OPCODE_CLAMP_COLOR:
+            CALL_ClampColorARB(ctx->Exec, (n[1].e, n[2].e));
+            break;
+
          case OPCODE_TEX_BUMP_PARAMETER_ATI:
             {
                GLfloat values[4];
@@ -9868,6 +9891,10 @@ _mesa_create_save_table(void)
    SET_UseShaderProgramEXT(table, save_UseShaderProgramEXT);
    SET_ActiveProgramEXT(table, save_ActiveProgramEXT);
 
+   /* GL_ARB_color_buffer_float */
+   SET_ClampColorARB(table, save_ClampColorARB);
+   SET_ClampColor(table, save_ClampColorARB);
+
    /* GL 3.0 */
 #if 0
    SET_ClearBufferiv(table, save_ClearBufferiv);
diff --git a/mesalib/src/mesa/main/enums.c b/mesalib/src/mesa/main/enums.c
index ebfb37227..14be3ff44 100644
--- a/mesalib/src/mesa/main/enums.c
+++ b/mesalib/src/mesa/main/enums.c
@@ -1,6294 +1,6307 @@
-/* DO NOT EDIT - This file generated automatically by gl_enums.py (from Mesa) script */
-
-/*
- * Copyright (C) 1999-2005 Brian Paul All Rights Reserved.
- * 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"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sub license,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- * 
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL,
- * AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
- * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-#include "main/glheader.h"
-#include "main/mfeatures.h"
-#include "main/enums.h"
-#include "main/imports.h"
-#include "main/mtypes.h"
-
-typedef struct {
-   size_t offset;
-   int n;
-} enum_elt;
-
-LONGSTRING static const char enum_string_table[] = 
-   "GL_2D\0"
-   "GL_2_BYTES\0"
-   "GL_3D\0"
-   "GL_3D_COLOR\0"
-   "GL_3D_COLOR_TEXTURE\0"
-   "GL_3_BYTES\0"
-   "GL_4D_COLOR_TEXTURE\0"
-   "GL_4_BYTES\0"
-   "GL_ACCUM\0"
-   "GL_ACCUM_ALPHA_BITS\0"
-   "GL_ACCUM_BLUE_BITS\0"
-   "GL_ACCUM_BUFFER_BIT\0"
-   "GL_ACCUM_CLEAR_VALUE\0"
-   "GL_ACCUM_GREEN_BITS\0"
-   "GL_ACCUM_RED_BITS\0"
-   "GL_ACTIVE_ATTRIBUTES\0"
-   "GL_ACTIVE_ATTRIBUTE_MAX_LENGTH\0"
-   "GL_ACTIVE_PROGRAM_EXT\0"
-   "GL_ACTIVE_STENCIL_FACE_EXT\0"
-   "GL_ACTIVE_TEXTURE\0"
-   "GL_ACTIVE_TEXTURE_ARB\0"
-   "GL_ACTIVE_UNIFORMS\0"
-   "GL_ACTIVE_UNIFORM_MAX_LENGTH\0"
-   "GL_ACTIVE_VERTEX_UNITS_ARB\0"
-   "GL_ADD\0"
-   "GL_ADD_SIGNED\0"
-   "GL_ADD_SIGNED_ARB\0"
-   "GL_ADD_SIGNED_EXT\0"
-   "GL_ALIASED_LINE_WIDTH_RANGE\0"
-   "GL_ALIASED_POINT_SIZE_RANGE\0"
-   "GL_ALL_ATTRIB_BITS\0"
-   "GL_ALL_CLIENT_ATTRIB_BITS\0"
-   "GL_ALPHA\0"
-   "GL_ALPHA12\0"
-   "GL_ALPHA12_EXT\0"
-   "GL_ALPHA16\0"
-   "GL_ALPHA16I_EXT\0"
-   "GL_ALPHA16UI_EXT\0"
-   "GL_ALPHA16_EXT\0"
-   "GL_ALPHA32I_EXT\0"
-   "GL_ALPHA32UI_EXT\0"
-   "GL_ALPHA4\0"
-   "GL_ALPHA4_EXT\0"
-   "GL_ALPHA8\0"
-   "GL_ALPHA8I_EXT\0"
-   "GL_ALPHA8UI_EXT\0"
-   "GL_ALPHA8_EXT\0"
-   "GL_ALPHA_BIAS\0"
-   "GL_ALPHA_BITS\0"
-   "GL_ALPHA_INTEGER_EXT\0"
-   "GL_ALPHA_SCALE\0"
-   "GL_ALPHA_TEST\0"
-   "GL_ALPHA_TEST_FUNC\0"
-   "GL_ALPHA_TEST_REF\0"
-   "GL_ALREADY_SIGNALED\0"
-   "GL_ALWAYS\0"
-   "GL_AMBIENT\0"
-   "GL_AMBIENT_AND_DIFFUSE\0"
-   "GL_AND\0"
-   "GL_AND_INVERTED\0"
-   "GL_AND_REVERSE\0"
-   "GL_ARRAY_BUFFER\0"
-   "GL_ARRAY_BUFFER_BINDING\0"
-   "GL_ARRAY_BUFFER_BINDING_ARB\0"
-   "GL_ATTACHED_SHADERS\0"
-   "GL_ATTRIB_ARRAY_POINTER_NV\0"
-   "GL_ATTRIB_ARRAY_SIZE_NV\0"
-   "GL_ATTRIB_ARRAY_STRIDE_NV\0"
-   "GL_ATTRIB_ARRAY_TYPE_NV\0"
-   "GL_ATTRIB_STACK_DEPTH\0"
-   "GL_AUTO_NORMAL\0"
-   "GL_AUX0\0"
-   "GL_AUX1\0"
-   "GL_AUX2\0"
-   "GL_AUX3\0"
-   "GL_AUX_BUFFERS\0"
-   "GL_BACK\0"
-   "GL_BACK_LEFT\0"
-   "GL_BACK_RIGHT\0"
-   "GL_BGR\0"
-   "GL_BGRA\0"
-   "GL_BGRA_EXT\0"
-   "GL_BGRA_INTEGER\0"
-   "GL_BGRA_INTEGER_EXT\0"
-   "GL_BGR_INTEGER\0"
-   "GL_BGR_INTEGER_EXT\0"
-   "GL_BITMAP\0"
-   "GL_BITMAP_TOKEN\0"
-   "GL_BLEND\0"
-   "GL_BLEND_COLOR\0"
-   "GL_BLEND_COLOR_EXT\0"
-   "GL_BLEND_DST\0"
-   "GL_BLEND_DST_ALPHA\0"
-   "GL_BLEND_DST_ALPHA_OES\0"
-   "GL_BLEND_DST_RGB\0"
-   "GL_BLEND_DST_RGB_OES\0"
-   "GL_BLEND_EQUATION\0"
-   "GL_BLEND_EQUATION_ALPHA\0"
-   "GL_BLEND_EQUATION_ALPHA_EXT\0"
-   "GL_BLEND_EQUATION_ALPHA_OES\0"
-   "GL_BLEND_EQUATION_EXT\0"
-   "GL_BLEND_EQUATION_OES\0"
-   "GL_BLEND_EQUATION_RGB\0"
-   "GL_BLEND_EQUATION_RGB_EXT\0"
-   "GL_BLEND_EQUATION_RGB_OES\0"
-   "GL_BLEND_SRC\0"
-   "GL_BLEND_SRC_ALPHA\0"
-   "GL_BLEND_SRC_ALPHA_OES\0"
-   "GL_BLEND_SRC_RGB\0"
-   "GL_BLEND_SRC_RGB_OES\0"
-   "GL_BLUE\0"
-   "GL_BLUE_BIAS\0"
-   "GL_BLUE_BITS\0"
-   "GL_BLUE_INTEGER\0"
-   "GL_BLUE_INTEGER_EXT\0"
-   "GL_BLUE_SCALE\0"
-   "GL_BOOL\0"
-   "GL_BOOL_ARB\0"
-   "GL_BOOL_VEC2\0"
-   "GL_BOOL_VEC2_ARB\0"
-   "GL_BOOL_VEC3\0"
-   "GL_BOOL_VEC3_ARB\0"
-   "GL_BOOL_VEC4\0"
-   "GL_BOOL_VEC4_ARB\0"
-   "GL_BUFFER_ACCESS\0"
-   "GL_BUFFER_ACCESS_ARB\0"
-   "GL_BUFFER_ACCESS_FLAGS\0"
-   "GL_BUFFER_ACCESS_OES\0"
-   "GL_BUFFER_FLUSHING_UNMAP_APPLE\0"
-   "GL_BUFFER_MAPPED\0"
-   "GL_BUFFER_MAPPED_ARB\0"
-   "GL_BUFFER_MAPPED_OES\0"
-   "GL_BUFFER_MAP_LENGTH\0"
-   "GL_BUFFER_MAP_OFFSET\0"
-   "GL_BUFFER_MAP_POINTER\0"
-   "GL_BUFFER_MAP_POINTER_ARB\0"
-   "GL_BUFFER_MAP_POINTER_OES\0"
-   "GL_BUFFER_OBJECT_APPLE\0"
-   "GL_BUFFER_SERIALIZED_MODIFY_APPLE\0"
-   "GL_BUFFER_SIZE\0"
-   "GL_BUFFER_SIZE_ARB\0"
-   "GL_BUFFER_USAGE\0"
-   "GL_BUFFER_USAGE_ARB\0"
-   "GL_BUMP_ENVMAP_ATI\0"
-   "GL_BUMP_NUM_TEX_UNITS_ATI\0"
-   "GL_BUMP_ROT_MATRIX_ATI\0"
-   "GL_BUMP_ROT_MATRIX_SIZE_ATI\0"
-   "GL_BUMP_TARGET_ATI\0"
-   "GL_BUMP_TEX_UNITS_ATI\0"
-   "GL_BYTE\0"
-   "GL_C3F_V3F\0"
-   "GL_C4F_N3F_V3F\0"
-   "GL_C4UB_V2F\0"
-   "GL_C4UB_V3F\0"
-   "GL_CCW\0"
-   "GL_CLAMP\0"
-   "GL_CLAMP_READ_COLOR\0"
-   "GL_CLAMP_TO_BORDER\0"
-   "GL_CLAMP_TO_BORDER_ARB\0"
-   "GL_CLAMP_TO_BORDER_SGIS\0"
-   "GL_CLAMP_TO_EDGE\0"
-   "GL_CLAMP_TO_EDGE_SGIS\0"
-   "GL_CLEAR\0"
-   "GL_CLIENT_ACTIVE_TEXTURE\0"
-   "GL_CLIENT_ACTIVE_TEXTURE_ARB\0"
-   "GL_CLIENT_ALL_ATTRIB_BITS\0"
-   "GL_CLIENT_ATTRIB_STACK_DEPTH\0"
-   "GL_CLIENT_PIXEL_STORE_BIT\0"
-   "GL_CLIENT_VERTEX_ARRAY_BIT\0"
-   "GL_CLIP_DISTANCE0\0"
-   "GL_CLIP_DISTANCE1\0"
-   "GL_CLIP_DISTANCE2\0"
-   "GL_CLIP_DISTANCE3\0"
-   "GL_CLIP_DISTANCE4\0"
-   "GL_CLIP_DISTANCE5\0"
-   "GL_CLIP_DISTANCE6\0"
-   "GL_CLIP_DISTANCE7\0"
-   "GL_CLIP_PLANE0\0"
-   "GL_CLIP_PLANE1\0"
-   "GL_CLIP_PLANE2\0"
-   "GL_CLIP_PLANE3\0"
-   "GL_CLIP_PLANE4\0"
-   "GL_CLIP_PLANE5\0"
-   "GL_CLIP_VOLUME_CLIPPING_HINT_EXT\0"
-   "GL_COEFF\0"
-   "GL_COLOR\0"
-   "GL_COLOR_ARRAY\0"
-   "GL_COLOR_ARRAY_BUFFER_BINDING\0"
-   "GL_COLOR_ARRAY_BUFFER_BINDING_ARB\0"
-   "GL_COLOR_ARRAY_POINTER\0"
-   "GL_COLOR_ARRAY_SIZE\0"
-   "GL_COLOR_ARRAY_STRIDE\0"
-   "GL_COLOR_ARRAY_TYPE\0"
-   "GL_COLOR_ATTACHMENT0\0"
-   "GL_COLOR_ATTACHMENT0_EXT\0"
-   "GL_COLOR_ATTACHMENT0_OES\0"
-   "GL_COLOR_ATTACHMENT1\0"
-   "GL_COLOR_ATTACHMENT10\0"
-   "GL_COLOR_ATTACHMENT10_EXT\0"
-   "GL_COLOR_ATTACHMENT11\0"
-   "GL_COLOR_ATTACHMENT11_EXT\0"
-   "GL_COLOR_ATTACHMENT12\0"
-   "GL_COLOR_ATTACHMENT12_EXT\0"
-   "GL_COLOR_ATTACHMENT13\0"
-   "GL_COLOR_ATTACHMENT13_EXT\0"
-   "GL_COLOR_ATTACHMENT14\0"
-   "GL_COLOR_ATTACHMENT14_EXT\0"
-   "GL_COLOR_ATTACHMENT15\0"
-   "GL_COLOR_ATTACHMENT15_EXT\0"
-   "GL_COLOR_ATTACHMENT1_EXT\0"
-   "GL_COLOR_ATTACHMENT2\0"
-   "GL_COLOR_ATTACHMENT2_EXT\0"
-   "GL_COLOR_ATTACHMENT3\0"
-   "GL_COLOR_ATTACHMENT3_EXT\0"
-   "GL_COLOR_ATTACHMENT4\0"
-   "GL_COLOR_ATTACHMENT4_EXT\0"
-   "GL_COLOR_ATTACHMENT5\0"
-   "GL_COLOR_ATTACHMENT5_EXT\0"
-   "GL_COLOR_ATTACHMENT6\0"
-   "GL_COLOR_ATTACHMENT6_EXT\0"
-   "GL_COLOR_ATTACHMENT7\0"
-   "GL_COLOR_ATTACHMENT7_EXT\0"
-   "GL_COLOR_ATTACHMENT8\0"
-   "GL_COLOR_ATTACHMENT8_EXT\0"
-   "GL_COLOR_ATTACHMENT9\0"
-   "GL_COLOR_ATTACHMENT9_EXT\0"
-   "GL_COLOR_BUFFER_BIT\0"
-   "GL_COLOR_CLEAR_VALUE\0"
-   "GL_COLOR_INDEX\0"
-   "GL_COLOR_INDEXES\0"
-   "GL_COLOR_LOGIC_OP\0"
-   "GL_COLOR_MATERIAL\0"
-   "GL_COLOR_MATERIAL_FACE\0"
-   "GL_COLOR_MATERIAL_PARAMETER\0"
-   "GL_COLOR_MATRIX\0"
-   "GL_COLOR_MATRIX_SGI\0"
-   "GL_COLOR_MATRIX_STACK_DEPTH\0"
-   "GL_COLOR_MATRIX_STACK_DEPTH_SGI\0"
-   "GL_COLOR_SUM\0"
-   "GL_COLOR_SUM_ARB\0"
-   "GL_COLOR_TABLE\0"
-   "GL_COLOR_TABLE_ALPHA_SIZE\0"
-   "GL_COLOR_TABLE_ALPHA_SIZE_EXT\0"
-   "GL_COLOR_TABLE_ALPHA_SIZE_SGI\0"
-   "GL_COLOR_TABLE_BIAS\0"
-   "GL_COLOR_TABLE_BIAS_SGI\0"
-   "GL_COLOR_TABLE_BLUE_SIZE\0"
-   "GL_COLOR_TABLE_BLUE_SIZE_EXT\0"
-   "GL_COLOR_TABLE_BLUE_SIZE_SGI\0"
-   "GL_COLOR_TABLE_FORMAT\0"
-   "GL_COLOR_TABLE_FORMAT_EXT\0"
-   "GL_COLOR_TABLE_FORMAT_SGI\0"
-   "GL_COLOR_TABLE_GREEN_SIZE\0"
-   "GL_COLOR_TABLE_GREEN_SIZE_EXT\0"
-   "GL_COLOR_TABLE_GREEN_SIZE_SGI\0"
-   "GL_COLOR_TABLE_INTENSITY_SIZE\0"
-   "GL_COLOR_TABLE_INTENSITY_SIZE_EXT\0"
-   "GL_COLOR_TABLE_INTENSITY_SIZE_SGI\0"
-   "GL_COLOR_TABLE_LUMINANCE_SIZE\0"
-   "GL_COLOR_TABLE_LUMINANCE_SIZE_EXT\0"
-   "GL_COLOR_TABLE_LUMINANCE_SIZE_SGI\0"
-   "GL_COLOR_TABLE_RED_SIZE\0"
-   "GL_COLOR_TABLE_RED_SIZE_EXT\0"
-   "GL_COLOR_TABLE_RED_SIZE_SGI\0"
-   "GL_COLOR_TABLE_SCALE\0"
-   "GL_COLOR_TABLE_SCALE_SGI\0"
-   "GL_COLOR_TABLE_WIDTH\0"
-   "GL_COLOR_TABLE_WIDTH_EXT\0"
-   "GL_COLOR_TABLE_WIDTH_SGI\0"
-   "GL_COLOR_WRITEMASK\0"
-   "GL_COMBINE\0"
-   "GL_COMBINE4\0"
-   "GL_COMBINE_ALPHA\0"
-   "GL_COMBINE_ALPHA_ARB\0"
-   "GL_COMBINE_ALPHA_EXT\0"
-   "GL_COMBINE_ARB\0"
-   "GL_COMBINE_EXT\0"
-   "GL_COMBINE_RGB\0"
-   "GL_COMBINE_RGB_ARB\0"
-   "GL_COMBINE_RGB_EXT\0"
-   "GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT\0"
-   "GL_COMPARE_REF_TO_TEXTURE\0"
-   "GL_COMPARE_R_TO_TEXTURE\0"
-   "GL_COMPARE_R_TO_TEXTURE_ARB\0"
-   "GL_COMPILE\0"
-   "GL_COMPILE_AND_EXECUTE\0"
-   "GL_COMPILE_STATUS\0"
-   "GL_COMPRESSED_ALPHA\0"
-   "GL_COMPRESSED_ALPHA_ARB\0"
-   "GL_COMPRESSED_INTENSITY\0"
-   "GL_COMPRESSED_INTENSITY_ARB\0"
-   "GL_COMPRESSED_LUMINANCE\0"
-   "GL_COMPRESSED_LUMINANCE_ALPHA\0"
-   "GL_COMPRESSED_LUMINANCE_ALPHA_ARB\0"
-   "GL_COMPRESSED_LUMINANCE_ARB\0"
-   "GL_COMPRESSED_RED\0"
-   "GL_COMPRESSED_RG\0"
-   "GL_COMPRESSED_RGB\0"
-   "GL_COMPRESSED_RGBA\0"
-   "GL_COMPRESSED_RGBA_ARB\0"
-   "GL_COMPRESSED_RGBA_FXT1_3DFX\0"
-   "GL_COMPRESSED_RGBA_S3TC_DXT1_EXT\0"
-   "GL_COMPRESSED_RGBA_S3TC_DXT3_EXT\0"
-   "GL_COMPRESSED_RGBA_S3TC_DXT5_EXT\0"
-   "GL_COMPRESSED_RGB_ARB\0"
-   "GL_COMPRESSED_RGB_FXT1_3DFX\0"
-   "GL_COMPRESSED_RGB_S3TC_DXT1_EXT\0"
-   "GL_COMPRESSED_SLUMINANCE\0"
-   "GL_COMPRESSED_SLUMINANCE_ALPHA\0"
-   "GL_COMPRESSED_SRGB\0"
-   "GL_COMPRESSED_SRGB_ALPHA\0"
-   "GL_COMPRESSED_TEXTURE_FORMATS\0"
-   "GL_CONDITION_SATISFIED\0"
-   "GL_CONSTANT\0"
-   "GL_CONSTANT_ALPHA\0"
-   "GL_CONSTANT_ALPHA_EXT\0"
-   "GL_CONSTANT_ARB\0"
-   "GL_CONSTANT_ATTENUATION\0"
-   "GL_CONSTANT_BORDER_HP\0"
-   "GL_CONSTANT_COLOR\0"
-   "GL_CONSTANT_COLOR_EXT\0"
-   "GL_CONSTANT_EXT\0"
-   "GL_CONTEXT_COMPATIBILITY_PROFILE_BIT\0"
-   "GL_CONTEXT_CORE_PROFILE_BIT\0"
-   "GL_CONTEXT_FLAGS\0"
-   "GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT\0"
-   "GL_CONTEXT_PROFILE_MASK\0"
-   "GL_CONVOLUTION_1D\0"
-   "GL_CONVOLUTION_2D\0"
-   "GL_CONVOLUTION_BORDER_COLOR\0"
-   "GL_CONVOLUTION_BORDER_COLOR_HP\0"
-   "GL_CONVOLUTION_BORDER_MODE\0"
-   "GL_CONVOLUTION_BORDER_MODE_EXT\0"
-   "GL_CONVOLUTION_FILTER_BIAS\0"
-   "GL_CONVOLUTION_FILTER_BIAS_EXT\0"
-   "GL_CONVOLUTION_FILTER_SCALE\0"
-   "GL_CONVOLUTION_FILTER_SCALE_EXT\0"
-   "GL_CONVOLUTION_FORMAT\0"
-   "GL_CONVOLUTION_FORMAT_EXT\0"
-   "GL_CONVOLUTION_HEIGHT\0"
-   "GL_CONVOLUTION_HEIGHT_EXT\0"
-   "GL_CONVOLUTION_WIDTH\0"
-   "GL_CONVOLUTION_WIDTH_EXT\0"
-   "GL_COORD_REPLACE\0"
-   "GL_COORD_REPLACE_ARB\0"
-   "GL_COORD_REPLACE_NV\0"
-   "GL_COORD_REPLACE_OES\0"
-   "GL_COPY\0"
-   "GL_COPY_INVERTED\0"
-   "GL_COPY_PIXEL_TOKEN\0"
-   "GL_COPY_READ_BUFFER\0"
-   "GL_COPY_WRITE_BUFFER\0"
-   "GL_CULL_FACE\0"
-   "GL_CULL_FACE_MODE\0"
-   "GL_CULL_VERTEX_EXT\0"
-   "GL_CULL_VERTEX_EYE_POSITION_EXT\0"
-   "GL_CULL_VERTEX_OBJECT_POSITION_EXT\0"
-   "GL_CURRENT_ATTRIB_NV\0"
-   "GL_CURRENT_BIT\0"
-   "GL_CURRENT_COLOR\0"
-   "GL_CURRENT_FOG_COORD\0"
-   "GL_CURRENT_FOG_COORDINATE\0"
-   "GL_CURRENT_INDEX\0"
-   "GL_CURRENT_MATRIX_ARB\0"
-   "GL_CURRENT_MATRIX_INDEX_ARB\0"
-   "GL_CURRENT_MATRIX_NV\0"
-   "GL_CURRENT_MATRIX_STACK_DEPTH_ARB\0"
-   "GL_CURRENT_MATRIX_STACK_DEPTH_NV\0"
-   "GL_CURRENT_NORMAL\0"
-   "GL_CURRENT_PALETTE_MATRIX_ARB\0"
-   "GL_CURRENT_PALETTE_MATRIX_OES\0"
-   "GL_CURRENT_PROGRAM\0"
-   "GL_CURRENT_QUERY\0"
-   "GL_CURRENT_QUERY_ARB\0"
-   "GL_CURRENT_RASTER_COLOR\0"
-   "GL_CURRENT_RASTER_DISTANCE\0"
-   "GL_CURRENT_RASTER_INDEX\0"
-   "GL_CURRENT_RASTER_POSITION\0"
-   "GL_CURRENT_RASTER_POSITION_VALID\0"
-   "GL_CURRENT_RASTER_SECONDARY_COLOR\0"
-   "GL_CURRENT_RASTER_TEXTURE_COORDS\0"
-   "GL_CURRENT_SECONDARY_COLOR\0"
-   "GL_CURRENT_TEXTURE_COORDS\0"
-   "GL_CURRENT_VERTEX_ATTRIB\0"
-   "GL_CURRENT_VERTEX_ATTRIB_ARB\0"
-   "GL_CURRENT_WEIGHT_ARB\0"
-   "GL_CW\0"
-   "GL_DEBUG_ASSERT_MESA\0"
-   "GL_DEBUG_OBJECT_MESA\0"
-   "GL_DEBUG_PRINT_MESA\0"
-   "GL_DECAL\0"
-   "GL_DECR\0"
-   "GL_DECR_WRAP\0"
-   "GL_DECR_WRAP_EXT\0"
-   "GL_DELETE_STATUS\0"
-   "GL_DEPTH\0"
-   "GL_DEPTH24_STENCIL8\0"
-   "GL_DEPTH24_STENCIL8_EXT\0"
-   "GL_DEPTH24_STENCIL8_OES\0"
-   "GL_DEPTH_ATTACHMENT\0"
-   "GL_DEPTH_ATTACHMENT_EXT\0"
-   "GL_DEPTH_ATTACHMENT_OES\0"
-   "GL_DEPTH_BIAS\0"
-   "GL_DEPTH_BITS\0"
-   "GL_DEPTH_BOUNDS_EXT\0"
-   "GL_DEPTH_BOUNDS_TEST_EXT\0"
-   "GL_DEPTH_BUFFER\0"
-   "GL_DEPTH_BUFFER_BIT\0"
-   "GL_DEPTH_CLAMP\0"
-   "GL_DEPTH_CLAMP_NV\0"
-   "GL_DEPTH_CLEAR_VALUE\0"
-   "GL_DEPTH_COMPONENT\0"
-   "GL_DEPTH_COMPONENT16\0"
-   "GL_DEPTH_COMPONENT16_ARB\0"
-   "GL_DEPTH_COMPONENT16_OES\0"
-   "GL_DEPTH_COMPONENT16_SGIX\0"
-   "GL_DEPTH_COMPONENT24\0"
-   "GL_DEPTH_COMPONENT24_ARB\0"
-   "GL_DEPTH_COMPONENT24_OES\0"
-   "GL_DEPTH_COMPONENT24_SGIX\0"
-   "GL_DEPTH_COMPONENT32\0"
-   "GL_DEPTH_COMPONENT32_ARB\0"
-   "GL_DEPTH_COMPONENT32_OES\0"
-   "GL_DEPTH_COMPONENT32_SGIX\0"
-   "GL_DEPTH_FUNC\0"
-   "GL_DEPTH_RANGE\0"
-   "GL_DEPTH_SCALE\0"
-   "GL_DEPTH_STENCIL\0"
-   "GL_DEPTH_STENCIL_ATTACHMENT\0"
-   "GL_DEPTH_STENCIL_EXT\0"
-   "GL_DEPTH_STENCIL_NV\0"
-   "GL_DEPTH_STENCIL_OES\0"
-   "GL_DEPTH_STENCIL_TO_BGRA_NV\0"
-   "GL_DEPTH_STENCIL_TO_RGBA_NV\0"
-   "GL_DEPTH_TEST\0"
-   "GL_DEPTH_TEXTURE_MODE\0"
-   "GL_DEPTH_TEXTURE_MODE_ARB\0"
-   "GL_DEPTH_WRITEMASK\0"
-   "GL_DIFFUSE\0"
-   "GL_DITHER\0"
-   "GL_DOMAIN\0"
-   "GL_DONT_CARE\0"
-   "GL_DOT3_RGB\0"
-   "GL_DOT3_RGBA\0"
-   "GL_DOT3_RGBA_ARB\0"
-   "GL_DOT3_RGBA_EXT\0"
-   "GL_DOT3_RGB_ARB\0"
-   "GL_DOT3_RGB_EXT\0"
-   "GL_DOUBLE\0"
-   "GL_DOUBLEBUFFER\0"
-   "GL_DRAW_BUFFER\0"
-   "GL_DRAW_BUFFER0\0"
-   "GL_DRAW_BUFFER0_ARB\0"
-   "GL_DRAW_BUFFER0_ATI\0"
-   "GL_DRAW_BUFFER1\0"
-   "GL_DRAW_BUFFER10\0"
-   "GL_DRAW_BUFFER10_ARB\0"
-   "GL_DRAW_BUFFER10_ATI\0"
-   "GL_DRAW_BUFFER11\0"
-   "GL_DRAW_BUFFER11_ARB\0"
-   "GL_DRAW_BUFFER11_ATI\0"
-   "GL_DRAW_BUFFER12\0"
-   "GL_DRAW_BUFFER12_ARB\0"
-   "GL_DRAW_BUFFER12_ATI\0"
-   "GL_DRAW_BUFFER13\0"
-   "GL_DRAW_BUFFER13_ARB\0"
-   "GL_DRAW_BUFFER13_ATI\0"
-   "GL_DRAW_BUFFER14\0"
-   "GL_DRAW_BUFFER14_ARB\0"
-   "GL_DRAW_BUFFER14_ATI\0"
-   "GL_DRAW_BUFFER15\0"
-   "GL_DRAW_BUFFER15_ARB\0"
-   "GL_DRAW_BUFFER15_ATI\0"
-   "GL_DRAW_BUFFER1_ARB\0"
-   "GL_DRAW_BUFFER1_ATI\0"
-   "GL_DRAW_BUFFER2\0"
-   "GL_DRAW_BUFFER2_ARB\0"
-   "GL_DRAW_BUFFER2_ATI\0"
-   "GL_DRAW_BUFFER3\0"
-   "GL_DRAW_BUFFER3_ARB\0"
-   "GL_DRAW_BUFFER3_ATI\0"
-   "GL_DRAW_BUFFER4\0"
-   "GL_DRAW_BUFFER4_ARB\0"
-   "GL_DRAW_BUFFER4_ATI\0"
-   "GL_DRAW_BUFFER5\0"
-   "GL_DRAW_BUFFER5_ARB\0"
-   "GL_DRAW_BUFFER5_ATI\0"
-   "GL_DRAW_BUFFER6\0"
-   "GL_DRAW_BUFFER6_ARB\0"
-   "GL_DRAW_BUFFER6_ATI\0"
-   "GL_DRAW_BUFFER7\0"
-   "GL_DRAW_BUFFER7_ARB\0"
-   "GL_DRAW_BUFFER7_ATI\0"
-   "GL_DRAW_BUFFER8\0"
-   "GL_DRAW_BUFFER8_ARB\0"
-   "GL_DRAW_BUFFER8_ATI\0"
-   "GL_DRAW_BUFFER9\0"
-   "GL_DRAW_BUFFER9_ARB\0"
-   "GL_DRAW_BUFFER9_ATI\0"
-   "GL_DRAW_FRAMEBUFFER\0"
-   "GL_DRAW_FRAMEBUFFER_BINDING\0"
-   "GL_DRAW_FRAMEBUFFER_BINDING_EXT\0"
-   "GL_DRAW_FRAMEBUFFER_EXT\0"
-   "GL_DRAW_PIXEL_TOKEN\0"
-   "GL_DST_ALPHA\0"
-   "GL_DST_COLOR\0"
-   "GL_DU8DV8_ATI\0"
-   "GL_DUDV_ATI\0"
-   "GL_DYNAMIC_COPY\0"
-   "GL_DYNAMIC_COPY_ARB\0"
-   "GL_DYNAMIC_DRAW\0"
-   "GL_DYNAMIC_DRAW_ARB\0"
-   "GL_DYNAMIC_READ\0"
-   "GL_DYNAMIC_READ_ARB\0"
-   "GL_EDGE_FLAG\0"
-   "GL_EDGE_FLAG_ARRAY\0"
-   "GL_EDGE_FLAG_ARRAY_BUFFER_BINDING\0"
-   "GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB\0"
-   "GL_EDGE_FLAG_ARRAY_POINTER\0"
-   "GL_EDGE_FLAG_ARRAY_STRIDE\0"
-   "GL_ELEMENT_ARRAY_BUFFER\0"
-   "GL_ELEMENT_ARRAY_BUFFER_BINDING\0"
-   "GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB\0"
-   "GL_EMISSION\0"
-   "GL_ENABLE_BIT\0"
-   "GL_EQUAL\0"
-   "GL_EQUIV\0"
-   "GL_EVAL_BIT\0"
-   "GL_EXP\0"
-   "GL_EXP2\0"
-   "GL_EXTENSIONS\0"
-   "GL_EYE_LINEAR\0"
-   "GL_EYE_PLANE\0"
-   "GL_EYE_PLANE_ABSOLUTE_NV\0"
-   "GL_EYE_RADIAL_NV\0"
-   "GL_FALSE\0"
-   "GL_FASTEST\0"
-   "GL_FEEDBACK\0"
-   "GL_FEEDBACK_BUFFER_POINTER\0"
-   "GL_FEEDBACK_BUFFER_SIZE\0"
-   "GL_FEEDBACK_BUFFER_TYPE\0"
-   "GL_FILL\0"
-   "GL_FIRST_VERTEX_CONVENTION\0"
-   "GL_FIRST_VERTEX_CONVENTION_EXT\0"
-   "GL_FIXED\0"
-   "GL_FIXED_OES\0"
-   "GL_FIXED_ONLY\0"
-   "GL_FLAT\0"
-   "GL_FLOAT\0"
-   "GL_FLOAT_MAT2\0"
-   "GL_FLOAT_MAT2_ARB\0"
-   "GL_FLOAT_MAT2x3\0"
-   "GL_FLOAT_MAT2x4\0"
-   "GL_FLOAT_MAT3\0"
-   "GL_FLOAT_MAT3_ARB\0"
-   "GL_FLOAT_MAT3x2\0"
-   "GL_FLOAT_MAT3x4\0"
-   "GL_FLOAT_MAT4\0"
-   "GL_FLOAT_MAT4_ARB\0"
-   "GL_FLOAT_MAT4x2\0"
-   "GL_FLOAT_MAT4x3\0"
-   "GL_FLOAT_VEC2\0"
-   "GL_FLOAT_VEC2_ARB\0"
-   "GL_FLOAT_VEC3\0"
-   "GL_FLOAT_VEC3_ARB\0"
-   "GL_FLOAT_VEC4\0"
-   "GL_FLOAT_VEC4_ARB\0"
-   "GL_FOG\0"
-   "GL_FOG_BIT\0"
-   "GL_FOG_COLOR\0"
-   "GL_FOG_COORD\0"
-   "GL_FOG_COORDINATE\0"
-   "GL_FOG_COORDINATE_ARRAY\0"
-   "GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING\0"
-   "GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB\0"
-   "GL_FOG_COORDINATE_ARRAY_POINTER\0"
-   "GL_FOG_COORDINATE_ARRAY_STRIDE\0"
-   "GL_FOG_COORDINATE_ARRAY_TYPE\0"
-   "GL_FOG_COORDINATE_SOURCE\0"
-   "GL_FOG_COORD_ARRAY\0"
-   "GL_FOG_COORD_ARRAY_BUFFER_BINDING\0"
-   "GL_FOG_COORD_ARRAY_POINTER\0"
-   "GL_FOG_COORD_ARRAY_STRIDE\0"
-   "GL_FOG_COORD_ARRAY_TYPE\0"
-   "GL_FOG_COORD_SRC\0"
-   "GL_FOG_DENSITY\0"
-   "GL_FOG_DISTANCE_MODE_NV\0"
-   "GL_FOG_END\0"
-   "GL_FOG_HINT\0"
-   "GL_FOG_INDEX\0"
-   "GL_FOG_MODE\0"
-   "GL_FOG_OFFSET_SGIX\0"
-   "GL_FOG_OFFSET_VALUE_SGIX\0"
-   "GL_FOG_START\0"
-   "GL_FRAGMENT_DEPTH\0"
-   "GL_FRAGMENT_PROGRAM_ARB\0"
-   "GL_FRAGMENT_SHADER\0"
-   "GL_FRAGMENT_SHADER_ARB\0"
-   "GL_FRAGMENT_SHADER_DERIVATIVE_HINT\0"
-   "GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES\0"
-   "GL_FRAMEBUFFER\0"
-   "GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE\0"
-   "GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE\0"
-   "GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING\0"
-   "GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE\0"
-   "GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE\0"
-   "GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE\0"
-   "GL_FRAMEBUFFER_ATTACHMENT_LAYERED\0"
-   "GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB\0"
-   "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME\0"
-   "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT\0"
-   "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES\0"
-   "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE\0"
-   "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT\0"
-   "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES\0"
-   "GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE\0"
-   "GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE\0"
-   "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT\0"
-   "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES\0"
-   "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE\0"
-   "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT\0"
-   "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_OES\0"
-   "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER\0"
-   "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT\0"
-   "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL\0"
-   "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT\0"
-   "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_OES\0"
-   "GL_FRAMEBUFFER_BINDING\0"
-   "GL_FRAMEBUFFER_BINDING_EXT\0"
-   "GL_FRAMEBUFFER_BINDING_OES\0"
-   "GL_FRAMEBUFFER_COMPLETE\0"
-   "GL_FRAMEBUFFER_COMPLETE_EXT\0"
-   "GL_FRAMEBUFFER_COMPLETE_OES\0"
-   "GL_FRAMEBUFFER_DEFAULT\0"
-   "GL_FRAMEBUFFER_EXT\0"
-   "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT\0"
-   "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT\0"
-   "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES\0"
-   "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS\0"
-   "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT\0"
-   "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES\0"
-   "GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER\0"
-   "GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT\0"
-   "GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_OES\0"
-   "GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT\0"
-   "GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT\0"
-   "GL_FRAMEBUFFER_INCOMPLETE_FORMATS_OES\0"
-   "GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB\0"
-   "GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS\0"
-   "GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB\0"
-   "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT\0"
-   "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT\0"
-   "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES\0"
-   "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE\0"
-   "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT\0"
-   "GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER\0"
-   "GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT\0"
-   "GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_OES\0"
-   "GL_FRAMEBUFFER_OES\0"
-   "GL_FRAMEBUFFER_STATUS_ERROR_EXT\0"
-   "GL_FRAMEBUFFER_UNDEFINED\0"
-   "GL_FRAMEBUFFER_UNSUPPORTED\0"
-   "GL_FRAMEBUFFER_UNSUPPORTED_EXT\0"
-   "GL_FRAMEBUFFER_UNSUPPORTED_OES\0"
-   "GL_FRONT\0"
-   "GL_FRONT_AND_BACK\0"
-   "GL_FRONT_FACE\0"
-   "GL_FRONT_LEFT\0"
-   "GL_FRONT_RIGHT\0"
-   "GL_FUNC_ADD\0"
-   "GL_FUNC_ADD_EXT\0"
-   "GL_FUNC_ADD_OES\0"
-   "GL_FUNC_REVERSE_SUBTRACT\0"
-   "GL_FUNC_REVERSE_SUBTRACT_EXT\0"
-   "GL_FUNC_REVERSE_SUBTRACT_OES\0"
-   "GL_FUNC_SUBTRACT\0"
-   "GL_FUNC_SUBTRACT_EXT\0"
-   "GL_FUNC_SUBTRACT_OES\0"
-   "GL_GENERATE_MIPMAP\0"
-   "GL_GENERATE_MIPMAP_HINT\0"
-   "GL_GENERATE_MIPMAP_HINT_SGIS\0"
-   "GL_GENERATE_MIPMAP_SGIS\0"
-   "GL_GEOMETRY_INPUT_TYPE\0"
-   "GL_GEOMETRY_INPUT_TYPE_ARB\0"
-   "GL_GEOMETRY_OUTPUT_TYPE\0"
-   "GL_GEOMETRY_OUTPUT_TYPE_ARB\0"
-   "GL_GEOMETRY_SHADER\0"
-   "GL_GEOMETRY_SHADER_ARB\0"
-   "GL_GEOMETRY_VERTICES_OUT\0"
-   "GL_GEOMETRY_VERTICES_OUT_ARB\0"
-   "GL_GEQUAL\0"
-   "GL_GREATER\0"
-   "GL_GREEN\0"
-   "GL_GREEN_BIAS\0"
-   "GL_GREEN_BITS\0"
-   "GL_GREEN_INTEGER\0"
-   "GL_GREEN_INTEGER_EXT\0"
-   "GL_GREEN_SCALE\0"
-   "GL_HALF_FLOAT\0"
-   "GL_HALF_FLOAT_OES\0"
-   "GL_HIGH_FLOAT\0"
-   "GL_HIGH_INT\0"
-   "GL_HINT_BIT\0"
-   "GL_HISTOGRAM\0"
-   "GL_HISTOGRAM_ALPHA_SIZE\0"
-   "GL_HISTOGRAM_ALPHA_SIZE_EXT\0"
-   "GL_HISTOGRAM_BLUE_SIZE\0"
-   "GL_HISTOGRAM_BLUE_SIZE_EXT\0"
-   "GL_HISTOGRAM_EXT\0"
-   "GL_HISTOGRAM_FORMAT\0"
-   "GL_HISTOGRAM_FORMAT_EXT\0"
-   "GL_HISTOGRAM_GREEN_SIZE\0"
-   "GL_HISTOGRAM_GREEN_SIZE_EXT\0"
-   "GL_HISTOGRAM_LUMINANCE_SIZE\0"
-   "GL_HISTOGRAM_LUMINANCE_SIZE_EXT\0"
-   "GL_HISTOGRAM_RED_SIZE\0"
-   "GL_HISTOGRAM_RED_SIZE_EXT\0"
-   "GL_HISTOGRAM_SINK\0"
-   "GL_HISTOGRAM_SINK_EXT\0"
-   "GL_HISTOGRAM_WIDTH\0"
-   "GL_HISTOGRAM_WIDTH_EXT\0"
-   "GL_IDENTITY_NV\0"
-   "GL_IGNORE_BORDER_HP\0"
-   "GL_IMPLEMENTATION_COLOR_READ_FORMAT\0"
-   "GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES\0"
-   "GL_IMPLEMENTATION_COLOR_READ_TYPE\0"
-   "GL_IMPLEMENTATION_COLOR_READ_TYPE_OES\0"
-   "GL_INCR\0"
-   "GL_INCR_WRAP\0"
-   "GL_INCR_WRAP_EXT\0"
-   "GL_INDEX\0"
-   "GL_INDEX_ARRAY\0"
-   "GL_INDEX_ARRAY_BUFFER_BINDING\0"
-   "GL_INDEX_ARRAY_BUFFER_BINDING_ARB\0"
-   "GL_INDEX_ARRAY_POINTER\0"
-   "GL_INDEX_ARRAY_STRIDE\0"
-   "GL_INDEX_ARRAY_TYPE\0"
-   "GL_INDEX_BITS\0"
-   "GL_INDEX_CLEAR_VALUE\0"
-   "GL_INDEX_LOGIC_OP\0"
-   "GL_INDEX_MODE\0"
-   "GL_INDEX_OFFSET\0"
-   "GL_INDEX_SHIFT\0"
-   "GL_INDEX_WRITEMASK\0"
-   "GL_INFO_LOG_LENGTH\0"
-   "GL_INT\0"
-   "GL_INTENSITY\0"
-   "GL_INTENSITY12\0"
-   "GL_INTENSITY12_EXT\0"
-   "GL_INTENSITY16\0"
-   "GL_INTENSITY16I_EXT\0"
-   "GL_INTENSITY16UI_EXT\0"
-   "GL_INTENSITY16_EXT\0"
-   "GL_INTENSITY32I_EXT\0"
-   "GL_INTENSITY32UI_EXT\0"
-   "GL_INTENSITY4\0"
-   "GL_INTENSITY4_EXT\0"
-   "GL_INTENSITY8\0"
-   "GL_INTENSITY8I_EXT\0"
-   "GL_INTENSITY8UI_EXT\0"
-   "GL_INTENSITY8_EXT\0"
-   "GL_INTENSITY_EXT\0"
-   "GL_INTERLEAVED_ATTRIBS\0"
-   "GL_INTERLEAVED_ATTRIBS_EXT\0"
-   "GL_INTERPOLATE\0"
-   "GL_INTERPOLATE_ARB\0"
-   "GL_INTERPOLATE_EXT\0"
-   "GL_INT_10_10_10_2_OES\0"
-   "GL_INT_SAMPLER_1D\0"
-   "GL_INT_SAMPLER_1D_ARRAY\0"
-   "GL_INT_SAMPLER_1D_ARRAY_EXT\0"
-   "GL_INT_SAMPLER_1D_EXT\0"
-   "GL_INT_SAMPLER_2D\0"
-   "GL_INT_SAMPLER_2D_ARRAY\0"
-   "GL_INT_SAMPLER_2D_ARRAY_EXT\0"
-   "GL_INT_SAMPLER_2D_EXT\0"
-   "GL_INT_SAMPLER_2D_RECT\0"
-   "GL_INT_SAMPLER_2D_RECT_EXT\0"
-   "GL_INT_SAMPLER_3D\0"
-   "GL_INT_SAMPLER_3D_EXT\0"
-   "GL_INT_SAMPLER_BUFFER\0"
-   "GL_INT_SAMPLER_BUFFER_EXT\0"
-   "GL_INT_SAMPLER_CUBE\0"
-   "GL_INT_SAMPLER_CUBE_EXT\0"
-   "GL_INT_VEC2\0"
-   "GL_INT_VEC2_ARB\0"
-   "GL_INT_VEC3\0"
-   "GL_INT_VEC3_ARB\0"
-   "GL_INT_VEC4\0"
-   "GL_INT_VEC4_ARB\0"
-   "GL_INVALID_ENUM\0"
-   "GL_INVALID_FRAMEBUFFER_OPERATION\0"
-   "GL_INVALID_FRAMEBUFFER_OPERATION_EXT\0"
-   "GL_INVALID_FRAMEBUFFER_OPERATION_OES\0"
-   "GL_INVALID_OPERATION\0"
-   "GL_INVALID_VALUE\0"
-   "GL_INVERSE_NV\0"
-   "GL_INVERSE_TRANSPOSE_NV\0"
-   "GL_INVERT\0"
-   "GL_KEEP\0"
-   "GL_LAST_VERTEX_CONVENTION\0"
-   "GL_LAST_VERTEX_CONVENTION_EXT\0"
-   "GL_LEFT\0"
-   "GL_LEQUAL\0"
-   "GL_LESS\0"
-   "GL_LIGHT0\0"
-   "GL_LIGHT1\0"
-   "GL_LIGHT2\0"
-   "GL_LIGHT3\0"
-   "GL_LIGHT4\0"
-   "GL_LIGHT5\0"
-   "GL_LIGHT6\0"
-   "GL_LIGHT7\0"
-   "GL_LIGHTING\0"
-   "GL_LIGHTING_BIT\0"
-   "GL_LIGHT_MODEL_AMBIENT\0"
-   "GL_LIGHT_MODEL_COLOR_CONTROL\0"
-   "GL_LIGHT_MODEL_COLOR_CONTROL_EXT\0"
-   "GL_LIGHT_MODEL_LOCAL_VIEWER\0"
-   "GL_LIGHT_MODEL_TWO_SIDE\0"
-   "GL_LINE\0"
-   "GL_LINEAR\0"
-   "GL_LINEAR_ATTENUATION\0"
-   "GL_LINEAR_CLIPMAP_LINEAR_SGIX\0"
-   "GL_LINEAR_CLIPMAP_NEAREST_SGIX\0"
-   "GL_LINEAR_MIPMAP_LINEAR\0"
-   "GL_LINEAR_MIPMAP_NEAREST\0"
-   "GL_LINES\0"
-   "GL_LINES_ADJACENCY\0"
-   "GL_LINES_ADJACENCY_ARB\0"
-   "GL_LINE_BIT\0"
-   "GL_LINE_LOOP\0"
-   "GL_LINE_RESET_TOKEN\0"
-   "GL_LINE_SMOOTH\0"
-   "GL_LINE_SMOOTH_HINT\0"
-   "GL_LINE_STIPPLE\0"
-   "GL_LINE_STIPPLE_PATTERN\0"
-   "GL_LINE_STIPPLE_REPEAT\0"
-   "GL_LINE_STRIP\0"
-   "GL_LINE_STRIP_ADJACENCY\0"
-   "GL_LINE_STRIP_ADJACENCY_ARB\0"
-   "GL_LINE_TOKEN\0"
-   "GL_LINE_WIDTH\0"
-   "GL_LINE_WIDTH_GRANULARITY\0"
-   "GL_LINE_WIDTH_RANGE\0"
-   "GL_LINK_STATUS\0"
-   "GL_LIST_BASE\0"
-   "GL_LIST_BIT\0"
-   "GL_LIST_INDEX\0"
-   "GL_LIST_MODE\0"
-   "GL_LOAD\0"
-   "GL_LOGIC_OP\0"
-   "GL_LOGIC_OP_MODE\0"
-   "GL_LOWER_LEFT\0"
-   "GL_LOW_FLOAT\0"
-   "GL_LOW_INT\0"
-   "GL_LUMINANCE\0"
-   "GL_LUMINANCE12\0"
-   "GL_LUMINANCE12_ALPHA12\0"
-   "GL_LUMINANCE12_ALPHA12_EXT\0"
-   "GL_LUMINANCE12_ALPHA4\0"
-   "GL_LUMINANCE12_ALPHA4_EXT\0"
-   "GL_LUMINANCE12_EXT\0"
-   "GL_LUMINANCE16\0"
-   "GL_LUMINANCE16I_EXT\0"
-   "GL_LUMINANCE16UI_EXT\0"
-   "GL_LUMINANCE16_ALPHA16\0"
-   "GL_LUMINANCE16_ALPHA16_EXT\0"
-   "GL_LUMINANCE16_EXT\0"
-   "GL_LUMINANCE32I_EXT\0"
-   "GL_LUMINANCE32UI_EXT\0"
-   "GL_LUMINANCE4\0"
-   "GL_LUMINANCE4_ALPHA4\0"
-   "GL_LUMINANCE4_ALPHA4_EXT\0"
-   "GL_LUMINANCE4_EXT\0"
-   "GL_LUMINANCE6_ALPHA2\0"
-   "GL_LUMINANCE6_ALPHA2_EXT\0"
-   "GL_LUMINANCE8\0"
-   "GL_LUMINANCE8I_EXT\0"
-   "GL_LUMINANCE8UI_EXT\0"
-   "GL_LUMINANCE8_ALPHA8\0"
-   "GL_LUMINANCE8_ALPHA8_EXT\0"
-   "GL_LUMINANCE8_EXT\0"
-   "GL_LUMINANCE_ALPHA\0"
-   "GL_LUMINANCE_ALPHA16I_EXT\0"
-   "GL_LUMINANCE_ALPHA16UI_EXT\0"
-   "GL_LUMINANCE_ALPHA32I_EXT\0"
-   "GL_LUMINANCE_ALPHA32UI_EXT\0"
-   "GL_LUMINANCE_ALPHA8I_EXT\0"
-   "GL_LUMINANCE_ALPHA8UI_EXT\0"
-   "GL_LUMINANCE_ALPHA_INTEGER_EXT\0"
-   "GL_LUMINANCE_INTEGER_EXT\0"
-   "GL_MAJOR_VERSION\0"
-   "GL_MAP1_COLOR_4\0"
-   "GL_MAP1_GRID_DOMAIN\0"
-   "GL_MAP1_GRID_SEGMENTS\0"
-   "GL_MAP1_INDEX\0"
-   "GL_MAP1_NORMAL\0"
-   "GL_MAP1_TEXTURE_COORD_1\0"
-   "GL_MAP1_TEXTURE_COORD_2\0"
-   "GL_MAP1_TEXTURE_COORD_3\0"
-   "GL_MAP1_TEXTURE_COORD_4\0"
-   "GL_MAP1_VERTEX_3\0"
-   "GL_MAP1_VERTEX_4\0"
-   "GL_MAP1_VERTEX_ATTRIB0_4_NV\0"
-   "GL_MAP1_VERTEX_ATTRIB10_4_NV\0"
-   "GL_MAP1_VERTEX_ATTRIB11_4_NV\0"
-   "GL_MAP1_VERTEX_ATTRIB12_4_NV\0"
-   "GL_MAP1_VERTEX_ATTRIB13_4_NV\0"
-   "GL_MAP1_VERTEX_ATTRIB14_4_NV\0"
-   "GL_MAP1_VERTEX_ATTRIB15_4_NV\0"
-   "GL_MAP1_VERTEX_ATTRIB1_4_NV\0"
-   "GL_MAP1_VERTEX_ATTRIB2_4_NV\0"
-   "GL_MAP1_VERTEX_ATTRIB3_4_NV\0"
-   "GL_MAP1_VERTEX_ATTRIB4_4_NV\0"
-   "GL_MAP1_VERTEX_ATTRIB5_4_NV\0"
-   "GL_MAP1_VERTEX_ATTRIB6_4_NV\0"
-   "GL_MAP1_VERTEX_ATTRIB7_4_NV\0"
-   "GL_MAP1_VERTEX_ATTRIB8_4_NV\0"
-   "GL_MAP1_VERTEX_ATTRIB9_4_NV\0"
-   "GL_MAP2_COLOR_4\0"
-   "GL_MAP2_GRID_DOMAIN\0"
-   "GL_MAP2_GRID_SEGMENTS\0"
-   "GL_MAP2_INDEX\0"
-   "GL_MAP2_NORMAL\0"
-   "GL_MAP2_TEXTURE_COORD_1\0"
-   "GL_MAP2_TEXTURE_COORD_2\0"
-   "GL_MAP2_TEXTURE_COORD_3\0"
-   "GL_MAP2_TEXTURE_COORD_4\0"
-   "GL_MAP2_VERTEX_3\0"
-   "GL_MAP2_VERTEX_4\0"
-   "GL_MAP2_VERTEX_ATTRIB0_4_NV\0"
-   "GL_MAP2_VERTEX_ATTRIB10_4_NV\0"
-   "GL_MAP2_VERTEX_ATTRIB11_4_NV\0"
-   "GL_MAP2_VERTEX_ATTRIB12_4_NV\0"
-   "GL_MAP2_VERTEX_ATTRIB13_4_NV\0"
-   "GL_MAP2_VERTEX_ATTRIB14_4_NV\0"
-   "GL_MAP2_VERTEX_ATTRIB15_4_NV\0"
-   "GL_MAP2_VERTEX_ATTRIB1_4_NV\0"
-   "GL_MAP2_VERTEX_ATTRIB2_4_NV\0"
-   "GL_MAP2_VERTEX_ATTRIB3_4_NV\0"
-   "GL_MAP2_VERTEX_ATTRIB4_4_NV\0"
-   "GL_MAP2_VERTEX_ATTRIB5_4_NV\0"
-   "GL_MAP2_VERTEX_ATTRIB6_4_NV\0"
-   "GL_MAP2_VERTEX_ATTRIB7_4_NV\0"
-   "GL_MAP2_VERTEX_ATTRIB8_4_NV\0"
-   "GL_MAP2_VERTEX_ATTRIB9_4_NV\0"
-   "GL_MAP_COLOR\0"
-   "GL_MAP_FLUSH_EXPLICIT_BIT\0"
-   "GL_MAP_INVALIDATE_BUFFER_BIT\0"
-   "GL_MAP_INVALIDATE_RANGE_BIT\0"
-   "GL_MAP_READ_BIT\0"
-   "GL_MAP_STENCIL\0"
-   "GL_MAP_UNSYNCHRONIZED_BIT\0"
-   "GL_MAP_WRITE_BIT\0"
-   "GL_MATRIX0_ARB\0"
-   "GL_MATRIX0_NV\0"
-   "GL_MATRIX10_ARB\0"
-   "GL_MATRIX11_ARB\0"
-   "GL_MATRIX12_ARB\0"
-   "GL_MATRIX13_ARB\0"
-   "GL_MATRIX14_ARB\0"
-   "GL_MATRIX15_ARB\0"
-   "GL_MATRIX16_ARB\0"
-   "GL_MATRIX17_ARB\0"
-   "GL_MATRIX18_ARB\0"
-   "GL_MATRIX19_ARB\0"
-   "GL_MATRIX1_ARB\0"
-   "GL_MATRIX1_NV\0"
-   "GL_MATRIX20_ARB\0"
-   "GL_MATRIX21_ARB\0"
-   "GL_MATRIX22_ARB\0"
-   "GL_MATRIX23_ARB\0"
-   "GL_MATRIX24_ARB\0"
-   "GL_MATRIX25_ARB\0"
-   "GL_MATRIX26_ARB\0"
-   "GL_MATRIX27_ARB\0"
-   "GL_MATRIX28_ARB\0"
-   "GL_MATRIX29_ARB\0"
-   "GL_MATRIX2_ARB\0"
-   "GL_MATRIX2_NV\0"
-   "GL_MATRIX30_ARB\0"
-   "GL_MATRIX31_ARB\0"
-   "GL_MATRIX3_ARB\0"
-   "GL_MATRIX3_NV\0"
-   "GL_MATRIX4_ARB\0"
-   "GL_MATRIX4_NV\0"
-   "GL_MATRIX5_ARB\0"
-   "GL_MATRIX5_NV\0"
-   "GL_MATRIX6_ARB\0"
-   "GL_MATRIX6_NV\0"
-   "GL_MATRIX7_ARB\0"
-   "GL_MATRIX7_NV\0"
-   "GL_MATRIX8_ARB\0"
-   "GL_MATRIX9_ARB\0"
-   "GL_MATRIX_INDEX_ARRAY_ARB\0"
-   "GL_MATRIX_INDEX_ARRAY_BUFFER_BINDING_OES\0"
-   "GL_MATRIX_INDEX_ARRAY_OES\0"
-   "GL_MATRIX_INDEX_ARRAY_POINTER_ARB\0"
-   "GL_MATRIX_INDEX_ARRAY_POINTER_OES\0"
-   "GL_MATRIX_INDEX_ARRAY_SIZE_ARB\0"
-   "GL_MATRIX_INDEX_ARRAY_SIZE_OES\0"
-   "GL_MATRIX_INDEX_ARRAY_STRIDE_ARB\0"
-   "GL_MATRIX_INDEX_ARRAY_STRIDE_OES\0"
-   "GL_MATRIX_INDEX_ARRAY_TYPE_ARB\0"
-   "GL_MATRIX_INDEX_ARRAY_TYPE_OES\0"
-   "GL_MATRIX_MODE\0"
-   "GL_MATRIX_PALETTE_ARB\0"
-   "GL_MATRIX_PALETTE_OES\0"
-   "GL_MAX\0"
-   "GL_MAX_3D_TEXTURE_SIZE\0"
-   "GL_MAX_3D_TEXTURE_SIZE_OES\0"
-   "GL_MAX_ARRAY_TEXTURE_LAYERS\0"
-   "GL_MAX_ARRAY_TEXTURE_LAYERS_EXT\0"
-   "GL_MAX_ATTRIB_STACK_DEPTH\0"
-   "GL_MAX_CLIENT_ATTRIB_STACK_DEPTH\0"
-   "GL_MAX_CLIPMAP_DEPTH_SGIX\0"
-   "GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX\0"
-   "GL_MAX_CLIP_DISTANCES\0"
-   "GL_MAX_CLIP_PLANES\0"
-   "GL_MAX_COLOR_ATTACHMENTS\0"
-   "GL_MAX_COLOR_ATTACHMENTS_EXT\0"
-   "GL_MAX_COLOR_MATRIX_STACK_DEPTH\0"
-   "GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI\0"
-   "GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS\0"
-   "GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB\0"
-   "GL_MAX_CONVOLUTION_HEIGHT\0"
-   "GL_MAX_CONVOLUTION_HEIGHT_EXT\0"
-   "GL_MAX_CONVOLUTION_WIDTH\0"
-   "GL_MAX_CONVOLUTION_WIDTH_EXT\0"
-   "GL_MAX_CUBE_MAP_TEXTURE_SIZE\0"
-   "GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB\0"
-   "GL_MAX_CUBE_MAP_TEXTURE_SIZE_OES\0"
-   "GL_MAX_DRAW_BUFFERS\0"
-   "GL_MAX_DRAW_BUFFERS_ARB\0"
-   "GL_MAX_DRAW_BUFFERS_ATI\0"
-   "GL_MAX_ELEMENTS_INDICES\0"
-   "GL_MAX_ELEMENTS_VERTICES\0"
-   "GL_MAX_EVAL_ORDER\0"
-   "GL_MAX_EXT\0"
-   "GL_MAX_FRAGMENT_INPUT_COMPONENTS\0"
-   "GL_MAX_FRAGMENT_UNIFORM_COMPONENTS\0"
-   "GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB\0"
-   "GL_MAX_FRAGMENT_UNIFORM_VECTORS\0"
-   "GL_MAX_GEOMETRY_INPUT_COMPONENTS\0"
-   "GL_MAX_GEOMETRY_OUTPUT_COMPONENTS\0"
-   "GL_MAX_GEOMETRY_OUTPUT_VERTICES\0"
-   "GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB\0"
-   "GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS\0"
-   "GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB\0"
-   "GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS\0"
-   "GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB\0"
-   "GL_MAX_GEOMETRY_UNIFORM_COMPONENTS\0"
-   "GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB\0"
-   "GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB\0"
-   "GL_MAX_LIGHTS\0"
-   "GL_MAX_LIST_NESTING\0"
-   "GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB\0"
-   "GL_MAX_MODELVIEW_STACK_DEPTH\0"
-   "GL_MAX_NAME_STACK_DEPTH\0"
-   "GL_MAX_PALETTE_MATRICES_ARB\0"
-   "GL_MAX_PALETTE_MATRICES_OES\0"
-   "GL_MAX_PIXEL_MAP_TABLE\0"
-   "GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB\0"
-   "GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB\0"
-   "GL_MAX_PROGRAM_ATTRIBS_ARB\0"
-   "GL_MAX_PROGRAM_CALL_DEPTH_NV\0"
-   "GL_MAX_PROGRAM_ENV_PARAMETERS_ARB\0"
-   "GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV\0"
-   "GL_MAX_PROGRAM_IF_DEPTH_NV\0"
-   "GL_MAX_PROGRAM_INSTRUCTIONS_ARB\0"
-   "GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB\0"
-   "GL_MAX_PROGRAM_LOOP_COUNT_NV\0"
-   "GL_MAX_PROGRAM_LOOP_DEPTH_NV\0"
-   "GL_MAX_PROGRAM_MATRICES_ARB\0"
-   "GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB\0"
-   "GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB\0"
-   "GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB\0"
-   "GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB\0"
-   "GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB\0"
-   "GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB\0"
-   "GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB\0"
-   "GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB\0"
-   "GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB\0"
-   "GL_MAX_PROGRAM_PARAMETERS_ARB\0"
-   "GL_MAX_PROGRAM_TEMPORARIES_ARB\0"
-   "GL_MAX_PROGRAM_TEXEL_OFFSET\0"
-   "GL_MAX_PROGRAM_TEXEL_OFFSET_EXT\0"
-   "GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB\0"
-   "GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB\0"
-   "GL_MAX_PROJECTION_STACK_DEPTH\0"
-   "GL_MAX_RECTANGLE_TEXTURE_SIZE\0"
-   "GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB\0"
-   "GL_MAX_RECTANGLE_TEXTURE_SIZE_NV\0"
-   "GL_MAX_RENDERBUFFER_SIZE\0"
-   "GL_MAX_RENDERBUFFER_SIZE_EXT\0"
-   "GL_MAX_RENDERBUFFER_SIZE_OES\0"
-   "GL_MAX_SAMPLES\0"
-   "GL_MAX_SAMPLES_EXT\0"
-   "GL_MAX_SERVER_WAIT_TIMEOUT\0"
-   "GL_MAX_SHININESS_NV\0"
-   "GL_MAX_SPOT_EXPONENT_NV\0"
-   "GL_MAX_TEXTURE_BUFFER_SIZE\0"
-   "GL_MAX_TEXTURE_COORDS\0"
-   "GL_MAX_TEXTURE_COORDS_ARB\0"
-   "GL_MAX_TEXTURE_IMAGE_UNITS\0"
-   "GL_MAX_TEXTURE_IMAGE_UNITS_ARB\0"
-   "GL_MAX_TEXTURE_LOD_BIAS\0"
-   "GL_MAX_TEXTURE_LOD_BIAS_EXT\0"
-   "GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT\0"
-   "GL_MAX_TEXTURE_SIZE\0"
-   "GL_MAX_TEXTURE_STACK_DEPTH\0"
-   "GL_MAX_TEXTURE_UNITS\0"
-   "GL_MAX_TEXTURE_UNITS_ARB\0"
-   "GL_MAX_TRACK_MATRICES_NV\0"
-   "GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV\0"
-   "GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS\0"
-   "GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT\0"
-   "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS\0"
-   "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT\0"
-   "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS\0"
-   "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT\0"
-   "GL_MAX_VARYING_COMPONENTS\0"
-   "GL_MAX_VARYING_FLOATS\0"
-   "GL_MAX_VARYING_FLOATS_ARB\0"
-   "GL_MAX_VARYING_VECTORS\0"
-   "GL_MAX_VERTEX_ATTRIBS\0"
-   "GL_MAX_VERTEX_ATTRIBS_ARB\0"
-   "GL_MAX_VERTEX_OUTPUT_COMPONENTS\0"
-   "GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS\0"
-   "GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB\0"
-   "GL_MAX_VERTEX_UNIFORM_COMPONENTS\0"
-   "GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB\0"
-   "GL_MAX_VERTEX_UNIFORM_VECTORS\0"
-   "GL_MAX_VERTEX_UNITS_ARB\0"
-   "GL_MAX_VERTEX_UNITS_OES\0"
-   "GL_MAX_VERTEX_VARYING_COMPONENTS_ARB\0"
-   "GL_MAX_VIEWPORT_DIMS\0"
-   "GL_MEDIUM_FLOAT\0"
-   "GL_MEDIUM_INT\0"
-   "GL_MIN\0"
-   "GL_MINMAX\0"
-   "GL_MINMAX_EXT\0"
-   "GL_MINMAX_FORMAT\0"
-   "GL_MINMAX_FORMAT_EXT\0"
-   "GL_MINMAX_SINK\0"
-   "GL_MINMAX_SINK_EXT\0"
-   "GL_MINOR_VERSION\0"
-   "GL_MIN_EXT\0"
-   "GL_MIN_PROGRAM_TEXEL_OFFSET\0"
-   "GL_MIN_PROGRAM_TEXEL_OFFSET_EXT\0"
-   "GL_MIRRORED_REPEAT\0"
-   "GL_MIRRORED_REPEAT_ARB\0"
-   "GL_MIRRORED_REPEAT_IBM\0"
-   "GL_MIRROR_CLAMP_ATI\0"
-   "GL_MIRROR_CLAMP_EXT\0"
-   "GL_MIRROR_CLAMP_TO_BORDER_EXT\0"
-   "GL_MIRROR_CLAMP_TO_EDGE_ATI\0"
-   "GL_MIRROR_CLAMP_TO_EDGE_EXT\0"
-   "GL_MODELVIEW\0"
-   "GL_MODELVIEW0_ARB\0"
-   "GL_MODELVIEW10_ARB\0"
-   "GL_MODELVIEW11_ARB\0"
-   "GL_MODELVIEW12_ARB\0"
-   "GL_MODELVIEW13_ARB\0"
-   "GL_MODELVIEW14_ARB\0"
-   "GL_MODELVIEW15_ARB\0"
-   "GL_MODELVIEW16_ARB\0"
-   "GL_MODELVIEW17_ARB\0"
-   "GL_MODELVIEW18_ARB\0"
-   "GL_MODELVIEW19_ARB\0"
-   "GL_MODELVIEW1_ARB\0"
-   "GL_MODELVIEW20_ARB\0"
-   "GL_MODELVIEW21_ARB\0"
-   "GL_MODELVIEW22_ARB\0"
-   "GL_MODELVIEW23_ARB\0"
-   "GL_MODELVIEW24_ARB\0"
-   "GL_MODELVIEW25_ARB\0"
-   "GL_MODELVIEW26_ARB\0"
-   "GL_MODELVIEW27_ARB\0"
-   "GL_MODELVIEW28_ARB\0"
-   "GL_MODELVIEW29_ARB\0"
-   "GL_MODELVIEW2_ARB\0"
-   "GL_MODELVIEW30_ARB\0"
-   "GL_MODELVIEW31_ARB\0"
-   "GL_MODELVIEW3_ARB\0"
-   "GL_MODELVIEW4_ARB\0"
-   "GL_MODELVIEW5_ARB\0"
-   "GL_MODELVIEW6_ARB\0"
-   "GL_MODELVIEW7_ARB\0"
-   "GL_MODELVIEW8_ARB\0"
-   "GL_MODELVIEW9_ARB\0"
-   "GL_MODELVIEW_MATRIX\0"
-   "GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES\0"
-   "GL_MODELVIEW_PROJECTION_NV\0"
-   "GL_MODELVIEW_STACK_DEPTH\0"
-   "GL_MODULATE\0"
-   "GL_MODULATE_ADD_ATI\0"
-   "GL_MODULATE_SIGNED_ADD_ATI\0"
-   "GL_MODULATE_SUBTRACT_ATI\0"
-   "GL_MULT\0"
-   "GL_MULTISAMPLE\0"
-   "GL_MULTISAMPLE_3DFX\0"
-   "GL_MULTISAMPLE_ARB\0"
-   "GL_MULTISAMPLE_BIT\0"
-   "GL_MULTISAMPLE_BIT_3DFX\0"
-   "GL_MULTISAMPLE_BIT_ARB\0"
-   "GL_MULTISAMPLE_FILTER_HINT_NV\0"
-   "GL_N3F_V3F\0"
-   "GL_NAME_STACK_DEPTH\0"
-   "GL_NAND\0"
-   "GL_NEAREST\0"
-   "GL_NEAREST_CLIPMAP_LINEAR_SGIX\0"
-   "GL_NEAREST_CLIPMAP_NEAREST_SGIX\0"
-   "GL_NEAREST_MIPMAP_LINEAR\0"
-   "GL_NEAREST_MIPMAP_NEAREST\0"
-   "GL_NEVER\0"
-   "GL_NICEST\0"
-   "GL_NONE\0"
-   "GL_NONE_OES\0"
-   "GL_NOOP\0"
-   "GL_NOR\0"
-   "GL_NORMALIZE\0"
-   "GL_NORMAL_ARRAY\0"
-   "GL_NORMAL_ARRAY_BUFFER_BINDING\0"
-   "GL_NORMAL_ARRAY_BUFFER_BINDING_ARB\0"
-   "GL_NORMAL_ARRAY_POINTER\0"
-   "GL_NORMAL_ARRAY_STRIDE\0"
-   "GL_NORMAL_ARRAY_TYPE\0"
-   "GL_NORMAL_MAP\0"
-   "GL_NORMAL_MAP_ARB\0"
-   "GL_NORMAL_MAP_NV\0"
-   "GL_NORMAL_MAP_OES\0"
-   "GL_NOTEQUAL\0"
-   "GL_NO_ERROR\0"
-   "GL_NUM_COMPRESSED_TEXTURE_FORMATS\0"
-   "GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB\0"
-   "GL_NUM_EXTENSIONS\0"
-   "GL_NUM_PROGRAM_BINARY_FORMATS_OES\0"
-   "GL_NUM_SHADER_BINARY_FORMATS\0"
-   "GL_OBJECT_ACTIVE_ATTRIBUTES_ARB\0"
-   "GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB\0"
-   "GL_OBJECT_ACTIVE_UNIFORMS_ARB\0"
-   "GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB\0"
-   "GL_OBJECT_ATTACHED_OBJECTS_ARB\0"
-   "GL_OBJECT_COMPILE_STATUS_ARB\0"
-   "GL_OBJECT_DELETE_STATUS_ARB\0"
-   "GL_OBJECT_INFO_LOG_LENGTH_ARB\0"
-   "GL_OBJECT_LINEAR\0"
-   "GL_OBJECT_LINK_STATUS_ARB\0"
-   "GL_OBJECT_PLANE\0"
-   "GL_OBJECT_SHADER_SOURCE_LENGTH_ARB\0"
-   "GL_OBJECT_SUBTYPE_ARB\0"
-   "GL_OBJECT_TYPE\0"
-   "GL_OBJECT_TYPE_ARB\0"
-   "GL_OBJECT_VALIDATE_STATUS_ARB\0"
-   "GL_OCCLUSION_TEST_HP\0"
-   "GL_OCCLUSION_TEST_RESULT_HP\0"
-   "GL_ONE\0"
-   "GL_ONE_MINUS_CONSTANT_ALPHA\0"
-   "GL_ONE_MINUS_CONSTANT_ALPHA_EXT\0"
-   "GL_ONE_MINUS_CONSTANT_COLOR\0"
-   "GL_ONE_MINUS_CONSTANT_COLOR_EXT\0"
-   "GL_ONE_MINUS_DST_ALPHA\0"
-   "GL_ONE_MINUS_DST_COLOR\0"
-   "GL_ONE_MINUS_SRC_ALPHA\0"
-   "GL_ONE_MINUS_SRC_COLOR\0"
-   "GL_OPERAND0_ALPHA\0"
-   "GL_OPERAND0_ALPHA_ARB\0"
-   "GL_OPERAND0_ALPHA_EXT\0"
-   "GL_OPERAND0_RGB\0"
-   "GL_OPERAND0_RGB_ARB\0"
-   "GL_OPERAND0_RGB_EXT\0"
-   "GL_OPERAND1_ALPHA\0"
-   "GL_OPERAND1_ALPHA_ARB\0"
-   "GL_OPERAND1_ALPHA_EXT\0"
-   "GL_OPERAND1_RGB\0"
-   "GL_OPERAND1_RGB_ARB\0"
-   "GL_OPERAND1_RGB_EXT\0"
-   "GL_OPERAND2_ALPHA\0"
-   "GL_OPERAND2_ALPHA_ARB\0"
-   "GL_OPERAND2_ALPHA_EXT\0"
-   "GL_OPERAND2_RGB\0"
-   "GL_OPERAND2_RGB_ARB\0"
-   "GL_OPERAND2_RGB_EXT\0"
-   "GL_OPERAND3_ALPHA_NV\0"
-   "GL_OPERAND3_RGB_NV\0"
-   "GL_OR\0"
-   "GL_ORDER\0"
-   "GL_OR_INVERTED\0"
-   "GL_OR_REVERSE\0"
-   "GL_OUT_OF_MEMORY\0"
-   "GL_PACK_ALIGNMENT\0"
-   "GL_PACK_IMAGE_HEIGHT\0"
-   "GL_PACK_INVERT_MESA\0"
-   "GL_PACK_LSB_FIRST\0"
-   "GL_PACK_ROW_LENGTH\0"
-   "GL_PACK_SKIP_IMAGES\0"
-   "GL_PACK_SKIP_PIXELS\0"
-   "GL_PACK_SKIP_ROWS\0"
-   "GL_PACK_SWAP_BYTES\0"
-   "GL_PALETTE4_R5_G6_B5_OES\0"
-   "GL_PALETTE4_RGB5_A1_OES\0"
-   "GL_PALETTE4_RGB8_OES\0"
-   "GL_PALETTE4_RGBA4_OES\0"
-   "GL_PALETTE4_RGBA8_OES\0"
-   "GL_PALETTE8_R5_G6_B5_OES\0"
-   "GL_PALETTE8_RGB5_A1_OES\0"
-   "GL_PALETTE8_RGB8_OES\0"
-   "GL_PALETTE8_RGBA4_OES\0"
-   "GL_PALETTE8_RGBA8_OES\0"
-   "GL_PASS_THROUGH_TOKEN\0"
-   "GL_PERSPECTIVE_CORRECTION_HINT\0"
-   "GL_PIXEL_MAP_A_TO_A\0"
-   "GL_PIXEL_MAP_A_TO_A_SIZE\0"
-   "GL_PIXEL_MAP_B_TO_B\0"
-   "GL_PIXEL_MAP_B_TO_B_SIZE\0"
-   "GL_PIXEL_MAP_G_TO_G\0"
-   "GL_PIXEL_MAP_G_TO_G_SIZE\0"
-   "GL_PIXEL_MAP_I_TO_A\0"
-   "GL_PIXEL_MAP_I_TO_A_SIZE\0"
-   "GL_PIXEL_MAP_I_TO_B\0"
-   "GL_PIXEL_MAP_I_TO_B_SIZE\0"
-   "GL_PIXEL_MAP_I_TO_G\0"
-   "GL_PIXEL_MAP_I_TO_G_SIZE\0"
-   "GL_PIXEL_MAP_I_TO_I\0"
-   "GL_PIXEL_MAP_I_TO_I_SIZE\0"
-   "GL_PIXEL_MAP_I_TO_R\0"
-   "GL_PIXEL_MAP_I_TO_R_SIZE\0"
-   "GL_PIXEL_MAP_R_TO_R\0"
-   "GL_PIXEL_MAP_R_TO_R_SIZE\0"
-   "GL_PIXEL_MAP_S_TO_S\0"
-   "GL_PIXEL_MAP_S_TO_S_SIZE\0"
-   "GL_PIXEL_MODE_BIT\0"
-   "GL_PIXEL_PACK_BUFFER\0"
-   "GL_PIXEL_PACK_BUFFER_BINDING\0"
-   "GL_PIXEL_PACK_BUFFER_BINDING_EXT\0"
-   "GL_PIXEL_PACK_BUFFER_EXT\0"
-   "GL_PIXEL_UNPACK_BUFFER\0"
-   "GL_PIXEL_UNPACK_BUFFER_BINDING\0"
-   "GL_PIXEL_UNPACK_BUFFER_BINDING_EXT\0"
-   "GL_PIXEL_UNPACK_BUFFER_EXT\0"
-   "GL_POINT\0"
-   "GL_POINTS\0"
-   "GL_POINT_BIT\0"
-   "GL_POINT_DISTANCE_ATTENUATION\0"
-   "GL_POINT_DISTANCE_ATTENUATION_ARB\0"
-   "GL_POINT_DISTANCE_ATTENUATION_EXT\0"
-   "GL_POINT_DISTANCE_ATTENUATION_SGIS\0"
-   "GL_POINT_FADE_THRESHOLD_SIZE\0"
-   "GL_POINT_FADE_THRESHOLD_SIZE_ARB\0"
-   "GL_POINT_FADE_THRESHOLD_SIZE_EXT\0"
-   "GL_POINT_FADE_THRESHOLD_SIZE_SGIS\0"
-   "GL_POINT_SIZE\0"
-   "GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES\0"
-   "GL_POINT_SIZE_ARRAY_OES\0"
-   "GL_POINT_SIZE_ARRAY_POINTER_OES\0"
-   "GL_POINT_SIZE_ARRAY_STRIDE_OES\0"
-   "GL_POINT_SIZE_ARRAY_TYPE_OES\0"
-   "GL_POINT_SIZE_GRANULARITY\0"
-   "GL_POINT_SIZE_MAX\0"
-   "GL_POINT_SIZE_MAX_ARB\0"
-   "GL_POINT_SIZE_MAX_EXT\0"
-   "GL_POINT_SIZE_MAX_SGIS\0"
-   "GL_POINT_SIZE_MIN\0"
-   "GL_POINT_SIZE_MIN_ARB\0"
-   "GL_POINT_SIZE_MIN_EXT\0"
-   "GL_POINT_SIZE_MIN_SGIS\0"
-   "GL_POINT_SIZE_RANGE\0"
-   "GL_POINT_SMOOTH\0"
-   "GL_POINT_SMOOTH_HINT\0"
-   "GL_POINT_SPRITE\0"
-   "GL_POINT_SPRITE_ARB\0"
-   "GL_POINT_SPRITE_COORD_ORIGIN\0"
-   "GL_POINT_SPRITE_NV\0"
-   "GL_POINT_SPRITE_OES\0"
-   "GL_POINT_SPRITE_R_MODE_NV\0"
-   "GL_POINT_TOKEN\0"
-   "GL_POLYGON\0"
-   "GL_POLYGON_BIT\0"
-   "GL_POLYGON_MODE\0"
-   "GL_POLYGON_OFFSET_BIAS\0"
-   "GL_POLYGON_OFFSET_FACTOR\0"
-   "GL_POLYGON_OFFSET_FILL\0"
-   "GL_POLYGON_OFFSET_LINE\0"
-   "GL_POLYGON_OFFSET_POINT\0"
-   "GL_POLYGON_OFFSET_UNITS\0"
-   "GL_POLYGON_SMOOTH\0"
-   "GL_POLYGON_SMOOTH_HINT\0"
-   "GL_POLYGON_STIPPLE\0"
-   "GL_POLYGON_STIPPLE_BIT\0"
-   "GL_POLYGON_TOKEN\0"
-   "GL_POSITION\0"
-   "GL_POST_COLOR_MATRIX_ALPHA_BIAS\0"
-   "GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI\0"
-   "GL_POST_COLOR_MATRIX_ALPHA_SCALE\0"
-   "GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI\0"
-   "GL_POST_COLOR_MATRIX_BLUE_BIAS\0"
-   "GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI\0"
-   "GL_POST_COLOR_MATRIX_BLUE_SCALE\0"
-   "GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI\0"
-   "GL_POST_COLOR_MATRIX_COLOR_TABLE\0"
-   "GL_POST_COLOR_MATRIX_GREEN_BIAS\0"
-   "GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI\0"
-   "GL_POST_COLOR_MATRIX_GREEN_SCALE\0"
-   "GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI\0"
-   "GL_POST_COLOR_MATRIX_RED_BIAS\0"
-   "GL_POST_COLOR_MATRIX_RED_BIAS_SGI\0"
-   "GL_POST_COLOR_MATRIX_RED_SCALE\0"
-   "GL_POST_COLOR_MATRIX_RED_SCALE_SGI\0"
-   "GL_POST_CONVOLUTION_ALPHA_BIAS\0"
-   "GL_POST_CONVOLUTION_ALPHA_BIAS_EXT\0"
-   "GL_POST_CONVOLUTION_ALPHA_SCALE\0"
-   "GL_POST_CONVOLUTION_ALPHA_SCALE_EXT\0"
-   "GL_POST_CONVOLUTION_BLUE_BIAS\0"
-   "GL_POST_CONVOLUTION_BLUE_BIAS_EXT\0"
-   "GL_POST_CONVOLUTION_BLUE_SCALE\0"
-   "GL_POST_CONVOLUTION_BLUE_SCALE_EXT\0"
-   "GL_POST_CONVOLUTION_COLOR_TABLE\0"
-   "GL_POST_CONVOLUTION_GREEN_BIAS\0"
-   "GL_POST_CONVOLUTION_GREEN_BIAS_EXT\0"
-   "GL_POST_CONVOLUTION_GREEN_SCALE\0"
-   "GL_POST_CONVOLUTION_GREEN_SCALE_EXT\0"
-   "GL_POST_CONVOLUTION_RED_BIAS\0"
-   "GL_POST_CONVOLUTION_RED_BIAS_EXT\0"
-   "GL_POST_CONVOLUTION_RED_SCALE\0"
-   "GL_POST_CONVOLUTION_RED_SCALE_EXT\0"
-   "GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX\0"
-   "GL_POST_TEXTURE_FILTER_BIAS_SGIX\0"
-   "GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX\0"
-   "GL_POST_TEXTURE_FILTER_SCALE_SGIX\0"
-   "GL_PREVIOUS\0"
-   "GL_PREVIOUS_ARB\0"
-   "GL_PREVIOUS_EXT\0"
-   "GL_PRIMARY_COLOR\0"
-   "GL_PRIMARY_COLOR_ARB\0"
-   "GL_PRIMARY_COLOR_EXT\0"
-   "GL_PRIMITIVES_GENERATED\0"
-   "GL_PRIMITIVES_GENERATED_EXT\0"
-   "GL_PRIMITIVE_RESTART\0"
-   "GL_PRIMITIVE_RESTART_INDEX\0"
-   "GL_PRIMITIVE_RESTART_INDEX_NV\0"
-   "GL_PRIMITIVE_RESTART_NV\0"
-   "GL_PROGRAM_ADDRESS_REGISTERS_ARB\0"
-   "GL_PROGRAM_ALU_INSTRUCTIONS_ARB\0"
-   "GL_PROGRAM_ATTRIBS_ARB\0"
-   "GL_PROGRAM_BINARY_FORMATS_OES\0"
-   "GL_PROGRAM_BINARY_LENGTH_OES\0"
-   "GL_PROGRAM_BINDING_ARB\0"
-   "GL_PROGRAM_ERROR_POSITION_ARB\0"
-   "GL_PROGRAM_ERROR_POSITION_NV\0"
-   "GL_PROGRAM_ERROR_STRING_ARB\0"
-   "GL_PROGRAM_FORMAT_ARB\0"
-   "GL_PROGRAM_FORMAT_ASCII_ARB\0"
-   "GL_PROGRAM_INSTRUCTIONS_ARB\0"
-   "GL_PROGRAM_LENGTH_ARB\0"
-   "GL_PROGRAM_LENGTH_NV\0"
-   "GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB\0"
-   "GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB\0"
-   "GL_PROGRAM_NATIVE_ATTRIBS_ARB\0"
-   "GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB\0"
-   "GL_PROGRAM_NATIVE_PARAMETERS_ARB\0"
-   "GL_PROGRAM_NATIVE_TEMPORARIES_ARB\0"
-   "GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB\0"
-   "GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB\0"
-   "GL_PROGRAM_OBJECT_ARB\0"
-   "GL_PROGRAM_PARAMETERS_ARB\0"
-   "GL_PROGRAM_PARAMETER_NV\0"
-   "GL_PROGRAM_POINT_SIZE\0"
-   "GL_PROGRAM_POINT_SIZE_ARB\0"
-   "GL_PROGRAM_RESIDENT_NV\0"
-   "GL_PROGRAM_STRING_ARB\0"
-   "GL_PROGRAM_STRING_NV\0"
-   "GL_PROGRAM_TARGET_NV\0"
-   "GL_PROGRAM_TEMPORARIES_ARB\0"
-   "GL_PROGRAM_TEX_INDIRECTIONS_ARB\0"
-   "GL_PROGRAM_TEX_INSTRUCTIONS_ARB\0"
-   "GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB\0"
-   "GL_PROJECTION\0"
-   "GL_PROJECTION_MATRIX\0"
-   "GL_PROJECTION_MATRIX_FLOAT_AS_INT_BITS_OES\0"
-   "GL_PROJECTION_STACK_DEPTH\0"
-   "GL_PROVOKING_VERTEX\0"
-   "GL_PROVOKING_VERTEX_EXT\0"
-   "GL_PROXY_COLOR_TABLE\0"
-   "GL_PROXY_HISTOGRAM\0"
-   "GL_PROXY_HISTOGRAM_EXT\0"
-   "GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE\0"
-   "GL_PROXY_POST_CONVOLUTION_COLOR_TABLE\0"
-   "GL_PROXY_TEXTURE_1D\0"
-   "GL_PROXY_TEXTURE_1D_ARRAY\0"
-   "GL_PROXY_TEXTURE_1D_ARRAY_EXT\0"
-   "GL_PROXY_TEXTURE_1D_EXT\0"
-   "GL_PROXY_TEXTURE_2D\0"
-   "GL_PROXY_TEXTURE_2D_ARRAY\0"
-   "GL_PROXY_TEXTURE_2D_ARRAY_EXT\0"
-   "GL_PROXY_TEXTURE_2D_EXT\0"
-   "GL_PROXY_TEXTURE_3D\0"
-   "GL_PROXY_TEXTURE_COLOR_TABLE_SGI\0"
-   "GL_PROXY_TEXTURE_CUBE_MAP\0"
-   "GL_PROXY_TEXTURE_CUBE_MAP_ARB\0"
-   "GL_PROXY_TEXTURE_RECTANGLE\0"
-   "GL_PROXY_TEXTURE_RECTANGLE_ARB\0"
-   "GL_PROXY_TEXTURE_RECTANGLE_NV\0"
-   "GL_PURGEABLE_APPLE\0"
-   "GL_Q\0"
-   "GL_QUADRATIC_ATTENUATION\0"
-   "GL_QUADS\0"
-   "GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION\0"
-   "GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT\0"
-   "GL_QUAD_MESH_SUN\0"
-   "GL_QUAD_STRIP\0"
-   "GL_QUERY_BY_REGION_NO_WAIT\0"
-   "GL_QUERY_BY_REGION_NO_WAIT_NV\0"
-   "GL_QUERY_BY_REGION_WAIT\0"
-   "GL_QUERY_BY_REGION_WAIT_NV\0"
-   "GL_QUERY_COUNTER_BITS\0"
-   "GL_QUERY_COUNTER_BITS_ARB\0"
-   "GL_QUERY_NO_WAIT\0"
-   "GL_QUERY_NO_WAIT_NV\0"
-   "GL_QUERY_RESULT\0"
-   "GL_QUERY_RESULT_ARB\0"
-   "GL_QUERY_RESULT_AVAILABLE\0"
-   "GL_QUERY_RESULT_AVAILABLE_ARB\0"
-   "GL_QUERY_WAIT\0"
-   "GL_QUERY_WAIT_NV\0"
-   "GL_R\0"
-   "GL_R11F_G11F_B10F\0"
-   "GL_R16_SNORM\0"
-   "GL_R3_G3_B2\0"
-   "GL_R8_SNORM\0"
-   "GL_RASTERIZER_DISCARD\0"
-   "GL_RASTERIZER_DISCARD_EXT\0"
-   "GL_RASTER_POSITION_UNCLIPPED_IBM\0"
-   "GL_READ_BUFFER\0"
-   "GL_READ_FRAMEBUFFER\0"
-   "GL_READ_FRAMEBUFFER_BINDING\0"
-   "GL_READ_FRAMEBUFFER_BINDING_EXT\0"
-   "GL_READ_FRAMEBUFFER_EXT\0"
-   "GL_READ_ONLY\0"
-   "GL_READ_ONLY_ARB\0"
-   "GL_READ_WRITE\0"
-   "GL_READ_WRITE_ARB\0"
-   "GL_RED\0"
-   "GL_REDUCE\0"
-   "GL_REDUCE_EXT\0"
-   "GL_RED_BIAS\0"
-   "GL_RED_BITS\0"
-   "GL_RED_INTEGER\0"
-   "GL_RED_INTEGER_EXT\0"
-   "GL_RED_SCALE\0"
-   "GL_RED_SNORM\0"
-   "GL_REFLECTION_MAP\0"
-   "GL_REFLECTION_MAP_ARB\0"
-   "GL_REFLECTION_MAP_NV\0"
-   "GL_REFLECTION_MAP_OES\0"
-   "GL_RELEASED_APPLE\0"
-   "GL_RENDER\0"
-   "GL_RENDERBUFFER\0"
-   "GL_RENDERBUFFER_ALPHA_SIZE\0"
-   "GL_RENDERBUFFER_ALPHA_SIZE_OES\0"
-   "GL_RENDERBUFFER_BINDING\0"
-   "GL_RENDERBUFFER_BINDING_EXT\0"
-   "GL_RENDERBUFFER_BINDING_OES\0"
-   "GL_RENDERBUFFER_BLUE_SIZE\0"
-   "GL_RENDERBUFFER_BLUE_SIZE_OES\0"
-   "GL_RENDERBUFFER_DEPTH_SIZE\0"
-   "GL_RENDERBUFFER_DEPTH_SIZE_OES\0"
-   "GL_RENDERBUFFER_EXT\0"
-   "GL_RENDERBUFFER_GREEN_SIZE\0"
-   "GL_RENDERBUFFER_GREEN_SIZE_OES\0"
-   "GL_RENDERBUFFER_HEIGHT\0"
-   "GL_RENDERBUFFER_HEIGHT_EXT\0"
-   "GL_RENDERBUFFER_HEIGHT_OES\0"
-   "GL_RENDERBUFFER_INTERNAL_FORMAT\0"
-   "GL_RENDERBUFFER_INTERNAL_FORMAT_EXT\0"
-   "GL_RENDERBUFFER_INTERNAL_FORMAT_OES\0"
-   "GL_RENDERBUFFER_OES\0"
-   "GL_RENDERBUFFER_RED_SIZE\0"
-   "GL_RENDERBUFFER_RED_SIZE_OES\0"
-   "GL_RENDERBUFFER_SAMPLES\0"
-   "GL_RENDERBUFFER_SAMPLES_EXT\0"
-   "GL_RENDERBUFFER_STENCIL_SIZE\0"
-   "GL_RENDERBUFFER_STENCIL_SIZE_OES\0"
-   "GL_RENDERBUFFER_WIDTH\0"
-   "GL_RENDERBUFFER_WIDTH_EXT\0"
-   "GL_RENDERBUFFER_WIDTH_OES\0"
-   "GL_RENDERER\0"
-   "GL_RENDER_MODE\0"
-   "GL_REPEAT\0"
-   "GL_REPLACE\0"
-   "GL_REPLACE_EXT\0"
-   "GL_REPLICATE_BORDER_HP\0"
-   "GL_RESCALE_NORMAL\0"
-   "GL_RESCALE_NORMAL_EXT\0"
-   "GL_RETAINED_APPLE\0"
-   "GL_RETURN\0"
-   "GL_RG16_SNORM\0"
-   "GL_RG8_SNORM\0"
-   "GL_RGB\0"
-   "GL_RGB10\0"
-   "GL_RGB10_A2\0"
-   "GL_RGB10_A2_EXT\0"
-   "GL_RGB10_EXT\0"
-   "GL_RGB12\0"
-   "GL_RGB12_EXT\0"
-   "GL_RGB16\0"
-   "GL_RGB16F\0"
-   "GL_RGB16I\0"
-   "GL_RGB16I_EXT\0"
-   "GL_RGB16UI\0"
-   "GL_RGB16UI_EXT\0"
-   "GL_RGB16_EXT\0"
-   "GL_RGB16_SNORM\0"
-   "GL_RGB2_EXT\0"
-   "GL_RGB32F\0"
-   "GL_RGB32I\0"
-   "GL_RGB32I_EXT\0"
-   "GL_RGB32UI\0"
-   "GL_RGB32UI_EXT\0"
-   "GL_RGB4\0"
-   "GL_RGB4_EXT\0"
-   "GL_RGB4_S3TC\0"
-   "GL_RGB5\0"
-   "GL_RGB565\0"
-   "GL_RGB565_OES\0"
-   "GL_RGB5_A1\0"
-   "GL_RGB5_A1_EXT\0"
-   "GL_RGB5_A1_OES\0"
-   "GL_RGB5_EXT\0"
-   "GL_RGB8\0"
-   "GL_RGB8I\0"
-   "GL_RGB8I_EXT\0"
-   "GL_RGB8UI\0"
-   "GL_RGB8UI_EXT\0"
-   "GL_RGB8_EXT\0"
-   "GL_RGB8_OES\0"
-   "GL_RGB8_SNORM\0"
-   "GL_RGB9_E5\0"
-   "GL_RGBA\0"
-   "GL_RGBA12\0"
-   "GL_RGBA12_EXT\0"
-   "GL_RGBA16\0"
-   "GL_RGBA16F\0"
-   "GL_RGBA16I\0"
-   "GL_RGBA16I_EXT\0"
-   "GL_RGBA16UI\0"
-   "GL_RGBA16UI_EXT\0"
-   "GL_RGBA16_EXT\0"
-   "GL_RGBA16_SNORM\0"
-   "GL_RGBA2\0"
-   "GL_RGBA2_EXT\0"
-   "GL_RGBA32F\0"
-   "GL_RGBA32I\0"
-   "GL_RGBA32I_EXT\0"
-   "GL_RGBA32UI\0"
-   "GL_RGBA32UI_EXT\0"
-   "GL_RGBA4\0"
-   "GL_RGBA4_DXT5_S3TC\0"
-   "GL_RGBA4_EXT\0"
-   "GL_RGBA4_OES\0"
-   "GL_RGBA4_S3TC\0"
-   "GL_RGBA8\0"
-   "GL_RGBA8I\0"
-   "GL_RGBA8I_EXT\0"
-   "GL_RGBA8UI\0"
-   "GL_RGBA8UI_EXT\0"
-   "GL_RGBA8_EXT\0"
-   "GL_RGBA8_OES\0"
-   "GL_RGBA8_SNORM\0"
-   "GL_RGBA_DXT5_S3TC\0"
-   "GL_RGBA_INTEGER\0"
-   "GL_RGBA_INTEGER_EXT\0"
-   "GL_RGBA_INTEGER_MODE_EXT\0"
-   "GL_RGBA_MODE\0"
-   "GL_RGBA_S3TC\0"
-   "GL_RGBA_SNORM\0"
-   "GL_RGB_INTEGER\0"
-   "GL_RGB_INTEGER_EXT\0"
-   "GL_RGB_S3TC\0"
-   "GL_RGB_SCALE\0"
-   "GL_RGB_SCALE_ARB\0"
-   "GL_RGB_SCALE_EXT\0"
-   "GL_RGB_SNORM\0"
-   "GL_RG_SNORM\0"
-   "GL_RIGHT\0"
-   "GL_S\0"
-   "GL_SAMPLER_1D\0"
-   "GL_SAMPLER_1D_ARRAY\0"
-   "GL_SAMPLER_1D_ARRAY_EXT\0"
-   "GL_SAMPLER_1D_ARRAY_SHADOW\0"
-   "GL_SAMPLER_1D_ARRAY_SHADOW_EXT\0"
-   "GL_SAMPLER_1D_SHADOW\0"
-   "GL_SAMPLER_2D\0"
-   "GL_SAMPLER_2D_ARRAY\0"
-   "GL_SAMPLER_2D_ARRAY_EXT\0"
-   "GL_SAMPLER_2D_ARRAY_SHADOW\0"
-   "GL_SAMPLER_2D_ARRAY_SHADOW_EXT\0"
-   "GL_SAMPLER_2D_RECT\0"
-   "GL_SAMPLER_2D_RECT_SHADOW\0"
-   "GL_SAMPLER_2D_SHADOW\0"
-   "GL_SAMPLER_3D\0"
-   "GL_SAMPLER_3D_OES\0"
-   "GL_SAMPLER_BUFFER\0"
-   "GL_SAMPLER_BUFFER_EXT\0"
-   "GL_SAMPLER_CUBE\0"
-   "GL_SAMPLER_CUBE_SHADOW\0"
-   "GL_SAMPLER_CUBE_SHADOW_EXT\0"
-   "GL_SAMPLES\0"
-   "GL_SAMPLES_3DFX\0"
-   "GL_SAMPLES_ARB\0"
-   "GL_SAMPLES_PASSED\0"
-   "GL_SAMPLES_PASSED_ARB\0"
-   "GL_SAMPLE_ALPHA_TO_COVERAGE\0"
-   "GL_SAMPLE_ALPHA_TO_COVERAGE_ARB\0"
-   "GL_SAMPLE_ALPHA_TO_ONE\0"
-   "GL_SAMPLE_ALPHA_TO_ONE_ARB\0"
-   "GL_SAMPLE_BUFFERS\0"
-   "GL_SAMPLE_BUFFERS_3DFX\0"
-   "GL_SAMPLE_BUFFERS_ARB\0"
-   "GL_SAMPLE_COVERAGE\0"
-   "GL_SAMPLE_COVERAGE_ARB\0"
-   "GL_SAMPLE_COVERAGE_INVERT\0"
-   "GL_SAMPLE_COVERAGE_INVERT_ARB\0"
-   "GL_SAMPLE_COVERAGE_VALUE\0"
-   "GL_SAMPLE_COVERAGE_VALUE_ARB\0"
-   "GL_SCISSOR_BIT\0"
-   "GL_SCISSOR_BOX\0"
-   "GL_SCISSOR_TEST\0"
-   "GL_SECONDARY_COLOR_ARRAY\0"
-   "GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING\0"
-   "GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB\0"
-   "GL_SECONDARY_COLOR_ARRAY_POINTER\0"
-   "GL_SECONDARY_COLOR_ARRAY_SIZE\0"
-   "GL_SECONDARY_COLOR_ARRAY_STRIDE\0"
-   "GL_SECONDARY_COLOR_ARRAY_TYPE\0"
-   "GL_SELECT\0"
-   "GL_SELECTION_BUFFER_POINTER\0"
-   "GL_SELECTION_BUFFER_SIZE\0"
-   "GL_SEPARABLE_2D\0"
-   "GL_SEPARATE_ATTRIBS\0"
-   "GL_SEPARATE_ATTRIBS_EXT\0"
-   "GL_SEPARATE_SPECULAR_COLOR\0"
-   "GL_SEPARATE_SPECULAR_COLOR_EXT\0"
-   "GL_SET\0"
-   "GL_SHADER_BINARY_FORMATS\0"
-   "GL_SHADER_COMPILER\0"
-   "GL_SHADER_OBJECT_ARB\0"
-   "GL_SHADER_SOURCE_LENGTH\0"
-   "GL_SHADER_TYPE\0"
-   "GL_SHADE_MODEL\0"
-   "GL_SHADING_LANGUAGE_VERSION\0"
-   "GL_SHADOW_AMBIENT_SGIX\0"
-   "GL_SHARED_TEXTURE_PALETTE_EXT\0"
-   "GL_SHININESS\0"
-   "GL_SHORT\0"
-   "GL_SIGNALED\0"
-   "GL_SIGNED_NORMALIZED\0"
-   "GL_SINGLE_COLOR\0"
-   "GL_SINGLE_COLOR_EXT\0"
-   "GL_SLICE_ACCUM_SUN\0"
-   "GL_SLUMINANCE\0"
-   "GL_SLUMINANCE8\0"
-   "GL_SLUMINANCE8_ALPHA8\0"
-   "GL_SLUMINANCE_ALPHA\0"
-   "GL_SMOOTH\0"
-   "GL_SMOOTH_LINE_WIDTH_GRANULARITY\0"
-   "GL_SMOOTH_LINE_WIDTH_RANGE\0"
-   "GL_SMOOTH_POINT_SIZE_GRANULARITY\0"
-   "GL_SMOOTH_POINT_SIZE_RANGE\0"
-   "GL_SOURCE0_ALPHA\0"
-   "GL_SOURCE0_ALPHA_ARB\0"
-   "GL_SOURCE0_ALPHA_EXT\0"
-   "GL_SOURCE0_RGB\0"
-   "GL_SOURCE0_RGB_ARB\0"
-   "GL_SOURCE0_RGB_EXT\0"
-   "GL_SOURCE1_ALPHA\0"
-   "GL_SOURCE1_ALPHA_ARB\0"
-   "GL_SOURCE1_ALPHA_EXT\0"
-   "GL_SOURCE1_RGB\0"
-   "GL_SOURCE1_RGB_ARB\0"
-   "GL_SOURCE1_RGB_EXT\0"
-   "GL_SOURCE2_ALPHA\0"
-   "GL_SOURCE2_ALPHA_ARB\0"
-   "GL_SOURCE2_ALPHA_EXT\0"
-   "GL_SOURCE2_RGB\0"
-   "GL_SOURCE2_RGB_ARB\0"
-   "GL_SOURCE2_RGB_EXT\0"
-   "GL_SOURCE3_ALPHA_NV\0"
-   "GL_SOURCE3_RGB_NV\0"
-   "GL_SPECULAR\0"
-   "GL_SPHERE_MAP\0"
-   "GL_SPOT_CUTOFF\0"
-   "GL_SPOT_DIRECTION\0"
-   "GL_SPOT_EXPONENT\0"
-   "GL_SRC0_ALPHA\0"
-   "GL_SRC0_RGB\0"
-   "GL_SRC1_ALPHA\0"
-   "GL_SRC1_RGB\0"
-   "GL_SRC2_ALPHA\0"
-   "GL_SRC2_RGB\0"
-   "GL_SRC_ALPHA\0"
-   "GL_SRC_ALPHA_SATURATE\0"
-   "GL_SRC_COLOR\0"
-   "GL_SRGB\0"
-   "GL_SRGB8\0"
-   "GL_SRGB8_ALPHA8\0"
-   "GL_SRGB_ALPHA\0"
-   "GL_STACK_OVERFLOW\0"
-   "GL_STACK_UNDERFLOW\0"
-   "GL_STATIC_COPY\0"
-   "GL_STATIC_COPY_ARB\0"
-   "GL_STATIC_DRAW\0"
-   "GL_STATIC_DRAW_ARB\0"
-   "GL_STATIC_READ\0"
-   "GL_STATIC_READ_ARB\0"
-   "GL_STENCIL\0"
-   "GL_STENCIL_ATTACHMENT\0"
-   "GL_STENCIL_ATTACHMENT_EXT\0"
-   "GL_STENCIL_ATTACHMENT_OES\0"
-   "GL_STENCIL_BACK_FAIL\0"
-   "GL_STENCIL_BACK_FAIL_ATI\0"
-   "GL_STENCIL_BACK_FUNC\0"
-   "GL_STENCIL_BACK_FUNC_ATI\0"
-   "GL_STENCIL_BACK_PASS_DEPTH_FAIL\0"
-   "GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI\0"
-   "GL_STENCIL_BACK_PASS_DEPTH_PASS\0"
-   "GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI\0"
-   "GL_STENCIL_BACK_REF\0"
-   "GL_STENCIL_BACK_VALUE_MASK\0"
-   "GL_STENCIL_BACK_WRITEMASK\0"
-   "GL_STENCIL_BITS\0"
-   "GL_STENCIL_BUFFER\0"
-   "GL_STENCIL_BUFFER_BIT\0"
-   "GL_STENCIL_CLEAR_VALUE\0"
-   "GL_STENCIL_FAIL\0"
-   "GL_STENCIL_FUNC\0"
-   "GL_STENCIL_INDEX\0"
-   "GL_STENCIL_INDEX1\0"
-   "GL_STENCIL_INDEX16\0"
-   "GL_STENCIL_INDEX16_EXT\0"
-   "GL_STENCIL_INDEX1_EXT\0"
-   "GL_STENCIL_INDEX1_OES\0"
-   "GL_STENCIL_INDEX4\0"
-   "GL_STENCIL_INDEX4_EXT\0"
-   "GL_STENCIL_INDEX4_OES\0"
-   "GL_STENCIL_INDEX8\0"
-   "GL_STENCIL_INDEX8_EXT\0"
-   "GL_STENCIL_INDEX8_OES\0"
-   "GL_STENCIL_INDEX_EXT\0"
-   "GL_STENCIL_PASS_DEPTH_FAIL\0"
-   "GL_STENCIL_PASS_DEPTH_PASS\0"
-   "GL_STENCIL_REF\0"
-   "GL_STENCIL_TEST\0"
-   "GL_STENCIL_TEST_TWO_SIDE_EXT\0"
-   "GL_STENCIL_VALUE_MASK\0"
-   "GL_STENCIL_WRITEMASK\0"
-   "GL_STEREO\0"
-   "GL_STORAGE_CACHED_APPLE\0"
-   "GL_STORAGE_PRIVATE_APPLE\0"
-   "GL_STORAGE_SHARED_APPLE\0"
-   "GL_STREAM_COPY\0"
-   "GL_STREAM_COPY_ARB\0"
-   "GL_STREAM_DRAW\0"
-   "GL_STREAM_DRAW_ARB\0"
-   "GL_STREAM_READ\0"
-   "GL_STREAM_READ_ARB\0"
-   "GL_SUBPIXEL_BITS\0"
-   "GL_SUBTRACT\0"
-   "GL_SUBTRACT_ARB\0"
-   "GL_SYNC_CONDITION\0"
-   "GL_SYNC_FENCE\0"
-   "GL_SYNC_FLAGS\0"
-   "GL_SYNC_FLUSH_COMMANDS_BIT\0"
-   "GL_SYNC_GPU_COMMANDS_COMPLETE\0"
-   "GL_SYNC_STATUS\0"
-   "GL_T\0"
-   "GL_T2F_C3F_V3F\0"
-   "GL_T2F_C4F_N3F_V3F\0"
-   "GL_T2F_C4UB_V3F\0"
-   "GL_T2F_N3F_V3F\0"
-   "GL_T2F_V3F\0"
-   "GL_T4F_C4F_N3F_V4F\0"
-   "GL_T4F_V4F\0"
-   "GL_TABLE_TOO_LARGE_EXT\0"
-   "GL_TEXTURE\0"
-   "GL_TEXTURE0\0"
-   "GL_TEXTURE0_ARB\0"
-   "GL_TEXTURE1\0"
-   "GL_TEXTURE10\0"
-   "GL_TEXTURE10_ARB\0"
-   "GL_TEXTURE11\0"
-   "GL_TEXTURE11_ARB\0"
-   "GL_TEXTURE12\0"
-   "GL_TEXTURE12_ARB\0"
-   "GL_TEXTURE13\0"
-   "GL_TEXTURE13_ARB\0"
-   "GL_TEXTURE14\0"
-   "GL_TEXTURE14_ARB\0"
-   "GL_TEXTURE15\0"
-   "GL_TEXTURE15_ARB\0"
-   "GL_TEXTURE16\0"
-   "GL_TEXTURE16_ARB\0"
-   "GL_TEXTURE17\0"
-   "GL_TEXTURE17_ARB\0"
-   "GL_TEXTURE18\0"
-   "GL_TEXTURE18_ARB\0"
-   "GL_TEXTURE19\0"
-   "GL_TEXTURE19_ARB\0"
-   "GL_TEXTURE1_ARB\0"
-   "GL_TEXTURE2\0"
-   "GL_TEXTURE20\0"
-   "GL_TEXTURE20_ARB\0"
-   "GL_TEXTURE21\0"
-   "GL_TEXTURE21_ARB\0"
-   "GL_TEXTURE22\0"
-   "GL_TEXTURE22_ARB\0"
-   "GL_TEXTURE23\0"
-   "GL_TEXTURE23_ARB\0"
-   "GL_TEXTURE24\0"
-   "GL_TEXTURE24_ARB\0"
-   "GL_TEXTURE25\0"
-   "GL_TEXTURE25_ARB\0"
-   "GL_TEXTURE26\0"
-   "GL_TEXTURE26_ARB\0"
-   "GL_TEXTURE27\0"
-   "GL_TEXTURE27_ARB\0"
-   "GL_TEXTURE28\0"
-   "GL_TEXTURE28_ARB\0"
-   "GL_TEXTURE29\0"
-   "GL_TEXTURE29_ARB\0"
-   "GL_TEXTURE2_ARB\0"
-   "GL_TEXTURE3\0"
-   "GL_TEXTURE30\0"
-   "GL_TEXTURE30_ARB\0"
-   "GL_TEXTURE31\0"
-   "GL_TEXTURE31_ARB\0"
-   "GL_TEXTURE3_ARB\0"
-   "GL_TEXTURE4\0"
-   "GL_TEXTURE4_ARB\0"
-   "GL_TEXTURE5\0"
-   "GL_TEXTURE5_ARB\0"
-   "GL_TEXTURE6\0"
-   "GL_TEXTURE6_ARB\0"
-   "GL_TEXTURE7\0"
-   "GL_TEXTURE7_ARB\0"
-   "GL_TEXTURE8\0"
-   "GL_TEXTURE8_ARB\0"
-   "GL_TEXTURE9\0"
-   "GL_TEXTURE9_ARB\0"
-   "GL_TEXTURE_1D\0"
-   "GL_TEXTURE_1D_ARRAY\0"
-   "GL_TEXTURE_1D_ARRAY_EXT\0"
-   "GL_TEXTURE_2D\0"
-   "GL_TEXTURE_2D_ARRAY\0"
-   "GL_TEXTURE_2D_ARRAY_EXT\0"
-   "GL_TEXTURE_3D\0"
-   "GL_TEXTURE_3D_OES\0"
-   "GL_TEXTURE_ALPHA_SIZE\0"
-   "GL_TEXTURE_ALPHA_SIZE_EXT\0"
-   "GL_TEXTURE_BASE_LEVEL\0"
-   "GL_TEXTURE_BINDING_1D\0"
-   "GL_TEXTURE_BINDING_1D_ARRAY\0"
-   "GL_TEXTURE_BINDING_1D_ARRAY_EXT\0"
-   "GL_TEXTURE_BINDING_2D\0"
-   "GL_TEXTURE_BINDING_2D_ARRAY\0"
-   "GL_TEXTURE_BINDING_2D_ARRAY_EXT\0"
-   "GL_TEXTURE_BINDING_3D\0"
-   "GL_TEXTURE_BINDING_3D_OES\0"
-   "GL_TEXTURE_BINDING_BUFFER\0"
-   "GL_TEXTURE_BINDING_CUBE_MAP\0"
-   "GL_TEXTURE_BINDING_CUBE_MAP_ARB\0"
-   "GL_TEXTURE_BINDING_CUBE_MAP_OES\0"
-   "GL_TEXTURE_BINDING_RECTANGLE\0"
-   "GL_TEXTURE_BINDING_RECTANGLE_ARB\0"
-   "GL_TEXTURE_BINDING_RECTANGLE_NV\0"
-   "GL_TEXTURE_BIT\0"
-   "GL_TEXTURE_BLUE_SIZE\0"
-   "GL_TEXTURE_BLUE_SIZE_EXT\0"
-   "GL_TEXTURE_BORDER\0"
-   "GL_TEXTURE_BORDER_COLOR\0"
-   "GL_TEXTURE_BUFFER\0"
-   "GL_TEXTURE_BUFFER_DATA_STORE_BINDING\0"
-   "GL_TEXTURE_BUFFER_FORMAT\0"
-   "GL_TEXTURE_CLIPMAP_CENTER_SGIX\0"
-   "GL_TEXTURE_CLIPMAP_DEPTH_SGIX\0"
-   "GL_TEXTURE_CLIPMAP_FRAME_SGIX\0"
-   "GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX\0"
-   "GL_TEXTURE_CLIPMAP_OFFSET_SGIX\0"
-   "GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX\0"
-   "GL_TEXTURE_COLOR_TABLE_SGI\0"
-   "GL_TEXTURE_COLOR_WRITEMASK_SGIS\0"
-   "GL_TEXTURE_COMPARE_FAIL_VALUE_ARB\0"
-   "GL_TEXTURE_COMPARE_FUNC\0"
-   "GL_TEXTURE_COMPARE_FUNC_ARB\0"
-   "GL_TEXTURE_COMPARE_MODE\0"
-   "GL_TEXTURE_COMPARE_MODE_ARB\0"
-   "GL_TEXTURE_COMPARE_OPERATOR_SGIX\0"
-   "GL_TEXTURE_COMPARE_SGIX\0"
-   "GL_TEXTURE_COMPONENTS\0"
-   "GL_TEXTURE_COMPRESSED\0"
-   "GL_TEXTURE_COMPRESSED_ARB\0"
-   "GL_TEXTURE_COMPRESSED_FORMATS_ARB\0"
-   "GL_TEXTURE_COMPRESSED_IMAGE_SIZE\0"
-   "GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB\0"
-   "GL_TEXTURE_COMPRESSION_HINT\0"
-   "GL_TEXTURE_COMPRESSION_HINT_ARB\0"
-   "GL_TEXTURE_COORD_ARRAY\0"
-   "GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING\0"
-   "GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB\0"
-   "GL_TEXTURE_COORD_ARRAY_POINTER\0"
-   "GL_TEXTURE_COORD_ARRAY_SIZE\0"
-   "GL_TEXTURE_COORD_ARRAY_STRIDE\0"
-   "GL_TEXTURE_COORD_ARRAY_TYPE\0"
-   "GL_TEXTURE_CROP_RECT_OES\0"
-   "GL_TEXTURE_CUBE_MAP\0"
-   "GL_TEXTURE_CUBE_MAP_ARB\0"
-   "GL_TEXTURE_CUBE_MAP_NEGATIVE_X\0"
-   "GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB\0"
-   "GL_TEXTURE_CUBE_MAP_NEGATIVE_X_OES\0"
-   "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y\0"
-   "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB\0"
-   "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_OES\0"
-   "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z\0"
-   "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB\0"
-   "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_OES\0"
-   "GL_TEXTURE_CUBE_MAP_OES\0"
-   "GL_TEXTURE_CUBE_MAP_POSITIVE_X\0"
-   "GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB\0"
-   "GL_TEXTURE_CUBE_MAP_POSITIVE_X_OES\0"
-   "GL_TEXTURE_CUBE_MAP_POSITIVE_Y\0"
-   "GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB\0"
-   "GL_TEXTURE_CUBE_MAP_POSITIVE_Y_OES\0"
-   "GL_TEXTURE_CUBE_MAP_POSITIVE_Z\0"
-   "GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB\0"
-   "GL_TEXTURE_CUBE_MAP_POSITIVE_Z_OES\0"
-   "GL_TEXTURE_CUBE_MAP_SEAMLESS\0"
-   "GL_TEXTURE_DEPTH\0"
-   "GL_TEXTURE_DEPTH_SIZE\0"
-   "GL_TEXTURE_DEPTH_SIZE_ARB\0"
-   "GL_TEXTURE_ENV\0"
-   "GL_TEXTURE_ENV_COLOR\0"
-   "GL_TEXTURE_ENV_MODE\0"
-   "GL_TEXTURE_FILTER_CONTROL\0"
-   "GL_TEXTURE_FILTER_CONTROL_EXT\0"
-   "GL_TEXTURE_GEN_MODE\0"
-   "GL_TEXTURE_GEN_MODE_OES\0"
-   "GL_TEXTURE_GEN_Q\0"
-   "GL_TEXTURE_GEN_R\0"
-   "GL_TEXTURE_GEN_S\0"
-   "GL_TEXTURE_GEN_STR_OES\0"
-   "GL_TEXTURE_GEN_T\0"
-   "GL_TEXTURE_GEQUAL_R_SGIX\0"
-   "GL_TEXTURE_GREEN_SIZE\0"
-   "GL_TEXTURE_GREEN_SIZE_EXT\0"
-   "GL_TEXTURE_HEIGHT\0"
-   "GL_TEXTURE_INDEX_SIZE_EXT\0"
-   "GL_TEXTURE_INTENSITY_SIZE\0"
-   "GL_TEXTURE_INTENSITY_SIZE_EXT\0"
-   "GL_TEXTURE_INTERNAL_FORMAT\0"
-   "GL_TEXTURE_LEQUAL_R_SGIX\0"
-   "GL_TEXTURE_LOD_BIAS\0"
-   "GL_TEXTURE_LOD_BIAS_EXT\0"
-   "GL_TEXTURE_LOD_BIAS_R_SGIX\0"
-   "GL_TEXTURE_LOD_BIAS_S_SGIX\0"
-   "GL_TEXTURE_LOD_BIAS_T_SGIX\0"
-   "GL_TEXTURE_LUMINANCE_SIZE\0"
-   "GL_TEXTURE_LUMINANCE_SIZE_EXT\0"
-   "GL_TEXTURE_MAG_FILTER\0"
-   "GL_TEXTURE_MATRIX\0"
-   "GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES\0"
-   "GL_TEXTURE_MAX_ANISOTROPY_EXT\0"
-   "GL_TEXTURE_MAX_CLAMP_R_SGIX\0"
-   "GL_TEXTURE_MAX_CLAMP_S_SGIX\0"
-   "GL_TEXTURE_MAX_CLAMP_T_SGIX\0"
-   "GL_TEXTURE_MAX_LEVEL\0"
-   "GL_TEXTURE_MAX_LOD\0"
-   "GL_TEXTURE_MIN_FILTER\0"
-   "GL_TEXTURE_MIN_LOD\0"
-   "GL_TEXTURE_PRIORITY\0"
-   "GL_TEXTURE_RANGE_LENGTH_APPLE\0"
-   "GL_TEXTURE_RANGE_POINTER_APPLE\0"
-   "GL_TEXTURE_RECTANGLE\0"
-   "GL_TEXTURE_RECTANGLE_ARB\0"
-   "GL_TEXTURE_RECTANGLE_NV\0"
-   "GL_TEXTURE_RED_SIZE\0"
-   "GL_TEXTURE_RED_SIZE_EXT\0"
-   "GL_TEXTURE_RESIDENT\0"
-   "GL_TEXTURE_SHARED_SIZE\0"
-   "GL_TEXTURE_STACK_DEPTH\0"
-   "GL_TEXTURE_STENCIL_SIZE\0"
-   "GL_TEXTURE_STENCIL_SIZE_EXT\0"
-   "GL_TEXTURE_STORAGE_HINT_APPLE\0"
-   "GL_TEXTURE_TOO_LARGE_EXT\0"
-   "GL_TEXTURE_UNSIGNED_REMAP_MODE_NV\0"
-   "GL_TEXTURE_WIDTH\0"
-   "GL_TEXTURE_WRAP_R\0"
-   "GL_TEXTURE_WRAP_R_OES\0"
-   "GL_TEXTURE_WRAP_S\0"
-   "GL_TEXTURE_WRAP_T\0"
-   "GL_TIMEOUT_EXPIRED\0"
-   "GL_TIME_ELAPSED_EXT\0"
-   "GL_TRACK_MATRIX_NV\0"
-   "GL_TRACK_MATRIX_TRANSFORM_NV\0"
-   "GL_TRANSFORM_BIT\0"
-   "GL_TRANSFORM_FEEDBACK\0"
-   "GL_TRANSFORM_FEEDBACK_BINDING\0"
-   "GL_TRANSFORM_FEEDBACK_BUFFER\0"
-   "GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE\0"
-   "GL_TRANSFORM_FEEDBACK_BUFFER_BINDING\0"
-   "GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT\0"
-   "GL_TRANSFORM_FEEDBACK_BUFFER_EXT\0"
-   "GL_TRANSFORM_FEEDBACK_BUFFER_MODE\0"
-   "GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT\0"
-   "GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED\0"
-   "GL_TRANSFORM_FEEDBACK_BUFFER_SIZE\0"
-   "GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT\0"
-   "GL_TRANSFORM_FEEDBACK_BUFFER_START\0"
-   "GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT\0"
-   "GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN\0"
-   "GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT\0"
-   "GL_TRANSFORM_FEEDBACK_VARYINGS\0"
-   "GL_TRANSFORM_FEEDBACK_VARYINGS_EXT\0"
-   "GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH\0"
-   "GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT\0"
-   "GL_TRANSPOSE_COLOR_MATRIX\0"
-   "GL_TRANSPOSE_COLOR_MATRIX_ARB\0"
-   "GL_TRANSPOSE_CURRENT_MATRIX_ARB\0"
-   "GL_TRANSPOSE_MODELVIEW_MATRIX\0"
-   "GL_TRANSPOSE_MODELVIEW_MATRIX_ARB\0"
-   "GL_TRANSPOSE_NV\0"
-   "GL_TRANSPOSE_PROJECTION_MATRIX\0"
-   "GL_TRANSPOSE_PROJECTION_MATRIX_ARB\0"
-   "GL_TRANSPOSE_TEXTURE_MATRIX\0"
-   "GL_TRANSPOSE_TEXTURE_MATRIX_ARB\0"
-   "GL_TRIANGLES\0"
-   "GL_TRIANGLES_ADJACENCY\0"
-   "GL_TRIANGLES_ADJACENCY_ARB\0"
-   "GL_TRIANGLE_FAN\0"
-   "GL_TRIANGLE_MESH_SUN\0"
-   "GL_TRIANGLE_STRIP\0"
-   "GL_TRIANGLE_STRIP_ADJACENCY\0"
-   "GL_TRIANGLE_STRIP_ADJACENCY_ARB\0"
-   "GL_TRUE\0"
-   "GL_UNDEFINED_APPLE\0"
-   "GL_UNPACK_ALIGNMENT\0"
-   "GL_UNPACK_IMAGE_HEIGHT\0"
-   "GL_UNPACK_LSB_FIRST\0"
-   "GL_UNPACK_ROW_LENGTH\0"
-   "GL_UNPACK_SKIP_IMAGES\0"
-   "GL_UNPACK_SKIP_PIXELS\0"
-   "GL_UNPACK_SKIP_ROWS\0"
-   "GL_UNPACK_SWAP_BYTES\0"
-   "GL_UNSIGNALED\0"
-   "GL_UNSIGNED_BYTE\0"
-   "GL_UNSIGNED_BYTE_2_3_3_REV\0"
-   "GL_UNSIGNED_BYTE_3_3_2\0"
-   "GL_UNSIGNED_INT\0"
-   "GL_UNSIGNED_INT_10F_11F_11F_REV\0"
-   "GL_UNSIGNED_INT_10_10_10_2\0"
-   "GL_UNSIGNED_INT_10_10_10_2_OES\0"
-   "GL_UNSIGNED_INT_24_8\0"
-   "GL_UNSIGNED_INT_24_8_EXT\0"
-   "GL_UNSIGNED_INT_24_8_NV\0"
-   "GL_UNSIGNED_INT_24_8_OES\0"
-   "GL_UNSIGNED_INT_2_10_10_10_REV\0"
-   "GL_UNSIGNED_INT_2_10_10_10_REV_EXT\0"
-   "GL_UNSIGNED_INT_5_9_9_9_REV\0"
-   "GL_UNSIGNED_INT_8_8_8_8\0"
-   "GL_UNSIGNED_INT_8_8_8_8_REV\0"
-   "GL_UNSIGNED_INT_SAMPLER_1D\0"
-   "GL_UNSIGNED_INT_SAMPLER_1D_ARRAY\0"
-   "GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT\0"
-   "GL_UNSIGNED_INT_SAMPLER_1D_EXT\0"
-   "GL_UNSIGNED_INT_SAMPLER_2D\0"
-   "GL_UNSIGNED_INT_SAMPLER_2D_ARRAY\0"
-   "GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT\0"
-   "GL_UNSIGNED_INT_SAMPLER_2D_EXT\0"
-   "GL_UNSIGNED_INT_SAMPLER_2D_RECT\0"
-   "GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT\0"
-   "GL_UNSIGNED_INT_SAMPLER_3D\0"
-   "GL_UNSIGNED_INT_SAMPLER_3D_EXT\0"
-   "GL_UNSIGNED_INT_SAMPLER_BUFFER\0"
-   "GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT\0"
-   "GL_UNSIGNED_INT_SAMPLER_CUBE\0"
-   "GL_UNSIGNED_INT_SAMPLER_CUBE_EXT\0"
-   "GL_UNSIGNED_INT_VEC2\0"
-   "GL_UNSIGNED_INT_VEC2_EXT\0"
-   "GL_UNSIGNED_INT_VEC3\0"
-   "GL_UNSIGNED_INT_VEC3_EXT\0"
-   "GL_UNSIGNED_INT_VEC4\0"
-   "GL_UNSIGNED_INT_VEC4_EXT\0"
-   "GL_UNSIGNED_NORMALIZED\0"
-   "GL_UNSIGNED_SHORT\0"
-   "GL_UNSIGNED_SHORT_1_5_5_5_REV\0"
-   "GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT\0"
-   "GL_UNSIGNED_SHORT_4_4_4_4\0"
-   "GL_UNSIGNED_SHORT_4_4_4_4_REV\0"
-   "GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT\0"
-   "GL_UNSIGNED_SHORT_5_5_5_1\0"
-   "GL_UNSIGNED_SHORT_5_6_5\0"
-   "GL_UNSIGNED_SHORT_5_6_5_REV\0"
-   "GL_UNSIGNED_SHORT_8_8_APPLE\0"
-   "GL_UNSIGNED_SHORT_8_8_MESA\0"
-   "GL_UNSIGNED_SHORT_8_8_REV_APPLE\0"
-   "GL_UNSIGNED_SHORT_8_8_REV_MESA\0"
-   "GL_UPPER_LEFT\0"
-   "GL_V2F\0"
-   "GL_V3F\0"
-   "GL_VALIDATE_STATUS\0"
-   "GL_VENDOR\0"
-   "GL_VERSION\0"
-   "GL_VERTEX_ARRAY\0"
-   "GL_VERTEX_ARRAY_BINDING\0"
-   "GL_VERTEX_ARRAY_BINDING_APPLE\0"
-   "GL_VERTEX_ARRAY_BUFFER_BINDING\0"
-   "GL_VERTEX_ARRAY_BUFFER_BINDING_ARB\0"
-   "GL_VERTEX_ARRAY_POINTER\0"
-   "GL_VERTEX_ARRAY_SIZE\0"
-   "GL_VERTEX_ARRAY_STRIDE\0"
-   "GL_VERTEX_ARRAY_TYPE\0"
-   "GL_VERTEX_ATTRIB_ARRAY0_NV\0"
-   "GL_VERTEX_ATTRIB_ARRAY10_NV\0"
-   "GL_VERTEX_ATTRIB_ARRAY11_NV\0"
-   "GL_VERTEX_ATTRIB_ARRAY12_NV\0"
-   "GL_VERTEX_ATTRIB_ARRAY13_NV\0"
-   "GL_VERTEX_ATTRIB_ARRAY14_NV\0"
-   "GL_VERTEX_ATTRIB_ARRAY15_NV\0"
-   "GL_VERTEX_ATTRIB_ARRAY1_NV\0"
-   "GL_VERTEX_ATTRIB_ARRAY2_NV\0"
-   "GL_VERTEX_ATTRIB_ARRAY3_NV\0"
-   "GL_VERTEX_ATTRIB_ARRAY4_NV\0"
-   "GL_VERTEX_ATTRIB_ARRAY5_NV\0"
-   "GL_VERTEX_ATTRIB_ARRAY6_NV\0"
-   "GL_VERTEX_ATTRIB_ARRAY7_NV\0"
-   "GL_VERTEX_ATTRIB_ARRAY8_NV\0"
-   "GL_VERTEX_ATTRIB_ARRAY9_NV\0"
-   "GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING\0"
-   "GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB\0"
-   "GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB\0"
-   "GL_VERTEX_ATTRIB_ARRAY_ENABLED\0"
-   "GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB\0"
-   "GL_VERTEX_ATTRIB_ARRAY_INTEGER\0"
-   "GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT\0"
-   "GL_VERTEX_ATTRIB_ARRAY_NORMALIZED\0"
-   "GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB\0"
-   "GL_VERTEX_ATTRIB_ARRAY_POINTER\0"
-   "GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB\0"
-   "GL_VERTEX_ATTRIB_ARRAY_SIZE\0"
-   "GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB\0"
-   "GL_VERTEX_ATTRIB_ARRAY_STRIDE\0"
-   "GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB\0"
-   "GL_VERTEX_ATTRIB_ARRAY_TYPE\0"
-   "GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB\0"
-   "GL_VERTEX_BLEND_ARB\0"
-   "GL_VERTEX_PROGRAM_ARB\0"
-   "GL_VERTEX_PROGRAM_BINDING_NV\0"
-   "GL_VERTEX_PROGRAM_NV\0"
-   "GL_VERTEX_PROGRAM_POINT_SIZE\0"
-   "GL_VERTEX_PROGRAM_POINT_SIZE_ARB\0"
-   "GL_VERTEX_PROGRAM_POINT_SIZE_NV\0"
-   "GL_VERTEX_PROGRAM_TWO_SIDE\0"
-   "GL_VERTEX_PROGRAM_TWO_SIDE_ARB\0"
-   "GL_VERTEX_PROGRAM_TWO_SIDE_NV\0"
-   "GL_VERTEX_SHADER\0"
-   "GL_VERTEX_SHADER_ARB\0"
-   "GL_VERTEX_STATE_PROGRAM_NV\0"
-   "GL_VIEWPORT\0"
-   "GL_VIEWPORT_BIT\0"
-   "GL_VOLATILE_APPLE\0"
-   "GL_WAIT_FAILED\0"
-   "GL_WEIGHT_ARRAY_ARB\0"
-   "GL_WEIGHT_ARRAY_BUFFER_BINDING\0"
-   "GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB\0"
-   "GL_WEIGHT_ARRAY_BUFFER_BINDING_OES\0"
-   "GL_WEIGHT_ARRAY_OES\0"
-   "GL_WEIGHT_ARRAY_POINTER_ARB\0"
-   "GL_WEIGHT_ARRAY_POINTER_OES\0"
-   "GL_WEIGHT_ARRAY_SIZE_ARB\0"
-   "GL_WEIGHT_ARRAY_SIZE_OES\0"
-   "GL_WEIGHT_ARRAY_STRIDE_ARB\0"
-   "GL_WEIGHT_ARRAY_STRIDE_OES\0"
-   "GL_WEIGHT_ARRAY_TYPE_ARB\0"
-   "GL_WEIGHT_ARRAY_TYPE_OES\0"
-   "GL_WEIGHT_SUM_UNITY_ARB\0"
-   "GL_WRAP_BORDER_SUN\0"
-   "GL_WRITE_ONLY\0"
-   "GL_WRITE_ONLY_ARB\0"
-   "GL_WRITE_ONLY_OES\0"
-   "GL_XOR\0"
-   "GL_YCBCR_422_APPLE\0"
-   "GL_YCBCR_MESA\0"
-   "GL_ZERO\0"
-   "GL_ZOOM_X\0"
-   "GL_ZOOM_Y\0"
-   ;
-
-static const enum_elt all_enums[2295] =
-{
-   {     0, 0x00000600 }, /* GL_2D */
-   {     6, 0x00001407 }, /* GL_2_BYTES */
-   {    17, 0x00000601 }, /* GL_3D */
-   {    23, 0x00000602 }, /* GL_3D_COLOR */
-   {    35, 0x00000603 }, /* GL_3D_COLOR_TEXTURE */
-   {    55, 0x00001408 }, /* GL_3_BYTES */
-   {    66, 0x00000604 }, /* GL_4D_COLOR_TEXTURE */
-   {    86, 0x00001409 }, /* GL_4_BYTES */
-   {    97, 0x00000100 }, /* GL_ACCUM */
-   {   106, 0x00000D5B }, /* GL_ACCUM_ALPHA_BITS */
-   {   126, 0x00000D5A }, /* GL_ACCUM_BLUE_BITS */
-   {   145, 0x00000200 }, /* GL_ACCUM_BUFFER_BIT */
-   {   165, 0x00000B80 }, /* GL_ACCUM_CLEAR_VALUE */
-   {   186, 0x00000D59 }, /* GL_ACCUM_GREEN_BITS */
-   {   206, 0x00000D58 }, /* GL_ACCUM_RED_BITS */
-   {   224, 0x00008B89 }, /* GL_ACTIVE_ATTRIBUTES */
-   {   245, 0x00008B8A }, /* GL_ACTIVE_ATTRIBUTE_MAX_LENGTH */
-   {   276, 0x00008B8D }, /* GL_ACTIVE_PROGRAM_EXT */
-   {   298, 0x00008911 }, /* GL_ACTIVE_STENCIL_FACE_EXT */
-   {   325, 0x000084E0 }, /* GL_ACTIVE_TEXTURE */
-   {   343, 0x000084E0 }, /* GL_ACTIVE_TEXTURE_ARB */
-   {   365, 0x00008B86 }, /* GL_ACTIVE_UNIFORMS */
-   {   384, 0x00008B87 }, /* GL_ACTIVE_UNIFORM_MAX_LENGTH */
-   {   413, 0x000086A5 }, /* GL_ACTIVE_VERTEX_UNITS_ARB */
-   {   440, 0x00000104 }, /* GL_ADD */
-   {   447, 0x00008574 }, /* GL_ADD_SIGNED */
-   {   461, 0x00008574 }, /* GL_ADD_SIGNED_ARB */
-   {   479, 0x00008574 }, /* GL_ADD_SIGNED_EXT */
-   {   497, 0x0000846E }, /* GL_ALIASED_LINE_WIDTH_RANGE */
-   {   525, 0x0000846D }, /* GL_ALIASED_POINT_SIZE_RANGE */
-   {   553, 0x000FFFFF }, /* GL_ALL_ATTRIB_BITS */
-   {   572, 0xFFFFFFFF }, /* GL_ALL_CLIENT_ATTRIB_BITS */
-   {   598, 0x00001906 }, /* GL_ALPHA */
-   {   607, 0x0000803D }, /* GL_ALPHA12 */
-   {   618, 0x0000803D }, /* GL_ALPHA12_EXT */
-   {   633, 0x0000803E }, /* GL_ALPHA16 */
-   {   644, 0x00008D8A }, /* GL_ALPHA16I_EXT */
-   {   660, 0x00008D78 }, /* GL_ALPHA16UI_EXT */
-   {   677, 0x0000803E }, /* GL_ALPHA16_EXT */
-   {   692, 0x00008D84 }, /* GL_ALPHA32I_EXT */
-   {   708, 0x00008D72 }, /* GL_ALPHA32UI_EXT */
-   {   725, 0x0000803B }, /* GL_ALPHA4 */
-   {   735, 0x0000803B }, /* GL_ALPHA4_EXT */
-   {   749, 0x0000803C }, /* GL_ALPHA8 */
-   {   759, 0x00008D90 }, /* GL_ALPHA8I_EXT */
-   {   774, 0x00008D7E }, /* GL_ALPHA8UI_EXT */
-   {   790, 0x0000803C }, /* GL_ALPHA8_EXT */
-   {   804, 0x00000D1D }, /* GL_ALPHA_BIAS */
-   {   818, 0x00000D55 }, /* GL_ALPHA_BITS */
-   {   832, 0x00008D97 }, /* GL_ALPHA_INTEGER_EXT */
-   {   853, 0x00000D1C }, /* GL_ALPHA_SCALE */
-   {   868, 0x00000BC0 }, /* GL_ALPHA_TEST */
-   {   882, 0x00000BC1 }, /* GL_ALPHA_TEST_FUNC */
-   {   901, 0x00000BC2 }, /* GL_ALPHA_TEST_REF */
-   {   919, 0x0000911A }, /* GL_ALREADY_SIGNALED */
-   {   939, 0x00000207 }, /* GL_ALWAYS */
-   {   949, 0x00001200 }, /* GL_AMBIENT */
-   {   960, 0x00001602 }, /* GL_AMBIENT_AND_DIFFUSE */
-   {   983, 0x00001501 }, /* GL_AND */
-   {   990, 0x00001504 }, /* GL_AND_INVERTED */
-   {  1006, 0x00001502 }, /* GL_AND_REVERSE */
-   {  1021, 0x00008892 }, /* GL_ARRAY_BUFFER */
-   {  1037, 0x00008894 }, /* GL_ARRAY_BUFFER_BINDING */
-   {  1061, 0x00008894 }, /* GL_ARRAY_BUFFER_BINDING_ARB */
-   {  1089, 0x00008B85 }, /* GL_ATTACHED_SHADERS */
-   {  1109, 0x00008645 }, /* GL_ATTRIB_ARRAY_POINTER_NV */
-   {  1136, 0x00008623 }, /* GL_ATTRIB_ARRAY_SIZE_NV */
-   {  1160, 0x00008624 }, /* GL_ATTRIB_ARRAY_STRIDE_NV */
-   {  1186, 0x00008625 }, /* GL_ATTRIB_ARRAY_TYPE_NV */
-   {  1210, 0x00000BB0 }, /* GL_ATTRIB_STACK_DEPTH */
-   {  1232, 0x00000D80 }, /* GL_AUTO_NORMAL */
-   {  1247, 0x00000409 }, /* GL_AUX0 */
-   {  1255, 0x0000040A }, /* GL_AUX1 */
-   {  1263, 0x0000040B }, /* GL_AUX2 */
-   {  1271, 0x0000040C }, /* GL_AUX3 */
-   {  1279, 0x00000C00 }, /* GL_AUX_BUFFERS */
-   {  1294, 0x00000405 }, /* GL_BACK */
-   {  1302, 0x00000402 }, /* GL_BACK_LEFT */
-   {  1315, 0x00000403 }, /* GL_BACK_RIGHT */
-   {  1329, 0x000080E0 }, /* GL_BGR */
-   {  1336, 0x000080E1 }, /* GL_BGRA */
-   {  1344, 0x000080E1 }, /* GL_BGRA_EXT */
-   {  1356, 0x00008D9B }, /* GL_BGRA_INTEGER */
-   {  1372, 0x00008D9B }, /* GL_BGRA_INTEGER_EXT */
-   {  1392, 0x00008D9A }, /* GL_BGR_INTEGER */
-   {  1407, 0x00008D9A }, /* GL_BGR_INTEGER_EXT */
-   {  1426, 0x00001A00 }, /* GL_BITMAP */
-   {  1436, 0x00000704 }, /* GL_BITMAP_TOKEN */
-   {  1452, 0x00000BE2 }, /* GL_BLEND */
-   {  1461, 0x00008005 }, /* GL_BLEND_COLOR */
-   {  1476, 0x00008005 }, /* GL_BLEND_COLOR_EXT */
-   {  1495, 0x00000BE0 }, /* GL_BLEND_DST */
-   {  1508, 0x000080CA }, /* GL_BLEND_DST_ALPHA */
-   {  1527, 0x000080CA }, /* GL_BLEND_DST_ALPHA_OES */
-   {  1550, 0x000080C8 }, /* GL_BLEND_DST_RGB */
-   {  1567, 0x000080C8 }, /* GL_BLEND_DST_RGB_OES */
-   {  1588, 0x00008009 }, /* GL_BLEND_EQUATION */
-   {  1606, 0x0000883D }, /* GL_BLEND_EQUATION_ALPHA */
-   {  1630, 0x0000883D }, /* GL_BLEND_EQUATION_ALPHA_EXT */
-   {  1658, 0x0000883D }, /* GL_BLEND_EQUATION_ALPHA_OES */
-   {  1686, 0x00008009 }, /* GL_BLEND_EQUATION_EXT */
-   {  1708, 0x00008009 }, /* GL_BLEND_EQUATION_OES */
-   {  1730, 0x00008009 }, /* GL_BLEND_EQUATION_RGB */
-   {  1752, 0x00008009 }, /* GL_BLEND_EQUATION_RGB_EXT */
-   {  1778, 0x00008009 }, /* GL_BLEND_EQUATION_RGB_OES */
-   {  1804, 0x00000BE1 }, /* GL_BLEND_SRC */
-   {  1817, 0x000080CB }, /* GL_BLEND_SRC_ALPHA */
-   {  1836, 0x000080CB }, /* GL_BLEND_SRC_ALPHA_OES */
-   {  1859, 0x000080C9 }, /* GL_BLEND_SRC_RGB */
-   {  1876, 0x000080C9 }, /* GL_BLEND_SRC_RGB_OES */
-   {  1897, 0x00001905 }, /* GL_BLUE */
-   {  1905, 0x00000D1B }, /* GL_BLUE_BIAS */
-   {  1918, 0x00000D54 }, /* GL_BLUE_BITS */
-   {  1931, 0x00008D96 }, /* GL_BLUE_INTEGER */
-   {  1947, 0x00008D96 }, /* GL_BLUE_INTEGER_EXT */
-   {  1967, 0x00000D1A }, /* GL_BLUE_SCALE */
-   {  1981, 0x00008B56 }, /* GL_BOOL */
-   {  1989, 0x00008B56 }, /* GL_BOOL_ARB */
-   {  2001, 0x00008B57 }, /* GL_BOOL_VEC2 */
-   {  2014, 0x00008B57 }, /* GL_BOOL_VEC2_ARB */
-   {  2031, 0x00008B58 }, /* GL_BOOL_VEC3 */
-   {  2044, 0x00008B58 }, /* GL_BOOL_VEC3_ARB */
-   {  2061, 0x00008B59 }, /* GL_BOOL_VEC4 */
-   {  2074, 0x00008B59 }, /* GL_BOOL_VEC4_ARB */
-   {  2091, 0x000088BB }, /* GL_BUFFER_ACCESS */
-   {  2108, 0x000088BB }, /* GL_BUFFER_ACCESS_ARB */
-   {  2129, 0x0000911F }, /* GL_BUFFER_ACCESS_FLAGS */
-   {  2152, 0x000088BB }, /* GL_BUFFER_ACCESS_OES */
-   {  2173, 0x00008A13 }, /* GL_BUFFER_FLUSHING_UNMAP_APPLE */
-   {  2204, 0x000088BC }, /* GL_BUFFER_MAPPED */
-   {  2221, 0x000088BC }, /* GL_BUFFER_MAPPED_ARB */
-   {  2242, 0x000088BC }, /* GL_BUFFER_MAPPED_OES */
-   {  2263, 0x00009120 }, /* GL_BUFFER_MAP_LENGTH */
-   {  2284, 0x00009121 }, /* GL_BUFFER_MAP_OFFSET */
-   {  2305, 0x000088BD }, /* GL_BUFFER_MAP_POINTER */
-   {  2327, 0x000088BD }, /* GL_BUFFER_MAP_POINTER_ARB */
-   {  2353, 0x000088BD }, /* GL_BUFFER_MAP_POINTER_OES */
-   {  2379, 0x000085B3 }, /* GL_BUFFER_OBJECT_APPLE */
-   {  2402, 0x00008A12 }, /* GL_BUFFER_SERIALIZED_MODIFY_APPLE */
-   {  2436, 0x00008764 }, /* GL_BUFFER_SIZE */
-   {  2451, 0x00008764 }, /* GL_BUFFER_SIZE_ARB */
-   {  2470, 0x00008765 }, /* GL_BUFFER_USAGE */
-   {  2486, 0x00008765 }, /* GL_BUFFER_USAGE_ARB */
-   {  2506, 0x0000877B }, /* GL_BUMP_ENVMAP_ATI */
-   {  2525, 0x00008777 }, /* GL_BUMP_NUM_TEX_UNITS_ATI */
-   {  2551, 0x00008775 }, /* GL_BUMP_ROT_MATRIX_ATI */
-   {  2574, 0x00008776 }, /* GL_BUMP_ROT_MATRIX_SIZE_ATI */
-   {  2602, 0x0000877C }, /* GL_BUMP_TARGET_ATI */
-   {  2621, 0x00008778 }, /* GL_BUMP_TEX_UNITS_ATI */
-   {  2643, 0x00001400 }, /* GL_BYTE */
-   {  2651, 0x00002A24 }, /* GL_C3F_V3F */
-   {  2662, 0x00002A26 }, /* GL_C4F_N3F_V3F */
-   {  2677, 0x00002A22 }, /* GL_C4UB_V2F */
-   {  2689, 0x00002A23 }, /* GL_C4UB_V3F */
-   {  2701, 0x00000901 }, /* GL_CCW */
-   {  2708, 0x00002900 }, /* GL_CLAMP */
-   {  2717, 0x0000891C }, /* GL_CLAMP_READ_COLOR */
-   {  2737, 0x0000812D }, /* GL_CLAMP_TO_BORDER */
-   {  2756, 0x0000812D }, /* GL_CLAMP_TO_BORDER_ARB */
-   {  2779, 0x0000812D }, /* GL_CLAMP_TO_BORDER_SGIS */
-   {  2803, 0x0000812F }, /* GL_CLAMP_TO_EDGE */
-   {  2820, 0x0000812F }, /* GL_CLAMP_TO_EDGE_SGIS */
-   {  2842, 0x00001500 }, /* GL_CLEAR */
-   {  2851, 0x000084E1 }, /* GL_CLIENT_ACTIVE_TEXTURE */
-   {  2876, 0x000084E1 }, /* GL_CLIENT_ACTIVE_TEXTURE_ARB */
-   {  2905, 0xFFFFFFFF }, /* GL_CLIENT_ALL_ATTRIB_BITS */
-   {  2931, 0x00000BB1 }, /* GL_CLIENT_ATTRIB_STACK_DEPTH */
-   {  2960, 0x00000001 }, /* GL_CLIENT_PIXEL_STORE_BIT */
-   {  2986, 0x00000002 }, /* GL_CLIENT_VERTEX_ARRAY_BIT */
-   {  3013, 0x00003000 }, /* GL_CLIP_DISTANCE0 */
-   {  3031, 0x00003001 }, /* GL_CLIP_DISTANCE1 */
-   {  3049, 0x00003002 }, /* GL_CLIP_DISTANCE2 */
-   {  3067, 0x00003003 }, /* GL_CLIP_DISTANCE3 */
-   {  3085, 0x00003004 }, /* GL_CLIP_DISTANCE4 */
-   {  3103, 0x00003005 }, /* GL_CLIP_DISTANCE5 */
-   {  3121, 0x00003006 }, /* GL_CLIP_DISTANCE6 */
-   {  3139, 0x00003007 }, /* GL_CLIP_DISTANCE7 */
-   {  3157, 0x00003000 }, /* GL_CLIP_PLANE0 */
-   {  3172, 0x00003001 }, /* GL_CLIP_PLANE1 */
-   {  3187, 0x00003002 }, /* GL_CLIP_PLANE2 */
-   {  3202, 0x00003003 }, /* GL_CLIP_PLANE3 */
-   {  3217, 0x00003004 }, /* GL_CLIP_PLANE4 */
-   {  3232, 0x00003005 }, /* GL_CLIP_PLANE5 */
-   {  3247, 0x000080F0 }, /* GL_CLIP_VOLUME_CLIPPING_HINT_EXT */
-   {  3280, 0x00000A00 }, /* GL_COEFF */
-   {  3289, 0x00001800 }, /* GL_COLOR */
-   {  3298, 0x00008076 }, /* GL_COLOR_ARRAY */
-   {  3313, 0x00008898 }, /* GL_COLOR_ARRAY_BUFFER_BINDING */
-   {  3343, 0x00008898 }, /* GL_COLOR_ARRAY_BUFFER_BINDING_ARB */
-   {  3377, 0x00008090 }, /* GL_COLOR_ARRAY_POINTER */
-   {  3400, 0x00008081 }, /* GL_COLOR_ARRAY_SIZE */
-   {  3420, 0x00008083 }, /* GL_COLOR_ARRAY_STRIDE */
-   {  3442, 0x00008082 }, /* GL_COLOR_ARRAY_TYPE */
-   {  3462, 0x00008CE0 }, /* GL_COLOR_ATTACHMENT0 */
-   {  3483, 0x00008CE0 }, /* GL_COLOR_ATTACHMENT0_EXT */
-   {  3508, 0x00008CE0 }, /* GL_COLOR_ATTACHMENT0_OES */
-   {  3533, 0x00008CE1 }, /* GL_COLOR_ATTACHMENT1 */
-   {  3554, 0x00008CEA }, /* GL_COLOR_ATTACHMENT10 */
-   {  3576, 0x00008CEA }, /* GL_COLOR_ATTACHMENT10_EXT */
-   {  3602, 0x00008CEB }, /* GL_COLOR_ATTACHMENT11 */
-   {  3624, 0x00008CEB }, /* GL_COLOR_ATTACHMENT11_EXT */
-   {  3650, 0x00008CEC }, /* GL_COLOR_ATTACHMENT12 */
-   {  3672, 0x00008CEC }, /* GL_COLOR_ATTACHMENT12_EXT */
-   {  3698, 0x00008CED }, /* GL_COLOR_ATTACHMENT13 */
-   {  3720, 0x00008CED }, /* GL_COLOR_ATTACHMENT13_EXT */
-   {  3746, 0x00008CEE }, /* GL_COLOR_ATTACHMENT14 */
-   {  3768, 0x00008CEE }, /* GL_COLOR_ATTACHMENT14_EXT */
-   {  3794, 0x00008CEF }, /* GL_COLOR_ATTACHMENT15 */
-   {  3816, 0x00008CEF }, /* GL_COLOR_ATTACHMENT15_EXT */
-   {  3842, 0x00008CE1 }, /* GL_COLOR_ATTACHMENT1_EXT */
-   {  3867, 0x00008CE2 }, /* GL_COLOR_ATTACHMENT2 */
-   {  3888, 0x00008CE2 }, /* GL_COLOR_ATTACHMENT2_EXT */
-   {  3913, 0x00008CE3 }, /* GL_COLOR_ATTACHMENT3 */
-   {  3934, 0x00008CE3 }, /* GL_COLOR_ATTACHMENT3_EXT */
-   {  3959, 0x00008CE4 }, /* GL_COLOR_ATTACHMENT4 */
-   {  3980, 0x00008CE4 }, /* GL_COLOR_ATTACHMENT4_EXT */
-   {  4005, 0x00008CE5 }, /* GL_COLOR_ATTACHMENT5 */
-   {  4026, 0x00008CE5 }, /* GL_COLOR_ATTACHMENT5_EXT */
-   {  4051, 0x00008CE6 }, /* GL_COLOR_ATTACHMENT6 */
-   {  4072, 0x00008CE6 }, /* GL_COLOR_ATTACHMENT6_EXT */
-   {  4097, 0x00008CE7 }, /* GL_COLOR_ATTACHMENT7 */
-   {  4118, 0x00008CE7 }, /* GL_COLOR_ATTACHMENT7_EXT */
-   {  4143, 0x00008CE8 }, /* GL_COLOR_ATTACHMENT8 */
-   {  4164, 0x00008CE8 }, /* GL_COLOR_ATTACHMENT8_EXT */
-   {  4189, 0x00008CE9 }, /* GL_COLOR_ATTACHMENT9 */
-   {  4210, 0x00008CE9 }, /* GL_COLOR_ATTACHMENT9_EXT */
-   {  4235, 0x00004000 }, /* GL_COLOR_BUFFER_BIT */
-   {  4255, 0x00000C22 }, /* GL_COLOR_CLEAR_VALUE */
-   {  4276, 0x00001900 }, /* GL_COLOR_INDEX */
-   {  4291, 0x00001603 }, /* GL_COLOR_INDEXES */
-   {  4308, 0x00000BF2 }, /* GL_COLOR_LOGIC_OP */
-   {  4326, 0x00000B57 }, /* GL_COLOR_MATERIAL */
-   {  4344, 0x00000B55 }, /* GL_COLOR_MATERIAL_FACE */
-   {  4367, 0x00000B56 }, /* GL_COLOR_MATERIAL_PARAMETER */
-   {  4395, 0x000080B1 }, /* GL_COLOR_MATRIX */
-   {  4411, 0x000080B1 }, /* GL_COLOR_MATRIX_SGI */
-   {  4431, 0x000080B2 }, /* GL_COLOR_MATRIX_STACK_DEPTH */
-   {  4459, 0x000080B2 }, /* GL_COLOR_MATRIX_STACK_DEPTH_SGI */
-   {  4491, 0x00008458 }, /* GL_COLOR_SUM */
-   {  4504, 0x00008458 }, /* GL_COLOR_SUM_ARB */
-   {  4521, 0x000080D0 }, /* GL_COLOR_TABLE */
-   {  4536, 0x000080DD }, /* GL_COLOR_TABLE_ALPHA_SIZE */
-   {  4562, 0x000080DD }, /* GL_COLOR_TABLE_ALPHA_SIZE_EXT */
-   {  4592, 0x000080DD }, /* GL_COLOR_TABLE_ALPHA_SIZE_SGI */
-   {  4622, 0x000080D7 }, /* GL_COLOR_TABLE_BIAS */
-   {  4642, 0x000080D7 }, /* GL_COLOR_TABLE_BIAS_SGI */
-   {  4666, 0x000080DC }, /* GL_COLOR_TABLE_BLUE_SIZE */
-   {  4691, 0x000080DC }, /* GL_COLOR_TABLE_BLUE_SIZE_EXT */
-   {  4720, 0x000080DC }, /* GL_COLOR_TABLE_BLUE_SIZE_SGI */
-   {  4749, 0x000080D8 }, /* GL_COLOR_TABLE_FORMAT */
-   {  4771, 0x000080D8 }, /* GL_COLOR_TABLE_FORMAT_EXT */
-   {  4797, 0x000080D8 }, /* GL_COLOR_TABLE_FORMAT_SGI */
-   {  4823, 0x000080DB }, /* GL_COLOR_TABLE_GREEN_SIZE */
-   {  4849, 0x000080DB }, /* GL_COLOR_TABLE_GREEN_SIZE_EXT */
-   {  4879, 0x000080DB }, /* GL_COLOR_TABLE_GREEN_SIZE_SGI */
-   {  4909, 0x000080DF }, /* GL_COLOR_TABLE_INTENSITY_SIZE */
-   {  4939, 0x000080DF }, /* GL_COLOR_TABLE_INTENSITY_SIZE_EXT */
-   {  4973, 0x000080DF }, /* GL_COLOR_TABLE_INTENSITY_SIZE_SGI */
-   {  5007, 0x000080DE }, /* GL_COLOR_TABLE_LUMINANCE_SIZE */
-   {  5037, 0x000080DE }, /* GL_COLOR_TABLE_LUMINANCE_SIZE_EXT */
-   {  5071, 0x000080DE }, /* GL_COLOR_TABLE_LUMINANCE_SIZE_SGI */
-   {  5105, 0x000080DA }, /* GL_COLOR_TABLE_RED_SIZE */
-   {  5129, 0x000080DA }, /* GL_COLOR_TABLE_RED_SIZE_EXT */
-   {  5157, 0x000080DA }, /* GL_COLOR_TABLE_RED_SIZE_SGI */
-   {  5185, 0x000080D6 }, /* GL_COLOR_TABLE_SCALE */
-   {  5206, 0x000080D6 }, /* GL_COLOR_TABLE_SCALE_SGI */
-   {  5231, 0x000080D9 }, /* GL_COLOR_TABLE_WIDTH */
-   {  5252, 0x000080D9 }, /* GL_COLOR_TABLE_WIDTH_EXT */
-   {  5277, 0x000080D9 }, /* GL_COLOR_TABLE_WIDTH_SGI */
-   {  5302, 0x00000C23 }, /* GL_COLOR_WRITEMASK */
-   {  5321, 0x00008570 }, /* GL_COMBINE */
-   {  5332, 0x00008503 }, /* GL_COMBINE4 */
-   {  5344, 0x00008572 }, /* GL_COMBINE_ALPHA */
-   {  5361, 0x00008572 }, /* GL_COMBINE_ALPHA_ARB */
-   {  5382, 0x00008572 }, /* GL_COMBINE_ALPHA_EXT */
-   {  5403, 0x00008570 }, /* GL_COMBINE_ARB */
-   {  5418, 0x00008570 }, /* GL_COMBINE_EXT */
-   {  5433, 0x00008571 }, /* GL_COMBINE_RGB */
-   {  5448, 0x00008571 }, /* GL_COMBINE_RGB_ARB */
-   {  5467, 0x00008571 }, /* GL_COMBINE_RGB_EXT */
-   {  5486, 0x0000884E }, /* GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT */
-   {  5522, 0x0000884E }, /* GL_COMPARE_REF_TO_TEXTURE */
-   {  5548, 0x0000884E }, /* GL_COMPARE_R_TO_TEXTURE */
-   {  5572, 0x0000884E }, /* GL_COMPARE_R_TO_TEXTURE_ARB */
-   {  5600, 0x00001300 }, /* GL_COMPILE */
-   {  5611, 0x00001301 }, /* GL_COMPILE_AND_EXECUTE */
-   {  5634, 0x00008B81 }, /* GL_COMPILE_STATUS */
-   {  5652, 0x000084E9 }, /* GL_COMPRESSED_ALPHA */
-   {  5672, 0x000084E9 }, /* GL_COMPRESSED_ALPHA_ARB */
-   {  5696, 0x000084EC }, /* GL_COMPRESSED_INTENSITY */
-   {  5720, 0x000084EC }, /* GL_COMPRESSED_INTENSITY_ARB */
-   {  5748, 0x000084EA }, /* GL_COMPRESSED_LUMINANCE */
-   {  5772, 0x000084EB }, /* GL_COMPRESSED_LUMINANCE_ALPHA */
-   {  5802, 0x000084EB }, /* GL_COMPRESSED_LUMINANCE_ALPHA_ARB */
-   {  5836, 0x000084EA }, /* GL_COMPRESSED_LUMINANCE_ARB */
-   {  5864, 0x00008225 }, /* GL_COMPRESSED_RED */
-   {  5882, 0x00008226 }, /* GL_COMPRESSED_RG */
-   {  5899, 0x000084ED }, /* GL_COMPRESSED_RGB */
-   {  5917, 0x000084EE }, /* GL_COMPRESSED_RGBA */
-   {  5936, 0x000084EE }, /* GL_COMPRESSED_RGBA_ARB */
-   {  5959, 0x000086B1 }, /* GL_COMPRESSED_RGBA_FXT1_3DFX */
-   {  5988, 0x000083F1 }, /* GL_COMPRESSED_RGBA_S3TC_DXT1_EXT */
-   {  6021, 0x000083F2 }, /* GL_COMPRESSED_RGBA_S3TC_DXT3_EXT */
-   {  6054, 0x000083F3 }, /* GL_COMPRESSED_RGBA_S3TC_DXT5_EXT */
-   {  6087, 0x000084ED }, /* GL_COMPRESSED_RGB_ARB */
-   {  6109, 0x000086B0 }, /* GL_COMPRESSED_RGB_FXT1_3DFX */
-   {  6137, 0x000083F0 }, /* GL_COMPRESSED_RGB_S3TC_DXT1_EXT */
-   {  6169, 0x00008C4A }, /* GL_COMPRESSED_SLUMINANCE */
-   {  6194, 0x00008C4B }, /* GL_COMPRESSED_SLUMINANCE_ALPHA */
-   {  6225, 0x00008C48 }, /* GL_COMPRESSED_SRGB */
-   {  6244, 0x00008C49 }, /* GL_COMPRESSED_SRGB_ALPHA */
-   {  6269, 0x000086A3 }, /* GL_COMPRESSED_TEXTURE_FORMATS */
-   {  6299, 0x0000911C }, /* GL_CONDITION_SATISFIED */
-   {  6322, 0x00008576 }, /* GL_CONSTANT */
-   {  6334, 0x00008003 }, /* GL_CONSTANT_ALPHA */
-   {  6352, 0x00008003 }, /* GL_CONSTANT_ALPHA_EXT */
-   {  6374, 0x00008576 }, /* GL_CONSTANT_ARB */
-   {  6390, 0x00001207 }, /* GL_CONSTANT_ATTENUATION */
-   {  6414, 0x00008151 }, /* GL_CONSTANT_BORDER_HP */
-   {  6436, 0x00008001 }, /* GL_CONSTANT_COLOR */
-   {  6454, 0x00008001 }, /* GL_CONSTANT_COLOR_EXT */
-   {  6476, 0x00008576 }, /* GL_CONSTANT_EXT */
-   {  6492, 0x00000002 }, /* GL_CONTEXT_COMPATIBILITY_PROFILE_BIT */
-   {  6529, 0x00000001 }, /* GL_CONTEXT_CORE_PROFILE_BIT */
-   {  6557, 0x0000821E }, /* GL_CONTEXT_FLAGS */
-   {  6574, 0x00000001 }, /* GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT */
-   {  6613, 0x00009126 }, /* GL_CONTEXT_PROFILE_MASK */
-   {  6637, 0x00008010 }, /* GL_CONVOLUTION_1D */
-   {  6655, 0x00008011 }, /* GL_CONVOLUTION_2D */
-   {  6673, 0x00008154 }, /* GL_CONVOLUTION_BORDER_COLOR */
-   {  6701, 0x00008154 }, /* GL_CONVOLUTION_BORDER_COLOR_HP */
-   {  6732, 0x00008013 }, /* GL_CONVOLUTION_BORDER_MODE */
-   {  6759, 0x00008013 }, /* GL_CONVOLUTION_BORDER_MODE_EXT */
-   {  6790, 0x00008015 }, /* GL_CONVOLUTION_FILTER_BIAS */
-   {  6817, 0x00008015 }, /* GL_CONVOLUTION_FILTER_BIAS_EXT */
-   {  6848, 0x00008014 }, /* GL_CONVOLUTION_FILTER_SCALE */
-   {  6876, 0x00008014 }, /* GL_CONVOLUTION_FILTER_SCALE_EXT */
-   {  6908, 0x00008017 }, /* GL_CONVOLUTION_FORMAT */
-   {  6930, 0x00008017 }, /* GL_CONVOLUTION_FORMAT_EXT */
-   {  6956, 0x00008019 }, /* GL_CONVOLUTION_HEIGHT */
-   {  6978, 0x00008019 }, /* GL_CONVOLUTION_HEIGHT_EXT */
-   {  7004, 0x00008018 }, /* GL_CONVOLUTION_WIDTH */
-   {  7025, 0x00008018 }, /* GL_CONVOLUTION_WIDTH_EXT */
-   {  7050, 0x00008862 }, /* GL_COORD_REPLACE */
-   {  7067, 0x00008862 }, /* GL_COORD_REPLACE_ARB */
-   {  7088, 0x00008862 }, /* GL_COORD_REPLACE_NV */
-   {  7108, 0x00008862 }, /* GL_COORD_REPLACE_OES */
-   {  7129, 0x00001503 }, /* GL_COPY */
-   {  7137, 0x0000150C }, /* GL_COPY_INVERTED */
-   {  7154, 0x00000706 }, /* GL_COPY_PIXEL_TOKEN */
-   {  7174, 0x00008F36 }, /* GL_COPY_READ_BUFFER */
-   {  7194, 0x00008F37 }, /* GL_COPY_WRITE_BUFFER */
-   {  7215, 0x00000B44 }, /* GL_CULL_FACE */
-   {  7228, 0x00000B45 }, /* GL_CULL_FACE_MODE */
-   {  7246, 0x000081AA }, /* GL_CULL_VERTEX_EXT */
-   {  7265, 0x000081AC }, /* GL_CULL_VERTEX_EYE_POSITION_EXT */
-   {  7297, 0x000081AB }, /* GL_CULL_VERTEX_OBJECT_POSITION_EXT */
-   {  7332, 0x00008626 }, /* GL_CURRENT_ATTRIB_NV */
-   {  7353, 0x00000001 }, /* GL_CURRENT_BIT */
-   {  7368, 0x00000B00 }, /* GL_CURRENT_COLOR */
-   {  7385, 0x00008453 }, /* GL_CURRENT_FOG_COORD */
-   {  7406, 0x00008453 }, /* GL_CURRENT_FOG_COORDINATE */
-   {  7432, 0x00000B01 }, /* GL_CURRENT_INDEX */
-   {  7449, 0x00008641 }, /* GL_CURRENT_MATRIX_ARB */
-   {  7471, 0x00008845 }, /* GL_CURRENT_MATRIX_INDEX_ARB */
-   {  7499, 0x00008641 }, /* GL_CURRENT_MATRIX_NV */
-   {  7520, 0x00008640 }, /* GL_CURRENT_MATRIX_STACK_DEPTH_ARB */
-   {  7554, 0x00008640 }, /* GL_CURRENT_MATRIX_STACK_DEPTH_NV */
-   {  7587, 0x00000B02 }, /* GL_CURRENT_NORMAL */
-   {  7605, 0x00008843 }, /* GL_CURRENT_PALETTE_MATRIX_ARB */
-   {  7635, 0x00008843 }, /* GL_CURRENT_PALETTE_MATRIX_OES */
-   {  7665, 0x00008B8D }, /* GL_CURRENT_PROGRAM */
-   {  7684, 0x00008865 }, /* GL_CURRENT_QUERY */
-   {  7701, 0x00008865 }, /* GL_CURRENT_QUERY_ARB */
-   {  7722, 0x00000B04 }, /* GL_CURRENT_RASTER_COLOR */
-   {  7746, 0x00000B09 }, /* GL_CURRENT_RASTER_DISTANCE */
-   {  7773, 0x00000B05 }, /* GL_CURRENT_RASTER_INDEX */
-   {  7797, 0x00000B07 }, /* GL_CURRENT_RASTER_POSITION */
-   {  7824, 0x00000B08 }, /* GL_CURRENT_RASTER_POSITION_VALID */
-   {  7857, 0x0000845F }, /* GL_CURRENT_RASTER_SECONDARY_COLOR */
-   {  7891, 0x00000B06 }, /* GL_CURRENT_RASTER_TEXTURE_COORDS */
-   {  7924, 0x00008459 }, /* GL_CURRENT_SECONDARY_COLOR */
-   {  7951, 0x00000B03 }, /* GL_CURRENT_TEXTURE_COORDS */
-   {  7977, 0x00008626 }, /* GL_CURRENT_VERTEX_ATTRIB */
-   {  8002, 0x00008626 }, /* GL_CURRENT_VERTEX_ATTRIB_ARB */
-   {  8031, 0x000086A8 }, /* GL_CURRENT_WEIGHT_ARB */
-   {  8053, 0x00000900 }, /* GL_CW */
-   {  8059, 0x0000875B }, /* GL_DEBUG_ASSERT_MESA */
-   {  8080, 0x00008759 }, /* GL_DEBUG_OBJECT_MESA */
-   {  8101, 0x0000875A }, /* GL_DEBUG_PRINT_MESA */
-   {  8121, 0x00002101 }, /* GL_DECAL */
-   {  8130, 0x00001E03 }, /* GL_DECR */
-   {  8138, 0x00008508 }, /* GL_DECR_WRAP */
-   {  8151, 0x00008508 }, /* GL_DECR_WRAP_EXT */
-   {  8168, 0x00008B80 }, /* GL_DELETE_STATUS */
-   {  8185, 0x00001801 }, /* GL_DEPTH */
-   {  8194, 0x000088F0 }, /* GL_DEPTH24_STENCIL8 */
-   {  8214, 0x000088F0 }, /* GL_DEPTH24_STENCIL8_EXT */
-   {  8238, 0x000088F0 }, /* GL_DEPTH24_STENCIL8_OES */
-   {  8262, 0x00008D00 }, /* GL_DEPTH_ATTACHMENT */
-   {  8282, 0x00008D00 }, /* GL_DEPTH_ATTACHMENT_EXT */
-   {  8306, 0x00008D00 }, /* GL_DEPTH_ATTACHMENT_OES */
-   {  8330, 0x00000D1F }, /* GL_DEPTH_BIAS */
-   {  8344, 0x00000D56 }, /* GL_DEPTH_BITS */
-   {  8358, 0x00008891 }, /* GL_DEPTH_BOUNDS_EXT */
-   {  8378, 0x00008890 }, /* GL_DEPTH_BOUNDS_TEST_EXT */
-   {  8403, 0x00008223 }, /* GL_DEPTH_BUFFER */
-   {  8419, 0x00000100 }, /* GL_DEPTH_BUFFER_BIT */
-   {  8439, 0x0000864F }, /* GL_DEPTH_CLAMP */
-   {  8454, 0x0000864F }, /* GL_DEPTH_CLAMP_NV */
-   {  8472, 0x00000B73 }, /* GL_DEPTH_CLEAR_VALUE */
-   {  8493, 0x00001902 }, /* GL_DEPTH_COMPONENT */
-   {  8512, 0x000081A5 }, /* GL_DEPTH_COMPONENT16 */
-   {  8533, 0x000081A5 }, /* GL_DEPTH_COMPONENT16_ARB */
-   {  8558, 0x000081A5 }, /* GL_DEPTH_COMPONENT16_OES */
-   {  8583, 0x000081A5 }, /* GL_DEPTH_COMPONENT16_SGIX */
-   {  8609, 0x000081A6 }, /* GL_DEPTH_COMPONENT24 */
-   {  8630, 0x000081A6 }, /* GL_DEPTH_COMPONENT24_ARB */
-   {  8655, 0x000081A6 }, /* GL_DEPTH_COMPONENT24_OES */
-   {  8680, 0x000081A6 }, /* GL_DEPTH_COMPONENT24_SGIX */
-   {  8706, 0x000081A7 }, /* GL_DEPTH_COMPONENT32 */
-   {  8727, 0x000081A7 }, /* GL_DEPTH_COMPONENT32_ARB */
-   {  8752, 0x000081A7 }, /* GL_DEPTH_COMPONENT32_OES */
-   {  8777, 0x000081A7 }, /* GL_DEPTH_COMPONENT32_SGIX */
-   {  8803, 0x00000B74 }, /* GL_DEPTH_FUNC */
-   {  8817, 0x00000B70 }, /* GL_DEPTH_RANGE */
-   {  8832, 0x00000D1E }, /* GL_DEPTH_SCALE */
-   {  8847, 0x000084F9 }, /* GL_DEPTH_STENCIL */
-   {  8864, 0x0000821A }, /* GL_DEPTH_STENCIL_ATTACHMENT */
-   {  8892, 0x000084F9 }, /* GL_DEPTH_STENCIL_EXT */
-   {  8913, 0x000084F9 }, /* GL_DEPTH_STENCIL_NV */
-   {  8933, 0x000084F9 }, /* GL_DEPTH_STENCIL_OES */
-   {  8954, 0x0000886F }, /* GL_DEPTH_STENCIL_TO_BGRA_NV */
-   {  8982, 0x0000886E }, /* GL_DEPTH_STENCIL_TO_RGBA_NV */
-   {  9010, 0x00000B71 }, /* GL_DEPTH_TEST */
-   {  9024, 0x0000884B }, /* GL_DEPTH_TEXTURE_MODE */
-   {  9046, 0x0000884B }, /* GL_DEPTH_TEXTURE_MODE_ARB */
-   {  9072, 0x00000B72 }, /* GL_DEPTH_WRITEMASK */
-   {  9091, 0x00001201 }, /* GL_DIFFUSE */
-   {  9102, 0x00000BD0 }, /* GL_DITHER */
-   {  9112, 0x00000A02 }, /* GL_DOMAIN */
-   {  9122, 0x00001100 }, /* GL_DONT_CARE */
-   {  9135, 0x000086AE }, /* GL_DOT3_RGB */
-   {  9147, 0x000086AF }, /* GL_DOT3_RGBA */
-   {  9160, 0x000086AF }, /* GL_DOT3_RGBA_ARB */
-   {  9177, 0x00008741 }, /* GL_DOT3_RGBA_EXT */
-   {  9194, 0x000086AE }, /* GL_DOT3_RGB_ARB */
-   {  9210, 0x00008740 }, /* GL_DOT3_RGB_EXT */
-   {  9226, 0x0000140A }, /* GL_DOUBLE */
-   {  9236, 0x00000C32 }, /* GL_DOUBLEBUFFER */
-   {  9252, 0x00000C01 }, /* GL_DRAW_BUFFER */
-   {  9267, 0x00008825 }, /* GL_DRAW_BUFFER0 */
-   {  9283, 0x00008825 }, /* GL_DRAW_BUFFER0_ARB */
-   {  9303, 0x00008825 }, /* GL_DRAW_BUFFER0_ATI */
-   {  9323, 0x00008826 }, /* GL_DRAW_BUFFER1 */
-   {  9339, 0x0000882F }, /* GL_DRAW_BUFFER10 */
-   {  9356, 0x0000882F }, /* GL_DRAW_BUFFER10_ARB */
-   {  9377, 0x0000882F }, /* GL_DRAW_BUFFER10_ATI */
-   {  9398, 0x00008830 }, /* GL_DRAW_BUFFER11 */
-   {  9415, 0x00008830 }, /* GL_DRAW_BUFFER11_ARB */
-   {  9436, 0x00008830 }, /* GL_DRAW_BUFFER11_ATI */
-   {  9457, 0x00008831 }, /* GL_DRAW_BUFFER12 */
-   {  9474, 0x00008831 }, /* GL_DRAW_BUFFER12_ARB */
-   {  9495, 0x00008831 }, /* GL_DRAW_BUFFER12_ATI */
-   {  9516, 0x00008832 }, /* GL_DRAW_BUFFER13 */
-   {  9533, 0x00008832 }, /* GL_DRAW_BUFFER13_ARB */
-   {  9554, 0x00008832 }, /* GL_DRAW_BUFFER13_ATI */
-   {  9575, 0x00008833 }, /* GL_DRAW_BUFFER14 */
-   {  9592, 0x00008833 }, /* GL_DRAW_BUFFER14_ARB */
-   {  9613, 0x00008833 }, /* GL_DRAW_BUFFER14_ATI */
-   {  9634, 0x00008834 }, /* GL_DRAW_BUFFER15 */
-   {  9651, 0x00008834 }, /* GL_DRAW_BUFFER15_ARB */
-   {  9672, 0x00008834 }, /* GL_DRAW_BUFFER15_ATI */
-   {  9693, 0x00008826 }, /* GL_DRAW_BUFFER1_ARB */
-   {  9713, 0x00008826 }, /* GL_DRAW_BUFFER1_ATI */
-   {  9733, 0x00008827 }, /* GL_DRAW_BUFFER2 */
-   {  9749, 0x00008827 }, /* GL_DRAW_BUFFER2_ARB */
-   {  9769, 0x00008827 }, /* GL_DRAW_BUFFER2_ATI */
-   {  9789, 0x00008828 }, /* GL_DRAW_BUFFER3 */
-   {  9805, 0x00008828 }, /* GL_DRAW_BUFFER3_ARB */
-   {  9825, 0x00008828 }, /* GL_DRAW_BUFFER3_ATI */
-   {  9845, 0x00008829 }, /* GL_DRAW_BUFFER4 */
-   {  9861, 0x00008829 }, /* GL_DRAW_BUFFER4_ARB */
-   {  9881, 0x00008829 }, /* GL_DRAW_BUFFER4_ATI */
-   {  9901, 0x0000882A }, /* GL_DRAW_BUFFER5 */
-   {  9917, 0x0000882A }, /* GL_DRAW_BUFFER5_ARB */
-   {  9937, 0x0000882A }, /* GL_DRAW_BUFFER5_ATI */
-   {  9957, 0x0000882B }, /* GL_DRAW_BUFFER6 */
-   {  9973, 0x0000882B }, /* GL_DRAW_BUFFER6_ARB */
-   {  9993, 0x0000882B }, /* GL_DRAW_BUFFER6_ATI */
-   { 10013, 0x0000882C }, /* GL_DRAW_BUFFER7 */
-   { 10029, 0x0000882C }, /* GL_DRAW_BUFFER7_ARB */
-   { 10049, 0x0000882C }, /* GL_DRAW_BUFFER7_ATI */
-   { 10069, 0x0000882D }, /* GL_DRAW_BUFFER8 */
-   { 10085, 0x0000882D }, /* GL_DRAW_BUFFER8_ARB */
-   { 10105, 0x0000882D }, /* GL_DRAW_BUFFER8_ATI */
-   { 10125, 0x0000882E }, /* GL_DRAW_BUFFER9 */
-   { 10141, 0x0000882E }, /* GL_DRAW_BUFFER9_ARB */
-   { 10161, 0x0000882E }, /* GL_DRAW_BUFFER9_ATI */
-   { 10181, 0x00008CA9 }, /* GL_DRAW_FRAMEBUFFER */
-   { 10201, 0x00008CA6 }, /* GL_DRAW_FRAMEBUFFER_BINDING */
-   { 10229, 0x00008CA6 }, /* GL_DRAW_FRAMEBUFFER_BINDING_EXT */
-   { 10261, 0x00008CA9 }, /* GL_DRAW_FRAMEBUFFER_EXT */
-   { 10285, 0x00000705 }, /* GL_DRAW_PIXEL_TOKEN */
-   { 10305, 0x00000304 }, /* GL_DST_ALPHA */
-   { 10318, 0x00000306 }, /* GL_DST_COLOR */
-   { 10331, 0x0000877A }, /* GL_DU8DV8_ATI */
-   { 10345, 0x00008779 }, /* GL_DUDV_ATI */
-   { 10357, 0x000088EA }, /* GL_DYNAMIC_COPY */
-   { 10373, 0x000088EA }, /* GL_DYNAMIC_COPY_ARB */
-   { 10393, 0x000088E8 }, /* GL_DYNAMIC_DRAW */
-   { 10409, 0x000088E8 }, /* GL_DYNAMIC_DRAW_ARB */
-   { 10429, 0x000088E9 }, /* GL_DYNAMIC_READ */
-   { 10445, 0x000088E9 }, /* GL_DYNAMIC_READ_ARB */
-   { 10465, 0x00000B43 }, /* GL_EDGE_FLAG */
-   { 10478, 0x00008079 }, /* GL_EDGE_FLAG_ARRAY */
-   { 10497, 0x0000889B }, /* GL_EDGE_FLAG_ARRAY_BUFFER_BINDING */
-   { 10531, 0x0000889B }, /* GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB */
-   { 10569, 0x00008093 }, /* GL_EDGE_FLAG_ARRAY_POINTER */
-   { 10596, 0x0000808C }, /* GL_EDGE_FLAG_ARRAY_STRIDE */
-   { 10622, 0x00008893 }, /* GL_ELEMENT_ARRAY_BUFFER */
-   { 10646, 0x00008895 }, /* GL_ELEMENT_ARRAY_BUFFER_BINDING */
-   { 10678, 0x00008895 }, /* GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB */
-   { 10714, 0x00001600 }, /* GL_EMISSION */
-   { 10726, 0x00002000 }, /* GL_ENABLE_BIT */
-   { 10740, 0x00000202 }, /* GL_EQUAL */
-   { 10749, 0x00001509 }, /* GL_EQUIV */
-   { 10758, 0x00010000 }, /* GL_EVAL_BIT */
-   { 10770, 0x00000800 }, /* GL_EXP */
-   { 10777, 0x00000801 }, /* GL_EXP2 */
-   { 10785, 0x00001F03 }, /* GL_EXTENSIONS */
-   { 10799, 0x00002400 }, /* GL_EYE_LINEAR */
-   { 10813, 0x00002502 }, /* GL_EYE_PLANE */
-   { 10826, 0x0000855C }, /* GL_EYE_PLANE_ABSOLUTE_NV */
-   { 10851, 0x0000855B }, /* GL_EYE_RADIAL_NV */
-   { 10868, 0x00000000 }, /* GL_FALSE */
-   { 10877, 0x00001101 }, /* GL_FASTEST */
-   { 10888, 0x00001C01 }, /* GL_FEEDBACK */
-   { 10900, 0x00000DF0 }, /* GL_FEEDBACK_BUFFER_POINTER */
-   { 10927, 0x00000DF1 }, /* GL_FEEDBACK_BUFFER_SIZE */
-   { 10951, 0x00000DF2 }, /* GL_FEEDBACK_BUFFER_TYPE */
-   { 10975, 0x00001B02 }, /* GL_FILL */
-   { 10983, 0x00008E4D }, /* GL_FIRST_VERTEX_CONVENTION */
-   { 11010, 0x00008E4D }, /* GL_FIRST_VERTEX_CONVENTION_EXT */
-   { 11041, 0x0000140C }, /* GL_FIXED */
-   { 11050, 0x0000140C }, /* GL_FIXED_OES */
-   { 11063, 0x0000891D }, /* GL_FIXED_ONLY */
-   { 11077, 0x00001D00 }, /* GL_FLAT */
-   { 11085, 0x00001406 }, /* GL_FLOAT */
-   { 11094, 0x00008B5A }, /* GL_FLOAT_MAT2 */
-   { 11108, 0x00008B5A }, /* GL_FLOAT_MAT2_ARB */
-   { 11126, 0x00008B65 }, /* GL_FLOAT_MAT2x3 */
-   { 11142, 0x00008B66 }, /* GL_FLOAT_MAT2x4 */
-   { 11158, 0x00008B5B }, /* GL_FLOAT_MAT3 */
-   { 11172, 0x00008B5B }, /* GL_FLOAT_MAT3_ARB */
-   { 11190, 0x00008B67 }, /* GL_FLOAT_MAT3x2 */
-   { 11206, 0x00008B68 }, /* GL_FLOAT_MAT3x4 */
-   { 11222, 0x00008B5C }, /* GL_FLOAT_MAT4 */
-   { 11236, 0x00008B5C }, /* GL_FLOAT_MAT4_ARB */
-   { 11254, 0x00008B69 }, /* GL_FLOAT_MAT4x2 */
-   { 11270, 0x00008B6A }, /* GL_FLOAT_MAT4x3 */
-   { 11286, 0x00008B50 }, /* GL_FLOAT_VEC2 */
-   { 11300, 0x00008B50 }, /* GL_FLOAT_VEC2_ARB */
-   { 11318, 0x00008B51 }, /* GL_FLOAT_VEC3 */
-   { 11332, 0x00008B51 }, /* GL_FLOAT_VEC3_ARB */
-   { 11350, 0x00008B52 }, /* GL_FLOAT_VEC4 */
-   { 11364, 0x00008B52 }, /* GL_FLOAT_VEC4_ARB */
-   { 11382, 0x00000B60 }, /* GL_FOG */
-   { 11389, 0x00000080 }, /* GL_FOG_BIT */
-   { 11400, 0x00000B66 }, /* GL_FOG_COLOR */
-   { 11413, 0x00008451 }, /* GL_FOG_COORD */
-   { 11426, 0x00008451 }, /* GL_FOG_COORDINATE */
-   { 11444, 0x00008457 }, /* GL_FOG_COORDINATE_ARRAY */
-   { 11468, 0x0000889D }, /* GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING */
-   { 11507, 0x0000889D }, /* GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB */
-   { 11550, 0x00008456 }, /* GL_FOG_COORDINATE_ARRAY_POINTER */
-   { 11582, 0x00008455 }, /* GL_FOG_COORDINATE_ARRAY_STRIDE */
-   { 11613, 0x00008454 }, /* GL_FOG_COORDINATE_ARRAY_TYPE */
-   { 11642, 0x00008450 }, /* GL_FOG_COORDINATE_SOURCE */
-   { 11667, 0x00008457 }, /* GL_FOG_COORD_ARRAY */
-   { 11686, 0x0000889D }, /* GL_FOG_COORD_ARRAY_BUFFER_BINDING */
-   { 11720, 0x00008456 }, /* GL_FOG_COORD_ARRAY_POINTER */
-   { 11747, 0x00008455 }, /* GL_FOG_COORD_ARRAY_STRIDE */
-   { 11773, 0x00008454 }, /* GL_FOG_COORD_ARRAY_TYPE */
-   { 11797, 0x00008450 }, /* GL_FOG_COORD_SRC */
-   { 11814, 0x00000B62 }, /* GL_FOG_DENSITY */
-   { 11829, 0x0000855A }, /* GL_FOG_DISTANCE_MODE_NV */
-   { 11853, 0x00000B64 }, /* GL_FOG_END */
-   { 11864, 0x00000C54 }, /* GL_FOG_HINT */
-   { 11876, 0x00000B61 }, /* GL_FOG_INDEX */
-   { 11889, 0x00000B65 }, /* GL_FOG_MODE */
-   { 11901, 0x00008198 }, /* GL_FOG_OFFSET_SGIX */
-   { 11920, 0x00008199 }, /* GL_FOG_OFFSET_VALUE_SGIX */
-   { 11945, 0x00000B63 }, /* GL_FOG_START */
-   { 11958, 0x00008452 }, /* GL_FRAGMENT_DEPTH */
-   { 11976, 0x00008804 }, /* GL_FRAGMENT_PROGRAM_ARB */
-   { 12000, 0x00008B30 }, /* GL_FRAGMENT_SHADER */
-   { 12019, 0x00008B30 }, /* GL_FRAGMENT_SHADER_ARB */
-   { 12042, 0x00008B8B }, /* GL_FRAGMENT_SHADER_DERIVATIVE_HINT */
-   { 12077, 0x00008B8B }, /* GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES */
-   { 12116, 0x00008D40 }, /* GL_FRAMEBUFFER */
-   { 12131, 0x00008215 }, /* GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE */
-   { 12168, 0x00008214 }, /* GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE */
-   { 12204, 0x00008210 }, /* GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING */
-   { 12245, 0x00008211 }, /* GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE */
-   { 12286, 0x00008216 }, /* GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE */
-   { 12323, 0x00008213 }, /* GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE */
-   { 12360, 0x00008DA7 }, /* GL_FRAMEBUFFER_ATTACHMENT_LAYERED */
-   { 12394, 0x00008DA7 }, /* GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB */
-   { 12432, 0x00008CD1 }, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME */
-   { 12470, 0x00008CD1 }, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT */
-   { 12512, 0x00008CD1 }, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES */
-   { 12554, 0x00008CD0 }, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE */
-   { 12592, 0x00008CD0 }, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT */
-   { 12634, 0x00008CD0 }, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES */
-   { 12676, 0x00008212 }, /* GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE */
-   { 12711, 0x00008217 }, /* GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE */
-   { 12750, 0x00008CD4 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT */
-   { 12799, 0x00008CD4 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES */
-   { 12848, 0x00008CD3 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE */
-   { 12896, 0x00008CD3 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT */
-   { 12948, 0x00008CD3 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_OES */
-   { 13000, 0x00008CD4 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER */
-   { 13040, 0x00008CD4 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT */
-   { 13084, 0x00008CD2 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL */
-   { 13124, 0x00008CD2 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT */
-   { 13168, 0x00008CD2 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_OES */
-   { 13212, 0x00008CA6 }, /* GL_FRAMEBUFFER_BINDING */
-   { 13235, 0x00008CA6 }, /* GL_FRAMEBUFFER_BINDING_EXT */
-   { 13262, 0x00008CA6 }, /* GL_FRAMEBUFFER_BINDING_OES */
-   { 13289, 0x00008CD5 }, /* GL_FRAMEBUFFER_COMPLETE */
-   { 13313, 0x00008CD5 }, /* GL_FRAMEBUFFER_COMPLETE_EXT */
-   { 13341, 0x00008CD5 }, /* GL_FRAMEBUFFER_COMPLETE_OES */
-   { 13369, 0x00008218 }, /* GL_FRAMEBUFFER_DEFAULT */
-   { 13392, 0x00008D40 }, /* GL_FRAMEBUFFER_EXT */
-   { 13411, 0x00008CD6 }, /* GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT */
-   { 13448, 0x00008CD6 }, /* GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT */
-   { 13489, 0x00008CD6 }, /* GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES */
-   { 13530, 0x00008CD9 }, /* GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS */
-   { 13567, 0x00008CD9 }, /* GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT */
-   { 13608, 0x00008CD9 }, /* GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES */
-   { 13649, 0x00008CDB }, /* GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER */
-   { 13687, 0x00008CDB }, /* GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT */
-   { 13729, 0x00008CDB }, /* GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_OES */
-   { 13771, 0x00008CD8 }, /* GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT */
-   { 13822, 0x00008CDA }, /* GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT */
-   { 13860, 0x00008CDA }, /* GL_FRAMEBUFFER_INCOMPLETE_FORMATS_OES */
-   { 13898, 0x00008DA9 }, /* GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB */
-   { 13940, 0x00008DA8 }, /* GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS */
-   { 13980, 0x00008DA8 }, /* GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB */
-   { 14024, 0x00008CD7 }, /* GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT */
-   { 14069, 0x00008CD7 }, /* GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT */
-   { 14118, 0x00008CD7 }, /* GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES */
-   { 14167, 0x00008D56 }, /* GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE */
-   { 14205, 0x00008D56 }, /* GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT */
-   { 14247, 0x00008CDC }, /* GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER */
-   { 14285, 0x00008CDC }, /* GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT */
-   { 14327, 0x00008CDC }, /* GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_OES */
-   { 14369, 0x00008D40 }, /* GL_FRAMEBUFFER_OES */
-   { 14388, 0x00008CDE }, /* GL_FRAMEBUFFER_STATUS_ERROR_EXT */
-   { 14420, 0x00008219 }, /* GL_FRAMEBUFFER_UNDEFINED */
-   { 14445, 0x00008CDD }, /* GL_FRAMEBUFFER_UNSUPPORTED */
-   { 14472, 0x00008CDD }, /* GL_FRAMEBUFFER_UNSUPPORTED_EXT */
-   { 14503, 0x00008CDD }, /* GL_FRAMEBUFFER_UNSUPPORTED_OES */
-   { 14534, 0x00000404 }, /* GL_FRONT */
-   { 14543, 0x00000408 }, /* GL_FRONT_AND_BACK */
-   { 14561, 0x00000B46 }, /* GL_FRONT_FACE */
-   { 14575, 0x00000400 }, /* GL_FRONT_LEFT */
-   { 14589, 0x00000401 }, /* GL_FRONT_RIGHT */
-   { 14604, 0x00008006 }, /* GL_FUNC_ADD */
-   { 14616, 0x00008006 }, /* GL_FUNC_ADD_EXT */
-   { 14632, 0x00008006 }, /* GL_FUNC_ADD_OES */
-   { 14648, 0x0000800B }, /* GL_FUNC_REVERSE_SUBTRACT */
-   { 14673, 0x0000800B }, /* GL_FUNC_REVERSE_SUBTRACT_EXT */
-   { 14702, 0x0000800B }, /* GL_FUNC_REVERSE_SUBTRACT_OES */
-   { 14731, 0x0000800A }, /* GL_FUNC_SUBTRACT */
-   { 14748, 0x0000800A }, /* GL_FUNC_SUBTRACT_EXT */
-   { 14769, 0x0000800A }, /* GL_FUNC_SUBTRACT_OES */
-   { 14790, 0x00008191 }, /* GL_GENERATE_MIPMAP */
-   { 14809, 0x00008192 }, /* GL_GENERATE_MIPMAP_HINT */
-   { 14833, 0x00008192 }, /* GL_GENERATE_MIPMAP_HINT_SGIS */
-   { 14862, 0x00008191 }, /* GL_GENERATE_MIPMAP_SGIS */
-   { 14886, 0x00008917 }, /* GL_GEOMETRY_INPUT_TYPE */
-   { 14909, 0x00008DDB }, /* GL_GEOMETRY_INPUT_TYPE_ARB */
-   { 14936, 0x00008918 }, /* GL_GEOMETRY_OUTPUT_TYPE */
-   { 14960, 0x00008DDC }, /* GL_GEOMETRY_OUTPUT_TYPE_ARB */
-   { 14988, 0x00008DD9 }, /* GL_GEOMETRY_SHADER */
-   { 15007, 0x00008DD9 }, /* GL_GEOMETRY_SHADER_ARB */
-   { 15030, 0x00008916 }, /* GL_GEOMETRY_VERTICES_OUT */
-   { 15055, 0x00008DDA }, /* GL_GEOMETRY_VERTICES_OUT_ARB */
-   { 15084, 0x00000206 }, /* GL_GEQUAL */
-   { 15094, 0x00000204 }, /* GL_GREATER */
-   { 15105, 0x00001904 }, /* GL_GREEN */
-   { 15114, 0x00000D19 }, /* GL_GREEN_BIAS */
-   { 15128, 0x00000D53 }, /* GL_GREEN_BITS */
-   { 15142, 0x00008D95 }, /* GL_GREEN_INTEGER */
-   { 15159, 0x00008D95 }, /* GL_GREEN_INTEGER_EXT */
-   { 15180, 0x00000D18 }, /* GL_GREEN_SCALE */
-   { 15195, 0x0000140B }, /* GL_HALF_FLOAT */
-   { 15209, 0x00008D61 }, /* GL_HALF_FLOAT_OES */
-   { 15227, 0x00008DF2 }, /* GL_HIGH_FLOAT */
-   { 15241, 0x00008DF5 }, /* GL_HIGH_INT */
-   { 15253, 0x00008000 }, /* GL_HINT_BIT */
-   { 15265, 0x00008024 }, /* GL_HISTOGRAM */
-   { 15278, 0x0000802B }, /* GL_HISTOGRAM_ALPHA_SIZE */
-   { 15302, 0x0000802B }, /* GL_HISTOGRAM_ALPHA_SIZE_EXT */
-   { 15330, 0x0000802A }, /* GL_HISTOGRAM_BLUE_SIZE */
-   { 15353, 0x0000802A }, /* GL_HISTOGRAM_BLUE_SIZE_EXT */
-   { 15380, 0x00008024 }, /* GL_HISTOGRAM_EXT */
-   { 15397, 0x00008027 }, /* GL_HISTOGRAM_FORMAT */
-   { 15417, 0x00008027 }, /* GL_HISTOGRAM_FORMAT_EXT */
-   { 15441, 0x00008029 }, /* GL_HISTOGRAM_GREEN_SIZE */
-   { 15465, 0x00008029 }, /* GL_HISTOGRAM_GREEN_SIZE_EXT */
-   { 15493, 0x0000802C }, /* GL_HISTOGRAM_LUMINANCE_SIZE */
-   { 15521, 0x0000802C }, /* GL_HISTOGRAM_LUMINANCE_SIZE_EXT */
-   { 15553, 0x00008028 }, /* GL_HISTOGRAM_RED_SIZE */
-   { 15575, 0x00008028 }, /* GL_HISTOGRAM_RED_SIZE_EXT */
-   { 15601, 0x0000802D }, /* GL_HISTOGRAM_SINK */
-   { 15619, 0x0000802D }, /* GL_HISTOGRAM_SINK_EXT */
-   { 15641, 0x00008026 }, /* GL_HISTOGRAM_WIDTH */
-   { 15660, 0x00008026 }, /* GL_HISTOGRAM_WIDTH_EXT */
-   { 15683, 0x0000862A }, /* GL_IDENTITY_NV */
-   { 15698, 0x00008150 }, /* GL_IGNORE_BORDER_HP */
-   { 15718, 0x00008B9B }, /* GL_IMPLEMENTATION_COLOR_READ_FORMAT */
-   { 15754, 0x00008B9B }, /* GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES */
-   { 15794, 0x00008B9A }, /* GL_IMPLEMENTATION_COLOR_READ_TYPE */
-   { 15828, 0x00008B9A }, /* GL_IMPLEMENTATION_COLOR_READ_TYPE_OES */
-   { 15866, 0x00001E02 }, /* GL_INCR */
-   { 15874, 0x00008507 }, /* GL_INCR_WRAP */
-   { 15887, 0x00008507 }, /* GL_INCR_WRAP_EXT */
-   { 15904, 0x00008222 }, /* GL_INDEX */
-   { 15913, 0x00008077 }, /* GL_INDEX_ARRAY */
-   { 15928, 0x00008899 }, /* GL_INDEX_ARRAY_BUFFER_BINDING */
-   { 15958, 0x00008899 }, /* GL_INDEX_ARRAY_BUFFER_BINDING_ARB */
-   { 15992, 0x00008091 }, /* GL_INDEX_ARRAY_POINTER */
-   { 16015, 0x00008086 }, /* GL_INDEX_ARRAY_STRIDE */
-   { 16037, 0x00008085 }, /* GL_INDEX_ARRAY_TYPE */
-   { 16057, 0x00000D51 }, /* GL_INDEX_BITS */
-   { 16071, 0x00000C20 }, /* GL_INDEX_CLEAR_VALUE */
-   { 16092, 0x00000BF1 }, /* GL_INDEX_LOGIC_OP */
-   { 16110, 0x00000C30 }, /* GL_INDEX_MODE */
-   { 16124, 0x00000D13 }, /* GL_INDEX_OFFSET */
-   { 16140, 0x00000D12 }, /* GL_INDEX_SHIFT */
-   { 16155, 0x00000C21 }, /* GL_INDEX_WRITEMASK */
-   { 16174, 0x00008B84 }, /* GL_INFO_LOG_LENGTH */
-   { 16193, 0x00001404 }, /* GL_INT */
-   { 16200, 0x00008049 }, /* GL_INTENSITY */
-   { 16213, 0x0000804C }, /* GL_INTENSITY12 */
-   { 16228, 0x0000804C }, /* GL_INTENSITY12_EXT */
-   { 16247, 0x0000804D }, /* GL_INTENSITY16 */
-   { 16262, 0x00008D8B }, /* GL_INTENSITY16I_EXT */
-   { 16282, 0x00008D79 }, /* GL_INTENSITY16UI_EXT */
-   { 16303, 0x0000804D }, /* GL_INTENSITY16_EXT */
-   { 16322, 0x00008D85 }, /* GL_INTENSITY32I_EXT */
-   { 16342, 0x00008D73 }, /* GL_INTENSITY32UI_EXT */
-   { 16363, 0x0000804A }, /* GL_INTENSITY4 */
-   { 16377, 0x0000804A }, /* GL_INTENSITY4_EXT */
-   { 16395, 0x0000804B }, /* GL_INTENSITY8 */
-   { 16409, 0x00008D91 }, /* GL_INTENSITY8I_EXT */
-   { 16428, 0x00008D7F }, /* GL_INTENSITY8UI_EXT */
-   { 16448, 0x0000804B }, /* GL_INTENSITY8_EXT */
-   { 16466, 0x00008049 }, /* GL_INTENSITY_EXT */
-   { 16483, 0x00008C8C }, /* GL_INTERLEAVED_ATTRIBS */
-   { 16506, 0x00008C8C }, /* GL_INTERLEAVED_ATTRIBS_EXT */
-   { 16533, 0x00008575 }, /* GL_INTERPOLATE */
-   { 16548, 0x00008575 }, /* GL_INTERPOLATE_ARB */
-   { 16567, 0x00008575 }, /* GL_INTERPOLATE_EXT */
-   { 16586, 0x00008DF7 }, /* GL_INT_10_10_10_2_OES */
-   { 16608, 0x00008DC9 }, /* GL_INT_SAMPLER_1D */
-   { 16626, 0x00008DCE }, /* GL_INT_SAMPLER_1D_ARRAY */
-   { 16650, 0x00008DCE }, /* GL_INT_SAMPLER_1D_ARRAY_EXT */
-   { 16678, 0x00008DC9 }, /* GL_INT_SAMPLER_1D_EXT */
-   { 16700, 0x00008DCA }, /* GL_INT_SAMPLER_2D */
-   { 16718, 0x00008DCF }, /* GL_INT_SAMPLER_2D_ARRAY */
-   { 16742, 0x00008DCF }, /* GL_INT_SAMPLER_2D_ARRAY_EXT */
-   { 16770, 0x00008DCA }, /* GL_INT_SAMPLER_2D_EXT */
-   { 16792, 0x00008DCD }, /* GL_INT_SAMPLER_2D_RECT */
-   { 16815, 0x00008DCD }, /* GL_INT_SAMPLER_2D_RECT_EXT */
-   { 16842, 0x00008DCB }, /* GL_INT_SAMPLER_3D */
-   { 16860, 0x00008DCB }, /* GL_INT_SAMPLER_3D_EXT */
-   { 16882, 0x00008DD0 }, /* GL_INT_SAMPLER_BUFFER */
-   { 16904, 0x00008DD0 }, /* GL_INT_SAMPLER_BUFFER_EXT */
-   { 16930, 0x00008DCC }, /* GL_INT_SAMPLER_CUBE */
-   { 16950, 0x00008DCC }, /* GL_INT_SAMPLER_CUBE_EXT */
-   { 16974, 0x00008B53 }, /* GL_INT_VEC2 */
-   { 16986, 0x00008B53 }, /* GL_INT_VEC2_ARB */
-   { 17002, 0x00008B54 }, /* GL_INT_VEC3 */
-   { 17014, 0x00008B54 }, /* GL_INT_VEC3_ARB */
-   { 17030, 0x00008B55 }, /* GL_INT_VEC4 */
-   { 17042, 0x00008B55 }, /* GL_INT_VEC4_ARB */
-   { 17058, 0x00000500 }, /* GL_INVALID_ENUM */
-   { 17074, 0x00000506 }, /* GL_INVALID_FRAMEBUFFER_OPERATION */
-   { 17107, 0x00000506 }, /* GL_INVALID_FRAMEBUFFER_OPERATION_EXT */
-   { 17144, 0x00000506 }, /* GL_INVALID_FRAMEBUFFER_OPERATION_OES */
-   { 17181, 0x00000502 }, /* GL_INVALID_OPERATION */
-   { 17202, 0x00000501 }, /* GL_INVALID_VALUE */
-   { 17219, 0x0000862B }, /* GL_INVERSE_NV */
-   { 17233, 0x0000862D }, /* GL_INVERSE_TRANSPOSE_NV */
-   { 17257, 0x0000150A }, /* GL_INVERT */
-   { 17267, 0x00001E00 }, /* GL_KEEP */
-   { 17275, 0x00008E4E }, /* GL_LAST_VERTEX_CONVENTION */
-   { 17301, 0x00008E4E }, /* GL_LAST_VERTEX_CONVENTION_EXT */
-   { 17331, 0x00000406 }, /* GL_LEFT */
-   { 17339, 0x00000203 }, /* GL_LEQUAL */
-   { 17349, 0x00000201 }, /* GL_LESS */
-   { 17357, 0x00004000 }, /* GL_LIGHT0 */
-   { 17367, 0x00004001 }, /* GL_LIGHT1 */
-   { 17377, 0x00004002 }, /* GL_LIGHT2 */
-   { 17387, 0x00004003 }, /* GL_LIGHT3 */
-   { 17397, 0x00004004 }, /* GL_LIGHT4 */
-   { 17407, 0x00004005 }, /* GL_LIGHT5 */
-   { 17417, 0x00004006 }, /* GL_LIGHT6 */
-   { 17427, 0x00004007 }, /* GL_LIGHT7 */
-   { 17437, 0x00000B50 }, /* GL_LIGHTING */
-   { 17449, 0x00000040 }, /* GL_LIGHTING_BIT */
-   { 17465, 0x00000B53 }, /* GL_LIGHT_MODEL_AMBIENT */
-   { 17488, 0x000081F8 }, /* GL_LIGHT_MODEL_COLOR_CONTROL */
-   { 17517, 0x000081F8 }, /* GL_LIGHT_MODEL_COLOR_CONTROL_EXT */
-   { 17550, 0x00000B51 }, /* GL_LIGHT_MODEL_LOCAL_VIEWER */
-   { 17578, 0x00000B52 }, /* GL_LIGHT_MODEL_TWO_SIDE */
-   { 17602, 0x00001B01 }, /* GL_LINE */
-   { 17610, 0x00002601 }, /* GL_LINEAR */
-   { 17620, 0x00001208 }, /* GL_LINEAR_ATTENUATION */
-   { 17642, 0x00008170 }, /* GL_LINEAR_CLIPMAP_LINEAR_SGIX */
-   { 17672, 0x0000844F }, /* GL_LINEAR_CLIPMAP_NEAREST_SGIX */
-   { 17703, 0x00002703 }, /* GL_LINEAR_MIPMAP_LINEAR */
-   { 17727, 0x00002701 }, /* GL_LINEAR_MIPMAP_NEAREST */
-   { 17752, 0x00000001 }, /* GL_LINES */
-   { 17761, 0x0000000A }, /* GL_LINES_ADJACENCY */
-   { 17780, 0x0000000A }, /* GL_LINES_ADJACENCY_ARB */
-   { 17803, 0x00000004 }, /* GL_LINE_BIT */
-   { 17815, 0x00000002 }, /* GL_LINE_LOOP */
-   { 17828, 0x00000707 }, /* GL_LINE_RESET_TOKEN */
-   { 17848, 0x00000B20 }, /* GL_LINE_SMOOTH */
-   { 17863, 0x00000C52 }, /* GL_LINE_SMOOTH_HINT */
-   { 17883, 0x00000B24 }, /* GL_LINE_STIPPLE */
-   { 17899, 0x00000B25 }, /* GL_LINE_STIPPLE_PATTERN */
-   { 17923, 0x00000B26 }, /* GL_LINE_STIPPLE_REPEAT */
-   { 17946, 0x00000003 }, /* GL_LINE_STRIP */
-   { 17960, 0x0000000B }, /* GL_LINE_STRIP_ADJACENCY */
-   { 17984, 0x0000000B }, /* GL_LINE_STRIP_ADJACENCY_ARB */
-   { 18012, 0x00000702 }, /* GL_LINE_TOKEN */
-   { 18026, 0x00000B21 }, /* GL_LINE_WIDTH */
-   { 18040, 0x00000B23 }, /* GL_LINE_WIDTH_GRANULARITY */
-   { 18066, 0x00000B22 }, /* GL_LINE_WIDTH_RANGE */
-   { 18086, 0x00008B82 }, /* GL_LINK_STATUS */
-   { 18101, 0x00000B32 }, /* GL_LIST_BASE */
-   { 18114, 0x00020000 }, /* GL_LIST_BIT */
-   { 18126, 0x00000B33 }, /* GL_LIST_INDEX */
-   { 18140, 0x00000B30 }, /* GL_LIST_MODE */
-   { 18153, 0x00000101 }, /* GL_LOAD */
-   { 18161, 0x00000BF1 }, /* GL_LOGIC_OP */
-   { 18173, 0x00000BF0 }, /* GL_LOGIC_OP_MODE */
-   { 18190, 0x00008CA1 }, /* GL_LOWER_LEFT */
-   { 18204, 0x00008DF0 }, /* GL_LOW_FLOAT */
-   { 18217, 0x00008DF3 }, /* GL_LOW_INT */
-   { 18228, 0x00001909 }, /* GL_LUMINANCE */
-   { 18241, 0x00008041 }, /* GL_LUMINANCE12 */
-   { 18256, 0x00008047 }, /* GL_LUMINANCE12_ALPHA12 */
-   { 18279, 0x00008047 }, /* GL_LUMINANCE12_ALPHA12_EXT */
-   { 18306, 0x00008046 }, /* GL_LUMINANCE12_ALPHA4 */
-   { 18328, 0x00008046 }, /* GL_LUMINANCE12_ALPHA4_EXT */
-   { 18354, 0x00008041 }, /* GL_LUMINANCE12_EXT */
-   { 18373, 0x00008042 }, /* GL_LUMINANCE16 */
-   { 18388, 0x00008D8C }, /* GL_LUMINANCE16I_EXT */
-   { 18408, 0x00008D7A }, /* GL_LUMINANCE16UI_EXT */
-   { 18429, 0x00008048 }, /* GL_LUMINANCE16_ALPHA16 */
-   { 18452, 0x00008048 }, /* GL_LUMINANCE16_ALPHA16_EXT */
-   { 18479, 0x00008042 }, /* GL_LUMINANCE16_EXT */
-   { 18498, 0x00008D86 }, /* GL_LUMINANCE32I_EXT */
-   { 18518, 0x00008D74 }, /* GL_LUMINANCE32UI_EXT */
-   { 18539, 0x0000803F }, /* GL_LUMINANCE4 */
-   { 18553, 0x00008043 }, /* GL_LUMINANCE4_ALPHA4 */
-   { 18574, 0x00008043 }, /* GL_LUMINANCE4_ALPHA4_EXT */
-   { 18599, 0x0000803F }, /* GL_LUMINANCE4_EXT */
-   { 18617, 0x00008044 }, /* GL_LUMINANCE6_ALPHA2 */
-   { 18638, 0x00008044 }, /* GL_LUMINANCE6_ALPHA2_EXT */
-   { 18663, 0x00008040 }, /* GL_LUMINANCE8 */
-   { 18677, 0x00008D92 }, /* GL_LUMINANCE8I_EXT */
-   { 18696, 0x00008D80 }, /* GL_LUMINANCE8UI_EXT */
-   { 18716, 0x00008045 }, /* GL_LUMINANCE8_ALPHA8 */
-   { 18737, 0x00008045 }, /* GL_LUMINANCE8_ALPHA8_EXT */
-   { 18762, 0x00008040 }, /* GL_LUMINANCE8_EXT */
-   { 18780, 0x0000190A }, /* GL_LUMINANCE_ALPHA */
-   { 18799, 0x00008D8D }, /* GL_LUMINANCE_ALPHA16I_EXT */
-   { 18825, 0x00008D7B }, /* GL_LUMINANCE_ALPHA16UI_EXT */
-   { 18852, 0x00008D87 }, /* GL_LUMINANCE_ALPHA32I_EXT */
-   { 18878, 0x00008D75 }, /* GL_LUMINANCE_ALPHA32UI_EXT */
-   { 18905, 0x00008D93 }, /* GL_LUMINANCE_ALPHA8I_EXT */
-   { 18930, 0x00008D81 }, /* GL_LUMINANCE_ALPHA8UI_EXT */
-   { 18956, 0x00008D9D }, /* GL_LUMINANCE_ALPHA_INTEGER_EXT */
-   { 18987, 0x00008D9C }, /* GL_LUMINANCE_INTEGER_EXT */
-   { 19012, 0x0000821B }, /* GL_MAJOR_VERSION */
-   { 19029, 0x00000D90 }, /* GL_MAP1_COLOR_4 */
-   { 19045, 0x00000DD0 }, /* GL_MAP1_GRID_DOMAIN */
-   { 19065, 0x00000DD1 }, /* GL_MAP1_GRID_SEGMENTS */
-   { 19087, 0x00000D91 }, /* GL_MAP1_INDEX */
-   { 19101, 0x00000D92 }, /* GL_MAP1_NORMAL */
-   { 19116, 0x00000D93 }, /* GL_MAP1_TEXTURE_COORD_1 */
-   { 19140, 0x00000D94 }, /* GL_MAP1_TEXTURE_COORD_2 */
-   { 19164, 0x00000D95 }, /* GL_MAP1_TEXTURE_COORD_3 */
-   { 19188, 0x00000D96 }, /* GL_MAP1_TEXTURE_COORD_4 */
-   { 19212, 0x00000D97 }, /* GL_MAP1_VERTEX_3 */
-   { 19229, 0x00000D98 }, /* GL_MAP1_VERTEX_4 */
-   { 19246, 0x00008660 }, /* GL_MAP1_VERTEX_ATTRIB0_4_NV */
-   { 19274, 0x0000866A }, /* GL_MAP1_VERTEX_ATTRIB10_4_NV */
-   { 19303, 0x0000866B }, /* GL_MAP1_VERTEX_ATTRIB11_4_NV */
-   { 19332, 0x0000866C }, /* GL_MAP1_VERTEX_ATTRIB12_4_NV */
-   { 19361, 0x0000866D }, /* GL_MAP1_VERTEX_ATTRIB13_4_NV */
-   { 19390, 0x0000866E }, /* GL_MAP1_VERTEX_ATTRIB14_4_NV */
-   { 19419, 0x0000866F }, /* GL_MAP1_VERTEX_ATTRIB15_4_NV */
-   { 19448, 0x00008661 }, /* GL_MAP1_VERTEX_ATTRIB1_4_NV */
-   { 19476, 0x00008662 }, /* GL_MAP1_VERTEX_ATTRIB2_4_NV */
-   { 19504, 0x00008663 }, /* GL_MAP1_VERTEX_ATTRIB3_4_NV */
-   { 19532, 0x00008664 }, /* GL_MAP1_VERTEX_ATTRIB4_4_NV */
-   { 19560, 0x00008665 }, /* GL_MAP1_VERTEX_ATTRIB5_4_NV */
-   { 19588, 0x00008666 }, /* GL_MAP1_VERTEX_ATTRIB6_4_NV */
-   { 19616, 0x00008667 }, /* GL_MAP1_VERTEX_ATTRIB7_4_NV */
-   { 19644, 0x00008668 }, /* GL_MAP1_VERTEX_ATTRIB8_4_NV */
-   { 19672, 0x00008669 }, /* GL_MAP1_VERTEX_ATTRIB9_4_NV */
-   { 19700, 0x00000DB0 }, /* GL_MAP2_COLOR_4 */
-   { 19716, 0x00000DD2 }, /* GL_MAP2_GRID_DOMAIN */
-   { 19736, 0x00000DD3 }, /* GL_MAP2_GRID_SEGMENTS */
-   { 19758, 0x00000DB1 }, /* GL_MAP2_INDEX */
-   { 19772, 0x00000DB2 }, /* GL_MAP2_NORMAL */
-   { 19787, 0x00000DB3 }, /* GL_MAP2_TEXTURE_COORD_1 */
-   { 19811, 0x00000DB4 }, /* GL_MAP2_TEXTURE_COORD_2 */
-   { 19835, 0x00000DB5 }, /* GL_MAP2_TEXTURE_COORD_3 */
-   { 19859, 0x00000DB6 }, /* GL_MAP2_TEXTURE_COORD_4 */
-   { 19883, 0x00000DB7 }, /* GL_MAP2_VERTEX_3 */
-   { 19900, 0x00000DB8 }, /* GL_MAP2_VERTEX_4 */
-   { 19917, 0x00008670 }, /* GL_MAP2_VERTEX_ATTRIB0_4_NV */
-   { 19945, 0x0000867A }, /* GL_MAP2_VERTEX_ATTRIB10_4_NV */
-   { 19974, 0x0000867B }, /* GL_MAP2_VERTEX_ATTRIB11_4_NV */
-   { 20003, 0x0000867C }, /* GL_MAP2_VERTEX_ATTRIB12_4_NV */
-   { 20032, 0x0000867D }, /* GL_MAP2_VERTEX_ATTRIB13_4_NV */
-   { 20061, 0x0000867E }, /* GL_MAP2_VERTEX_ATTRIB14_4_NV */
-   { 20090, 0x0000867F }, /* GL_MAP2_VERTEX_ATTRIB15_4_NV */
-   { 20119, 0x00008671 }, /* GL_MAP2_VERTEX_ATTRIB1_4_NV */
-   { 20147, 0x00008672 }, /* GL_MAP2_VERTEX_ATTRIB2_4_NV */
-   { 20175, 0x00008673 }, /* GL_MAP2_VERTEX_ATTRIB3_4_NV */
-   { 20203, 0x00008674 }, /* GL_MAP2_VERTEX_ATTRIB4_4_NV */
-   { 20231, 0x00008675 }, /* GL_MAP2_VERTEX_ATTRIB5_4_NV */
-   { 20259, 0x00008676 }, /* GL_MAP2_VERTEX_ATTRIB6_4_NV */
-   { 20287, 0x00008677 }, /* GL_MAP2_VERTEX_ATTRIB7_4_NV */
-   { 20315, 0x00008678 }, /* GL_MAP2_VERTEX_ATTRIB8_4_NV */
-   { 20343, 0x00008679 }, /* GL_MAP2_VERTEX_ATTRIB9_4_NV */
-   { 20371, 0x00000D10 }, /* GL_MAP_COLOR */
-   { 20384, 0x00000010 }, /* GL_MAP_FLUSH_EXPLICIT_BIT */
-   { 20410, 0x00000008 }, /* GL_MAP_INVALIDATE_BUFFER_BIT */
-   { 20439, 0x00000004 }, /* GL_MAP_INVALIDATE_RANGE_BIT */
-   { 20467, 0x00000001 }, /* GL_MAP_READ_BIT */
-   { 20483, 0x00000D11 }, /* GL_MAP_STENCIL */
-   { 20498, 0x00000020 }, /* GL_MAP_UNSYNCHRONIZED_BIT */
-   { 20524, 0x00000002 }, /* GL_MAP_WRITE_BIT */
-   { 20541, 0x000088C0 }, /* GL_MATRIX0_ARB */
-   { 20556, 0x00008630 }, /* GL_MATRIX0_NV */
-   { 20570, 0x000088CA }, /* GL_MATRIX10_ARB */
-   { 20586, 0x000088CB }, /* GL_MATRIX11_ARB */
-   { 20602, 0x000088CC }, /* GL_MATRIX12_ARB */
-   { 20618, 0x000088CD }, /* GL_MATRIX13_ARB */
-   { 20634, 0x000088CE }, /* GL_MATRIX14_ARB */
-   { 20650, 0x000088CF }, /* GL_MATRIX15_ARB */
-   { 20666, 0x000088D0 }, /* GL_MATRIX16_ARB */
-   { 20682, 0x000088D1 }, /* GL_MATRIX17_ARB */
-   { 20698, 0x000088D2 }, /* GL_MATRIX18_ARB */
-   { 20714, 0x000088D3 }, /* GL_MATRIX19_ARB */
-   { 20730, 0x000088C1 }, /* GL_MATRIX1_ARB */
-   { 20745, 0x00008631 }, /* GL_MATRIX1_NV */
-   { 20759, 0x000088D4 }, /* GL_MATRIX20_ARB */
-   { 20775, 0x000088D5 }, /* GL_MATRIX21_ARB */
-   { 20791, 0x000088D6 }, /* GL_MATRIX22_ARB */
-   { 20807, 0x000088D7 }, /* GL_MATRIX23_ARB */
-   { 20823, 0x000088D8 }, /* GL_MATRIX24_ARB */
-   { 20839, 0x000088D9 }, /* GL_MATRIX25_ARB */
-   { 20855, 0x000088DA }, /* GL_MATRIX26_ARB */
-   { 20871, 0x000088DB }, /* GL_MATRIX27_ARB */
-   { 20887, 0x000088DC }, /* GL_MATRIX28_ARB */
-   { 20903, 0x000088DD }, /* GL_MATRIX29_ARB */
-   { 20919, 0x000088C2 }, /* GL_MATRIX2_ARB */
-   { 20934, 0x00008632 }, /* GL_MATRIX2_NV */
-   { 20948, 0x000088DE }, /* GL_MATRIX30_ARB */
-   { 20964, 0x000088DF }, /* GL_MATRIX31_ARB */
-   { 20980, 0x000088C3 }, /* GL_MATRIX3_ARB */
-   { 20995, 0x00008633 }, /* GL_MATRIX3_NV */
-   { 21009, 0x000088C4 }, /* GL_MATRIX4_ARB */
-   { 21024, 0x00008634 }, /* GL_MATRIX4_NV */
-   { 21038, 0x000088C5 }, /* GL_MATRIX5_ARB */
-   { 21053, 0x00008635 }, /* GL_MATRIX5_NV */
-   { 21067, 0x000088C6 }, /* GL_MATRIX6_ARB */
-   { 21082, 0x00008636 }, /* GL_MATRIX6_NV */
-   { 21096, 0x000088C7 }, /* GL_MATRIX7_ARB */
-   { 21111, 0x00008637 }, /* GL_MATRIX7_NV */
-   { 21125, 0x000088C8 }, /* GL_MATRIX8_ARB */
-   { 21140, 0x000088C9 }, /* GL_MATRIX9_ARB */
-   { 21155, 0x00008844 }, /* GL_MATRIX_INDEX_ARRAY_ARB */
-   { 21181, 0x00008B9E }, /* GL_MATRIX_INDEX_ARRAY_BUFFER_BINDING_OES */
-   { 21222, 0x00008844 }, /* GL_MATRIX_INDEX_ARRAY_OES */
-   { 21248, 0x00008849 }, /* GL_MATRIX_INDEX_ARRAY_POINTER_ARB */
-   { 21282, 0x00008849 }, /* GL_MATRIX_INDEX_ARRAY_POINTER_OES */
-   { 21316, 0x00008846 }, /* GL_MATRIX_INDEX_ARRAY_SIZE_ARB */
-   { 21347, 0x00008846 }, /* GL_MATRIX_INDEX_ARRAY_SIZE_OES */
-   { 21378, 0x00008848 }, /* GL_MATRIX_INDEX_ARRAY_STRIDE_ARB */
-   { 21411, 0x00008848 }, /* GL_MATRIX_INDEX_ARRAY_STRIDE_OES */
-   { 21444, 0x00008847 }, /* GL_MATRIX_INDEX_ARRAY_TYPE_ARB */
-   { 21475, 0x00008847 }, /* GL_MATRIX_INDEX_ARRAY_TYPE_OES */
-   { 21506, 0x00000BA0 }, /* GL_MATRIX_MODE */
-   { 21521, 0x00008840 }, /* GL_MATRIX_PALETTE_ARB */
-   { 21543, 0x00008840 }, /* GL_MATRIX_PALETTE_OES */
-   { 21565, 0x00008008 }, /* GL_MAX */
-   { 21572, 0x00008073 }, /* GL_MAX_3D_TEXTURE_SIZE */
-   { 21595, 0x00008073 }, /* GL_MAX_3D_TEXTURE_SIZE_OES */
-   { 21622, 0x000088FF }, /* GL_MAX_ARRAY_TEXTURE_LAYERS */
-   { 21650, 0x000088FF }, /* GL_MAX_ARRAY_TEXTURE_LAYERS_EXT */
-   { 21682, 0x00000D35 }, /* GL_MAX_ATTRIB_STACK_DEPTH */
-   { 21708, 0x00000D3B }, /* GL_MAX_CLIENT_ATTRIB_STACK_DEPTH */
-   { 21741, 0x00008177 }, /* GL_MAX_CLIPMAP_DEPTH_SGIX */
-   { 21767, 0x00008178 }, /* GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX */
-   { 21801, 0x00000D32 }, /* GL_MAX_CLIP_DISTANCES */
-   { 21823, 0x00000D32 }, /* GL_MAX_CLIP_PLANES */
-   { 21842, 0x00008CDF }, /* GL_MAX_COLOR_ATTACHMENTS */
-   { 21867, 0x00008CDF }, /* GL_MAX_COLOR_ATTACHMENTS_EXT */
-   { 21896, 0x000080B3 }, /* GL_MAX_COLOR_MATRIX_STACK_DEPTH */
-   { 21928, 0x000080B3 }, /* GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI */
-   { 21964, 0x00008B4D }, /* GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS */
-   { 22000, 0x00008B4D }, /* GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB */
-   { 22040, 0x0000801B }, /* GL_MAX_CONVOLUTION_HEIGHT */
-   { 22066, 0x0000801B }, /* GL_MAX_CONVOLUTION_HEIGHT_EXT */
-   { 22096, 0x0000801A }, /* GL_MAX_CONVOLUTION_WIDTH */
-   { 22121, 0x0000801A }, /* GL_MAX_CONVOLUTION_WIDTH_EXT */
-   { 22150, 0x0000851C }, /* GL_MAX_CUBE_MAP_TEXTURE_SIZE */
-   { 22179, 0x0000851C }, /* GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB */
-   { 22212, 0x0000851C }, /* GL_MAX_CUBE_MAP_TEXTURE_SIZE_OES */
-   { 22245, 0x00008824 }, /* GL_MAX_DRAW_BUFFERS */
-   { 22265, 0x00008824 }, /* GL_MAX_DRAW_BUFFERS_ARB */
-   { 22289, 0x00008824 }, /* GL_MAX_DRAW_BUFFERS_ATI */
-   { 22313, 0x000080E9 }, /* GL_MAX_ELEMENTS_INDICES */
-   { 22337, 0x000080E8 }, /* GL_MAX_ELEMENTS_VERTICES */
-   { 22362, 0x00000D30 }, /* GL_MAX_EVAL_ORDER */
-   { 22380, 0x00008008 }, /* GL_MAX_EXT */
-   { 22391, 0x00009125 }, /* GL_MAX_FRAGMENT_INPUT_COMPONENTS */
-   { 22424, 0x00008B49 }, /* GL_MAX_FRAGMENT_UNIFORM_COMPONENTS */
-   { 22459, 0x00008B49 }, /* GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB */
-   { 22498, 0x00008DFD }, /* GL_MAX_FRAGMENT_UNIFORM_VECTORS */
-   { 22530, 0x00009123 }, /* GL_MAX_GEOMETRY_INPUT_COMPONENTS */
-   { 22563, 0x00009124 }, /* GL_MAX_GEOMETRY_OUTPUT_COMPONENTS */
-   { 22597, 0x00008DE0 }, /* GL_MAX_GEOMETRY_OUTPUT_VERTICES */
-   { 22629, 0x00008DE0 }, /* GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB */
-   { 22665, 0x00008C29 }, /* GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS */
-   { 22701, 0x00008C29 }, /* GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB */
-   { 22741, 0x00008DE1 }, /* GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS */
-   { 22781, 0x00008DE1 }, /* GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB */
-   { 22825, 0x00008DDF }, /* GL_MAX_GEOMETRY_UNIFORM_COMPONENTS */
-   { 22860, 0x00008DDF }, /* GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB */
-   { 22899, 0x00008DDD }, /* GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB */
-   { 22938, 0x00000D31 }, /* GL_MAX_LIGHTS */
-   { 22952, 0x00000B31 }, /* GL_MAX_LIST_NESTING */
-   { 22972, 0x00008841 }, /* GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB */
-   { 23010, 0x00000D36 }, /* GL_MAX_MODELVIEW_STACK_DEPTH */
-   { 23039, 0x00000D37 }, /* GL_MAX_NAME_STACK_DEPTH */
-   { 23063, 0x00008842 }, /* GL_MAX_PALETTE_MATRICES_ARB */
-   { 23091, 0x00008842 }, /* GL_MAX_PALETTE_MATRICES_OES */
-   { 23119, 0x00000D34 }, /* GL_MAX_PIXEL_MAP_TABLE */
-   { 23142, 0x000088B1 }, /* GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB */
-   { 23179, 0x0000880B }, /* GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB */
-   { 23215, 0x000088AD }, /* GL_MAX_PROGRAM_ATTRIBS_ARB */
-   { 23242, 0x000088F5 }, /* GL_MAX_PROGRAM_CALL_DEPTH_NV */
-   { 23271, 0x000088B5 }, /* GL_MAX_PROGRAM_ENV_PARAMETERS_ARB */
-   { 23305, 0x000088F4 }, /* GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV */
-   { 23341, 0x000088F6 }, /* GL_MAX_PROGRAM_IF_DEPTH_NV */
-   { 23368, 0x000088A1 }, /* GL_MAX_PROGRAM_INSTRUCTIONS_ARB */
-   { 23400, 0x000088B4 }, /* GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB */
-   { 23436, 0x000088F8 }, /* GL_MAX_PROGRAM_LOOP_COUNT_NV */
-   { 23465, 0x000088F7 }, /* GL_MAX_PROGRAM_LOOP_DEPTH_NV */
-   { 23494, 0x0000862F }, /* GL_MAX_PROGRAM_MATRICES_ARB */
-   { 23522, 0x0000862E }, /* GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB */
-   { 23560, 0x000088B3 }, /* GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB */
-   { 23604, 0x0000880E }, /* GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB */
-   { 23647, 0x000088AF }, /* GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB */
-   { 23681, 0x000088A3 }, /* GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB */
-   { 23720, 0x000088AB }, /* GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB */
-   { 23757, 0x000088A7 }, /* GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB */
-   { 23795, 0x00008810 }, /* GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB */
-   { 23838, 0x0000880F }, /* GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB */
-   { 23881, 0x000088A9 }, /* GL_MAX_PROGRAM_PARAMETERS_ARB */
-   { 23911, 0x000088A5 }, /* GL_MAX_PROGRAM_TEMPORARIES_ARB */
-   { 23942, 0x00008905 }, /* GL_MAX_PROGRAM_TEXEL_OFFSET */
-   { 23970, 0x00008905 }, /* GL_MAX_PROGRAM_TEXEL_OFFSET_EXT */
-   { 24002, 0x0000880D }, /* GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB */
-   { 24038, 0x0000880C }, /* GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB */
-   { 24074, 0x00000D38 }, /* GL_MAX_PROJECTION_STACK_DEPTH */
-   { 24104, 0x000084F8 }, /* GL_MAX_RECTANGLE_TEXTURE_SIZE */
-   { 24134, 0x000084F8 }, /* GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB */
-   { 24168, 0x000084F8 }, /* GL_MAX_RECTANGLE_TEXTURE_SIZE_NV */
-   { 24201, 0x000084E8 }, /* GL_MAX_RENDERBUFFER_SIZE */
-   { 24226, 0x000084E8 }, /* GL_MAX_RENDERBUFFER_SIZE_EXT */
-   { 24255, 0x000084E8 }, /* GL_MAX_RENDERBUFFER_SIZE_OES */
-   { 24284, 0x00008D57 }, /* GL_MAX_SAMPLES */
-   { 24299, 0x00008D57 }, /* GL_MAX_SAMPLES_EXT */
-   { 24318, 0x00009111 }, /* GL_MAX_SERVER_WAIT_TIMEOUT */
-   { 24345, 0x00008504 }, /* GL_MAX_SHININESS_NV */
-   { 24365, 0x00008505 }, /* GL_MAX_SPOT_EXPONENT_NV */
-   { 24389, 0x00008C2B }, /* GL_MAX_TEXTURE_BUFFER_SIZE */
-   { 24416, 0x00008871 }, /* GL_MAX_TEXTURE_COORDS */
-   { 24438, 0x00008871 }, /* GL_MAX_TEXTURE_COORDS_ARB */
-   { 24464, 0x00008872 }, /* GL_MAX_TEXTURE_IMAGE_UNITS */
-   { 24491, 0x00008872 }, /* GL_MAX_TEXTURE_IMAGE_UNITS_ARB */
-   { 24522, 0x000084FD }, /* GL_MAX_TEXTURE_LOD_BIAS */
-   { 24546, 0x000084FD }, /* GL_MAX_TEXTURE_LOD_BIAS_EXT */
-   { 24574, 0x000084FF }, /* GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT */
-   { 24608, 0x00000D33 }, /* GL_MAX_TEXTURE_SIZE */
-   { 24628, 0x00000D39 }, /* GL_MAX_TEXTURE_STACK_DEPTH */
-   { 24655, 0x000084E2 }, /* GL_MAX_TEXTURE_UNITS */
-   { 24676, 0x000084E2 }, /* GL_MAX_TEXTURE_UNITS_ARB */
-   { 24701, 0x0000862F }, /* GL_MAX_TRACK_MATRICES_NV */
-   { 24726, 0x0000862E }, /* GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV */
-   { 24761, 0x00008C8A }, /* GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS */
-   { 24810, 0x00008C8A }, /* GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT */
-   { 24863, 0x00008C8B }, /* GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS */
-   { 24906, 0x00008C8B }, /* GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT */
-   { 24953, 0x00008C80 }, /* GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS */
-   { 24999, 0x00008C80 }, /* GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT */
-   { 25049, 0x00008B4B }, /* GL_MAX_VARYING_COMPONENTS */
-   { 25075, 0x00008B4B }, /* GL_MAX_VARYING_FLOATS */
-   { 25097, 0x00008B4B }, /* GL_MAX_VARYING_FLOATS_ARB */
-   { 25123, 0x00008DFC }, /* GL_MAX_VARYING_VECTORS */
-   { 25146, 0x00008869 }, /* GL_MAX_VERTEX_ATTRIBS */
-   { 25168, 0x00008869 }, /* GL_MAX_VERTEX_ATTRIBS_ARB */
-   { 25194, 0x00009122 }, /* GL_MAX_VERTEX_OUTPUT_COMPONENTS */
-   { 25226, 0x00008B4C }, /* GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS */
-   { 25260, 0x00008B4C }, /* GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB */
-   { 25298, 0x00008B4A }, /* GL_MAX_VERTEX_UNIFORM_COMPONENTS */
-   { 25331, 0x00008B4A }, /* GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB */
-   { 25368, 0x00008DFB }, /* GL_MAX_VERTEX_UNIFORM_VECTORS */
-   { 25398, 0x000086A4 }, /* GL_MAX_VERTEX_UNITS_ARB */
-   { 25422, 0x000086A4 }, /* GL_MAX_VERTEX_UNITS_OES */
-   { 25446, 0x00008DDE }, /* GL_MAX_VERTEX_VARYING_COMPONENTS_ARB */
-   { 25483, 0x00000D3A }, /* GL_MAX_VIEWPORT_DIMS */
-   { 25504, 0x00008DF1 }, /* GL_MEDIUM_FLOAT */
-   { 25520, 0x00008DF4 }, /* GL_MEDIUM_INT */
-   { 25534, 0x00008007 }, /* GL_MIN */
-   { 25541, 0x0000802E }, /* GL_MINMAX */
-   { 25551, 0x0000802E }, /* GL_MINMAX_EXT */
-   { 25565, 0x0000802F }, /* GL_MINMAX_FORMAT */
-   { 25582, 0x0000802F }, /* GL_MINMAX_FORMAT_EXT */
-   { 25603, 0x00008030 }, /* GL_MINMAX_SINK */
-   { 25618, 0x00008030 }, /* GL_MINMAX_SINK_EXT */
-   { 25637, 0x0000821C }, /* GL_MINOR_VERSION */
-   { 25654, 0x00008007 }, /* GL_MIN_EXT */
-   { 25665, 0x00008904 }, /* GL_MIN_PROGRAM_TEXEL_OFFSET */
-   { 25693, 0x00008904 }, /* GL_MIN_PROGRAM_TEXEL_OFFSET_EXT */
-   { 25725, 0x00008370 }, /* GL_MIRRORED_REPEAT */
-   { 25744, 0x00008370 }, /* GL_MIRRORED_REPEAT_ARB */
-   { 25767, 0x00008370 }, /* GL_MIRRORED_REPEAT_IBM */
-   { 25790, 0x00008742 }, /* GL_MIRROR_CLAMP_ATI */
-   { 25810, 0x00008742 }, /* GL_MIRROR_CLAMP_EXT */
-   { 25830, 0x00008912 }, /* GL_MIRROR_CLAMP_TO_BORDER_EXT */
-   { 25860, 0x00008743 }, /* GL_MIRROR_CLAMP_TO_EDGE_ATI */
-   { 25888, 0x00008743 }, /* GL_MIRROR_CLAMP_TO_EDGE_EXT */
-   { 25916, 0x00001700 }, /* GL_MODELVIEW */
-   { 25929, 0x00001700 }, /* GL_MODELVIEW0_ARB */
-   { 25947, 0x0000872A }, /* GL_MODELVIEW10_ARB */
-   { 25966, 0x0000872B }, /* GL_MODELVIEW11_ARB */
-   { 25985, 0x0000872C }, /* GL_MODELVIEW12_ARB */
-   { 26004, 0x0000872D }, /* GL_MODELVIEW13_ARB */
-   { 26023, 0x0000872E }, /* GL_MODELVIEW14_ARB */
-   { 26042, 0x0000872F }, /* GL_MODELVIEW15_ARB */
-   { 26061, 0x00008730 }, /* GL_MODELVIEW16_ARB */
-   { 26080, 0x00008731 }, /* GL_MODELVIEW17_ARB */
-   { 26099, 0x00008732 }, /* GL_MODELVIEW18_ARB */
-   { 26118, 0x00008733 }, /* GL_MODELVIEW19_ARB */
-   { 26137, 0x0000850A }, /* GL_MODELVIEW1_ARB */
-   { 26155, 0x00008734 }, /* GL_MODELVIEW20_ARB */
-   { 26174, 0x00008735 }, /* GL_MODELVIEW21_ARB */
-   { 26193, 0x00008736 }, /* GL_MODELVIEW22_ARB */
-   { 26212, 0x00008737 }, /* GL_MODELVIEW23_ARB */
-   { 26231, 0x00008738 }, /* GL_MODELVIEW24_ARB */
-   { 26250, 0x00008739 }, /* GL_MODELVIEW25_ARB */
-   { 26269, 0x0000873A }, /* GL_MODELVIEW26_ARB */
-   { 26288, 0x0000873B }, /* GL_MODELVIEW27_ARB */
-   { 26307, 0x0000873C }, /* GL_MODELVIEW28_ARB */
-   { 26326, 0x0000873D }, /* GL_MODELVIEW29_ARB */
-   { 26345, 0x00008722 }, /* GL_MODELVIEW2_ARB */
-   { 26363, 0x0000873E }, /* GL_MODELVIEW30_ARB */
-   { 26382, 0x0000873F }, /* GL_MODELVIEW31_ARB */
-   { 26401, 0x00008723 }, /* GL_MODELVIEW3_ARB */
-   { 26419, 0x00008724 }, /* GL_MODELVIEW4_ARB */
-   { 26437, 0x00008725 }, /* GL_MODELVIEW5_ARB */
-   { 26455, 0x00008726 }, /* GL_MODELVIEW6_ARB */
-   { 26473, 0x00008727 }, /* GL_MODELVIEW7_ARB */
-   { 26491, 0x00008728 }, /* GL_MODELVIEW8_ARB */
-   { 26509, 0x00008729 }, /* GL_MODELVIEW9_ARB */
-   { 26527, 0x00000BA6 }, /* GL_MODELVIEW_MATRIX */
-   { 26547, 0x0000898D }, /* GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES */
-   { 26589, 0x00008629 }, /* GL_MODELVIEW_PROJECTION_NV */
-   { 26616, 0x00000BA3 }, /* GL_MODELVIEW_STACK_DEPTH */
-   { 26641, 0x00002100 }, /* GL_MODULATE */
-   { 26653, 0x00008744 }, /* GL_MODULATE_ADD_ATI */
-   { 26673, 0x00008745 }, /* GL_MODULATE_SIGNED_ADD_ATI */
-   { 26700, 0x00008746 }, /* GL_MODULATE_SUBTRACT_ATI */
-   { 26725, 0x00000103 }, /* GL_MULT */
-   { 26733, 0x0000809D }, /* GL_MULTISAMPLE */
-   { 26748, 0x000086B2 }, /* GL_MULTISAMPLE_3DFX */
-   { 26768, 0x0000809D }, /* GL_MULTISAMPLE_ARB */
-   { 26787, 0x20000000 }, /* GL_MULTISAMPLE_BIT */
-   { 26806, 0x20000000 }, /* GL_MULTISAMPLE_BIT_3DFX */
-   { 26830, 0x20000000 }, /* GL_MULTISAMPLE_BIT_ARB */
-   { 26853, 0x00008534 }, /* GL_MULTISAMPLE_FILTER_HINT_NV */
-   { 26883, 0x00002A25 }, /* GL_N3F_V3F */
-   { 26894, 0x00000D70 }, /* GL_NAME_STACK_DEPTH */
-   { 26914, 0x0000150E }, /* GL_NAND */
-   { 26922, 0x00002600 }, /* GL_NEAREST */
-   { 26933, 0x0000844E }, /* GL_NEAREST_CLIPMAP_LINEAR_SGIX */
-   { 26964, 0x0000844D }, /* GL_NEAREST_CLIPMAP_NEAREST_SGIX */
-   { 26996, 0x00002702 }, /* GL_NEAREST_MIPMAP_LINEAR */
-   { 27021, 0x00002700 }, /* GL_NEAREST_MIPMAP_NEAREST */
-   { 27047, 0x00000200 }, /* GL_NEVER */
-   { 27056, 0x00001102 }, /* GL_NICEST */
-   { 27066, 0x00000000 }, /* GL_NONE */
-   { 27074, 0x00000000 }, /* GL_NONE_OES */
-   { 27086, 0x00001505 }, /* GL_NOOP */
-   { 27094, 0x00001508 }, /* GL_NOR */
-   { 27101, 0x00000BA1 }, /* GL_NORMALIZE */
-   { 27114, 0x00008075 }, /* GL_NORMAL_ARRAY */
-   { 27130, 0x00008897 }, /* GL_NORMAL_ARRAY_BUFFER_BINDING */
-   { 27161, 0x00008897 }, /* GL_NORMAL_ARRAY_BUFFER_BINDING_ARB */
-   { 27196, 0x0000808F }, /* GL_NORMAL_ARRAY_POINTER */
-   { 27220, 0x0000807F }, /* GL_NORMAL_ARRAY_STRIDE */
-   { 27243, 0x0000807E }, /* GL_NORMAL_ARRAY_TYPE */
-   { 27264, 0x00008511 }, /* GL_NORMAL_MAP */
-   { 27278, 0x00008511 }, /* GL_NORMAL_MAP_ARB */
-   { 27296, 0x00008511 }, /* GL_NORMAL_MAP_NV */
-   { 27313, 0x00008511 }, /* GL_NORMAL_MAP_OES */
-   { 27331, 0x00000205 }, /* GL_NOTEQUAL */
-   { 27343, 0x00000000 }, /* GL_NO_ERROR */
-   { 27355, 0x000086A2 }, /* GL_NUM_COMPRESSED_TEXTURE_FORMATS */
-   { 27389, 0x000086A2 }, /* GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB */
-   { 27427, 0x0000821D }, /* GL_NUM_EXTENSIONS */
-   { 27445, 0x000087FE }, /* GL_NUM_PROGRAM_BINARY_FORMATS_OES */
-   { 27479, 0x00008DF9 }, /* GL_NUM_SHADER_BINARY_FORMATS */
-   { 27508, 0x00008B89 }, /* GL_OBJECT_ACTIVE_ATTRIBUTES_ARB */
-   { 27540, 0x00008B8A }, /* GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB */
-   { 27582, 0x00008B86 }, /* GL_OBJECT_ACTIVE_UNIFORMS_ARB */
-   { 27612, 0x00008B87 }, /* GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB */
-   { 27652, 0x00008B85 }, /* GL_OBJECT_ATTACHED_OBJECTS_ARB */
-   { 27683, 0x00008B81 }, /* GL_OBJECT_COMPILE_STATUS_ARB */
-   { 27712, 0x00008B80 }, /* GL_OBJECT_DELETE_STATUS_ARB */
-   { 27740, 0x00008B84 }, /* GL_OBJECT_INFO_LOG_LENGTH_ARB */
-   { 27770, 0x00002401 }, /* GL_OBJECT_LINEAR */
-   { 27787, 0x00008B82 }, /* GL_OBJECT_LINK_STATUS_ARB */
-   { 27813, 0x00002501 }, /* GL_OBJECT_PLANE */
-   { 27829, 0x00008B88 }, /* GL_OBJECT_SHADER_SOURCE_LENGTH_ARB */
-   { 27864, 0x00008B4F }, /* GL_OBJECT_SUBTYPE_ARB */
-   { 27886, 0x00009112 }, /* GL_OBJECT_TYPE */
-   { 27901, 0x00008B4E }, /* GL_OBJECT_TYPE_ARB */
-   { 27920, 0x00008B83 }, /* GL_OBJECT_VALIDATE_STATUS_ARB */
-   { 27950, 0x00008165 }, /* GL_OCCLUSION_TEST_HP */
-   { 27971, 0x00008166 }, /* GL_OCCLUSION_TEST_RESULT_HP */
-   { 27999, 0x00000001 }, /* GL_ONE */
-   { 28006, 0x00008004 }, /* GL_ONE_MINUS_CONSTANT_ALPHA */
-   { 28034, 0x00008004 }, /* GL_ONE_MINUS_CONSTANT_ALPHA_EXT */
-   { 28066, 0x00008002 }, /* GL_ONE_MINUS_CONSTANT_COLOR */
-   { 28094, 0x00008002 }, /* GL_ONE_MINUS_CONSTANT_COLOR_EXT */
-   { 28126, 0x00000305 }, /* GL_ONE_MINUS_DST_ALPHA */
-   { 28149, 0x00000307 }, /* GL_ONE_MINUS_DST_COLOR */
-   { 28172, 0x00000303 }, /* GL_ONE_MINUS_SRC_ALPHA */
-   { 28195, 0x00000301 }, /* GL_ONE_MINUS_SRC_COLOR */
-   { 28218, 0x00008598 }, /* GL_OPERAND0_ALPHA */
-   { 28236, 0x00008598 }, /* GL_OPERAND0_ALPHA_ARB */
-   { 28258, 0x00008598 }, /* GL_OPERAND0_ALPHA_EXT */
-   { 28280, 0x00008590 }, /* GL_OPERAND0_RGB */
-   { 28296, 0x00008590 }, /* GL_OPERAND0_RGB_ARB */
-   { 28316, 0x00008590 }, /* GL_OPERAND0_RGB_EXT */
-   { 28336, 0x00008599 }, /* GL_OPERAND1_ALPHA */
-   { 28354, 0x00008599 }, /* GL_OPERAND1_ALPHA_ARB */
-   { 28376, 0x00008599 }, /* GL_OPERAND1_ALPHA_EXT */
-   { 28398, 0x00008591 }, /* GL_OPERAND1_RGB */
-   { 28414, 0x00008591 }, /* GL_OPERAND1_RGB_ARB */
-   { 28434, 0x00008591 }, /* GL_OPERAND1_RGB_EXT */
-   { 28454, 0x0000859A }, /* GL_OPERAND2_ALPHA */
-   { 28472, 0x0000859A }, /* GL_OPERAND2_ALPHA_ARB */
-   { 28494, 0x0000859A }, /* GL_OPERAND2_ALPHA_EXT */
-   { 28516, 0x00008592 }, /* GL_OPERAND2_RGB */
-   { 28532, 0x00008592 }, /* GL_OPERAND2_RGB_ARB */
-   { 28552, 0x00008592 }, /* GL_OPERAND2_RGB_EXT */
-   { 28572, 0x0000859B }, /* GL_OPERAND3_ALPHA_NV */
-   { 28593, 0x00008593 }, /* GL_OPERAND3_RGB_NV */
-   { 28612, 0x00001507 }, /* GL_OR */
-   { 28618, 0x00000A01 }, /* GL_ORDER */
-   { 28627, 0x0000150D }, /* GL_OR_INVERTED */
-   { 28642, 0x0000150B }, /* GL_OR_REVERSE */
-   { 28656, 0x00000505 }, /* GL_OUT_OF_MEMORY */
-   { 28673, 0x00000D05 }, /* GL_PACK_ALIGNMENT */
-   { 28691, 0x0000806C }, /* GL_PACK_IMAGE_HEIGHT */
-   { 28712, 0x00008758 }, /* GL_PACK_INVERT_MESA */
-   { 28732, 0x00000D01 }, /* GL_PACK_LSB_FIRST */
-   { 28750, 0x00000D02 }, /* GL_PACK_ROW_LENGTH */
-   { 28769, 0x0000806B }, /* GL_PACK_SKIP_IMAGES */
-   { 28789, 0x00000D04 }, /* GL_PACK_SKIP_PIXELS */
-   { 28809, 0x00000D03 }, /* GL_PACK_SKIP_ROWS */
-   { 28827, 0x00000D00 }, /* GL_PACK_SWAP_BYTES */
-   { 28846, 0x00008B92 }, /* GL_PALETTE4_R5_G6_B5_OES */
-   { 28871, 0x00008B94 }, /* GL_PALETTE4_RGB5_A1_OES */
-   { 28895, 0x00008B90 }, /* GL_PALETTE4_RGB8_OES */
-   { 28916, 0x00008B93 }, /* GL_PALETTE4_RGBA4_OES */
-   { 28938, 0x00008B91 }, /* GL_PALETTE4_RGBA8_OES */
-   { 28960, 0x00008B97 }, /* GL_PALETTE8_R5_G6_B5_OES */
-   { 28985, 0x00008B99 }, /* GL_PALETTE8_RGB5_A1_OES */
-   { 29009, 0x00008B95 }, /* GL_PALETTE8_RGB8_OES */
-   { 29030, 0x00008B98 }, /* GL_PALETTE8_RGBA4_OES */
-   { 29052, 0x00008B96 }, /* GL_PALETTE8_RGBA8_OES */
-   { 29074, 0x00000700 }, /* GL_PASS_THROUGH_TOKEN */
-   { 29096, 0x00000C50 }, /* GL_PERSPECTIVE_CORRECTION_HINT */
-   { 29127, 0x00000C79 }, /* GL_PIXEL_MAP_A_TO_A */
-   { 29147, 0x00000CB9 }, /* GL_PIXEL_MAP_A_TO_A_SIZE */
-   { 29172, 0x00000C78 }, /* GL_PIXEL_MAP_B_TO_B */
-   { 29192, 0x00000CB8 }, /* GL_PIXEL_MAP_B_TO_B_SIZE */
-   { 29217, 0x00000C77 }, /* GL_PIXEL_MAP_G_TO_G */
-   { 29237, 0x00000CB7 }, /* GL_PIXEL_MAP_G_TO_G_SIZE */
-   { 29262, 0x00000C75 }, /* GL_PIXEL_MAP_I_TO_A */
-   { 29282, 0x00000CB5 }, /* GL_PIXEL_MAP_I_TO_A_SIZE */
-   { 29307, 0x00000C74 }, /* GL_PIXEL_MAP_I_TO_B */
-   { 29327, 0x00000CB4 }, /* GL_PIXEL_MAP_I_TO_B_SIZE */
-   { 29352, 0x00000C73 }, /* GL_PIXEL_MAP_I_TO_G */
-   { 29372, 0x00000CB3 }, /* GL_PIXEL_MAP_I_TO_G_SIZE */
-   { 29397, 0x00000C70 }, /* GL_PIXEL_MAP_I_TO_I */
-   { 29417, 0x00000CB0 }, /* GL_PIXEL_MAP_I_TO_I_SIZE */
-   { 29442, 0x00000C72 }, /* GL_PIXEL_MAP_I_TO_R */
-   { 29462, 0x00000CB2 }, /* GL_PIXEL_MAP_I_TO_R_SIZE */
-   { 29487, 0x00000C76 }, /* GL_PIXEL_MAP_R_TO_R */
-   { 29507, 0x00000CB6 }, /* GL_PIXEL_MAP_R_TO_R_SIZE */
-   { 29532, 0x00000C71 }, /* GL_PIXEL_MAP_S_TO_S */
-   { 29552, 0x00000CB1 }, /* GL_PIXEL_MAP_S_TO_S_SIZE */
-   { 29577, 0x00000020 }, /* GL_PIXEL_MODE_BIT */
-   { 29595, 0x000088EB }, /* GL_PIXEL_PACK_BUFFER */
-   { 29616, 0x000088ED }, /* GL_PIXEL_PACK_BUFFER_BINDING */
-   { 29645, 0x000088ED }, /* GL_PIXEL_PACK_BUFFER_BINDING_EXT */
-   { 29678, 0x000088EB }, /* GL_PIXEL_PACK_BUFFER_EXT */
-   { 29703, 0x000088EC }, /* GL_PIXEL_UNPACK_BUFFER */
-   { 29726, 0x000088EF }, /* GL_PIXEL_UNPACK_BUFFER_BINDING */
-   { 29757, 0x000088EF }, /* GL_PIXEL_UNPACK_BUFFER_BINDING_EXT */
-   { 29792, 0x000088EC }, /* GL_PIXEL_UNPACK_BUFFER_EXT */
-   { 29819, 0x00001B00 }, /* GL_POINT */
-   { 29828, 0x00000000 }, /* GL_POINTS */
-   { 29838, 0x00000002 }, /* GL_POINT_BIT */
-   { 29851, 0x00008129 }, /* GL_POINT_DISTANCE_ATTENUATION */
-   { 29881, 0x00008129 }, /* GL_POINT_DISTANCE_ATTENUATION_ARB */
-   { 29915, 0x00008129 }, /* GL_POINT_DISTANCE_ATTENUATION_EXT */
-   { 29949, 0x00008129 }, /* GL_POINT_DISTANCE_ATTENUATION_SGIS */
-   { 29984, 0x00008128 }, /* GL_POINT_FADE_THRESHOLD_SIZE */
-   { 30013, 0x00008128 }, /* GL_POINT_FADE_THRESHOLD_SIZE_ARB */
-   { 30046, 0x00008128 }, /* GL_POINT_FADE_THRESHOLD_SIZE_EXT */
-   { 30079, 0x00008128 }, /* GL_POINT_FADE_THRESHOLD_SIZE_SGIS */
-   { 30113, 0x00000B11 }, /* GL_POINT_SIZE */
-   { 30127, 0x00008B9F }, /* GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES */
-   { 30166, 0x00008B9C }, /* GL_POINT_SIZE_ARRAY_OES */
-   { 30190, 0x0000898C }, /* GL_POINT_SIZE_ARRAY_POINTER_OES */
-   { 30222, 0x0000898B }, /* GL_POINT_SIZE_ARRAY_STRIDE_OES */
-   { 30253, 0x0000898A }, /* GL_POINT_SIZE_ARRAY_TYPE_OES */
-   { 30282, 0x00000B13 }, /* GL_POINT_SIZE_GRANULARITY */
-   { 30308, 0x00008127 }, /* GL_POINT_SIZE_MAX */
-   { 30326, 0x00008127 }, /* GL_POINT_SIZE_MAX_ARB */
-   { 30348, 0x00008127 }, /* GL_POINT_SIZE_MAX_EXT */
-   { 30370, 0x00008127 }, /* GL_POINT_SIZE_MAX_SGIS */
-   { 30393, 0x00008126 }, /* GL_POINT_SIZE_MIN */
-   { 30411, 0x00008126 }, /* GL_POINT_SIZE_MIN_ARB */
-   { 30433, 0x00008126 }, /* GL_POINT_SIZE_MIN_EXT */
-   { 30455, 0x00008126 }, /* GL_POINT_SIZE_MIN_SGIS */
-   { 30478, 0x00000B12 }, /* GL_POINT_SIZE_RANGE */
-   { 30498, 0x00000B10 }, /* GL_POINT_SMOOTH */
-   { 30514, 0x00000C51 }, /* GL_POINT_SMOOTH_HINT */
-   { 30535, 0x00008861 }, /* GL_POINT_SPRITE */
-   { 30551, 0x00008861 }, /* GL_POINT_SPRITE_ARB */
-   { 30571, 0x00008CA0 }, /* GL_POINT_SPRITE_COORD_ORIGIN */
-   { 30600, 0x00008861 }, /* GL_POINT_SPRITE_NV */
-   { 30619, 0x00008861 }, /* GL_POINT_SPRITE_OES */
-   { 30639, 0x00008863 }, /* GL_POINT_SPRITE_R_MODE_NV */
-   { 30665, 0x00000701 }, /* GL_POINT_TOKEN */
-   { 30680, 0x00000009 }, /* GL_POLYGON */
-   { 30691, 0x00000008 }, /* GL_POLYGON_BIT */
-   { 30706, 0x00000B40 }, /* GL_POLYGON_MODE */
-   { 30722, 0x00008039 }, /* GL_POLYGON_OFFSET_BIAS */
-   { 30745, 0x00008038 }, /* GL_POLYGON_OFFSET_FACTOR */
-   { 30770, 0x00008037 }, /* GL_POLYGON_OFFSET_FILL */
-   { 30793, 0x00002A02 }, /* GL_POLYGON_OFFSET_LINE */
-   { 30816, 0x00002A01 }, /* GL_POLYGON_OFFSET_POINT */
-   { 30840, 0x00002A00 }, /* GL_POLYGON_OFFSET_UNITS */
-   { 30864, 0x00000B41 }, /* GL_POLYGON_SMOOTH */
-   { 30882, 0x00000C53 }, /* GL_POLYGON_SMOOTH_HINT */
-   { 30905, 0x00000B42 }, /* GL_POLYGON_STIPPLE */
-   { 30924, 0x00000010 }, /* GL_POLYGON_STIPPLE_BIT */
-   { 30947, 0x00000703 }, /* GL_POLYGON_TOKEN */
-   { 30964, 0x00001203 }, /* GL_POSITION */
-   { 30976, 0x000080BB }, /* GL_POST_COLOR_MATRIX_ALPHA_BIAS */
-   { 31008, 0x000080BB }, /* GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI */
-   { 31044, 0x000080B7 }, /* GL_POST_COLOR_MATRIX_ALPHA_SCALE */
-   { 31077, 0x000080B7 }, /* GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI */
-   { 31114, 0x000080BA }, /* GL_POST_COLOR_MATRIX_BLUE_BIAS */
-   { 31145, 0x000080BA }, /* GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI */
-   { 31180, 0x000080B6 }, /* GL_POST_COLOR_MATRIX_BLUE_SCALE */
-   { 31212, 0x000080B6 }, /* GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI */
-   { 31248, 0x000080D2 }, /* GL_POST_COLOR_MATRIX_COLOR_TABLE */
-   { 31281, 0x000080B9 }, /* GL_POST_COLOR_MATRIX_GREEN_BIAS */
-   { 31313, 0x000080B9 }, /* GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI */
-   { 31349, 0x000080B5 }, /* GL_POST_COLOR_MATRIX_GREEN_SCALE */
-   { 31382, 0x000080B5 }, /* GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI */
-   { 31419, 0x000080B8 }, /* GL_POST_COLOR_MATRIX_RED_BIAS */
-   { 31449, 0x000080B8 }, /* GL_POST_COLOR_MATRIX_RED_BIAS_SGI */
-   { 31483, 0x000080B4 }, /* GL_POST_COLOR_MATRIX_RED_SCALE */
-   { 31514, 0x000080B4 }, /* GL_POST_COLOR_MATRIX_RED_SCALE_SGI */
-   { 31549, 0x00008023 }, /* GL_POST_CONVOLUTION_ALPHA_BIAS */
-   { 31580, 0x00008023 }, /* GL_POST_CONVOLUTION_ALPHA_BIAS_EXT */
-   { 31615, 0x0000801F }, /* GL_POST_CONVOLUTION_ALPHA_SCALE */
-   { 31647, 0x0000801F }, /* GL_POST_CONVOLUTION_ALPHA_SCALE_EXT */
-   { 31683, 0x00008022 }, /* GL_POST_CONVOLUTION_BLUE_BIAS */
-   { 31713, 0x00008022 }, /* GL_POST_CONVOLUTION_BLUE_BIAS_EXT */
-   { 31747, 0x0000801E }, /* GL_POST_CONVOLUTION_BLUE_SCALE */
-   { 31778, 0x0000801E }, /* GL_POST_CONVOLUTION_BLUE_SCALE_EXT */
-   { 31813, 0x000080D1 }, /* GL_POST_CONVOLUTION_COLOR_TABLE */
-   { 31845, 0x00008021 }, /* GL_POST_CONVOLUTION_GREEN_BIAS */
-   { 31876, 0x00008021 }, /* GL_POST_CONVOLUTION_GREEN_BIAS_EXT */
-   { 31911, 0x0000801D }, /* GL_POST_CONVOLUTION_GREEN_SCALE */
-   { 31943, 0x0000801D }, /* GL_POST_CONVOLUTION_GREEN_SCALE_EXT */
-   { 31979, 0x00008020 }, /* GL_POST_CONVOLUTION_RED_BIAS */
-   { 32008, 0x00008020 }, /* GL_POST_CONVOLUTION_RED_BIAS_EXT */
-   { 32041, 0x0000801C }, /* GL_POST_CONVOLUTION_RED_SCALE */
-   { 32071, 0x0000801C }, /* GL_POST_CONVOLUTION_RED_SCALE_EXT */
-   { 32105, 0x0000817B }, /* GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX */
-   { 32144, 0x00008179 }, /* GL_POST_TEXTURE_FILTER_BIAS_SGIX */
-   { 32177, 0x0000817C }, /* GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX */
-   { 32217, 0x0000817A }, /* GL_POST_TEXTURE_FILTER_SCALE_SGIX */
-   { 32251, 0x00008578 }, /* GL_PREVIOUS */
-   { 32263, 0x00008578 }, /* GL_PREVIOUS_ARB */
-   { 32279, 0x00008578 }, /* GL_PREVIOUS_EXT */
-   { 32295, 0x00008577 }, /* GL_PRIMARY_COLOR */
-   { 32312, 0x00008577 }, /* GL_PRIMARY_COLOR_ARB */
-   { 32333, 0x00008577 }, /* GL_PRIMARY_COLOR_EXT */
-   { 32354, 0x00008C87 }, /* GL_PRIMITIVES_GENERATED */
-   { 32378, 0x00008C87 }, /* GL_PRIMITIVES_GENERATED_EXT */
-   { 32406, 0x00008F9D }, /* GL_PRIMITIVE_RESTART */
-   { 32427, 0x00008F9E }, /* GL_PRIMITIVE_RESTART_INDEX */
-   { 32454, 0x00008559 }, /* GL_PRIMITIVE_RESTART_INDEX_NV */
-   { 32484, 0x00008558 }, /* GL_PRIMITIVE_RESTART_NV */
-   { 32508, 0x000088B0 }, /* GL_PROGRAM_ADDRESS_REGISTERS_ARB */
-   { 32541, 0x00008805 }, /* GL_PROGRAM_ALU_INSTRUCTIONS_ARB */
-   { 32573, 0x000088AC }, /* GL_PROGRAM_ATTRIBS_ARB */
-   { 32596, 0x000087FF }, /* GL_PROGRAM_BINARY_FORMATS_OES */
-   { 32626, 0x00008741 }, /* GL_PROGRAM_BINARY_LENGTH_OES */
-   { 32655, 0x00008677 }, /* GL_PROGRAM_BINDING_ARB */
-   { 32678, 0x0000864B }, /* GL_PROGRAM_ERROR_POSITION_ARB */
-   { 32708, 0x0000864B }, /* GL_PROGRAM_ERROR_POSITION_NV */
-   { 32737, 0x00008874 }, /* GL_PROGRAM_ERROR_STRING_ARB */
-   { 32765, 0x00008876 }, /* GL_PROGRAM_FORMAT_ARB */
-   { 32787, 0x00008875 }, /* GL_PROGRAM_FORMAT_ASCII_ARB */
-   { 32815, 0x000088A0 }, /* GL_PROGRAM_INSTRUCTIONS_ARB */
-   { 32843, 0x00008627 }, /* GL_PROGRAM_LENGTH_ARB */
-   { 32865, 0x00008627 }, /* GL_PROGRAM_LENGTH_NV */
-   { 32886, 0x000088B2 }, /* GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB */
-   { 32926, 0x00008808 }, /* GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB */
-   { 32965, 0x000088AE }, /* GL_PROGRAM_NATIVE_ATTRIBS_ARB */
-   { 32995, 0x000088A2 }, /* GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB */
-   { 33030, 0x000088AA }, /* GL_PROGRAM_NATIVE_PARAMETERS_ARB */
-   { 33063, 0x000088A6 }, /* GL_PROGRAM_NATIVE_TEMPORARIES_ARB */
-   { 33097, 0x0000880A }, /* GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB */
-   { 33136, 0x00008809 }, /* GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB */
-   { 33175, 0x00008B40 }, /* GL_PROGRAM_OBJECT_ARB */
-   { 33197, 0x000088A8 }, /* GL_PROGRAM_PARAMETERS_ARB */
-   { 33223, 0x00008644 }, /* GL_PROGRAM_PARAMETER_NV */
-   { 33247, 0x00008642 }, /* GL_PROGRAM_POINT_SIZE */
-   { 33269, 0x00008642 }, /* GL_PROGRAM_POINT_SIZE_ARB */
-   { 33295, 0x00008647 }, /* GL_PROGRAM_RESIDENT_NV */
-   { 33318, 0x00008628 }, /* GL_PROGRAM_STRING_ARB */
-   { 33340, 0x00008628 }, /* GL_PROGRAM_STRING_NV */
-   { 33361, 0x00008646 }, /* GL_PROGRAM_TARGET_NV */
-   { 33382, 0x000088A4 }, /* GL_PROGRAM_TEMPORARIES_ARB */
-   { 33409, 0x00008807 }, /* GL_PROGRAM_TEX_INDIRECTIONS_ARB */
-   { 33441, 0x00008806 }, /* GL_PROGRAM_TEX_INSTRUCTIONS_ARB */
-   { 33473, 0x000088B6 }, /* GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB */
-   { 33508, 0x00001701 }, /* GL_PROJECTION */
-   { 33522, 0x00000BA7 }, /* GL_PROJECTION_MATRIX */
-   { 33543, 0x0000898E }, /* GL_PROJECTION_MATRIX_FLOAT_AS_INT_BITS_OES */
-   { 33586, 0x00000BA4 }, /* GL_PROJECTION_STACK_DEPTH */
-   { 33612, 0x00008E4F }, /* GL_PROVOKING_VERTEX */
-   { 33632, 0x00008E4F }, /* GL_PROVOKING_VERTEX_EXT */
-   { 33656, 0x000080D3 }, /* GL_PROXY_COLOR_TABLE */
-   { 33677, 0x00008025 }, /* GL_PROXY_HISTOGRAM */
-   { 33696, 0x00008025 }, /* GL_PROXY_HISTOGRAM_EXT */
-   { 33719, 0x000080D5 }, /* GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE */
-   { 33758, 0x000080D4 }, /* GL_PROXY_POST_CONVOLUTION_COLOR_TABLE */
-   { 33796, 0x00008063 }, /* GL_PROXY_TEXTURE_1D */
-   { 33816, 0x00008C19 }, /* GL_PROXY_TEXTURE_1D_ARRAY */
-   { 33842, 0x00008C19 }, /* GL_PROXY_TEXTURE_1D_ARRAY_EXT */
-   { 33872, 0x00008063 }, /* GL_PROXY_TEXTURE_1D_EXT */
-   { 33896, 0x00008064 }, /* GL_PROXY_TEXTURE_2D */
-   { 33916, 0x00008C1B }, /* GL_PROXY_TEXTURE_2D_ARRAY */
-   { 33942, 0x00008C1B }, /* GL_PROXY_TEXTURE_2D_ARRAY_EXT */
-   { 33972, 0x00008064 }, /* GL_PROXY_TEXTURE_2D_EXT */
-   { 33996, 0x00008070 }, /* GL_PROXY_TEXTURE_3D */
-   { 34016, 0x000080BD }, /* GL_PROXY_TEXTURE_COLOR_TABLE_SGI */
-   { 34049, 0x0000851B }, /* GL_PROXY_TEXTURE_CUBE_MAP */
-   { 34075, 0x0000851B }, /* GL_PROXY_TEXTURE_CUBE_MAP_ARB */
-   { 34105, 0x000084F7 }, /* GL_PROXY_TEXTURE_RECTANGLE */
-   { 34132, 0x000084F7 }, /* GL_PROXY_TEXTURE_RECTANGLE_ARB */
-   { 34163, 0x000084F7 }, /* GL_PROXY_TEXTURE_RECTANGLE_NV */
-   { 34193, 0x00008A1D }, /* GL_PURGEABLE_APPLE */
-   { 34212, 0x00002003 }, /* GL_Q */
-   { 34217, 0x00001209 }, /* GL_QUADRATIC_ATTENUATION */
-   { 34242, 0x00000007 }, /* GL_QUADS */
-   { 34251, 0x00008E4C }, /* GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION */
-   { 34295, 0x00008E4C }, /* GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT */
-   { 34343, 0x00008614 }, /* GL_QUAD_MESH_SUN */
-   { 34360, 0x00000008 }, /* GL_QUAD_STRIP */
-   { 34374, 0x00008E16 }, /* GL_QUERY_BY_REGION_NO_WAIT */
-   { 34401, 0x00008E16 }, /* GL_QUERY_BY_REGION_NO_WAIT_NV */
-   { 34431, 0x00008E15 }, /* GL_QUERY_BY_REGION_WAIT */
-   { 34455, 0x00008E15 }, /* GL_QUERY_BY_REGION_WAIT_NV */
-   { 34482, 0x00008864 }, /* GL_QUERY_COUNTER_BITS */
-   { 34504, 0x00008864 }, /* GL_QUERY_COUNTER_BITS_ARB */
-   { 34530, 0x00008E14 }, /* GL_QUERY_NO_WAIT */
-   { 34547, 0x00008E14 }, /* GL_QUERY_NO_WAIT_NV */
-   { 34567, 0x00008866 }, /* GL_QUERY_RESULT */
-   { 34583, 0x00008866 }, /* GL_QUERY_RESULT_ARB */
-   { 34603, 0x00008867 }, /* GL_QUERY_RESULT_AVAILABLE */
-   { 34629, 0x00008867 }, /* GL_QUERY_RESULT_AVAILABLE_ARB */
-   { 34659, 0x00008E13 }, /* GL_QUERY_WAIT */
-   { 34673, 0x00008E13 }, /* GL_QUERY_WAIT_NV */
-   { 34690, 0x00002002 }, /* GL_R */
-   { 34695, 0x00008C3A }, /* GL_R11F_G11F_B10F */
-   { 34713, 0x00008F98 }, /* GL_R16_SNORM */
-   { 34726, 0x00002A10 }, /* GL_R3_G3_B2 */
-   { 34738, 0x00008F94 }, /* GL_R8_SNORM */
-   { 34750, 0x00008C89 }, /* GL_RASTERIZER_DISCARD */
-   { 34772, 0x00008C89 }, /* GL_RASTERIZER_DISCARD_EXT */
-   { 34798, 0x00019262 }, /* GL_RASTER_POSITION_UNCLIPPED_IBM */
-   { 34831, 0x00000C02 }, /* GL_READ_BUFFER */
-   { 34846, 0x00008CA8 }, /* GL_READ_FRAMEBUFFER */
-   { 34866, 0x00008CAA }, /* GL_READ_FRAMEBUFFER_BINDING */
-   { 34894, 0x00008CAA }, /* GL_READ_FRAMEBUFFER_BINDING_EXT */
-   { 34926, 0x00008CA8 }, /* GL_READ_FRAMEBUFFER_EXT */
-   { 34950, 0x000088B8 }, /* GL_READ_ONLY */
-   { 34963, 0x000088B8 }, /* GL_READ_ONLY_ARB */
-   { 34980, 0x000088BA }, /* GL_READ_WRITE */
-   { 34994, 0x000088BA }, /* GL_READ_WRITE_ARB */
-   { 35012, 0x00001903 }, /* GL_RED */
-   { 35019, 0x00008016 }, /* GL_REDUCE */
-   { 35029, 0x00008016 }, /* GL_REDUCE_EXT */
-   { 35043, 0x00000D15 }, /* GL_RED_BIAS */
-   { 35055, 0x00000D52 }, /* GL_RED_BITS */
-   { 35067, 0x00008D94 }, /* GL_RED_INTEGER */
-   { 35082, 0x00008D94 }, /* GL_RED_INTEGER_EXT */
-   { 35101, 0x00000D14 }, /* GL_RED_SCALE */
-   { 35114, 0x00008F90 }, /* GL_RED_SNORM */
-   { 35127, 0x00008512 }, /* GL_REFLECTION_MAP */
-   { 35145, 0x00008512 }, /* GL_REFLECTION_MAP_ARB */
-   { 35167, 0x00008512 }, /* GL_REFLECTION_MAP_NV */
-   { 35188, 0x00008512 }, /* GL_REFLECTION_MAP_OES */
-   { 35210, 0x00008A19 }, /* GL_RELEASED_APPLE */
-   { 35228, 0x00001C00 }, /* GL_RENDER */
-   { 35238, 0x00008D41 }, /* GL_RENDERBUFFER */
-   { 35254, 0x00008D53 }, /* GL_RENDERBUFFER_ALPHA_SIZE */
-   { 35281, 0x00008D53 }, /* GL_RENDERBUFFER_ALPHA_SIZE_OES */
-   { 35312, 0x00008CA7 }, /* GL_RENDERBUFFER_BINDING */
-   { 35336, 0x00008CA7 }, /* GL_RENDERBUFFER_BINDING_EXT */
-   { 35364, 0x00008CA7 }, /* GL_RENDERBUFFER_BINDING_OES */
-   { 35392, 0x00008D52 }, /* GL_RENDERBUFFER_BLUE_SIZE */
-   { 35418, 0x00008D52 }, /* GL_RENDERBUFFER_BLUE_SIZE_OES */
-   { 35448, 0x00008D54 }, /* GL_RENDERBUFFER_DEPTH_SIZE */
-   { 35475, 0x00008D54 }, /* GL_RENDERBUFFER_DEPTH_SIZE_OES */
-   { 35506, 0x00008D41 }, /* GL_RENDERBUFFER_EXT */
-   { 35526, 0x00008D51 }, /* GL_RENDERBUFFER_GREEN_SIZE */
-   { 35553, 0x00008D51 }, /* GL_RENDERBUFFER_GREEN_SIZE_OES */
-   { 35584, 0x00008D43 }, /* GL_RENDERBUFFER_HEIGHT */
-   { 35607, 0x00008D43 }, /* GL_RENDERBUFFER_HEIGHT_EXT */
-   { 35634, 0x00008D43 }, /* GL_RENDERBUFFER_HEIGHT_OES */
-   { 35661, 0x00008D44 }, /* GL_RENDERBUFFER_INTERNAL_FORMAT */
-   { 35693, 0x00008D44 }, /* GL_RENDERBUFFER_INTERNAL_FORMAT_EXT */
-   { 35729, 0x00008D44 }, /* GL_RENDERBUFFER_INTERNAL_FORMAT_OES */
-   { 35765, 0x00008D41 }, /* GL_RENDERBUFFER_OES */
-   { 35785, 0x00008D50 }, /* GL_RENDERBUFFER_RED_SIZE */
-   { 35810, 0x00008D50 }, /* GL_RENDERBUFFER_RED_SIZE_OES */
-   { 35839, 0x00008CAB }, /* GL_RENDERBUFFER_SAMPLES */
-   { 35863, 0x00008CAB }, /* GL_RENDERBUFFER_SAMPLES_EXT */
-   { 35891, 0x00008D55 }, /* GL_RENDERBUFFER_STENCIL_SIZE */
-   { 35920, 0x00008D55 }, /* GL_RENDERBUFFER_STENCIL_SIZE_OES */
-   { 35953, 0x00008D42 }, /* GL_RENDERBUFFER_WIDTH */
-   { 35975, 0x00008D42 }, /* GL_RENDERBUFFER_WIDTH_EXT */
-   { 36001, 0x00008D42 }, /* GL_RENDERBUFFER_WIDTH_OES */
-   { 36027, 0x00001F01 }, /* GL_RENDERER */
-   { 36039, 0x00000C40 }, /* GL_RENDER_MODE */
-   { 36054, 0x00002901 }, /* GL_REPEAT */
-   { 36064, 0x00001E01 }, /* GL_REPLACE */
-   { 36075, 0x00008062 }, /* GL_REPLACE_EXT */
-   { 36090, 0x00008153 }, /* GL_REPLICATE_BORDER_HP */
-   { 36113, 0x0000803A }, /* GL_RESCALE_NORMAL */
-   { 36131, 0x0000803A }, /* GL_RESCALE_NORMAL_EXT */
-   { 36153, 0x00008A1B }, /* GL_RETAINED_APPLE */
-   { 36171, 0x00000102 }, /* GL_RETURN */
-   { 36181, 0x00008F99 }, /* GL_RG16_SNORM */
-   { 36195, 0x00008F95 }, /* GL_RG8_SNORM */
-   { 36208, 0x00001907 }, /* GL_RGB */
-   { 36215, 0x00008052 }, /* GL_RGB10 */
-   { 36224, 0x00008059 }, /* GL_RGB10_A2 */
-   { 36236, 0x00008059 }, /* GL_RGB10_A2_EXT */
-   { 36252, 0x00008052 }, /* GL_RGB10_EXT */
-   { 36265, 0x00008053 }, /* GL_RGB12 */
-   { 36274, 0x00008053 }, /* GL_RGB12_EXT */
-   { 36287, 0x00008054 }, /* GL_RGB16 */
-   { 36296, 0x0000881B }, /* GL_RGB16F */
-   { 36306, 0x00008D89 }, /* GL_RGB16I */
-   { 36316, 0x00008D89 }, /* GL_RGB16I_EXT */
-   { 36330, 0x00008D77 }, /* GL_RGB16UI */
-   { 36341, 0x00008D77 }, /* GL_RGB16UI_EXT */
-   { 36356, 0x00008054 }, /* GL_RGB16_EXT */
-   { 36369, 0x00008F9A }, /* GL_RGB16_SNORM */
-   { 36384, 0x0000804E }, /* GL_RGB2_EXT */
-   { 36396, 0x00008815 }, /* GL_RGB32F */
-   { 36406, 0x00008D83 }, /* GL_RGB32I */
-   { 36416, 0x00008D83 }, /* GL_RGB32I_EXT */
-   { 36430, 0x00008D71 }, /* GL_RGB32UI */
-   { 36441, 0x00008D71 }, /* GL_RGB32UI_EXT */
-   { 36456, 0x0000804F }, /* GL_RGB4 */
-   { 36464, 0x0000804F }, /* GL_RGB4_EXT */
-   { 36476, 0x000083A1 }, /* GL_RGB4_S3TC */
-   { 36489, 0x00008050 }, /* GL_RGB5 */
-   { 36497, 0x00008D62 }, /* GL_RGB565 */
-   { 36507, 0x00008D62 }, /* GL_RGB565_OES */
-   { 36521, 0x00008057 }, /* GL_RGB5_A1 */
-   { 36532, 0x00008057 }, /* GL_RGB5_A1_EXT */
-   { 36547, 0x00008057 }, /* GL_RGB5_A1_OES */
-   { 36562, 0x00008050 }, /* GL_RGB5_EXT */
-   { 36574, 0x00008051 }, /* GL_RGB8 */
-   { 36582, 0x00008D8F }, /* GL_RGB8I */
-   { 36591, 0x00008D8F }, /* GL_RGB8I_EXT */
-   { 36604, 0x00008D7D }, /* GL_RGB8UI */
-   { 36614, 0x00008D7D }, /* GL_RGB8UI_EXT */
-   { 36628, 0x00008051 }, /* GL_RGB8_EXT */
-   { 36640, 0x00008051 }, /* GL_RGB8_OES */
-   { 36652, 0x00008F96 }, /* GL_RGB8_SNORM */
-   { 36666, 0x00008C3D }, /* GL_RGB9_E5 */
-   { 36677, 0x00001908 }, /* GL_RGBA */
-   { 36685, 0x0000805A }, /* GL_RGBA12 */
-   { 36695, 0x0000805A }, /* GL_RGBA12_EXT */
-   { 36709, 0x0000805B }, /* GL_RGBA16 */
-   { 36719, 0x0000881A }, /* GL_RGBA16F */
-   { 36730, 0x00008D88 }, /* GL_RGBA16I */
-   { 36741, 0x00008D88 }, /* GL_RGBA16I_EXT */
-   { 36756, 0x00008D76 }, /* GL_RGBA16UI */
-   { 36768, 0x00008D76 }, /* GL_RGBA16UI_EXT */
-   { 36784, 0x0000805B }, /* GL_RGBA16_EXT */
-   { 36798, 0x00008F9B }, /* GL_RGBA16_SNORM */
-   { 36814, 0x00008055 }, /* GL_RGBA2 */
-   { 36823, 0x00008055 }, /* GL_RGBA2_EXT */
-   { 36836, 0x00008814 }, /* GL_RGBA32F */
-   { 36847, 0x00008D82 }, /* GL_RGBA32I */
-   { 36858, 0x00008D82 }, /* GL_RGBA32I_EXT */
-   { 36873, 0x00008D70 }, /* GL_RGBA32UI */
-   { 36885, 0x00008D70 }, /* GL_RGBA32UI_EXT */
-   { 36901, 0x00008056 }, /* GL_RGBA4 */
-   { 36910, 0x000083A5 }, /* GL_RGBA4_DXT5_S3TC */
-   { 36929, 0x00008056 }, /* GL_RGBA4_EXT */
-   { 36942, 0x00008056 }, /* GL_RGBA4_OES */
-   { 36955, 0x000083A3 }, /* GL_RGBA4_S3TC */
-   { 36969, 0x00008058 }, /* GL_RGBA8 */
-   { 36978, 0x00008D8E }, /* GL_RGBA8I */
-   { 36988, 0x00008D8E }, /* GL_RGBA8I_EXT */
-   { 37002, 0x00008D7C }, /* GL_RGBA8UI */
-   { 37013, 0x00008D7C }, /* GL_RGBA8UI_EXT */
-   { 37028, 0x00008058 }, /* GL_RGBA8_EXT */
-   { 37041, 0x00008058 }, /* GL_RGBA8_OES */
-   { 37054, 0x00008F97 }, /* GL_RGBA8_SNORM */
-   { 37069, 0x000083A4 }, /* GL_RGBA_DXT5_S3TC */
-   { 37087, 0x00008D99 }, /* GL_RGBA_INTEGER */
-   { 37103, 0x00008D99 }, /* GL_RGBA_INTEGER_EXT */
-   { 37123, 0x00008D9E }, /* GL_RGBA_INTEGER_MODE_EXT */
-   { 37148, 0x00000C31 }, /* GL_RGBA_MODE */
-   { 37161, 0x000083A2 }, /* GL_RGBA_S3TC */
-   { 37174, 0x00008F93 }, /* GL_RGBA_SNORM */
-   { 37188, 0x00008D98 }, /* GL_RGB_INTEGER */
-   { 37203, 0x00008D98 }, /* GL_RGB_INTEGER_EXT */
-   { 37222, 0x000083A0 }, /* GL_RGB_S3TC */
-   { 37234, 0x00008573 }, /* GL_RGB_SCALE */
-   { 37247, 0x00008573 }, /* GL_RGB_SCALE_ARB */
-   { 37264, 0x00008573 }, /* GL_RGB_SCALE_EXT */
-   { 37281, 0x00008F92 }, /* GL_RGB_SNORM */
-   { 37294, 0x00008F91 }, /* GL_RG_SNORM */
-   { 37306, 0x00000407 }, /* GL_RIGHT */
-   { 37315, 0x00002000 }, /* GL_S */
-   { 37320, 0x00008B5D }, /* GL_SAMPLER_1D */
-   { 37334, 0x00008DC0 }, /* GL_SAMPLER_1D_ARRAY */
-   { 37354, 0x00008DC0 }, /* GL_SAMPLER_1D_ARRAY_EXT */
-   { 37378, 0x00008DC3 }, /* GL_SAMPLER_1D_ARRAY_SHADOW */
-   { 37405, 0x00008DC3 }, /* GL_SAMPLER_1D_ARRAY_SHADOW_EXT */
-   { 37436, 0x00008B61 }, /* GL_SAMPLER_1D_SHADOW */
-   { 37457, 0x00008B5E }, /* GL_SAMPLER_2D */
-   { 37471, 0x00008DC1 }, /* GL_SAMPLER_2D_ARRAY */
-   { 37491, 0x00008DC1 }, /* GL_SAMPLER_2D_ARRAY_EXT */
-   { 37515, 0x00008DC4 }, /* GL_SAMPLER_2D_ARRAY_SHADOW */
-   { 37542, 0x00008DC4 }, /* GL_SAMPLER_2D_ARRAY_SHADOW_EXT */
-   { 37573, 0x00008B63 }, /* GL_SAMPLER_2D_RECT */
-   { 37592, 0x00008B64 }, /* GL_SAMPLER_2D_RECT_SHADOW */
-   { 37618, 0x00008B62 }, /* GL_SAMPLER_2D_SHADOW */
-   { 37639, 0x00008B5F }, /* GL_SAMPLER_3D */
-   { 37653, 0x00008B5F }, /* GL_SAMPLER_3D_OES */
-   { 37671, 0x00008DC2 }, /* GL_SAMPLER_BUFFER */
-   { 37689, 0x00008DC2 }, /* GL_SAMPLER_BUFFER_EXT */
-   { 37711, 0x00008B60 }, /* GL_SAMPLER_CUBE */
-   { 37727, 0x00008DC5 }, /* GL_SAMPLER_CUBE_SHADOW */
-   { 37750, 0x00008DC5 }, /* GL_SAMPLER_CUBE_SHADOW_EXT */
-   { 37777, 0x000080A9 }, /* GL_SAMPLES */
-   { 37788, 0x000086B4 }, /* GL_SAMPLES_3DFX */
-   { 37804, 0x000080A9 }, /* GL_SAMPLES_ARB */
-   { 37819, 0x00008914 }, /* GL_SAMPLES_PASSED */
-   { 37837, 0x00008914 }, /* GL_SAMPLES_PASSED_ARB */
-   { 37859, 0x0000809E }, /* GL_SAMPLE_ALPHA_TO_COVERAGE */
-   { 37887, 0x0000809E }, /* GL_SAMPLE_ALPHA_TO_COVERAGE_ARB */
-   { 37919, 0x0000809F }, /* GL_SAMPLE_ALPHA_TO_ONE */
-   { 37942, 0x0000809F }, /* GL_SAMPLE_ALPHA_TO_ONE_ARB */
-   { 37969, 0x000080A8 }, /* GL_SAMPLE_BUFFERS */
-   { 37987, 0x000086B3 }, /* GL_SAMPLE_BUFFERS_3DFX */
-   { 38010, 0x000080A8 }, /* GL_SAMPLE_BUFFERS_ARB */
-   { 38032, 0x000080A0 }, /* GL_SAMPLE_COVERAGE */
-   { 38051, 0x000080A0 }, /* GL_SAMPLE_COVERAGE_ARB */
-   { 38074, 0x000080AB }, /* GL_SAMPLE_COVERAGE_INVERT */
-   { 38100, 0x000080AB }, /* GL_SAMPLE_COVERAGE_INVERT_ARB */
-   { 38130, 0x000080AA }, /* GL_SAMPLE_COVERAGE_VALUE */
-   { 38155, 0x000080AA }, /* GL_SAMPLE_COVERAGE_VALUE_ARB */
-   { 38184, 0x00080000 }, /* GL_SCISSOR_BIT */
-   { 38199, 0x00000C10 }, /* GL_SCISSOR_BOX */
-   { 38214, 0x00000C11 }, /* GL_SCISSOR_TEST */
-   { 38230, 0x0000845E }, /* GL_SECONDARY_COLOR_ARRAY */
-   { 38255, 0x0000889C }, /* GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING */
-   { 38295, 0x0000889C }, /* GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB */
-   { 38339, 0x0000845D }, /* GL_SECONDARY_COLOR_ARRAY_POINTER */
-   { 38372, 0x0000845A }, /* GL_SECONDARY_COLOR_ARRAY_SIZE */
-   { 38402, 0x0000845C }, /* GL_SECONDARY_COLOR_ARRAY_STRIDE */
-   { 38434, 0x0000845B }, /* GL_SECONDARY_COLOR_ARRAY_TYPE */
-   { 38464, 0x00001C02 }, /* GL_SELECT */
-   { 38474, 0x00000DF3 }, /* GL_SELECTION_BUFFER_POINTER */
-   { 38502, 0x00000DF4 }, /* GL_SELECTION_BUFFER_SIZE */
-   { 38527, 0x00008012 }, /* GL_SEPARABLE_2D */
-   { 38543, 0x00008C8D }, /* GL_SEPARATE_ATTRIBS */
-   { 38563, 0x00008C8D }, /* GL_SEPARATE_ATTRIBS_EXT */
-   { 38587, 0x000081FA }, /* GL_SEPARATE_SPECULAR_COLOR */
-   { 38614, 0x000081FA }, /* GL_SEPARATE_SPECULAR_COLOR_EXT */
-   { 38645, 0x0000150F }, /* GL_SET */
-   { 38652, 0x00008DF8 }, /* GL_SHADER_BINARY_FORMATS */
-   { 38677, 0x00008DFA }, /* GL_SHADER_COMPILER */
-   { 38696, 0x00008B48 }, /* GL_SHADER_OBJECT_ARB */
-   { 38717, 0x00008B88 }, /* GL_SHADER_SOURCE_LENGTH */
-   { 38741, 0x00008B4F }, /* GL_SHADER_TYPE */
-   { 38756, 0x00000B54 }, /* GL_SHADE_MODEL */
-   { 38771, 0x00008B8C }, /* GL_SHADING_LANGUAGE_VERSION */
-   { 38799, 0x000080BF }, /* GL_SHADOW_AMBIENT_SGIX */
-   { 38822, 0x000081FB }, /* GL_SHARED_TEXTURE_PALETTE_EXT */
-   { 38852, 0x00001601 }, /* GL_SHININESS */
-   { 38865, 0x00001402 }, /* GL_SHORT */
-   { 38874, 0x00009119 }, /* GL_SIGNALED */
-   { 38886, 0x00008F9C }, /* GL_SIGNED_NORMALIZED */
-   { 38907, 0x000081F9 }, /* GL_SINGLE_COLOR */
-   { 38923, 0x000081F9 }, /* GL_SINGLE_COLOR_EXT */
-   { 38943, 0x000085CC }, /* GL_SLICE_ACCUM_SUN */
-   { 38962, 0x00008C46 }, /* GL_SLUMINANCE */
-   { 38976, 0x00008C47 }, /* GL_SLUMINANCE8 */
-   { 38991, 0x00008C45 }, /* GL_SLUMINANCE8_ALPHA8 */
-   { 39013, 0x00008C44 }, /* GL_SLUMINANCE_ALPHA */
-   { 39033, 0x00001D01 }, /* GL_SMOOTH */
-   { 39043, 0x00000B23 }, /* GL_SMOOTH_LINE_WIDTH_GRANULARITY */
-   { 39076, 0x00000B22 }, /* GL_SMOOTH_LINE_WIDTH_RANGE */
-   { 39103, 0x00000B13 }, /* GL_SMOOTH_POINT_SIZE_GRANULARITY */
-   { 39136, 0x00000B12 }, /* GL_SMOOTH_POINT_SIZE_RANGE */
-   { 39163, 0x00008588 }, /* GL_SOURCE0_ALPHA */
-   { 39180, 0x00008588 }, /* GL_SOURCE0_ALPHA_ARB */
-   { 39201, 0x00008588 }, /* GL_SOURCE0_ALPHA_EXT */
-   { 39222, 0x00008580 }, /* GL_SOURCE0_RGB */
-   { 39237, 0x00008580 }, /* GL_SOURCE0_RGB_ARB */
-   { 39256, 0x00008580 }, /* GL_SOURCE0_RGB_EXT */
-   { 39275, 0x00008589 }, /* GL_SOURCE1_ALPHA */
-   { 39292, 0x00008589 }, /* GL_SOURCE1_ALPHA_ARB */
-   { 39313, 0x00008589 }, /* GL_SOURCE1_ALPHA_EXT */
-   { 39334, 0x00008581 }, /* GL_SOURCE1_RGB */
-   { 39349, 0x00008581 }, /* GL_SOURCE1_RGB_ARB */
-   { 39368, 0x00008581 }, /* GL_SOURCE1_RGB_EXT */
-   { 39387, 0x0000858A }, /* GL_SOURCE2_ALPHA */
-   { 39404, 0x0000858A }, /* GL_SOURCE2_ALPHA_ARB */
-   { 39425, 0x0000858A }, /* GL_SOURCE2_ALPHA_EXT */
-   { 39446, 0x00008582 }, /* GL_SOURCE2_RGB */
-   { 39461, 0x00008582 }, /* GL_SOURCE2_RGB_ARB */
-   { 39480, 0x00008582 }, /* GL_SOURCE2_RGB_EXT */
-   { 39499, 0x0000858B }, /* GL_SOURCE3_ALPHA_NV */
-   { 39519, 0x00008583 }, /* GL_SOURCE3_RGB_NV */
-   { 39537, 0x00001202 }, /* GL_SPECULAR */
-   { 39549, 0x00002402 }, /* GL_SPHERE_MAP */
-   { 39563, 0x00001206 }, /* GL_SPOT_CUTOFF */
-   { 39578, 0x00001204 }, /* GL_SPOT_DIRECTION */
-   { 39596, 0x00001205 }, /* GL_SPOT_EXPONENT */
-   { 39613, 0x00008588 }, /* GL_SRC0_ALPHA */
-   { 39627, 0x00008580 }, /* GL_SRC0_RGB */
-   { 39639, 0x00008589 }, /* GL_SRC1_ALPHA */
-   { 39653, 0x00008581 }, /* GL_SRC1_RGB */
-   { 39665, 0x0000858A }, /* GL_SRC2_ALPHA */
-   { 39679, 0x00008582 }, /* GL_SRC2_RGB */
-   { 39691, 0x00000302 }, /* GL_SRC_ALPHA */
-   { 39704, 0x00000308 }, /* GL_SRC_ALPHA_SATURATE */
-   { 39726, 0x00000300 }, /* GL_SRC_COLOR */
-   { 39739, 0x00008C40 }, /* GL_SRGB */
-   { 39747, 0x00008C41 }, /* GL_SRGB8 */
-   { 39756, 0x00008C43 }, /* GL_SRGB8_ALPHA8 */
-   { 39772, 0x00008C42 }, /* GL_SRGB_ALPHA */
-   { 39786, 0x00000503 }, /* GL_STACK_OVERFLOW */
-   { 39804, 0x00000504 }, /* GL_STACK_UNDERFLOW */
-   { 39823, 0x000088E6 }, /* GL_STATIC_COPY */
-   { 39838, 0x000088E6 }, /* GL_STATIC_COPY_ARB */
-   { 39857, 0x000088E4 }, /* GL_STATIC_DRAW */
-   { 39872, 0x000088E4 }, /* GL_STATIC_DRAW_ARB */
-   { 39891, 0x000088E5 }, /* GL_STATIC_READ */
-   { 39906, 0x000088E5 }, /* GL_STATIC_READ_ARB */
-   { 39925, 0x00001802 }, /* GL_STENCIL */
-   { 39936, 0x00008D20 }, /* GL_STENCIL_ATTACHMENT */
-   { 39958, 0x00008D20 }, /* GL_STENCIL_ATTACHMENT_EXT */
-   { 39984, 0x00008D20 }, /* GL_STENCIL_ATTACHMENT_OES */
-   { 40010, 0x00008801 }, /* GL_STENCIL_BACK_FAIL */
-   { 40031, 0x00008801 }, /* GL_STENCIL_BACK_FAIL_ATI */
-   { 40056, 0x00008800 }, /* GL_STENCIL_BACK_FUNC */
-   { 40077, 0x00008800 }, /* GL_STENCIL_BACK_FUNC_ATI */
-   { 40102, 0x00008802 }, /* GL_STENCIL_BACK_PASS_DEPTH_FAIL */
-   { 40134, 0x00008802 }, /* GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI */
-   { 40170, 0x00008803 }, /* GL_STENCIL_BACK_PASS_DEPTH_PASS */
-   { 40202, 0x00008803 }, /* GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI */
-   { 40238, 0x00008CA3 }, /* GL_STENCIL_BACK_REF */
-   { 40258, 0x00008CA4 }, /* GL_STENCIL_BACK_VALUE_MASK */
-   { 40285, 0x00008CA5 }, /* GL_STENCIL_BACK_WRITEMASK */
-   { 40311, 0x00000D57 }, /* GL_STENCIL_BITS */
-   { 40327, 0x00008224 }, /* GL_STENCIL_BUFFER */
-   { 40345, 0x00000400 }, /* GL_STENCIL_BUFFER_BIT */
-   { 40367, 0x00000B91 }, /* GL_STENCIL_CLEAR_VALUE */
-   { 40390, 0x00000B94 }, /* GL_STENCIL_FAIL */
-   { 40406, 0x00000B92 }, /* GL_STENCIL_FUNC */
-   { 40422, 0x00001901 }, /* GL_STENCIL_INDEX */
-   { 40439, 0x00008D46 }, /* GL_STENCIL_INDEX1 */
-   { 40457, 0x00008D49 }, /* GL_STENCIL_INDEX16 */
-   { 40476, 0x00008D49 }, /* GL_STENCIL_INDEX16_EXT */
-   { 40499, 0x00008D46 }, /* GL_STENCIL_INDEX1_EXT */
-   { 40521, 0x00008D46 }, /* GL_STENCIL_INDEX1_OES */
-   { 40543, 0x00008D47 }, /* GL_STENCIL_INDEX4 */
-   { 40561, 0x00008D47 }, /* GL_STENCIL_INDEX4_EXT */
-   { 40583, 0x00008D47 }, /* GL_STENCIL_INDEX4_OES */
-   { 40605, 0x00008D48 }, /* GL_STENCIL_INDEX8 */
-   { 40623, 0x00008D48 }, /* GL_STENCIL_INDEX8_EXT */
-   { 40645, 0x00008D48 }, /* GL_STENCIL_INDEX8_OES */
-   { 40667, 0x00008D45 }, /* GL_STENCIL_INDEX_EXT */
-   { 40688, 0x00000B95 }, /* GL_STENCIL_PASS_DEPTH_FAIL */
-   { 40715, 0x00000B96 }, /* GL_STENCIL_PASS_DEPTH_PASS */
-   { 40742, 0x00000B97 }, /* GL_STENCIL_REF */
-   { 40757, 0x00000B90 }, /* GL_STENCIL_TEST */
-   { 40773, 0x00008910 }, /* GL_STENCIL_TEST_TWO_SIDE_EXT */
-   { 40802, 0x00000B93 }, /* GL_STENCIL_VALUE_MASK */
-   { 40824, 0x00000B98 }, /* GL_STENCIL_WRITEMASK */
-   { 40845, 0x00000C33 }, /* GL_STEREO */
-   { 40855, 0x000085BE }, /* GL_STORAGE_CACHED_APPLE */
-   { 40879, 0x000085BD }, /* GL_STORAGE_PRIVATE_APPLE */
-   { 40904, 0x000085BF }, /* GL_STORAGE_SHARED_APPLE */
-   { 40928, 0x000088E2 }, /* GL_STREAM_COPY */
-   { 40943, 0x000088E2 }, /* GL_STREAM_COPY_ARB */
-   { 40962, 0x000088E0 }, /* GL_STREAM_DRAW */
-   { 40977, 0x000088E0 }, /* GL_STREAM_DRAW_ARB */
-   { 40996, 0x000088E1 }, /* GL_STREAM_READ */
-   { 41011, 0x000088E1 }, /* GL_STREAM_READ_ARB */
-   { 41030, 0x00000D50 }, /* GL_SUBPIXEL_BITS */
-   { 41047, 0x000084E7 }, /* GL_SUBTRACT */
-   { 41059, 0x000084E7 }, /* GL_SUBTRACT_ARB */
-   { 41075, 0x00009113 }, /* GL_SYNC_CONDITION */
-   { 41093, 0x00009116 }, /* GL_SYNC_FENCE */
-   { 41107, 0x00009115 }, /* GL_SYNC_FLAGS */
-   { 41121, 0x00000001 }, /* GL_SYNC_FLUSH_COMMANDS_BIT */
-   { 41148, 0x00009117 }, /* GL_SYNC_GPU_COMMANDS_COMPLETE */
-   { 41178, 0x00009114 }, /* GL_SYNC_STATUS */
-   { 41193, 0x00002001 }, /* GL_T */
-   { 41198, 0x00002A2A }, /* GL_T2F_C3F_V3F */
-   { 41213, 0x00002A2C }, /* GL_T2F_C4F_N3F_V3F */
-   { 41232, 0x00002A29 }, /* GL_T2F_C4UB_V3F */
-   { 41248, 0x00002A2B }, /* GL_T2F_N3F_V3F */
-   { 41263, 0x00002A27 }, /* GL_T2F_V3F */
-   { 41274, 0x00002A2D }, /* GL_T4F_C4F_N3F_V4F */
-   { 41293, 0x00002A28 }, /* GL_T4F_V4F */
-   { 41304, 0x00008031 }, /* GL_TABLE_TOO_LARGE_EXT */
-   { 41327, 0x00001702 }, /* GL_TEXTURE */
-   { 41338, 0x000084C0 }, /* GL_TEXTURE0 */
-   { 41350, 0x000084C0 }, /* GL_TEXTURE0_ARB */
-   { 41366, 0x000084C1 }, /* GL_TEXTURE1 */
-   { 41378, 0x000084CA }, /* GL_TEXTURE10 */
-   { 41391, 0x000084CA }, /* GL_TEXTURE10_ARB */
-   { 41408, 0x000084CB }, /* GL_TEXTURE11 */
-   { 41421, 0x000084CB }, /* GL_TEXTURE11_ARB */
-   { 41438, 0x000084CC }, /* GL_TEXTURE12 */
-   { 41451, 0x000084CC }, /* GL_TEXTURE12_ARB */
-   { 41468, 0x000084CD }, /* GL_TEXTURE13 */
-   { 41481, 0x000084CD }, /* GL_TEXTURE13_ARB */
-   { 41498, 0x000084CE }, /* GL_TEXTURE14 */
-   { 41511, 0x000084CE }, /* GL_TEXTURE14_ARB */
-   { 41528, 0x000084CF }, /* GL_TEXTURE15 */
-   { 41541, 0x000084CF }, /* GL_TEXTURE15_ARB */
-   { 41558, 0x000084D0 }, /* GL_TEXTURE16 */
-   { 41571, 0x000084D0 }, /* GL_TEXTURE16_ARB */
-   { 41588, 0x000084D1 }, /* GL_TEXTURE17 */
-   { 41601, 0x000084D1 }, /* GL_TEXTURE17_ARB */
-   { 41618, 0x000084D2 }, /* GL_TEXTURE18 */
-   { 41631, 0x000084D2 }, /* GL_TEXTURE18_ARB */
-   { 41648, 0x000084D3 }, /* GL_TEXTURE19 */
-   { 41661, 0x000084D3 }, /* GL_TEXTURE19_ARB */
-   { 41678, 0x000084C1 }, /* GL_TEXTURE1_ARB */
-   { 41694, 0x000084C2 }, /* GL_TEXTURE2 */
-   { 41706, 0x000084D4 }, /* GL_TEXTURE20 */
-   { 41719, 0x000084D4 }, /* GL_TEXTURE20_ARB */
-   { 41736, 0x000084D5 }, /* GL_TEXTURE21 */
-   { 41749, 0x000084D5 }, /* GL_TEXTURE21_ARB */
-   { 41766, 0x000084D6 }, /* GL_TEXTURE22 */
-   { 41779, 0x000084D6 }, /* GL_TEXTURE22_ARB */
-   { 41796, 0x000084D7 }, /* GL_TEXTURE23 */
-   { 41809, 0x000084D7 }, /* GL_TEXTURE23_ARB */
-   { 41826, 0x000084D8 }, /* GL_TEXTURE24 */
-   { 41839, 0x000084D8 }, /* GL_TEXTURE24_ARB */
-   { 41856, 0x000084D9 }, /* GL_TEXTURE25 */
-   { 41869, 0x000084D9 }, /* GL_TEXTURE25_ARB */
-   { 41886, 0x000084DA }, /* GL_TEXTURE26 */
-   { 41899, 0x000084DA }, /* GL_TEXTURE26_ARB */
-   { 41916, 0x000084DB }, /* GL_TEXTURE27 */
-   { 41929, 0x000084DB }, /* GL_TEXTURE27_ARB */
-   { 41946, 0x000084DC }, /* GL_TEXTURE28 */
-   { 41959, 0x000084DC }, /* GL_TEXTURE28_ARB */
-   { 41976, 0x000084DD }, /* GL_TEXTURE29 */
-   { 41989, 0x000084DD }, /* GL_TEXTURE29_ARB */
-   { 42006, 0x000084C2 }, /* GL_TEXTURE2_ARB */
-   { 42022, 0x000084C3 }, /* GL_TEXTURE3 */
-   { 42034, 0x000084DE }, /* GL_TEXTURE30 */
-   { 42047, 0x000084DE }, /* GL_TEXTURE30_ARB */
-   { 42064, 0x000084DF }, /* GL_TEXTURE31 */
-   { 42077, 0x000084DF }, /* GL_TEXTURE31_ARB */
-   { 42094, 0x000084C3 }, /* GL_TEXTURE3_ARB */
-   { 42110, 0x000084C4 }, /* GL_TEXTURE4 */
-   { 42122, 0x000084C4 }, /* GL_TEXTURE4_ARB */
-   { 42138, 0x000084C5 }, /* GL_TEXTURE5 */
-   { 42150, 0x000084C5 }, /* GL_TEXTURE5_ARB */
-   { 42166, 0x000084C6 }, /* GL_TEXTURE6 */
-   { 42178, 0x000084C6 }, /* GL_TEXTURE6_ARB */
-   { 42194, 0x000084C7 }, /* GL_TEXTURE7 */
-   { 42206, 0x000084C7 }, /* GL_TEXTURE7_ARB */
-   { 42222, 0x000084C8 }, /* GL_TEXTURE8 */
-   { 42234, 0x000084C8 }, /* GL_TEXTURE8_ARB */
-   { 42250, 0x000084C9 }, /* GL_TEXTURE9 */
-   { 42262, 0x000084C9 }, /* GL_TEXTURE9_ARB */
-   { 42278, 0x00000DE0 }, /* GL_TEXTURE_1D */
-   { 42292, 0x00008C18 }, /* GL_TEXTURE_1D_ARRAY */
-   { 42312, 0x00008C18 }, /* GL_TEXTURE_1D_ARRAY_EXT */
-   { 42336, 0x00000DE1 }, /* GL_TEXTURE_2D */
-   { 42350, 0x00008C1A }, /* GL_TEXTURE_2D_ARRAY */
-   { 42370, 0x00008C1A }, /* GL_TEXTURE_2D_ARRAY_EXT */
-   { 42394, 0x0000806F }, /* GL_TEXTURE_3D */
-   { 42408, 0x0000806F }, /* GL_TEXTURE_3D_OES */
-   { 42426, 0x0000805F }, /* GL_TEXTURE_ALPHA_SIZE */
-   { 42448, 0x0000805F }, /* GL_TEXTURE_ALPHA_SIZE_EXT */
-   { 42474, 0x0000813C }, /* GL_TEXTURE_BASE_LEVEL */
-   { 42496, 0x00008068 }, /* GL_TEXTURE_BINDING_1D */
-   { 42518, 0x00008C1C }, /* GL_TEXTURE_BINDING_1D_ARRAY */
-   { 42546, 0x00008C1C }, /* GL_TEXTURE_BINDING_1D_ARRAY_EXT */
-   { 42578, 0x00008069 }, /* GL_TEXTURE_BINDING_2D */
-   { 42600, 0x00008C1D }, /* GL_TEXTURE_BINDING_2D_ARRAY */
-   { 42628, 0x00008C1D }, /* GL_TEXTURE_BINDING_2D_ARRAY_EXT */
-   { 42660, 0x0000806A }, /* GL_TEXTURE_BINDING_3D */
-   { 42682, 0x0000806A }, /* GL_TEXTURE_BINDING_3D_OES */
-   { 42708, 0x00008C2C }, /* GL_TEXTURE_BINDING_BUFFER */
-   { 42734, 0x00008514 }, /* GL_TEXTURE_BINDING_CUBE_MAP */
-   { 42762, 0x00008514 }, /* GL_TEXTURE_BINDING_CUBE_MAP_ARB */
-   { 42794, 0x00008514 }, /* GL_TEXTURE_BINDING_CUBE_MAP_OES */
-   { 42826, 0x000084F6 }, /* GL_TEXTURE_BINDING_RECTANGLE */
-   { 42855, 0x000084F6 }, /* GL_TEXTURE_BINDING_RECTANGLE_ARB */
-   { 42888, 0x000084F6 }, /* GL_TEXTURE_BINDING_RECTANGLE_NV */
-   { 42920, 0x00040000 }, /* GL_TEXTURE_BIT */
-   { 42935, 0x0000805E }, /* GL_TEXTURE_BLUE_SIZE */
-   { 42956, 0x0000805E }, /* GL_TEXTURE_BLUE_SIZE_EXT */
-   { 42981, 0x00001005 }, /* GL_TEXTURE_BORDER */
-   { 42999, 0x00001004 }, /* GL_TEXTURE_BORDER_COLOR */
-   { 43023, 0x00008C2A }, /* GL_TEXTURE_BUFFER */
-   { 43041, 0x00008C2D }, /* GL_TEXTURE_BUFFER_DATA_STORE_BINDING */
-   { 43078, 0x00008C2E }, /* GL_TEXTURE_BUFFER_FORMAT */
-   { 43103, 0x00008171 }, /* GL_TEXTURE_CLIPMAP_CENTER_SGIX */
-   { 43134, 0x00008176 }, /* GL_TEXTURE_CLIPMAP_DEPTH_SGIX */
-   { 43164, 0x00008172 }, /* GL_TEXTURE_CLIPMAP_FRAME_SGIX */
-   { 43194, 0x00008175 }, /* GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX */
-   { 43229, 0x00008173 }, /* GL_TEXTURE_CLIPMAP_OFFSET_SGIX */
-   { 43260, 0x00008174 }, /* GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX */
-   { 43298, 0x000080BC }, /* GL_TEXTURE_COLOR_TABLE_SGI */
-   { 43325, 0x000081EF }, /* GL_TEXTURE_COLOR_WRITEMASK_SGIS */
-   { 43357, 0x000080BF }, /* GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */
-   { 43391, 0x0000884D }, /* GL_TEXTURE_COMPARE_FUNC */
-   { 43415, 0x0000884D }, /* GL_TEXTURE_COMPARE_FUNC_ARB */
-   { 43443, 0x0000884C }, /* GL_TEXTURE_COMPARE_MODE */
-   { 43467, 0x0000884C }, /* GL_TEXTURE_COMPARE_MODE_ARB */
-   { 43495, 0x0000819B }, /* GL_TEXTURE_COMPARE_OPERATOR_SGIX */
-   { 43528, 0x0000819A }, /* GL_TEXTURE_COMPARE_SGIX */
-   { 43552, 0x00001003 }, /* GL_TEXTURE_COMPONENTS */
-   { 43574, 0x000086A1 }, /* GL_TEXTURE_COMPRESSED */
-   { 43596, 0x000086A1 }, /* GL_TEXTURE_COMPRESSED_ARB */
-   { 43622, 0x000086A3 }, /* GL_TEXTURE_COMPRESSED_FORMATS_ARB */
-   { 43656, 0x000086A0 }, /* GL_TEXTURE_COMPRESSED_IMAGE_SIZE */
-   { 43689, 0x000086A0 }, /* GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB */
-   { 43726, 0x000084EF }, /* GL_TEXTURE_COMPRESSION_HINT */
-   { 43754, 0x000084EF }, /* GL_TEXTURE_COMPRESSION_HINT_ARB */
-   { 43786, 0x00008078 }, /* GL_TEXTURE_COORD_ARRAY */
-   { 43809, 0x0000889A }, /* GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING */
-   { 43847, 0x0000889A }, /* GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB */
-   { 43889, 0x00008092 }, /* GL_TEXTURE_COORD_ARRAY_POINTER */
-   { 43920, 0x00008088 }, /* GL_TEXTURE_COORD_ARRAY_SIZE */
-   { 43948, 0x0000808A }, /* GL_TEXTURE_COORD_ARRAY_STRIDE */
-   { 43978, 0x00008089 }, /* GL_TEXTURE_COORD_ARRAY_TYPE */
-   { 44006, 0x00008B9D }, /* GL_TEXTURE_CROP_RECT_OES */
-   { 44031, 0x00008513 }, /* GL_TEXTURE_CUBE_MAP */
-   { 44051, 0x00008513 }, /* GL_TEXTURE_CUBE_MAP_ARB */
-   { 44075, 0x00008516 }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_X */
-   { 44106, 0x00008516 }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB */
-   { 44141, 0x00008516 }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_X_OES */
-   { 44176, 0x00008518 }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Y */
-   { 44207, 0x00008518 }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB */
-   { 44242, 0x00008518 }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_OES */
-   { 44277, 0x0000851A }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Z */
-   { 44308, 0x0000851A }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB */
-   { 44343, 0x0000851A }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_OES */
-   { 44378, 0x00008513 }, /* GL_TEXTURE_CUBE_MAP_OES */
-   { 44402, 0x00008515 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_X */
-   { 44433, 0x00008515 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB */
-   { 44468, 0x00008515 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_X_OES */
-   { 44503, 0x00008517 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Y */
-   { 44534, 0x00008517 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB */
-   { 44569, 0x00008517 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Y_OES */
-   { 44604, 0x00008519 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Z */
-   { 44635, 0x00008519 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB */
-   { 44670, 0x00008519 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Z_OES */
-   { 44705, 0x000088F4 }, /* GL_TEXTURE_CUBE_MAP_SEAMLESS */
-   { 44734, 0x00008071 }, /* GL_TEXTURE_DEPTH */
-   { 44751, 0x0000884A }, /* GL_TEXTURE_DEPTH_SIZE */
-   { 44773, 0x0000884A }, /* GL_TEXTURE_DEPTH_SIZE_ARB */
-   { 44799, 0x00002300 }, /* GL_TEXTURE_ENV */
-   { 44814, 0x00002201 }, /* GL_TEXTURE_ENV_COLOR */
-   { 44835, 0x00002200 }, /* GL_TEXTURE_ENV_MODE */
-   { 44855, 0x00008500 }, /* GL_TEXTURE_FILTER_CONTROL */
-   { 44881, 0x00008500 }, /* GL_TEXTURE_FILTER_CONTROL_EXT */
-   { 44911, 0x00002500 }, /* GL_TEXTURE_GEN_MODE */
-   { 44931, 0x00002500 }, /* GL_TEXTURE_GEN_MODE_OES */
-   { 44955, 0x00000C63 }, /* GL_TEXTURE_GEN_Q */
-   { 44972, 0x00000C62 }, /* GL_TEXTURE_GEN_R */
-   { 44989, 0x00000C60 }, /* GL_TEXTURE_GEN_S */
-   { 45006, 0x00008D60 }, /* GL_TEXTURE_GEN_STR_OES */
-   { 45029, 0x00000C61 }, /* GL_TEXTURE_GEN_T */
-   { 45046, 0x0000819D }, /* GL_TEXTURE_GEQUAL_R_SGIX */
-   { 45071, 0x0000805D }, /* GL_TEXTURE_GREEN_SIZE */
-   { 45093, 0x0000805D }, /* GL_TEXTURE_GREEN_SIZE_EXT */
-   { 45119, 0x00001001 }, /* GL_TEXTURE_HEIGHT */
-   { 45137, 0x000080ED }, /* GL_TEXTURE_INDEX_SIZE_EXT */
-   { 45163, 0x00008061 }, /* GL_TEXTURE_INTENSITY_SIZE */
-   { 45189, 0x00008061 }, /* GL_TEXTURE_INTENSITY_SIZE_EXT */
-   { 45219, 0x00001003 }, /* GL_TEXTURE_INTERNAL_FORMAT */
-   { 45246, 0x0000819C }, /* GL_TEXTURE_LEQUAL_R_SGIX */
-   { 45271, 0x00008501 }, /* GL_TEXTURE_LOD_BIAS */
-   { 45291, 0x00008501 }, /* GL_TEXTURE_LOD_BIAS_EXT */
-   { 45315, 0x00008190 }, /* GL_TEXTURE_LOD_BIAS_R_SGIX */
-   { 45342, 0x0000818E }, /* GL_TEXTURE_LOD_BIAS_S_SGIX */
-   { 45369, 0x0000818F }, /* GL_TEXTURE_LOD_BIAS_T_SGIX */
-   { 45396, 0x00008060 }, /* GL_TEXTURE_LUMINANCE_SIZE */
-   { 45422, 0x00008060 }, /* GL_TEXTURE_LUMINANCE_SIZE_EXT */
-   { 45452, 0x00002800 }, /* GL_TEXTURE_MAG_FILTER */
-   { 45474, 0x00000BA8 }, /* GL_TEXTURE_MATRIX */
-   { 45492, 0x0000898F }, /* GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES */
-   { 45532, 0x000084FE }, /* GL_TEXTURE_MAX_ANISOTROPY_EXT */
-   { 45562, 0x0000836B }, /* GL_TEXTURE_MAX_CLAMP_R_SGIX */
-   { 45590, 0x00008369 }, /* GL_TEXTURE_MAX_CLAMP_S_SGIX */
-   { 45618, 0x0000836A }, /* GL_TEXTURE_MAX_CLAMP_T_SGIX */
-   { 45646, 0x0000813D }, /* GL_TEXTURE_MAX_LEVEL */
-   { 45667, 0x0000813B }, /* GL_TEXTURE_MAX_LOD */
-   { 45686, 0x00002801 }, /* GL_TEXTURE_MIN_FILTER */
-   { 45708, 0x0000813A }, /* GL_TEXTURE_MIN_LOD */
-   { 45727, 0x00008066 }, /* GL_TEXTURE_PRIORITY */
-   { 45747, 0x000085B7 }, /* GL_TEXTURE_RANGE_LENGTH_APPLE */
-   { 45777, 0x000085B8 }, /* GL_TEXTURE_RANGE_POINTER_APPLE */
-   { 45808, 0x000084F5 }, /* GL_TEXTURE_RECTANGLE */
-   { 45829, 0x000084F5 }, /* GL_TEXTURE_RECTANGLE_ARB */
-   { 45854, 0x000084F5 }, /* GL_TEXTURE_RECTANGLE_NV */
-   { 45878, 0x0000805C }, /* GL_TEXTURE_RED_SIZE */
-   { 45898, 0x0000805C }, /* GL_TEXTURE_RED_SIZE_EXT */
-   { 45922, 0x00008067 }, /* GL_TEXTURE_RESIDENT */
-   { 45942, 0x00008C3F }, /* GL_TEXTURE_SHARED_SIZE */
-   { 45965, 0x00000BA5 }, /* GL_TEXTURE_STACK_DEPTH */
-   { 45988, 0x000088F1 }, /* GL_TEXTURE_STENCIL_SIZE */
-   { 46012, 0x000088F1 }, /* GL_TEXTURE_STENCIL_SIZE_EXT */
-   { 46040, 0x000085BC }, /* GL_TEXTURE_STORAGE_HINT_APPLE */
-   { 46070, 0x00008065 }, /* GL_TEXTURE_TOO_LARGE_EXT */
-   { 46095, 0x0000888F }, /* GL_TEXTURE_UNSIGNED_REMAP_MODE_NV */
-   { 46129, 0x00001000 }, /* GL_TEXTURE_WIDTH */
-   { 46146, 0x00008072 }, /* GL_TEXTURE_WRAP_R */
-   { 46164, 0x00008072 }, /* GL_TEXTURE_WRAP_R_OES */
-   { 46186, 0x00002802 }, /* GL_TEXTURE_WRAP_S */
-   { 46204, 0x00002803 }, /* GL_TEXTURE_WRAP_T */
-   { 46222, 0x0000911B }, /* GL_TIMEOUT_EXPIRED */
-   { 46241, 0x000088BF }, /* GL_TIME_ELAPSED_EXT */
-   { 46261, 0x00008648 }, /* GL_TRACK_MATRIX_NV */
-   { 46280, 0x00008649 }, /* GL_TRACK_MATRIX_TRANSFORM_NV */
-   { 46309, 0x00001000 }, /* GL_TRANSFORM_BIT */
-   { 46326, 0x00008E22 }, /* GL_TRANSFORM_FEEDBACK */
-   { 46348, 0x00008E25 }, /* GL_TRANSFORM_FEEDBACK_BINDING */
-   { 46378, 0x00008C8E }, /* GL_TRANSFORM_FEEDBACK_BUFFER */
-   { 46407, 0x00008E24 }, /* GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE */
-   { 46443, 0x00008C8F }, /* GL_TRANSFORM_FEEDBACK_BUFFER_BINDING */
-   { 46480, 0x00008C8F }, /* GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT */
-   { 46521, 0x00008C8E }, /* GL_TRANSFORM_FEEDBACK_BUFFER_EXT */
-   { 46554, 0x00008C7F }, /* GL_TRANSFORM_FEEDBACK_BUFFER_MODE */
-   { 46588, 0x00008C7F }, /* GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT */
-   { 46626, 0x00008E23 }, /* GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED */
-   { 46662, 0x00008C85 }, /* GL_TRANSFORM_FEEDBACK_BUFFER_SIZE */
-   { 46696, 0x00008C85 }, /* GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT */
-   { 46734, 0x00008C84 }, /* GL_TRANSFORM_FEEDBACK_BUFFER_START */
-   { 46769, 0x00008C84 }, /* GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT */
-   { 46808, 0x00008C88 }, /* GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN */
-   { 46849, 0x00008C88 }, /* GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT */
-   { 46894, 0x00008C83 }, /* GL_TRANSFORM_FEEDBACK_VARYINGS */
-   { 46925, 0x00008C83 }, /* GL_TRANSFORM_FEEDBACK_VARYINGS_EXT */
-   { 46960, 0x00008C76 }, /* GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH */
-   { 47001, 0x00008C76 }, /* GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT */
-   { 47046, 0x000084E6 }, /* GL_TRANSPOSE_COLOR_MATRIX */
-   { 47072, 0x000084E6 }, /* GL_TRANSPOSE_COLOR_MATRIX_ARB */
-   { 47102, 0x000088B7 }, /* GL_TRANSPOSE_CURRENT_MATRIX_ARB */
-   { 47134, 0x000084E3 }, /* GL_TRANSPOSE_MODELVIEW_MATRIX */
-   { 47164, 0x000084E3 }, /* GL_TRANSPOSE_MODELVIEW_MATRIX_ARB */
-   { 47198, 0x0000862C }, /* GL_TRANSPOSE_NV */
-   { 47214, 0x000084E4 }, /* GL_TRANSPOSE_PROJECTION_MATRIX */
-   { 47245, 0x000084E4 }, /* GL_TRANSPOSE_PROJECTION_MATRIX_ARB */
-   { 47280, 0x000084E5 }, /* GL_TRANSPOSE_TEXTURE_MATRIX */
-   { 47308, 0x000084E5 }, /* GL_TRANSPOSE_TEXTURE_MATRIX_ARB */
-   { 47340, 0x00000004 }, /* GL_TRIANGLES */
-   { 47353, 0x0000000C }, /* GL_TRIANGLES_ADJACENCY */
-   { 47376, 0x0000000C }, /* GL_TRIANGLES_ADJACENCY_ARB */
-   { 47403, 0x00000006 }, /* GL_TRIANGLE_FAN */
-   { 47419, 0x00008615 }, /* GL_TRIANGLE_MESH_SUN */
-   { 47440, 0x00000005 }, /* GL_TRIANGLE_STRIP */
-   { 47458, 0x0000000D }, /* GL_TRIANGLE_STRIP_ADJACENCY */
-   { 47486, 0x0000000D }, /* GL_TRIANGLE_STRIP_ADJACENCY_ARB */
-   { 47518, 0x00000001 }, /* GL_TRUE */
-   { 47526, 0x00008A1C }, /* GL_UNDEFINED_APPLE */
-   { 47545, 0x00000CF5 }, /* GL_UNPACK_ALIGNMENT */
-   { 47565, 0x0000806E }, /* GL_UNPACK_IMAGE_HEIGHT */
-   { 47588, 0x00000CF1 }, /* GL_UNPACK_LSB_FIRST */
-   { 47608, 0x00000CF2 }, /* GL_UNPACK_ROW_LENGTH */
-   { 47629, 0x0000806D }, /* GL_UNPACK_SKIP_IMAGES */
-   { 47651, 0x00000CF4 }, /* GL_UNPACK_SKIP_PIXELS */
-   { 47673, 0x00000CF3 }, /* GL_UNPACK_SKIP_ROWS */
-   { 47693, 0x00000CF0 }, /* GL_UNPACK_SWAP_BYTES */
-   { 47714, 0x00009118 }, /* GL_UNSIGNALED */
-   { 47728, 0x00001401 }, /* GL_UNSIGNED_BYTE */
-   { 47745, 0x00008362 }, /* GL_UNSIGNED_BYTE_2_3_3_REV */
-   { 47772, 0x00008032 }, /* GL_UNSIGNED_BYTE_3_3_2 */
-   { 47795, 0x00001405 }, /* GL_UNSIGNED_INT */
-   { 47811, 0x00008C3B }, /* GL_UNSIGNED_INT_10F_11F_11F_REV */
-   { 47843, 0x00008036 }, /* GL_UNSIGNED_INT_10_10_10_2 */
-   { 47870, 0x00008DF6 }, /* GL_UNSIGNED_INT_10_10_10_2_OES */
-   { 47901, 0x000084FA }, /* GL_UNSIGNED_INT_24_8 */
-   { 47922, 0x000084FA }, /* GL_UNSIGNED_INT_24_8_EXT */
-   { 47947, 0x000084FA }, /* GL_UNSIGNED_INT_24_8_NV */
-   { 47971, 0x000084FA }, /* GL_UNSIGNED_INT_24_8_OES */
-   { 47996, 0x00008368 }, /* GL_UNSIGNED_INT_2_10_10_10_REV */
-   { 48027, 0x00008368 }, /* GL_UNSIGNED_INT_2_10_10_10_REV_EXT */
-   { 48062, 0x00008C3E }, /* GL_UNSIGNED_INT_5_9_9_9_REV */
-   { 48090, 0x00008035 }, /* GL_UNSIGNED_INT_8_8_8_8 */
-   { 48114, 0x00008367 }, /* GL_UNSIGNED_INT_8_8_8_8_REV */
-   { 48142, 0x00008DD1 }, /* GL_UNSIGNED_INT_SAMPLER_1D */
-   { 48169, 0x00008DD6 }, /* GL_UNSIGNED_INT_SAMPLER_1D_ARRAY */
-   { 48202, 0x00008DD6 }, /* GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT */
-   { 48239, 0x00008DD1 }, /* GL_UNSIGNED_INT_SAMPLER_1D_EXT */
-   { 48270, 0x00008DD2 }, /* GL_UNSIGNED_INT_SAMPLER_2D */
-   { 48297, 0x00008DD7 }, /* GL_UNSIGNED_INT_SAMPLER_2D_ARRAY */
-   { 48330, 0x00008DD7 }, /* GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT */
-   { 48367, 0x00008DD2 }, /* GL_UNSIGNED_INT_SAMPLER_2D_EXT */
-   { 48398, 0x00008DD5 }, /* GL_UNSIGNED_INT_SAMPLER_2D_RECT */
-   { 48430, 0x00008DD5 }, /* GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT */
-   { 48466, 0x00008DD3 }, /* GL_UNSIGNED_INT_SAMPLER_3D */
-   { 48493, 0x00008DD3 }, /* GL_UNSIGNED_INT_SAMPLER_3D_EXT */
-   { 48524, 0x00008DD8 }, /* GL_UNSIGNED_INT_SAMPLER_BUFFER */
-   { 48555, 0x00008DD8 }, /* GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT */
-   { 48590, 0x00008DD4 }, /* GL_UNSIGNED_INT_SAMPLER_CUBE */
-   { 48619, 0x00008DD4 }, /* GL_UNSIGNED_INT_SAMPLER_CUBE_EXT */
-   { 48652, 0x00008DC6 }, /* GL_UNSIGNED_INT_VEC2 */
-   { 48673, 0x00008DC6 }, /* GL_UNSIGNED_INT_VEC2_EXT */
-   { 48698, 0x00008DC7 }, /* GL_UNSIGNED_INT_VEC3 */
-   { 48719, 0x00008DC7 }, /* GL_UNSIGNED_INT_VEC3_EXT */
-   { 48744, 0x00008DC8 }, /* GL_UNSIGNED_INT_VEC4 */
-   { 48765, 0x00008DC8 }, /* GL_UNSIGNED_INT_VEC4_EXT */
-   { 48790, 0x00008C17 }, /* GL_UNSIGNED_NORMALIZED */
-   { 48813, 0x00001403 }, /* GL_UNSIGNED_SHORT */
-   { 48831, 0x00008366 }, /* GL_UNSIGNED_SHORT_1_5_5_5_REV */
-   { 48861, 0x00008366 }, /* GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT */
-   { 48895, 0x00008033 }, /* GL_UNSIGNED_SHORT_4_4_4_4 */
-   { 48921, 0x00008365 }, /* GL_UNSIGNED_SHORT_4_4_4_4_REV */
-   { 48951, 0x00008365 }, /* GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT */
-   { 48985, 0x00008034 }, /* GL_UNSIGNED_SHORT_5_5_5_1 */
-   { 49011, 0x00008363 }, /* GL_UNSIGNED_SHORT_5_6_5 */
-   { 49035, 0x00008364 }, /* GL_UNSIGNED_SHORT_5_6_5_REV */
-   { 49063, 0x000085BA }, /* GL_UNSIGNED_SHORT_8_8_APPLE */
-   { 49091, 0x000085BA }, /* GL_UNSIGNED_SHORT_8_8_MESA */
-   { 49118, 0x000085BB }, /* GL_UNSIGNED_SHORT_8_8_REV_APPLE */
-   { 49150, 0x000085BB }, /* GL_UNSIGNED_SHORT_8_8_REV_MESA */
-   { 49181, 0x00008CA2 }, /* GL_UPPER_LEFT */
-   { 49195, 0x00002A20 }, /* GL_V2F */
-   { 49202, 0x00002A21 }, /* GL_V3F */
-   { 49209, 0x00008B83 }, /* GL_VALIDATE_STATUS */
-   { 49228, 0x00001F00 }, /* GL_VENDOR */
-   { 49238, 0x00001F02 }, /* GL_VERSION */
-   { 49249, 0x00008074 }, /* GL_VERTEX_ARRAY */
-   { 49265, 0x000085B5 }, /* GL_VERTEX_ARRAY_BINDING */
-   { 49289, 0x000085B5 }, /* GL_VERTEX_ARRAY_BINDING_APPLE */
-   { 49319, 0x00008896 }, /* GL_VERTEX_ARRAY_BUFFER_BINDING */
-   { 49350, 0x00008896 }, /* GL_VERTEX_ARRAY_BUFFER_BINDING_ARB */
-   { 49385, 0x0000808E }, /* GL_VERTEX_ARRAY_POINTER */
-   { 49409, 0x0000807A }, /* GL_VERTEX_ARRAY_SIZE */
-   { 49430, 0x0000807C }, /* GL_VERTEX_ARRAY_STRIDE */
-   { 49453, 0x0000807B }, /* GL_VERTEX_ARRAY_TYPE */
-   { 49474, 0x00008650 }, /* GL_VERTEX_ATTRIB_ARRAY0_NV */
-   { 49501, 0x0000865A }, /* GL_VERTEX_ATTRIB_ARRAY10_NV */
-   { 49529, 0x0000865B }, /* GL_VERTEX_ATTRIB_ARRAY11_NV */
-   { 49557, 0x0000865C }, /* GL_VERTEX_ATTRIB_ARRAY12_NV */
-   { 49585, 0x0000865D }, /* GL_VERTEX_ATTRIB_ARRAY13_NV */
-   { 49613, 0x0000865E }, /* GL_VERTEX_ATTRIB_ARRAY14_NV */
-   { 49641, 0x0000865F }, /* GL_VERTEX_ATTRIB_ARRAY15_NV */
-   { 49669, 0x00008651 }, /* GL_VERTEX_ATTRIB_ARRAY1_NV */
-   { 49696, 0x00008652 }, /* GL_VERTEX_ATTRIB_ARRAY2_NV */
-   { 49723, 0x00008653 }, /* GL_VERTEX_ATTRIB_ARRAY3_NV */
-   { 49750, 0x00008654 }, /* GL_VERTEX_ATTRIB_ARRAY4_NV */
-   { 49777, 0x00008655 }, /* GL_VERTEX_ATTRIB_ARRAY5_NV */
-   { 49804, 0x00008656 }, /* GL_VERTEX_ATTRIB_ARRAY6_NV */
-   { 49831, 0x00008657 }, /* GL_VERTEX_ATTRIB_ARRAY7_NV */
-   { 49858, 0x00008658 }, /* GL_VERTEX_ATTRIB_ARRAY8_NV */
-   { 49885, 0x00008659 }, /* GL_VERTEX_ATTRIB_ARRAY9_NV */
-   { 49912, 0x0000889F }, /* GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING */
-   { 49950, 0x0000889F }, /* GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB */
-   { 49992, 0x000088FE }, /* GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB */
-   { 50027, 0x00008622 }, /* GL_VERTEX_ATTRIB_ARRAY_ENABLED */
-   { 50058, 0x00008622 }, /* GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB */
-   { 50093, 0x000088FD }, /* GL_VERTEX_ATTRIB_ARRAY_INTEGER */
-   { 50124, 0x000088FD }, /* GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT */
-   { 50159, 0x0000886A }, /* GL_VERTEX_ATTRIB_ARRAY_NORMALIZED */
-   { 50193, 0x0000886A }, /* GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB */
-   { 50231, 0x00008645 }, /* GL_VERTEX_ATTRIB_ARRAY_POINTER */
-   { 50262, 0x00008645 }, /* GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB */
-   { 50297, 0x00008623 }, /* GL_VERTEX_ATTRIB_ARRAY_SIZE */
-   { 50325, 0x00008623 }, /* GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB */
-   { 50357, 0x00008624 }, /* GL_VERTEX_ATTRIB_ARRAY_STRIDE */
-   { 50387, 0x00008624 }, /* GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB */
-   { 50421, 0x00008625 }, /* GL_VERTEX_ATTRIB_ARRAY_TYPE */
-   { 50449, 0x00008625 }, /* GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB */
-   { 50481, 0x000086A7 }, /* GL_VERTEX_BLEND_ARB */
-   { 50501, 0x00008620 }, /* GL_VERTEX_PROGRAM_ARB */
-   { 50523, 0x0000864A }, /* GL_VERTEX_PROGRAM_BINDING_NV */
-   { 50552, 0x00008620 }, /* GL_VERTEX_PROGRAM_NV */
-   { 50573, 0x00008642 }, /* GL_VERTEX_PROGRAM_POINT_SIZE */
-   { 50602, 0x00008642 }, /* GL_VERTEX_PROGRAM_POINT_SIZE_ARB */
-   { 50635, 0x00008642 }, /* GL_VERTEX_PROGRAM_POINT_SIZE_NV */
-   { 50667, 0x00008643 }, /* GL_VERTEX_PROGRAM_TWO_SIDE */
-   { 50694, 0x00008643 }, /* GL_VERTEX_PROGRAM_TWO_SIDE_ARB */
-   { 50725, 0x00008643 }, /* GL_VERTEX_PROGRAM_TWO_SIDE_NV */
-   { 50755, 0x00008B31 }, /* GL_VERTEX_SHADER */
-   { 50772, 0x00008B31 }, /* GL_VERTEX_SHADER_ARB */
-   { 50793, 0x00008621 }, /* GL_VERTEX_STATE_PROGRAM_NV */
-   { 50820, 0x00000BA2 }, /* GL_VIEWPORT */
-   { 50832, 0x00000800 }, /* GL_VIEWPORT_BIT */
-   { 50848, 0x00008A1A }, /* GL_VOLATILE_APPLE */
-   { 50866, 0x0000911D }, /* GL_WAIT_FAILED */
-   { 50881, 0x000086AD }, /* GL_WEIGHT_ARRAY_ARB */
-   { 50901, 0x0000889E }, /* GL_WEIGHT_ARRAY_BUFFER_BINDING */
-   { 50932, 0x0000889E }, /* GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB */
-   { 50967, 0x0000889E }, /* GL_WEIGHT_ARRAY_BUFFER_BINDING_OES */
-   { 51002, 0x000086AD }, /* GL_WEIGHT_ARRAY_OES */
-   { 51022, 0x000086AC }, /* GL_WEIGHT_ARRAY_POINTER_ARB */
-   { 51050, 0x000086AC }, /* GL_WEIGHT_ARRAY_POINTER_OES */
-   { 51078, 0x000086AB }, /* GL_WEIGHT_ARRAY_SIZE_ARB */
-   { 51103, 0x000086AB }, /* GL_WEIGHT_ARRAY_SIZE_OES */
-   { 51128, 0x000086AA }, /* GL_WEIGHT_ARRAY_STRIDE_ARB */
-   { 51155, 0x000086AA }, /* GL_WEIGHT_ARRAY_STRIDE_OES */
-   { 51182, 0x000086A9 }, /* GL_WEIGHT_ARRAY_TYPE_ARB */
-   { 51207, 0x000086A9 }, /* GL_WEIGHT_ARRAY_TYPE_OES */
-   { 51232, 0x000086A6 }, /* GL_WEIGHT_SUM_UNITY_ARB */
-   { 51256, 0x000081D4 }, /* GL_WRAP_BORDER_SUN */
-   { 51275, 0x000088B9 }, /* GL_WRITE_ONLY */
-   { 51289, 0x000088B9 }, /* GL_WRITE_ONLY_ARB */
-   { 51307, 0x000088B9 }, /* GL_WRITE_ONLY_OES */
-   { 51325, 0x00001506 }, /* GL_XOR */
-   { 51332, 0x000085B9 }, /* GL_YCBCR_422_APPLE */
-   { 51351, 0x00008757 }, /* GL_YCBCR_MESA */
-   { 51365, 0x00000000 }, /* GL_ZERO */
-   { 51373, 0x00000D16 }, /* GL_ZOOM_X */
-   { 51383, 0x00000D17 }, /* GL_ZOOM_Y */
-};
-
-static const unsigned reduced_enums[1552] =
-{
-       535, /* GL_FALSE */
-       827, /* GL_LINES */
-       831, /* GL_LINE_LOOP */
-       838, /* GL_LINE_STRIP */
-      2135, /* GL_TRIANGLES */
-      2140, /* GL_TRIANGLE_STRIP */
-      2138, /* GL_TRIANGLE_FAN */
-      1507, /* GL_QUADS */
-      1511, /* GL_QUAD_STRIP */
-      1378, /* GL_POLYGON */
-       828, /* GL_LINES_ADJACENCY */
-       839, /* GL_LINE_STRIP_ADJACENCY */
-      2136, /* GL_TRIANGLES_ADJACENCY */
-      2141, /* GL_TRIANGLE_STRIP_ADJACENCY */
-      1390, /* GL_POLYGON_STIPPLE_BIT */
-      1333, /* GL_PIXEL_MODE_BIT */
-       814, /* GL_LIGHTING_BIT */
-       568, /* GL_FOG_BIT */
-         8, /* GL_ACCUM */
-       850, /* GL_LOAD */
-      1596, /* GL_RETURN */
-      1200, /* GL_MULT */
-        24, /* GL_ADD */
-      1216, /* GL_NEVER */
-       804, /* GL_LESS */
-       525, /* GL_EQUAL */
-       803, /* GL_LEQUAL */
-       691, /* GL_GREATER */
-      1233, /* GL_NOTEQUAL */
-       690, /* GL_GEQUAL */
-        55, /* GL_ALWAYS */
-      1803, /* GL_SRC_COLOR */
-      1266, /* GL_ONE_MINUS_SRC_COLOR */
-      1801, /* GL_SRC_ALPHA */
-      1265, /* GL_ONE_MINUS_SRC_ALPHA */
-       504, /* GL_DST_ALPHA */
-      1263, /* GL_ONE_MINUS_DST_ALPHA */
-       505, /* GL_DST_COLOR */
-      1264, /* GL_ONE_MINUS_DST_COLOR */
-      1802, /* GL_SRC_ALPHA_SATURATE */
-       667, /* GL_FRONT_LEFT */
-       668, /* GL_FRONT_RIGHT */
-        77, /* GL_BACK_LEFT */
-        78, /* GL_BACK_RIGHT */
-       664, /* GL_FRONT */
-        76, /* GL_BACK */
-       802, /* GL_LEFT */
-      1685, /* GL_RIGHT */
-       665, /* GL_FRONT_AND_BACK */
-        71, /* GL_AUX0 */
-        72, /* GL_AUX1 */
-        73, /* GL_AUX2 */
-        74, /* GL_AUX3 */
-       790, /* GL_INVALID_ENUM */
-       795, /* GL_INVALID_VALUE */
-       794, /* GL_INVALID_OPERATION */
-      1808, /* GL_STACK_OVERFLOW */
-      1809, /* GL_STACK_UNDERFLOW */
-      1291, /* GL_OUT_OF_MEMORY */
-       791, /* GL_INVALID_FRAMEBUFFER_OPERATION */
-         0, /* GL_2D */
-         2, /* GL_3D */
-         3, /* GL_3D_COLOR */
-         4, /* GL_3D_COLOR_TEXTURE */
-         6, /* GL_4D_COLOR_TEXTURE */
-      1311, /* GL_PASS_THROUGH_TOKEN */
-      1377, /* GL_POINT_TOKEN */
-       841, /* GL_LINE_TOKEN */
-      1391, /* GL_POLYGON_TOKEN */
-        87, /* GL_BITMAP_TOKEN */
-       503, /* GL_DRAW_PIXEL_TOKEN */
-       349, /* GL_COPY_PIXEL_TOKEN */
-       832, /* GL_LINE_RESET_TOKEN */
-       528, /* GL_EXP */
-       529, /* GL_EXP2 */
-       386, /* GL_CW */
-       154, /* GL_CCW */
-       184, /* GL_COEFF */
-      1288, /* GL_ORDER */
-       440, /* GL_DOMAIN */
-       359, /* GL_CURRENT_COLOR */
-       362, /* GL_CURRENT_INDEX */
-       368, /* GL_CURRENT_NORMAL */
-       382, /* GL_CURRENT_TEXTURE_COORDS */
-       374, /* GL_CURRENT_RASTER_COLOR */
-       376, /* GL_CURRENT_RASTER_INDEX */
-       380, /* GL_CURRENT_RASTER_TEXTURE_COORDS */
-       377, /* GL_CURRENT_RASTER_POSITION */
-       378, /* GL_CURRENT_RASTER_POSITION_VALID */
-       375, /* GL_CURRENT_RASTER_DISTANCE */
-      1369, /* GL_POINT_SMOOTH */
-      1353, /* GL_POINT_SIZE */
-      1368, /* GL_POINT_SIZE_RANGE */
-      1359, /* GL_POINT_SIZE_GRANULARITY */
-       833, /* GL_LINE_SMOOTH */
-       842, /* GL_LINE_WIDTH */
-       844, /* GL_LINE_WIDTH_RANGE */
-       843, /* GL_LINE_WIDTH_GRANULARITY */
-       835, /* GL_LINE_STIPPLE */
-       836, /* GL_LINE_STIPPLE_PATTERN */
-       837, /* GL_LINE_STIPPLE_REPEAT */
-       849, /* GL_LIST_MODE */
-      1056, /* GL_MAX_LIST_NESTING */
-       846, /* GL_LIST_BASE */
-       848, /* GL_LIST_INDEX */
-      1380, /* GL_POLYGON_MODE */
-      1387, /* GL_POLYGON_SMOOTH */
-      1389, /* GL_POLYGON_STIPPLE */
-       514, /* GL_EDGE_FLAG */
-       352, /* GL_CULL_FACE */
-       353, /* GL_CULL_FACE_MODE */
-       666, /* GL_FRONT_FACE */
-       813, /* GL_LIGHTING */
-       818, /* GL_LIGHT_MODEL_LOCAL_VIEWER */
-       819, /* GL_LIGHT_MODEL_TWO_SIDE */
-       815, /* GL_LIGHT_MODEL_AMBIENT */
-      1750, /* GL_SHADE_MODEL */
-       232, /* GL_COLOR_MATERIAL_FACE */
-       233, /* GL_COLOR_MATERIAL_PARAMETER */
-       231, /* GL_COLOR_MATERIAL */
-       567, /* GL_FOG */
-       589, /* GL_FOG_INDEX */
-       585, /* GL_FOG_DENSITY */
-       593, /* GL_FOG_START */
-       587, /* GL_FOG_END */
-       590, /* GL_FOG_MODE */
-       569, /* GL_FOG_COLOR */
-       425, /* GL_DEPTH_RANGE */
-       434, /* GL_DEPTH_TEST */
-       437, /* GL_DEPTH_WRITEMASK */
-       410, /* GL_DEPTH_CLEAR_VALUE */
-       424, /* GL_DEPTH_FUNC */
-        12, /* GL_ACCUM_CLEAR_VALUE */
-      1853, /* GL_STENCIL_TEST */
-      1834, /* GL_STENCIL_CLEAR_VALUE */
-      1836, /* GL_STENCIL_FUNC */
-      1855, /* GL_STENCIL_VALUE_MASK */
-      1835, /* GL_STENCIL_FAIL */
-      1850, /* GL_STENCIL_PASS_DEPTH_FAIL */
-      1851, /* GL_STENCIL_PASS_DEPTH_PASS */
-      1852, /* GL_STENCIL_REF */
-      1856, /* GL_STENCIL_WRITEMASK */
-      1006, /* GL_MATRIX_MODE */
-      1222, /* GL_NORMALIZE */
-      2267, /* GL_VIEWPORT */
-      1195, /* GL_MODELVIEW_STACK_DEPTH */
-      1481, /* GL_PROJECTION_STACK_DEPTH */
-      2089, /* GL_TEXTURE_STACK_DEPTH */
-      1192, /* GL_MODELVIEW_MATRIX */
-      1479, /* GL_PROJECTION_MATRIX */
-      2069, /* GL_TEXTURE_MATRIX */
-        69, /* GL_ATTRIB_STACK_DEPTH */
-       166, /* GL_CLIENT_ATTRIB_STACK_DEPTH */
-        51, /* GL_ALPHA_TEST */
-        52, /* GL_ALPHA_TEST_FUNC */
-        53, /* GL_ALPHA_TEST_REF */
-       439, /* GL_DITHER */
-        91, /* GL_BLEND_DST */
-       105, /* GL_BLEND_SRC */
-        88, /* GL_BLEND */
-       852, /* GL_LOGIC_OP_MODE */
-       739, /* GL_INDEX_LOGIC_OP */
-       230, /* GL_COLOR_LOGIC_OP */
-        75, /* GL_AUX_BUFFERS */
-       450, /* GL_DRAW_BUFFER */
-      1534, /* GL_READ_BUFFER */
-      1727, /* GL_SCISSOR_BOX */
-      1728, /* GL_SCISSOR_TEST */
-       738, /* GL_INDEX_CLEAR_VALUE */
-       743, /* GL_INDEX_WRITEMASK */
-       227, /* GL_COLOR_CLEAR_VALUE */
-       269, /* GL_COLOR_WRITEMASK */
-       740, /* GL_INDEX_MODE */
-      1674, /* GL_RGBA_MODE */
-       449, /* GL_DOUBLEBUFFER */
-      1857, /* GL_STEREO */
-      1588, /* GL_RENDER_MODE */
-      1312, /* GL_PERSPECTIVE_CORRECTION_HINT */
-      1370, /* GL_POINT_SMOOTH_HINT */
-       834, /* GL_LINE_SMOOTH_HINT */
-      1388, /* GL_POLYGON_SMOOTH_HINT */
-       588, /* GL_FOG_HINT */
-      2049, /* GL_TEXTURE_GEN_S */
-      2051, /* GL_TEXTURE_GEN_T */
-      2048, /* GL_TEXTURE_GEN_R */
-      2047, /* GL_TEXTURE_GEN_Q */
-      1325, /* GL_PIXEL_MAP_I_TO_I */
-      1331, /* GL_PIXEL_MAP_S_TO_S */
-      1327, /* GL_PIXEL_MAP_I_TO_R */
-      1323, /* GL_PIXEL_MAP_I_TO_G */
-      1321, /* GL_PIXEL_MAP_I_TO_B */
-      1319, /* GL_PIXEL_MAP_I_TO_A */
-      1329, /* GL_PIXEL_MAP_R_TO_R */
-      1317, /* GL_PIXEL_MAP_G_TO_G */
-      1315, /* GL_PIXEL_MAP_B_TO_B */
-      1313, /* GL_PIXEL_MAP_A_TO_A */
-      1326, /* GL_PIXEL_MAP_I_TO_I_SIZE */
-      1332, /* GL_PIXEL_MAP_S_TO_S_SIZE */
-      1328, /* GL_PIXEL_MAP_I_TO_R_SIZE */
-      1324, /* GL_PIXEL_MAP_I_TO_G_SIZE */
-      1322, /* GL_PIXEL_MAP_I_TO_B_SIZE */
-      1320, /* GL_PIXEL_MAP_I_TO_A_SIZE */
-      1330, /* GL_PIXEL_MAP_R_TO_R_SIZE */
-      1318, /* GL_PIXEL_MAP_G_TO_G_SIZE */
-      1316, /* GL_PIXEL_MAP_B_TO_B_SIZE */
-      1314, /* GL_PIXEL_MAP_A_TO_A_SIZE */
-      2152, /* GL_UNPACK_SWAP_BYTES */
-      2147, /* GL_UNPACK_LSB_FIRST */
-      2148, /* GL_UNPACK_ROW_LENGTH */
-      2151, /* GL_UNPACK_SKIP_ROWS */
-      2150, /* GL_UNPACK_SKIP_PIXELS */
-      2145, /* GL_UNPACK_ALIGNMENT */
-      1300, /* GL_PACK_SWAP_BYTES */
-      1295, /* GL_PACK_LSB_FIRST */
-      1296, /* GL_PACK_ROW_LENGTH */
-      1299, /* GL_PACK_SKIP_ROWS */
-      1298, /* GL_PACK_SKIP_PIXELS */
-      1292, /* GL_PACK_ALIGNMENT */
-       947, /* GL_MAP_COLOR */
-       952, /* GL_MAP_STENCIL */
-       742, /* GL_INDEX_SHIFT */
-       741, /* GL_INDEX_OFFSET */
-      1550, /* GL_RED_SCALE */
-      1546, /* GL_RED_BIAS */
-      2293, /* GL_ZOOM_X */
-      2294, /* GL_ZOOM_Y */
-       697, /* GL_GREEN_SCALE */
-       693, /* GL_GREEN_BIAS */
-       115, /* GL_BLUE_SCALE */
-       111, /* GL_BLUE_BIAS */
-        50, /* GL_ALPHA_SCALE */
-        47, /* GL_ALPHA_BIAS */
-       426, /* GL_DEPTH_SCALE */
-       402, /* GL_DEPTH_BIAS */
-      1038, /* GL_MAX_EVAL_ORDER */
-      1055, /* GL_MAX_LIGHTS */
-      1018, /* GL_MAX_CLIP_DISTANCES */
-      1110, /* GL_MAX_TEXTURE_SIZE */
-      1062, /* GL_MAX_PIXEL_MAP_TABLE */
-      1014, /* GL_MAX_ATTRIB_STACK_DEPTH */
-      1058, /* GL_MAX_MODELVIEW_STACK_DEPTH */
-      1059, /* GL_MAX_NAME_STACK_DEPTH */
-      1090, /* GL_MAX_PROJECTION_STACK_DEPTH */
-      1111, /* GL_MAX_TEXTURE_STACK_DEPTH */
-      1137, /* GL_MAX_VIEWPORT_DIMS */
-      1015, /* GL_MAX_CLIENT_ATTRIB_STACK_DEPTH */
-      1867, /* GL_SUBPIXEL_BITS */
-       737, /* GL_INDEX_BITS */
-      1547, /* GL_RED_BITS */
-       694, /* GL_GREEN_BITS */
-       112, /* GL_BLUE_BITS */
-        48, /* GL_ALPHA_BITS */
-       403, /* GL_DEPTH_BITS */
-      1831, /* GL_STENCIL_BITS */
-        14, /* GL_ACCUM_RED_BITS */
-        13, /* GL_ACCUM_GREEN_BITS */
-        10, /* GL_ACCUM_BLUE_BITS */
-         9, /* GL_ACCUM_ALPHA_BITS */
-      1209, /* GL_NAME_STACK_DEPTH */
-        70, /* GL_AUTO_NORMAL */
-       893, /* GL_MAP1_COLOR_4 */
-       896, /* GL_MAP1_INDEX */
-       897, /* GL_MAP1_NORMAL */
-       898, /* GL_MAP1_TEXTURE_COORD_1 */
-       899, /* GL_MAP1_TEXTURE_COORD_2 */
-       900, /* GL_MAP1_TEXTURE_COORD_3 */
-       901, /* GL_MAP1_TEXTURE_COORD_4 */
-       902, /* GL_MAP1_VERTEX_3 */
-       903, /* GL_MAP1_VERTEX_4 */
-       920, /* GL_MAP2_COLOR_4 */
-       923, /* GL_MAP2_INDEX */
-       924, /* GL_MAP2_NORMAL */
-       925, /* GL_MAP2_TEXTURE_COORD_1 */
-       926, /* GL_MAP2_TEXTURE_COORD_2 */
-       927, /* GL_MAP2_TEXTURE_COORD_3 */
-       928, /* GL_MAP2_TEXTURE_COORD_4 */
-       929, /* GL_MAP2_VERTEX_3 */
-       930, /* GL_MAP2_VERTEX_4 */
-       894, /* GL_MAP1_GRID_DOMAIN */
-       895, /* GL_MAP1_GRID_SEGMENTS */
-       921, /* GL_MAP2_GRID_DOMAIN */
-       922, /* GL_MAP2_GRID_SEGMENTS */
-      1950, /* GL_TEXTURE_1D */
-      1953, /* GL_TEXTURE_2D */
-       538, /* GL_FEEDBACK_BUFFER_POINTER */
-       539, /* GL_FEEDBACK_BUFFER_SIZE */
-       540, /* GL_FEEDBACK_BUFFER_TYPE */
-      1737, /* GL_SELECTION_BUFFER_POINTER */
-      1738, /* GL_SELECTION_BUFFER_SIZE */
-      2095, /* GL_TEXTURE_WIDTH */
-      2055, /* GL_TEXTURE_HEIGHT */
-      1999, /* GL_TEXTURE_COMPONENTS */
-      1980, /* GL_TEXTURE_BORDER_COLOR */
-      1979, /* GL_TEXTURE_BORDER */
-       441, /* GL_DONT_CARE */
-       536, /* GL_FASTEST */
-      1217, /* GL_NICEST */
-        56, /* GL_AMBIENT */
-       438, /* GL_DIFFUSE */
-      1790, /* GL_SPECULAR */
-      1392, /* GL_POSITION */
-      1793, /* GL_SPOT_DIRECTION */
-      1794, /* GL_SPOT_EXPONENT */
-      1792, /* GL_SPOT_CUTOFF */
-       317, /* GL_CONSTANT_ATTENUATION */
-       822, /* GL_LINEAR_ATTENUATION */
-      1506, /* GL_QUADRATIC_ATTENUATION */
-       284, /* GL_COMPILE */
-       285, /* GL_COMPILE_AND_EXECUTE */
-       149, /* GL_BYTE */
-      2154, /* GL_UNSIGNED_BYTE */
-      1755, /* GL_SHORT */
-      2193, /* GL_UNSIGNED_SHORT */
-       745, /* GL_INT */
-      2157, /* GL_UNSIGNED_INT */
-       548, /* GL_FLOAT */
-         1, /* GL_2_BYTES */
-         5, /* GL_3_BYTES */
-         7, /* GL_4_BYTES */
-       448, /* GL_DOUBLE */
-       698, /* GL_HALF_FLOAT */
-       544, /* GL_FIXED */
-       162, /* GL_CLEAR */
-        58, /* GL_AND */
-        60, /* GL_AND_REVERSE */
-       347, /* GL_COPY */
-        59, /* GL_AND_INVERTED */
-      1220, /* GL_NOOP */
-      2289, /* GL_XOR */
-      1287, /* GL_OR */
-      1221, /* GL_NOR */
-       526, /* GL_EQUIV */
-       798, /* GL_INVERT */
-      1290, /* GL_OR_REVERSE */
-       348, /* GL_COPY_INVERTED */
-      1289, /* GL_OR_INVERTED */
-      1210, /* GL_NAND */
-      1744, /* GL_SET */
-       523, /* GL_EMISSION */
-      1754, /* GL_SHININESS */
-        57, /* GL_AMBIENT_AND_DIFFUSE */
-       229, /* GL_COLOR_INDEXES */
-      1159, /* GL_MODELVIEW */
-      1478, /* GL_PROJECTION */
-      1885, /* GL_TEXTURE */
-       185, /* GL_COLOR */
-       395, /* GL_DEPTH */
-      1816, /* GL_STENCIL */
-       228, /* GL_COLOR_INDEX */
-      1837, /* GL_STENCIL_INDEX */
-       411, /* GL_DEPTH_COMPONENT */
-      1543, /* GL_RED */
-       692, /* GL_GREEN */
-       110, /* GL_BLUE */
-        32, /* GL_ALPHA */
-      1599, /* GL_RGB */
-      1639, /* GL_RGBA */
-       856, /* GL_LUMINANCE */
-       883, /* GL_LUMINANCE_ALPHA */
-        86, /* GL_BITMAP */
-      1342, /* GL_POINT */
-       820, /* GL_LINE */
-       541, /* GL_FILL */
-      1557, /* GL_RENDER */
-       537, /* GL_FEEDBACK */
-      1736, /* GL_SELECT */
-       547, /* GL_FLAT */
-      1765, /* GL_SMOOTH */
-       799, /* GL_KEEP */
-      1590, /* GL_REPLACE */
-       727, /* GL_INCR */
-       391, /* GL_DECR */
-      2210, /* GL_VENDOR */
-      1587, /* GL_RENDERER */
-      2211, /* GL_VERSION */
-       530, /* GL_EXTENSIONS */
-      1686, /* GL_S */
-      1876, /* GL_T */
-      1526, /* GL_R */
-      1505, /* GL_Q */
-      1196, /* GL_MODULATE */
-       390, /* GL_DECAL */
-      2042, /* GL_TEXTURE_ENV_MODE */
-      2041, /* GL_TEXTURE_ENV_COLOR */
-      2040, /* GL_TEXTURE_ENV */
-       531, /* GL_EYE_LINEAR */
-      1248, /* GL_OBJECT_LINEAR */
-      1791, /* GL_SPHERE_MAP */
-      2045, /* GL_TEXTURE_GEN_MODE */
-      1250, /* GL_OBJECT_PLANE */
-       532, /* GL_EYE_PLANE */
-      1211, /* GL_NEAREST */
-       821, /* GL_LINEAR */
-      1215, /* GL_NEAREST_MIPMAP_NEAREST */
-       826, /* GL_LINEAR_MIPMAP_NEAREST */
-      1214, /* GL_NEAREST_MIPMAP_LINEAR */
-       825, /* GL_LINEAR_MIPMAP_LINEAR */
-      2068, /* GL_TEXTURE_MAG_FILTER */
-      2077, /* GL_TEXTURE_MIN_FILTER */
-      2098, /* GL_TEXTURE_WRAP_S */
-      2099, /* GL_TEXTURE_WRAP_T */
-       155, /* GL_CLAMP */
-      1589, /* GL_REPEAT */
-      1386, /* GL_POLYGON_OFFSET_UNITS */
-      1385, /* GL_POLYGON_OFFSET_POINT */
-      1384, /* GL_POLYGON_OFFSET_LINE */
-      1529, /* GL_R3_G3_B2 */
-      2207, /* GL_V2F */
-      2208, /* GL_V3F */
-       152, /* GL_C4UB_V2F */
-       153, /* GL_C4UB_V3F */
-       150, /* GL_C3F_V3F */
-      1208, /* GL_N3F_V3F */
-       151, /* GL_C4F_N3F_V3F */
-      1881, /* GL_T2F_V3F */
-      1883, /* GL_T4F_V4F */
-      1879, /* GL_T2F_C4UB_V3F */
-      1877, /* GL_T2F_C3F_V3F */
-      1880, /* GL_T2F_N3F_V3F */
-      1878, /* GL_T2F_C4F_N3F_V3F */
-      1882, /* GL_T4F_C4F_N3F_V4F */
-       169, /* GL_CLIP_DISTANCE0 */
-       170, /* GL_CLIP_DISTANCE1 */
-       171, /* GL_CLIP_DISTANCE2 */
-       172, /* GL_CLIP_DISTANCE3 */
-       173, /* GL_CLIP_DISTANCE4 */
-       174, /* GL_CLIP_DISTANCE5 */
-       175, /* GL_CLIP_DISTANCE6 */
-       176, /* GL_CLIP_DISTANCE7 */
-       805, /* GL_LIGHT0 */
-       806, /* GL_LIGHT1 */
-       807, /* GL_LIGHT2 */
-       808, /* GL_LIGHT3 */
-       809, /* GL_LIGHT4 */
-       810, /* GL_LIGHT5 */
-       811, /* GL_LIGHT6 */
-       812, /* GL_LIGHT7 */
-       702, /* GL_HINT_BIT */
-       319, /* GL_CONSTANT_COLOR */
-      1261, /* GL_ONE_MINUS_CONSTANT_COLOR */
-       314, /* GL_CONSTANT_ALPHA */
-      1259, /* GL_ONE_MINUS_CONSTANT_ALPHA */
-        89, /* GL_BLEND_COLOR */
-       669, /* GL_FUNC_ADD */
-      1140, /* GL_MIN */
-      1009, /* GL_MAX */
-        96, /* GL_BLEND_EQUATION */
-       675, /* GL_FUNC_SUBTRACT */
-       672, /* GL_FUNC_REVERSE_SUBTRACT */
-       327, /* GL_CONVOLUTION_1D */
-       328, /* GL_CONVOLUTION_2D */
-      1739, /* GL_SEPARABLE_2D */
-       331, /* GL_CONVOLUTION_BORDER_MODE */
-       335, /* GL_CONVOLUTION_FILTER_SCALE */
-       333, /* GL_CONVOLUTION_FILTER_BIAS */
-      1544, /* GL_REDUCE */
-       337, /* GL_CONVOLUTION_FORMAT */
-       341, /* GL_CONVOLUTION_WIDTH */
-       339, /* GL_CONVOLUTION_HEIGHT */
-      1028, /* GL_MAX_CONVOLUTION_WIDTH */
-      1026, /* GL_MAX_CONVOLUTION_HEIGHT */
-      1425, /* GL_POST_CONVOLUTION_RED_SCALE */
-      1421, /* GL_POST_CONVOLUTION_GREEN_SCALE */
-      1416, /* GL_POST_CONVOLUTION_BLUE_SCALE */
-      1412, /* GL_POST_CONVOLUTION_ALPHA_SCALE */
-      1423, /* GL_POST_CONVOLUTION_RED_BIAS */
-      1419, /* GL_POST_CONVOLUTION_GREEN_BIAS */
-      1414, /* GL_POST_CONVOLUTION_BLUE_BIAS */
-      1410, /* GL_POST_CONVOLUTION_ALPHA_BIAS */
-       703, /* GL_HISTOGRAM */
-      1485, /* GL_PROXY_HISTOGRAM */
-       719, /* GL_HISTOGRAM_WIDTH */
-       709, /* GL_HISTOGRAM_FORMAT */
-       715, /* GL_HISTOGRAM_RED_SIZE */
-       711, /* GL_HISTOGRAM_GREEN_SIZE */
-       706, /* GL_HISTOGRAM_BLUE_SIZE */
-       704, /* GL_HISTOGRAM_ALPHA_SIZE */
-       713, /* GL_HISTOGRAM_LUMINANCE_SIZE */
-       717, /* GL_HISTOGRAM_SINK */
-      1141, /* GL_MINMAX */
-      1143, /* GL_MINMAX_FORMAT */
-      1145, /* GL_MINMAX_SINK */
-      1884, /* GL_TABLE_TOO_LARGE_EXT */
-      2156, /* GL_UNSIGNED_BYTE_3_3_2 */
-      2196, /* GL_UNSIGNED_SHORT_4_4_4_4 */
-      2199, /* GL_UNSIGNED_SHORT_5_5_5_1 */
-      2168, /* GL_UNSIGNED_INT_8_8_8_8 */
-      2159, /* GL_UNSIGNED_INT_10_10_10_2 */
-      1383, /* GL_POLYGON_OFFSET_FILL */
-      1382, /* GL_POLYGON_OFFSET_FACTOR */
-      1381, /* GL_POLYGON_OFFSET_BIAS */
-      1593, /* GL_RESCALE_NORMAL */
-        41, /* GL_ALPHA4 */
-        43, /* GL_ALPHA8 */
-        33, /* GL_ALPHA12 */
-        35, /* GL_ALPHA16 */
-       871, /* GL_LUMINANCE4 */
-       877, /* GL_LUMINANCE8 */
-       857, /* GL_LUMINANCE12 */
-       863, /* GL_LUMINANCE16 */
-       872, /* GL_LUMINANCE4_ALPHA4 */
-       875, /* GL_LUMINANCE6_ALPHA2 */
-       880, /* GL_LUMINANCE8_ALPHA8 */
-       860, /* GL_LUMINANCE12_ALPHA4 */
-       858, /* GL_LUMINANCE12_ALPHA12 */
-       866, /* GL_LUMINANCE16_ALPHA16 */
-       746, /* GL_INTENSITY */
-       755, /* GL_INTENSITY4 */
-       757, /* GL_INTENSITY8 */
-       747, /* GL_INTENSITY12 */
-       749, /* GL_INTENSITY16 */
-      1614, /* GL_RGB2_EXT */
-      1620, /* GL_RGB4 */
-      1623, /* GL_RGB5 */
-      1630, /* GL_RGB8 */
-      1600, /* GL_RGB10 */
-      1604, /* GL_RGB12 */
-      1606, /* GL_RGB16 */
-      1650, /* GL_RGBA2 */
-      1657, /* GL_RGBA4 */
-      1626, /* GL_RGB5_A1 */
-      1662, /* GL_RGBA8 */
-      1601, /* GL_RGB10_A2 */
-      1640, /* GL_RGBA12 */
-      1642, /* GL_RGBA16 */
-      2085, /* GL_TEXTURE_RED_SIZE */
-      2053, /* GL_TEXTURE_GREEN_SIZE */
-      1977, /* GL_TEXTURE_BLUE_SIZE */
-      1958, /* GL_TEXTURE_ALPHA_SIZE */
-      2066, /* GL_TEXTURE_LUMINANCE_SIZE */
-      2057, /* GL_TEXTURE_INTENSITY_SIZE */
-      1591, /* GL_REPLACE_EXT */
-      1489, /* GL_PROXY_TEXTURE_1D */
-      1493, /* GL_PROXY_TEXTURE_2D */
-      2093, /* GL_TEXTURE_TOO_LARGE_EXT */
-      2079, /* GL_TEXTURE_PRIORITY */
-      2087, /* GL_TEXTURE_RESIDENT */
-      1961, /* GL_TEXTURE_BINDING_1D */
-      1964, /* GL_TEXTURE_BINDING_2D */
-      1967, /* GL_TEXTURE_BINDING_3D */
-      1297, /* GL_PACK_SKIP_IMAGES */
-      1293, /* GL_PACK_IMAGE_HEIGHT */
-      2149, /* GL_UNPACK_SKIP_IMAGES */
-      2146, /* GL_UNPACK_IMAGE_HEIGHT */
-      1956, /* GL_TEXTURE_3D */
-      1497, /* GL_PROXY_TEXTURE_3D */
-      2037, /* GL_TEXTURE_DEPTH */
-      2096, /* GL_TEXTURE_WRAP_R */
-      1010, /* GL_MAX_3D_TEXTURE_SIZE */
-      2212, /* GL_VERTEX_ARRAY */
-      1223, /* GL_NORMAL_ARRAY */
-       186, /* GL_COLOR_ARRAY */
-       731, /* GL_INDEX_ARRAY */
-      2007, /* GL_TEXTURE_COORD_ARRAY */
-       515, /* GL_EDGE_FLAG_ARRAY */
-      2218, /* GL_VERTEX_ARRAY_SIZE */
-      2220, /* GL_VERTEX_ARRAY_TYPE */
-      2219, /* GL_VERTEX_ARRAY_STRIDE */
-      1228, /* GL_NORMAL_ARRAY_TYPE */
-      1227, /* GL_NORMAL_ARRAY_STRIDE */
-       190, /* GL_COLOR_ARRAY_SIZE */
-       192, /* GL_COLOR_ARRAY_TYPE */
-       191, /* GL_COLOR_ARRAY_STRIDE */
-       736, /* GL_INDEX_ARRAY_TYPE */
-       735, /* GL_INDEX_ARRAY_STRIDE */
-      2011, /* GL_TEXTURE_COORD_ARRAY_SIZE */
-      2013, /* GL_TEXTURE_COORD_ARRAY_TYPE */
-      2012, /* GL_TEXTURE_COORD_ARRAY_STRIDE */
-       519, /* GL_EDGE_FLAG_ARRAY_STRIDE */
-      2217, /* GL_VERTEX_ARRAY_POINTER */
-      1226, /* GL_NORMAL_ARRAY_POINTER */
-       189, /* GL_COLOR_ARRAY_POINTER */
-       734, /* GL_INDEX_ARRAY_POINTER */
-      2010, /* GL_TEXTURE_COORD_ARRAY_POINTER */
-       518, /* GL_EDGE_FLAG_ARRAY_POINTER */
-      1201, /* GL_MULTISAMPLE */
-      1713, /* GL_SAMPLE_ALPHA_TO_COVERAGE */
-      1715, /* GL_SAMPLE_ALPHA_TO_ONE */
-      1720, /* GL_SAMPLE_COVERAGE */
-      1717, /* GL_SAMPLE_BUFFERS */
-      1708, /* GL_SAMPLES */
-      1724, /* GL_SAMPLE_COVERAGE_VALUE */
-      1722, /* GL_SAMPLE_COVERAGE_INVERT */
-       234, /* GL_COLOR_MATRIX */
-       236, /* GL_COLOR_MATRIX_STACK_DEPTH */
-      1022, /* GL_MAX_COLOR_MATRIX_STACK_DEPTH */
-      1408, /* GL_POST_COLOR_MATRIX_RED_SCALE */
-      1404, /* GL_POST_COLOR_MATRIX_GREEN_SCALE */
-      1399, /* GL_POST_COLOR_MATRIX_BLUE_SCALE */
-      1395, /* GL_POST_COLOR_MATRIX_ALPHA_SCALE */
-      1406, /* GL_POST_COLOR_MATRIX_RED_BIAS */
-      1402, /* GL_POST_COLOR_MATRIX_GREEN_BIAS */
-      1397, /* GL_POST_COLOR_MATRIX_BLUE_BIAS */
-      1393, /* GL_POST_COLOR_MATRIX_ALPHA_BIAS */
-      1990, /* GL_TEXTURE_COLOR_TABLE_SGI */
-      1498, /* GL_PROXY_TEXTURE_COLOR_TABLE_SGI */
-      1992, /* GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */
-        94, /* GL_BLEND_DST_RGB */
-       108, /* GL_BLEND_SRC_RGB */
-        92, /* GL_BLEND_DST_ALPHA */
-       106, /* GL_BLEND_SRC_ALPHA */
-       240, /* GL_COLOR_TABLE */
-      1418, /* GL_POST_CONVOLUTION_COLOR_TABLE */
-      1401, /* GL_POST_COLOR_MATRIX_COLOR_TABLE */
-      1484, /* GL_PROXY_COLOR_TABLE */
-      1488, /* GL_PROXY_POST_CONVOLUTION_COLOR_TABLE */
-      1487, /* GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE */
-       264, /* GL_COLOR_TABLE_SCALE */
-       244, /* GL_COLOR_TABLE_BIAS */
-       249, /* GL_COLOR_TABLE_FORMAT */
-       266, /* GL_COLOR_TABLE_WIDTH */
-       261, /* GL_COLOR_TABLE_RED_SIZE */
-       252, /* GL_COLOR_TABLE_GREEN_SIZE */
-       246, /* GL_COLOR_TABLE_BLUE_SIZE */
-       241, /* GL_COLOR_TABLE_ALPHA_SIZE */
-       258, /* GL_COLOR_TABLE_LUMINANCE_SIZE */
-       255, /* GL_COLOR_TABLE_INTENSITY_SIZE */
-        79, /* GL_BGR */
-        80, /* GL_BGRA */
-      1037, /* GL_MAX_ELEMENTS_VERTICES */
-      1036, /* GL_MAX_ELEMENTS_INDICES */
-      2056, /* GL_TEXTURE_INDEX_SIZE_EXT */
-       183, /* GL_CLIP_VOLUME_CLIPPING_HINT_EXT */
-      1364, /* GL_POINT_SIZE_MIN */
-      1360, /* GL_POINT_SIZE_MAX */
-      1349, /* GL_POINT_FADE_THRESHOLD_SIZE */
-      1345, /* GL_POINT_DISTANCE_ATTENUATION */
-       157, /* GL_CLAMP_TO_BORDER */
-       160, /* GL_CLAMP_TO_EDGE */
-      2078, /* GL_TEXTURE_MIN_LOD */
-      2076, /* GL_TEXTURE_MAX_LOD */
-      1960, /* GL_TEXTURE_BASE_LEVEL */
-      2075, /* GL_TEXTURE_MAX_LEVEL */
-       722, /* GL_IGNORE_BORDER_HP */
-       318, /* GL_CONSTANT_BORDER_HP */
-      1592, /* GL_REPLICATE_BORDER_HP */
-       329, /* GL_CONVOLUTION_BORDER_COLOR */
-      1256, /* GL_OCCLUSION_TEST_HP */
-      1257, /* GL_OCCLUSION_TEST_RESULT_HP */
-       823, /* GL_LINEAR_CLIPMAP_LINEAR_SGIX */
-      1984, /* GL_TEXTURE_CLIPMAP_CENTER_SGIX */
-      1986, /* GL_TEXTURE_CLIPMAP_FRAME_SGIX */
-      1988, /* GL_TEXTURE_CLIPMAP_OFFSET_SGIX */
-      1989, /* GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX */
-      1987, /* GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX */
-      1985, /* GL_TEXTURE_CLIPMAP_DEPTH_SGIX */
-      1016, /* GL_MAX_CLIPMAP_DEPTH_SGIX */
-      1017, /* GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX */
-      1428, /* GL_POST_TEXTURE_FILTER_BIAS_SGIX */
-      1430, /* GL_POST_TEXTURE_FILTER_SCALE_SGIX */
-      1427, /* GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX */
-      1429, /* GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX */
-      2064, /* GL_TEXTURE_LOD_BIAS_S_SGIX */
-      2065, /* GL_TEXTURE_LOD_BIAS_T_SGIX */
-      2063, /* GL_TEXTURE_LOD_BIAS_R_SGIX */
-       678, /* GL_GENERATE_MIPMAP */
-       679, /* GL_GENERATE_MIPMAP_HINT */
-       591, /* GL_FOG_OFFSET_SGIX */
-       592, /* GL_FOG_OFFSET_VALUE_SGIX */
-      1998, /* GL_TEXTURE_COMPARE_SGIX */
-      1997, /* GL_TEXTURE_COMPARE_OPERATOR_SGIX */
-      2060, /* GL_TEXTURE_LEQUAL_R_SGIX */
-      2052, /* GL_TEXTURE_GEQUAL_R_SGIX */
-       412, /* GL_DEPTH_COMPONENT16 */
-       416, /* GL_DEPTH_COMPONENT24 */
-       420, /* GL_DEPTH_COMPONENT32 */
-       354, /* GL_CULL_VERTEX_EXT */
-       356, /* GL_CULL_VERTEX_OBJECT_POSITION_EXT */
-       355, /* GL_CULL_VERTEX_EYE_POSITION_EXT */
-      2285, /* GL_WRAP_BORDER_SUN */
-      1991, /* GL_TEXTURE_COLOR_WRITEMASK_SGIS */
-       816, /* GL_LIGHT_MODEL_COLOR_CONTROL */
-      1758, /* GL_SINGLE_COLOR */
-      1742, /* GL_SEPARATE_SPECULAR_COLOR */
-      1753, /* GL_SHARED_TEXTURE_PALETTE_EXT */
-       603, /* GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING */
-       604, /* GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE */
-       615, /* GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE */
-       606, /* GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE */
-       602, /* GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE */
-       601, /* GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE */
-       605, /* GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE */
-       616, /* GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE */
-       633, /* GL_FRAMEBUFFER_DEFAULT */
-       660, /* GL_FRAMEBUFFER_UNDEFINED */
-       428, /* GL_DEPTH_STENCIL_ATTACHMENT */
-       892, /* GL_MAJOR_VERSION */
-      1147, /* GL_MINOR_VERSION */
-      1237, /* GL_NUM_EXTENSIONS */
-       324, /* GL_CONTEXT_FLAGS */
-       730, /* GL_INDEX */
-       406, /* GL_DEPTH_BUFFER */
-      1832, /* GL_STENCIL_BUFFER */
-       295, /* GL_COMPRESSED_RED */
-       296, /* GL_COMPRESSED_RG */
-      2155, /* GL_UNSIGNED_BYTE_2_3_3_REV */
-      2200, /* GL_UNSIGNED_SHORT_5_6_5 */
-      2201, /* GL_UNSIGNED_SHORT_5_6_5_REV */
-      2197, /* GL_UNSIGNED_SHORT_4_4_4_4_REV */
-      2194, /* GL_UNSIGNED_SHORT_1_5_5_5_REV */
-      2169, /* GL_UNSIGNED_INT_8_8_8_8_REV */
-      2165, /* GL_UNSIGNED_INT_2_10_10_10_REV */
-      2073, /* GL_TEXTURE_MAX_CLAMP_S_SGIX */
-      2074, /* GL_TEXTURE_MAX_CLAMP_T_SGIX */
-      2072, /* GL_TEXTURE_MAX_CLAMP_R_SGIX */
-      1151, /* GL_MIRRORED_REPEAT */
-      1679, /* GL_RGB_S3TC */
-      1622, /* GL_RGB4_S3TC */
-      1675, /* GL_RGBA_S3TC */
-      1661, /* GL_RGBA4_S3TC */
-      1670, /* GL_RGBA_DXT5_S3TC */
-      1658, /* GL_RGBA4_DXT5_S3TC */
-       306, /* GL_COMPRESSED_RGB_S3TC_DXT1_EXT */
-       301, /* GL_COMPRESSED_RGBA_S3TC_DXT1_EXT */
-       302, /* GL_COMPRESSED_RGBA_S3TC_DXT3_EXT */
-       303, /* GL_COMPRESSED_RGBA_S3TC_DXT5_EXT */
-      1213, /* GL_NEAREST_CLIPMAP_NEAREST_SGIX */
-      1212, /* GL_NEAREST_CLIPMAP_LINEAR_SGIX */
-       824, /* GL_LINEAR_CLIPMAP_NEAREST_SGIX */
-       578, /* GL_FOG_COORDINATE_SOURCE */
-       570, /* GL_FOG_COORD */
-       594, /* GL_FRAGMENT_DEPTH */
-       360, /* GL_CURRENT_FOG_COORD */
-       577, /* GL_FOG_COORDINATE_ARRAY_TYPE */
-       576, /* GL_FOG_COORDINATE_ARRAY_STRIDE */
-       575, /* GL_FOG_COORDINATE_ARRAY_POINTER */
-       572, /* GL_FOG_COORDINATE_ARRAY */
-       238, /* GL_COLOR_SUM */
-       381, /* GL_CURRENT_SECONDARY_COLOR */
-      1733, /* GL_SECONDARY_COLOR_ARRAY_SIZE */
-      1735, /* GL_SECONDARY_COLOR_ARRAY_TYPE */
-      1734, /* GL_SECONDARY_COLOR_ARRAY_STRIDE */
-      1732, /* GL_SECONDARY_COLOR_ARRAY_POINTER */
-      1729, /* GL_SECONDARY_COLOR_ARRAY */
-       379, /* GL_CURRENT_RASTER_SECONDARY_COLOR */
-        29, /* GL_ALIASED_POINT_SIZE_RANGE */
-        28, /* GL_ALIASED_LINE_WIDTH_RANGE */
-      1886, /* GL_TEXTURE0 */
-      1888, /* GL_TEXTURE1 */
-      1910, /* GL_TEXTURE2 */
-      1932, /* GL_TEXTURE3 */
-      1938, /* GL_TEXTURE4 */
-      1940, /* GL_TEXTURE5 */
-      1942, /* GL_TEXTURE6 */
-      1944, /* GL_TEXTURE7 */
-      1946, /* GL_TEXTURE8 */
-      1948, /* GL_TEXTURE9 */
-      1889, /* GL_TEXTURE10 */
-      1891, /* GL_TEXTURE11 */
-      1893, /* GL_TEXTURE12 */
-      1895, /* GL_TEXTURE13 */
-      1897, /* GL_TEXTURE14 */
-      1899, /* GL_TEXTURE15 */
-      1901, /* GL_TEXTURE16 */
-      1903, /* GL_TEXTURE17 */
-      1905, /* GL_TEXTURE18 */
-      1907, /* GL_TEXTURE19 */
-      1911, /* GL_TEXTURE20 */
-      1913, /* GL_TEXTURE21 */
-      1915, /* GL_TEXTURE22 */
-      1917, /* GL_TEXTURE23 */
-      1919, /* GL_TEXTURE24 */
-      1921, /* GL_TEXTURE25 */
-      1923, /* GL_TEXTURE26 */
-      1925, /* GL_TEXTURE27 */
-      1927, /* GL_TEXTURE28 */
-      1929, /* GL_TEXTURE29 */
-      1933, /* GL_TEXTURE30 */
-      1935, /* GL_TEXTURE31 */
-        19, /* GL_ACTIVE_TEXTURE */
-       163, /* GL_CLIENT_ACTIVE_TEXTURE */
-      1112, /* GL_MAX_TEXTURE_UNITS */
-      2128, /* GL_TRANSPOSE_MODELVIEW_MATRIX */
-      2131, /* GL_TRANSPOSE_PROJECTION_MATRIX */
-      2133, /* GL_TRANSPOSE_TEXTURE_MATRIX */
-      2125, /* GL_TRANSPOSE_COLOR_MATRIX */
-      1868, /* GL_SUBTRACT */
-      1094, /* GL_MAX_RENDERBUFFER_SIZE */
-       287, /* GL_COMPRESSED_ALPHA */
-       291, /* GL_COMPRESSED_LUMINANCE */
-       292, /* GL_COMPRESSED_LUMINANCE_ALPHA */
-       289, /* GL_COMPRESSED_INTENSITY */
-       297, /* GL_COMPRESSED_RGB */
-       298, /* GL_COMPRESSED_RGBA */
-      2005, /* GL_TEXTURE_COMPRESSION_HINT */
-      2082, /* GL_TEXTURE_RECTANGLE */
-      1973, /* GL_TEXTURE_BINDING_RECTANGLE */
-      1501, /* GL_PROXY_TEXTURE_RECTANGLE */
-      1091, /* GL_MAX_RECTANGLE_TEXTURE_SIZE */
-       427, /* GL_DEPTH_STENCIL */
-      2161, /* GL_UNSIGNED_INT_24_8 */
-      1107, /* GL_MAX_TEXTURE_LOD_BIAS */
-      2071, /* GL_TEXTURE_MAX_ANISOTROPY_EXT */
-      1109, /* GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT */
-      2043, /* GL_TEXTURE_FILTER_CONTROL */
-      2061, /* GL_TEXTURE_LOD_BIAS */
-       271, /* GL_COMBINE4 */
-      1100, /* GL_MAX_SHININESS_NV */
-      1101, /* GL_MAX_SPOT_EXPONENT_NV */
-       728, /* GL_INCR_WRAP */
-       392, /* GL_DECR_WRAP */
-      1171, /* GL_MODELVIEW1_ARB */
-      1229, /* GL_NORMAL_MAP */
-      1552, /* GL_REFLECTION_MAP */
-      2015, /* GL_TEXTURE_CUBE_MAP */
-      1970, /* GL_TEXTURE_BINDING_CUBE_MAP */
-      2027, /* GL_TEXTURE_CUBE_MAP_POSITIVE_X */
-      2017, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_X */
-      2030, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Y */
-      2020, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Y */
-      2033, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Z */
-      2023, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Z */
-      1499, /* GL_PROXY_TEXTURE_CUBE_MAP */
-      1030, /* GL_MAX_CUBE_MAP_TEXTURE_SIZE */
-      1207, /* GL_MULTISAMPLE_FILTER_HINT_NV */
-      1442, /* GL_PRIMITIVE_RESTART_NV */
-      1441, /* GL_PRIMITIVE_RESTART_INDEX_NV */
-       586, /* GL_FOG_DISTANCE_MODE_NV */
-       534, /* GL_EYE_RADIAL_NV */
-       533, /* GL_EYE_PLANE_ABSOLUTE_NV */
-       270, /* GL_COMBINE */
-       277, /* GL_COMBINE_RGB */
-       272, /* GL_COMBINE_ALPHA */
-      1680, /* GL_RGB_SCALE */
-        25, /* GL_ADD_SIGNED */
-       764, /* GL_INTERPOLATE */
-       313, /* GL_CONSTANT */
-      1434, /* GL_PRIMARY_COLOR */
-      1431, /* GL_PREVIOUS */
-      1773, /* GL_SOURCE0_RGB */
-      1779, /* GL_SOURCE1_RGB */
-      1785, /* GL_SOURCE2_RGB */
-      1789, /* GL_SOURCE3_RGB_NV */
-      1770, /* GL_SOURCE0_ALPHA */
-      1776, /* GL_SOURCE1_ALPHA */
-      1782, /* GL_SOURCE2_ALPHA */
-      1788, /* GL_SOURCE3_ALPHA_NV */
-      1270, /* GL_OPERAND0_RGB */
-      1276, /* GL_OPERAND1_RGB */
-      1282, /* GL_OPERAND2_RGB */
-      1286, /* GL_OPERAND3_RGB_NV */
-      1267, /* GL_OPERAND0_ALPHA */
-      1273, /* GL_OPERAND1_ALPHA */
-      1279, /* GL_OPERAND2_ALPHA */
-      1285, /* GL_OPERAND3_ALPHA_NV */
-       137, /* GL_BUFFER_OBJECT_APPLE */
-      2213, /* GL_VERTEX_ARRAY_BINDING */
-      2080, /* GL_TEXTURE_RANGE_LENGTH_APPLE */
-      2081, /* GL_TEXTURE_RANGE_POINTER_APPLE */
-      2290, /* GL_YCBCR_422_APPLE */
-      2202, /* GL_UNSIGNED_SHORT_8_8_APPLE */
-      2204, /* GL_UNSIGNED_SHORT_8_8_REV_APPLE */
-      2092, /* GL_TEXTURE_STORAGE_HINT_APPLE */
-      1859, /* GL_STORAGE_PRIVATE_APPLE */
-      1858, /* GL_STORAGE_CACHED_APPLE */
-      1860, /* GL_STORAGE_SHARED_APPLE */
-      1760, /* GL_SLICE_ACCUM_SUN */
-      1510, /* GL_QUAD_MESH_SUN */
-      2139, /* GL_TRIANGLE_MESH_SUN */
-      2255, /* GL_VERTEX_PROGRAM_ARB */
-      2266, /* GL_VERTEX_STATE_PROGRAM_NV */
-      2240, /* GL_VERTEX_ATTRIB_ARRAY_ENABLED */
-      2248, /* GL_VERTEX_ATTRIB_ARRAY_SIZE */
-      2250, /* GL_VERTEX_ATTRIB_ARRAY_STRIDE */
-      2252, /* GL_VERTEX_ATTRIB_ARRAY_TYPE */
-       383, /* GL_CURRENT_VERTEX_ATTRIB */
-      1455, /* GL_PROGRAM_LENGTH_ARB */
-      1471, /* GL_PROGRAM_STRING_ARB */
-      1194, /* GL_MODELVIEW_PROJECTION_NV */
-       721, /* GL_IDENTITY_NV */
-       796, /* GL_INVERSE_NV */
-      2130, /* GL_TRANSPOSE_NV */
-       797, /* GL_INVERSE_TRANSPOSE_NV */
-      1075, /* GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB */
-      1074, /* GL_MAX_PROGRAM_MATRICES_ARB */
-       956, /* GL_MATRIX0_NV */
-       968, /* GL_MATRIX1_NV */
-       980, /* GL_MATRIX2_NV */
-       984, /* GL_MATRIX3_NV */
-       986, /* GL_MATRIX4_NV */
-       988, /* GL_MATRIX5_NV */
-       990, /* GL_MATRIX6_NV */
-       992, /* GL_MATRIX7_NV */
-       366, /* GL_CURRENT_MATRIX_STACK_DEPTH_ARB */
-       363, /* GL_CURRENT_MATRIX_ARB */
-      1468, /* GL_PROGRAM_POINT_SIZE */
-      2261, /* GL_VERTEX_PROGRAM_TWO_SIDE */
-      1467, /* GL_PROGRAM_PARAMETER_NV */
-      2246, /* GL_VERTEX_ATTRIB_ARRAY_POINTER */
-      1473, /* GL_PROGRAM_TARGET_NV */
-      1470, /* GL_PROGRAM_RESIDENT_NV */
-      2102, /* GL_TRACK_MATRIX_NV */
-      2103, /* GL_TRACK_MATRIX_TRANSFORM_NV */
-      2256, /* GL_VERTEX_PROGRAM_BINDING_NV */
-      1449, /* GL_PROGRAM_ERROR_POSITION_ARB */
-       408, /* GL_DEPTH_CLAMP */
-      2221, /* GL_VERTEX_ATTRIB_ARRAY0_NV */
-      2228, /* GL_VERTEX_ATTRIB_ARRAY1_NV */
-      2229, /* GL_VERTEX_ATTRIB_ARRAY2_NV */
-      2230, /* GL_VERTEX_ATTRIB_ARRAY3_NV */
-      2231, /* GL_VERTEX_ATTRIB_ARRAY4_NV */
-      2232, /* GL_VERTEX_ATTRIB_ARRAY5_NV */
-      2233, /* GL_VERTEX_ATTRIB_ARRAY6_NV */
-      2234, /* GL_VERTEX_ATTRIB_ARRAY7_NV */
-      2235, /* GL_VERTEX_ATTRIB_ARRAY8_NV */
-      2236, /* GL_VERTEX_ATTRIB_ARRAY9_NV */
-      2222, /* GL_VERTEX_ATTRIB_ARRAY10_NV */
-      2223, /* GL_VERTEX_ATTRIB_ARRAY11_NV */
-      2224, /* GL_VERTEX_ATTRIB_ARRAY12_NV */
-      2225, /* GL_VERTEX_ATTRIB_ARRAY13_NV */
-      2226, /* GL_VERTEX_ATTRIB_ARRAY14_NV */
-      2227, /* GL_VERTEX_ATTRIB_ARRAY15_NV */
-       904, /* GL_MAP1_VERTEX_ATTRIB0_4_NV */
-       911, /* GL_MAP1_VERTEX_ATTRIB1_4_NV */
-       912, /* GL_MAP1_VERTEX_ATTRIB2_4_NV */
-       913, /* GL_MAP1_VERTEX_ATTRIB3_4_NV */
-       914, /* GL_MAP1_VERTEX_ATTRIB4_4_NV */
-       915, /* GL_MAP1_VERTEX_ATTRIB5_4_NV */
-       916, /* GL_MAP1_VERTEX_ATTRIB6_4_NV */
-       917, /* GL_MAP1_VERTEX_ATTRIB7_4_NV */
-       918, /* GL_MAP1_VERTEX_ATTRIB8_4_NV */
-       919, /* GL_MAP1_VERTEX_ATTRIB9_4_NV */
-       905, /* GL_MAP1_VERTEX_ATTRIB10_4_NV */
-       906, /* GL_MAP1_VERTEX_ATTRIB11_4_NV */
-       907, /* GL_MAP1_VERTEX_ATTRIB12_4_NV */
-       908, /* GL_MAP1_VERTEX_ATTRIB13_4_NV */
-       909, /* GL_MAP1_VERTEX_ATTRIB14_4_NV */
-       910, /* GL_MAP1_VERTEX_ATTRIB15_4_NV */
-       931, /* GL_MAP2_VERTEX_ATTRIB0_4_NV */
-       938, /* GL_MAP2_VERTEX_ATTRIB1_4_NV */
-       939, /* GL_MAP2_VERTEX_ATTRIB2_4_NV */
-       940, /* GL_MAP2_VERTEX_ATTRIB3_4_NV */
-       941, /* GL_MAP2_VERTEX_ATTRIB4_4_NV */
-       942, /* GL_MAP2_VERTEX_ATTRIB5_4_NV */
-       943, /* GL_MAP2_VERTEX_ATTRIB6_4_NV */
-      1448, /* GL_PROGRAM_BINDING_ARB */
-       945, /* GL_MAP2_VERTEX_ATTRIB8_4_NV */
-       946, /* GL_MAP2_VERTEX_ATTRIB9_4_NV */
-       932, /* GL_MAP2_VERTEX_ATTRIB10_4_NV */
-       933, /* GL_MAP2_VERTEX_ATTRIB11_4_NV */
-       934, /* GL_MAP2_VERTEX_ATTRIB12_4_NV */
-       935, /* GL_MAP2_VERTEX_ATTRIB13_4_NV */
-       936, /* GL_MAP2_VERTEX_ATTRIB14_4_NV */
-       937, /* GL_MAP2_VERTEX_ATTRIB15_4_NV */
-      2003, /* GL_TEXTURE_COMPRESSED_IMAGE_SIZE */
-      2000, /* GL_TEXTURE_COMPRESSED */
-      1235, /* GL_NUM_COMPRESSED_TEXTURE_FORMATS */
-       311, /* GL_COMPRESSED_TEXTURE_FORMATS */
-      1134, /* GL_MAX_VERTEX_UNITS_ARB */
-        23, /* GL_ACTIVE_VERTEX_UNITS_ARB */
-      2284, /* GL_WEIGHT_SUM_UNITY_ARB */
-      2254, /* GL_VERTEX_BLEND_ARB */
-       385, /* GL_CURRENT_WEIGHT_ARB */
-      2282, /* GL_WEIGHT_ARRAY_TYPE_ARB */
-      2280, /* GL_WEIGHT_ARRAY_STRIDE_ARB */
-      2278, /* GL_WEIGHT_ARRAY_SIZE_ARB */
-      2276, /* GL_WEIGHT_ARRAY_POINTER_ARB */
-      2271, /* GL_WEIGHT_ARRAY_ARB */
-       442, /* GL_DOT3_RGB */
-       443, /* GL_DOT3_RGBA */
-       305, /* GL_COMPRESSED_RGB_FXT1_3DFX */
-       300, /* GL_COMPRESSED_RGBA_FXT1_3DFX */
-      1202, /* GL_MULTISAMPLE_3DFX */
-      1718, /* GL_SAMPLE_BUFFERS_3DFX */
-      1709, /* GL_SAMPLES_3DFX */
-      1182, /* GL_MODELVIEW2_ARB */
-      1185, /* GL_MODELVIEW3_ARB */
-      1186, /* GL_MODELVIEW4_ARB */
-      1187, /* GL_MODELVIEW5_ARB */
-      1188, /* GL_MODELVIEW6_ARB */
-      1189, /* GL_MODELVIEW7_ARB */
-      1190, /* GL_MODELVIEW8_ARB */
-      1191, /* GL_MODELVIEW9_ARB */
-      1161, /* GL_MODELVIEW10_ARB */
-      1162, /* GL_MODELVIEW11_ARB */
-      1163, /* GL_MODELVIEW12_ARB */
-      1164, /* GL_MODELVIEW13_ARB */
-      1165, /* GL_MODELVIEW14_ARB */
-      1166, /* GL_MODELVIEW15_ARB */
-      1167, /* GL_MODELVIEW16_ARB */
-      1168, /* GL_MODELVIEW17_ARB */
-      1169, /* GL_MODELVIEW18_ARB */
-      1170, /* GL_MODELVIEW19_ARB */
-      1172, /* GL_MODELVIEW20_ARB */
-      1173, /* GL_MODELVIEW21_ARB */
-      1174, /* GL_MODELVIEW22_ARB */
-      1175, /* GL_MODELVIEW23_ARB */
-      1176, /* GL_MODELVIEW24_ARB */
-      1177, /* GL_MODELVIEW25_ARB */
-      1178, /* GL_MODELVIEW26_ARB */
-      1179, /* GL_MODELVIEW27_ARB */
-      1180, /* GL_MODELVIEW28_ARB */
-      1181, /* GL_MODELVIEW29_ARB */
-      1183, /* GL_MODELVIEW30_ARB */
-      1184, /* GL_MODELVIEW31_ARB */
-       447, /* GL_DOT3_RGB_EXT */
-       445, /* GL_DOT3_RGBA_EXT */
-      1155, /* GL_MIRROR_CLAMP_EXT */
-      1158, /* GL_MIRROR_CLAMP_TO_EDGE_EXT */
-      1197, /* GL_MODULATE_ADD_ATI */
-      1198, /* GL_MODULATE_SIGNED_ADD_ATI */
-      1199, /* GL_MODULATE_SUBTRACT_ATI */
-      2291, /* GL_YCBCR_MESA */
-      1294, /* GL_PACK_INVERT_MESA */
-       388, /* GL_DEBUG_OBJECT_MESA */
-       389, /* GL_DEBUG_PRINT_MESA */
-       387, /* GL_DEBUG_ASSERT_MESA */
-       139, /* GL_BUFFER_SIZE */
-       141, /* GL_BUFFER_USAGE */
-       145, /* GL_BUMP_ROT_MATRIX_ATI */
-       146, /* GL_BUMP_ROT_MATRIX_SIZE_ATI */
-       144, /* GL_BUMP_NUM_TEX_UNITS_ATI */
-       148, /* GL_BUMP_TEX_UNITS_ATI */
-       507, /* GL_DUDV_ATI */
-       506, /* GL_DU8DV8_ATI */
-       143, /* GL_BUMP_ENVMAP_ATI */
-       147, /* GL_BUMP_TARGET_ATI */
-      1238, /* GL_NUM_PROGRAM_BINARY_FORMATS_OES */
-      1446, /* GL_PROGRAM_BINARY_FORMATS_OES */
-      1822, /* GL_STENCIL_BACK_FUNC */
-      1820, /* GL_STENCIL_BACK_FAIL */
-      1824, /* GL_STENCIL_BACK_PASS_DEPTH_FAIL */
-      1826, /* GL_STENCIL_BACK_PASS_DEPTH_PASS */
-       595, /* GL_FRAGMENT_PROGRAM_ARB */
-      1444, /* GL_PROGRAM_ALU_INSTRUCTIONS_ARB */
-      1476, /* GL_PROGRAM_TEX_INSTRUCTIONS_ARB */
-      1475, /* GL_PROGRAM_TEX_INDIRECTIONS_ARB */
-      1458, /* GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB */
-      1464, /* GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB */
-      1463, /* GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB */
-      1064, /* GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB */
-      1089, /* GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB */
-      1088, /* GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB */
-      1077, /* GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB */
-      1083, /* GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB */
-      1082, /* GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB */
-      1652, /* GL_RGBA32F */
-      1615, /* GL_RGB32F */
-      1643, /* GL_RGBA16F */
-      1607, /* GL_RGB16F */
-      1033, /* GL_MAX_DRAW_BUFFERS */
-       451, /* GL_DRAW_BUFFER0 */
-       454, /* GL_DRAW_BUFFER1 */
-       475, /* GL_DRAW_BUFFER2 */
-       478, /* GL_DRAW_BUFFER3 */
-       481, /* GL_DRAW_BUFFER4 */
-       484, /* GL_DRAW_BUFFER5 */
-       487, /* GL_DRAW_BUFFER6 */
-       490, /* GL_DRAW_BUFFER7 */
-       493, /* GL_DRAW_BUFFER8 */
-       496, /* GL_DRAW_BUFFER9 */
-       455, /* GL_DRAW_BUFFER10 */
-       458, /* GL_DRAW_BUFFER11 */
-       461, /* GL_DRAW_BUFFER12 */
-       464, /* GL_DRAW_BUFFER13 */
-       467, /* GL_DRAW_BUFFER14 */
-       470, /* GL_DRAW_BUFFER15 */
-        97, /* GL_BLEND_EQUATION_ALPHA */
-      1007, /* GL_MATRIX_PALETTE_ARB */
-      1057, /* GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB */
-      1060, /* GL_MAX_PALETTE_MATRICES_ARB */
-       369, /* GL_CURRENT_PALETTE_MATRIX_ARB */
-       995, /* GL_MATRIX_INDEX_ARRAY_ARB */
-       364, /* GL_CURRENT_MATRIX_INDEX_ARB */
-      1000, /* GL_MATRIX_INDEX_ARRAY_SIZE_ARB */
-      1004, /* GL_MATRIX_INDEX_ARRAY_TYPE_ARB */
-      1002, /* GL_MATRIX_INDEX_ARRAY_STRIDE_ARB */
-       998, /* GL_MATRIX_INDEX_ARRAY_POINTER_ARB */
-      2038, /* GL_TEXTURE_DEPTH_SIZE */
-       435, /* GL_DEPTH_TEXTURE_MODE */
-      1995, /* GL_TEXTURE_COMPARE_MODE */
-      1993, /* GL_TEXTURE_COMPARE_FUNC */
-       281, /* GL_COMPARE_REF_TO_TEXTURE */
-      1371, /* GL_POINT_SPRITE */
-       343, /* GL_COORD_REPLACE */
-      1376, /* GL_POINT_SPRITE_R_MODE_NV */
-      1516, /* GL_QUERY_COUNTER_BITS */
-       372, /* GL_CURRENT_QUERY */
-      1520, /* GL_QUERY_RESULT */
-      1522, /* GL_QUERY_RESULT_AVAILABLE */
-      1126, /* GL_MAX_VERTEX_ATTRIBS */
-      2244, /* GL_VERTEX_ATTRIB_ARRAY_NORMALIZED */
-       433, /* GL_DEPTH_STENCIL_TO_RGBA_NV */
-       432, /* GL_DEPTH_STENCIL_TO_BGRA_NV */
-      1103, /* GL_MAX_TEXTURE_COORDS */
-      1105, /* GL_MAX_TEXTURE_IMAGE_UNITS */
-      1451, /* GL_PROGRAM_ERROR_STRING_ARB */
-      1453, /* GL_PROGRAM_FORMAT_ASCII_ARB */
-      1452, /* GL_PROGRAM_FORMAT_ARB */
-      2094, /* GL_TEXTURE_UNSIGNED_REMAP_MODE_NV */
-       405, /* GL_DEPTH_BOUNDS_TEST_EXT */
-       404, /* GL_DEPTH_BOUNDS_EXT */
-        61, /* GL_ARRAY_BUFFER */
-       520, /* GL_ELEMENT_ARRAY_BUFFER */
-        62, /* GL_ARRAY_BUFFER_BINDING */
-       521, /* GL_ELEMENT_ARRAY_BUFFER_BINDING */
-      2215, /* GL_VERTEX_ARRAY_BUFFER_BINDING */
-      1224, /* GL_NORMAL_ARRAY_BUFFER_BINDING */
-       187, /* GL_COLOR_ARRAY_BUFFER_BINDING */
-       732, /* GL_INDEX_ARRAY_BUFFER_BINDING */
-      2008, /* GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING */
-       516, /* GL_EDGE_FLAG_ARRAY_BUFFER_BINDING */
-      1730, /* GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING */
-       573, /* GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING */
-      2272, /* GL_WEIGHT_ARRAY_BUFFER_BINDING */
-      2237, /* GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING */
-      1454, /* GL_PROGRAM_INSTRUCTIONS_ARB */
-      1070, /* GL_MAX_PROGRAM_INSTRUCTIONS_ARB */
-      1460, /* GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB */
-      1079, /* GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB */
-      1474, /* GL_PROGRAM_TEMPORARIES_ARB */
-      1085, /* GL_MAX_PROGRAM_TEMPORARIES_ARB */
-      1462, /* GL_PROGRAM_NATIVE_TEMPORARIES_ARB */
-      1081, /* GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB */
-      1466, /* GL_PROGRAM_PARAMETERS_ARB */
-      1084, /* GL_MAX_PROGRAM_PARAMETERS_ARB */
-      1461, /* GL_PROGRAM_NATIVE_PARAMETERS_ARB */
-      1080, /* GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB */
-      1445, /* GL_PROGRAM_ATTRIBS_ARB */
-      1065, /* GL_MAX_PROGRAM_ATTRIBS_ARB */
-      1459, /* GL_PROGRAM_NATIVE_ATTRIBS_ARB */
-      1078, /* GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB */
-      1443, /* GL_PROGRAM_ADDRESS_REGISTERS_ARB */
-      1063, /* GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB */
-      1457, /* GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB */
-      1076, /* GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB */
-      1071, /* GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB */
-      1067, /* GL_MAX_PROGRAM_ENV_PARAMETERS_ARB */
-      1477, /* GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB */
-      2127, /* GL_TRANSPOSE_CURRENT_MATRIX_ARB */
-      1539, /* GL_READ_ONLY */
-      2286, /* GL_WRITE_ONLY */
-      1541, /* GL_READ_WRITE */
-       124, /* GL_BUFFER_ACCESS */
-       129, /* GL_BUFFER_MAPPED */
-       134, /* GL_BUFFER_MAP_POINTER */
-      2101, /* GL_TIME_ELAPSED_EXT */
-       955, /* GL_MATRIX0_ARB */
-       967, /* GL_MATRIX1_ARB */
-       979, /* GL_MATRIX2_ARB */
-       983, /* GL_MATRIX3_ARB */
-       985, /* GL_MATRIX4_ARB */
-       987, /* GL_MATRIX5_ARB */
-       989, /* GL_MATRIX6_ARB */
-       991, /* GL_MATRIX7_ARB */
-       993, /* GL_MATRIX8_ARB */
-       994, /* GL_MATRIX9_ARB */
-       957, /* GL_MATRIX10_ARB */
-       958, /* GL_MATRIX11_ARB */
-       959, /* GL_MATRIX12_ARB */
-       960, /* GL_MATRIX13_ARB */
-       961, /* GL_MATRIX14_ARB */
-       962, /* GL_MATRIX15_ARB */
-       963, /* GL_MATRIX16_ARB */
-       964, /* GL_MATRIX17_ARB */
-       965, /* GL_MATRIX18_ARB */
-       966, /* GL_MATRIX19_ARB */
-       969, /* GL_MATRIX20_ARB */
-       970, /* GL_MATRIX21_ARB */
-       971, /* GL_MATRIX22_ARB */
-       972, /* GL_MATRIX23_ARB */
-       973, /* GL_MATRIX24_ARB */
-       974, /* GL_MATRIX25_ARB */
-       975, /* GL_MATRIX26_ARB */
-       976, /* GL_MATRIX27_ARB */
-       977, /* GL_MATRIX28_ARB */
-       978, /* GL_MATRIX29_ARB */
-       981, /* GL_MATRIX30_ARB */
-       982, /* GL_MATRIX31_ARB */
-      1863, /* GL_STREAM_DRAW */
-      1865, /* GL_STREAM_READ */
-      1861, /* GL_STREAM_COPY */
-      1812, /* GL_STATIC_DRAW */
-      1814, /* GL_STATIC_READ */
-      1810, /* GL_STATIC_COPY */
-       510, /* GL_DYNAMIC_DRAW */
-       512, /* GL_DYNAMIC_READ */
-       508, /* GL_DYNAMIC_COPY */
-      1334, /* GL_PIXEL_PACK_BUFFER */
-      1338, /* GL_PIXEL_UNPACK_BUFFER */
-      1335, /* GL_PIXEL_PACK_BUFFER_BINDING */
-      1339, /* GL_PIXEL_UNPACK_BUFFER_BINDING */
-       396, /* GL_DEPTH24_STENCIL8 */
-      2090, /* GL_TEXTURE_STENCIL_SIZE */
-      2036, /* GL_TEXTURE_CUBE_MAP_SEAMLESS */
-      1066, /* GL_MAX_PROGRAM_CALL_DEPTH_NV */
-      1069, /* GL_MAX_PROGRAM_IF_DEPTH_NV */
-      1073, /* GL_MAX_PROGRAM_LOOP_DEPTH_NV */
-      1072, /* GL_MAX_PROGRAM_LOOP_COUNT_NV */
-      2242, /* GL_VERTEX_ATTRIB_ARRAY_INTEGER */
-      2239, /* GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB */
-      1012, /* GL_MAX_ARRAY_TEXTURE_LAYERS */
-      1149, /* GL_MIN_PROGRAM_TEXEL_OFFSET */
-      1086, /* GL_MAX_PROGRAM_TEXEL_OFFSET */
-      1854, /* GL_STENCIL_TEST_TWO_SIDE_EXT */
-        18, /* GL_ACTIVE_STENCIL_FACE_EXT */
-      1156, /* GL_MIRROR_CLAMP_TO_BORDER_EXT */
-      1711, /* GL_SAMPLES_PASSED */
-       688, /* GL_GEOMETRY_VERTICES_OUT */
-       682, /* GL_GEOMETRY_INPUT_TYPE */
-       684, /* GL_GEOMETRY_OUTPUT_TYPE */
-       156, /* GL_CLAMP_READ_COLOR */
-       546, /* GL_FIXED_ONLY */
-      1358, /* GL_POINT_SIZE_ARRAY_TYPE_OES */
-      1357, /* GL_POINT_SIZE_ARRAY_STRIDE_OES */
-      1356, /* GL_POINT_SIZE_ARRAY_POINTER_OES */
-      1193, /* GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES */
-      1480, /* GL_PROJECTION_MATRIX_FLOAT_AS_INT_BITS_OES */
-      2070, /* GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES */
-       138, /* GL_BUFFER_SERIALIZED_MODIFY_APPLE */
-       128, /* GL_BUFFER_FLUSHING_UNMAP_APPLE */
-      1556, /* GL_RELEASED_APPLE */
-      2269, /* GL_VOLATILE_APPLE */
-      1595, /* GL_RETAINED_APPLE */
-      2144, /* GL_UNDEFINED_APPLE */
-      1504, /* GL_PURGEABLE_APPLE */
-       596, /* GL_FRAGMENT_SHADER */
-      2264, /* GL_VERTEX_SHADER */
-      1465, /* GL_PROGRAM_OBJECT_ARB */
-      1747, /* GL_SHADER_OBJECT_ARB */
-      1041, /* GL_MAX_FRAGMENT_UNIFORM_COMPONENTS */
-      1131, /* GL_MAX_VERTEX_UNIFORM_COMPONENTS */
-      1122, /* GL_MAX_VARYING_COMPONENTS */
-      1129, /* GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS */
-      1024, /* GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS */
-      1254, /* GL_OBJECT_TYPE_ARB */
-      1749, /* GL_SHADER_TYPE */
-       561, /* GL_FLOAT_VEC2 */
-       563, /* GL_FLOAT_VEC3 */
-       565, /* GL_FLOAT_VEC4 */
-       784, /* GL_INT_VEC2 */
-       786, /* GL_INT_VEC3 */
-       788, /* GL_INT_VEC4 */
-       116, /* GL_BOOL */
-       118, /* GL_BOOL_VEC2 */
-       120, /* GL_BOOL_VEC3 */
-       122, /* GL_BOOL_VEC4 */
-       549, /* GL_FLOAT_MAT2 */
-       553, /* GL_FLOAT_MAT3 */
-       557, /* GL_FLOAT_MAT4 */
-      1687, /* GL_SAMPLER_1D */
-      1693, /* GL_SAMPLER_2D */
-      1701, /* GL_SAMPLER_3D */
-      1705, /* GL_SAMPLER_CUBE */
-      1692, /* GL_SAMPLER_1D_SHADOW */
-      1700, /* GL_SAMPLER_2D_SHADOW */
-      1698, /* GL_SAMPLER_2D_RECT */
-      1699, /* GL_SAMPLER_2D_RECT_SHADOW */
-       551, /* GL_FLOAT_MAT2x3 */
-       552, /* GL_FLOAT_MAT2x4 */
-       555, /* GL_FLOAT_MAT3x2 */
-       556, /* GL_FLOAT_MAT3x4 */
-       559, /* GL_FLOAT_MAT4x2 */
-       560, /* GL_FLOAT_MAT4x3 */
-       394, /* GL_DELETE_STATUS */
-       286, /* GL_COMPILE_STATUS */
-       845, /* GL_LINK_STATUS */
-      2209, /* GL_VALIDATE_STATUS */
-       744, /* GL_INFO_LOG_LENGTH */
-        64, /* GL_ATTACHED_SHADERS */
-        21, /* GL_ACTIVE_UNIFORMS */
-        22, /* GL_ACTIVE_UNIFORM_MAX_LENGTH */
-      1748, /* GL_SHADER_SOURCE_LENGTH */
-        15, /* GL_ACTIVE_ATTRIBUTES */
-        16, /* GL_ACTIVE_ATTRIBUTE_MAX_LENGTH */
-       598, /* GL_FRAGMENT_SHADER_DERIVATIVE_HINT */
-      1751, /* GL_SHADING_LANGUAGE_VERSION */
-       371, /* GL_CURRENT_PROGRAM */
-      1303, /* GL_PALETTE4_RGB8_OES */
-      1305, /* GL_PALETTE4_RGBA8_OES */
-      1301, /* GL_PALETTE4_R5_G6_B5_OES */
-      1304, /* GL_PALETTE4_RGBA4_OES */
-      1302, /* GL_PALETTE4_RGB5_A1_OES */
-      1308, /* GL_PALETTE8_RGB8_OES */
-      1310, /* GL_PALETTE8_RGBA8_OES */
-      1306, /* GL_PALETTE8_R5_G6_B5_OES */
-      1309, /* GL_PALETTE8_RGBA4_OES */
-      1307, /* GL_PALETTE8_RGB5_A1_OES */
-       725, /* GL_IMPLEMENTATION_COLOR_READ_TYPE */
-       723, /* GL_IMPLEMENTATION_COLOR_READ_FORMAT */
-      1355, /* GL_POINT_SIZE_ARRAY_OES */
-      2014, /* GL_TEXTURE_CROP_RECT_OES */
-       996, /* GL_MATRIX_INDEX_ARRAY_BUFFER_BINDING_OES */
-      1354, /* GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES */
-      2192, /* GL_UNSIGNED_NORMALIZED */
-      1951, /* GL_TEXTURE_1D_ARRAY */
-      1490, /* GL_PROXY_TEXTURE_1D_ARRAY */
-      1954, /* GL_TEXTURE_2D_ARRAY */
-      1494, /* GL_PROXY_TEXTURE_2D_ARRAY */
-      1962, /* GL_TEXTURE_BINDING_1D_ARRAY */
-      1965, /* GL_TEXTURE_BINDING_2D_ARRAY */
-      1048, /* GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS */
-      1981, /* GL_TEXTURE_BUFFER */
-      1102, /* GL_MAX_TEXTURE_BUFFER_SIZE */
-      1969, /* GL_TEXTURE_BINDING_BUFFER */
-      1982, /* GL_TEXTURE_BUFFER_DATA_STORE_BINDING */
-      1983, /* GL_TEXTURE_BUFFER_FORMAT */
-      1527, /* GL_R11F_G11F_B10F */
-      2158, /* GL_UNSIGNED_INT_10F_11F_11F_REV */
-      1638, /* GL_RGB9_E5 */
-      2167, /* GL_UNSIGNED_INT_5_9_9_9_REV */
-      2088, /* GL_TEXTURE_SHARED_SIZE */
-      1804, /* GL_SRGB */
-      1805, /* GL_SRGB8 */
-      1807, /* GL_SRGB_ALPHA */
-      1806, /* GL_SRGB8_ALPHA8 */
-      1764, /* GL_SLUMINANCE_ALPHA */
-      1763, /* GL_SLUMINANCE8_ALPHA8 */
-      1761, /* GL_SLUMINANCE */
-      1762, /* GL_SLUMINANCE8 */
-       309, /* GL_COMPRESSED_SRGB */
-       310, /* GL_COMPRESSED_SRGB_ALPHA */
-       307, /* GL_COMPRESSED_SLUMINANCE */
-       308, /* GL_COMPRESSED_SLUMINANCE_ALPHA */
-      2123, /* GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH */
-      2112, /* GL_TRANSFORM_FEEDBACK_BUFFER_MODE */
-      1120, /* GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS */
-      2121, /* GL_TRANSFORM_FEEDBACK_VARYINGS */
-      2117, /* GL_TRANSFORM_FEEDBACK_BUFFER_START */
-      2115, /* GL_TRANSFORM_FEEDBACK_BUFFER_SIZE */
-      1437, /* GL_PRIMITIVES_GENERATED */
-      2119, /* GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN */
-      1531, /* GL_RASTERIZER_DISCARD */
-      1116, /* GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS */
-      1118, /* GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS */
-       762, /* GL_INTERLEAVED_ATTRIBS */
-      1740, /* GL_SEPARATE_ATTRIBS */
-      2107, /* GL_TRANSFORM_FEEDBACK_BUFFER */
-      2109, /* GL_TRANSFORM_FEEDBACK_BUFFER_BINDING */
-      1373, /* GL_POINT_SPRITE_COORD_ORIGIN */
-       853, /* GL_LOWER_LEFT */
-      2206, /* GL_UPPER_LEFT */
-      1828, /* GL_STENCIL_BACK_REF */
-      1829, /* GL_STENCIL_BACK_VALUE_MASK */
-      1830, /* GL_STENCIL_BACK_WRITEMASK */
-       500, /* GL_DRAW_FRAMEBUFFER_BINDING */
-      1561, /* GL_RENDERBUFFER_BINDING */
-      1535, /* GL_READ_FRAMEBUFFER */
-       499, /* GL_DRAW_FRAMEBUFFER */
-      1536, /* GL_READ_FRAMEBUFFER_BINDING */
-      1580, /* GL_RENDERBUFFER_SAMPLES */
-       612, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE */
-       609, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME */
-       624, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL */
-       619, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE */
-       622, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER */
-       630, /* GL_FRAMEBUFFER_COMPLETE */
-       635, /* GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT */
-       650, /* GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT */
-       644, /* GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT */
-       639, /* GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT */
-       645, /* GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT */
-       641, /* GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER */
-       655, /* GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER */
-       661, /* GL_FRAMEBUFFER_UNSUPPORTED */
-       659, /* GL_FRAMEBUFFER_STATUS_ERROR_EXT */
-      1020, /* GL_MAX_COLOR_ATTACHMENTS */
-       193, /* GL_COLOR_ATTACHMENT0 */
-       196, /* GL_COLOR_ATTACHMENT1 */
-       210, /* GL_COLOR_ATTACHMENT2 */
-       212, /* GL_COLOR_ATTACHMENT3 */
-       214, /* GL_COLOR_ATTACHMENT4 */
-       216, /* GL_COLOR_ATTACHMENT5 */
-       218, /* GL_COLOR_ATTACHMENT6 */
-       220, /* GL_COLOR_ATTACHMENT7 */
-       222, /* GL_COLOR_ATTACHMENT8 */
-       224, /* GL_COLOR_ATTACHMENT9 */
-       197, /* GL_COLOR_ATTACHMENT10 */
-       199, /* GL_COLOR_ATTACHMENT11 */
-       201, /* GL_COLOR_ATTACHMENT12 */
-       203, /* GL_COLOR_ATTACHMENT13 */
-       205, /* GL_COLOR_ATTACHMENT14 */
-       207, /* GL_COLOR_ATTACHMENT15 */
-       399, /* GL_DEPTH_ATTACHMENT */
-      1817, /* GL_STENCIL_ATTACHMENT */
-       600, /* GL_FRAMEBUFFER */
-      1558, /* GL_RENDERBUFFER */
-      1584, /* GL_RENDERBUFFER_WIDTH */
-      1571, /* GL_RENDERBUFFER_HEIGHT */
-      1574, /* GL_RENDERBUFFER_INTERNAL_FORMAT */
-      1849, /* GL_STENCIL_INDEX_EXT */
-      1838, /* GL_STENCIL_INDEX1 */
-      1843, /* GL_STENCIL_INDEX4 */
-      1846, /* GL_STENCIL_INDEX8 */
-      1839, /* GL_STENCIL_INDEX16 */
-      1578, /* GL_RENDERBUFFER_RED_SIZE */
-      1569, /* GL_RENDERBUFFER_GREEN_SIZE */
-      1564, /* GL_RENDERBUFFER_BLUE_SIZE */
-      1559, /* GL_RENDERBUFFER_ALPHA_SIZE */
-      1566, /* GL_RENDERBUFFER_DEPTH_SIZE */
-      1582, /* GL_RENDERBUFFER_STENCIL_SIZE */
-       653, /* GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE */
-      1097, /* GL_MAX_SAMPLES */
-      2050, /* GL_TEXTURE_GEN_STR_OES */
-       699, /* GL_HALF_FLOAT_OES */
-      1625, /* GL_RGB565_OES */
-      1655, /* GL_RGBA32UI */
-      1618, /* GL_RGB32UI */
-        40, /* GL_ALPHA32UI_EXT */
-       754, /* GL_INTENSITY32UI_EXT */
-       870, /* GL_LUMINANCE32UI_EXT */
-       887, /* GL_LUMINANCE_ALPHA32UI_EXT */
-      1646, /* GL_RGBA16UI */
-      1610, /* GL_RGB16UI */
-        37, /* GL_ALPHA16UI_EXT */
-       751, /* GL_INTENSITY16UI_EXT */
-       865, /* GL_LUMINANCE16UI_EXT */
-       885, /* GL_LUMINANCE_ALPHA16UI_EXT */
-      1665, /* GL_RGBA8UI */
-      1633, /* GL_RGB8UI */
-        45, /* GL_ALPHA8UI_EXT */
-       759, /* GL_INTENSITY8UI_EXT */
-       879, /* GL_LUMINANCE8UI_EXT */
-       889, /* GL_LUMINANCE_ALPHA8UI_EXT */
-      1653, /* GL_RGBA32I */
-      1616, /* GL_RGB32I */
-        39, /* GL_ALPHA32I_EXT */
-       753, /* GL_INTENSITY32I_EXT */
-       869, /* GL_LUMINANCE32I_EXT */
-       886, /* GL_LUMINANCE_ALPHA32I_EXT */
-      1644, /* GL_RGBA16I */
-      1608, /* GL_RGB16I */
-        36, /* GL_ALPHA16I_EXT */
-       750, /* GL_INTENSITY16I_EXT */
-       864, /* GL_LUMINANCE16I_EXT */
-       884, /* GL_LUMINANCE_ALPHA16I_EXT */
-      1663, /* GL_RGBA8I */
-      1631, /* GL_RGB8I */
-        44, /* GL_ALPHA8I_EXT */
-       758, /* GL_INTENSITY8I_EXT */
-       878, /* GL_LUMINANCE8I_EXT */
-       888, /* GL_LUMINANCE_ALPHA8I_EXT */
-      1548, /* GL_RED_INTEGER */
-       695, /* GL_GREEN_INTEGER */
-       113, /* GL_BLUE_INTEGER */
-        49, /* GL_ALPHA_INTEGER_EXT */
-      1677, /* GL_RGB_INTEGER */
-      1671, /* GL_RGBA_INTEGER */
-        84, /* GL_BGR_INTEGER */
-        82, /* GL_BGRA_INTEGER */
-       891, /* GL_LUMINANCE_INTEGER_EXT */
-       890, /* GL_LUMINANCE_ALPHA_INTEGER_EXT */
-      1673, /* GL_RGBA_INTEGER_MODE_EXT */
-       607, /* GL_FRAMEBUFFER_ATTACHMENT_LAYERED */
-       648, /* GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS */
-       647, /* GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB */
-      1688, /* GL_SAMPLER_1D_ARRAY */
-      1694, /* GL_SAMPLER_2D_ARRAY */
-      1703, /* GL_SAMPLER_BUFFER */
-      1690, /* GL_SAMPLER_1D_ARRAY_SHADOW */
-      1696, /* GL_SAMPLER_2D_ARRAY_SHADOW */
-      1706, /* GL_SAMPLER_CUBE_SHADOW */
-      2186, /* GL_UNSIGNED_INT_VEC2 */
-      2188, /* GL_UNSIGNED_INT_VEC3 */
-      2190, /* GL_UNSIGNED_INT_VEC4 */
-       768, /* GL_INT_SAMPLER_1D */
-       772, /* GL_INT_SAMPLER_2D */
-       778, /* GL_INT_SAMPLER_3D */
-       782, /* GL_INT_SAMPLER_CUBE */
-       776, /* GL_INT_SAMPLER_2D_RECT */
-       769, /* GL_INT_SAMPLER_1D_ARRAY */
-       773, /* GL_INT_SAMPLER_2D_ARRAY */
-       780, /* GL_INT_SAMPLER_BUFFER */
-      2170, /* GL_UNSIGNED_INT_SAMPLER_1D */
-      2174, /* GL_UNSIGNED_INT_SAMPLER_2D */
-      2180, /* GL_UNSIGNED_INT_SAMPLER_3D */
-      2184, /* GL_UNSIGNED_INT_SAMPLER_CUBE */
-      2178, /* GL_UNSIGNED_INT_SAMPLER_2D_RECT */
-      2171, /* GL_UNSIGNED_INT_SAMPLER_1D_ARRAY */
-      2175, /* GL_UNSIGNED_INT_SAMPLER_2D_ARRAY */
-      2182, /* GL_UNSIGNED_INT_SAMPLER_BUFFER */
-       686, /* GL_GEOMETRY_SHADER */
-       689, /* GL_GEOMETRY_VERTICES_OUT_ARB */
-       683, /* GL_GEOMETRY_INPUT_TYPE_ARB */
-       685, /* GL_GEOMETRY_OUTPUT_TYPE_ARB */
-      1054, /* GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB */
-      1136, /* GL_MAX_VERTEX_VARYING_COMPONENTS_ARB */
-      1052, /* GL_MAX_GEOMETRY_UNIFORM_COMPONENTS */
-      1046, /* GL_MAX_GEOMETRY_OUTPUT_VERTICES */
-      1050, /* GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS */
-       854, /* GL_LOW_FLOAT */
-      1138, /* GL_MEDIUM_FLOAT */
-       700, /* GL_HIGH_FLOAT */
-       855, /* GL_LOW_INT */
-      1139, /* GL_MEDIUM_INT */
-       701, /* GL_HIGH_INT */
-      2160, /* GL_UNSIGNED_INT_10_10_10_2_OES */
-       767, /* GL_INT_10_10_10_2_OES */
-      1745, /* GL_SHADER_BINARY_FORMATS */
-      1239, /* GL_NUM_SHADER_BINARY_FORMATS */
-      1746, /* GL_SHADER_COMPILER */
-      1133, /* GL_MAX_VERTEX_UNIFORM_VECTORS */
-      1125, /* GL_MAX_VARYING_VECTORS */
-      1043, /* GL_MAX_FRAGMENT_UNIFORM_VECTORS */
-      1524, /* GL_QUERY_WAIT */
-      1518, /* GL_QUERY_NO_WAIT */
-      1514, /* GL_QUERY_BY_REGION_WAIT */
-      1512, /* GL_QUERY_BY_REGION_NO_WAIT */
-      2105, /* GL_TRANSFORM_FEEDBACK */
-      2114, /* GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED */
-      2108, /* GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE */
-      2106, /* GL_TRANSFORM_FEEDBACK_BINDING */
-      1508, /* GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION */
-       542, /* GL_FIRST_VERTEX_CONVENTION */
-       800, /* GL_LAST_VERTEX_CONVENTION */
-      1482, /* GL_PROVOKING_VERTEX */
-       350, /* GL_COPY_READ_BUFFER */
-       351, /* GL_COPY_WRITE_BUFFER */
-      1551, /* GL_RED_SNORM */
-      1684, /* GL_RG_SNORM */
-      1683, /* GL_RGB_SNORM */
-      1676, /* GL_RGBA_SNORM */
-      1530, /* GL_R8_SNORM */
-      1598, /* GL_RG8_SNORM */
-      1637, /* GL_RGB8_SNORM */
-      1669, /* GL_RGBA8_SNORM */
-      1528, /* GL_R16_SNORM */
-      1597, /* GL_RG16_SNORM */
-      1613, /* GL_RGB16_SNORM */
-      1649, /* GL_RGBA16_SNORM */
-      1757, /* GL_SIGNED_NORMALIZED */
-      1439, /* GL_PRIMITIVE_RESTART */
-      1440, /* GL_PRIMITIVE_RESTART_INDEX */
-      1099, /* GL_MAX_SERVER_WAIT_TIMEOUT */
-      1253, /* GL_OBJECT_TYPE */
-      1870, /* GL_SYNC_CONDITION */
-      1875, /* GL_SYNC_STATUS */
-      1872, /* GL_SYNC_FLAGS */
-      1871, /* GL_SYNC_FENCE */
-      1874, /* GL_SYNC_GPU_COMMANDS_COMPLETE */
-      2153, /* GL_UNSIGNALED */
-      1756, /* GL_SIGNALED */
-        54, /* GL_ALREADY_SIGNALED */
-      2100, /* GL_TIMEOUT_EXPIRED */
-       312, /* GL_CONDITION_SATISFIED */
-      2270, /* GL_WAIT_FAILED */
-       126, /* GL_BUFFER_ACCESS_FLAGS */
-       132, /* GL_BUFFER_MAP_LENGTH */
-       133, /* GL_BUFFER_MAP_OFFSET */
-      1128, /* GL_MAX_VERTEX_OUTPUT_COMPONENTS */
-      1044, /* GL_MAX_GEOMETRY_INPUT_COMPONENTS */
-      1045, /* GL_MAX_GEOMETRY_OUTPUT_COMPONENTS */
-      1040, /* GL_MAX_FRAGMENT_INPUT_COMPONENTS */
-       326, /* GL_CONTEXT_PROFILE_MASK */
-       527, /* GL_EVAL_BIT */
-      1533, /* GL_RASTER_POSITION_UNCLIPPED_IBM */
-       847, /* GL_LIST_BIT */
-      1976, /* GL_TEXTURE_BIT */
-      1726, /* GL_SCISSOR_BIT */
-        30, /* GL_ALL_ATTRIB_BITS */
-      1204, /* GL_MULTISAMPLE_BIT */
-        31, /* GL_ALL_CLIENT_ATTRIB_BITS */
-};
-
-typedef int (*cfunc)(const void *, const void *);
-
-/**
- * Compare a key name to an element in the \c all_enums array.
- *
- * \c bsearch always passes the key as the first parameter and the pointer
- * to the array element as the second parameter.  We can elimiate some
- * extra work by taking advantage of that fact.
- *
- * \param a  Pointer to the desired enum name.
- * \param b  Pointer to an element of the \c all_enums array.
- */
-static int compar_name( const char *a, const enum_elt *b )
-{
-   return strcmp( a, & enum_string_table[ b->offset ] );
-}
-
-/**
- * Compare a key enum value to an element in the \c all_enums array.
- *
- * \c bsearch always passes the key as the first parameter and the pointer
- * to the array element as the second parameter.  We can elimiate some
- * extra work by taking advantage of that fact.
- *
- * \param a  Pointer to the desired enum name.
- * \param b  Pointer to an index into the \c all_enums array.
- */
-static int compar_nr( const int *a, const unsigned *b )
-{
-   return a[0] - all_enums[*b].n;
-}
-
-
-static char token_tmp[20];
-
-const char *_mesa_lookup_enum_by_nr( int nr )
-{
-   unsigned * i;
-
-   i = (unsigned *) _mesa_bsearch(& nr, reduced_enums,
-                                  Elements(reduced_enums),
-                                  sizeof(reduced_enums[0]),
-                                  (cfunc) compar_nr);
-
-   if ( i != NULL ) {
-      return & enum_string_table[ all_enums[ *i ].offset ];
-   }
-   else {
-      /* this is not re-entrant safe, no big deal here */
-      _mesa_snprintf(token_tmp, sizeof(token_tmp) - 1, "0x%x", nr);
-      token_tmp[sizeof(token_tmp) - 1] = '\0';
-      return token_tmp;
-   }
-}
-
-/**
- * Primitive names
- */
-static const char *prim_names[PRIM_UNKNOWN + 1] = {
-   "GL_POINTS",
-   "GL_LINES",
-   "GL_LINE_LOOP",
-   "GL_LINE_STRIP",
-   "GL_TRIANGLES",
-   "GL_TRIANGLE_STRIP",
-   "GL_TRIANGLE_FAN",
-   "GL_QUADS",
-   "GL_QUAD_STRIP",
-   "GL_POLYGON",
-   "outside begin/end",
-   "inside unknown primitive",
-   "unknown state"
-};
-
-
-/* Get the name of an enum given that it is a primitive type.  Avoids
- * GL_FALSE/GL_POINTS ambiguity and others.
- */
-const char *
-_mesa_lookup_prim_by_nr(GLuint nr)
-{
-   if (nr < Elements(prim_names))
-      return prim_names[nr];
-   else
-      return "invalid mode";
-}
-
-
-int _mesa_lookup_enum_by_name( const char *symbol )
-{
-   enum_elt * f = NULL;
-
-   if ( symbol != NULL ) {
-      f = (enum_elt *) _mesa_bsearch(symbol, all_enums,
-                                     Elements(all_enums),
-                                     sizeof( enum_elt ),
-                                     (cfunc) compar_name);
-   }
-
-   return (f != NULL) ? f->n : -1;
-}
-
-
+/* DO NOT EDIT - This file generated automatically by gl_enums.py (from Mesa) script */
+
+/*
+ * Copyright (C) 1999-2005 Brian Paul All Rights Reserved.
+ * 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"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sub license,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL,
+ * AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+ * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include "main/glheader.h"
+#include "main/mfeatures.h"
+#include "main/enums.h"
+#include "main/imports.h"
+#include "main/mtypes.h"
+
+typedef struct {
+   size_t offset;
+   int n;
+} enum_elt;
+
+LONGSTRING static const char enum_string_table[] = 
+   "GL_2D\0"
+   "GL_2_BYTES\0"
+   "GL_3D\0"
+   "GL_3D_COLOR\0"
+   "GL_3D_COLOR_TEXTURE\0"
+   "GL_3_BYTES\0"
+   "GL_4D_COLOR_TEXTURE\0"
+   "GL_4_BYTES\0"
+   "GL_ACCUM\0"
+   "GL_ACCUM_ALPHA_BITS\0"
+   "GL_ACCUM_BLUE_BITS\0"
+   "GL_ACCUM_BUFFER_BIT\0"
+   "GL_ACCUM_CLEAR_VALUE\0"
+   "GL_ACCUM_GREEN_BITS\0"
+   "GL_ACCUM_RED_BITS\0"
+   "GL_ACTIVE_ATTRIBUTES\0"
+   "GL_ACTIVE_ATTRIBUTE_MAX_LENGTH\0"
+   "GL_ACTIVE_PROGRAM_EXT\0"
+   "GL_ACTIVE_STENCIL_FACE_EXT\0"
+   "GL_ACTIVE_TEXTURE\0"
+   "GL_ACTIVE_TEXTURE_ARB\0"
+   "GL_ACTIVE_UNIFORMS\0"
+   "GL_ACTIVE_UNIFORM_MAX_LENGTH\0"
+   "GL_ACTIVE_VERTEX_UNITS_ARB\0"
+   "GL_ADD\0"
+   "GL_ADD_SIGNED\0"
+   "GL_ADD_SIGNED_ARB\0"
+   "GL_ADD_SIGNED_EXT\0"
+   "GL_ALIASED_LINE_WIDTH_RANGE\0"
+   "GL_ALIASED_POINT_SIZE_RANGE\0"
+   "GL_ALL_ATTRIB_BITS\0"
+   "GL_ALL_CLIENT_ATTRIB_BITS\0"
+   "GL_ALPHA\0"
+   "GL_ALPHA12\0"
+   "GL_ALPHA12_EXT\0"
+   "GL_ALPHA16\0"
+   "GL_ALPHA16I_EXT\0"
+   "GL_ALPHA16UI_EXT\0"
+   "GL_ALPHA16_EXT\0"
+   "GL_ALPHA32I_EXT\0"
+   "GL_ALPHA32UI_EXT\0"
+   "GL_ALPHA4\0"
+   "GL_ALPHA4_EXT\0"
+   "GL_ALPHA8\0"
+   "GL_ALPHA8I_EXT\0"
+   "GL_ALPHA8UI_EXT\0"
+   "GL_ALPHA8_EXT\0"
+   "GL_ALPHA_BIAS\0"
+   "GL_ALPHA_BITS\0"
+   "GL_ALPHA_INTEGER_EXT\0"
+   "GL_ALPHA_SCALE\0"
+   "GL_ALPHA_TEST\0"
+   "GL_ALPHA_TEST_FUNC\0"
+   "GL_ALPHA_TEST_REF\0"
+   "GL_ALREADY_SIGNALED\0"
+   "GL_ALWAYS\0"
+   "GL_AMBIENT\0"
+   "GL_AMBIENT_AND_DIFFUSE\0"
+   "GL_AND\0"
+   "GL_AND_INVERTED\0"
+   "GL_AND_REVERSE\0"
+   "GL_ARRAY_BUFFER\0"
+   "GL_ARRAY_BUFFER_BINDING\0"
+   "GL_ARRAY_BUFFER_BINDING_ARB\0"
+   "GL_ATTACHED_SHADERS\0"
+   "GL_ATTRIB_ARRAY_POINTER_NV\0"
+   "GL_ATTRIB_ARRAY_SIZE_NV\0"
+   "GL_ATTRIB_ARRAY_STRIDE_NV\0"
+   "GL_ATTRIB_ARRAY_TYPE_NV\0"
+   "GL_ATTRIB_STACK_DEPTH\0"
+   "GL_AUTO_NORMAL\0"
+   "GL_AUX0\0"
+   "GL_AUX1\0"
+   "GL_AUX2\0"
+   "GL_AUX3\0"
+   "GL_AUX_BUFFERS\0"
+   "GL_BACK\0"
+   "GL_BACK_LEFT\0"
+   "GL_BACK_RIGHT\0"
+   "GL_BGR\0"
+   "GL_BGRA\0"
+   "GL_BGRA_EXT\0"
+   "GL_BGRA_INTEGER\0"
+   "GL_BGRA_INTEGER_EXT\0"
+   "GL_BGR_INTEGER\0"
+   "GL_BGR_INTEGER_EXT\0"
+   "GL_BITMAP\0"
+   "GL_BITMAP_TOKEN\0"
+   "GL_BLEND\0"
+   "GL_BLEND_COLOR\0"
+   "GL_BLEND_COLOR_EXT\0"
+   "GL_BLEND_DST\0"
+   "GL_BLEND_DST_ALPHA\0"
+   "GL_BLEND_DST_ALPHA_OES\0"
+   "GL_BLEND_DST_RGB\0"
+   "GL_BLEND_DST_RGB_OES\0"
+   "GL_BLEND_EQUATION\0"
+   "GL_BLEND_EQUATION_ALPHA\0"
+   "GL_BLEND_EQUATION_ALPHA_EXT\0"
+   "GL_BLEND_EQUATION_ALPHA_OES\0"
+   "GL_BLEND_EQUATION_EXT\0"
+   "GL_BLEND_EQUATION_OES\0"
+   "GL_BLEND_EQUATION_RGB\0"
+   "GL_BLEND_EQUATION_RGB_EXT\0"
+   "GL_BLEND_EQUATION_RGB_OES\0"
+   "GL_BLEND_SRC\0"
+   "GL_BLEND_SRC_ALPHA\0"
+   "GL_BLEND_SRC_ALPHA_OES\0"
+   "GL_BLEND_SRC_RGB\0"
+   "GL_BLEND_SRC_RGB_OES\0"
+   "GL_BLUE\0"
+   "GL_BLUE_BIAS\0"
+   "GL_BLUE_BITS\0"
+   "GL_BLUE_INTEGER\0"
+   "GL_BLUE_INTEGER_EXT\0"
+   "GL_BLUE_SCALE\0"
+   "GL_BOOL\0"
+   "GL_BOOL_ARB\0"
+   "GL_BOOL_VEC2\0"
+   "GL_BOOL_VEC2_ARB\0"
+   "GL_BOOL_VEC3\0"
+   "GL_BOOL_VEC3_ARB\0"
+   "GL_BOOL_VEC4\0"
+   "GL_BOOL_VEC4_ARB\0"
+   "GL_BUFFER_ACCESS\0"
+   "GL_BUFFER_ACCESS_ARB\0"
+   "GL_BUFFER_ACCESS_FLAGS\0"
+   "GL_BUFFER_ACCESS_OES\0"
+   "GL_BUFFER_FLUSHING_UNMAP_APPLE\0"
+   "GL_BUFFER_MAPPED\0"
+   "GL_BUFFER_MAPPED_ARB\0"
+   "GL_BUFFER_MAPPED_OES\0"
+   "GL_BUFFER_MAP_LENGTH\0"
+   "GL_BUFFER_MAP_OFFSET\0"
+   "GL_BUFFER_MAP_POINTER\0"
+   "GL_BUFFER_MAP_POINTER_ARB\0"
+   "GL_BUFFER_MAP_POINTER_OES\0"
+   "GL_BUFFER_OBJECT_APPLE\0"
+   "GL_BUFFER_SERIALIZED_MODIFY_APPLE\0"
+   "GL_BUFFER_SIZE\0"
+   "GL_BUFFER_SIZE_ARB\0"
+   "GL_BUFFER_USAGE\0"
+   "GL_BUFFER_USAGE_ARB\0"
+   "GL_BUMP_ENVMAP_ATI\0"
+   "GL_BUMP_NUM_TEX_UNITS_ATI\0"
+   "GL_BUMP_ROT_MATRIX_ATI\0"
+   "GL_BUMP_ROT_MATRIX_SIZE_ATI\0"
+   "GL_BUMP_TARGET_ATI\0"
+   "GL_BUMP_TEX_UNITS_ATI\0"
+   "GL_BYTE\0"
+   "GL_C3F_V3F\0"
+   "GL_C4F_N3F_V3F\0"
+   "GL_C4UB_V2F\0"
+   "GL_C4UB_V3F\0"
+   "GL_CCW\0"
+   "GL_CLAMP\0"
+   "GL_CLAMP_FRAGMENT_COLOR_ARB\0"
+   "GL_CLAMP_READ_COLOR\0"
+   "GL_CLAMP_READ_COLOR_ARB\0"
+   "GL_CLAMP_TO_BORDER\0"
+   "GL_CLAMP_TO_BORDER_ARB\0"
+   "GL_CLAMP_TO_BORDER_SGIS\0"
+   "GL_CLAMP_TO_EDGE\0"
+   "GL_CLAMP_TO_EDGE_SGIS\0"
+   "GL_CLAMP_VERTEX_COLOR_ARB\0"
+   "GL_CLEAR\0"
+   "GL_CLIENT_ACTIVE_TEXTURE\0"
+   "GL_CLIENT_ACTIVE_TEXTURE_ARB\0"
+   "GL_CLIENT_ALL_ATTRIB_BITS\0"
+   "GL_CLIENT_ATTRIB_STACK_DEPTH\0"
+   "GL_CLIENT_PIXEL_STORE_BIT\0"
+   "GL_CLIENT_VERTEX_ARRAY_BIT\0"
+   "GL_CLIP_DISTANCE0\0"
+   "GL_CLIP_DISTANCE1\0"
+   "GL_CLIP_DISTANCE2\0"
+   "GL_CLIP_DISTANCE3\0"
+   "GL_CLIP_DISTANCE4\0"
+   "GL_CLIP_DISTANCE5\0"
+   "GL_CLIP_DISTANCE6\0"
+   "GL_CLIP_DISTANCE7\0"
+   "GL_CLIP_PLANE0\0"
+   "GL_CLIP_PLANE1\0"
+   "GL_CLIP_PLANE2\0"
+   "GL_CLIP_PLANE3\0"
+   "GL_CLIP_PLANE4\0"
+   "GL_CLIP_PLANE5\0"
+   "GL_CLIP_VOLUME_CLIPPING_HINT_EXT\0"
+   "GL_COEFF\0"
+   "GL_COLOR\0"
+   "GL_COLOR_ARRAY\0"
+   "GL_COLOR_ARRAY_BUFFER_BINDING\0"
+   "GL_COLOR_ARRAY_BUFFER_BINDING_ARB\0"
+   "GL_COLOR_ARRAY_POINTER\0"
+   "GL_COLOR_ARRAY_SIZE\0"
+   "GL_COLOR_ARRAY_STRIDE\0"
+   "GL_COLOR_ARRAY_TYPE\0"
+   "GL_COLOR_ATTACHMENT0\0"
+   "GL_COLOR_ATTACHMENT0_EXT\0"
+   "GL_COLOR_ATTACHMENT0_OES\0"
+   "GL_COLOR_ATTACHMENT1\0"
+   "GL_COLOR_ATTACHMENT10\0"
+   "GL_COLOR_ATTACHMENT10_EXT\0"
+   "GL_COLOR_ATTACHMENT11\0"
+   "GL_COLOR_ATTACHMENT11_EXT\0"
+   "GL_COLOR_ATTACHMENT12\0"
+   "GL_COLOR_ATTACHMENT12_EXT\0"
+   "GL_COLOR_ATTACHMENT13\0"
+   "GL_COLOR_ATTACHMENT13_EXT\0"
+   "GL_COLOR_ATTACHMENT14\0"
+   "GL_COLOR_ATTACHMENT14_EXT\0"
+   "GL_COLOR_ATTACHMENT15\0"
+   "GL_COLOR_ATTACHMENT15_EXT\0"
+   "GL_COLOR_ATTACHMENT1_EXT\0"
+   "GL_COLOR_ATTACHMENT2\0"
+   "GL_COLOR_ATTACHMENT2_EXT\0"
+   "GL_COLOR_ATTACHMENT3\0"
+   "GL_COLOR_ATTACHMENT3_EXT\0"
+   "GL_COLOR_ATTACHMENT4\0"
+   "GL_COLOR_ATTACHMENT4_EXT\0"
+   "GL_COLOR_ATTACHMENT5\0"
+   "GL_COLOR_ATTACHMENT5_EXT\0"
+   "GL_COLOR_ATTACHMENT6\0"
+   "GL_COLOR_ATTACHMENT6_EXT\0"
+   "GL_COLOR_ATTACHMENT7\0"
+   "GL_COLOR_ATTACHMENT7_EXT\0"
+   "GL_COLOR_ATTACHMENT8\0"
+   "GL_COLOR_ATTACHMENT8_EXT\0"
+   "GL_COLOR_ATTACHMENT9\0"
+   "GL_COLOR_ATTACHMENT9_EXT\0"
+   "GL_COLOR_BUFFER_BIT\0"
+   "GL_COLOR_CLEAR_VALUE\0"
+   "GL_COLOR_INDEX\0"
+   "GL_COLOR_INDEXES\0"
+   "GL_COLOR_LOGIC_OP\0"
+   "GL_COLOR_MATERIAL\0"
+   "GL_COLOR_MATERIAL_FACE\0"
+   "GL_COLOR_MATERIAL_PARAMETER\0"
+   "GL_COLOR_MATRIX\0"
+   "GL_COLOR_MATRIX_SGI\0"
+   "GL_COLOR_MATRIX_STACK_DEPTH\0"
+   "GL_COLOR_MATRIX_STACK_DEPTH_SGI\0"
+   "GL_COLOR_SUM\0"
+   "GL_COLOR_SUM_ARB\0"
+   "GL_COLOR_TABLE\0"
+   "GL_COLOR_TABLE_ALPHA_SIZE\0"
+   "GL_COLOR_TABLE_ALPHA_SIZE_EXT\0"
+   "GL_COLOR_TABLE_ALPHA_SIZE_SGI\0"
+   "GL_COLOR_TABLE_BIAS\0"
+   "GL_COLOR_TABLE_BIAS_SGI\0"
+   "GL_COLOR_TABLE_BLUE_SIZE\0"
+   "GL_COLOR_TABLE_BLUE_SIZE_EXT\0"
+   "GL_COLOR_TABLE_BLUE_SIZE_SGI\0"
+   "GL_COLOR_TABLE_FORMAT\0"
+   "GL_COLOR_TABLE_FORMAT_EXT\0"
+   "GL_COLOR_TABLE_FORMAT_SGI\0"
+   "GL_COLOR_TABLE_GREEN_SIZE\0"
+   "GL_COLOR_TABLE_GREEN_SIZE_EXT\0"
+   "GL_COLOR_TABLE_GREEN_SIZE_SGI\0"
+   "GL_COLOR_TABLE_INTENSITY_SIZE\0"
+   "GL_COLOR_TABLE_INTENSITY_SIZE_EXT\0"
+   "GL_COLOR_TABLE_INTENSITY_SIZE_SGI\0"
+   "GL_COLOR_TABLE_LUMINANCE_SIZE\0"
+   "GL_COLOR_TABLE_LUMINANCE_SIZE_EXT\0"
+   "GL_COLOR_TABLE_LUMINANCE_SIZE_SGI\0"
+   "GL_COLOR_TABLE_RED_SIZE\0"
+   "GL_COLOR_TABLE_RED_SIZE_EXT\0"
+   "GL_COLOR_TABLE_RED_SIZE_SGI\0"
+   "GL_COLOR_TABLE_SCALE\0"
+   "GL_COLOR_TABLE_SCALE_SGI\0"
+   "GL_COLOR_TABLE_WIDTH\0"
+   "GL_COLOR_TABLE_WIDTH_EXT\0"
+   "GL_COLOR_TABLE_WIDTH_SGI\0"
+   "GL_COLOR_WRITEMASK\0"
+   "GL_COMBINE\0"
+   "GL_COMBINE4\0"
+   "GL_COMBINE_ALPHA\0"
+   "GL_COMBINE_ALPHA_ARB\0"
+   "GL_COMBINE_ALPHA_EXT\0"
+   "GL_COMBINE_ARB\0"
+   "GL_COMBINE_EXT\0"
+   "GL_COMBINE_RGB\0"
+   "GL_COMBINE_RGB_ARB\0"
+   "GL_COMBINE_RGB_EXT\0"
+   "GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT\0"
+   "GL_COMPARE_REF_TO_TEXTURE\0"
+   "GL_COMPARE_R_TO_TEXTURE\0"
+   "GL_COMPARE_R_TO_TEXTURE_ARB\0"
+   "GL_COMPILE\0"
+   "GL_COMPILE_AND_EXECUTE\0"
+   "GL_COMPILE_STATUS\0"
+   "GL_COMPRESSED_ALPHA\0"
+   "GL_COMPRESSED_ALPHA_ARB\0"
+   "GL_COMPRESSED_INTENSITY\0"
+   "GL_COMPRESSED_INTENSITY_ARB\0"
+   "GL_COMPRESSED_LUMINANCE\0"
+   "GL_COMPRESSED_LUMINANCE_ALPHA\0"
+   "GL_COMPRESSED_LUMINANCE_ALPHA_ARB\0"
+   "GL_COMPRESSED_LUMINANCE_ARB\0"
+   "GL_COMPRESSED_RED\0"
+   "GL_COMPRESSED_RG\0"
+   "GL_COMPRESSED_RGB\0"
+   "GL_COMPRESSED_RGBA\0"
+   "GL_COMPRESSED_RGBA_ARB\0"
+   "GL_COMPRESSED_RGBA_FXT1_3DFX\0"
+   "GL_COMPRESSED_RGBA_S3TC_DXT1_EXT\0"
+   "GL_COMPRESSED_RGBA_S3TC_DXT3_EXT\0"
+   "GL_COMPRESSED_RGBA_S3TC_DXT5_EXT\0"
+   "GL_COMPRESSED_RGB_ARB\0"
+   "GL_COMPRESSED_RGB_FXT1_3DFX\0"
+   "GL_COMPRESSED_RGB_S3TC_DXT1_EXT\0"
+   "GL_COMPRESSED_SLUMINANCE\0"
+   "GL_COMPRESSED_SLUMINANCE_ALPHA\0"
+   "GL_COMPRESSED_SRGB\0"
+   "GL_COMPRESSED_SRGB_ALPHA\0"
+   "GL_COMPRESSED_TEXTURE_FORMATS\0"
+   "GL_CONDITION_SATISFIED\0"
+   "GL_CONSTANT\0"
+   "GL_CONSTANT_ALPHA\0"
+   "GL_CONSTANT_ALPHA_EXT\0"
+   "GL_CONSTANT_ARB\0"
+   "GL_CONSTANT_ATTENUATION\0"
+   "GL_CONSTANT_BORDER_HP\0"
+   "GL_CONSTANT_COLOR\0"
+   "GL_CONSTANT_COLOR_EXT\0"
+   "GL_CONSTANT_EXT\0"
+   "GL_CONTEXT_COMPATIBILITY_PROFILE_BIT\0"
+   "GL_CONTEXT_CORE_PROFILE_BIT\0"
+   "GL_CONTEXT_FLAGS\0"
+   "GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT\0"
+   "GL_CONTEXT_PROFILE_MASK\0"
+   "GL_CONVOLUTION_1D\0"
+   "GL_CONVOLUTION_2D\0"
+   "GL_CONVOLUTION_BORDER_COLOR\0"
+   "GL_CONVOLUTION_BORDER_COLOR_HP\0"
+   "GL_CONVOLUTION_BORDER_MODE\0"
+   "GL_CONVOLUTION_BORDER_MODE_EXT\0"
+   "GL_CONVOLUTION_FILTER_BIAS\0"
+   "GL_CONVOLUTION_FILTER_BIAS_EXT\0"
+   "GL_CONVOLUTION_FILTER_SCALE\0"
+   "GL_CONVOLUTION_FILTER_SCALE_EXT\0"
+   "GL_CONVOLUTION_FORMAT\0"
+   "GL_CONVOLUTION_FORMAT_EXT\0"
+   "GL_CONVOLUTION_HEIGHT\0"
+   "GL_CONVOLUTION_HEIGHT_EXT\0"
+   "GL_CONVOLUTION_WIDTH\0"
+   "GL_CONVOLUTION_WIDTH_EXT\0"
+   "GL_COORD_REPLACE\0"
+   "GL_COORD_REPLACE_ARB\0"
+   "GL_COORD_REPLACE_NV\0"
+   "GL_COORD_REPLACE_OES\0"
+   "GL_COPY\0"
+   "GL_COPY_INVERTED\0"
+   "GL_COPY_PIXEL_TOKEN\0"
+   "GL_COPY_READ_BUFFER\0"
+   "GL_COPY_WRITE_BUFFER\0"
+   "GL_CULL_FACE\0"
+   "GL_CULL_FACE_MODE\0"
+   "GL_CULL_VERTEX_EXT\0"
+   "GL_CULL_VERTEX_EYE_POSITION_EXT\0"
+   "GL_CULL_VERTEX_OBJECT_POSITION_EXT\0"
+   "GL_CURRENT_ATTRIB_NV\0"
+   "GL_CURRENT_BIT\0"
+   "GL_CURRENT_COLOR\0"
+   "GL_CURRENT_FOG_COORD\0"
+   "GL_CURRENT_FOG_COORDINATE\0"
+   "GL_CURRENT_INDEX\0"
+   "GL_CURRENT_MATRIX_ARB\0"
+   "GL_CURRENT_MATRIX_INDEX_ARB\0"
+   "GL_CURRENT_MATRIX_NV\0"
+   "GL_CURRENT_MATRIX_STACK_DEPTH_ARB\0"
+   "GL_CURRENT_MATRIX_STACK_DEPTH_NV\0"
+   "GL_CURRENT_NORMAL\0"
+   "GL_CURRENT_PALETTE_MATRIX_ARB\0"
+   "GL_CURRENT_PALETTE_MATRIX_OES\0"
+   "GL_CURRENT_PROGRAM\0"
+   "GL_CURRENT_QUERY\0"
+   "GL_CURRENT_QUERY_ARB\0"
+   "GL_CURRENT_RASTER_COLOR\0"
+   "GL_CURRENT_RASTER_DISTANCE\0"
+   "GL_CURRENT_RASTER_INDEX\0"
+   "GL_CURRENT_RASTER_POSITION\0"
+   "GL_CURRENT_RASTER_POSITION_VALID\0"
+   "GL_CURRENT_RASTER_SECONDARY_COLOR\0"
+   "GL_CURRENT_RASTER_TEXTURE_COORDS\0"
+   "GL_CURRENT_SECONDARY_COLOR\0"
+   "GL_CURRENT_TEXTURE_COORDS\0"
+   "GL_CURRENT_VERTEX_ATTRIB\0"
+   "GL_CURRENT_VERTEX_ATTRIB_ARB\0"
+   "GL_CURRENT_WEIGHT_ARB\0"
+   "GL_CW\0"
+   "GL_DEBUG_ASSERT_MESA\0"
+   "GL_DEBUG_OBJECT_MESA\0"
+   "GL_DEBUG_PRINT_MESA\0"
+   "GL_DECAL\0"
+   "GL_DECR\0"
+   "GL_DECR_WRAP\0"
+   "GL_DECR_WRAP_EXT\0"
+   "GL_DELETE_STATUS\0"
+   "GL_DEPTH\0"
+   "GL_DEPTH24_STENCIL8\0"
+   "GL_DEPTH24_STENCIL8_EXT\0"
+   "GL_DEPTH24_STENCIL8_OES\0"
+   "GL_DEPTH_ATTACHMENT\0"
+   "GL_DEPTH_ATTACHMENT_EXT\0"
+   "GL_DEPTH_ATTACHMENT_OES\0"
+   "GL_DEPTH_BIAS\0"
+   "GL_DEPTH_BITS\0"
+   "GL_DEPTH_BOUNDS_EXT\0"
+   "GL_DEPTH_BOUNDS_TEST_EXT\0"
+   "GL_DEPTH_BUFFER\0"
+   "GL_DEPTH_BUFFER_BIT\0"
+   "GL_DEPTH_CLAMP\0"
+   "GL_DEPTH_CLAMP_NV\0"
+   "GL_DEPTH_CLEAR_VALUE\0"
+   "GL_DEPTH_COMPONENT\0"
+   "GL_DEPTH_COMPONENT16\0"
+   "GL_DEPTH_COMPONENT16_ARB\0"
+   "GL_DEPTH_COMPONENT16_OES\0"
+   "GL_DEPTH_COMPONENT16_SGIX\0"
+   "GL_DEPTH_COMPONENT24\0"
+   "GL_DEPTH_COMPONENT24_ARB\0"
+   "GL_DEPTH_COMPONENT24_OES\0"
+   "GL_DEPTH_COMPONENT24_SGIX\0"
+   "GL_DEPTH_COMPONENT32\0"
+   "GL_DEPTH_COMPONENT32_ARB\0"
+   "GL_DEPTH_COMPONENT32_OES\0"
+   "GL_DEPTH_COMPONENT32_SGIX\0"
+   "GL_DEPTH_FUNC\0"
+   "GL_DEPTH_RANGE\0"
+   "GL_DEPTH_SCALE\0"
+   "GL_DEPTH_STENCIL\0"
+   "GL_DEPTH_STENCIL_ATTACHMENT\0"
+   "GL_DEPTH_STENCIL_EXT\0"
+   "GL_DEPTH_STENCIL_NV\0"
+   "GL_DEPTH_STENCIL_OES\0"
+   "GL_DEPTH_STENCIL_TO_BGRA_NV\0"
+   "GL_DEPTH_STENCIL_TO_RGBA_NV\0"
+   "GL_DEPTH_TEST\0"
+   "GL_DEPTH_TEXTURE_MODE\0"
+   "GL_DEPTH_TEXTURE_MODE_ARB\0"
+   "GL_DEPTH_WRITEMASK\0"
+   "GL_DIFFUSE\0"
+   "GL_DITHER\0"
+   "GL_DOMAIN\0"
+   "GL_DONT_CARE\0"
+   "GL_DOT3_RGB\0"
+   "GL_DOT3_RGBA\0"
+   "GL_DOT3_RGBA_ARB\0"
+   "GL_DOT3_RGBA_EXT\0"
+   "GL_DOT3_RGB_ARB\0"
+   "GL_DOT3_RGB_EXT\0"
+   "GL_DOUBLE\0"
+   "GL_DOUBLEBUFFER\0"
+   "GL_DRAW_BUFFER\0"
+   "GL_DRAW_BUFFER0\0"
+   "GL_DRAW_BUFFER0_ARB\0"
+   "GL_DRAW_BUFFER0_ATI\0"
+   "GL_DRAW_BUFFER1\0"
+   "GL_DRAW_BUFFER10\0"
+   "GL_DRAW_BUFFER10_ARB\0"
+   "GL_DRAW_BUFFER10_ATI\0"
+   "GL_DRAW_BUFFER11\0"
+   "GL_DRAW_BUFFER11_ARB\0"
+   "GL_DRAW_BUFFER11_ATI\0"
+   "GL_DRAW_BUFFER12\0"
+   "GL_DRAW_BUFFER12_ARB\0"
+   "GL_DRAW_BUFFER12_ATI\0"
+   "GL_DRAW_BUFFER13\0"
+   "GL_DRAW_BUFFER13_ARB\0"
+   "GL_DRAW_BUFFER13_ATI\0"
+   "GL_DRAW_BUFFER14\0"
+   "GL_DRAW_BUFFER14_ARB\0"
+   "GL_DRAW_BUFFER14_ATI\0"
+   "GL_DRAW_BUFFER15\0"
+   "GL_DRAW_BUFFER15_ARB\0"
+   "GL_DRAW_BUFFER15_ATI\0"
+   "GL_DRAW_BUFFER1_ARB\0"
+   "GL_DRAW_BUFFER1_ATI\0"
+   "GL_DRAW_BUFFER2\0"
+   "GL_DRAW_BUFFER2_ARB\0"
+   "GL_DRAW_BUFFER2_ATI\0"
+   "GL_DRAW_BUFFER3\0"
+   "GL_DRAW_BUFFER3_ARB\0"
+   "GL_DRAW_BUFFER3_ATI\0"
+   "GL_DRAW_BUFFER4\0"
+   "GL_DRAW_BUFFER4_ARB\0"
+   "GL_DRAW_BUFFER4_ATI\0"
+   "GL_DRAW_BUFFER5\0"
+   "GL_DRAW_BUFFER5_ARB\0"
+   "GL_DRAW_BUFFER5_ATI\0"
+   "GL_DRAW_BUFFER6\0"
+   "GL_DRAW_BUFFER6_ARB\0"
+   "GL_DRAW_BUFFER6_ATI\0"
+   "GL_DRAW_BUFFER7\0"
+   "GL_DRAW_BUFFER7_ARB\0"
+   "GL_DRAW_BUFFER7_ATI\0"
+   "GL_DRAW_BUFFER8\0"
+   "GL_DRAW_BUFFER8_ARB\0"
+   "GL_DRAW_BUFFER8_ATI\0"
+   "GL_DRAW_BUFFER9\0"
+   "GL_DRAW_BUFFER9_ARB\0"
+   "GL_DRAW_BUFFER9_ATI\0"
+   "GL_DRAW_FRAMEBUFFER\0"
+   "GL_DRAW_FRAMEBUFFER_BINDING\0"
+   "GL_DRAW_FRAMEBUFFER_BINDING_EXT\0"
+   "GL_DRAW_FRAMEBUFFER_EXT\0"
+   "GL_DRAW_PIXEL_TOKEN\0"
+   "GL_DST_ALPHA\0"
+   "GL_DST_COLOR\0"
+   "GL_DU8DV8_ATI\0"
+   "GL_DUDV_ATI\0"
+   "GL_DYNAMIC_COPY\0"
+   "GL_DYNAMIC_COPY_ARB\0"
+   "GL_DYNAMIC_DRAW\0"
+   "GL_DYNAMIC_DRAW_ARB\0"
+   "GL_DYNAMIC_READ\0"
+   "GL_DYNAMIC_READ_ARB\0"
+   "GL_EDGE_FLAG\0"
+   "GL_EDGE_FLAG_ARRAY\0"
+   "GL_EDGE_FLAG_ARRAY_BUFFER_BINDING\0"
+   "GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB\0"
+   "GL_EDGE_FLAG_ARRAY_POINTER\0"
+   "GL_EDGE_FLAG_ARRAY_STRIDE\0"
+   "GL_ELEMENT_ARRAY_BUFFER\0"
+   "GL_ELEMENT_ARRAY_BUFFER_BINDING\0"
+   "GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB\0"
+   "GL_EMISSION\0"
+   "GL_ENABLE_BIT\0"
+   "GL_EQUAL\0"
+   "GL_EQUIV\0"
+   "GL_EVAL_BIT\0"
+   "GL_EXP\0"
+   "GL_EXP2\0"
+   "GL_EXTENSIONS\0"
+   "GL_EYE_LINEAR\0"
+   "GL_EYE_PLANE\0"
+   "GL_EYE_PLANE_ABSOLUTE_NV\0"
+   "GL_EYE_RADIAL_NV\0"
+   "GL_FALSE\0"
+   "GL_FASTEST\0"
+   "GL_FEEDBACK\0"
+   "GL_FEEDBACK_BUFFER_POINTER\0"
+   "GL_FEEDBACK_BUFFER_SIZE\0"
+   "GL_FEEDBACK_BUFFER_TYPE\0"
+   "GL_FILL\0"
+   "GL_FIRST_VERTEX_CONVENTION\0"
+   "GL_FIRST_VERTEX_CONVENTION_EXT\0"
+   "GL_FIXED\0"
+   "GL_FIXED_OES\0"
+   "GL_FIXED_ONLY\0"
+   "GL_FIXED_ONLY_ARB\0"
+   "GL_FLAT\0"
+   "GL_FLOAT\0"
+   "GL_FLOAT_MAT2\0"
+   "GL_FLOAT_MAT2_ARB\0"
+   "GL_FLOAT_MAT2x3\0"
+   "GL_FLOAT_MAT2x4\0"
+   "GL_FLOAT_MAT3\0"
+   "GL_FLOAT_MAT3_ARB\0"
+   "GL_FLOAT_MAT3x2\0"
+   "GL_FLOAT_MAT3x4\0"
+   "GL_FLOAT_MAT4\0"
+   "GL_FLOAT_MAT4_ARB\0"
+   "GL_FLOAT_MAT4x2\0"
+   "GL_FLOAT_MAT4x3\0"
+   "GL_FLOAT_VEC2\0"
+   "GL_FLOAT_VEC2_ARB\0"
+   "GL_FLOAT_VEC3\0"
+   "GL_FLOAT_VEC3_ARB\0"
+   "GL_FLOAT_VEC4\0"
+   "GL_FLOAT_VEC4_ARB\0"
+   "GL_FOG\0"
+   "GL_FOG_BIT\0"
+   "GL_FOG_COLOR\0"
+   "GL_FOG_COORD\0"
+   "GL_FOG_COORDINATE\0"
+   "GL_FOG_COORDINATE_ARRAY\0"
+   "GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING\0"
+   "GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB\0"
+   "GL_FOG_COORDINATE_ARRAY_POINTER\0"
+   "GL_FOG_COORDINATE_ARRAY_STRIDE\0"
+   "GL_FOG_COORDINATE_ARRAY_TYPE\0"
+   "GL_FOG_COORDINATE_SOURCE\0"
+   "GL_FOG_COORD_ARRAY\0"
+   "GL_FOG_COORD_ARRAY_BUFFER_BINDING\0"
+   "GL_FOG_COORD_ARRAY_POINTER\0"
+   "GL_FOG_COORD_ARRAY_STRIDE\0"
+   "GL_FOG_COORD_ARRAY_TYPE\0"
+   "GL_FOG_COORD_SRC\0"
+   "GL_FOG_DENSITY\0"
+   "GL_FOG_DISTANCE_MODE_NV\0"
+   "GL_FOG_END\0"
+   "GL_FOG_HINT\0"
+   "GL_FOG_INDEX\0"
+   "GL_FOG_MODE\0"
+   "GL_FOG_OFFSET_SGIX\0"
+   "GL_FOG_OFFSET_VALUE_SGIX\0"
+   "GL_FOG_START\0"
+   "GL_FRAGMENT_DEPTH\0"
+   "GL_FRAGMENT_PROGRAM_ARB\0"
+   "GL_FRAGMENT_SHADER\0"
+   "GL_FRAGMENT_SHADER_ARB\0"
+   "GL_FRAGMENT_SHADER_DERIVATIVE_HINT\0"
+   "GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES\0"
+   "GL_FRAMEBUFFER\0"
+   "GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE\0"
+   "GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE\0"
+   "GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING\0"
+   "GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE\0"
+   "GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE\0"
+   "GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE\0"
+   "GL_FRAMEBUFFER_ATTACHMENT_LAYERED\0"
+   "GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB\0"
+   "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME\0"
+   "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT\0"
+   "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES\0"
+   "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE\0"
+   "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT\0"
+   "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES\0"
+   "GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE\0"
+   "GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE\0"
+   "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT\0"
+   "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES\0"
+   "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE\0"
+   "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT\0"
+   "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_OES\0"
+   "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER\0"
+   "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT\0"
+   "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL\0"
+   "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT\0"
+   "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_OES\0"
+   "GL_FRAMEBUFFER_BINDING\0"
+   "GL_FRAMEBUFFER_BINDING_EXT\0"
+   "GL_FRAMEBUFFER_BINDING_OES\0"
+   "GL_FRAMEBUFFER_COMPLETE\0"
+   "GL_FRAMEBUFFER_COMPLETE_EXT\0"
+   "GL_FRAMEBUFFER_COMPLETE_OES\0"
+   "GL_FRAMEBUFFER_DEFAULT\0"
+   "GL_FRAMEBUFFER_EXT\0"
+   "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT\0"
+   "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT\0"
+   "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES\0"
+   "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS\0"
+   "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT\0"
+   "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES\0"
+   "GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER\0"
+   "GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT\0"
+   "GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_OES\0"
+   "GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT\0"
+   "GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT\0"
+   "GL_FRAMEBUFFER_INCOMPLETE_FORMATS_OES\0"
+   "GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB\0"
+   "GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS\0"
+   "GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB\0"
+   "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT\0"
+   "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT\0"
+   "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES\0"
+   "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE\0"
+   "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT\0"
+   "GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER\0"
+   "GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT\0"
+   "GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_OES\0"
+   "GL_FRAMEBUFFER_OES\0"
+   "GL_FRAMEBUFFER_STATUS_ERROR_EXT\0"
+   "GL_FRAMEBUFFER_UNDEFINED\0"
+   "GL_FRAMEBUFFER_UNSUPPORTED\0"
+   "GL_FRAMEBUFFER_UNSUPPORTED_EXT\0"
+   "GL_FRAMEBUFFER_UNSUPPORTED_OES\0"
+   "GL_FRONT\0"
+   "GL_FRONT_AND_BACK\0"
+   "GL_FRONT_FACE\0"
+   "GL_FRONT_LEFT\0"
+   "GL_FRONT_RIGHT\0"
+   "GL_FUNC_ADD\0"
+   "GL_FUNC_ADD_EXT\0"
+   "GL_FUNC_ADD_OES\0"
+   "GL_FUNC_REVERSE_SUBTRACT\0"
+   "GL_FUNC_REVERSE_SUBTRACT_EXT\0"
+   "GL_FUNC_REVERSE_SUBTRACT_OES\0"
+   "GL_FUNC_SUBTRACT\0"
+   "GL_FUNC_SUBTRACT_EXT\0"
+   "GL_FUNC_SUBTRACT_OES\0"
+   "GL_GENERATE_MIPMAP\0"
+   "GL_GENERATE_MIPMAP_HINT\0"
+   "GL_GENERATE_MIPMAP_HINT_SGIS\0"
+   "GL_GENERATE_MIPMAP_SGIS\0"
+   "GL_GEOMETRY_INPUT_TYPE\0"
+   "GL_GEOMETRY_INPUT_TYPE_ARB\0"
+   "GL_GEOMETRY_OUTPUT_TYPE\0"
+   "GL_GEOMETRY_OUTPUT_TYPE_ARB\0"
+   "GL_GEOMETRY_SHADER\0"
+   "GL_GEOMETRY_SHADER_ARB\0"
+   "GL_GEOMETRY_VERTICES_OUT\0"
+   "GL_GEOMETRY_VERTICES_OUT_ARB\0"
+   "GL_GEQUAL\0"
+   "GL_GREATER\0"
+   "GL_GREEN\0"
+   "GL_GREEN_BIAS\0"
+   "GL_GREEN_BITS\0"
+   "GL_GREEN_INTEGER\0"
+   "GL_GREEN_INTEGER_EXT\0"
+   "GL_GREEN_SCALE\0"
+   "GL_HALF_FLOAT\0"
+   "GL_HALF_FLOAT_OES\0"
+   "GL_HIGH_FLOAT\0"
+   "GL_HIGH_INT\0"
+   "GL_HINT_BIT\0"
+   "GL_HISTOGRAM\0"
+   "GL_HISTOGRAM_ALPHA_SIZE\0"
+   "GL_HISTOGRAM_ALPHA_SIZE_EXT\0"
+   "GL_HISTOGRAM_BLUE_SIZE\0"
+   "GL_HISTOGRAM_BLUE_SIZE_EXT\0"
+   "GL_HISTOGRAM_EXT\0"
+   "GL_HISTOGRAM_FORMAT\0"
+   "GL_HISTOGRAM_FORMAT_EXT\0"
+   "GL_HISTOGRAM_GREEN_SIZE\0"
+   "GL_HISTOGRAM_GREEN_SIZE_EXT\0"
+   "GL_HISTOGRAM_LUMINANCE_SIZE\0"
+   "GL_HISTOGRAM_LUMINANCE_SIZE_EXT\0"
+   "GL_HISTOGRAM_RED_SIZE\0"
+   "GL_HISTOGRAM_RED_SIZE_EXT\0"
+   "GL_HISTOGRAM_SINK\0"
+   "GL_HISTOGRAM_SINK_EXT\0"
+   "GL_HISTOGRAM_WIDTH\0"
+   "GL_HISTOGRAM_WIDTH_EXT\0"
+   "GL_IDENTITY_NV\0"
+   "GL_IGNORE_BORDER_HP\0"
+   "GL_IMPLEMENTATION_COLOR_READ_FORMAT\0"
+   "GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES\0"
+   "GL_IMPLEMENTATION_COLOR_READ_TYPE\0"
+   "GL_IMPLEMENTATION_COLOR_READ_TYPE_OES\0"
+   "GL_INCR\0"
+   "GL_INCR_WRAP\0"
+   "GL_INCR_WRAP_EXT\0"
+   "GL_INDEX\0"
+   "GL_INDEX_ARRAY\0"
+   "GL_INDEX_ARRAY_BUFFER_BINDING\0"
+   "GL_INDEX_ARRAY_BUFFER_BINDING_ARB\0"
+   "GL_INDEX_ARRAY_POINTER\0"
+   "GL_INDEX_ARRAY_STRIDE\0"
+   "GL_INDEX_ARRAY_TYPE\0"
+   "GL_INDEX_BITS\0"
+   "GL_INDEX_CLEAR_VALUE\0"
+   "GL_INDEX_LOGIC_OP\0"
+   "GL_INDEX_MODE\0"
+   "GL_INDEX_OFFSET\0"
+   "GL_INDEX_SHIFT\0"
+   "GL_INDEX_WRITEMASK\0"
+   "GL_INFO_LOG_LENGTH\0"
+   "GL_INT\0"
+   "GL_INTENSITY\0"
+   "GL_INTENSITY12\0"
+   "GL_INTENSITY12_EXT\0"
+   "GL_INTENSITY16\0"
+   "GL_INTENSITY16I_EXT\0"
+   "GL_INTENSITY16UI_EXT\0"
+   "GL_INTENSITY16_EXT\0"
+   "GL_INTENSITY32I_EXT\0"
+   "GL_INTENSITY32UI_EXT\0"
+   "GL_INTENSITY4\0"
+   "GL_INTENSITY4_EXT\0"
+   "GL_INTENSITY8\0"
+   "GL_INTENSITY8I_EXT\0"
+   "GL_INTENSITY8UI_EXT\0"
+   "GL_INTENSITY8_EXT\0"
+   "GL_INTENSITY_EXT\0"
+   "GL_INTERLEAVED_ATTRIBS\0"
+   "GL_INTERLEAVED_ATTRIBS_EXT\0"
+   "GL_INTERPOLATE\0"
+   "GL_INTERPOLATE_ARB\0"
+   "GL_INTERPOLATE_EXT\0"
+   "GL_INT_10_10_10_2_OES\0"
+   "GL_INT_SAMPLER_1D\0"
+   "GL_INT_SAMPLER_1D_ARRAY\0"
+   "GL_INT_SAMPLER_1D_ARRAY_EXT\0"
+   "GL_INT_SAMPLER_1D_EXT\0"
+   "GL_INT_SAMPLER_2D\0"
+   "GL_INT_SAMPLER_2D_ARRAY\0"
+   "GL_INT_SAMPLER_2D_ARRAY_EXT\0"
+   "GL_INT_SAMPLER_2D_EXT\0"
+   "GL_INT_SAMPLER_2D_RECT\0"
+   "GL_INT_SAMPLER_2D_RECT_EXT\0"
+   "GL_INT_SAMPLER_3D\0"
+   "GL_INT_SAMPLER_3D_EXT\0"
+   "GL_INT_SAMPLER_BUFFER\0"
+   "GL_INT_SAMPLER_BUFFER_EXT\0"
+   "GL_INT_SAMPLER_CUBE\0"
+   "GL_INT_SAMPLER_CUBE_EXT\0"
+   "GL_INT_VEC2\0"
+   "GL_INT_VEC2_ARB\0"
+   "GL_INT_VEC3\0"
+   "GL_INT_VEC3_ARB\0"
+   "GL_INT_VEC4\0"
+   "GL_INT_VEC4_ARB\0"
+   "GL_INVALID_ENUM\0"
+   "GL_INVALID_FRAMEBUFFER_OPERATION\0"
+   "GL_INVALID_FRAMEBUFFER_OPERATION_EXT\0"
+   "GL_INVALID_FRAMEBUFFER_OPERATION_OES\0"
+   "GL_INVALID_OPERATION\0"
+   "GL_INVALID_VALUE\0"
+   "GL_INVERSE_NV\0"
+   "GL_INVERSE_TRANSPOSE_NV\0"
+   "GL_INVERT\0"
+   "GL_KEEP\0"
+   "GL_LAST_VERTEX_CONVENTION\0"
+   "GL_LAST_VERTEX_CONVENTION_EXT\0"
+   "GL_LEFT\0"
+   "GL_LEQUAL\0"
+   "GL_LESS\0"
+   "GL_LIGHT0\0"
+   "GL_LIGHT1\0"
+   "GL_LIGHT2\0"
+   "GL_LIGHT3\0"
+   "GL_LIGHT4\0"
+   "GL_LIGHT5\0"
+   "GL_LIGHT6\0"
+   "GL_LIGHT7\0"
+   "GL_LIGHTING\0"
+   "GL_LIGHTING_BIT\0"
+   "GL_LIGHT_MODEL_AMBIENT\0"
+   "GL_LIGHT_MODEL_COLOR_CONTROL\0"
+   "GL_LIGHT_MODEL_COLOR_CONTROL_EXT\0"
+   "GL_LIGHT_MODEL_LOCAL_VIEWER\0"
+   "GL_LIGHT_MODEL_TWO_SIDE\0"
+   "GL_LINE\0"
+   "GL_LINEAR\0"
+   "GL_LINEAR_ATTENUATION\0"
+   "GL_LINEAR_CLIPMAP_LINEAR_SGIX\0"
+   "GL_LINEAR_CLIPMAP_NEAREST_SGIX\0"
+   "GL_LINEAR_MIPMAP_LINEAR\0"
+   "GL_LINEAR_MIPMAP_NEAREST\0"
+   "GL_LINES\0"
+   "GL_LINES_ADJACENCY\0"
+   "GL_LINES_ADJACENCY_ARB\0"
+   "GL_LINE_BIT\0"
+   "GL_LINE_LOOP\0"
+   "GL_LINE_RESET_TOKEN\0"
+   "GL_LINE_SMOOTH\0"
+   "GL_LINE_SMOOTH_HINT\0"
+   "GL_LINE_STIPPLE\0"
+   "GL_LINE_STIPPLE_PATTERN\0"
+   "GL_LINE_STIPPLE_REPEAT\0"
+   "GL_LINE_STRIP\0"
+   "GL_LINE_STRIP_ADJACENCY\0"
+   "GL_LINE_STRIP_ADJACENCY_ARB\0"
+   "GL_LINE_TOKEN\0"
+   "GL_LINE_WIDTH\0"
+   "GL_LINE_WIDTH_GRANULARITY\0"
+   "GL_LINE_WIDTH_RANGE\0"
+   "GL_LINK_STATUS\0"
+   "GL_LIST_BASE\0"
+   "GL_LIST_BIT\0"
+   "GL_LIST_INDEX\0"
+   "GL_LIST_MODE\0"
+   "GL_LOAD\0"
+   "GL_LOGIC_OP\0"
+   "GL_LOGIC_OP_MODE\0"
+   "GL_LOWER_LEFT\0"
+   "GL_LOW_FLOAT\0"
+   "GL_LOW_INT\0"
+   "GL_LUMINANCE\0"
+   "GL_LUMINANCE12\0"
+   "GL_LUMINANCE12_ALPHA12\0"
+   "GL_LUMINANCE12_ALPHA12_EXT\0"
+   "GL_LUMINANCE12_ALPHA4\0"
+   "GL_LUMINANCE12_ALPHA4_EXT\0"
+   "GL_LUMINANCE12_EXT\0"
+   "GL_LUMINANCE16\0"
+   "GL_LUMINANCE16I_EXT\0"
+   "GL_LUMINANCE16UI_EXT\0"
+   "GL_LUMINANCE16_ALPHA16\0"
+   "GL_LUMINANCE16_ALPHA16_EXT\0"
+   "GL_LUMINANCE16_EXT\0"
+   "GL_LUMINANCE32I_EXT\0"
+   "GL_LUMINANCE32UI_EXT\0"
+   "GL_LUMINANCE4\0"
+   "GL_LUMINANCE4_ALPHA4\0"
+   "GL_LUMINANCE4_ALPHA4_EXT\0"
+   "GL_LUMINANCE4_EXT\0"
+   "GL_LUMINANCE6_ALPHA2\0"
+   "GL_LUMINANCE6_ALPHA2_EXT\0"
+   "GL_LUMINANCE8\0"
+   "GL_LUMINANCE8I_EXT\0"
+   "GL_LUMINANCE8UI_EXT\0"
+   "GL_LUMINANCE8_ALPHA8\0"
+   "GL_LUMINANCE8_ALPHA8_EXT\0"
+   "GL_LUMINANCE8_EXT\0"
+   "GL_LUMINANCE_ALPHA\0"
+   "GL_LUMINANCE_ALPHA16I_EXT\0"
+   "GL_LUMINANCE_ALPHA16UI_EXT\0"
+   "GL_LUMINANCE_ALPHA32I_EXT\0"
+   "GL_LUMINANCE_ALPHA32UI_EXT\0"
+   "GL_LUMINANCE_ALPHA8I_EXT\0"
+   "GL_LUMINANCE_ALPHA8UI_EXT\0"
+   "GL_LUMINANCE_ALPHA_INTEGER_EXT\0"
+   "GL_LUMINANCE_INTEGER_EXT\0"
+   "GL_MAJOR_VERSION\0"
+   "GL_MAP1_COLOR_4\0"
+   "GL_MAP1_GRID_DOMAIN\0"
+   "GL_MAP1_GRID_SEGMENTS\0"
+   "GL_MAP1_INDEX\0"
+   "GL_MAP1_NORMAL\0"
+   "GL_MAP1_TEXTURE_COORD_1\0"
+   "GL_MAP1_TEXTURE_COORD_2\0"
+   "GL_MAP1_TEXTURE_COORD_3\0"
+   "GL_MAP1_TEXTURE_COORD_4\0"
+   "GL_MAP1_VERTEX_3\0"
+   "GL_MAP1_VERTEX_4\0"
+   "GL_MAP1_VERTEX_ATTRIB0_4_NV\0"
+   "GL_MAP1_VERTEX_ATTRIB10_4_NV\0"
+   "GL_MAP1_VERTEX_ATTRIB11_4_NV\0"
+   "GL_MAP1_VERTEX_ATTRIB12_4_NV\0"
+   "GL_MAP1_VERTEX_ATTRIB13_4_NV\0"
+   "GL_MAP1_VERTEX_ATTRIB14_4_NV\0"
+   "GL_MAP1_VERTEX_ATTRIB15_4_NV\0"
+   "GL_MAP1_VERTEX_ATTRIB1_4_NV\0"
+   "GL_MAP1_VERTEX_ATTRIB2_4_NV\0"
+   "GL_MAP1_VERTEX_ATTRIB3_4_NV\0"
+   "GL_MAP1_VERTEX_ATTRIB4_4_NV\0"
+   "GL_MAP1_VERTEX_ATTRIB5_4_NV\0"
+   "GL_MAP1_VERTEX_ATTRIB6_4_NV\0"
+   "GL_MAP1_VERTEX_ATTRIB7_4_NV\0"
+   "GL_MAP1_VERTEX_ATTRIB8_4_NV\0"
+   "GL_MAP1_VERTEX_ATTRIB9_4_NV\0"
+   "GL_MAP2_COLOR_4\0"
+   "GL_MAP2_GRID_DOMAIN\0"
+   "GL_MAP2_GRID_SEGMENTS\0"
+   "GL_MAP2_INDEX\0"
+   "GL_MAP2_NORMAL\0"
+   "GL_MAP2_TEXTURE_COORD_1\0"
+   "GL_MAP2_TEXTURE_COORD_2\0"
+   "GL_MAP2_TEXTURE_COORD_3\0"
+   "GL_MAP2_TEXTURE_COORD_4\0"
+   "GL_MAP2_VERTEX_3\0"
+   "GL_MAP2_VERTEX_4\0"
+   "GL_MAP2_VERTEX_ATTRIB0_4_NV\0"
+   "GL_MAP2_VERTEX_ATTRIB10_4_NV\0"
+   "GL_MAP2_VERTEX_ATTRIB11_4_NV\0"
+   "GL_MAP2_VERTEX_ATTRIB12_4_NV\0"
+   "GL_MAP2_VERTEX_ATTRIB13_4_NV\0"
+   "GL_MAP2_VERTEX_ATTRIB14_4_NV\0"
+   "GL_MAP2_VERTEX_ATTRIB15_4_NV\0"
+   "GL_MAP2_VERTEX_ATTRIB1_4_NV\0"
+   "GL_MAP2_VERTEX_ATTRIB2_4_NV\0"
+   "GL_MAP2_VERTEX_ATTRIB3_4_NV\0"
+   "GL_MAP2_VERTEX_ATTRIB4_4_NV\0"
+   "GL_MAP2_VERTEX_ATTRIB5_4_NV\0"
+   "GL_MAP2_VERTEX_ATTRIB6_4_NV\0"
+   "GL_MAP2_VERTEX_ATTRIB7_4_NV\0"
+   "GL_MAP2_VERTEX_ATTRIB8_4_NV\0"
+   "GL_MAP2_VERTEX_ATTRIB9_4_NV\0"
+   "GL_MAP_COLOR\0"
+   "GL_MAP_FLUSH_EXPLICIT_BIT\0"
+   "GL_MAP_INVALIDATE_BUFFER_BIT\0"
+   "GL_MAP_INVALIDATE_RANGE_BIT\0"
+   "GL_MAP_READ_BIT\0"
+   "GL_MAP_STENCIL\0"
+   "GL_MAP_UNSYNCHRONIZED_BIT\0"
+   "GL_MAP_WRITE_BIT\0"
+   "GL_MATRIX0_ARB\0"
+   "GL_MATRIX0_NV\0"
+   "GL_MATRIX10_ARB\0"
+   "GL_MATRIX11_ARB\0"
+   "GL_MATRIX12_ARB\0"
+   "GL_MATRIX13_ARB\0"
+   "GL_MATRIX14_ARB\0"
+   "GL_MATRIX15_ARB\0"
+   "GL_MATRIX16_ARB\0"
+   "GL_MATRIX17_ARB\0"
+   "GL_MATRIX18_ARB\0"
+   "GL_MATRIX19_ARB\0"
+   "GL_MATRIX1_ARB\0"
+   "GL_MATRIX1_NV\0"
+   "GL_MATRIX20_ARB\0"
+   "GL_MATRIX21_ARB\0"
+   "GL_MATRIX22_ARB\0"
+   "GL_MATRIX23_ARB\0"
+   "GL_MATRIX24_ARB\0"
+   "GL_MATRIX25_ARB\0"
+   "GL_MATRIX26_ARB\0"
+   "GL_MATRIX27_ARB\0"
+   "GL_MATRIX28_ARB\0"
+   "GL_MATRIX29_ARB\0"
+   "GL_MATRIX2_ARB\0"
+   "GL_MATRIX2_NV\0"
+   "GL_MATRIX30_ARB\0"
+   "GL_MATRIX31_ARB\0"
+   "GL_MATRIX3_ARB\0"
+   "GL_MATRIX3_NV\0"
+   "GL_MATRIX4_ARB\0"
+   "GL_MATRIX4_NV\0"
+   "GL_MATRIX5_ARB\0"
+   "GL_MATRIX5_NV\0"
+   "GL_MATRIX6_ARB\0"
+   "GL_MATRIX6_NV\0"
+   "GL_MATRIX7_ARB\0"
+   "GL_MATRIX7_NV\0"
+   "GL_MATRIX8_ARB\0"
+   "GL_MATRIX9_ARB\0"
+   "GL_MATRIX_INDEX_ARRAY_ARB\0"
+   "GL_MATRIX_INDEX_ARRAY_BUFFER_BINDING_OES\0"
+   "GL_MATRIX_INDEX_ARRAY_OES\0"
+   "GL_MATRIX_INDEX_ARRAY_POINTER_ARB\0"
+   "GL_MATRIX_INDEX_ARRAY_POINTER_OES\0"
+   "GL_MATRIX_INDEX_ARRAY_SIZE_ARB\0"
+   "GL_MATRIX_INDEX_ARRAY_SIZE_OES\0"
+   "GL_MATRIX_INDEX_ARRAY_STRIDE_ARB\0"
+   "GL_MATRIX_INDEX_ARRAY_STRIDE_OES\0"
+   "GL_MATRIX_INDEX_ARRAY_TYPE_ARB\0"
+   "GL_MATRIX_INDEX_ARRAY_TYPE_OES\0"
+   "GL_MATRIX_MODE\0"
+   "GL_MATRIX_PALETTE_ARB\0"
+   "GL_MATRIX_PALETTE_OES\0"
+   "GL_MAX\0"
+   "GL_MAX_3D_TEXTURE_SIZE\0"
+   "GL_MAX_3D_TEXTURE_SIZE_OES\0"
+   "GL_MAX_ARRAY_TEXTURE_LAYERS\0"
+   "GL_MAX_ARRAY_TEXTURE_LAYERS_EXT\0"
+   "GL_MAX_ATTRIB_STACK_DEPTH\0"
+   "GL_MAX_CLIENT_ATTRIB_STACK_DEPTH\0"
+   "GL_MAX_CLIPMAP_DEPTH_SGIX\0"
+   "GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX\0"
+   "GL_MAX_CLIP_DISTANCES\0"
+   "GL_MAX_CLIP_PLANES\0"
+   "GL_MAX_COLOR_ATTACHMENTS\0"
+   "GL_MAX_COLOR_ATTACHMENTS_EXT\0"
+   "GL_MAX_COLOR_MATRIX_STACK_DEPTH\0"
+   "GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI\0"
+   "GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS\0"
+   "GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB\0"
+   "GL_MAX_CONVOLUTION_HEIGHT\0"
+   "GL_MAX_CONVOLUTION_HEIGHT_EXT\0"
+   "GL_MAX_CONVOLUTION_WIDTH\0"
+   "GL_MAX_CONVOLUTION_WIDTH_EXT\0"
+   "GL_MAX_CUBE_MAP_TEXTURE_SIZE\0"
+   "GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB\0"
+   "GL_MAX_CUBE_MAP_TEXTURE_SIZE_OES\0"
+   "GL_MAX_DRAW_BUFFERS\0"
+   "GL_MAX_DRAW_BUFFERS_ARB\0"
+   "GL_MAX_DRAW_BUFFERS_ATI\0"
+   "GL_MAX_ELEMENTS_INDICES\0"
+   "GL_MAX_ELEMENTS_VERTICES\0"
+   "GL_MAX_EVAL_ORDER\0"
+   "GL_MAX_EXT\0"
+   "GL_MAX_FRAGMENT_INPUT_COMPONENTS\0"
+   "GL_MAX_FRAGMENT_UNIFORM_COMPONENTS\0"
+   "GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB\0"
+   "GL_MAX_FRAGMENT_UNIFORM_VECTORS\0"
+   "GL_MAX_GEOMETRY_INPUT_COMPONENTS\0"
+   "GL_MAX_GEOMETRY_OUTPUT_COMPONENTS\0"
+   "GL_MAX_GEOMETRY_OUTPUT_VERTICES\0"
+   "GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB\0"
+   "GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS\0"
+   "GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB\0"
+   "GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS\0"
+   "GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB\0"
+   "GL_MAX_GEOMETRY_UNIFORM_COMPONENTS\0"
+   "GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB\0"
+   "GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB\0"
+   "GL_MAX_LIGHTS\0"
+   "GL_MAX_LIST_NESTING\0"
+   "GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB\0"
+   "GL_MAX_MODELVIEW_STACK_DEPTH\0"
+   "GL_MAX_NAME_STACK_DEPTH\0"
+   "GL_MAX_PALETTE_MATRICES_ARB\0"
+   "GL_MAX_PALETTE_MATRICES_OES\0"
+   "GL_MAX_PIXEL_MAP_TABLE\0"
+   "GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB\0"
+   "GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB\0"
+   "GL_MAX_PROGRAM_ATTRIBS_ARB\0"
+   "GL_MAX_PROGRAM_CALL_DEPTH_NV\0"
+   "GL_MAX_PROGRAM_ENV_PARAMETERS_ARB\0"
+   "GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV\0"
+   "GL_MAX_PROGRAM_IF_DEPTH_NV\0"
+   "GL_MAX_PROGRAM_INSTRUCTIONS_ARB\0"
+   "GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB\0"
+   "GL_MAX_PROGRAM_LOOP_COUNT_NV\0"
+   "GL_MAX_PROGRAM_LOOP_DEPTH_NV\0"
+   "GL_MAX_PROGRAM_MATRICES_ARB\0"
+   "GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB\0"
+   "GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB\0"
+   "GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB\0"
+   "GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB\0"
+   "GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB\0"
+   "GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB\0"
+   "GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB\0"
+   "GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB\0"
+   "GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB\0"
+   "GL_MAX_PROGRAM_PARAMETERS_ARB\0"
+   "GL_MAX_PROGRAM_TEMPORARIES_ARB\0"
+   "GL_MAX_PROGRAM_TEXEL_OFFSET\0"
+   "GL_MAX_PROGRAM_TEXEL_OFFSET_EXT\0"
+   "GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB\0"
+   "GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB\0"
+   "GL_MAX_PROJECTION_STACK_DEPTH\0"
+   "GL_MAX_RECTANGLE_TEXTURE_SIZE\0"
+   "GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB\0"
+   "GL_MAX_RECTANGLE_TEXTURE_SIZE_NV\0"
+   "GL_MAX_RENDERBUFFER_SIZE\0"
+   "GL_MAX_RENDERBUFFER_SIZE_EXT\0"
+   "GL_MAX_RENDERBUFFER_SIZE_OES\0"
+   "GL_MAX_SAMPLES\0"
+   "GL_MAX_SAMPLES_EXT\0"
+   "GL_MAX_SERVER_WAIT_TIMEOUT\0"
+   "GL_MAX_SHININESS_NV\0"
+   "GL_MAX_SPOT_EXPONENT_NV\0"
+   "GL_MAX_TEXTURE_BUFFER_SIZE\0"
+   "GL_MAX_TEXTURE_COORDS\0"
+   "GL_MAX_TEXTURE_COORDS_ARB\0"
+   "GL_MAX_TEXTURE_IMAGE_UNITS\0"
+   "GL_MAX_TEXTURE_IMAGE_UNITS_ARB\0"
+   "GL_MAX_TEXTURE_LOD_BIAS\0"
+   "GL_MAX_TEXTURE_LOD_BIAS_EXT\0"
+   "GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT\0"
+   "GL_MAX_TEXTURE_SIZE\0"
+   "GL_MAX_TEXTURE_STACK_DEPTH\0"
+   "GL_MAX_TEXTURE_UNITS\0"
+   "GL_MAX_TEXTURE_UNITS_ARB\0"
+   "GL_MAX_TRACK_MATRICES_NV\0"
+   "GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV\0"
+   "GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS\0"
+   "GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT\0"
+   "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS\0"
+   "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT\0"
+   "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS\0"
+   "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT\0"
+   "GL_MAX_VARYING_COMPONENTS\0"
+   "GL_MAX_VARYING_FLOATS\0"
+   "GL_MAX_VARYING_FLOATS_ARB\0"
+   "GL_MAX_VARYING_VECTORS\0"
+   "GL_MAX_VERTEX_ATTRIBS\0"
+   "GL_MAX_VERTEX_ATTRIBS_ARB\0"
+   "GL_MAX_VERTEX_OUTPUT_COMPONENTS\0"
+   "GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS\0"
+   "GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB\0"
+   "GL_MAX_VERTEX_UNIFORM_COMPONENTS\0"
+   "GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB\0"
+   "GL_MAX_VERTEX_UNIFORM_VECTORS\0"
+   "GL_MAX_VERTEX_UNITS_ARB\0"
+   "GL_MAX_VERTEX_UNITS_OES\0"
+   "GL_MAX_VERTEX_VARYING_COMPONENTS_ARB\0"
+   "GL_MAX_VIEWPORT_DIMS\0"
+   "GL_MEDIUM_FLOAT\0"
+   "GL_MEDIUM_INT\0"
+   "GL_MIN\0"
+   "GL_MINMAX\0"
+   "GL_MINMAX_EXT\0"
+   "GL_MINMAX_FORMAT\0"
+   "GL_MINMAX_FORMAT_EXT\0"
+   "GL_MINMAX_SINK\0"
+   "GL_MINMAX_SINK_EXT\0"
+   "GL_MINOR_VERSION\0"
+   "GL_MIN_EXT\0"
+   "GL_MIN_PROGRAM_TEXEL_OFFSET\0"
+   "GL_MIN_PROGRAM_TEXEL_OFFSET_EXT\0"
+   "GL_MIRRORED_REPEAT\0"
+   "GL_MIRRORED_REPEAT_ARB\0"
+   "GL_MIRRORED_REPEAT_IBM\0"
+   "GL_MIRROR_CLAMP_ATI\0"
+   "GL_MIRROR_CLAMP_EXT\0"
+   "GL_MIRROR_CLAMP_TO_BORDER_EXT\0"
+   "GL_MIRROR_CLAMP_TO_EDGE_ATI\0"
+   "GL_MIRROR_CLAMP_TO_EDGE_EXT\0"
+   "GL_MODELVIEW\0"
+   "GL_MODELVIEW0_ARB\0"
+   "GL_MODELVIEW10_ARB\0"
+   "GL_MODELVIEW11_ARB\0"
+   "GL_MODELVIEW12_ARB\0"
+   "GL_MODELVIEW13_ARB\0"
+   "GL_MODELVIEW14_ARB\0"
+   "GL_MODELVIEW15_ARB\0"
+   "GL_MODELVIEW16_ARB\0"
+   "GL_MODELVIEW17_ARB\0"
+   "GL_MODELVIEW18_ARB\0"
+   "GL_MODELVIEW19_ARB\0"
+   "GL_MODELVIEW1_ARB\0"
+   "GL_MODELVIEW20_ARB\0"
+   "GL_MODELVIEW21_ARB\0"
+   "GL_MODELVIEW22_ARB\0"
+   "GL_MODELVIEW23_ARB\0"
+   "GL_MODELVIEW24_ARB\0"
+   "GL_MODELVIEW25_ARB\0"
+   "GL_MODELVIEW26_ARB\0"
+   "GL_MODELVIEW27_ARB\0"
+   "GL_MODELVIEW28_ARB\0"
+   "GL_MODELVIEW29_ARB\0"
+   "GL_MODELVIEW2_ARB\0"
+   "GL_MODELVIEW30_ARB\0"
+   "GL_MODELVIEW31_ARB\0"
+   "GL_MODELVIEW3_ARB\0"
+   "GL_MODELVIEW4_ARB\0"
+   "GL_MODELVIEW5_ARB\0"
+   "GL_MODELVIEW6_ARB\0"
+   "GL_MODELVIEW7_ARB\0"
+   "GL_MODELVIEW8_ARB\0"
+   "GL_MODELVIEW9_ARB\0"
+   "GL_MODELVIEW_MATRIX\0"
+   "GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES\0"
+   "GL_MODELVIEW_PROJECTION_NV\0"
+   "GL_MODELVIEW_STACK_DEPTH\0"
+   "GL_MODULATE\0"
+   "GL_MODULATE_ADD_ATI\0"
+   "GL_MODULATE_SIGNED_ADD_ATI\0"
+   "GL_MODULATE_SUBTRACT_ATI\0"
+   "GL_MULT\0"
+   "GL_MULTISAMPLE\0"
+   "GL_MULTISAMPLE_3DFX\0"
+   "GL_MULTISAMPLE_ARB\0"
+   "GL_MULTISAMPLE_BIT\0"
+   "GL_MULTISAMPLE_BIT_3DFX\0"
+   "GL_MULTISAMPLE_BIT_ARB\0"
+   "GL_MULTISAMPLE_FILTER_HINT_NV\0"
+   "GL_N3F_V3F\0"
+   "GL_NAME_STACK_DEPTH\0"
+   "GL_NAND\0"
+   "GL_NEAREST\0"
+   "GL_NEAREST_CLIPMAP_LINEAR_SGIX\0"
+   "GL_NEAREST_CLIPMAP_NEAREST_SGIX\0"
+   "GL_NEAREST_MIPMAP_LINEAR\0"
+   "GL_NEAREST_MIPMAP_NEAREST\0"
+   "GL_NEVER\0"
+   "GL_NICEST\0"
+   "GL_NONE\0"
+   "GL_NONE_OES\0"
+   "GL_NOOP\0"
+   "GL_NOR\0"
+   "GL_NORMALIZE\0"
+   "GL_NORMAL_ARRAY\0"
+   "GL_NORMAL_ARRAY_BUFFER_BINDING\0"
+   "GL_NORMAL_ARRAY_BUFFER_BINDING_ARB\0"
+   "GL_NORMAL_ARRAY_POINTER\0"
+   "GL_NORMAL_ARRAY_STRIDE\0"
+   "GL_NORMAL_ARRAY_TYPE\0"
+   "GL_NORMAL_MAP\0"
+   "GL_NORMAL_MAP_ARB\0"
+   "GL_NORMAL_MAP_NV\0"
+   "GL_NORMAL_MAP_OES\0"
+   "GL_NOTEQUAL\0"
+   "GL_NO_ERROR\0"
+   "GL_NUM_COMPRESSED_TEXTURE_FORMATS\0"
+   "GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB\0"
+   "GL_NUM_EXTENSIONS\0"
+   "GL_NUM_PROGRAM_BINARY_FORMATS_OES\0"
+   "GL_NUM_SHADER_BINARY_FORMATS\0"
+   "GL_OBJECT_ACTIVE_ATTRIBUTES_ARB\0"
+   "GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB\0"
+   "GL_OBJECT_ACTIVE_UNIFORMS_ARB\0"
+   "GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB\0"
+   "GL_OBJECT_ATTACHED_OBJECTS_ARB\0"
+   "GL_OBJECT_COMPILE_STATUS_ARB\0"
+   "GL_OBJECT_DELETE_STATUS_ARB\0"
+   "GL_OBJECT_INFO_LOG_LENGTH_ARB\0"
+   "GL_OBJECT_LINEAR\0"
+   "GL_OBJECT_LINK_STATUS_ARB\0"
+   "GL_OBJECT_PLANE\0"
+   "GL_OBJECT_SHADER_SOURCE_LENGTH_ARB\0"
+   "GL_OBJECT_SUBTYPE_ARB\0"
+   "GL_OBJECT_TYPE\0"
+   "GL_OBJECT_TYPE_ARB\0"
+   "GL_OBJECT_VALIDATE_STATUS_ARB\0"
+   "GL_OCCLUSION_TEST_HP\0"
+   "GL_OCCLUSION_TEST_RESULT_HP\0"
+   "GL_ONE\0"
+   "GL_ONE_MINUS_CONSTANT_ALPHA\0"
+   "GL_ONE_MINUS_CONSTANT_ALPHA_EXT\0"
+   "GL_ONE_MINUS_CONSTANT_COLOR\0"
+   "GL_ONE_MINUS_CONSTANT_COLOR_EXT\0"
+   "GL_ONE_MINUS_DST_ALPHA\0"
+   "GL_ONE_MINUS_DST_COLOR\0"
+   "GL_ONE_MINUS_SRC_ALPHA\0"
+   "GL_ONE_MINUS_SRC_COLOR\0"
+   "GL_OPERAND0_ALPHA\0"
+   "GL_OPERAND0_ALPHA_ARB\0"
+   "GL_OPERAND0_ALPHA_EXT\0"
+   "GL_OPERAND0_RGB\0"
+   "GL_OPERAND0_RGB_ARB\0"
+   "GL_OPERAND0_RGB_EXT\0"
+   "GL_OPERAND1_ALPHA\0"
+   "GL_OPERAND1_ALPHA_ARB\0"
+   "GL_OPERAND1_ALPHA_EXT\0"
+   "GL_OPERAND1_RGB\0"
+   "GL_OPERAND1_RGB_ARB\0"
+   "GL_OPERAND1_RGB_EXT\0"
+   "GL_OPERAND2_ALPHA\0"
+   "GL_OPERAND2_ALPHA_ARB\0"
+   "GL_OPERAND2_ALPHA_EXT\0"
+   "GL_OPERAND2_RGB\0"
+   "GL_OPERAND2_RGB_ARB\0"
+   "GL_OPERAND2_RGB_EXT\0"
+   "GL_OPERAND3_ALPHA_NV\0"
+   "GL_OPERAND3_RGB_NV\0"
+   "GL_OR\0"
+   "GL_ORDER\0"
+   "GL_OR_INVERTED\0"
+   "GL_OR_REVERSE\0"
+   "GL_OUT_OF_MEMORY\0"
+   "GL_PACK_ALIGNMENT\0"
+   "GL_PACK_IMAGE_HEIGHT\0"
+   "GL_PACK_INVERT_MESA\0"
+   "GL_PACK_LSB_FIRST\0"
+   "GL_PACK_ROW_LENGTH\0"
+   "GL_PACK_SKIP_IMAGES\0"
+   "GL_PACK_SKIP_PIXELS\0"
+   "GL_PACK_SKIP_ROWS\0"
+   "GL_PACK_SWAP_BYTES\0"
+   "GL_PALETTE4_R5_G6_B5_OES\0"
+   "GL_PALETTE4_RGB5_A1_OES\0"
+   "GL_PALETTE4_RGB8_OES\0"
+   "GL_PALETTE4_RGBA4_OES\0"
+   "GL_PALETTE4_RGBA8_OES\0"
+   "GL_PALETTE8_R5_G6_B5_OES\0"
+   "GL_PALETTE8_RGB5_A1_OES\0"
+   "GL_PALETTE8_RGB8_OES\0"
+   "GL_PALETTE8_RGBA4_OES\0"
+   "GL_PALETTE8_RGBA8_OES\0"
+   "GL_PASS_THROUGH_TOKEN\0"
+   "GL_PERSPECTIVE_CORRECTION_HINT\0"
+   "GL_PIXEL_MAP_A_TO_A\0"
+   "GL_PIXEL_MAP_A_TO_A_SIZE\0"
+   "GL_PIXEL_MAP_B_TO_B\0"
+   "GL_PIXEL_MAP_B_TO_B_SIZE\0"
+   "GL_PIXEL_MAP_G_TO_G\0"
+   "GL_PIXEL_MAP_G_TO_G_SIZE\0"
+   "GL_PIXEL_MAP_I_TO_A\0"
+   "GL_PIXEL_MAP_I_TO_A_SIZE\0"
+   "GL_PIXEL_MAP_I_TO_B\0"
+   "GL_PIXEL_MAP_I_TO_B_SIZE\0"
+   "GL_PIXEL_MAP_I_TO_G\0"
+   "GL_PIXEL_MAP_I_TO_G_SIZE\0"
+   "GL_PIXEL_MAP_I_TO_I\0"
+   "GL_PIXEL_MAP_I_TO_I_SIZE\0"
+   "GL_PIXEL_MAP_I_TO_R\0"
+   "GL_PIXEL_MAP_I_TO_R_SIZE\0"
+   "GL_PIXEL_MAP_R_TO_R\0"
+   "GL_PIXEL_MAP_R_TO_R_SIZE\0"
+   "GL_PIXEL_MAP_S_TO_S\0"
+   "GL_PIXEL_MAP_S_TO_S_SIZE\0"
+   "GL_PIXEL_MODE_BIT\0"
+   "GL_PIXEL_PACK_BUFFER\0"
+   "GL_PIXEL_PACK_BUFFER_BINDING\0"
+   "GL_PIXEL_PACK_BUFFER_BINDING_EXT\0"
+   "GL_PIXEL_PACK_BUFFER_EXT\0"
+   "GL_PIXEL_UNPACK_BUFFER\0"
+   "GL_PIXEL_UNPACK_BUFFER_BINDING\0"
+   "GL_PIXEL_UNPACK_BUFFER_BINDING_EXT\0"
+   "GL_PIXEL_UNPACK_BUFFER_EXT\0"
+   "GL_POINT\0"
+   "GL_POINTS\0"
+   "GL_POINT_BIT\0"
+   "GL_POINT_DISTANCE_ATTENUATION\0"
+   "GL_POINT_DISTANCE_ATTENUATION_ARB\0"
+   "GL_POINT_DISTANCE_ATTENUATION_EXT\0"
+   "GL_POINT_DISTANCE_ATTENUATION_SGIS\0"
+   "GL_POINT_FADE_THRESHOLD_SIZE\0"
+   "GL_POINT_FADE_THRESHOLD_SIZE_ARB\0"
+   "GL_POINT_FADE_THRESHOLD_SIZE_EXT\0"
+   "GL_POINT_FADE_THRESHOLD_SIZE_SGIS\0"
+   "GL_POINT_SIZE\0"
+   "GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES\0"
+   "GL_POINT_SIZE_ARRAY_OES\0"
+   "GL_POINT_SIZE_ARRAY_POINTER_OES\0"
+   "GL_POINT_SIZE_ARRAY_STRIDE_OES\0"
+   "GL_POINT_SIZE_ARRAY_TYPE_OES\0"
+   "GL_POINT_SIZE_GRANULARITY\0"
+   "GL_POINT_SIZE_MAX\0"
+   "GL_POINT_SIZE_MAX_ARB\0"
+   "GL_POINT_SIZE_MAX_EXT\0"
+   "GL_POINT_SIZE_MAX_SGIS\0"
+   "GL_POINT_SIZE_MIN\0"
+   "GL_POINT_SIZE_MIN_ARB\0"
+   "GL_POINT_SIZE_MIN_EXT\0"
+   "GL_POINT_SIZE_MIN_SGIS\0"
+   "GL_POINT_SIZE_RANGE\0"
+   "GL_POINT_SMOOTH\0"
+   "GL_POINT_SMOOTH_HINT\0"
+   "GL_POINT_SPRITE\0"
+   "GL_POINT_SPRITE_ARB\0"
+   "GL_POINT_SPRITE_COORD_ORIGIN\0"
+   "GL_POINT_SPRITE_NV\0"
+   "GL_POINT_SPRITE_OES\0"
+   "GL_POINT_SPRITE_R_MODE_NV\0"
+   "GL_POINT_TOKEN\0"
+   "GL_POLYGON\0"
+   "GL_POLYGON_BIT\0"
+   "GL_POLYGON_MODE\0"
+   "GL_POLYGON_OFFSET_BIAS\0"
+   "GL_POLYGON_OFFSET_FACTOR\0"
+   "GL_POLYGON_OFFSET_FILL\0"
+   "GL_POLYGON_OFFSET_LINE\0"
+   "GL_POLYGON_OFFSET_POINT\0"
+   "GL_POLYGON_OFFSET_UNITS\0"
+   "GL_POLYGON_SMOOTH\0"
+   "GL_POLYGON_SMOOTH_HINT\0"
+   "GL_POLYGON_STIPPLE\0"
+   "GL_POLYGON_STIPPLE_BIT\0"
+   "GL_POLYGON_TOKEN\0"
+   "GL_POSITION\0"
+   "GL_POST_COLOR_MATRIX_ALPHA_BIAS\0"
+   "GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI\0"
+   "GL_POST_COLOR_MATRIX_ALPHA_SCALE\0"
+   "GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI\0"
+   "GL_POST_COLOR_MATRIX_BLUE_BIAS\0"
+   "GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI\0"
+   "GL_POST_COLOR_MATRIX_BLUE_SCALE\0"
+   "GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI\0"
+   "GL_POST_COLOR_MATRIX_COLOR_TABLE\0"
+   "GL_POST_COLOR_MATRIX_GREEN_BIAS\0"
+   "GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI\0"
+   "GL_POST_COLOR_MATRIX_GREEN_SCALE\0"
+   "GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI\0"
+   "GL_POST_COLOR_MATRIX_RED_BIAS\0"
+   "GL_POST_COLOR_MATRIX_RED_BIAS_SGI\0"
+   "GL_POST_COLOR_MATRIX_RED_SCALE\0"
+   "GL_POST_COLOR_MATRIX_RED_SCALE_SGI\0"
+   "GL_POST_CONVOLUTION_ALPHA_BIAS\0"
+   "GL_POST_CONVOLUTION_ALPHA_BIAS_EXT\0"
+   "GL_POST_CONVOLUTION_ALPHA_SCALE\0"
+   "GL_POST_CONVOLUTION_ALPHA_SCALE_EXT\0"
+   "GL_POST_CONVOLUTION_BLUE_BIAS\0"
+   "GL_POST_CONVOLUTION_BLUE_BIAS_EXT\0"
+   "GL_POST_CONVOLUTION_BLUE_SCALE\0"
+   "GL_POST_CONVOLUTION_BLUE_SCALE_EXT\0"
+   "GL_POST_CONVOLUTION_COLOR_TABLE\0"
+   "GL_POST_CONVOLUTION_GREEN_BIAS\0"
+   "GL_POST_CONVOLUTION_GREEN_BIAS_EXT\0"
+   "GL_POST_CONVOLUTION_GREEN_SCALE\0"
+   "GL_POST_CONVOLUTION_GREEN_SCALE_EXT\0"
+   "GL_POST_CONVOLUTION_RED_BIAS\0"
+   "GL_POST_CONVOLUTION_RED_BIAS_EXT\0"
+   "GL_POST_CONVOLUTION_RED_SCALE\0"
+   "GL_POST_CONVOLUTION_RED_SCALE_EXT\0"
+   "GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX\0"
+   "GL_POST_TEXTURE_FILTER_BIAS_SGIX\0"
+   "GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX\0"
+   "GL_POST_TEXTURE_FILTER_SCALE_SGIX\0"
+   "GL_PREVIOUS\0"
+   "GL_PREVIOUS_ARB\0"
+   "GL_PREVIOUS_EXT\0"
+   "GL_PRIMARY_COLOR\0"
+   "GL_PRIMARY_COLOR_ARB\0"
+   "GL_PRIMARY_COLOR_EXT\0"
+   "GL_PRIMITIVES_GENERATED\0"
+   "GL_PRIMITIVES_GENERATED_EXT\0"
+   "GL_PRIMITIVE_RESTART\0"
+   "GL_PRIMITIVE_RESTART_INDEX\0"
+   "GL_PRIMITIVE_RESTART_INDEX_NV\0"
+   "GL_PRIMITIVE_RESTART_NV\0"
+   "GL_PROGRAM_ADDRESS_REGISTERS_ARB\0"
+   "GL_PROGRAM_ALU_INSTRUCTIONS_ARB\0"
+   "GL_PROGRAM_ATTRIBS_ARB\0"
+   "GL_PROGRAM_BINARY_FORMATS_OES\0"
+   "GL_PROGRAM_BINARY_LENGTH_OES\0"
+   "GL_PROGRAM_BINDING_ARB\0"
+   "GL_PROGRAM_ERROR_POSITION_ARB\0"
+   "GL_PROGRAM_ERROR_POSITION_NV\0"
+   "GL_PROGRAM_ERROR_STRING_ARB\0"
+   "GL_PROGRAM_FORMAT_ARB\0"
+   "GL_PROGRAM_FORMAT_ASCII_ARB\0"
+   "GL_PROGRAM_INSTRUCTIONS_ARB\0"
+   "GL_PROGRAM_LENGTH_ARB\0"
+   "GL_PROGRAM_LENGTH_NV\0"
+   "GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB\0"
+   "GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB\0"
+   "GL_PROGRAM_NATIVE_ATTRIBS_ARB\0"
+   "GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB\0"
+   "GL_PROGRAM_NATIVE_PARAMETERS_ARB\0"
+   "GL_PROGRAM_NATIVE_TEMPORARIES_ARB\0"
+   "GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB\0"
+   "GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB\0"
+   "GL_PROGRAM_OBJECT_ARB\0"
+   "GL_PROGRAM_PARAMETERS_ARB\0"
+   "GL_PROGRAM_PARAMETER_NV\0"
+   "GL_PROGRAM_POINT_SIZE\0"
+   "GL_PROGRAM_POINT_SIZE_ARB\0"
+   "GL_PROGRAM_RESIDENT_NV\0"
+   "GL_PROGRAM_STRING_ARB\0"
+   "GL_PROGRAM_STRING_NV\0"
+   "GL_PROGRAM_TARGET_NV\0"
+   "GL_PROGRAM_TEMPORARIES_ARB\0"
+   "GL_PROGRAM_TEX_INDIRECTIONS_ARB\0"
+   "GL_PROGRAM_TEX_INSTRUCTIONS_ARB\0"
+   "GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB\0"
+   "GL_PROJECTION\0"
+   "GL_PROJECTION_MATRIX\0"
+   "GL_PROJECTION_MATRIX_FLOAT_AS_INT_BITS_OES\0"
+   "GL_PROJECTION_STACK_DEPTH\0"
+   "GL_PROVOKING_VERTEX\0"
+   "GL_PROVOKING_VERTEX_EXT\0"
+   "GL_PROXY_COLOR_TABLE\0"
+   "GL_PROXY_HISTOGRAM\0"
+   "GL_PROXY_HISTOGRAM_EXT\0"
+   "GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE\0"
+   "GL_PROXY_POST_CONVOLUTION_COLOR_TABLE\0"
+   "GL_PROXY_TEXTURE_1D\0"
+   "GL_PROXY_TEXTURE_1D_ARRAY\0"
+   "GL_PROXY_TEXTURE_1D_ARRAY_EXT\0"
+   "GL_PROXY_TEXTURE_1D_EXT\0"
+   "GL_PROXY_TEXTURE_2D\0"
+   "GL_PROXY_TEXTURE_2D_ARRAY\0"
+   "GL_PROXY_TEXTURE_2D_ARRAY_EXT\0"
+   "GL_PROXY_TEXTURE_2D_EXT\0"
+   "GL_PROXY_TEXTURE_3D\0"
+   "GL_PROXY_TEXTURE_COLOR_TABLE_SGI\0"
+   "GL_PROXY_TEXTURE_CUBE_MAP\0"
+   "GL_PROXY_TEXTURE_CUBE_MAP_ARB\0"
+   "GL_PROXY_TEXTURE_RECTANGLE\0"
+   "GL_PROXY_TEXTURE_RECTANGLE_ARB\0"
+   "GL_PROXY_TEXTURE_RECTANGLE_NV\0"
+   "GL_PURGEABLE_APPLE\0"
+   "GL_Q\0"
+   "GL_QUADRATIC_ATTENUATION\0"
+   "GL_QUADS\0"
+   "GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION\0"
+   "GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT\0"
+   "GL_QUAD_MESH_SUN\0"
+   "GL_QUAD_STRIP\0"
+   "GL_QUERY_BY_REGION_NO_WAIT\0"
+   "GL_QUERY_BY_REGION_NO_WAIT_NV\0"
+   "GL_QUERY_BY_REGION_WAIT\0"
+   "GL_QUERY_BY_REGION_WAIT_NV\0"
+   "GL_QUERY_COUNTER_BITS\0"
+   "GL_QUERY_COUNTER_BITS_ARB\0"
+   "GL_QUERY_NO_WAIT\0"
+   "GL_QUERY_NO_WAIT_NV\0"
+   "GL_QUERY_RESULT\0"
+   "GL_QUERY_RESULT_ARB\0"
+   "GL_QUERY_RESULT_AVAILABLE\0"
+   "GL_QUERY_RESULT_AVAILABLE_ARB\0"
+   "GL_QUERY_WAIT\0"
+   "GL_QUERY_WAIT_NV\0"
+   "GL_R\0"
+   "GL_R11F_G11F_B10F\0"
+   "GL_R16_SNORM\0"
+   "GL_R3_G3_B2\0"
+   "GL_R8_SNORM\0"
+   "GL_RASTERIZER_DISCARD\0"
+   "GL_RASTERIZER_DISCARD_EXT\0"
+   "GL_RASTER_POSITION_UNCLIPPED_IBM\0"
+   "GL_READ_BUFFER\0"
+   "GL_READ_FRAMEBUFFER\0"
+   "GL_READ_FRAMEBUFFER_BINDING\0"
+   "GL_READ_FRAMEBUFFER_BINDING_EXT\0"
+   "GL_READ_FRAMEBUFFER_EXT\0"
+   "GL_READ_ONLY\0"
+   "GL_READ_ONLY_ARB\0"
+   "GL_READ_WRITE\0"
+   "GL_READ_WRITE_ARB\0"
+   "GL_RED\0"
+   "GL_REDUCE\0"
+   "GL_REDUCE_EXT\0"
+   "GL_RED_BIAS\0"
+   "GL_RED_BITS\0"
+   "GL_RED_INTEGER\0"
+   "GL_RED_INTEGER_EXT\0"
+   "GL_RED_SCALE\0"
+   "GL_RED_SNORM\0"
+   "GL_REFLECTION_MAP\0"
+   "GL_REFLECTION_MAP_ARB\0"
+   "GL_REFLECTION_MAP_NV\0"
+   "GL_REFLECTION_MAP_OES\0"
+   "GL_RELEASED_APPLE\0"
+   "GL_RENDER\0"
+   "GL_RENDERBUFFER\0"
+   "GL_RENDERBUFFER_ALPHA_SIZE\0"
+   "GL_RENDERBUFFER_ALPHA_SIZE_OES\0"
+   "GL_RENDERBUFFER_BINDING\0"
+   "GL_RENDERBUFFER_BINDING_EXT\0"
+   "GL_RENDERBUFFER_BINDING_OES\0"
+   "GL_RENDERBUFFER_BLUE_SIZE\0"
+   "GL_RENDERBUFFER_BLUE_SIZE_OES\0"
+   "GL_RENDERBUFFER_DEPTH_SIZE\0"
+   "GL_RENDERBUFFER_DEPTH_SIZE_OES\0"
+   "GL_RENDERBUFFER_EXT\0"
+   "GL_RENDERBUFFER_GREEN_SIZE\0"
+   "GL_RENDERBUFFER_GREEN_SIZE_OES\0"
+   "GL_RENDERBUFFER_HEIGHT\0"
+   "GL_RENDERBUFFER_HEIGHT_EXT\0"
+   "GL_RENDERBUFFER_HEIGHT_OES\0"
+   "GL_RENDERBUFFER_INTERNAL_FORMAT\0"
+   "GL_RENDERBUFFER_INTERNAL_FORMAT_EXT\0"
+   "GL_RENDERBUFFER_INTERNAL_FORMAT_OES\0"
+   "GL_RENDERBUFFER_OES\0"
+   "GL_RENDERBUFFER_RED_SIZE\0"
+   "GL_RENDERBUFFER_RED_SIZE_OES\0"
+   "GL_RENDERBUFFER_SAMPLES\0"
+   "GL_RENDERBUFFER_SAMPLES_EXT\0"
+   "GL_RENDERBUFFER_STENCIL_SIZE\0"
+   "GL_RENDERBUFFER_STENCIL_SIZE_OES\0"
+   "GL_RENDERBUFFER_WIDTH\0"
+   "GL_RENDERBUFFER_WIDTH_EXT\0"
+   "GL_RENDERBUFFER_WIDTH_OES\0"
+   "GL_RENDERER\0"
+   "GL_RENDER_MODE\0"
+   "GL_REPEAT\0"
+   "GL_REPLACE\0"
+   "GL_REPLACE_EXT\0"
+   "GL_REPLICATE_BORDER_HP\0"
+   "GL_RESCALE_NORMAL\0"
+   "GL_RESCALE_NORMAL_EXT\0"
+   "GL_RETAINED_APPLE\0"
+   "GL_RETURN\0"
+   "GL_RG16_SNORM\0"
+   "GL_RG8_SNORM\0"
+   "GL_RGB\0"
+   "GL_RGB10\0"
+   "GL_RGB10_A2\0"
+   "GL_RGB10_A2_EXT\0"
+   "GL_RGB10_EXT\0"
+   "GL_RGB12\0"
+   "GL_RGB12_EXT\0"
+   "GL_RGB16\0"
+   "GL_RGB16F\0"
+   "GL_RGB16I\0"
+   "GL_RGB16I_EXT\0"
+   "GL_RGB16UI\0"
+   "GL_RGB16UI_EXT\0"
+   "GL_RGB16_EXT\0"
+   "GL_RGB16_SNORM\0"
+   "GL_RGB2_EXT\0"
+   "GL_RGB32F\0"
+   "GL_RGB32I\0"
+   "GL_RGB32I_EXT\0"
+   "GL_RGB32UI\0"
+   "GL_RGB32UI_EXT\0"
+   "GL_RGB4\0"
+   "GL_RGB4_EXT\0"
+   "GL_RGB4_S3TC\0"
+   "GL_RGB5\0"
+   "GL_RGB565\0"
+   "GL_RGB565_OES\0"
+   "GL_RGB5_A1\0"
+   "GL_RGB5_A1_EXT\0"
+   "GL_RGB5_A1_OES\0"
+   "GL_RGB5_EXT\0"
+   "GL_RGB8\0"
+   "GL_RGB8I\0"
+   "GL_RGB8I_EXT\0"
+   "GL_RGB8UI\0"
+   "GL_RGB8UI_EXT\0"
+   "GL_RGB8_EXT\0"
+   "GL_RGB8_OES\0"
+   "GL_RGB8_SNORM\0"
+   "GL_RGB9_E5\0"
+   "GL_RGBA\0"
+   "GL_RGBA12\0"
+   "GL_RGBA12_EXT\0"
+   "GL_RGBA16\0"
+   "GL_RGBA16F\0"
+   "GL_RGBA16I\0"
+   "GL_RGBA16I_EXT\0"
+   "GL_RGBA16UI\0"
+   "GL_RGBA16UI_EXT\0"
+   "GL_RGBA16_EXT\0"
+   "GL_RGBA16_SNORM\0"
+   "GL_RGBA2\0"
+   "GL_RGBA2_EXT\0"
+   "GL_RGBA32F\0"
+   "GL_RGBA32I\0"
+   "GL_RGBA32I_EXT\0"
+   "GL_RGBA32UI\0"
+   "GL_RGBA32UI_EXT\0"
+   "GL_RGBA4\0"
+   "GL_RGBA4_DXT5_S3TC\0"
+   "GL_RGBA4_EXT\0"
+   "GL_RGBA4_OES\0"
+   "GL_RGBA4_S3TC\0"
+   "GL_RGBA8\0"
+   "GL_RGBA8I\0"
+   "GL_RGBA8I_EXT\0"
+   "GL_RGBA8UI\0"
+   "GL_RGBA8UI_EXT\0"
+   "GL_RGBA8_EXT\0"
+   "GL_RGBA8_OES\0"
+   "GL_RGBA8_SNORM\0"
+   "GL_RGBA_DXT5_S3TC\0"
+   "GL_RGBA_FLOAT_MODE_ARB\0"
+   "GL_RGBA_INTEGER\0"
+   "GL_RGBA_INTEGER_EXT\0"
+   "GL_RGBA_INTEGER_MODE_EXT\0"
+   "GL_RGBA_MODE\0"
+   "GL_RGBA_S3TC\0"
+   "GL_RGBA_SNORM\0"
+   "GL_RGB_INTEGER\0"
+   "GL_RGB_INTEGER_EXT\0"
+   "GL_RGB_S3TC\0"
+   "GL_RGB_SCALE\0"
+   "GL_RGB_SCALE_ARB\0"
+   "GL_RGB_SCALE_EXT\0"
+   "GL_RGB_SNORM\0"
+   "GL_RG_SNORM\0"
+   "GL_RIGHT\0"
+   "GL_S\0"
+   "GL_SAMPLER_1D\0"
+   "GL_SAMPLER_1D_ARRAY\0"
+   "GL_SAMPLER_1D_ARRAY_EXT\0"
+   "GL_SAMPLER_1D_ARRAY_SHADOW\0"
+   "GL_SAMPLER_1D_ARRAY_SHADOW_EXT\0"
+   "GL_SAMPLER_1D_SHADOW\0"
+   "GL_SAMPLER_2D\0"
+   "GL_SAMPLER_2D_ARRAY\0"
+   "GL_SAMPLER_2D_ARRAY_EXT\0"
+   "GL_SAMPLER_2D_ARRAY_SHADOW\0"
+   "GL_SAMPLER_2D_ARRAY_SHADOW_EXT\0"
+   "GL_SAMPLER_2D_RECT\0"
+   "GL_SAMPLER_2D_RECT_SHADOW\0"
+   "GL_SAMPLER_2D_SHADOW\0"
+   "GL_SAMPLER_3D\0"
+   "GL_SAMPLER_3D_OES\0"
+   "GL_SAMPLER_BUFFER\0"
+   "GL_SAMPLER_BUFFER_EXT\0"
+   "GL_SAMPLER_CUBE\0"
+   "GL_SAMPLER_CUBE_SHADOW\0"
+   "GL_SAMPLER_CUBE_SHADOW_EXT\0"
+   "GL_SAMPLES\0"
+   "GL_SAMPLES_3DFX\0"
+   "GL_SAMPLES_ARB\0"
+   "GL_SAMPLES_PASSED\0"
+   "GL_SAMPLES_PASSED_ARB\0"
+   "GL_SAMPLE_ALPHA_TO_COVERAGE\0"
+   "GL_SAMPLE_ALPHA_TO_COVERAGE_ARB\0"
+   "GL_SAMPLE_ALPHA_TO_ONE\0"
+   "GL_SAMPLE_ALPHA_TO_ONE_ARB\0"
+   "GL_SAMPLE_BUFFERS\0"
+   "GL_SAMPLE_BUFFERS_3DFX\0"
+   "GL_SAMPLE_BUFFERS_ARB\0"
+   "GL_SAMPLE_COVERAGE\0"
+   "GL_SAMPLE_COVERAGE_ARB\0"
+   "GL_SAMPLE_COVERAGE_INVERT\0"
+   "GL_SAMPLE_COVERAGE_INVERT_ARB\0"
+   "GL_SAMPLE_COVERAGE_VALUE\0"
+   "GL_SAMPLE_COVERAGE_VALUE_ARB\0"
+   "GL_SCISSOR_BIT\0"
+   "GL_SCISSOR_BOX\0"
+   "GL_SCISSOR_TEST\0"
+   "GL_SECONDARY_COLOR_ARRAY\0"
+   "GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING\0"
+   "GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB\0"
+   "GL_SECONDARY_COLOR_ARRAY_POINTER\0"
+   "GL_SECONDARY_COLOR_ARRAY_SIZE\0"
+   "GL_SECONDARY_COLOR_ARRAY_STRIDE\0"
+   "GL_SECONDARY_COLOR_ARRAY_TYPE\0"
+   "GL_SELECT\0"
+   "GL_SELECTION_BUFFER_POINTER\0"
+   "GL_SELECTION_BUFFER_SIZE\0"
+   "GL_SEPARABLE_2D\0"
+   "GL_SEPARATE_ATTRIBS\0"
+   "GL_SEPARATE_ATTRIBS_EXT\0"
+   "GL_SEPARATE_SPECULAR_COLOR\0"
+   "GL_SEPARATE_SPECULAR_COLOR_EXT\0"
+   "GL_SET\0"
+   "GL_SHADER_BINARY_FORMATS\0"
+   "GL_SHADER_COMPILER\0"
+   "GL_SHADER_OBJECT_ARB\0"
+   "GL_SHADER_SOURCE_LENGTH\0"
+   "GL_SHADER_TYPE\0"
+   "GL_SHADE_MODEL\0"
+   "GL_SHADING_LANGUAGE_VERSION\0"
+   "GL_SHADOW_AMBIENT_SGIX\0"
+   "GL_SHARED_TEXTURE_PALETTE_EXT\0"
+   "GL_SHININESS\0"
+   "GL_SHORT\0"
+   "GL_SIGNALED\0"
+   "GL_SIGNED_NORMALIZED\0"
+   "GL_SINGLE_COLOR\0"
+   "GL_SINGLE_COLOR_EXT\0"
+   "GL_SLICE_ACCUM_SUN\0"
+   "GL_SLUMINANCE\0"
+   "GL_SLUMINANCE8\0"
+   "GL_SLUMINANCE8_ALPHA8\0"
+   "GL_SLUMINANCE_ALPHA\0"
+   "GL_SMOOTH\0"
+   "GL_SMOOTH_LINE_WIDTH_GRANULARITY\0"
+   "GL_SMOOTH_LINE_WIDTH_RANGE\0"
+   "GL_SMOOTH_POINT_SIZE_GRANULARITY\0"
+   "GL_SMOOTH_POINT_SIZE_RANGE\0"
+   "GL_SOURCE0_ALPHA\0"
+   "GL_SOURCE0_ALPHA_ARB\0"
+   "GL_SOURCE0_ALPHA_EXT\0"
+   "GL_SOURCE0_RGB\0"
+   "GL_SOURCE0_RGB_ARB\0"
+   "GL_SOURCE0_RGB_EXT\0"
+   "GL_SOURCE1_ALPHA\0"
+   "GL_SOURCE1_ALPHA_ARB\0"
+   "GL_SOURCE1_ALPHA_EXT\0"
+   "GL_SOURCE1_RGB\0"
+   "GL_SOURCE1_RGB_ARB\0"
+   "GL_SOURCE1_RGB_EXT\0"
+   "GL_SOURCE2_ALPHA\0"
+   "GL_SOURCE2_ALPHA_ARB\0"
+   "GL_SOURCE2_ALPHA_EXT\0"
+   "GL_SOURCE2_RGB\0"
+   "GL_SOURCE2_RGB_ARB\0"
+   "GL_SOURCE2_RGB_EXT\0"
+   "GL_SOURCE3_ALPHA_NV\0"
+   "GL_SOURCE3_RGB_NV\0"
+   "GL_SPECULAR\0"
+   "GL_SPHERE_MAP\0"
+   "GL_SPOT_CUTOFF\0"
+   "GL_SPOT_DIRECTION\0"
+   "GL_SPOT_EXPONENT\0"
+   "GL_SRC0_ALPHA\0"
+   "GL_SRC0_RGB\0"
+   "GL_SRC1_ALPHA\0"
+   "GL_SRC1_RGB\0"
+   "GL_SRC2_ALPHA\0"
+   "GL_SRC2_RGB\0"
+   "GL_SRC_ALPHA\0"
+   "GL_SRC_ALPHA_SATURATE\0"
+   "GL_SRC_COLOR\0"
+   "GL_SRGB\0"
+   "GL_SRGB8\0"
+   "GL_SRGB8_ALPHA8\0"
+   "GL_SRGB_ALPHA\0"
+   "GL_STACK_OVERFLOW\0"
+   "GL_STACK_UNDERFLOW\0"
+   "GL_STATIC_COPY\0"
+   "GL_STATIC_COPY_ARB\0"
+   "GL_STATIC_DRAW\0"
+   "GL_STATIC_DRAW_ARB\0"
+   "GL_STATIC_READ\0"
+   "GL_STATIC_READ_ARB\0"
+   "GL_STENCIL\0"
+   "GL_STENCIL_ATTACHMENT\0"
+   "GL_STENCIL_ATTACHMENT_EXT\0"
+   "GL_STENCIL_ATTACHMENT_OES\0"
+   "GL_STENCIL_BACK_FAIL\0"
+   "GL_STENCIL_BACK_FAIL_ATI\0"
+   "GL_STENCIL_BACK_FUNC\0"
+   "GL_STENCIL_BACK_FUNC_ATI\0"
+   "GL_STENCIL_BACK_PASS_DEPTH_FAIL\0"
+   "GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI\0"
+   "GL_STENCIL_BACK_PASS_DEPTH_PASS\0"
+   "GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI\0"
+   "GL_STENCIL_BACK_REF\0"
+   "GL_STENCIL_BACK_VALUE_MASK\0"
+   "GL_STENCIL_BACK_WRITEMASK\0"
+   "GL_STENCIL_BITS\0"
+   "GL_STENCIL_BUFFER\0"
+   "GL_STENCIL_BUFFER_BIT\0"
+   "GL_STENCIL_CLEAR_VALUE\0"
+   "GL_STENCIL_FAIL\0"
+   "GL_STENCIL_FUNC\0"
+   "GL_STENCIL_INDEX\0"
+   "GL_STENCIL_INDEX1\0"
+   "GL_STENCIL_INDEX16\0"
+   "GL_STENCIL_INDEX16_EXT\0"
+   "GL_STENCIL_INDEX1_EXT\0"
+   "GL_STENCIL_INDEX1_OES\0"
+   "GL_STENCIL_INDEX4\0"
+   "GL_STENCIL_INDEX4_EXT\0"
+   "GL_STENCIL_INDEX4_OES\0"
+   "GL_STENCIL_INDEX8\0"
+   "GL_STENCIL_INDEX8_EXT\0"
+   "GL_STENCIL_INDEX8_OES\0"
+   "GL_STENCIL_INDEX_EXT\0"
+   "GL_STENCIL_PASS_DEPTH_FAIL\0"
+   "GL_STENCIL_PASS_DEPTH_PASS\0"
+   "GL_STENCIL_REF\0"
+   "GL_STENCIL_TEST\0"
+   "GL_STENCIL_TEST_TWO_SIDE_EXT\0"
+   "GL_STENCIL_VALUE_MASK\0"
+   "GL_STENCIL_WRITEMASK\0"
+   "GL_STEREO\0"
+   "GL_STORAGE_CACHED_APPLE\0"
+   "GL_STORAGE_PRIVATE_APPLE\0"
+   "GL_STORAGE_SHARED_APPLE\0"
+   "GL_STREAM_COPY\0"
+   "GL_STREAM_COPY_ARB\0"
+   "GL_STREAM_DRAW\0"
+   "GL_STREAM_DRAW_ARB\0"
+   "GL_STREAM_READ\0"
+   "GL_STREAM_READ_ARB\0"
+   "GL_SUBPIXEL_BITS\0"
+   "GL_SUBTRACT\0"
+   "GL_SUBTRACT_ARB\0"
+   "GL_SYNC_CONDITION\0"
+   "GL_SYNC_FENCE\0"
+   "GL_SYNC_FLAGS\0"
+   "GL_SYNC_FLUSH_COMMANDS_BIT\0"
+   "GL_SYNC_GPU_COMMANDS_COMPLETE\0"
+   "GL_SYNC_STATUS\0"
+   "GL_T\0"
+   "GL_T2F_C3F_V3F\0"
+   "GL_T2F_C4F_N3F_V3F\0"
+   "GL_T2F_C4UB_V3F\0"
+   "GL_T2F_N3F_V3F\0"
+   "GL_T2F_V3F\0"
+   "GL_T4F_C4F_N3F_V4F\0"
+   "GL_T4F_V4F\0"
+   "GL_TABLE_TOO_LARGE_EXT\0"
+   "GL_TEXTURE\0"
+   "GL_TEXTURE0\0"
+   "GL_TEXTURE0_ARB\0"
+   "GL_TEXTURE1\0"
+   "GL_TEXTURE10\0"
+   "GL_TEXTURE10_ARB\0"
+   "GL_TEXTURE11\0"
+   "GL_TEXTURE11_ARB\0"
+   "GL_TEXTURE12\0"
+   "GL_TEXTURE12_ARB\0"
+   "GL_TEXTURE13\0"
+   "GL_TEXTURE13_ARB\0"
+   "GL_TEXTURE14\0"
+   "GL_TEXTURE14_ARB\0"
+   "GL_TEXTURE15\0"
+   "GL_TEXTURE15_ARB\0"
+   "GL_TEXTURE16\0"
+   "GL_TEXTURE16_ARB\0"
+   "GL_TEXTURE17\0"
+   "GL_TEXTURE17_ARB\0"
+   "GL_TEXTURE18\0"
+   "GL_TEXTURE18_ARB\0"
+   "GL_TEXTURE19\0"
+   "GL_TEXTURE19_ARB\0"
+   "GL_TEXTURE1_ARB\0"
+   "GL_TEXTURE2\0"
+   "GL_TEXTURE20\0"
+   "GL_TEXTURE20_ARB\0"
+   "GL_TEXTURE21\0"
+   "GL_TEXTURE21_ARB\0"
+   "GL_TEXTURE22\0"
+   "GL_TEXTURE22_ARB\0"
+   "GL_TEXTURE23\0"
+   "GL_TEXTURE23_ARB\0"
+   "GL_TEXTURE24\0"
+   "GL_TEXTURE24_ARB\0"
+   "GL_TEXTURE25\0"
+   "GL_TEXTURE25_ARB\0"
+   "GL_TEXTURE26\0"
+   "GL_TEXTURE26_ARB\0"
+   "GL_TEXTURE27\0"
+   "GL_TEXTURE27_ARB\0"
+   "GL_TEXTURE28\0"
+   "GL_TEXTURE28_ARB\0"
+   "GL_TEXTURE29\0"
+   "GL_TEXTURE29_ARB\0"
+   "GL_TEXTURE2_ARB\0"
+   "GL_TEXTURE3\0"
+   "GL_TEXTURE30\0"
+   "GL_TEXTURE30_ARB\0"
+   "GL_TEXTURE31\0"
+   "GL_TEXTURE31_ARB\0"
+   "GL_TEXTURE3_ARB\0"
+   "GL_TEXTURE4\0"
+   "GL_TEXTURE4_ARB\0"
+   "GL_TEXTURE5\0"
+   "GL_TEXTURE5_ARB\0"
+   "GL_TEXTURE6\0"
+   "GL_TEXTURE6_ARB\0"
+   "GL_TEXTURE7\0"
+   "GL_TEXTURE7_ARB\0"
+   "GL_TEXTURE8\0"
+   "GL_TEXTURE8_ARB\0"
+   "GL_TEXTURE9\0"
+   "GL_TEXTURE9_ARB\0"
+   "GL_TEXTURE_1D\0"
+   "GL_TEXTURE_1D_ARRAY\0"
+   "GL_TEXTURE_1D_ARRAY_EXT\0"
+   "GL_TEXTURE_2D\0"
+   "GL_TEXTURE_2D_ARRAY\0"
+   "GL_TEXTURE_2D_ARRAY_EXT\0"
+   "GL_TEXTURE_3D\0"
+   "GL_TEXTURE_3D_OES\0"
+   "GL_TEXTURE_ALPHA_SIZE\0"
+   "GL_TEXTURE_ALPHA_SIZE_EXT\0"
+   "GL_TEXTURE_BASE_LEVEL\0"
+   "GL_TEXTURE_BINDING_1D\0"
+   "GL_TEXTURE_BINDING_1D_ARRAY\0"
+   "GL_TEXTURE_BINDING_1D_ARRAY_EXT\0"
+   "GL_TEXTURE_BINDING_2D\0"
+   "GL_TEXTURE_BINDING_2D_ARRAY\0"
+   "GL_TEXTURE_BINDING_2D_ARRAY_EXT\0"
+   "GL_TEXTURE_BINDING_3D\0"
+   "GL_TEXTURE_BINDING_3D_OES\0"
+   "GL_TEXTURE_BINDING_BUFFER\0"
+   "GL_TEXTURE_BINDING_CUBE_MAP\0"
+   "GL_TEXTURE_BINDING_CUBE_MAP_ARB\0"
+   "GL_TEXTURE_BINDING_CUBE_MAP_OES\0"
+   "GL_TEXTURE_BINDING_RECTANGLE\0"
+   "GL_TEXTURE_BINDING_RECTANGLE_ARB\0"
+   "GL_TEXTURE_BINDING_RECTANGLE_NV\0"
+   "GL_TEXTURE_BIT\0"
+   "GL_TEXTURE_BLUE_SIZE\0"
+   "GL_TEXTURE_BLUE_SIZE_EXT\0"
+   "GL_TEXTURE_BORDER\0"
+   "GL_TEXTURE_BORDER_COLOR\0"
+   "GL_TEXTURE_BUFFER\0"
+   "GL_TEXTURE_BUFFER_DATA_STORE_BINDING\0"
+   "GL_TEXTURE_BUFFER_FORMAT\0"
+   "GL_TEXTURE_CLIPMAP_CENTER_SGIX\0"
+   "GL_TEXTURE_CLIPMAP_DEPTH_SGIX\0"
+   "GL_TEXTURE_CLIPMAP_FRAME_SGIX\0"
+   "GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX\0"
+   "GL_TEXTURE_CLIPMAP_OFFSET_SGIX\0"
+   "GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX\0"
+   "GL_TEXTURE_COLOR_TABLE_SGI\0"
+   "GL_TEXTURE_COLOR_WRITEMASK_SGIS\0"
+   "GL_TEXTURE_COMPARE_FAIL_VALUE_ARB\0"
+   "GL_TEXTURE_COMPARE_FUNC\0"
+   "GL_TEXTURE_COMPARE_FUNC_ARB\0"
+   "GL_TEXTURE_COMPARE_MODE\0"
+   "GL_TEXTURE_COMPARE_MODE_ARB\0"
+   "GL_TEXTURE_COMPARE_OPERATOR_SGIX\0"
+   "GL_TEXTURE_COMPARE_SGIX\0"
+   "GL_TEXTURE_COMPONENTS\0"
+   "GL_TEXTURE_COMPRESSED\0"
+   "GL_TEXTURE_COMPRESSED_ARB\0"
+   "GL_TEXTURE_COMPRESSED_FORMATS_ARB\0"
+   "GL_TEXTURE_COMPRESSED_IMAGE_SIZE\0"
+   "GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB\0"
+   "GL_TEXTURE_COMPRESSION_HINT\0"
+   "GL_TEXTURE_COMPRESSION_HINT_ARB\0"
+   "GL_TEXTURE_COORD_ARRAY\0"
+   "GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING\0"
+   "GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB\0"
+   "GL_TEXTURE_COORD_ARRAY_POINTER\0"
+   "GL_TEXTURE_COORD_ARRAY_SIZE\0"
+   "GL_TEXTURE_COORD_ARRAY_STRIDE\0"
+   "GL_TEXTURE_COORD_ARRAY_TYPE\0"
+   "GL_TEXTURE_CROP_RECT_OES\0"
+   "GL_TEXTURE_CUBE_MAP\0"
+   "GL_TEXTURE_CUBE_MAP_ARB\0"
+   "GL_TEXTURE_CUBE_MAP_NEGATIVE_X\0"
+   "GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB\0"
+   "GL_TEXTURE_CUBE_MAP_NEGATIVE_X_OES\0"
+   "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y\0"
+   "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB\0"
+   "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_OES\0"
+   "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z\0"
+   "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB\0"
+   "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_OES\0"
+   "GL_TEXTURE_CUBE_MAP_OES\0"
+   "GL_TEXTURE_CUBE_MAP_POSITIVE_X\0"
+   "GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB\0"
+   "GL_TEXTURE_CUBE_MAP_POSITIVE_X_OES\0"
+   "GL_TEXTURE_CUBE_MAP_POSITIVE_Y\0"
+   "GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB\0"
+   "GL_TEXTURE_CUBE_MAP_POSITIVE_Y_OES\0"
+   "GL_TEXTURE_CUBE_MAP_POSITIVE_Z\0"
+   "GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB\0"
+   "GL_TEXTURE_CUBE_MAP_POSITIVE_Z_OES\0"
+   "GL_TEXTURE_CUBE_MAP_SEAMLESS\0"
+   "GL_TEXTURE_DEPTH\0"
+   "GL_TEXTURE_DEPTH_SIZE\0"
+   "GL_TEXTURE_DEPTH_SIZE_ARB\0"
+   "GL_TEXTURE_ENV\0"
+   "GL_TEXTURE_ENV_COLOR\0"
+   "GL_TEXTURE_ENV_MODE\0"
+   "GL_TEXTURE_FILTER_CONTROL\0"
+   "GL_TEXTURE_FILTER_CONTROL_EXT\0"
+   "GL_TEXTURE_GEN_MODE\0"
+   "GL_TEXTURE_GEN_MODE_OES\0"
+   "GL_TEXTURE_GEN_Q\0"
+   "GL_TEXTURE_GEN_R\0"
+   "GL_TEXTURE_GEN_S\0"
+   "GL_TEXTURE_GEN_STR_OES\0"
+   "GL_TEXTURE_GEN_T\0"
+   "GL_TEXTURE_GEQUAL_R_SGIX\0"
+   "GL_TEXTURE_GREEN_SIZE\0"
+   "GL_TEXTURE_GREEN_SIZE_EXT\0"
+   "GL_TEXTURE_HEIGHT\0"
+   "GL_TEXTURE_INDEX_SIZE_EXT\0"
+   "GL_TEXTURE_INTENSITY_SIZE\0"
+   "GL_TEXTURE_INTENSITY_SIZE_EXT\0"
+   "GL_TEXTURE_INTERNAL_FORMAT\0"
+   "GL_TEXTURE_LEQUAL_R_SGIX\0"
+   "GL_TEXTURE_LOD_BIAS\0"
+   "GL_TEXTURE_LOD_BIAS_EXT\0"
+   "GL_TEXTURE_LOD_BIAS_R_SGIX\0"
+   "GL_TEXTURE_LOD_BIAS_S_SGIX\0"
+   "GL_TEXTURE_LOD_BIAS_T_SGIX\0"
+   "GL_TEXTURE_LUMINANCE_SIZE\0"
+   "GL_TEXTURE_LUMINANCE_SIZE_EXT\0"
+   "GL_TEXTURE_MAG_FILTER\0"
+   "GL_TEXTURE_MATRIX\0"
+   "GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES\0"
+   "GL_TEXTURE_MAX_ANISOTROPY_EXT\0"
+   "GL_TEXTURE_MAX_CLAMP_R_SGIX\0"
+   "GL_TEXTURE_MAX_CLAMP_S_SGIX\0"
+   "GL_TEXTURE_MAX_CLAMP_T_SGIX\0"
+   "GL_TEXTURE_MAX_LEVEL\0"
+   "GL_TEXTURE_MAX_LOD\0"
+   "GL_TEXTURE_MIN_FILTER\0"
+   "GL_TEXTURE_MIN_LOD\0"
+   "GL_TEXTURE_PRIORITY\0"
+   "GL_TEXTURE_RANGE_LENGTH_APPLE\0"
+   "GL_TEXTURE_RANGE_POINTER_APPLE\0"
+   "GL_TEXTURE_RECTANGLE\0"
+   "GL_TEXTURE_RECTANGLE_ARB\0"
+   "GL_TEXTURE_RECTANGLE_NV\0"
+   "GL_TEXTURE_RED_SIZE\0"
+   "GL_TEXTURE_RED_SIZE_EXT\0"
+   "GL_TEXTURE_RESIDENT\0"
+   "GL_TEXTURE_SHARED_SIZE\0"
+   "GL_TEXTURE_STACK_DEPTH\0"
+   "GL_TEXTURE_STENCIL_SIZE\0"
+   "GL_TEXTURE_STENCIL_SIZE_EXT\0"
+   "GL_TEXTURE_STORAGE_HINT_APPLE\0"
+   "GL_TEXTURE_TOO_LARGE_EXT\0"
+   "GL_TEXTURE_UNSIGNED_REMAP_MODE_NV\0"
+   "GL_TEXTURE_WIDTH\0"
+   "GL_TEXTURE_WRAP_R\0"
+   "GL_TEXTURE_WRAP_R_OES\0"
+   "GL_TEXTURE_WRAP_S\0"
+   "GL_TEXTURE_WRAP_T\0"
+   "GL_TIMEOUT_EXPIRED\0"
+   "GL_TIME_ELAPSED_EXT\0"
+   "GL_TRACK_MATRIX_NV\0"
+   "GL_TRACK_MATRIX_TRANSFORM_NV\0"
+   "GL_TRANSFORM_BIT\0"
+   "GL_TRANSFORM_FEEDBACK\0"
+   "GL_TRANSFORM_FEEDBACK_BINDING\0"
+   "GL_TRANSFORM_FEEDBACK_BUFFER\0"
+   "GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE\0"
+   "GL_TRANSFORM_FEEDBACK_BUFFER_BINDING\0"
+   "GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT\0"
+   "GL_TRANSFORM_FEEDBACK_BUFFER_EXT\0"
+   "GL_TRANSFORM_FEEDBACK_BUFFER_MODE\0"
+   "GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT\0"
+   "GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED\0"
+   "GL_TRANSFORM_FEEDBACK_BUFFER_SIZE\0"
+   "GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT\0"
+   "GL_TRANSFORM_FEEDBACK_BUFFER_START\0"
+   "GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT\0"
+   "GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN\0"
+   "GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT\0"
+   "GL_TRANSFORM_FEEDBACK_VARYINGS\0"
+   "GL_TRANSFORM_FEEDBACK_VARYINGS_EXT\0"
+   "GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH\0"
+   "GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT\0"
+   "GL_TRANSPOSE_COLOR_MATRIX\0"
+   "GL_TRANSPOSE_COLOR_MATRIX_ARB\0"
+   "GL_TRANSPOSE_CURRENT_MATRIX_ARB\0"
+   "GL_TRANSPOSE_MODELVIEW_MATRIX\0"
+   "GL_TRANSPOSE_MODELVIEW_MATRIX_ARB\0"
+   "GL_TRANSPOSE_NV\0"
+   "GL_TRANSPOSE_PROJECTION_MATRIX\0"
+   "GL_TRANSPOSE_PROJECTION_MATRIX_ARB\0"
+   "GL_TRANSPOSE_TEXTURE_MATRIX\0"
+   "GL_TRANSPOSE_TEXTURE_MATRIX_ARB\0"
+   "GL_TRIANGLES\0"
+   "GL_TRIANGLES_ADJACENCY\0"
+   "GL_TRIANGLES_ADJACENCY_ARB\0"
+   "GL_TRIANGLE_FAN\0"
+   "GL_TRIANGLE_MESH_SUN\0"
+   "GL_TRIANGLE_STRIP\0"
+   "GL_TRIANGLE_STRIP_ADJACENCY\0"
+   "GL_TRIANGLE_STRIP_ADJACENCY_ARB\0"
+   "GL_TRUE\0"
+   "GL_UNDEFINED_APPLE\0"
+   "GL_UNPACK_ALIGNMENT\0"
+   "GL_UNPACK_IMAGE_HEIGHT\0"
+   "GL_UNPACK_LSB_FIRST\0"
+   "GL_UNPACK_ROW_LENGTH\0"
+   "GL_UNPACK_SKIP_IMAGES\0"
+   "GL_UNPACK_SKIP_PIXELS\0"
+   "GL_UNPACK_SKIP_ROWS\0"
+   "GL_UNPACK_SWAP_BYTES\0"
+   "GL_UNSIGNALED\0"
+   "GL_UNSIGNED_BYTE\0"
+   "GL_UNSIGNED_BYTE_2_3_3_REV\0"
+   "GL_UNSIGNED_BYTE_3_3_2\0"
+   "GL_UNSIGNED_INT\0"
+   "GL_UNSIGNED_INT_10F_11F_11F_REV\0"
+   "GL_UNSIGNED_INT_10_10_10_2\0"
+   "GL_UNSIGNED_INT_10_10_10_2_OES\0"
+   "GL_UNSIGNED_INT_24_8\0"
+   "GL_UNSIGNED_INT_24_8_EXT\0"
+   "GL_UNSIGNED_INT_24_8_NV\0"
+   "GL_UNSIGNED_INT_24_8_OES\0"
+   "GL_UNSIGNED_INT_2_10_10_10_REV\0"
+   "GL_UNSIGNED_INT_2_10_10_10_REV_EXT\0"
+   "GL_UNSIGNED_INT_5_9_9_9_REV\0"
+   "GL_UNSIGNED_INT_8_8_8_8\0"
+   "GL_UNSIGNED_INT_8_8_8_8_REV\0"
+   "GL_UNSIGNED_INT_SAMPLER_1D\0"
+   "GL_UNSIGNED_INT_SAMPLER_1D_ARRAY\0"
+   "GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT\0"
+   "GL_UNSIGNED_INT_SAMPLER_1D_EXT\0"
+   "GL_UNSIGNED_INT_SAMPLER_2D\0"
+   "GL_UNSIGNED_INT_SAMPLER_2D_ARRAY\0"
+   "GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT\0"
+   "GL_UNSIGNED_INT_SAMPLER_2D_EXT\0"
+   "GL_UNSIGNED_INT_SAMPLER_2D_RECT\0"
+   "GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT\0"
+   "GL_UNSIGNED_INT_SAMPLER_3D\0"
+   "GL_UNSIGNED_INT_SAMPLER_3D_EXT\0"
+   "GL_UNSIGNED_INT_SAMPLER_BUFFER\0"
+   "GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT\0"
+   "GL_UNSIGNED_INT_SAMPLER_CUBE\0"
+   "GL_UNSIGNED_INT_SAMPLER_CUBE_EXT\0"
+   "GL_UNSIGNED_INT_VEC2\0"
+   "GL_UNSIGNED_INT_VEC2_EXT\0"
+   "GL_UNSIGNED_INT_VEC3\0"
+   "GL_UNSIGNED_INT_VEC3_EXT\0"
+   "GL_UNSIGNED_INT_VEC4\0"
+   "GL_UNSIGNED_INT_VEC4_EXT\0"
+   "GL_UNSIGNED_NORMALIZED\0"
+   "GL_UNSIGNED_SHORT\0"
+   "GL_UNSIGNED_SHORT_1_5_5_5_REV\0"
+   "GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT\0"
+   "GL_UNSIGNED_SHORT_4_4_4_4\0"
+   "GL_UNSIGNED_SHORT_4_4_4_4_REV\0"
+   "GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT\0"
+   "GL_UNSIGNED_SHORT_5_5_5_1\0"
+   "GL_UNSIGNED_SHORT_5_6_5\0"
+   "GL_UNSIGNED_SHORT_5_6_5_REV\0"
+   "GL_UNSIGNED_SHORT_8_8_APPLE\0"
+   "GL_UNSIGNED_SHORT_8_8_MESA\0"
+   "GL_UNSIGNED_SHORT_8_8_REV_APPLE\0"
+   "GL_UNSIGNED_SHORT_8_8_REV_MESA\0"
+   "GL_UPPER_LEFT\0"
+   "GL_V2F\0"
+   "GL_V3F\0"
+   "GL_VALIDATE_STATUS\0"
+   "GL_VENDOR\0"
+   "GL_VERSION\0"
+   "GL_VERTEX_ARRAY\0"
+   "GL_VERTEX_ARRAY_BINDING\0"
+   "GL_VERTEX_ARRAY_BINDING_APPLE\0"
+   "GL_VERTEX_ARRAY_BUFFER_BINDING\0"
+   "GL_VERTEX_ARRAY_BUFFER_BINDING_ARB\0"
+   "GL_VERTEX_ARRAY_POINTER\0"
+   "GL_VERTEX_ARRAY_SIZE\0"
+   "GL_VERTEX_ARRAY_STRIDE\0"
+   "GL_VERTEX_ARRAY_TYPE\0"
+   "GL_VERTEX_ATTRIB_ARRAY0_NV\0"
+   "GL_VERTEX_ATTRIB_ARRAY10_NV\0"
+   "GL_VERTEX_ATTRIB_ARRAY11_NV\0"
+   "GL_VERTEX_ATTRIB_ARRAY12_NV\0"
+   "GL_VERTEX_ATTRIB_ARRAY13_NV\0"
+   "GL_VERTEX_ATTRIB_ARRAY14_NV\0"
+   "GL_VERTEX_ATTRIB_ARRAY15_NV\0"
+   "GL_VERTEX_ATTRIB_ARRAY1_NV\0"
+   "GL_VERTEX_ATTRIB_ARRAY2_NV\0"
+   "GL_VERTEX_ATTRIB_ARRAY3_NV\0"
+   "GL_VERTEX_ATTRIB_ARRAY4_NV\0"
+   "GL_VERTEX_ATTRIB_ARRAY5_NV\0"
+   "GL_VERTEX_ATTRIB_ARRAY6_NV\0"
+   "GL_VERTEX_ATTRIB_ARRAY7_NV\0"
+   "GL_VERTEX_ATTRIB_ARRAY8_NV\0"
+   "GL_VERTEX_ATTRIB_ARRAY9_NV\0"
+   "GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING\0"
+   "GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB\0"
+   "GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB\0"
+   "GL_VERTEX_ATTRIB_ARRAY_ENABLED\0"
+   "GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB\0"
+   "GL_VERTEX_ATTRIB_ARRAY_INTEGER\0"
+   "GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT\0"
+   "GL_VERTEX_ATTRIB_ARRAY_NORMALIZED\0"
+   "GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB\0"
+   "GL_VERTEX_ATTRIB_ARRAY_POINTER\0"
+   "GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB\0"
+   "GL_VERTEX_ATTRIB_ARRAY_SIZE\0"
+   "GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB\0"
+   "GL_VERTEX_ATTRIB_ARRAY_STRIDE\0"
+   "GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB\0"
+   "GL_VERTEX_ATTRIB_ARRAY_TYPE\0"
+   "GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB\0"
+   "GL_VERTEX_BLEND_ARB\0"
+   "GL_VERTEX_PROGRAM_ARB\0"
+   "GL_VERTEX_PROGRAM_BINDING_NV\0"
+   "GL_VERTEX_PROGRAM_NV\0"
+   "GL_VERTEX_PROGRAM_POINT_SIZE\0"
+   "GL_VERTEX_PROGRAM_POINT_SIZE_ARB\0"
+   "GL_VERTEX_PROGRAM_POINT_SIZE_NV\0"
+   "GL_VERTEX_PROGRAM_TWO_SIDE\0"
+   "GL_VERTEX_PROGRAM_TWO_SIDE_ARB\0"
+   "GL_VERTEX_PROGRAM_TWO_SIDE_NV\0"
+   "GL_VERTEX_SHADER\0"
+   "GL_VERTEX_SHADER_ARB\0"
+   "GL_VERTEX_STATE_PROGRAM_NV\0"
+   "GL_VIEWPORT\0"
+   "GL_VIEWPORT_BIT\0"
+   "GL_VOLATILE_APPLE\0"
+   "GL_WAIT_FAILED\0"
+   "GL_WEIGHT_ARRAY_ARB\0"
+   "GL_WEIGHT_ARRAY_BUFFER_BINDING\0"
+   "GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB\0"
+   "GL_WEIGHT_ARRAY_BUFFER_BINDING_OES\0"
+   "GL_WEIGHT_ARRAY_OES\0"
+   "GL_WEIGHT_ARRAY_POINTER_ARB\0"
+   "GL_WEIGHT_ARRAY_POINTER_OES\0"
+   "GL_WEIGHT_ARRAY_SIZE_ARB\0"
+   "GL_WEIGHT_ARRAY_SIZE_OES\0"
+   "GL_WEIGHT_ARRAY_STRIDE_ARB\0"
+   "GL_WEIGHT_ARRAY_STRIDE_OES\0"
+   "GL_WEIGHT_ARRAY_TYPE_ARB\0"
+   "GL_WEIGHT_ARRAY_TYPE_OES\0"
+   "GL_WEIGHT_SUM_UNITY_ARB\0"
+   "GL_WRAP_BORDER_SUN\0"
+   "GL_WRITE_ONLY\0"
+   "GL_WRITE_ONLY_ARB\0"
+   "GL_WRITE_ONLY_OES\0"
+   "GL_XOR\0"
+   "GL_YCBCR_422_APPLE\0"
+   "GL_YCBCR_MESA\0"
+   "GL_ZERO\0"
+   "GL_ZOOM_X\0"
+   "GL_ZOOM_Y\0"
+   ;
+
+static const enum_elt all_enums[2300] =
+{
+   {     0, 0x00000600 }, /* GL_2D */
+   {     6, 0x00001407 }, /* GL_2_BYTES */
+   {    17, 0x00000601 }, /* GL_3D */
+   {    23, 0x00000602 }, /* GL_3D_COLOR */
+   {    35, 0x00000603 }, /* GL_3D_COLOR_TEXTURE */
+   {    55, 0x00001408 }, /* GL_3_BYTES */
+   {    66, 0x00000604 }, /* GL_4D_COLOR_TEXTURE */
+   {    86, 0x00001409 }, /* GL_4_BYTES */
+   {    97, 0x00000100 }, /* GL_ACCUM */
+   {   106, 0x00000D5B }, /* GL_ACCUM_ALPHA_BITS */
+   {   126, 0x00000D5A }, /* GL_ACCUM_BLUE_BITS */
+   {   145, 0x00000200 }, /* GL_ACCUM_BUFFER_BIT */
+   {   165, 0x00000B80 }, /* GL_ACCUM_CLEAR_VALUE */
+   {   186, 0x00000D59 }, /* GL_ACCUM_GREEN_BITS */
+   {   206, 0x00000D58 }, /* GL_ACCUM_RED_BITS */
+   {   224, 0x00008B89 }, /* GL_ACTIVE_ATTRIBUTES */
+   {   245, 0x00008B8A }, /* GL_ACTIVE_ATTRIBUTE_MAX_LENGTH */
+   {   276, 0x00008B8D }, /* GL_ACTIVE_PROGRAM_EXT */
+   {   298, 0x00008911 }, /* GL_ACTIVE_STENCIL_FACE_EXT */
+   {   325, 0x000084E0 }, /* GL_ACTIVE_TEXTURE */
+   {   343, 0x000084E0 }, /* GL_ACTIVE_TEXTURE_ARB */
+   {   365, 0x00008B86 }, /* GL_ACTIVE_UNIFORMS */
+   {   384, 0x00008B87 }, /* GL_ACTIVE_UNIFORM_MAX_LENGTH */
+   {   413, 0x000086A5 }, /* GL_ACTIVE_VERTEX_UNITS_ARB */
+   {   440, 0x00000104 }, /* GL_ADD */
+   {   447, 0x00008574 }, /* GL_ADD_SIGNED */
+   {   461, 0x00008574 }, /* GL_ADD_SIGNED_ARB */
+   {   479, 0x00008574 }, /* GL_ADD_SIGNED_EXT */
+   {   497, 0x0000846E }, /* GL_ALIASED_LINE_WIDTH_RANGE */
+   {   525, 0x0000846D }, /* GL_ALIASED_POINT_SIZE_RANGE */
+   {   553, 0x000FFFFF }, /* GL_ALL_ATTRIB_BITS */
+   {   572, 0xFFFFFFFF }, /* GL_ALL_CLIENT_ATTRIB_BITS */
+   {   598, 0x00001906 }, /* GL_ALPHA */
+   {   607, 0x0000803D }, /* GL_ALPHA12 */
+   {   618, 0x0000803D }, /* GL_ALPHA12_EXT */
+   {   633, 0x0000803E }, /* GL_ALPHA16 */
+   {   644, 0x00008D8A }, /* GL_ALPHA16I_EXT */
+   {   660, 0x00008D78 }, /* GL_ALPHA16UI_EXT */
+   {   677, 0x0000803E }, /* GL_ALPHA16_EXT */
+   {   692, 0x00008D84 }, /* GL_ALPHA32I_EXT */
+   {   708, 0x00008D72 }, /* GL_ALPHA32UI_EXT */
+   {   725, 0x0000803B }, /* GL_ALPHA4 */
+   {   735, 0x0000803B }, /* GL_ALPHA4_EXT */
+   {   749, 0x0000803C }, /* GL_ALPHA8 */
+   {   759, 0x00008D90 }, /* GL_ALPHA8I_EXT */
+   {   774, 0x00008D7E }, /* GL_ALPHA8UI_EXT */
+   {   790, 0x0000803C }, /* GL_ALPHA8_EXT */
+   {   804, 0x00000D1D }, /* GL_ALPHA_BIAS */
+   {   818, 0x00000D55 }, /* GL_ALPHA_BITS */
+   {   832, 0x00008D97 }, /* GL_ALPHA_INTEGER_EXT */
+   {   853, 0x00000D1C }, /* GL_ALPHA_SCALE */
+   {   868, 0x00000BC0 }, /* GL_ALPHA_TEST */
+   {   882, 0x00000BC1 }, /* GL_ALPHA_TEST_FUNC */
+   {   901, 0x00000BC2 }, /* GL_ALPHA_TEST_REF */
+   {   919, 0x0000911A }, /* GL_ALREADY_SIGNALED */
+   {   939, 0x00000207 }, /* GL_ALWAYS */
+   {   949, 0x00001200 }, /* GL_AMBIENT */
+   {   960, 0x00001602 }, /* GL_AMBIENT_AND_DIFFUSE */
+   {   983, 0x00001501 }, /* GL_AND */
+   {   990, 0x00001504 }, /* GL_AND_INVERTED */
+   {  1006, 0x00001502 }, /* GL_AND_REVERSE */
+   {  1021, 0x00008892 }, /* GL_ARRAY_BUFFER */
+   {  1037, 0x00008894 }, /* GL_ARRAY_BUFFER_BINDING */
+   {  1061, 0x00008894 }, /* GL_ARRAY_BUFFER_BINDING_ARB */
+   {  1089, 0x00008B85 }, /* GL_ATTACHED_SHADERS */
+   {  1109, 0x00008645 }, /* GL_ATTRIB_ARRAY_POINTER_NV */
+   {  1136, 0x00008623 }, /* GL_ATTRIB_ARRAY_SIZE_NV */
+   {  1160, 0x00008624 }, /* GL_ATTRIB_ARRAY_STRIDE_NV */
+   {  1186, 0x00008625 }, /* GL_ATTRIB_ARRAY_TYPE_NV */
+   {  1210, 0x00000BB0 }, /* GL_ATTRIB_STACK_DEPTH */
+   {  1232, 0x00000D80 }, /* GL_AUTO_NORMAL */
+   {  1247, 0x00000409 }, /* GL_AUX0 */
+   {  1255, 0x0000040A }, /* GL_AUX1 */
+   {  1263, 0x0000040B }, /* GL_AUX2 */
+   {  1271, 0x0000040C }, /* GL_AUX3 */
+   {  1279, 0x00000C00 }, /* GL_AUX_BUFFERS */
+   {  1294, 0x00000405 }, /* GL_BACK */
+   {  1302, 0x00000402 }, /* GL_BACK_LEFT */
+   {  1315, 0x00000403 }, /* GL_BACK_RIGHT */
+   {  1329, 0x000080E0 }, /* GL_BGR */
+   {  1336, 0x000080E1 }, /* GL_BGRA */
+   {  1344, 0x000080E1 }, /* GL_BGRA_EXT */
+   {  1356, 0x00008D9B }, /* GL_BGRA_INTEGER */
+   {  1372, 0x00008D9B }, /* GL_BGRA_INTEGER_EXT */
+   {  1392, 0x00008D9A }, /* GL_BGR_INTEGER */
+   {  1407, 0x00008D9A }, /* GL_BGR_INTEGER_EXT */
+   {  1426, 0x00001A00 }, /* GL_BITMAP */
+   {  1436, 0x00000704 }, /* GL_BITMAP_TOKEN */
+   {  1452, 0x00000BE2 }, /* GL_BLEND */
+   {  1461, 0x00008005 }, /* GL_BLEND_COLOR */
+   {  1476, 0x00008005 }, /* GL_BLEND_COLOR_EXT */
+   {  1495, 0x00000BE0 }, /* GL_BLEND_DST */
+   {  1508, 0x000080CA }, /* GL_BLEND_DST_ALPHA */
+   {  1527, 0x000080CA }, /* GL_BLEND_DST_ALPHA_OES */
+   {  1550, 0x000080C8 }, /* GL_BLEND_DST_RGB */
+   {  1567, 0x000080C8 }, /* GL_BLEND_DST_RGB_OES */
+   {  1588, 0x00008009 }, /* GL_BLEND_EQUATION */
+   {  1606, 0x0000883D }, /* GL_BLEND_EQUATION_ALPHA */
+   {  1630, 0x0000883D }, /* GL_BLEND_EQUATION_ALPHA_EXT */
+   {  1658, 0x0000883D }, /* GL_BLEND_EQUATION_ALPHA_OES */
+   {  1686, 0x00008009 }, /* GL_BLEND_EQUATION_EXT */
+   {  1708, 0x00008009 }, /* GL_BLEND_EQUATION_OES */
+   {  1730, 0x00008009 }, /* GL_BLEND_EQUATION_RGB */
+   {  1752, 0x00008009 }, /* GL_BLEND_EQUATION_RGB_EXT */
+   {  1778, 0x00008009 }, /* GL_BLEND_EQUATION_RGB_OES */
+   {  1804, 0x00000BE1 }, /* GL_BLEND_SRC */
+   {  1817, 0x000080CB }, /* GL_BLEND_SRC_ALPHA */
+   {  1836, 0x000080CB }, /* GL_BLEND_SRC_ALPHA_OES */
+   {  1859, 0x000080C9 }, /* GL_BLEND_SRC_RGB */
+   {  1876, 0x000080C9 }, /* GL_BLEND_SRC_RGB_OES */
+   {  1897, 0x00001905 }, /* GL_BLUE */
+   {  1905, 0x00000D1B }, /* GL_BLUE_BIAS */
+   {  1918, 0x00000D54 }, /* GL_BLUE_BITS */
+   {  1931, 0x00008D96 }, /* GL_BLUE_INTEGER */
+   {  1947, 0x00008D96 }, /* GL_BLUE_INTEGER_EXT */
+   {  1967, 0x00000D1A }, /* GL_BLUE_SCALE */
+   {  1981, 0x00008B56 }, /* GL_BOOL */
+   {  1989, 0x00008B56 }, /* GL_BOOL_ARB */
+   {  2001, 0x00008B57 }, /* GL_BOOL_VEC2 */
+   {  2014, 0x00008B57 }, /* GL_BOOL_VEC2_ARB */
+   {  2031, 0x00008B58 }, /* GL_BOOL_VEC3 */
+   {  2044, 0x00008B58 }, /* GL_BOOL_VEC3_ARB */
+   {  2061, 0x00008B59 }, /* GL_BOOL_VEC4 */
+   {  2074, 0x00008B59 }, /* GL_BOOL_VEC4_ARB */
+   {  2091, 0x000088BB }, /* GL_BUFFER_ACCESS */
+   {  2108, 0x000088BB }, /* GL_BUFFER_ACCESS_ARB */
+   {  2129, 0x0000911F }, /* GL_BUFFER_ACCESS_FLAGS */
+   {  2152, 0x000088BB }, /* GL_BUFFER_ACCESS_OES */
+   {  2173, 0x00008A13 }, /* GL_BUFFER_FLUSHING_UNMAP_APPLE */
+   {  2204, 0x000088BC }, /* GL_BUFFER_MAPPED */
+   {  2221, 0x000088BC }, /* GL_BUFFER_MAPPED_ARB */
+   {  2242, 0x000088BC }, /* GL_BUFFER_MAPPED_OES */
+   {  2263, 0x00009120 }, /* GL_BUFFER_MAP_LENGTH */
+   {  2284, 0x00009121 }, /* GL_BUFFER_MAP_OFFSET */
+   {  2305, 0x000088BD }, /* GL_BUFFER_MAP_POINTER */
+   {  2327, 0x000088BD }, /* GL_BUFFER_MAP_POINTER_ARB */
+   {  2353, 0x000088BD }, /* GL_BUFFER_MAP_POINTER_OES */
+   {  2379, 0x000085B3 }, /* GL_BUFFER_OBJECT_APPLE */
+   {  2402, 0x00008A12 }, /* GL_BUFFER_SERIALIZED_MODIFY_APPLE */
+   {  2436, 0x00008764 }, /* GL_BUFFER_SIZE */
+   {  2451, 0x00008764 }, /* GL_BUFFER_SIZE_ARB */
+   {  2470, 0x00008765 }, /* GL_BUFFER_USAGE */
+   {  2486, 0x00008765 }, /* GL_BUFFER_USAGE_ARB */
+   {  2506, 0x0000877B }, /* GL_BUMP_ENVMAP_ATI */
+   {  2525, 0x00008777 }, /* GL_BUMP_NUM_TEX_UNITS_ATI */
+   {  2551, 0x00008775 }, /* GL_BUMP_ROT_MATRIX_ATI */
+   {  2574, 0x00008776 }, /* GL_BUMP_ROT_MATRIX_SIZE_ATI */
+   {  2602, 0x0000877C }, /* GL_BUMP_TARGET_ATI */
+   {  2621, 0x00008778 }, /* GL_BUMP_TEX_UNITS_ATI */
+   {  2643, 0x00001400 }, /* GL_BYTE */
+   {  2651, 0x00002A24 }, /* GL_C3F_V3F */
+   {  2662, 0x00002A26 }, /* GL_C4F_N3F_V3F */
+   {  2677, 0x00002A22 }, /* GL_C4UB_V2F */
+   {  2689, 0x00002A23 }, /* GL_C4UB_V3F */
+   {  2701, 0x00000901 }, /* GL_CCW */
+   {  2708, 0x00002900 }, /* GL_CLAMP */
+   {  2717, 0x0000891B }, /* GL_CLAMP_FRAGMENT_COLOR_ARB */
+   {  2745, 0x0000891C }, /* GL_CLAMP_READ_COLOR */
+   {  2765, 0x0000891C }, /* GL_CLAMP_READ_COLOR_ARB */
+   {  2789, 0x0000812D }, /* GL_CLAMP_TO_BORDER */
+   {  2808, 0x0000812D }, /* GL_CLAMP_TO_BORDER_ARB */
+   {  2831, 0x0000812D }, /* GL_CLAMP_TO_BORDER_SGIS */
+   {  2855, 0x0000812F }, /* GL_CLAMP_TO_EDGE */
+   {  2872, 0x0000812F }, /* GL_CLAMP_TO_EDGE_SGIS */
+   {  2894, 0x0000891A }, /* GL_CLAMP_VERTEX_COLOR_ARB */
+   {  2920, 0x00001500 }, /* GL_CLEAR */
+   {  2929, 0x000084E1 }, /* GL_CLIENT_ACTIVE_TEXTURE */
+   {  2954, 0x000084E1 }, /* GL_CLIENT_ACTIVE_TEXTURE_ARB */
+   {  2983, 0xFFFFFFFF }, /* GL_CLIENT_ALL_ATTRIB_BITS */
+   {  3009, 0x00000BB1 }, /* GL_CLIENT_ATTRIB_STACK_DEPTH */
+   {  3038, 0x00000001 }, /* GL_CLIENT_PIXEL_STORE_BIT */
+   {  3064, 0x00000002 }, /* GL_CLIENT_VERTEX_ARRAY_BIT */
+   {  3091, 0x00003000 }, /* GL_CLIP_DISTANCE0 */
+   {  3109, 0x00003001 }, /* GL_CLIP_DISTANCE1 */
+   {  3127, 0x00003002 }, /* GL_CLIP_DISTANCE2 */
+   {  3145, 0x00003003 }, /* GL_CLIP_DISTANCE3 */
+   {  3163, 0x00003004 }, /* GL_CLIP_DISTANCE4 */
+   {  3181, 0x00003005 }, /* GL_CLIP_DISTANCE5 */
+   {  3199, 0x00003006 }, /* GL_CLIP_DISTANCE6 */
+   {  3217, 0x00003007 }, /* GL_CLIP_DISTANCE7 */
+   {  3235, 0x00003000 }, /* GL_CLIP_PLANE0 */
+   {  3250, 0x00003001 }, /* GL_CLIP_PLANE1 */
+   {  3265, 0x00003002 }, /* GL_CLIP_PLANE2 */
+   {  3280, 0x00003003 }, /* GL_CLIP_PLANE3 */
+   {  3295, 0x00003004 }, /* GL_CLIP_PLANE4 */
+   {  3310, 0x00003005 }, /* GL_CLIP_PLANE5 */
+   {  3325, 0x000080F0 }, /* GL_CLIP_VOLUME_CLIPPING_HINT_EXT */
+   {  3358, 0x00000A00 }, /* GL_COEFF */
+   {  3367, 0x00001800 }, /* GL_COLOR */
+   {  3376, 0x00008076 }, /* GL_COLOR_ARRAY */
+   {  3391, 0x00008898 }, /* GL_COLOR_ARRAY_BUFFER_BINDING */
+   {  3421, 0x00008898 }, /* GL_COLOR_ARRAY_BUFFER_BINDING_ARB */
+   {  3455, 0x00008090 }, /* GL_COLOR_ARRAY_POINTER */
+   {  3478, 0x00008081 }, /* GL_COLOR_ARRAY_SIZE */
+   {  3498, 0x00008083 }, /* GL_COLOR_ARRAY_STRIDE */
+   {  3520, 0x00008082 }, /* GL_COLOR_ARRAY_TYPE */
+   {  3540, 0x00008CE0 }, /* GL_COLOR_ATTACHMENT0 */
+   {  3561, 0x00008CE0 }, /* GL_COLOR_ATTACHMENT0_EXT */
+   {  3586, 0x00008CE0 }, /* GL_COLOR_ATTACHMENT0_OES */
+   {  3611, 0x00008CE1 }, /* GL_COLOR_ATTACHMENT1 */
+   {  3632, 0x00008CEA }, /* GL_COLOR_ATTACHMENT10 */
+   {  3654, 0x00008CEA }, /* GL_COLOR_ATTACHMENT10_EXT */
+   {  3680, 0x00008CEB }, /* GL_COLOR_ATTACHMENT11 */
+   {  3702, 0x00008CEB }, /* GL_COLOR_ATTACHMENT11_EXT */
+   {  3728, 0x00008CEC }, /* GL_COLOR_ATTACHMENT12 */
+   {  3750, 0x00008CEC }, /* GL_COLOR_ATTACHMENT12_EXT */
+   {  3776, 0x00008CED }, /* GL_COLOR_ATTACHMENT13 */
+   {  3798, 0x00008CED }, /* GL_COLOR_ATTACHMENT13_EXT */
+   {  3824, 0x00008CEE }, /* GL_COLOR_ATTACHMENT14 */
+   {  3846, 0x00008CEE }, /* GL_COLOR_ATTACHMENT14_EXT */
+   {  3872, 0x00008CEF }, /* GL_COLOR_ATTACHMENT15 */
+   {  3894, 0x00008CEF }, /* GL_COLOR_ATTACHMENT15_EXT */
+   {  3920, 0x00008CE1 }, /* GL_COLOR_ATTACHMENT1_EXT */
+   {  3945, 0x00008CE2 }, /* GL_COLOR_ATTACHMENT2 */
+   {  3966, 0x00008CE2 }, /* GL_COLOR_ATTACHMENT2_EXT */
+   {  3991, 0x00008CE3 }, /* GL_COLOR_ATTACHMENT3 */
+   {  4012, 0x00008CE3 }, /* GL_COLOR_ATTACHMENT3_EXT */
+   {  4037, 0x00008CE4 }, /* GL_COLOR_ATTACHMENT4 */
+   {  4058, 0x00008CE4 }, /* GL_COLOR_ATTACHMENT4_EXT */
+   {  4083, 0x00008CE5 }, /* GL_COLOR_ATTACHMENT5 */
+   {  4104, 0x00008CE5 }, /* GL_COLOR_ATTACHMENT5_EXT */
+   {  4129, 0x00008CE6 }, /* GL_COLOR_ATTACHMENT6 */
+   {  4150, 0x00008CE6 }, /* GL_COLOR_ATTACHMENT6_EXT */
+   {  4175, 0x00008CE7 }, /* GL_COLOR_ATTACHMENT7 */
+   {  4196, 0x00008CE7 }, /* GL_COLOR_ATTACHMENT7_EXT */
+   {  4221, 0x00008CE8 }, /* GL_COLOR_ATTACHMENT8 */
+   {  4242, 0x00008CE8 }, /* GL_COLOR_ATTACHMENT8_EXT */
+   {  4267, 0x00008CE9 }, /* GL_COLOR_ATTACHMENT9 */
+   {  4288, 0x00008CE9 }, /* GL_COLOR_ATTACHMENT9_EXT */
+   {  4313, 0x00004000 }, /* GL_COLOR_BUFFER_BIT */
+   {  4333, 0x00000C22 }, /* GL_COLOR_CLEAR_VALUE */
+   {  4354, 0x00001900 }, /* GL_COLOR_INDEX */
+   {  4369, 0x00001603 }, /* GL_COLOR_INDEXES */
+   {  4386, 0x00000BF2 }, /* GL_COLOR_LOGIC_OP */
+   {  4404, 0x00000B57 }, /* GL_COLOR_MATERIAL */
+   {  4422, 0x00000B55 }, /* GL_COLOR_MATERIAL_FACE */
+   {  4445, 0x00000B56 }, /* GL_COLOR_MATERIAL_PARAMETER */
+   {  4473, 0x000080B1 }, /* GL_COLOR_MATRIX */
+   {  4489, 0x000080B1 }, /* GL_COLOR_MATRIX_SGI */
+   {  4509, 0x000080B2 }, /* GL_COLOR_MATRIX_STACK_DEPTH */
+   {  4537, 0x000080B2 }, /* GL_COLOR_MATRIX_STACK_DEPTH_SGI */
+   {  4569, 0x00008458 }, /* GL_COLOR_SUM */
+   {  4582, 0x00008458 }, /* GL_COLOR_SUM_ARB */
+   {  4599, 0x000080D0 }, /* GL_COLOR_TABLE */
+   {  4614, 0x000080DD }, /* GL_COLOR_TABLE_ALPHA_SIZE */
+   {  4640, 0x000080DD }, /* GL_COLOR_TABLE_ALPHA_SIZE_EXT */
+   {  4670, 0x000080DD }, /* GL_COLOR_TABLE_ALPHA_SIZE_SGI */
+   {  4700, 0x000080D7 }, /* GL_COLOR_TABLE_BIAS */
+   {  4720, 0x000080D7 }, /* GL_COLOR_TABLE_BIAS_SGI */
+   {  4744, 0x000080DC }, /* GL_COLOR_TABLE_BLUE_SIZE */
+   {  4769, 0x000080DC }, /* GL_COLOR_TABLE_BLUE_SIZE_EXT */
+   {  4798, 0x000080DC }, /* GL_COLOR_TABLE_BLUE_SIZE_SGI */
+   {  4827, 0x000080D8 }, /* GL_COLOR_TABLE_FORMAT */
+   {  4849, 0x000080D8 }, /* GL_COLOR_TABLE_FORMAT_EXT */
+   {  4875, 0x000080D8 }, /* GL_COLOR_TABLE_FORMAT_SGI */
+   {  4901, 0x000080DB }, /* GL_COLOR_TABLE_GREEN_SIZE */
+   {  4927, 0x000080DB }, /* GL_COLOR_TABLE_GREEN_SIZE_EXT */
+   {  4957, 0x000080DB }, /* GL_COLOR_TABLE_GREEN_SIZE_SGI */
+   {  4987, 0x000080DF }, /* GL_COLOR_TABLE_INTENSITY_SIZE */
+   {  5017, 0x000080DF }, /* GL_COLOR_TABLE_INTENSITY_SIZE_EXT */
+   {  5051, 0x000080DF }, /* GL_COLOR_TABLE_INTENSITY_SIZE_SGI */
+   {  5085, 0x000080DE }, /* GL_COLOR_TABLE_LUMINANCE_SIZE */
+   {  5115, 0x000080DE }, /* GL_COLOR_TABLE_LUMINANCE_SIZE_EXT */
+   {  5149, 0x000080DE }, /* GL_COLOR_TABLE_LUMINANCE_SIZE_SGI */
+   {  5183, 0x000080DA }, /* GL_COLOR_TABLE_RED_SIZE */
+   {  5207, 0x000080DA }, /* GL_COLOR_TABLE_RED_SIZE_EXT */
+   {  5235, 0x000080DA }, /* GL_COLOR_TABLE_RED_SIZE_SGI */
+   {  5263, 0x000080D6 }, /* GL_COLOR_TABLE_SCALE */
+   {  5284, 0x000080D6 }, /* GL_COLOR_TABLE_SCALE_SGI */
+   {  5309, 0x000080D9 }, /* GL_COLOR_TABLE_WIDTH */
+   {  5330, 0x000080D9 }, /* GL_COLOR_TABLE_WIDTH_EXT */
+   {  5355, 0x000080D9 }, /* GL_COLOR_TABLE_WIDTH_SGI */
+   {  5380, 0x00000C23 }, /* GL_COLOR_WRITEMASK */
+   {  5399, 0x00008570 }, /* GL_COMBINE */
+   {  5410, 0x00008503 }, /* GL_COMBINE4 */
+   {  5422, 0x00008572 }, /* GL_COMBINE_ALPHA */
+   {  5439, 0x00008572 }, /* GL_COMBINE_ALPHA_ARB */
+   {  5460, 0x00008572 }, /* GL_COMBINE_ALPHA_EXT */
+   {  5481, 0x00008570 }, /* GL_COMBINE_ARB */
+   {  5496, 0x00008570 }, /* GL_COMBINE_EXT */
+   {  5511, 0x00008571 }, /* GL_COMBINE_RGB */
+   {  5526, 0x00008571 }, /* GL_COMBINE_RGB_ARB */
+   {  5545, 0x00008571 }, /* GL_COMBINE_RGB_EXT */
+   {  5564, 0x0000884E }, /* GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT */
+   {  5600, 0x0000884E }, /* GL_COMPARE_REF_TO_TEXTURE */
+   {  5626, 0x0000884E }, /* GL_COMPARE_R_TO_TEXTURE */
+   {  5650, 0x0000884E }, /* GL_COMPARE_R_TO_TEXTURE_ARB */
+   {  5678, 0x00001300 }, /* GL_COMPILE */
+   {  5689, 0x00001301 }, /* GL_COMPILE_AND_EXECUTE */
+   {  5712, 0x00008B81 }, /* GL_COMPILE_STATUS */
+   {  5730, 0x000084E9 }, /* GL_COMPRESSED_ALPHA */
+   {  5750, 0x000084E9 }, /* GL_COMPRESSED_ALPHA_ARB */
+   {  5774, 0x000084EC }, /* GL_COMPRESSED_INTENSITY */
+   {  5798, 0x000084EC }, /* GL_COMPRESSED_INTENSITY_ARB */
+   {  5826, 0x000084EA }, /* GL_COMPRESSED_LUMINANCE */
+   {  5850, 0x000084EB }, /* GL_COMPRESSED_LUMINANCE_ALPHA */
+   {  5880, 0x000084EB }, /* GL_COMPRESSED_LUMINANCE_ALPHA_ARB */
+   {  5914, 0x000084EA }, /* GL_COMPRESSED_LUMINANCE_ARB */
+   {  5942, 0x00008225 }, /* GL_COMPRESSED_RED */
+   {  5960, 0x00008226 }, /* GL_COMPRESSED_RG */
+   {  5977, 0x000084ED }, /* GL_COMPRESSED_RGB */
+   {  5995, 0x000084EE }, /* GL_COMPRESSED_RGBA */
+   {  6014, 0x000084EE }, /* GL_COMPRESSED_RGBA_ARB */
+   {  6037, 0x000086B1 }, /* GL_COMPRESSED_RGBA_FXT1_3DFX */
+   {  6066, 0x000083F1 }, /* GL_COMPRESSED_RGBA_S3TC_DXT1_EXT */
+   {  6099, 0x000083F2 }, /* GL_COMPRESSED_RGBA_S3TC_DXT3_EXT */
+   {  6132, 0x000083F3 }, /* GL_COMPRESSED_RGBA_S3TC_DXT5_EXT */
+   {  6165, 0x000084ED }, /* GL_COMPRESSED_RGB_ARB */
+   {  6187, 0x000086B0 }, /* GL_COMPRESSED_RGB_FXT1_3DFX */
+   {  6215, 0x000083F0 }, /* GL_COMPRESSED_RGB_S3TC_DXT1_EXT */
+   {  6247, 0x00008C4A }, /* GL_COMPRESSED_SLUMINANCE */
+   {  6272, 0x00008C4B }, /* GL_COMPRESSED_SLUMINANCE_ALPHA */
+   {  6303, 0x00008C48 }, /* GL_COMPRESSED_SRGB */
+   {  6322, 0x00008C49 }, /* GL_COMPRESSED_SRGB_ALPHA */
+   {  6347, 0x000086A3 }, /* GL_COMPRESSED_TEXTURE_FORMATS */
+   {  6377, 0x0000911C }, /* GL_CONDITION_SATISFIED */
+   {  6400, 0x00008576 }, /* GL_CONSTANT */
+   {  6412, 0x00008003 }, /* GL_CONSTANT_ALPHA */
+   {  6430, 0x00008003 }, /* GL_CONSTANT_ALPHA_EXT */
+   {  6452, 0x00008576 }, /* GL_CONSTANT_ARB */
+   {  6468, 0x00001207 }, /* GL_CONSTANT_ATTENUATION */
+   {  6492, 0x00008151 }, /* GL_CONSTANT_BORDER_HP */
+   {  6514, 0x00008001 }, /* GL_CONSTANT_COLOR */
+   {  6532, 0x00008001 }, /* GL_CONSTANT_COLOR_EXT */
+   {  6554, 0x00008576 }, /* GL_CONSTANT_EXT */
+   {  6570, 0x00000002 }, /* GL_CONTEXT_COMPATIBILITY_PROFILE_BIT */
+   {  6607, 0x00000001 }, /* GL_CONTEXT_CORE_PROFILE_BIT */
+   {  6635, 0x0000821E }, /* GL_CONTEXT_FLAGS */
+   {  6652, 0x00000001 }, /* GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT */
+   {  6691, 0x00009126 }, /* GL_CONTEXT_PROFILE_MASK */
+   {  6715, 0x00008010 }, /* GL_CONVOLUTION_1D */
+   {  6733, 0x00008011 }, /* GL_CONVOLUTION_2D */
+   {  6751, 0x00008154 }, /* GL_CONVOLUTION_BORDER_COLOR */
+   {  6779, 0x00008154 }, /* GL_CONVOLUTION_BORDER_COLOR_HP */
+   {  6810, 0x00008013 }, /* GL_CONVOLUTION_BORDER_MODE */
+   {  6837, 0x00008013 }, /* GL_CONVOLUTION_BORDER_MODE_EXT */
+   {  6868, 0x00008015 }, /* GL_CONVOLUTION_FILTER_BIAS */
+   {  6895, 0x00008015 }, /* GL_CONVOLUTION_FILTER_BIAS_EXT */
+   {  6926, 0x00008014 }, /* GL_CONVOLUTION_FILTER_SCALE */
+   {  6954, 0x00008014 }, /* GL_CONVOLUTION_FILTER_SCALE_EXT */
+   {  6986, 0x00008017 }, /* GL_CONVOLUTION_FORMAT */
+   {  7008, 0x00008017 }, /* GL_CONVOLUTION_FORMAT_EXT */
+   {  7034, 0x00008019 }, /* GL_CONVOLUTION_HEIGHT */
+   {  7056, 0x00008019 }, /* GL_CONVOLUTION_HEIGHT_EXT */
+   {  7082, 0x00008018 }, /* GL_CONVOLUTION_WIDTH */
+   {  7103, 0x00008018 }, /* GL_CONVOLUTION_WIDTH_EXT */
+   {  7128, 0x00008862 }, /* GL_COORD_REPLACE */
+   {  7145, 0x00008862 }, /* GL_COORD_REPLACE_ARB */
+   {  7166, 0x00008862 }, /* GL_COORD_REPLACE_NV */
+   {  7186, 0x00008862 }, /* GL_COORD_REPLACE_OES */
+   {  7207, 0x00001503 }, /* GL_COPY */
+   {  7215, 0x0000150C }, /* GL_COPY_INVERTED */
+   {  7232, 0x00000706 }, /* GL_COPY_PIXEL_TOKEN */
+   {  7252, 0x00008F36 }, /* GL_COPY_READ_BUFFER */
+   {  7272, 0x00008F37 }, /* GL_COPY_WRITE_BUFFER */
+   {  7293, 0x00000B44 }, /* GL_CULL_FACE */
+   {  7306, 0x00000B45 }, /* GL_CULL_FACE_MODE */
+   {  7324, 0x000081AA }, /* GL_CULL_VERTEX_EXT */
+   {  7343, 0x000081AC }, /* GL_CULL_VERTEX_EYE_POSITION_EXT */
+   {  7375, 0x000081AB }, /* GL_CULL_VERTEX_OBJECT_POSITION_EXT */
+   {  7410, 0x00008626 }, /* GL_CURRENT_ATTRIB_NV */
+   {  7431, 0x00000001 }, /* GL_CURRENT_BIT */
+   {  7446, 0x00000B00 }, /* GL_CURRENT_COLOR */
+   {  7463, 0x00008453 }, /* GL_CURRENT_FOG_COORD */
+   {  7484, 0x00008453 }, /* GL_CURRENT_FOG_COORDINATE */
+   {  7510, 0x00000B01 }, /* GL_CURRENT_INDEX */
+   {  7527, 0x00008641 }, /* GL_CURRENT_MATRIX_ARB */
+   {  7549, 0x00008845 }, /* GL_CURRENT_MATRIX_INDEX_ARB */
+   {  7577, 0x00008641 }, /* GL_CURRENT_MATRIX_NV */
+   {  7598, 0x00008640 }, /* GL_CURRENT_MATRIX_STACK_DEPTH_ARB */
+   {  7632, 0x00008640 }, /* GL_CURRENT_MATRIX_STACK_DEPTH_NV */
+   {  7665, 0x00000B02 }, /* GL_CURRENT_NORMAL */
+   {  7683, 0x00008843 }, /* GL_CURRENT_PALETTE_MATRIX_ARB */
+   {  7713, 0x00008843 }, /* GL_CURRENT_PALETTE_MATRIX_OES */
+   {  7743, 0x00008B8D }, /* GL_CURRENT_PROGRAM */
+   {  7762, 0x00008865 }, /* GL_CURRENT_QUERY */
+   {  7779, 0x00008865 }, /* GL_CURRENT_QUERY_ARB */
+   {  7800, 0x00000B04 }, /* GL_CURRENT_RASTER_COLOR */
+   {  7824, 0x00000B09 }, /* GL_CURRENT_RASTER_DISTANCE */
+   {  7851, 0x00000B05 }, /* GL_CURRENT_RASTER_INDEX */
+   {  7875, 0x00000B07 }, /* GL_CURRENT_RASTER_POSITION */
+   {  7902, 0x00000B08 }, /* GL_CURRENT_RASTER_POSITION_VALID */
+   {  7935, 0x0000845F }, /* GL_CURRENT_RASTER_SECONDARY_COLOR */
+   {  7969, 0x00000B06 }, /* GL_CURRENT_RASTER_TEXTURE_COORDS */
+   {  8002, 0x00008459 }, /* GL_CURRENT_SECONDARY_COLOR */
+   {  8029, 0x00000B03 }, /* GL_CURRENT_TEXTURE_COORDS */
+   {  8055, 0x00008626 }, /* GL_CURRENT_VERTEX_ATTRIB */
+   {  8080, 0x00008626 }, /* GL_CURRENT_VERTEX_ATTRIB_ARB */
+   {  8109, 0x000086A8 }, /* GL_CURRENT_WEIGHT_ARB */
+   {  8131, 0x00000900 }, /* GL_CW */
+   {  8137, 0x0000875B }, /* GL_DEBUG_ASSERT_MESA */
+   {  8158, 0x00008759 }, /* GL_DEBUG_OBJECT_MESA */
+   {  8179, 0x0000875A }, /* GL_DEBUG_PRINT_MESA */
+   {  8199, 0x00002101 }, /* GL_DECAL */
+   {  8208, 0x00001E03 }, /* GL_DECR */
+   {  8216, 0x00008508 }, /* GL_DECR_WRAP */
+   {  8229, 0x00008508 }, /* GL_DECR_WRAP_EXT */
+   {  8246, 0x00008B80 }, /* GL_DELETE_STATUS */
+   {  8263, 0x00001801 }, /* GL_DEPTH */
+   {  8272, 0x000088F0 }, /* GL_DEPTH24_STENCIL8 */
+   {  8292, 0x000088F0 }, /* GL_DEPTH24_STENCIL8_EXT */
+   {  8316, 0x000088F0 }, /* GL_DEPTH24_STENCIL8_OES */
+   {  8340, 0x00008D00 }, /* GL_DEPTH_ATTACHMENT */
+   {  8360, 0x00008D00 }, /* GL_DEPTH_ATTACHMENT_EXT */
+   {  8384, 0x00008D00 }, /* GL_DEPTH_ATTACHMENT_OES */
+   {  8408, 0x00000D1F }, /* GL_DEPTH_BIAS */
+   {  8422, 0x00000D56 }, /* GL_DEPTH_BITS */
+   {  8436, 0x00008891 }, /* GL_DEPTH_BOUNDS_EXT */
+   {  8456, 0x00008890 }, /* GL_DEPTH_BOUNDS_TEST_EXT */
+   {  8481, 0x00008223 }, /* GL_DEPTH_BUFFER */
+   {  8497, 0x00000100 }, /* GL_DEPTH_BUFFER_BIT */
+   {  8517, 0x0000864F }, /* GL_DEPTH_CLAMP */
+   {  8532, 0x0000864F }, /* GL_DEPTH_CLAMP_NV */
+   {  8550, 0x00000B73 }, /* GL_DEPTH_CLEAR_VALUE */
+   {  8571, 0x00001902 }, /* GL_DEPTH_COMPONENT */
+   {  8590, 0x000081A5 }, /* GL_DEPTH_COMPONENT16 */
+   {  8611, 0x000081A5 }, /* GL_DEPTH_COMPONENT16_ARB */
+   {  8636, 0x000081A5 }, /* GL_DEPTH_COMPONENT16_OES */
+   {  8661, 0x000081A5 }, /* GL_DEPTH_COMPONENT16_SGIX */
+   {  8687, 0x000081A6 }, /* GL_DEPTH_COMPONENT24 */
+   {  8708, 0x000081A6 }, /* GL_DEPTH_COMPONENT24_ARB */
+   {  8733, 0x000081A6 }, /* GL_DEPTH_COMPONENT24_OES */
+   {  8758, 0x000081A6 }, /* GL_DEPTH_COMPONENT24_SGIX */
+   {  8784, 0x000081A7 }, /* GL_DEPTH_COMPONENT32 */
+   {  8805, 0x000081A7 }, /* GL_DEPTH_COMPONENT32_ARB */
+   {  8830, 0x000081A7 }, /* GL_DEPTH_COMPONENT32_OES */
+   {  8855, 0x000081A7 }, /* GL_DEPTH_COMPONENT32_SGIX */
+   {  8881, 0x00000B74 }, /* GL_DEPTH_FUNC */
+   {  8895, 0x00000B70 }, /* GL_DEPTH_RANGE */
+   {  8910, 0x00000D1E }, /* GL_DEPTH_SCALE */
+   {  8925, 0x000084F9 }, /* GL_DEPTH_STENCIL */
+   {  8942, 0x0000821A }, /* GL_DEPTH_STENCIL_ATTACHMENT */
+   {  8970, 0x000084F9 }, /* GL_DEPTH_STENCIL_EXT */
+   {  8991, 0x000084F9 }, /* GL_DEPTH_STENCIL_NV */
+   {  9011, 0x000084F9 }, /* GL_DEPTH_STENCIL_OES */
+   {  9032, 0x0000886F }, /* GL_DEPTH_STENCIL_TO_BGRA_NV */
+   {  9060, 0x0000886E }, /* GL_DEPTH_STENCIL_TO_RGBA_NV */
+   {  9088, 0x00000B71 }, /* GL_DEPTH_TEST */
+   {  9102, 0x0000884B }, /* GL_DEPTH_TEXTURE_MODE */
+   {  9124, 0x0000884B }, /* GL_DEPTH_TEXTURE_MODE_ARB */
+   {  9150, 0x00000B72 }, /* GL_DEPTH_WRITEMASK */
+   {  9169, 0x00001201 }, /* GL_DIFFUSE */
+   {  9180, 0x00000BD0 }, /* GL_DITHER */
+   {  9190, 0x00000A02 }, /* GL_DOMAIN */
+   {  9200, 0x00001100 }, /* GL_DONT_CARE */
+   {  9213, 0x000086AE }, /* GL_DOT3_RGB */
+   {  9225, 0x000086AF }, /* GL_DOT3_RGBA */
+   {  9238, 0x000086AF }, /* GL_DOT3_RGBA_ARB */
+   {  9255, 0x00008741 }, /* GL_DOT3_RGBA_EXT */
+   {  9272, 0x000086AE }, /* GL_DOT3_RGB_ARB */
+   {  9288, 0x00008740 }, /* GL_DOT3_RGB_EXT */
+   {  9304, 0x0000140A }, /* GL_DOUBLE */
+   {  9314, 0x00000C32 }, /* GL_DOUBLEBUFFER */
+   {  9330, 0x00000C01 }, /* GL_DRAW_BUFFER */
+   {  9345, 0x00008825 }, /* GL_DRAW_BUFFER0 */
+   {  9361, 0x00008825 }, /* GL_DRAW_BUFFER0_ARB */
+   {  9381, 0x00008825 }, /* GL_DRAW_BUFFER0_ATI */
+   {  9401, 0x00008826 }, /* GL_DRAW_BUFFER1 */
+   {  9417, 0x0000882F }, /* GL_DRAW_BUFFER10 */
+   {  9434, 0x0000882F }, /* GL_DRAW_BUFFER10_ARB */
+   {  9455, 0x0000882F }, /* GL_DRAW_BUFFER10_ATI */
+   {  9476, 0x00008830 }, /* GL_DRAW_BUFFER11 */
+   {  9493, 0x00008830 }, /* GL_DRAW_BUFFER11_ARB */
+   {  9514, 0x00008830 }, /* GL_DRAW_BUFFER11_ATI */
+   {  9535, 0x00008831 }, /* GL_DRAW_BUFFER12 */
+   {  9552, 0x00008831 }, /* GL_DRAW_BUFFER12_ARB */
+   {  9573, 0x00008831 }, /* GL_DRAW_BUFFER12_ATI */
+   {  9594, 0x00008832 }, /* GL_DRAW_BUFFER13 */
+   {  9611, 0x00008832 }, /* GL_DRAW_BUFFER13_ARB */
+   {  9632, 0x00008832 }, /* GL_DRAW_BUFFER13_ATI */
+   {  9653, 0x00008833 }, /* GL_DRAW_BUFFER14 */
+   {  9670, 0x00008833 }, /* GL_DRAW_BUFFER14_ARB */
+   {  9691, 0x00008833 }, /* GL_DRAW_BUFFER14_ATI */
+   {  9712, 0x00008834 }, /* GL_DRAW_BUFFER15 */
+   {  9729, 0x00008834 }, /* GL_DRAW_BUFFER15_ARB */
+   {  9750, 0x00008834 }, /* GL_DRAW_BUFFER15_ATI */
+   {  9771, 0x00008826 }, /* GL_DRAW_BUFFER1_ARB */
+   {  9791, 0x00008826 }, /* GL_DRAW_BUFFER1_ATI */
+   {  9811, 0x00008827 }, /* GL_DRAW_BUFFER2 */
+   {  9827, 0x00008827 }, /* GL_DRAW_BUFFER2_ARB */
+   {  9847, 0x00008827 }, /* GL_DRAW_BUFFER2_ATI */
+   {  9867, 0x00008828 }, /* GL_DRAW_BUFFER3 */
+   {  9883, 0x00008828 }, /* GL_DRAW_BUFFER3_ARB */
+   {  9903, 0x00008828 }, /* GL_DRAW_BUFFER3_ATI */
+   {  9923, 0x00008829 }, /* GL_DRAW_BUFFER4 */
+   {  9939, 0x00008829 }, /* GL_DRAW_BUFFER4_ARB */
+   {  9959, 0x00008829 }, /* GL_DRAW_BUFFER4_ATI */
+   {  9979, 0x0000882A }, /* GL_DRAW_BUFFER5 */
+   {  9995, 0x0000882A }, /* GL_DRAW_BUFFER5_ARB */
+   { 10015, 0x0000882A }, /* GL_DRAW_BUFFER5_ATI */
+   { 10035, 0x0000882B }, /* GL_DRAW_BUFFER6 */
+   { 10051, 0x0000882B }, /* GL_DRAW_BUFFER6_ARB */
+   { 10071, 0x0000882B }, /* GL_DRAW_BUFFER6_ATI */
+   { 10091, 0x0000882C }, /* GL_DRAW_BUFFER7 */
+   { 10107, 0x0000882C }, /* GL_DRAW_BUFFER7_ARB */
+   { 10127, 0x0000882C }, /* GL_DRAW_BUFFER7_ATI */
+   { 10147, 0x0000882D }, /* GL_DRAW_BUFFER8 */
+   { 10163, 0x0000882D }, /* GL_DRAW_BUFFER8_ARB */
+   { 10183, 0x0000882D }, /* GL_DRAW_BUFFER8_ATI */
+   { 10203, 0x0000882E }, /* GL_DRAW_BUFFER9 */
+   { 10219, 0x0000882E }, /* GL_DRAW_BUFFER9_ARB */
+   { 10239, 0x0000882E }, /* GL_DRAW_BUFFER9_ATI */
+   { 10259, 0x00008CA9 }, /* GL_DRAW_FRAMEBUFFER */
+   { 10279, 0x00008CA6 }, /* GL_DRAW_FRAMEBUFFER_BINDING */
+   { 10307, 0x00008CA6 }, /* GL_DRAW_FRAMEBUFFER_BINDING_EXT */
+   { 10339, 0x00008CA9 }, /* GL_DRAW_FRAMEBUFFER_EXT */
+   { 10363, 0x00000705 }, /* GL_DRAW_PIXEL_TOKEN */
+   { 10383, 0x00000304 }, /* GL_DST_ALPHA */
+   { 10396, 0x00000306 }, /* GL_DST_COLOR */
+   { 10409, 0x0000877A }, /* GL_DU8DV8_ATI */
+   { 10423, 0x00008779 }, /* GL_DUDV_ATI */
+   { 10435, 0x000088EA }, /* GL_DYNAMIC_COPY */
+   { 10451, 0x000088EA }, /* GL_DYNAMIC_COPY_ARB */
+   { 10471, 0x000088E8 }, /* GL_DYNAMIC_DRAW */
+   { 10487, 0x000088E8 }, /* GL_DYNAMIC_DRAW_ARB */
+   { 10507, 0x000088E9 }, /* GL_DYNAMIC_READ */
+   { 10523, 0x000088E9 }, /* GL_DYNAMIC_READ_ARB */
+   { 10543, 0x00000B43 }, /* GL_EDGE_FLAG */
+   { 10556, 0x00008079 }, /* GL_EDGE_FLAG_ARRAY */
+   { 10575, 0x0000889B }, /* GL_EDGE_FLAG_ARRAY_BUFFER_BINDING */
+   { 10609, 0x0000889B }, /* GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB */
+   { 10647, 0x00008093 }, /* GL_EDGE_FLAG_ARRAY_POINTER */
+   { 10674, 0x0000808C }, /* GL_EDGE_FLAG_ARRAY_STRIDE */
+   { 10700, 0x00008893 }, /* GL_ELEMENT_ARRAY_BUFFER */
+   { 10724, 0x00008895 }, /* GL_ELEMENT_ARRAY_BUFFER_BINDING */
+   { 10756, 0x00008895 }, /* GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB */
+   { 10792, 0x00001600 }, /* GL_EMISSION */
+   { 10804, 0x00002000 }, /* GL_ENABLE_BIT */
+   { 10818, 0x00000202 }, /* GL_EQUAL */
+   { 10827, 0x00001509 }, /* GL_EQUIV */
+   { 10836, 0x00010000 }, /* GL_EVAL_BIT */
+   { 10848, 0x00000800 }, /* GL_EXP */
+   { 10855, 0x00000801 }, /* GL_EXP2 */
+   { 10863, 0x00001F03 }, /* GL_EXTENSIONS */
+   { 10877, 0x00002400 }, /* GL_EYE_LINEAR */
+   { 10891, 0x00002502 }, /* GL_EYE_PLANE */
+   { 10904, 0x0000855C }, /* GL_EYE_PLANE_ABSOLUTE_NV */
+   { 10929, 0x0000855B }, /* GL_EYE_RADIAL_NV */
+   { 10946, 0x00000000 }, /* GL_FALSE */
+   { 10955, 0x00001101 }, /* GL_FASTEST */
+   { 10966, 0x00001C01 }, /* GL_FEEDBACK */
+   { 10978, 0x00000DF0 }, /* GL_FEEDBACK_BUFFER_POINTER */
+   { 11005, 0x00000DF1 }, /* GL_FEEDBACK_BUFFER_SIZE */
+   { 11029, 0x00000DF2 }, /* GL_FEEDBACK_BUFFER_TYPE */
+   { 11053, 0x00001B02 }, /* GL_FILL */
+   { 11061, 0x00008E4D }, /* GL_FIRST_VERTEX_CONVENTION */
+   { 11088, 0x00008E4D }, /* GL_FIRST_VERTEX_CONVENTION_EXT */
+   { 11119, 0x0000140C }, /* GL_FIXED */
+   { 11128, 0x0000140C }, /* GL_FIXED_OES */
+   { 11141, 0x0000891D }, /* GL_FIXED_ONLY */
+   { 11155, 0x0000891D }, /* GL_FIXED_ONLY_ARB */
+   { 11173, 0x00001D00 }, /* GL_FLAT */
+   { 11181, 0x00001406 }, /* GL_FLOAT */
+   { 11190, 0x00008B5A }, /* GL_FLOAT_MAT2 */
+   { 11204, 0x00008B5A }, /* GL_FLOAT_MAT2_ARB */
+   { 11222, 0x00008B65 }, /* GL_FLOAT_MAT2x3 */
+   { 11238, 0x00008B66 }, /* GL_FLOAT_MAT2x4 */
+   { 11254, 0x00008B5B }, /* GL_FLOAT_MAT3 */
+   { 11268, 0x00008B5B }, /* GL_FLOAT_MAT3_ARB */
+   { 11286, 0x00008B67 }, /* GL_FLOAT_MAT3x2 */
+   { 11302, 0x00008B68 }, /* GL_FLOAT_MAT3x4 */
+   { 11318, 0x00008B5C }, /* GL_FLOAT_MAT4 */
+   { 11332, 0x00008B5C }, /* GL_FLOAT_MAT4_ARB */
+   { 11350, 0x00008B69 }, /* GL_FLOAT_MAT4x2 */
+   { 11366, 0x00008B6A }, /* GL_FLOAT_MAT4x3 */
+   { 11382, 0x00008B50 }, /* GL_FLOAT_VEC2 */
+   { 11396, 0x00008B50 }, /* GL_FLOAT_VEC2_ARB */
+   { 11414, 0x00008B51 }, /* GL_FLOAT_VEC3 */
+   { 11428, 0x00008B51 }, /* GL_FLOAT_VEC3_ARB */
+   { 11446, 0x00008B52 }, /* GL_FLOAT_VEC4 */
+   { 11460, 0x00008B52 }, /* GL_FLOAT_VEC4_ARB */
+   { 11478, 0x00000B60 }, /* GL_FOG */
+   { 11485, 0x00000080 }, /* GL_FOG_BIT */
+   { 11496, 0x00000B66 }, /* GL_FOG_COLOR */
+   { 11509, 0x00008451 }, /* GL_FOG_COORD */
+   { 11522, 0x00008451 }, /* GL_FOG_COORDINATE */
+   { 11540, 0x00008457 }, /* GL_FOG_COORDINATE_ARRAY */
+   { 11564, 0x0000889D }, /* GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING */
+   { 11603, 0x0000889D }, /* GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB */
+   { 11646, 0x00008456 }, /* GL_FOG_COORDINATE_ARRAY_POINTER */
+   { 11678, 0x00008455 }, /* GL_FOG_COORDINATE_ARRAY_STRIDE */
+   { 11709, 0x00008454 }, /* GL_FOG_COORDINATE_ARRAY_TYPE */
+   { 11738, 0x00008450 }, /* GL_FOG_COORDINATE_SOURCE */
+   { 11763, 0x00008457 }, /* GL_FOG_COORD_ARRAY */
+   { 11782, 0x0000889D }, /* GL_FOG_COORD_ARRAY_BUFFER_BINDING */
+   { 11816, 0x00008456 }, /* GL_FOG_COORD_ARRAY_POINTER */
+   { 11843, 0x00008455 }, /* GL_FOG_COORD_ARRAY_STRIDE */
+   { 11869, 0x00008454 }, /* GL_FOG_COORD_ARRAY_TYPE */
+   { 11893, 0x00008450 }, /* GL_FOG_COORD_SRC */
+   { 11910, 0x00000B62 }, /* GL_FOG_DENSITY */
+   { 11925, 0x0000855A }, /* GL_FOG_DISTANCE_MODE_NV */
+   { 11949, 0x00000B64 }, /* GL_FOG_END */
+   { 11960, 0x00000C54 }, /* GL_FOG_HINT */
+   { 11972, 0x00000B61 }, /* GL_FOG_INDEX */
+   { 11985, 0x00000B65 }, /* GL_FOG_MODE */
+   { 11997, 0x00008198 }, /* GL_FOG_OFFSET_SGIX */
+   { 12016, 0x00008199 }, /* GL_FOG_OFFSET_VALUE_SGIX */
+   { 12041, 0x00000B63 }, /* GL_FOG_START */
+   { 12054, 0x00008452 }, /* GL_FRAGMENT_DEPTH */
+   { 12072, 0x00008804 }, /* GL_FRAGMENT_PROGRAM_ARB */
+   { 12096, 0x00008B30 }, /* GL_FRAGMENT_SHADER */
+   { 12115, 0x00008B30 }, /* GL_FRAGMENT_SHADER_ARB */
+   { 12138, 0x00008B8B }, /* GL_FRAGMENT_SHADER_DERIVATIVE_HINT */
+   { 12173, 0x00008B8B }, /* GL_FRAGMENT_SHADER_DERIVATIVE_HINT_OES */
+   { 12212, 0x00008D40 }, /* GL_FRAMEBUFFER */
+   { 12227, 0x00008215 }, /* GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE */
+   { 12264, 0x00008214 }, /* GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE */
+   { 12300, 0x00008210 }, /* GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING */
+   { 12341, 0x00008211 }, /* GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE */
+   { 12382, 0x00008216 }, /* GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE */
+   { 12419, 0x00008213 }, /* GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE */
+   { 12456, 0x00008DA7 }, /* GL_FRAMEBUFFER_ATTACHMENT_LAYERED */
+   { 12490, 0x00008DA7 }, /* GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB */
+   { 12528, 0x00008CD1 }, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME */
+   { 12566, 0x00008CD1 }, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT */
+   { 12608, 0x00008CD1 }, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_OES */
+   { 12650, 0x00008CD0 }, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE */
+   { 12688, 0x00008CD0 }, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT */
+   { 12730, 0x00008CD0 }, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_OES */
+   { 12772, 0x00008212 }, /* GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE */
+   { 12807, 0x00008217 }, /* GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE */
+   { 12846, 0x00008CD4 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT */
+   { 12895, 0x00008CD4 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_OES */
+   { 12944, 0x00008CD3 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE */
+   { 12992, 0x00008CD3 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT */
+   { 13044, 0x00008CD3 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_OES */
+   { 13096, 0x00008CD4 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER */
+   { 13136, 0x00008CD4 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT */
+   { 13180, 0x00008CD2 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL */
+   { 13220, 0x00008CD2 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT */
+   { 13264, 0x00008CD2 }, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_OES */
+   { 13308, 0x00008CA6 }, /* GL_FRAMEBUFFER_BINDING */
+   { 13331, 0x00008CA6 }, /* GL_FRAMEBUFFER_BINDING_EXT */
+   { 13358, 0x00008CA6 }, /* GL_FRAMEBUFFER_BINDING_OES */
+   { 13385, 0x00008CD5 }, /* GL_FRAMEBUFFER_COMPLETE */
+   { 13409, 0x00008CD5 }, /* GL_FRAMEBUFFER_COMPLETE_EXT */
+   { 13437, 0x00008CD5 }, /* GL_FRAMEBUFFER_COMPLETE_OES */
+   { 13465, 0x00008218 }, /* GL_FRAMEBUFFER_DEFAULT */
+   { 13488, 0x00008D40 }, /* GL_FRAMEBUFFER_EXT */
+   { 13507, 0x00008CD6 }, /* GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT */
+   { 13544, 0x00008CD6 }, /* GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT */
+   { 13585, 0x00008CD6 }, /* GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_OES */
+   { 13626, 0x00008CD9 }, /* GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS */
+   { 13663, 0x00008CD9 }, /* GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT */
+   { 13704, 0x00008CD9 }, /* GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_OES */
+   { 13745, 0x00008CDB }, /* GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER */
+   { 13783, 0x00008CDB }, /* GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT */
+   { 13825, 0x00008CDB }, /* GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_OES */
+   { 13867, 0x00008CD8 }, /* GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT */
+   { 13918, 0x00008CDA }, /* GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT */
+   { 13956, 0x00008CDA }, /* GL_FRAMEBUFFER_INCOMPLETE_FORMATS_OES */
+   { 13994, 0x00008DA9 }, /* GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB */
+   { 14036, 0x00008DA8 }, /* GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS */
+   { 14076, 0x00008DA8 }, /* GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB */
+   { 14120, 0x00008CD7 }, /* GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT */
+   { 14165, 0x00008CD7 }, /* GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT */
+   { 14214, 0x00008CD7 }, /* GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_OES */
+   { 14263, 0x00008D56 }, /* GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE */
+   { 14301, 0x00008D56 }, /* GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT */
+   { 14343, 0x00008CDC }, /* GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER */
+   { 14381, 0x00008CDC }, /* GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT */
+   { 14423, 0x00008CDC }, /* GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_OES */
+   { 14465, 0x00008D40 }, /* GL_FRAMEBUFFER_OES */
+   { 14484, 0x00008CDE }, /* GL_FRAMEBUFFER_STATUS_ERROR_EXT */
+   { 14516, 0x00008219 }, /* GL_FRAMEBUFFER_UNDEFINED */
+   { 14541, 0x00008CDD }, /* GL_FRAMEBUFFER_UNSUPPORTED */
+   { 14568, 0x00008CDD }, /* GL_FRAMEBUFFER_UNSUPPORTED_EXT */
+   { 14599, 0x00008CDD }, /* GL_FRAMEBUFFER_UNSUPPORTED_OES */
+   { 14630, 0x00000404 }, /* GL_FRONT */
+   { 14639, 0x00000408 }, /* GL_FRONT_AND_BACK */
+   { 14657, 0x00000B46 }, /* GL_FRONT_FACE */
+   { 14671, 0x00000400 }, /* GL_FRONT_LEFT */
+   { 14685, 0x00000401 }, /* GL_FRONT_RIGHT */
+   { 14700, 0x00008006 }, /* GL_FUNC_ADD */
+   { 14712, 0x00008006 }, /* GL_FUNC_ADD_EXT */
+   { 14728, 0x00008006 }, /* GL_FUNC_ADD_OES */
+   { 14744, 0x0000800B }, /* GL_FUNC_REVERSE_SUBTRACT */
+   { 14769, 0x0000800B }, /* GL_FUNC_REVERSE_SUBTRACT_EXT */
+   { 14798, 0x0000800B }, /* GL_FUNC_REVERSE_SUBTRACT_OES */
+   { 14827, 0x0000800A }, /* GL_FUNC_SUBTRACT */
+   { 14844, 0x0000800A }, /* GL_FUNC_SUBTRACT_EXT */
+   { 14865, 0x0000800A }, /* GL_FUNC_SUBTRACT_OES */
+   { 14886, 0x00008191 }, /* GL_GENERATE_MIPMAP */
+   { 14905, 0x00008192 }, /* GL_GENERATE_MIPMAP_HINT */
+   { 14929, 0x00008192 }, /* GL_GENERATE_MIPMAP_HINT_SGIS */
+   { 14958, 0x00008191 }, /* GL_GENERATE_MIPMAP_SGIS */
+   { 14982, 0x00008917 }, /* GL_GEOMETRY_INPUT_TYPE */
+   { 15005, 0x00008DDB }, /* GL_GEOMETRY_INPUT_TYPE_ARB */
+   { 15032, 0x00008918 }, /* GL_GEOMETRY_OUTPUT_TYPE */
+   { 15056, 0x00008DDC }, /* GL_GEOMETRY_OUTPUT_TYPE_ARB */
+   { 15084, 0x00008DD9 }, /* GL_GEOMETRY_SHADER */
+   { 15103, 0x00008DD9 }, /* GL_GEOMETRY_SHADER_ARB */
+   { 15126, 0x00008916 }, /* GL_GEOMETRY_VERTICES_OUT */
+   { 15151, 0x00008DDA }, /* GL_GEOMETRY_VERTICES_OUT_ARB */
+   { 15180, 0x00000206 }, /* GL_GEQUAL */
+   { 15190, 0x00000204 }, /* GL_GREATER */
+   { 15201, 0x00001904 }, /* GL_GREEN */
+   { 15210, 0x00000D19 }, /* GL_GREEN_BIAS */
+   { 15224, 0x00000D53 }, /* GL_GREEN_BITS */
+   { 15238, 0x00008D95 }, /* GL_GREEN_INTEGER */
+   { 15255, 0x00008D95 }, /* GL_GREEN_INTEGER_EXT */
+   { 15276, 0x00000D18 }, /* GL_GREEN_SCALE */
+   { 15291, 0x0000140B }, /* GL_HALF_FLOAT */
+   { 15305, 0x00008D61 }, /* GL_HALF_FLOAT_OES */
+   { 15323, 0x00008DF2 }, /* GL_HIGH_FLOAT */
+   { 15337, 0x00008DF5 }, /* GL_HIGH_INT */
+   { 15349, 0x00008000 }, /* GL_HINT_BIT */
+   { 15361, 0x00008024 }, /* GL_HISTOGRAM */
+   { 15374, 0x0000802B }, /* GL_HISTOGRAM_ALPHA_SIZE */
+   { 15398, 0x0000802B }, /* GL_HISTOGRAM_ALPHA_SIZE_EXT */
+   { 15426, 0x0000802A }, /* GL_HISTOGRAM_BLUE_SIZE */
+   { 15449, 0x0000802A }, /* GL_HISTOGRAM_BLUE_SIZE_EXT */
+   { 15476, 0x00008024 }, /* GL_HISTOGRAM_EXT */
+   { 15493, 0x00008027 }, /* GL_HISTOGRAM_FORMAT */
+   { 15513, 0x00008027 }, /* GL_HISTOGRAM_FORMAT_EXT */
+   { 15537, 0x00008029 }, /* GL_HISTOGRAM_GREEN_SIZE */
+   { 15561, 0x00008029 }, /* GL_HISTOGRAM_GREEN_SIZE_EXT */
+   { 15589, 0x0000802C }, /* GL_HISTOGRAM_LUMINANCE_SIZE */
+   { 15617, 0x0000802C }, /* GL_HISTOGRAM_LUMINANCE_SIZE_EXT */
+   { 15649, 0x00008028 }, /* GL_HISTOGRAM_RED_SIZE */
+   { 15671, 0x00008028 }, /* GL_HISTOGRAM_RED_SIZE_EXT */
+   { 15697, 0x0000802D }, /* GL_HISTOGRAM_SINK */
+   { 15715, 0x0000802D }, /* GL_HISTOGRAM_SINK_EXT */
+   { 15737, 0x00008026 }, /* GL_HISTOGRAM_WIDTH */
+   { 15756, 0x00008026 }, /* GL_HISTOGRAM_WIDTH_EXT */
+   { 15779, 0x0000862A }, /* GL_IDENTITY_NV */
+   { 15794, 0x00008150 }, /* GL_IGNORE_BORDER_HP */
+   { 15814, 0x00008B9B }, /* GL_IMPLEMENTATION_COLOR_READ_FORMAT */
+   { 15850, 0x00008B9B }, /* GL_IMPLEMENTATION_COLOR_READ_FORMAT_OES */
+   { 15890, 0x00008B9A }, /* GL_IMPLEMENTATION_COLOR_READ_TYPE */
+   { 15924, 0x00008B9A }, /* GL_IMPLEMENTATION_COLOR_READ_TYPE_OES */
+   { 15962, 0x00001E02 }, /* GL_INCR */
+   { 15970, 0x00008507 }, /* GL_INCR_WRAP */
+   { 15983, 0x00008507 }, /* GL_INCR_WRAP_EXT */
+   { 16000, 0x00008222 }, /* GL_INDEX */
+   { 16009, 0x00008077 }, /* GL_INDEX_ARRAY */
+   { 16024, 0x00008899 }, /* GL_INDEX_ARRAY_BUFFER_BINDING */
+   { 16054, 0x00008899 }, /* GL_INDEX_ARRAY_BUFFER_BINDING_ARB */
+   { 16088, 0x00008091 }, /* GL_INDEX_ARRAY_POINTER */
+   { 16111, 0x00008086 }, /* GL_INDEX_ARRAY_STRIDE */
+   { 16133, 0x00008085 }, /* GL_INDEX_ARRAY_TYPE */
+   { 16153, 0x00000D51 }, /* GL_INDEX_BITS */
+   { 16167, 0x00000C20 }, /* GL_INDEX_CLEAR_VALUE */
+   { 16188, 0x00000BF1 }, /* GL_INDEX_LOGIC_OP */
+   { 16206, 0x00000C30 }, /* GL_INDEX_MODE */
+   { 16220, 0x00000D13 }, /* GL_INDEX_OFFSET */
+   { 16236, 0x00000D12 }, /* GL_INDEX_SHIFT */
+   { 16251, 0x00000C21 }, /* GL_INDEX_WRITEMASK */
+   { 16270, 0x00008B84 }, /* GL_INFO_LOG_LENGTH */
+   { 16289, 0x00001404 }, /* GL_INT */
+   { 16296, 0x00008049 }, /* GL_INTENSITY */
+   { 16309, 0x0000804C }, /* GL_INTENSITY12 */
+   { 16324, 0x0000804C }, /* GL_INTENSITY12_EXT */
+   { 16343, 0x0000804D }, /* GL_INTENSITY16 */
+   { 16358, 0x00008D8B }, /* GL_INTENSITY16I_EXT */
+   { 16378, 0x00008D79 }, /* GL_INTENSITY16UI_EXT */
+   { 16399, 0x0000804D }, /* GL_INTENSITY16_EXT */
+   { 16418, 0x00008D85 }, /* GL_INTENSITY32I_EXT */
+   { 16438, 0x00008D73 }, /* GL_INTENSITY32UI_EXT */
+   { 16459, 0x0000804A }, /* GL_INTENSITY4 */
+   { 16473, 0x0000804A }, /* GL_INTENSITY4_EXT */
+   { 16491, 0x0000804B }, /* GL_INTENSITY8 */
+   { 16505, 0x00008D91 }, /* GL_INTENSITY8I_EXT */
+   { 16524, 0x00008D7F }, /* GL_INTENSITY8UI_EXT */
+   { 16544, 0x0000804B }, /* GL_INTENSITY8_EXT */
+   { 16562, 0x00008049 }, /* GL_INTENSITY_EXT */
+   { 16579, 0x00008C8C }, /* GL_INTERLEAVED_ATTRIBS */
+   { 16602, 0x00008C8C }, /* GL_INTERLEAVED_ATTRIBS_EXT */
+   { 16629, 0x00008575 }, /* GL_INTERPOLATE */
+   { 16644, 0x00008575 }, /* GL_INTERPOLATE_ARB */
+   { 16663, 0x00008575 }, /* GL_INTERPOLATE_EXT */
+   { 16682, 0x00008DF7 }, /* GL_INT_10_10_10_2_OES */
+   { 16704, 0x00008DC9 }, /* GL_INT_SAMPLER_1D */
+   { 16722, 0x00008DCE }, /* GL_INT_SAMPLER_1D_ARRAY */
+   { 16746, 0x00008DCE }, /* GL_INT_SAMPLER_1D_ARRAY_EXT */
+   { 16774, 0x00008DC9 }, /* GL_INT_SAMPLER_1D_EXT */
+   { 16796, 0x00008DCA }, /* GL_INT_SAMPLER_2D */
+   { 16814, 0x00008DCF }, /* GL_INT_SAMPLER_2D_ARRAY */
+   { 16838, 0x00008DCF }, /* GL_INT_SAMPLER_2D_ARRAY_EXT */
+   { 16866, 0x00008DCA }, /* GL_INT_SAMPLER_2D_EXT */
+   { 16888, 0x00008DCD }, /* GL_INT_SAMPLER_2D_RECT */
+   { 16911, 0x00008DCD }, /* GL_INT_SAMPLER_2D_RECT_EXT */
+   { 16938, 0x00008DCB }, /* GL_INT_SAMPLER_3D */
+   { 16956, 0x00008DCB }, /* GL_INT_SAMPLER_3D_EXT */
+   { 16978, 0x00008DD0 }, /* GL_INT_SAMPLER_BUFFER */
+   { 17000, 0x00008DD0 }, /* GL_INT_SAMPLER_BUFFER_EXT */
+   { 17026, 0x00008DCC }, /* GL_INT_SAMPLER_CUBE */
+   { 17046, 0x00008DCC }, /* GL_INT_SAMPLER_CUBE_EXT */
+   { 17070, 0x00008B53 }, /* GL_INT_VEC2 */
+   { 17082, 0x00008B53 }, /* GL_INT_VEC2_ARB */
+   { 17098, 0x00008B54 }, /* GL_INT_VEC3 */
+   { 17110, 0x00008B54 }, /* GL_INT_VEC3_ARB */
+   { 17126, 0x00008B55 }, /* GL_INT_VEC4 */
+   { 17138, 0x00008B55 }, /* GL_INT_VEC4_ARB */
+   { 17154, 0x00000500 }, /* GL_INVALID_ENUM */
+   { 17170, 0x00000506 }, /* GL_INVALID_FRAMEBUFFER_OPERATION */
+   { 17203, 0x00000506 }, /* GL_INVALID_FRAMEBUFFER_OPERATION_EXT */
+   { 17240, 0x00000506 }, /* GL_INVALID_FRAMEBUFFER_OPERATION_OES */
+   { 17277, 0x00000502 }, /* GL_INVALID_OPERATION */
+   { 17298, 0x00000501 }, /* GL_INVALID_VALUE */
+   { 17315, 0x0000862B }, /* GL_INVERSE_NV */
+   { 17329, 0x0000862D }, /* GL_INVERSE_TRANSPOSE_NV */
+   { 17353, 0x0000150A }, /* GL_INVERT */
+   { 17363, 0x00001E00 }, /* GL_KEEP */
+   { 17371, 0x00008E4E }, /* GL_LAST_VERTEX_CONVENTION */
+   { 17397, 0x00008E4E }, /* GL_LAST_VERTEX_CONVENTION_EXT */
+   { 17427, 0x00000406 }, /* GL_LEFT */
+   { 17435, 0x00000203 }, /* GL_LEQUAL */
+   { 17445, 0x00000201 }, /* GL_LESS */
+   { 17453, 0x00004000 }, /* GL_LIGHT0 */
+   { 17463, 0x00004001 }, /* GL_LIGHT1 */
+   { 17473, 0x00004002 }, /* GL_LIGHT2 */
+   { 17483, 0x00004003 }, /* GL_LIGHT3 */
+   { 17493, 0x00004004 }, /* GL_LIGHT4 */
+   { 17503, 0x00004005 }, /* GL_LIGHT5 */
+   { 17513, 0x00004006 }, /* GL_LIGHT6 */
+   { 17523, 0x00004007 }, /* GL_LIGHT7 */
+   { 17533, 0x00000B50 }, /* GL_LIGHTING */
+   { 17545, 0x00000040 }, /* GL_LIGHTING_BIT */
+   { 17561, 0x00000B53 }, /* GL_LIGHT_MODEL_AMBIENT */
+   { 17584, 0x000081F8 }, /* GL_LIGHT_MODEL_COLOR_CONTROL */
+   { 17613, 0x000081F8 }, /* GL_LIGHT_MODEL_COLOR_CONTROL_EXT */
+   { 17646, 0x00000B51 }, /* GL_LIGHT_MODEL_LOCAL_VIEWER */
+   { 17674, 0x00000B52 }, /* GL_LIGHT_MODEL_TWO_SIDE */
+   { 17698, 0x00001B01 }, /* GL_LINE */
+   { 17706, 0x00002601 }, /* GL_LINEAR */
+   { 17716, 0x00001208 }, /* GL_LINEAR_ATTENUATION */
+   { 17738, 0x00008170 }, /* GL_LINEAR_CLIPMAP_LINEAR_SGIX */
+   { 17768, 0x0000844F }, /* GL_LINEAR_CLIPMAP_NEAREST_SGIX */
+   { 17799, 0x00002703 }, /* GL_LINEAR_MIPMAP_LINEAR */
+   { 17823, 0x00002701 }, /* GL_LINEAR_MIPMAP_NEAREST */
+   { 17848, 0x00000001 }, /* GL_LINES */
+   { 17857, 0x0000000A }, /* GL_LINES_ADJACENCY */
+   { 17876, 0x0000000A }, /* GL_LINES_ADJACENCY_ARB */
+   { 17899, 0x00000004 }, /* GL_LINE_BIT */
+   { 17911, 0x00000002 }, /* GL_LINE_LOOP */
+   { 17924, 0x00000707 }, /* GL_LINE_RESET_TOKEN */
+   { 17944, 0x00000B20 }, /* GL_LINE_SMOOTH */
+   { 17959, 0x00000C52 }, /* GL_LINE_SMOOTH_HINT */
+   { 17979, 0x00000B24 }, /* GL_LINE_STIPPLE */
+   { 17995, 0x00000B25 }, /* GL_LINE_STIPPLE_PATTERN */
+   { 18019, 0x00000B26 }, /* GL_LINE_STIPPLE_REPEAT */
+   { 18042, 0x00000003 }, /* GL_LINE_STRIP */
+   { 18056, 0x0000000B }, /* GL_LINE_STRIP_ADJACENCY */
+   { 18080, 0x0000000B }, /* GL_LINE_STRIP_ADJACENCY_ARB */
+   { 18108, 0x00000702 }, /* GL_LINE_TOKEN */
+   { 18122, 0x00000B21 }, /* GL_LINE_WIDTH */
+   { 18136, 0x00000B23 }, /* GL_LINE_WIDTH_GRANULARITY */
+   { 18162, 0x00000B22 }, /* GL_LINE_WIDTH_RANGE */
+   { 18182, 0x00008B82 }, /* GL_LINK_STATUS */
+   { 18197, 0x00000B32 }, /* GL_LIST_BASE */
+   { 18210, 0x00020000 }, /* GL_LIST_BIT */
+   { 18222, 0x00000B33 }, /* GL_LIST_INDEX */
+   { 18236, 0x00000B30 }, /* GL_LIST_MODE */
+   { 18249, 0x00000101 }, /* GL_LOAD */
+   { 18257, 0x00000BF1 }, /* GL_LOGIC_OP */
+   { 18269, 0x00000BF0 }, /* GL_LOGIC_OP_MODE */
+   { 18286, 0x00008CA1 }, /* GL_LOWER_LEFT */
+   { 18300, 0x00008DF0 }, /* GL_LOW_FLOAT */
+   { 18313, 0x00008DF3 }, /* GL_LOW_INT */
+   { 18324, 0x00001909 }, /* GL_LUMINANCE */
+   { 18337, 0x00008041 }, /* GL_LUMINANCE12 */
+   { 18352, 0x00008047 }, /* GL_LUMINANCE12_ALPHA12 */
+   { 18375, 0x00008047 }, /* GL_LUMINANCE12_ALPHA12_EXT */
+   { 18402, 0x00008046 }, /* GL_LUMINANCE12_ALPHA4 */
+   { 18424, 0x00008046 }, /* GL_LUMINANCE12_ALPHA4_EXT */
+   { 18450, 0x00008041 }, /* GL_LUMINANCE12_EXT */
+   { 18469, 0x00008042 }, /* GL_LUMINANCE16 */
+   { 18484, 0x00008D8C }, /* GL_LUMINANCE16I_EXT */
+   { 18504, 0x00008D7A }, /* GL_LUMINANCE16UI_EXT */
+   { 18525, 0x00008048 }, /* GL_LUMINANCE16_ALPHA16 */
+   { 18548, 0x00008048 }, /* GL_LUMINANCE16_ALPHA16_EXT */
+   { 18575, 0x00008042 }, /* GL_LUMINANCE16_EXT */
+   { 18594, 0x00008D86 }, /* GL_LUMINANCE32I_EXT */
+   { 18614, 0x00008D74 }, /* GL_LUMINANCE32UI_EXT */
+   { 18635, 0x0000803F }, /* GL_LUMINANCE4 */
+   { 18649, 0x00008043 }, /* GL_LUMINANCE4_ALPHA4 */
+   { 18670, 0x00008043 }, /* GL_LUMINANCE4_ALPHA4_EXT */
+   { 18695, 0x0000803F }, /* GL_LUMINANCE4_EXT */
+   { 18713, 0x00008044 }, /* GL_LUMINANCE6_ALPHA2 */
+   { 18734, 0x00008044 }, /* GL_LUMINANCE6_ALPHA2_EXT */
+   { 18759, 0x00008040 }, /* GL_LUMINANCE8 */
+   { 18773, 0x00008D92 }, /* GL_LUMINANCE8I_EXT */
+   { 18792, 0x00008D80 }, /* GL_LUMINANCE8UI_EXT */
+   { 18812, 0x00008045 }, /* GL_LUMINANCE8_ALPHA8 */
+   { 18833, 0x00008045 }, /* GL_LUMINANCE8_ALPHA8_EXT */
+   { 18858, 0x00008040 }, /* GL_LUMINANCE8_EXT */
+   { 18876, 0x0000190A }, /* GL_LUMINANCE_ALPHA */
+   { 18895, 0x00008D8D }, /* GL_LUMINANCE_ALPHA16I_EXT */
+   { 18921, 0x00008D7B }, /* GL_LUMINANCE_ALPHA16UI_EXT */
+   { 18948, 0x00008D87 }, /* GL_LUMINANCE_ALPHA32I_EXT */
+   { 18974, 0x00008D75 }, /* GL_LUMINANCE_ALPHA32UI_EXT */
+   { 19001, 0x00008D93 }, /* GL_LUMINANCE_ALPHA8I_EXT */
+   { 19026, 0x00008D81 }, /* GL_LUMINANCE_ALPHA8UI_EXT */
+   { 19052, 0x00008D9D }, /* GL_LUMINANCE_ALPHA_INTEGER_EXT */
+   { 19083, 0x00008D9C }, /* GL_LUMINANCE_INTEGER_EXT */
+   { 19108, 0x0000821B }, /* GL_MAJOR_VERSION */
+   { 19125, 0x00000D90 }, /* GL_MAP1_COLOR_4 */
+   { 19141, 0x00000DD0 }, /* GL_MAP1_GRID_DOMAIN */
+   { 19161, 0x00000DD1 }, /* GL_MAP1_GRID_SEGMENTS */
+   { 19183, 0x00000D91 }, /* GL_MAP1_INDEX */
+   { 19197, 0x00000D92 }, /* GL_MAP1_NORMAL */
+   { 19212, 0x00000D93 }, /* GL_MAP1_TEXTURE_COORD_1 */
+   { 19236, 0x00000D94 }, /* GL_MAP1_TEXTURE_COORD_2 */
+   { 19260, 0x00000D95 }, /* GL_MAP1_TEXTURE_COORD_3 */
+   { 19284, 0x00000D96 }, /* GL_MAP1_TEXTURE_COORD_4 */
+   { 19308, 0x00000D97 }, /* GL_MAP1_VERTEX_3 */
+   { 19325, 0x00000D98 }, /* GL_MAP1_VERTEX_4 */
+   { 19342, 0x00008660 }, /* GL_MAP1_VERTEX_ATTRIB0_4_NV */
+   { 19370, 0x0000866A }, /* GL_MAP1_VERTEX_ATTRIB10_4_NV */
+   { 19399, 0x0000866B }, /* GL_MAP1_VERTEX_ATTRIB11_4_NV */
+   { 19428, 0x0000866C }, /* GL_MAP1_VERTEX_ATTRIB12_4_NV */
+   { 19457, 0x0000866D }, /* GL_MAP1_VERTEX_ATTRIB13_4_NV */
+   { 19486, 0x0000866E }, /* GL_MAP1_VERTEX_ATTRIB14_4_NV */
+   { 19515, 0x0000866F }, /* GL_MAP1_VERTEX_ATTRIB15_4_NV */
+   { 19544, 0x00008661 }, /* GL_MAP1_VERTEX_ATTRIB1_4_NV */
+   { 19572, 0x00008662 }, /* GL_MAP1_VERTEX_ATTRIB2_4_NV */
+   { 19600, 0x00008663 }, /* GL_MAP1_VERTEX_ATTRIB3_4_NV */
+   { 19628, 0x00008664 }, /* GL_MAP1_VERTEX_ATTRIB4_4_NV */
+   { 19656, 0x00008665 }, /* GL_MAP1_VERTEX_ATTRIB5_4_NV */
+   { 19684, 0x00008666 }, /* GL_MAP1_VERTEX_ATTRIB6_4_NV */
+   { 19712, 0x00008667 }, /* GL_MAP1_VERTEX_ATTRIB7_4_NV */
+   { 19740, 0x00008668 }, /* GL_MAP1_VERTEX_ATTRIB8_4_NV */
+   { 19768, 0x00008669 }, /* GL_MAP1_VERTEX_ATTRIB9_4_NV */
+   { 19796, 0x00000DB0 }, /* GL_MAP2_COLOR_4 */
+   { 19812, 0x00000DD2 }, /* GL_MAP2_GRID_DOMAIN */
+   { 19832, 0x00000DD3 }, /* GL_MAP2_GRID_SEGMENTS */
+   { 19854, 0x00000DB1 }, /* GL_MAP2_INDEX */
+   { 19868, 0x00000DB2 }, /* GL_MAP2_NORMAL */
+   { 19883, 0x00000DB3 }, /* GL_MAP2_TEXTURE_COORD_1 */
+   { 19907, 0x00000DB4 }, /* GL_MAP2_TEXTURE_COORD_2 */
+   { 19931, 0x00000DB5 }, /* GL_MAP2_TEXTURE_COORD_3 */
+   { 19955, 0x00000DB6 }, /* GL_MAP2_TEXTURE_COORD_4 */
+   { 19979, 0x00000DB7 }, /* GL_MAP2_VERTEX_3 */
+   { 19996, 0x00000DB8 }, /* GL_MAP2_VERTEX_4 */
+   { 20013, 0x00008670 }, /* GL_MAP2_VERTEX_ATTRIB0_4_NV */
+   { 20041, 0x0000867A }, /* GL_MAP2_VERTEX_ATTRIB10_4_NV */
+   { 20070, 0x0000867B }, /* GL_MAP2_VERTEX_ATTRIB11_4_NV */
+   { 20099, 0x0000867C }, /* GL_MAP2_VERTEX_ATTRIB12_4_NV */
+   { 20128, 0x0000867D }, /* GL_MAP2_VERTEX_ATTRIB13_4_NV */
+   { 20157, 0x0000867E }, /* GL_MAP2_VERTEX_ATTRIB14_4_NV */
+   { 20186, 0x0000867F }, /* GL_MAP2_VERTEX_ATTRIB15_4_NV */
+   { 20215, 0x00008671 }, /* GL_MAP2_VERTEX_ATTRIB1_4_NV */
+   { 20243, 0x00008672 }, /* GL_MAP2_VERTEX_ATTRIB2_4_NV */
+   { 20271, 0x00008673 }, /* GL_MAP2_VERTEX_ATTRIB3_4_NV */
+   { 20299, 0x00008674 }, /* GL_MAP2_VERTEX_ATTRIB4_4_NV */
+   { 20327, 0x00008675 }, /* GL_MAP2_VERTEX_ATTRIB5_4_NV */
+   { 20355, 0x00008676 }, /* GL_MAP2_VERTEX_ATTRIB6_4_NV */
+   { 20383, 0x00008677 }, /* GL_MAP2_VERTEX_ATTRIB7_4_NV */
+   { 20411, 0x00008678 }, /* GL_MAP2_VERTEX_ATTRIB8_4_NV */
+   { 20439, 0x00008679 }, /* GL_MAP2_VERTEX_ATTRIB9_4_NV */
+   { 20467, 0x00000D10 }, /* GL_MAP_COLOR */
+   { 20480, 0x00000010 }, /* GL_MAP_FLUSH_EXPLICIT_BIT */
+   { 20506, 0x00000008 }, /* GL_MAP_INVALIDATE_BUFFER_BIT */
+   { 20535, 0x00000004 }, /* GL_MAP_INVALIDATE_RANGE_BIT */
+   { 20563, 0x00000001 }, /* GL_MAP_READ_BIT */
+   { 20579, 0x00000D11 }, /* GL_MAP_STENCIL */
+   { 20594, 0x00000020 }, /* GL_MAP_UNSYNCHRONIZED_BIT */
+   { 20620, 0x00000002 }, /* GL_MAP_WRITE_BIT */
+   { 20637, 0x000088C0 }, /* GL_MATRIX0_ARB */
+   { 20652, 0x00008630 }, /* GL_MATRIX0_NV */
+   { 20666, 0x000088CA }, /* GL_MATRIX10_ARB */
+   { 20682, 0x000088CB }, /* GL_MATRIX11_ARB */
+   { 20698, 0x000088CC }, /* GL_MATRIX12_ARB */
+   { 20714, 0x000088CD }, /* GL_MATRIX13_ARB */
+   { 20730, 0x000088CE }, /* GL_MATRIX14_ARB */
+   { 20746, 0x000088CF }, /* GL_MATRIX15_ARB */
+   { 20762, 0x000088D0 }, /* GL_MATRIX16_ARB */
+   { 20778, 0x000088D1 }, /* GL_MATRIX17_ARB */
+   { 20794, 0x000088D2 }, /* GL_MATRIX18_ARB */
+   { 20810, 0x000088D3 }, /* GL_MATRIX19_ARB */
+   { 20826, 0x000088C1 }, /* GL_MATRIX1_ARB */
+   { 20841, 0x00008631 }, /* GL_MATRIX1_NV */
+   { 20855, 0x000088D4 }, /* GL_MATRIX20_ARB */
+   { 20871, 0x000088D5 }, /* GL_MATRIX21_ARB */
+   { 20887, 0x000088D6 }, /* GL_MATRIX22_ARB */
+   { 20903, 0x000088D7 }, /* GL_MATRIX23_ARB */
+   { 20919, 0x000088D8 }, /* GL_MATRIX24_ARB */
+   { 20935, 0x000088D9 }, /* GL_MATRIX25_ARB */
+   { 20951, 0x000088DA }, /* GL_MATRIX26_ARB */
+   { 20967, 0x000088DB }, /* GL_MATRIX27_ARB */
+   { 20983, 0x000088DC }, /* GL_MATRIX28_ARB */
+   { 20999, 0x000088DD }, /* GL_MATRIX29_ARB */
+   { 21015, 0x000088C2 }, /* GL_MATRIX2_ARB */
+   { 21030, 0x00008632 }, /* GL_MATRIX2_NV */
+   { 21044, 0x000088DE }, /* GL_MATRIX30_ARB */
+   { 21060, 0x000088DF }, /* GL_MATRIX31_ARB */
+   { 21076, 0x000088C3 }, /* GL_MATRIX3_ARB */
+   { 21091, 0x00008633 }, /* GL_MATRIX3_NV */
+   { 21105, 0x000088C4 }, /* GL_MATRIX4_ARB */
+   { 21120, 0x00008634 }, /* GL_MATRIX4_NV */
+   { 21134, 0x000088C5 }, /* GL_MATRIX5_ARB */
+   { 21149, 0x00008635 }, /* GL_MATRIX5_NV */
+   { 21163, 0x000088C6 }, /* GL_MATRIX6_ARB */
+   { 21178, 0x00008636 }, /* GL_MATRIX6_NV */
+   { 21192, 0x000088C7 }, /* GL_MATRIX7_ARB */
+   { 21207, 0x00008637 }, /* GL_MATRIX7_NV */
+   { 21221, 0x000088C8 }, /* GL_MATRIX8_ARB */
+   { 21236, 0x000088C9 }, /* GL_MATRIX9_ARB */
+   { 21251, 0x00008844 }, /* GL_MATRIX_INDEX_ARRAY_ARB */
+   { 21277, 0x00008B9E }, /* GL_MATRIX_INDEX_ARRAY_BUFFER_BINDING_OES */
+   { 21318, 0x00008844 }, /* GL_MATRIX_INDEX_ARRAY_OES */
+   { 21344, 0x00008849 }, /* GL_MATRIX_INDEX_ARRAY_POINTER_ARB */
+   { 21378, 0x00008849 }, /* GL_MATRIX_INDEX_ARRAY_POINTER_OES */
+   { 21412, 0x00008846 }, /* GL_MATRIX_INDEX_ARRAY_SIZE_ARB */
+   { 21443, 0x00008846 }, /* GL_MATRIX_INDEX_ARRAY_SIZE_OES */
+   { 21474, 0x00008848 }, /* GL_MATRIX_INDEX_ARRAY_STRIDE_ARB */
+   { 21507, 0x00008848 }, /* GL_MATRIX_INDEX_ARRAY_STRIDE_OES */
+   { 21540, 0x00008847 }, /* GL_MATRIX_INDEX_ARRAY_TYPE_ARB */
+   { 21571, 0x00008847 }, /* GL_MATRIX_INDEX_ARRAY_TYPE_OES */
+   { 21602, 0x00000BA0 }, /* GL_MATRIX_MODE */
+   { 21617, 0x00008840 }, /* GL_MATRIX_PALETTE_ARB */
+   { 21639, 0x00008840 }, /* GL_MATRIX_PALETTE_OES */
+   { 21661, 0x00008008 }, /* GL_MAX */
+   { 21668, 0x00008073 }, /* GL_MAX_3D_TEXTURE_SIZE */
+   { 21691, 0x00008073 }, /* GL_MAX_3D_TEXTURE_SIZE_OES */
+   { 21718, 0x000088FF }, /* GL_MAX_ARRAY_TEXTURE_LAYERS */
+   { 21746, 0x000088FF }, /* GL_MAX_ARRAY_TEXTURE_LAYERS_EXT */
+   { 21778, 0x00000D35 }, /* GL_MAX_ATTRIB_STACK_DEPTH */
+   { 21804, 0x00000D3B }, /* GL_MAX_CLIENT_ATTRIB_STACK_DEPTH */
+   { 21837, 0x00008177 }, /* GL_MAX_CLIPMAP_DEPTH_SGIX */
+   { 21863, 0x00008178 }, /* GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX */
+   { 21897, 0x00000D32 }, /* GL_MAX_CLIP_DISTANCES */
+   { 21919, 0x00000D32 }, /* GL_MAX_CLIP_PLANES */
+   { 21938, 0x00008CDF }, /* GL_MAX_COLOR_ATTACHMENTS */
+   { 21963, 0x00008CDF }, /* GL_MAX_COLOR_ATTACHMENTS_EXT */
+   { 21992, 0x000080B3 }, /* GL_MAX_COLOR_MATRIX_STACK_DEPTH */
+   { 22024, 0x000080B3 }, /* GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI */
+   { 22060, 0x00008B4D }, /* GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS */
+   { 22096, 0x00008B4D }, /* GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB */
+   { 22136, 0x0000801B }, /* GL_MAX_CONVOLUTION_HEIGHT */
+   { 22162, 0x0000801B }, /* GL_MAX_CONVOLUTION_HEIGHT_EXT */
+   { 22192, 0x0000801A }, /* GL_MAX_CONVOLUTION_WIDTH */
+   { 22217, 0x0000801A }, /* GL_MAX_CONVOLUTION_WIDTH_EXT */
+   { 22246, 0x0000851C }, /* GL_MAX_CUBE_MAP_TEXTURE_SIZE */
+   { 22275, 0x0000851C }, /* GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB */
+   { 22308, 0x0000851C }, /* GL_MAX_CUBE_MAP_TEXTURE_SIZE_OES */
+   { 22341, 0x00008824 }, /* GL_MAX_DRAW_BUFFERS */
+   { 22361, 0x00008824 }, /* GL_MAX_DRAW_BUFFERS_ARB */
+   { 22385, 0x00008824 }, /* GL_MAX_DRAW_BUFFERS_ATI */
+   { 22409, 0x000080E9 }, /* GL_MAX_ELEMENTS_INDICES */
+   { 22433, 0x000080E8 }, /* GL_MAX_ELEMENTS_VERTICES */
+   { 22458, 0x00000D30 }, /* GL_MAX_EVAL_ORDER */
+   { 22476, 0x00008008 }, /* GL_MAX_EXT */
+   { 22487, 0x00009125 }, /* GL_MAX_FRAGMENT_INPUT_COMPONENTS */
+   { 22520, 0x00008B49 }, /* GL_MAX_FRAGMENT_UNIFORM_COMPONENTS */
+   { 22555, 0x00008B49 }, /* GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB */
+   { 22594, 0x00008DFD }, /* GL_MAX_FRAGMENT_UNIFORM_VECTORS */
+   { 22626, 0x00009123 }, /* GL_MAX_GEOMETRY_INPUT_COMPONENTS */
+   { 22659, 0x00009124 }, /* GL_MAX_GEOMETRY_OUTPUT_COMPONENTS */
+   { 22693, 0x00008DE0 }, /* GL_MAX_GEOMETRY_OUTPUT_VERTICES */
+   { 22725, 0x00008DE0 }, /* GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB */
+   { 22761, 0x00008C29 }, /* GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS */
+   { 22797, 0x00008C29 }, /* GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB */
+   { 22837, 0x00008DE1 }, /* GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS */
+   { 22877, 0x00008DE1 }, /* GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB */
+   { 22921, 0x00008DDF }, /* GL_MAX_GEOMETRY_UNIFORM_COMPONENTS */
+   { 22956, 0x00008DDF }, /* GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB */
+   { 22995, 0x00008DDD }, /* GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB */
+   { 23034, 0x00000D31 }, /* GL_MAX_LIGHTS */
+   { 23048, 0x00000B31 }, /* GL_MAX_LIST_NESTING */
+   { 23068, 0x00008841 }, /* GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB */
+   { 23106, 0x00000D36 }, /* GL_MAX_MODELVIEW_STACK_DEPTH */
+   { 23135, 0x00000D37 }, /* GL_MAX_NAME_STACK_DEPTH */
+   { 23159, 0x00008842 }, /* GL_MAX_PALETTE_MATRICES_ARB */
+   { 23187, 0x00008842 }, /* GL_MAX_PALETTE_MATRICES_OES */
+   { 23215, 0x00000D34 }, /* GL_MAX_PIXEL_MAP_TABLE */
+   { 23238, 0x000088B1 }, /* GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB */
+   { 23275, 0x0000880B }, /* GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB */
+   { 23311, 0x000088AD }, /* GL_MAX_PROGRAM_ATTRIBS_ARB */
+   { 23338, 0x000088F5 }, /* GL_MAX_PROGRAM_CALL_DEPTH_NV */
+   { 23367, 0x000088B5 }, /* GL_MAX_PROGRAM_ENV_PARAMETERS_ARB */
+   { 23401, 0x000088F4 }, /* GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV */
+   { 23437, 0x000088F6 }, /* GL_MAX_PROGRAM_IF_DEPTH_NV */
+   { 23464, 0x000088A1 }, /* GL_MAX_PROGRAM_INSTRUCTIONS_ARB */
+   { 23496, 0x000088B4 }, /* GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB */
+   { 23532, 0x000088F8 }, /* GL_MAX_PROGRAM_LOOP_COUNT_NV */
+   { 23561, 0x000088F7 }, /* GL_MAX_PROGRAM_LOOP_DEPTH_NV */
+   { 23590, 0x0000862F }, /* GL_MAX_PROGRAM_MATRICES_ARB */
+   { 23618, 0x0000862E }, /* GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB */
+   { 23656, 0x000088B3 }, /* GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB */
+   { 23700, 0x0000880E }, /* GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB */
+   { 23743, 0x000088AF }, /* GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB */
+   { 23777, 0x000088A3 }, /* GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB */
+   { 23816, 0x000088AB }, /* GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB */
+   { 23853, 0x000088A7 }, /* GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB */
+   { 23891, 0x00008810 }, /* GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB */
+   { 23934, 0x0000880F }, /* GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB */
+   { 23977, 0x000088A9 }, /* GL_MAX_PROGRAM_PARAMETERS_ARB */
+   { 24007, 0x000088A5 }, /* GL_MAX_PROGRAM_TEMPORARIES_ARB */
+   { 24038, 0x00008905 }, /* GL_MAX_PROGRAM_TEXEL_OFFSET */
+   { 24066, 0x00008905 }, /* GL_MAX_PROGRAM_TEXEL_OFFSET_EXT */
+   { 24098, 0x0000880D }, /* GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB */
+   { 24134, 0x0000880C }, /* GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB */
+   { 24170, 0x00000D38 }, /* GL_MAX_PROJECTION_STACK_DEPTH */
+   { 24200, 0x000084F8 }, /* GL_MAX_RECTANGLE_TEXTURE_SIZE */
+   { 24230, 0x000084F8 }, /* GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB */
+   { 24264, 0x000084F8 }, /* GL_MAX_RECTANGLE_TEXTURE_SIZE_NV */
+   { 24297, 0x000084E8 }, /* GL_MAX_RENDERBUFFER_SIZE */
+   { 24322, 0x000084E8 }, /* GL_MAX_RENDERBUFFER_SIZE_EXT */
+   { 24351, 0x000084E8 }, /* GL_MAX_RENDERBUFFER_SIZE_OES */
+   { 24380, 0x00008D57 }, /* GL_MAX_SAMPLES */
+   { 24395, 0x00008D57 }, /* GL_MAX_SAMPLES_EXT */
+   { 24414, 0x00009111 }, /* GL_MAX_SERVER_WAIT_TIMEOUT */
+   { 24441, 0x00008504 }, /* GL_MAX_SHININESS_NV */
+   { 24461, 0x00008505 }, /* GL_MAX_SPOT_EXPONENT_NV */
+   { 24485, 0x00008C2B }, /* GL_MAX_TEXTURE_BUFFER_SIZE */
+   { 24512, 0x00008871 }, /* GL_MAX_TEXTURE_COORDS */
+   { 24534, 0x00008871 }, /* GL_MAX_TEXTURE_COORDS_ARB */
+   { 24560, 0x00008872 }, /* GL_MAX_TEXTURE_IMAGE_UNITS */
+   { 24587, 0x00008872 }, /* GL_MAX_TEXTURE_IMAGE_UNITS_ARB */
+   { 24618, 0x000084FD }, /* GL_MAX_TEXTURE_LOD_BIAS */
+   { 24642, 0x000084FD }, /* GL_MAX_TEXTURE_LOD_BIAS_EXT */
+   { 24670, 0x000084FF }, /* GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT */
+   { 24704, 0x00000D33 }, /* GL_MAX_TEXTURE_SIZE */
+   { 24724, 0x00000D39 }, /* GL_MAX_TEXTURE_STACK_DEPTH */
+   { 24751, 0x000084E2 }, /* GL_MAX_TEXTURE_UNITS */
+   { 24772, 0x000084E2 }, /* GL_MAX_TEXTURE_UNITS_ARB */
+   { 24797, 0x0000862F }, /* GL_MAX_TRACK_MATRICES_NV */
+   { 24822, 0x0000862E }, /* GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV */
+   { 24857, 0x00008C8A }, /* GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS */
+   { 24906, 0x00008C8A }, /* GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT */
+   { 24959, 0x00008C8B }, /* GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS */
+   { 25002, 0x00008C8B }, /* GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT */
+   { 25049, 0x00008C80 }, /* GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS */
+   { 25095, 0x00008C80 }, /* GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT */
+   { 25145, 0x00008B4B }, /* GL_MAX_VARYING_COMPONENTS */
+   { 25171, 0x00008B4B }, /* GL_MAX_VARYING_FLOATS */
+   { 25193, 0x00008B4B }, /* GL_MAX_VARYING_FLOATS_ARB */
+   { 25219, 0x00008DFC }, /* GL_MAX_VARYING_VECTORS */
+   { 25242, 0x00008869 }, /* GL_MAX_VERTEX_ATTRIBS */
+   { 25264, 0x00008869 }, /* GL_MAX_VERTEX_ATTRIBS_ARB */
+   { 25290, 0x00009122 }, /* GL_MAX_VERTEX_OUTPUT_COMPONENTS */
+   { 25322, 0x00008B4C }, /* GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS */
+   { 25356, 0x00008B4C }, /* GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB */
+   { 25394, 0x00008B4A }, /* GL_MAX_VERTEX_UNIFORM_COMPONENTS */
+   { 25427, 0x00008B4A }, /* GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB */
+   { 25464, 0x00008DFB }, /* GL_MAX_VERTEX_UNIFORM_VECTORS */
+   { 25494, 0x000086A4 }, /* GL_MAX_VERTEX_UNITS_ARB */
+   { 25518, 0x000086A4 }, /* GL_MAX_VERTEX_UNITS_OES */
+   { 25542, 0x00008DDE }, /* GL_MAX_VERTEX_VARYING_COMPONENTS_ARB */
+   { 25579, 0x00000D3A }, /* GL_MAX_VIEWPORT_DIMS */
+   { 25600, 0x00008DF1 }, /* GL_MEDIUM_FLOAT */
+   { 25616, 0x00008DF4 }, /* GL_MEDIUM_INT */
+   { 25630, 0x00008007 }, /* GL_MIN */
+   { 25637, 0x0000802E }, /* GL_MINMAX */
+   { 25647, 0x0000802E }, /* GL_MINMAX_EXT */
+   { 25661, 0x0000802F }, /* GL_MINMAX_FORMAT */
+   { 25678, 0x0000802F }, /* GL_MINMAX_FORMAT_EXT */
+   { 25699, 0x00008030 }, /* GL_MINMAX_SINK */
+   { 25714, 0x00008030 }, /* GL_MINMAX_SINK_EXT */
+   { 25733, 0x0000821C }, /* GL_MINOR_VERSION */
+   { 25750, 0x00008007 }, /* GL_MIN_EXT */
+   { 25761, 0x00008904 }, /* GL_MIN_PROGRAM_TEXEL_OFFSET */
+   { 25789, 0x00008904 }, /* GL_MIN_PROGRAM_TEXEL_OFFSET_EXT */
+   { 25821, 0x00008370 }, /* GL_MIRRORED_REPEAT */
+   { 25840, 0x00008370 }, /* GL_MIRRORED_REPEAT_ARB */
+   { 25863, 0x00008370 }, /* GL_MIRRORED_REPEAT_IBM */
+   { 25886, 0x00008742 }, /* GL_MIRROR_CLAMP_ATI */
+   { 25906, 0x00008742 }, /* GL_MIRROR_CLAMP_EXT */
+   { 25926, 0x00008912 }, /* GL_MIRROR_CLAMP_TO_BORDER_EXT */
+   { 25956, 0x00008743 }, /* GL_MIRROR_CLAMP_TO_EDGE_ATI */
+   { 25984, 0x00008743 }, /* GL_MIRROR_CLAMP_TO_EDGE_EXT */
+   { 26012, 0x00001700 }, /* GL_MODELVIEW */
+   { 26025, 0x00001700 }, /* GL_MODELVIEW0_ARB */
+   { 26043, 0x0000872A }, /* GL_MODELVIEW10_ARB */
+   { 26062, 0x0000872B }, /* GL_MODELVIEW11_ARB */
+   { 26081, 0x0000872C }, /* GL_MODELVIEW12_ARB */
+   { 26100, 0x0000872D }, /* GL_MODELVIEW13_ARB */
+   { 26119, 0x0000872E }, /* GL_MODELVIEW14_ARB */
+   { 26138, 0x0000872F }, /* GL_MODELVIEW15_ARB */
+   { 26157, 0x00008730 }, /* GL_MODELVIEW16_ARB */
+   { 26176, 0x00008731 }, /* GL_MODELVIEW17_ARB */
+   { 26195, 0x00008732 }, /* GL_MODELVIEW18_ARB */
+   { 26214, 0x00008733 }, /* GL_MODELVIEW19_ARB */
+   { 26233, 0x0000850A }, /* GL_MODELVIEW1_ARB */
+   { 26251, 0x00008734 }, /* GL_MODELVIEW20_ARB */
+   { 26270, 0x00008735 }, /* GL_MODELVIEW21_ARB */
+   { 26289, 0x00008736 }, /* GL_MODELVIEW22_ARB */
+   { 26308, 0x00008737 }, /* GL_MODELVIEW23_ARB */
+   { 26327, 0x00008738 }, /* GL_MODELVIEW24_ARB */
+   { 26346, 0x00008739 }, /* GL_MODELVIEW25_ARB */
+   { 26365, 0x0000873A }, /* GL_MODELVIEW26_ARB */
+   { 26384, 0x0000873B }, /* GL_MODELVIEW27_ARB */
+   { 26403, 0x0000873C }, /* GL_MODELVIEW28_ARB */
+   { 26422, 0x0000873D }, /* GL_MODELVIEW29_ARB */
+   { 26441, 0x00008722 }, /* GL_MODELVIEW2_ARB */
+   { 26459, 0x0000873E }, /* GL_MODELVIEW30_ARB */
+   { 26478, 0x0000873F }, /* GL_MODELVIEW31_ARB */
+   { 26497, 0x00008723 }, /* GL_MODELVIEW3_ARB */
+   { 26515, 0x00008724 }, /* GL_MODELVIEW4_ARB */
+   { 26533, 0x00008725 }, /* GL_MODELVIEW5_ARB */
+   { 26551, 0x00008726 }, /* GL_MODELVIEW6_ARB */
+   { 26569, 0x00008727 }, /* GL_MODELVIEW7_ARB */
+   { 26587, 0x00008728 }, /* GL_MODELVIEW8_ARB */
+   { 26605, 0x00008729 }, /* GL_MODELVIEW9_ARB */
+   { 26623, 0x00000BA6 }, /* GL_MODELVIEW_MATRIX */
+   { 26643, 0x0000898D }, /* GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES */
+   { 26685, 0x00008629 }, /* GL_MODELVIEW_PROJECTION_NV */
+   { 26712, 0x00000BA3 }, /* GL_MODELVIEW_STACK_DEPTH */
+   { 26737, 0x00002100 }, /* GL_MODULATE */
+   { 26749, 0x00008744 }, /* GL_MODULATE_ADD_ATI */
+   { 26769, 0x00008745 }, /* GL_MODULATE_SIGNED_ADD_ATI */
+   { 26796, 0x00008746 }, /* GL_MODULATE_SUBTRACT_ATI */
+   { 26821, 0x00000103 }, /* GL_MULT */
+   { 26829, 0x0000809D }, /* GL_MULTISAMPLE */
+   { 26844, 0x000086B2 }, /* GL_MULTISAMPLE_3DFX */
+   { 26864, 0x0000809D }, /* GL_MULTISAMPLE_ARB */
+   { 26883, 0x20000000 }, /* GL_MULTISAMPLE_BIT */
+   { 26902, 0x20000000 }, /* GL_MULTISAMPLE_BIT_3DFX */
+   { 26926, 0x20000000 }, /* GL_MULTISAMPLE_BIT_ARB */
+   { 26949, 0x00008534 }, /* GL_MULTISAMPLE_FILTER_HINT_NV */
+   { 26979, 0x00002A25 }, /* GL_N3F_V3F */
+   { 26990, 0x00000D70 }, /* GL_NAME_STACK_DEPTH */
+   { 27010, 0x0000150E }, /* GL_NAND */
+   { 27018, 0x00002600 }, /* GL_NEAREST */
+   { 27029, 0x0000844E }, /* GL_NEAREST_CLIPMAP_LINEAR_SGIX */
+   { 27060, 0x0000844D }, /* GL_NEAREST_CLIPMAP_NEAREST_SGIX */
+   { 27092, 0x00002702 }, /* GL_NEAREST_MIPMAP_LINEAR */
+   { 27117, 0x00002700 }, /* GL_NEAREST_MIPMAP_NEAREST */
+   { 27143, 0x00000200 }, /* GL_NEVER */
+   { 27152, 0x00001102 }, /* GL_NICEST */
+   { 27162, 0x00000000 }, /* GL_NONE */
+   { 27170, 0x00000000 }, /* GL_NONE_OES */
+   { 27182, 0x00001505 }, /* GL_NOOP */
+   { 27190, 0x00001508 }, /* GL_NOR */
+   { 27197, 0x00000BA1 }, /* GL_NORMALIZE */
+   { 27210, 0x00008075 }, /* GL_NORMAL_ARRAY */
+   { 27226, 0x00008897 }, /* GL_NORMAL_ARRAY_BUFFER_BINDING */
+   { 27257, 0x00008897 }, /* GL_NORMAL_ARRAY_BUFFER_BINDING_ARB */
+   { 27292, 0x0000808F }, /* GL_NORMAL_ARRAY_POINTER */
+   { 27316, 0x0000807F }, /* GL_NORMAL_ARRAY_STRIDE */
+   { 27339, 0x0000807E }, /* GL_NORMAL_ARRAY_TYPE */
+   { 27360, 0x00008511 }, /* GL_NORMAL_MAP */
+   { 27374, 0x00008511 }, /* GL_NORMAL_MAP_ARB */
+   { 27392, 0x00008511 }, /* GL_NORMAL_MAP_NV */
+   { 27409, 0x00008511 }, /* GL_NORMAL_MAP_OES */
+   { 27427, 0x00000205 }, /* GL_NOTEQUAL */
+   { 27439, 0x00000000 }, /* GL_NO_ERROR */
+   { 27451, 0x000086A2 }, /* GL_NUM_COMPRESSED_TEXTURE_FORMATS */
+   { 27485, 0x000086A2 }, /* GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB */
+   { 27523, 0x0000821D }, /* GL_NUM_EXTENSIONS */
+   { 27541, 0x000087FE }, /* GL_NUM_PROGRAM_BINARY_FORMATS_OES */
+   { 27575, 0x00008DF9 }, /* GL_NUM_SHADER_BINARY_FORMATS */
+   { 27604, 0x00008B89 }, /* GL_OBJECT_ACTIVE_ATTRIBUTES_ARB */
+   { 27636, 0x00008B8A }, /* GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB */
+   { 27678, 0x00008B86 }, /* GL_OBJECT_ACTIVE_UNIFORMS_ARB */
+   { 27708, 0x00008B87 }, /* GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB */
+   { 27748, 0x00008B85 }, /* GL_OBJECT_ATTACHED_OBJECTS_ARB */
+   { 27779, 0x00008B81 }, /* GL_OBJECT_COMPILE_STATUS_ARB */
+   { 27808, 0x00008B80 }, /* GL_OBJECT_DELETE_STATUS_ARB */
+   { 27836, 0x00008B84 }, /* GL_OBJECT_INFO_LOG_LENGTH_ARB */
+   { 27866, 0x00002401 }, /* GL_OBJECT_LINEAR */
+   { 27883, 0x00008B82 }, /* GL_OBJECT_LINK_STATUS_ARB */
+   { 27909, 0x00002501 }, /* GL_OBJECT_PLANE */
+   { 27925, 0x00008B88 }, /* GL_OBJECT_SHADER_SOURCE_LENGTH_ARB */
+   { 27960, 0x00008B4F }, /* GL_OBJECT_SUBTYPE_ARB */
+   { 27982, 0x00009112 }, /* GL_OBJECT_TYPE */
+   { 27997, 0x00008B4E }, /* GL_OBJECT_TYPE_ARB */
+   { 28016, 0x00008B83 }, /* GL_OBJECT_VALIDATE_STATUS_ARB */
+   { 28046, 0x00008165 }, /* GL_OCCLUSION_TEST_HP */
+   { 28067, 0x00008166 }, /* GL_OCCLUSION_TEST_RESULT_HP */
+   { 28095, 0x00000001 }, /* GL_ONE */
+   { 28102, 0x00008004 }, /* GL_ONE_MINUS_CONSTANT_ALPHA */
+   { 28130, 0x00008004 }, /* GL_ONE_MINUS_CONSTANT_ALPHA_EXT */
+   { 28162, 0x00008002 }, /* GL_ONE_MINUS_CONSTANT_COLOR */
+   { 28190, 0x00008002 }, /* GL_ONE_MINUS_CONSTANT_COLOR_EXT */
+   { 28222, 0x00000305 }, /* GL_ONE_MINUS_DST_ALPHA */
+   { 28245, 0x00000307 }, /* GL_ONE_MINUS_DST_COLOR */
+   { 28268, 0x00000303 }, /* GL_ONE_MINUS_SRC_ALPHA */
+   { 28291, 0x00000301 }, /* GL_ONE_MINUS_SRC_COLOR */
+   { 28314, 0x00008598 }, /* GL_OPERAND0_ALPHA */
+   { 28332, 0x00008598 }, /* GL_OPERAND0_ALPHA_ARB */
+   { 28354, 0x00008598 }, /* GL_OPERAND0_ALPHA_EXT */
+   { 28376, 0x00008590 }, /* GL_OPERAND0_RGB */
+   { 28392, 0x00008590 }, /* GL_OPERAND0_RGB_ARB */
+   { 28412, 0x00008590 }, /* GL_OPERAND0_RGB_EXT */
+   { 28432, 0x00008599 }, /* GL_OPERAND1_ALPHA */
+   { 28450, 0x00008599 }, /* GL_OPERAND1_ALPHA_ARB */
+   { 28472, 0x00008599 }, /* GL_OPERAND1_ALPHA_EXT */
+   { 28494, 0x00008591 }, /* GL_OPERAND1_RGB */
+   { 28510, 0x00008591 }, /* GL_OPERAND1_RGB_ARB */
+   { 28530, 0x00008591 }, /* GL_OPERAND1_RGB_EXT */
+   { 28550, 0x0000859A }, /* GL_OPERAND2_ALPHA */
+   { 28568, 0x0000859A }, /* GL_OPERAND2_ALPHA_ARB */
+   { 28590, 0x0000859A }, /* GL_OPERAND2_ALPHA_EXT */
+   { 28612, 0x00008592 }, /* GL_OPERAND2_RGB */
+   { 28628, 0x00008592 }, /* GL_OPERAND2_RGB_ARB */
+   { 28648, 0x00008592 }, /* GL_OPERAND2_RGB_EXT */
+   { 28668, 0x0000859B }, /* GL_OPERAND3_ALPHA_NV */
+   { 28689, 0x00008593 }, /* GL_OPERAND3_RGB_NV */
+   { 28708, 0x00001507 }, /* GL_OR */
+   { 28714, 0x00000A01 }, /* GL_ORDER */
+   { 28723, 0x0000150D }, /* GL_OR_INVERTED */
+   { 28738, 0x0000150B }, /* GL_OR_REVERSE */
+   { 28752, 0x00000505 }, /* GL_OUT_OF_MEMORY */
+   { 28769, 0x00000D05 }, /* GL_PACK_ALIGNMENT */
+   { 28787, 0x0000806C }, /* GL_PACK_IMAGE_HEIGHT */
+   { 28808, 0x00008758 }, /* GL_PACK_INVERT_MESA */
+   { 28828, 0x00000D01 }, /* GL_PACK_LSB_FIRST */
+   { 28846, 0x00000D02 }, /* GL_PACK_ROW_LENGTH */
+   { 28865, 0x0000806B }, /* GL_PACK_SKIP_IMAGES */
+   { 28885, 0x00000D04 }, /* GL_PACK_SKIP_PIXELS */
+   { 28905, 0x00000D03 }, /* GL_PACK_SKIP_ROWS */
+   { 28923, 0x00000D00 }, /* GL_PACK_SWAP_BYTES */
+   { 28942, 0x00008B92 }, /* GL_PALETTE4_R5_G6_B5_OES */
+   { 28967, 0x00008B94 }, /* GL_PALETTE4_RGB5_A1_OES */
+   { 28991, 0x00008B90 }, /* GL_PALETTE4_RGB8_OES */
+   { 29012, 0x00008B93 }, /* GL_PALETTE4_RGBA4_OES */
+   { 29034, 0x00008B91 }, /* GL_PALETTE4_RGBA8_OES */
+   { 29056, 0x00008B97 }, /* GL_PALETTE8_R5_G6_B5_OES */
+   { 29081, 0x00008B99 }, /* GL_PALETTE8_RGB5_A1_OES */
+   { 29105, 0x00008B95 }, /* GL_PALETTE8_RGB8_OES */
+   { 29126, 0x00008B98 }, /* GL_PALETTE8_RGBA4_OES */
+   { 29148, 0x00008B96 }, /* GL_PALETTE8_RGBA8_OES */
+   { 29170, 0x00000700 }, /* GL_PASS_THROUGH_TOKEN */
+   { 29192, 0x00000C50 }, /* GL_PERSPECTIVE_CORRECTION_HINT */
+   { 29223, 0x00000C79 }, /* GL_PIXEL_MAP_A_TO_A */
+   { 29243, 0x00000CB9 }, /* GL_PIXEL_MAP_A_TO_A_SIZE */
+   { 29268, 0x00000C78 }, /* GL_PIXEL_MAP_B_TO_B */
+   { 29288, 0x00000CB8 }, /* GL_PIXEL_MAP_B_TO_B_SIZE */
+   { 29313, 0x00000C77 }, /* GL_PIXEL_MAP_G_TO_G */
+   { 29333, 0x00000CB7 }, /* GL_PIXEL_MAP_G_TO_G_SIZE */
+   { 29358, 0x00000C75 }, /* GL_PIXEL_MAP_I_TO_A */
+   { 29378, 0x00000CB5 }, /* GL_PIXEL_MAP_I_TO_A_SIZE */
+   { 29403, 0x00000C74 }, /* GL_PIXEL_MAP_I_TO_B */
+   { 29423, 0x00000CB4 }, /* GL_PIXEL_MAP_I_TO_B_SIZE */
+   { 29448, 0x00000C73 }, /* GL_PIXEL_MAP_I_TO_G */
+   { 29468, 0x00000CB3 }, /* GL_PIXEL_MAP_I_TO_G_SIZE */
+   { 29493, 0x00000C70 }, /* GL_PIXEL_MAP_I_TO_I */
+   { 29513, 0x00000CB0 }, /* GL_PIXEL_MAP_I_TO_I_SIZE */
+   { 29538, 0x00000C72 }, /* GL_PIXEL_MAP_I_TO_R */
+   { 29558, 0x00000CB2 }, /* GL_PIXEL_MAP_I_TO_R_SIZE */
+   { 29583, 0x00000C76 }, /* GL_PIXEL_MAP_R_TO_R */
+   { 29603, 0x00000CB6 }, /* GL_PIXEL_MAP_R_TO_R_SIZE */
+   { 29628, 0x00000C71 }, /* GL_PIXEL_MAP_S_TO_S */
+   { 29648, 0x00000CB1 }, /* GL_PIXEL_MAP_S_TO_S_SIZE */
+   { 29673, 0x00000020 }, /* GL_PIXEL_MODE_BIT */
+   { 29691, 0x000088EB }, /* GL_PIXEL_PACK_BUFFER */
+   { 29712, 0x000088ED }, /* GL_PIXEL_PACK_BUFFER_BINDING */
+   { 29741, 0x000088ED }, /* GL_PIXEL_PACK_BUFFER_BINDING_EXT */
+   { 29774, 0x000088EB }, /* GL_PIXEL_PACK_BUFFER_EXT */
+   { 29799, 0x000088EC }, /* GL_PIXEL_UNPACK_BUFFER */
+   { 29822, 0x000088EF }, /* GL_PIXEL_UNPACK_BUFFER_BINDING */
+   { 29853, 0x000088EF }, /* GL_PIXEL_UNPACK_BUFFER_BINDING_EXT */
+   { 29888, 0x000088EC }, /* GL_PIXEL_UNPACK_BUFFER_EXT */
+   { 29915, 0x00001B00 }, /* GL_POINT */
+   { 29924, 0x00000000 }, /* GL_POINTS */
+   { 29934, 0x00000002 }, /* GL_POINT_BIT */
+   { 29947, 0x00008129 }, /* GL_POINT_DISTANCE_ATTENUATION */
+   { 29977, 0x00008129 }, /* GL_POINT_DISTANCE_ATTENUATION_ARB */
+   { 30011, 0x00008129 }, /* GL_POINT_DISTANCE_ATTENUATION_EXT */
+   { 30045, 0x00008129 }, /* GL_POINT_DISTANCE_ATTENUATION_SGIS */
+   { 30080, 0x00008128 }, /* GL_POINT_FADE_THRESHOLD_SIZE */
+   { 30109, 0x00008128 }, /* GL_POINT_FADE_THRESHOLD_SIZE_ARB */
+   { 30142, 0x00008128 }, /* GL_POINT_FADE_THRESHOLD_SIZE_EXT */
+   { 30175, 0x00008128 }, /* GL_POINT_FADE_THRESHOLD_SIZE_SGIS */
+   { 30209, 0x00000B11 }, /* GL_POINT_SIZE */
+   { 30223, 0x00008B9F }, /* GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES */
+   { 30262, 0x00008B9C }, /* GL_POINT_SIZE_ARRAY_OES */
+   { 30286, 0x0000898C }, /* GL_POINT_SIZE_ARRAY_POINTER_OES */
+   { 30318, 0x0000898B }, /* GL_POINT_SIZE_ARRAY_STRIDE_OES */
+   { 30349, 0x0000898A }, /* GL_POINT_SIZE_ARRAY_TYPE_OES */
+   { 30378, 0x00000B13 }, /* GL_POINT_SIZE_GRANULARITY */
+   { 30404, 0x00008127 }, /* GL_POINT_SIZE_MAX */
+   { 30422, 0x00008127 }, /* GL_POINT_SIZE_MAX_ARB */
+   { 30444, 0x00008127 }, /* GL_POINT_SIZE_MAX_EXT */
+   { 30466, 0x00008127 }, /* GL_POINT_SIZE_MAX_SGIS */
+   { 30489, 0x00008126 }, /* GL_POINT_SIZE_MIN */
+   { 30507, 0x00008126 }, /* GL_POINT_SIZE_MIN_ARB */
+   { 30529, 0x00008126 }, /* GL_POINT_SIZE_MIN_EXT */
+   { 30551, 0x00008126 }, /* GL_POINT_SIZE_MIN_SGIS */
+   { 30574, 0x00000B12 }, /* GL_POINT_SIZE_RANGE */
+   { 30594, 0x00000B10 }, /* GL_POINT_SMOOTH */
+   { 30610, 0x00000C51 }, /* GL_POINT_SMOOTH_HINT */
+   { 30631, 0x00008861 }, /* GL_POINT_SPRITE */
+   { 30647, 0x00008861 }, /* GL_POINT_SPRITE_ARB */
+   { 30667, 0x00008CA0 }, /* GL_POINT_SPRITE_COORD_ORIGIN */
+   { 30696, 0x00008861 }, /* GL_POINT_SPRITE_NV */
+   { 30715, 0x00008861 }, /* GL_POINT_SPRITE_OES */
+   { 30735, 0x00008863 }, /* GL_POINT_SPRITE_R_MODE_NV */
+   { 30761, 0x00000701 }, /* GL_POINT_TOKEN */
+   { 30776, 0x00000009 }, /* GL_POLYGON */
+   { 30787, 0x00000008 }, /* GL_POLYGON_BIT */
+   { 30802, 0x00000B40 }, /* GL_POLYGON_MODE */
+   { 30818, 0x00008039 }, /* GL_POLYGON_OFFSET_BIAS */
+   { 30841, 0x00008038 }, /* GL_POLYGON_OFFSET_FACTOR */
+   { 30866, 0x00008037 }, /* GL_POLYGON_OFFSET_FILL */
+   { 30889, 0x00002A02 }, /* GL_POLYGON_OFFSET_LINE */
+   { 30912, 0x00002A01 }, /* GL_POLYGON_OFFSET_POINT */
+   { 30936, 0x00002A00 }, /* GL_POLYGON_OFFSET_UNITS */
+   { 30960, 0x00000B41 }, /* GL_POLYGON_SMOOTH */
+   { 30978, 0x00000C53 }, /* GL_POLYGON_SMOOTH_HINT */
+   { 31001, 0x00000B42 }, /* GL_POLYGON_STIPPLE */
+   { 31020, 0x00000010 }, /* GL_POLYGON_STIPPLE_BIT */
+   { 31043, 0x00000703 }, /* GL_POLYGON_TOKEN */
+   { 31060, 0x00001203 }, /* GL_POSITION */
+   { 31072, 0x000080BB }, /* GL_POST_COLOR_MATRIX_ALPHA_BIAS */
+   { 31104, 0x000080BB }, /* GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI */
+   { 31140, 0x000080B7 }, /* GL_POST_COLOR_MATRIX_ALPHA_SCALE */
+   { 31173, 0x000080B7 }, /* GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI */
+   { 31210, 0x000080BA }, /* GL_POST_COLOR_MATRIX_BLUE_BIAS */
+   { 31241, 0x000080BA }, /* GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI */
+   { 31276, 0x000080B6 }, /* GL_POST_COLOR_MATRIX_BLUE_SCALE */
+   { 31308, 0x000080B6 }, /* GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI */
+   { 31344, 0x000080D2 }, /* GL_POST_COLOR_MATRIX_COLOR_TABLE */
+   { 31377, 0x000080B9 }, /* GL_POST_COLOR_MATRIX_GREEN_BIAS */
+   { 31409, 0x000080B9 }, /* GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI */
+   { 31445, 0x000080B5 }, /* GL_POST_COLOR_MATRIX_GREEN_SCALE */
+   { 31478, 0x000080B5 }, /* GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI */
+   { 31515, 0x000080B8 }, /* GL_POST_COLOR_MATRIX_RED_BIAS */
+   { 31545, 0x000080B8 }, /* GL_POST_COLOR_MATRIX_RED_BIAS_SGI */
+   { 31579, 0x000080B4 }, /* GL_POST_COLOR_MATRIX_RED_SCALE */
+   { 31610, 0x000080B4 }, /* GL_POST_COLOR_MATRIX_RED_SCALE_SGI */
+   { 31645, 0x00008023 }, /* GL_POST_CONVOLUTION_ALPHA_BIAS */
+   { 31676, 0x00008023 }, /* GL_POST_CONVOLUTION_ALPHA_BIAS_EXT */
+   { 31711, 0x0000801F }, /* GL_POST_CONVOLUTION_ALPHA_SCALE */
+   { 31743, 0x0000801F }, /* GL_POST_CONVOLUTION_ALPHA_SCALE_EXT */
+   { 31779, 0x00008022 }, /* GL_POST_CONVOLUTION_BLUE_BIAS */
+   { 31809, 0x00008022 }, /* GL_POST_CONVOLUTION_BLUE_BIAS_EXT */
+   { 31843, 0x0000801E }, /* GL_POST_CONVOLUTION_BLUE_SCALE */
+   { 31874, 0x0000801E }, /* GL_POST_CONVOLUTION_BLUE_SCALE_EXT */
+   { 31909, 0x000080D1 }, /* GL_POST_CONVOLUTION_COLOR_TABLE */
+   { 31941, 0x00008021 }, /* GL_POST_CONVOLUTION_GREEN_BIAS */
+   { 31972, 0x00008021 }, /* GL_POST_CONVOLUTION_GREEN_BIAS_EXT */
+   { 32007, 0x0000801D }, /* GL_POST_CONVOLUTION_GREEN_SCALE */
+   { 32039, 0x0000801D }, /* GL_POST_CONVOLUTION_GREEN_SCALE_EXT */
+   { 32075, 0x00008020 }, /* GL_POST_CONVOLUTION_RED_BIAS */
+   { 32104, 0x00008020 }, /* GL_POST_CONVOLUTION_RED_BIAS_EXT */
+   { 32137, 0x0000801C }, /* GL_POST_CONVOLUTION_RED_SCALE */
+   { 32167, 0x0000801C }, /* GL_POST_CONVOLUTION_RED_SCALE_EXT */
+   { 32201, 0x0000817B }, /* GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX */
+   { 32240, 0x00008179 }, /* GL_POST_TEXTURE_FILTER_BIAS_SGIX */
+   { 32273, 0x0000817C }, /* GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX */
+   { 32313, 0x0000817A }, /* GL_POST_TEXTURE_FILTER_SCALE_SGIX */
+   { 32347, 0x00008578 }, /* GL_PREVIOUS */
+   { 32359, 0x00008578 }, /* GL_PREVIOUS_ARB */
+   { 32375, 0x00008578 }, /* GL_PREVIOUS_EXT */
+   { 32391, 0x00008577 }, /* GL_PRIMARY_COLOR */
+   { 32408, 0x00008577 }, /* GL_PRIMARY_COLOR_ARB */
+   { 32429, 0x00008577 }, /* GL_PRIMARY_COLOR_EXT */
+   { 32450, 0x00008C87 }, /* GL_PRIMITIVES_GENERATED */
+   { 32474, 0x00008C87 }, /* GL_PRIMITIVES_GENERATED_EXT */
+   { 32502, 0x00008F9D }, /* GL_PRIMITIVE_RESTART */
+   { 32523, 0x00008F9E }, /* GL_PRIMITIVE_RESTART_INDEX */
+   { 32550, 0x00008559 }, /* GL_PRIMITIVE_RESTART_INDEX_NV */
+   { 32580, 0x00008558 }, /* GL_PRIMITIVE_RESTART_NV */
+   { 32604, 0x000088B0 }, /* GL_PROGRAM_ADDRESS_REGISTERS_ARB */
+   { 32637, 0x00008805 }, /* GL_PROGRAM_ALU_INSTRUCTIONS_ARB */
+   { 32669, 0x000088AC }, /* GL_PROGRAM_ATTRIBS_ARB */
+   { 32692, 0x000087FF }, /* GL_PROGRAM_BINARY_FORMATS_OES */
+   { 32722, 0x00008741 }, /* GL_PROGRAM_BINARY_LENGTH_OES */
+   { 32751, 0x00008677 }, /* GL_PROGRAM_BINDING_ARB */
+   { 32774, 0x0000864B }, /* GL_PROGRAM_ERROR_POSITION_ARB */
+   { 32804, 0x0000864B }, /* GL_PROGRAM_ERROR_POSITION_NV */
+   { 32833, 0x00008874 }, /* GL_PROGRAM_ERROR_STRING_ARB */
+   { 32861, 0x00008876 }, /* GL_PROGRAM_FORMAT_ARB */
+   { 32883, 0x00008875 }, /* GL_PROGRAM_FORMAT_ASCII_ARB */
+   { 32911, 0x000088A0 }, /* GL_PROGRAM_INSTRUCTIONS_ARB */
+   { 32939, 0x00008627 }, /* GL_PROGRAM_LENGTH_ARB */
+   { 32961, 0x00008627 }, /* GL_PROGRAM_LENGTH_NV */
+   { 32982, 0x000088B2 }, /* GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB */
+   { 33022, 0x00008808 }, /* GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB */
+   { 33061, 0x000088AE }, /* GL_PROGRAM_NATIVE_ATTRIBS_ARB */
+   { 33091, 0x000088A2 }, /* GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB */
+   { 33126, 0x000088AA }, /* GL_PROGRAM_NATIVE_PARAMETERS_ARB */
+   { 33159, 0x000088A6 }, /* GL_PROGRAM_NATIVE_TEMPORARIES_ARB */
+   { 33193, 0x0000880A }, /* GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB */
+   { 33232, 0x00008809 }, /* GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB */
+   { 33271, 0x00008B40 }, /* GL_PROGRAM_OBJECT_ARB */
+   { 33293, 0x000088A8 }, /* GL_PROGRAM_PARAMETERS_ARB */
+   { 33319, 0x00008644 }, /* GL_PROGRAM_PARAMETER_NV */
+   { 33343, 0x00008642 }, /* GL_PROGRAM_POINT_SIZE */
+   { 33365, 0x00008642 }, /* GL_PROGRAM_POINT_SIZE_ARB */
+   { 33391, 0x00008647 }, /* GL_PROGRAM_RESIDENT_NV */
+   { 33414, 0x00008628 }, /* GL_PROGRAM_STRING_ARB */
+   { 33436, 0x00008628 }, /* GL_PROGRAM_STRING_NV */
+   { 33457, 0x00008646 }, /* GL_PROGRAM_TARGET_NV */
+   { 33478, 0x000088A4 }, /* GL_PROGRAM_TEMPORARIES_ARB */
+   { 33505, 0x00008807 }, /* GL_PROGRAM_TEX_INDIRECTIONS_ARB */
+   { 33537, 0x00008806 }, /* GL_PROGRAM_TEX_INSTRUCTIONS_ARB */
+   { 33569, 0x000088B6 }, /* GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB */
+   { 33604, 0x00001701 }, /* GL_PROJECTION */
+   { 33618, 0x00000BA7 }, /* GL_PROJECTION_MATRIX */
+   { 33639, 0x0000898E }, /* GL_PROJECTION_MATRIX_FLOAT_AS_INT_BITS_OES */
+   { 33682, 0x00000BA4 }, /* GL_PROJECTION_STACK_DEPTH */
+   { 33708, 0x00008E4F }, /* GL_PROVOKING_VERTEX */
+   { 33728, 0x00008E4F }, /* GL_PROVOKING_VERTEX_EXT */
+   { 33752, 0x000080D3 }, /* GL_PROXY_COLOR_TABLE */
+   { 33773, 0x00008025 }, /* GL_PROXY_HISTOGRAM */
+   { 33792, 0x00008025 }, /* GL_PROXY_HISTOGRAM_EXT */
+   { 33815, 0x000080D5 }, /* GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE */
+   { 33854, 0x000080D4 }, /* GL_PROXY_POST_CONVOLUTION_COLOR_TABLE */
+   { 33892, 0x00008063 }, /* GL_PROXY_TEXTURE_1D */
+   { 33912, 0x00008C19 }, /* GL_PROXY_TEXTURE_1D_ARRAY */
+   { 33938, 0x00008C19 }, /* GL_PROXY_TEXTURE_1D_ARRAY_EXT */
+   { 33968, 0x00008063 }, /* GL_PROXY_TEXTURE_1D_EXT */
+   { 33992, 0x00008064 }, /* GL_PROXY_TEXTURE_2D */
+   { 34012, 0x00008C1B }, /* GL_PROXY_TEXTURE_2D_ARRAY */
+   { 34038, 0x00008C1B }, /* GL_PROXY_TEXTURE_2D_ARRAY_EXT */
+   { 34068, 0x00008064 }, /* GL_PROXY_TEXTURE_2D_EXT */
+   { 34092, 0x00008070 }, /* GL_PROXY_TEXTURE_3D */
+   { 34112, 0x000080BD }, /* GL_PROXY_TEXTURE_COLOR_TABLE_SGI */
+   { 34145, 0x0000851B }, /* GL_PROXY_TEXTURE_CUBE_MAP */
+   { 34171, 0x0000851B }, /* GL_PROXY_TEXTURE_CUBE_MAP_ARB */
+   { 34201, 0x000084F7 }, /* GL_PROXY_TEXTURE_RECTANGLE */
+   { 34228, 0x000084F7 }, /* GL_PROXY_TEXTURE_RECTANGLE_ARB */
+   { 34259, 0x000084F7 }, /* GL_PROXY_TEXTURE_RECTANGLE_NV */
+   { 34289, 0x00008A1D }, /* GL_PURGEABLE_APPLE */
+   { 34308, 0x00002003 }, /* GL_Q */
+   { 34313, 0x00001209 }, /* GL_QUADRATIC_ATTENUATION */
+   { 34338, 0x00000007 }, /* GL_QUADS */
+   { 34347, 0x00008E4C }, /* GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION */
+   { 34391, 0x00008E4C }, /* GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT */
+   { 34439, 0x00008614 }, /* GL_QUAD_MESH_SUN */
+   { 34456, 0x00000008 }, /* GL_QUAD_STRIP */
+   { 34470, 0x00008E16 }, /* GL_QUERY_BY_REGION_NO_WAIT */
+   { 34497, 0x00008E16 }, /* GL_QUERY_BY_REGION_NO_WAIT_NV */
+   { 34527, 0x00008E15 }, /* GL_QUERY_BY_REGION_WAIT */
+   { 34551, 0x00008E15 }, /* GL_QUERY_BY_REGION_WAIT_NV */
+   { 34578, 0x00008864 }, /* GL_QUERY_COUNTER_BITS */
+   { 34600, 0x00008864 }, /* GL_QUERY_COUNTER_BITS_ARB */
+   { 34626, 0x00008E14 }, /* GL_QUERY_NO_WAIT */
+   { 34643, 0x00008E14 }, /* GL_QUERY_NO_WAIT_NV */
+   { 34663, 0x00008866 }, /* GL_QUERY_RESULT */
+   { 34679, 0x00008866 }, /* GL_QUERY_RESULT_ARB */
+   { 34699, 0x00008867 }, /* GL_QUERY_RESULT_AVAILABLE */
+   { 34725, 0x00008867 }, /* GL_QUERY_RESULT_AVAILABLE_ARB */
+   { 34755, 0x00008E13 }, /* GL_QUERY_WAIT */
+   { 34769, 0x00008E13 }, /* GL_QUERY_WAIT_NV */
+   { 34786, 0x00002002 }, /* GL_R */
+   { 34791, 0x00008C3A }, /* GL_R11F_G11F_B10F */
+   { 34809, 0x00008F98 }, /* GL_R16_SNORM */
+   { 34822, 0x00002A10 }, /* GL_R3_G3_B2 */
+   { 34834, 0x00008F94 }, /* GL_R8_SNORM */
+   { 34846, 0x00008C89 }, /* GL_RASTERIZER_DISCARD */
+   { 34868, 0x00008C89 }, /* GL_RASTERIZER_DISCARD_EXT */
+   { 34894, 0x00019262 }, /* GL_RASTER_POSITION_UNCLIPPED_IBM */
+   { 34927, 0x00000C02 }, /* GL_READ_BUFFER */
+   { 34942, 0x00008CA8 }, /* GL_READ_FRAMEBUFFER */
+   { 34962, 0x00008CAA }, /* GL_READ_FRAMEBUFFER_BINDING */
+   { 34990, 0x00008CAA }, /* GL_READ_FRAMEBUFFER_BINDING_EXT */
+   { 35022, 0x00008CA8 }, /* GL_READ_FRAMEBUFFER_EXT */
+   { 35046, 0x000088B8 }, /* GL_READ_ONLY */
+   { 35059, 0x000088B8 }, /* GL_READ_ONLY_ARB */
+   { 35076, 0x000088BA }, /* GL_READ_WRITE */
+   { 35090, 0x000088BA }, /* GL_READ_WRITE_ARB */
+   { 35108, 0x00001903 }, /* GL_RED */
+   { 35115, 0x00008016 }, /* GL_REDUCE */
+   { 35125, 0x00008016 }, /* GL_REDUCE_EXT */
+   { 35139, 0x00000D15 }, /* GL_RED_BIAS */
+   { 35151, 0x00000D52 }, /* GL_RED_BITS */
+   { 35163, 0x00008D94 }, /* GL_RED_INTEGER */
+   { 35178, 0x00008D94 }, /* GL_RED_INTEGER_EXT */
+   { 35197, 0x00000D14 }, /* GL_RED_SCALE */
+   { 35210, 0x00008F90 }, /* GL_RED_SNORM */
+   { 35223, 0x00008512 }, /* GL_REFLECTION_MAP */
+   { 35241, 0x00008512 }, /* GL_REFLECTION_MAP_ARB */
+   { 35263, 0x00008512 }, /* GL_REFLECTION_MAP_NV */
+   { 35284, 0x00008512 }, /* GL_REFLECTION_MAP_OES */
+   { 35306, 0x00008A19 }, /* GL_RELEASED_APPLE */
+   { 35324, 0x00001C00 }, /* GL_RENDER */
+   { 35334, 0x00008D41 }, /* GL_RENDERBUFFER */
+   { 35350, 0x00008D53 }, /* GL_RENDERBUFFER_ALPHA_SIZE */
+   { 35377, 0x00008D53 }, /* GL_RENDERBUFFER_ALPHA_SIZE_OES */
+   { 35408, 0x00008CA7 }, /* GL_RENDERBUFFER_BINDING */
+   { 35432, 0x00008CA7 }, /* GL_RENDERBUFFER_BINDING_EXT */
+   { 35460, 0x00008CA7 }, /* GL_RENDERBUFFER_BINDING_OES */
+   { 35488, 0x00008D52 }, /* GL_RENDERBUFFER_BLUE_SIZE */
+   { 35514, 0x00008D52 }, /* GL_RENDERBUFFER_BLUE_SIZE_OES */
+   { 35544, 0x00008D54 }, /* GL_RENDERBUFFER_DEPTH_SIZE */
+   { 35571, 0x00008D54 }, /* GL_RENDERBUFFER_DEPTH_SIZE_OES */
+   { 35602, 0x00008D41 }, /* GL_RENDERBUFFER_EXT */
+   { 35622, 0x00008D51 }, /* GL_RENDERBUFFER_GREEN_SIZE */
+   { 35649, 0x00008D51 }, /* GL_RENDERBUFFER_GREEN_SIZE_OES */
+   { 35680, 0x00008D43 }, /* GL_RENDERBUFFER_HEIGHT */
+   { 35703, 0x00008D43 }, /* GL_RENDERBUFFER_HEIGHT_EXT */
+   { 35730, 0x00008D43 }, /* GL_RENDERBUFFER_HEIGHT_OES */
+   { 35757, 0x00008D44 }, /* GL_RENDERBUFFER_INTERNAL_FORMAT */
+   { 35789, 0x00008D44 }, /* GL_RENDERBUFFER_INTERNAL_FORMAT_EXT */
+   { 35825, 0x00008D44 }, /* GL_RENDERBUFFER_INTERNAL_FORMAT_OES */
+   { 35861, 0x00008D41 }, /* GL_RENDERBUFFER_OES */
+   { 35881, 0x00008D50 }, /* GL_RENDERBUFFER_RED_SIZE */
+   { 35906, 0x00008D50 }, /* GL_RENDERBUFFER_RED_SIZE_OES */
+   { 35935, 0x00008CAB }, /* GL_RENDERBUFFER_SAMPLES */
+   { 35959, 0x00008CAB }, /* GL_RENDERBUFFER_SAMPLES_EXT */
+   { 35987, 0x00008D55 }, /* GL_RENDERBUFFER_STENCIL_SIZE */
+   { 36016, 0x00008D55 }, /* GL_RENDERBUFFER_STENCIL_SIZE_OES */
+   { 36049, 0x00008D42 }, /* GL_RENDERBUFFER_WIDTH */
+   { 36071, 0x00008D42 }, /* GL_RENDERBUFFER_WIDTH_EXT */
+   { 36097, 0x00008D42 }, /* GL_RENDERBUFFER_WIDTH_OES */
+   { 36123, 0x00001F01 }, /* GL_RENDERER */
+   { 36135, 0x00000C40 }, /* GL_RENDER_MODE */
+   { 36150, 0x00002901 }, /* GL_REPEAT */
+   { 36160, 0x00001E01 }, /* GL_REPLACE */
+   { 36171, 0x00008062 }, /* GL_REPLACE_EXT */
+   { 36186, 0x00008153 }, /* GL_REPLICATE_BORDER_HP */
+   { 36209, 0x0000803A }, /* GL_RESCALE_NORMAL */
+   { 36227, 0x0000803A }, /* GL_RESCALE_NORMAL_EXT */
+   { 36249, 0x00008A1B }, /* GL_RETAINED_APPLE */
+   { 36267, 0x00000102 }, /* GL_RETURN */
+   { 36277, 0x00008F99 }, /* GL_RG16_SNORM */
+   { 36291, 0x00008F95 }, /* GL_RG8_SNORM */
+   { 36304, 0x00001907 }, /* GL_RGB */
+   { 36311, 0x00008052 }, /* GL_RGB10 */
+   { 36320, 0x00008059 }, /* GL_RGB10_A2 */
+   { 36332, 0x00008059 }, /* GL_RGB10_A2_EXT */
+   { 36348, 0x00008052 }, /* GL_RGB10_EXT */
+   { 36361, 0x00008053 }, /* GL_RGB12 */
+   { 36370, 0x00008053 }, /* GL_RGB12_EXT */
+   { 36383, 0x00008054 }, /* GL_RGB16 */
+   { 36392, 0x0000881B }, /* GL_RGB16F */
+   { 36402, 0x00008D89 }, /* GL_RGB16I */
+   { 36412, 0x00008D89 }, /* GL_RGB16I_EXT */
+   { 36426, 0x00008D77 }, /* GL_RGB16UI */
+   { 36437, 0x00008D77 }, /* GL_RGB16UI_EXT */
+   { 36452, 0x00008054 }, /* GL_RGB16_EXT */
+   { 36465, 0x00008F9A }, /* GL_RGB16_SNORM */
+   { 36480, 0x0000804E }, /* GL_RGB2_EXT */
+   { 36492, 0x00008815 }, /* GL_RGB32F */
+   { 36502, 0x00008D83 }, /* GL_RGB32I */
+   { 36512, 0x00008D83 }, /* GL_RGB32I_EXT */
+   { 36526, 0x00008D71 }, /* GL_RGB32UI */
+   { 36537, 0x00008D71 }, /* GL_RGB32UI_EXT */
+   { 36552, 0x0000804F }, /* GL_RGB4 */
+   { 36560, 0x0000804F }, /* GL_RGB4_EXT */
+   { 36572, 0x000083A1 }, /* GL_RGB4_S3TC */
+   { 36585, 0x00008050 }, /* GL_RGB5 */
+   { 36593, 0x00008D62 }, /* GL_RGB565 */
+   { 36603, 0x00008D62 }, /* GL_RGB565_OES */
+   { 36617, 0x00008057 }, /* GL_RGB5_A1 */
+   { 36628, 0x00008057 }, /* GL_RGB5_A1_EXT */
+   { 36643, 0x00008057 }, /* GL_RGB5_A1_OES */
+   { 36658, 0x00008050 }, /* GL_RGB5_EXT */
+   { 36670, 0x00008051 }, /* GL_RGB8 */
+   { 36678, 0x00008D8F }, /* GL_RGB8I */
+   { 36687, 0x00008D8F }, /* GL_RGB8I_EXT */
+   { 36700, 0x00008D7D }, /* GL_RGB8UI */
+   { 36710, 0x00008D7D }, /* GL_RGB8UI_EXT */
+   { 36724, 0x00008051 }, /* GL_RGB8_EXT */
+   { 36736, 0x00008051 }, /* GL_RGB8_OES */
+   { 36748, 0x00008F96 }, /* GL_RGB8_SNORM */
+   { 36762, 0x00008C3D }, /* GL_RGB9_E5 */
+   { 36773, 0x00001908 }, /* GL_RGBA */
+   { 36781, 0x0000805A }, /* GL_RGBA12 */
+   { 36791, 0x0000805A }, /* GL_RGBA12_EXT */
+   { 36805, 0x0000805B }, /* GL_RGBA16 */
+   { 36815, 0x0000881A }, /* GL_RGBA16F */
+   { 36826, 0x00008D88 }, /* GL_RGBA16I */
+   { 36837, 0x00008D88 }, /* GL_RGBA16I_EXT */
+   { 36852, 0x00008D76 }, /* GL_RGBA16UI */
+   { 36864, 0x00008D76 }, /* GL_RGBA16UI_EXT */
+   { 36880, 0x0000805B }, /* GL_RGBA16_EXT */
+   { 36894, 0x00008F9B }, /* GL_RGBA16_SNORM */
+   { 36910, 0x00008055 }, /* GL_RGBA2 */
+   { 36919, 0x00008055 }, /* GL_RGBA2_EXT */
+   { 36932, 0x00008814 }, /* GL_RGBA32F */
+   { 36943, 0x00008D82 }, /* GL_RGBA32I */
+   { 36954, 0x00008D82 }, /* GL_RGBA32I_EXT */
+   { 36969, 0x00008D70 }, /* GL_RGBA32UI */
+   { 36981, 0x00008D70 }, /* GL_RGBA32UI_EXT */
+   { 36997, 0x00008056 }, /* GL_RGBA4 */
+   { 37006, 0x000083A5 }, /* GL_RGBA4_DXT5_S3TC */
+   { 37025, 0x00008056 }, /* GL_RGBA4_EXT */
+   { 37038, 0x00008056 }, /* GL_RGBA4_OES */
+   { 37051, 0x000083A3 }, /* GL_RGBA4_S3TC */
+   { 37065, 0x00008058 }, /* GL_RGBA8 */
+   { 37074, 0x00008D8E }, /* GL_RGBA8I */
+   { 37084, 0x00008D8E }, /* GL_RGBA8I_EXT */
+   { 37098, 0x00008D7C }, /* GL_RGBA8UI */
+   { 37109, 0x00008D7C }, /* GL_RGBA8UI_EXT */
+   { 37124, 0x00008058 }, /* GL_RGBA8_EXT */
+   { 37137, 0x00008058 }, /* GL_RGBA8_OES */
+   { 37150, 0x00008F97 }, /* GL_RGBA8_SNORM */
+   { 37165, 0x000083A4 }, /* GL_RGBA_DXT5_S3TC */
+   { 37183, 0x00008820 }, /* GL_RGBA_FLOAT_MODE_ARB */
+   { 37206, 0x00008D99 }, /* GL_RGBA_INTEGER */
+   { 37222, 0x00008D99 }, /* GL_RGBA_INTEGER_EXT */
+   { 37242, 0x00008D9E }, /* GL_RGBA_INTEGER_MODE_EXT */
+   { 37267, 0x00000C31 }, /* GL_RGBA_MODE */
+   { 37280, 0x000083A2 }, /* GL_RGBA_S3TC */
+   { 37293, 0x00008F93 }, /* GL_RGBA_SNORM */
+   { 37307, 0x00008D98 }, /* GL_RGB_INTEGER */
+   { 37322, 0x00008D98 }, /* GL_RGB_INTEGER_EXT */
+   { 37341, 0x000083A0 }, /* GL_RGB_S3TC */
+   { 37353, 0x00008573 }, /* GL_RGB_SCALE */
+   { 37366, 0x00008573 }, /* GL_RGB_SCALE_ARB */
+   { 37383, 0x00008573 }, /* GL_RGB_SCALE_EXT */
+   { 37400, 0x00008F92 }, /* GL_RGB_SNORM */
+   { 37413, 0x00008F91 }, /* GL_RG_SNORM */
+   { 37425, 0x00000407 }, /* GL_RIGHT */
+   { 37434, 0x00002000 }, /* GL_S */
+   { 37439, 0x00008B5D }, /* GL_SAMPLER_1D */
+   { 37453, 0x00008DC0 }, /* GL_SAMPLER_1D_ARRAY */
+   { 37473, 0x00008DC0 }, /* GL_SAMPLER_1D_ARRAY_EXT */
+   { 37497, 0x00008DC3 }, /* GL_SAMPLER_1D_ARRAY_SHADOW */
+   { 37524, 0x00008DC3 }, /* GL_SAMPLER_1D_ARRAY_SHADOW_EXT */
+   { 37555, 0x00008B61 }, /* GL_SAMPLER_1D_SHADOW */
+   { 37576, 0x00008B5E }, /* GL_SAMPLER_2D */
+   { 37590, 0x00008DC1 }, /* GL_SAMPLER_2D_ARRAY */
+   { 37610, 0x00008DC1 }, /* GL_SAMPLER_2D_ARRAY_EXT */
+   { 37634, 0x00008DC4 }, /* GL_SAMPLER_2D_ARRAY_SHADOW */
+   { 37661, 0x00008DC4 }, /* GL_SAMPLER_2D_ARRAY_SHADOW_EXT */
+   { 37692, 0x00008B63 }, /* GL_SAMPLER_2D_RECT */
+   { 37711, 0x00008B64 }, /* GL_SAMPLER_2D_RECT_SHADOW */
+   { 37737, 0x00008B62 }, /* GL_SAMPLER_2D_SHADOW */
+   { 37758, 0x00008B5F }, /* GL_SAMPLER_3D */
+   { 37772, 0x00008B5F }, /* GL_SAMPLER_3D_OES */
+   { 37790, 0x00008DC2 }, /* GL_SAMPLER_BUFFER */
+   { 37808, 0x00008DC2 }, /* GL_SAMPLER_BUFFER_EXT */
+   { 37830, 0x00008B60 }, /* GL_SAMPLER_CUBE */
+   { 37846, 0x00008DC5 }, /* GL_SAMPLER_CUBE_SHADOW */
+   { 37869, 0x00008DC5 }, /* GL_SAMPLER_CUBE_SHADOW_EXT */
+   { 37896, 0x000080A9 }, /* GL_SAMPLES */
+   { 37907, 0x000086B4 }, /* GL_SAMPLES_3DFX */
+   { 37923, 0x000080A9 }, /* GL_SAMPLES_ARB */
+   { 37938, 0x00008914 }, /* GL_SAMPLES_PASSED */
+   { 37956, 0x00008914 }, /* GL_SAMPLES_PASSED_ARB */
+   { 37978, 0x0000809E }, /* GL_SAMPLE_ALPHA_TO_COVERAGE */
+   { 38006, 0x0000809E }, /* GL_SAMPLE_ALPHA_TO_COVERAGE_ARB */
+   { 38038, 0x0000809F }, /* GL_SAMPLE_ALPHA_TO_ONE */
+   { 38061, 0x0000809F }, /* GL_SAMPLE_ALPHA_TO_ONE_ARB */
+   { 38088, 0x000080A8 }, /* GL_SAMPLE_BUFFERS */
+   { 38106, 0x000086B3 }, /* GL_SAMPLE_BUFFERS_3DFX */
+   { 38129, 0x000080A8 }, /* GL_SAMPLE_BUFFERS_ARB */
+   { 38151, 0x000080A0 }, /* GL_SAMPLE_COVERAGE */
+   { 38170, 0x000080A0 }, /* GL_SAMPLE_COVERAGE_ARB */
+   { 38193, 0x000080AB }, /* GL_SAMPLE_COVERAGE_INVERT */
+   { 38219, 0x000080AB }, /* GL_SAMPLE_COVERAGE_INVERT_ARB */
+   { 38249, 0x000080AA }, /* GL_SAMPLE_COVERAGE_VALUE */
+   { 38274, 0x000080AA }, /* GL_SAMPLE_COVERAGE_VALUE_ARB */
+   { 38303, 0x00080000 }, /* GL_SCISSOR_BIT */
+   { 38318, 0x00000C10 }, /* GL_SCISSOR_BOX */
+   { 38333, 0x00000C11 }, /* GL_SCISSOR_TEST */
+   { 38349, 0x0000845E }, /* GL_SECONDARY_COLOR_ARRAY */
+   { 38374, 0x0000889C }, /* GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING */
+   { 38414, 0x0000889C }, /* GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB */
+   { 38458, 0x0000845D }, /* GL_SECONDARY_COLOR_ARRAY_POINTER */
+   { 38491, 0x0000845A }, /* GL_SECONDARY_COLOR_ARRAY_SIZE */
+   { 38521, 0x0000845C }, /* GL_SECONDARY_COLOR_ARRAY_STRIDE */
+   { 38553, 0x0000845B }, /* GL_SECONDARY_COLOR_ARRAY_TYPE */
+   { 38583, 0x00001C02 }, /* GL_SELECT */
+   { 38593, 0x00000DF3 }, /* GL_SELECTION_BUFFER_POINTER */
+   { 38621, 0x00000DF4 }, /* GL_SELECTION_BUFFER_SIZE */
+   { 38646, 0x00008012 }, /* GL_SEPARABLE_2D */
+   { 38662, 0x00008C8D }, /* GL_SEPARATE_ATTRIBS */
+   { 38682, 0x00008C8D }, /* GL_SEPARATE_ATTRIBS_EXT */
+   { 38706, 0x000081FA }, /* GL_SEPARATE_SPECULAR_COLOR */
+   { 38733, 0x000081FA }, /* GL_SEPARATE_SPECULAR_COLOR_EXT */
+   { 38764, 0x0000150F }, /* GL_SET */
+   { 38771, 0x00008DF8 }, /* GL_SHADER_BINARY_FORMATS */
+   { 38796, 0x00008DFA }, /* GL_SHADER_COMPILER */
+   { 38815, 0x00008B48 }, /* GL_SHADER_OBJECT_ARB */
+   { 38836, 0x00008B88 }, /* GL_SHADER_SOURCE_LENGTH */
+   { 38860, 0x00008B4F }, /* GL_SHADER_TYPE */
+   { 38875, 0x00000B54 }, /* GL_SHADE_MODEL */
+   { 38890, 0x00008B8C }, /* GL_SHADING_LANGUAGE_VERSION */
+   { 38918, 0x000080BF }, /* GL_SHADOW_AMBIENT_SGIX */
+   { 38941, 0x000081FB }, /* GL_SHARED_TEXTURE_PALETTE_EXT */
+   { 38971, 0x00001601 }, /* GL_SHININESS */
+   { 38984, 0x00001402 }, /* GL_SHORT */
+   { 38993, 0x00009119 }, /* GL_SIGNALED */
+   { 39005, 0x00008F9C }, /* GL_SIGNED_NORMALIZED */
+   { 39026, 0x000081F9 }, /* GL_SINGLE_COLOR */
+   { 39042, 0x000081F9 }, /* GL_SINGLE_COLOR_EXT */
+   { 39062, 0x000085CC }, /* GL_SLICE_ACCUM_SUN */
+   { 39081, 0x00008C46 }, /* GL_SLUMINANCE */
+   { 39095, 0x00008C47 }, /* GL_SLUMINANCE8 */
+   { 39110, 0x00008C45 }, /* GL_SLUMINANCE8_ALPHA8 */
+   { 39132, 0x00008C44 }, /* GL_SLUMINANCE_ALPHA */
+   { 39152, 0x00001D01 }, /* GL_SMOOTH */
+   { 39162, 0x00000B23 }, /* GL_SMOOTH_LINE_WIDTH_GRANULARITY */
+   { 39195, 0x00000B22 }, /* GL_SMOOTH_LINE_WIDTH_RANGE */
+   { 39222, 0x00000B13 }, /* GL_SMOOTH_POINT_SIZE_GRANULARITY */
+   { 39255, 0x00000B12 }, /* GL_SMOOTH_POINT_SIZE_RANGE */
+   { 39282, 0x00008588 }, /* GL_SOURCE0_ALPHA */
+   { 39299, 0x00008588 }, /* GL_SOURCE0_ALPHA_ARB */
+   { 39320, 0x00008588 }, /* GL_SOURCE0_ALPHA_EXT */
+   { 39341, 0x00008580 }, /* GL_SOURCE0_RGB */
+   { 39356, 0x00008580 }, /* GL_SOURCE0_RGB_ARB */
+   { 39375, 0x00008580 }, /* GL_SOURCE0_RGB_EXT */
+   { 39394, 0x00008589 }, /* GL_SOURCE1_ALPHA */
+   { 39411, 0x00008589 }, /* GL_SOURCE1_ALPHA_ARB */
+   { 39432, 0x00008589 }, /* GL_SOURCE1_ALPHA_EXT */
+   { 39453, 0x00008581 }, /* GL_SOURCE1_RGB */
+   { 39468, 0x00008581 }, /* GL_SOURCE1_RGB_ARB */
+   { 39487, 0x00008581 }, /* GL_SOURCE1_RGB_EXT */
+   { 39506, 0x0000858A }, /* GL_SOURCE2_ALPHA */
+   { 39523, 0x0000858A }, /* GL_SOURCE2_ALPHA_ARB */
+   { 39544, 0x0000858A }, /* GL_SOURCE2_ALPHA_EXT */
+   { 39565, 0x00008582 }, /* GL_SOURCE2_RGB */
+   { 39580, 0x00008582 }, /* GL_SOURCE2_RGB_ARB */
+   { 39599, 0x00008582 }, /* GL_SOURCE2_RGB_EXT */
+   { 39618, 0x0000858B }, /* GL_SOURCE3_ALPHA_NV */
+   { 39638, 0x00008583 }, /* GL_SOURCE3_RGB_NV */
+   { 39656, 0x00001202 }, /* GL_SPECULAR */
+   { 39668, 0x00002402 }, /* GL_SPHERE_MAP */
+   { 39682, 0x00001206 }, /* GL_SPOT_CUTOFF */
+   { 39697, 0x00001204 }, /* GL_SPOT_DIRECTION */
+   { 39715, 0x00001205 }, /* GL_SPOT_EXPONENT */
+   { 39732, 0x00008588 }, /* GL_SRC0_ALPHA */
+   { 39746, 0x00008580 }, /* GL_SRC0_RGB */
+   { 39758, 0x00008589 }, /* GL_SRC1_ALPHA */
+   { 39772, 0x00008581 }, /* GL_SRC1_RGB */
+   { 39784, 0x0000858A }, /* GL_SRC2_ALPHA */
+   { 39798, 0x00008582 }, /* GL_SRC2_RGB */
+   { 39810, 0x00000302 }, /* GL_SRC_ALPHA */
+   { 39823, 0x00000308 }, /* GL_SRC_ALPHA_SATURATE */
+   { 39845, 0x00000300 }, /* GL_SRC_COLOR */
+   { 39858, 0x00008C40 }, /* GL_SRGB */
+   { 39866, 0x00008C41 }, /* GL_SRGB8 */
+   { 39875, 0x00008C43 }, /* GL_SRGB8_ALPHA8 */
+   { 39891, 0x00008C42 }, /* GL_SRGB_ALPHA */
+   { 39905, 0x00000503 }, /* GL_STACK_OVERFLOW */
+   { 39923, 0x00000504 }, /* GL_STACK_UNDERFLOW */
+   { 39942, 0x000088E6 }, /* GL_STATIC_COPY */
+   { 39957, 0x000088E6 }, /* GL_STATIC_COPY_ARB */
+   { 39976, 0x000088E4 }, /* GL_STATIC_DRAW */
+   { 39991, 0x000088E4 }, /* GL_STATIC_DRAW_ARB */
+   { 40010, 0x000088E5 }, /* GL_STATIC_READ */
+   { 40025, 0x000088E5 }, /* GL_STATIC_READ_ARB */
+   { 40044, 0x00001802 }, /* GL_STENCIL */
+   { 40055, 0x00008D20 }, /* GL_STENCIL_ATTACHMENT */
+   { 40077, 0x00008D20 }, /* GL_STENCIL_ATTACHMENT_EXT */
+   { 40103, 0x00008D20 }, /* GL_STENCIL_ATTACHMENT_OES */
+   { 40129, 0x00008801 }, /* GL_STENCIL_BACK_FAIL */
+   { 40150, 0x00008801 }, /* GL_STENCIL_BACK_FAIL_ATI */
+   { 40175, 0x00008800 }, /* GL_STENCIL_BACK_FUNC */
+   { 40196, 0x00008800 }, /* GL_STENCIL_BACK_FUNC_ATI */
+   { 40221, 0x00008802 }, /* GL_STENCIL_BACK_PASS_DEPTH_FAIL */
+   { 40253, 0x00008802 }, /* GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI */
+   { 40289, 0x00008803 }, /* GL_STENCIL_BACK_PASS_DEPTH_PASS */
+   { 40321, 0x00008803 }, /* GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI */
+   { 40357, 0x00008CA3 }, /* GL_STENCIL_BACK_REF */
+   { 40377, 0x00008CA4 }, /* GL_STENCIL_BACK_VALUE_MASK */
+   { 40404, 0x00008CA5 }, /* GL_STENCIL_BACK_WRITEMASK */
+   { 40430, 0x00000D57 }, /* GL_STENCIL_BITS */
+   { 40446, 0x00008224 }, /* GL_STENCIL_BUFFER */
+   { 40464, 0x00000400 }, /* GL_STENCIL_BUFFER_BIT */
+   { 40486, 0x00000B91 }, /* GL_STENCIL_CLEAR_VALUE */
+   { 40509, 0x00000B94 }, /* GL_STENCIL_FAIL */
+   { 40525, 0x00000B92 }, /* GL_STENCIL_FUNC */
+   { 40541, 0x00001901 }, /* GL_STENCIL_INDEX */
+   { 40558, 0x00008D46 }, /* GL_STENCIL_INDEX1 */
+   { 40576, 0x00008D49 }, /* GL_STENCIL_INDEX16 */
+   { 40595, 0x00008D49 }, /* GL_STENCIL_INDEX16_EXT */
+   { 40618, 0x00008D46 }, /* GL_STENCIL_INDEX1_EXT */
+   { 40640, 0x00008D46 }, /* GL_STENCIL_INDEX1_OES */
+   { 40662, 0x00008D47 }, /* GL_STENCIL_INDEX4 */
+   { 40680, 0x00008D47 }, /* GL_STENCIL_INDEX4_EXT */
+   { 40702, 0x00008D47 }, /* GL_STENCIL_INDEX4_OES */
+   { 40724, 0x00008D48 }, /* GL_STENCIL_INDEX8 */
+   { 40742, 0x00008D48 }, /* GL_STENCIL_INDEX8_EXT */
+   { 40764, 0x00008D48 }, /* GL_STENCIL_INDEX8_OES */
+   { 40786, 0x00008D45 }, /* GL_STENCIL_INDEX_EXT */
+   { 40807, 0x00000B95 }, /* GL_STENCIL_PASS_DEPTH_FAIL */
+   { 40834, 0x00000B96 }, /* GL_STENCIL_PASS_DEPTH_PASS */
+   { 40861, 0x00000B97 }, /* GL_STENCIL_REF */
+   { 40876, 0x00000B90 }, /* GL_STENCIL_TEST */
+   { 40892, 0x00008910 }, /* GL_STENCIL_TEST_TWO_SIDE_EXT */
+   { 40921, 0x00000B93 }, /* GL_STENCIL_VALUE_MASK */
+   { 40943, 0x00000B98 }, /* GL_STENCIL_WRITEMASK */
+   { 40964, 0x00000C33 }, /* GL_STEREO */
+   { 40974, 0x000085BE }, /* GL_STORAGE_CACHED_APPLE */
+   { 40998, 0x000085BD }, /* GL_STORAGE_PRIVATE_APPLE */
+   { 41023, 0x000085BF }, /* GL_STORAGE_SHARED_APPLE */
+   { 41047, 0x000088E2 }, /* GL_STREAM_COPY */
+   { 41062, 0x000088E2 }, /* GL_STREAM_COPY_ARB */
+   { 41081, 0x000088E0 }, /* GL_STREAM_DRAW */
+   { 41096, 0x000088E0 }, /* GL_STREAM_DRAW_ARB */
+   { 41115, 0x000088E1 }, /* GL_STREAM_READ */
+   { 41130, 0x000088E1 }, /* GL_STREAM_READ_ARB */
+   { 41149, 0x00000D50 }, /* GL_SUBPIXEL_BITS */
+   { 41166, 0x000084E7 }, /* GL_SUBTRACT */
+   { 41178, 0x000084E7 }, /* GL_SUBTRACT_ARB */
+   { 41194, 0x00009113 }, /* GL_SYNC_CONDITION */
+   { 41212, 0x00009116 }, /* GL_SYNC_FENCE */
+   { 41226, 0x00009115 }, /* GL_SYNC_FLAGS */
+   { 41240, 0x00000001 }, /* GL_SYNC_FLUSH_COMMANDS_BIT */
+   { 41267, 0x00009117 }, /* GL_SYNC_GPU_COMMANDS_COMPLETE */
+   { 41297, 0x00009114 }, /* GL_SYNC_STATUS */
+   { 41312, 0x00002001 }, /* GL_T */
+   { 41317, 0x00002A2A }, /* GL_T2F_C3F_V3F */
+   { 41332, 0x00002A2C }, /* GL_T2F_C4F_N3F_V3F */
+   { 41351, 0x00002A29 }, /* GL_T2F_C4UB_V3F */
+   { 41367, 0x00002A2B }, /* GL_T2F_N3F_V3F */
+   { 41382, 0x00002A27 }, /* GL_T2F_V3F */
+   { 41393, 0x00002A2D }, /* GL_T4F_C4F_N3F_V4F */
+   { 41412, 0x00002A28 }, /* GL_T4F_V4F */
+   { 41423, 0x00008031 }, /* GL_TABLE_TOO_LARGE_EXT */
+   { 41446, 0x00001702 }, /* GL_TEXTURE */
+   { 41457, 0x000084C0 }, /* GL_TEXTURE0 */
+   { 41469, 0x000084C0 }, /* GL_TEXTURE0_ARB */
+   { 41485, 0x000084C1 }, /* GL_TEXTURE1 */
+   { 41497, 0x000084CA }, /* GL_TEXTURE10 */
+   { 41510, 0x000084CA }, /* GL_TEXTURE10_ARB */
+   { 41527, 0x000084CB }, /* GL_TEXTURE11 */
+   { 41540, 0x000084CB }, /* GL_TEXTURE11_ARB */
+   { 41557, 0x000084CC }, /* GL_TEXTURE12 */
+   { 41570, 0x000084CC }, /* GL_TEXTURE12_ARB */
+   { 41587, 0x000084CD }, /* GL_TEXTURE13 */
+   { 41600, 0x000084CD }, /* GL_TEXTURE13_ARB */
+   { 41617, 0x000084CE }, /* GL_TEXTURE14 */
+   { 41630, 0x000084CE }, /* GL_TEXTURE14_ARB */
+   { 41647, 0x000084CF }, /* GL_TEXTURE15 */
+   { 41660, 0x000084CF }, /* GL_TEXTURE15_ARB */
+   { 41677, 0x000084D0 }, /* GL_TEXTURE16 */
+   { 41690, 0x000084D0 }, /* GL_TEXTURE16_ARB */
+   { 41707, 0x000084D1 }, /* GL_TEXTURE17 */
+   { 41720, 0x000084D1 }, /* GL_TEXTURE17_ARB */
+   { 41737, 0x000084D2 }, /* GL_TEXTURE18 */
+   { 41750, 0x000084D2 }, /* GL_TEXTURE18_ARB */
+   { 41767, 0x000084D3 }, /* GL_TEXTURE19 */
+   { 41780, 0x000084D3 }, /* GL_TEXTURE19_ARB */
+   { 41797, 0x000084C1 }, /* GL_TEXTURE1_ARB */
+   { 41813, 0x000084C2 }, /* GL_TEXTURE2 */
+   { 41825, 0x000084D4 }, /* GL_TEXTURE20 */
+   { 41838, 0x000084D4 }, /* GL_TEXTURE20_ARB */
+   { 41855, 0x000084D5 }, /* GL_TEXTURE21 */
+   { 41868, 0x000084D5 }, /* GL_TEXTURE21_ARB */
+   { 41885, 0x000084D6 }, /* GL_TEXTURE22 */
+   { 41898, 0x000084D6 }, /* GL_TEXTURE22_ARB */
+   { 41915, 0x000084D7 }, /* GL_TEXTURE23 */
+   { 41928, 0x000084D7 }, /* GL_TEXTURE23_ARB */
+   { 41945, 0x000084D8 }, /* GL_TEXTURE24 */
+   { 41958, 0x000084D8 }, /* GL_TEXTURE24_ARB */
+   { 41975, 0x000084D9 }, /* GL_TEXTURE25 */
+   { 41988, 0x000084D9 }, /* GL_TEXTURE25_ARB */
+   { 42005, 0x000084DA }, /* GL_TEXTURE26 */
+   { 42018, 0x000084DA }, /* GL_TEXTURE26_ARB */
+   { 42035, 0x000084DB }, /* GL_TEXTURE27 */
+   { 42048, 0x000084DB }, /* GL_TEXTURE27_ARB */
+   { 42065, 0x000084DC }, /* GL_TEXTURE28 */
+   { 42078, 0x000084DC }, /* GL_TEXTURE28_ARB */
+   { 42095, 0x000084DD }, /* GL_TEXTURE29 */
+   { 42108, 0x000084DD }, /* GL_TEXTURE29_ARB */
+   { 42125, 0x000084C2 }, /* GL_TEXTURE2_ARB */
+   { 42141, 0x000084C3 }, /* GL_TEXTURE3 */
+   { 42153, 0x000084DE }, /* GL_TEXTURE30 */
+   { 42166, 0x000084DE }, /* GL_TEXTURE30_ARB */
+   { 42183, 0x000084DF }, /* GL_TEXTURE31 */
+   { 42196, 0x000084DF }, /* GL_TEXTURE31_ARB */
+   { 42213, 0x000084C3 }, /* GL_TEXTURE3_ARB */
+   { 42229, 0x000084C4 }, /* GL_TEXTURE4 */
+   { 42241, 0x000084C4 }, /* GL_TEXTURE4_ARB */
+   { 42257, 0x000084C5 }, /* GL_TEXTURE5 */
+   { 42269, 0x000084C5 }, /* GL_TEXTURE5_ARB */
+   { 42285, 0x000084C6 }, /* GL_TEXTURE6 */
+   { 42297, 0x000084C6 }, /* GL_TEXTURE6_ARB */
+   { 42313, 0x000084C7 }, /* GL_TEXTURE7 */
+   { 42325, 0x000084C7 }, /* GL_TEXTURE7_ARB */
+   { 42341, 0x000084C8 }, /* GL_TEXTURE8 */
+   { 42353, 0x000084C8 }, /* GL_TEXTURE8_ARB */
+   { 42369, 0x000084C9 }, /* GL_TEXTURE9 */
+   { 42381, 0x000084C9 }, /* GL_TEXTURE9_ARB */
+   { 42397, 0x00000DE0 }, /* GL_TEXTURE_1D */
+   { 42411, 0x00008C18 }, /* GL_TEXTURE_1D_ARRAY */
+   { 42431, 0x00008C18 }, /* GL_TEXTURE_1D_ARRAY_EXT */
+   { 42455, 0x00000DE1 }, /* GL_TEXTURE_2D */
+   { 42469, 0x00008C1A }, /* GL_TEXTURE_2D_ARRAY */
+   { 42489, 0x00008C1A }, /* GL_TEXTURE_2D_ARRAY_EXT */
+   { 42513, 0x0000806F }, /* GL_TEXTURE_3D */
+   { 42527, 0x0000806F }, /* GL_TEXTURE_3D_OES */
+   { 42545, 0x0000805F }, /* GL_TEXTURE_ALPHA_SIZE */
+   { 42567, 0x0000805F }, /* GL_TEXTURE_ALPHA_SIZE_EXT */
+   { 42593, 0x0000813C }, /* GL_TEXTURE_BASE_LEVEL */
+   { 42615, 0x00008068 }, /* GL_TEXTURE_BINDING_1D */
+   { 42637, 0x00008C1C }, /* GL_TEXTURE_BINDING_1D_ARRAY */
+   { 42665, 0x00008C1C }, /* GL_TEXTURE_BINDING_1D_ARRAY_EXT */
+   { 42697, 0x00008069 }, /* GL_TEXTURE_BINDING_2D */
+   { 42719, 0x00008C1D }, /* GL_TEXTURE_BINDING_2D_ARRAY */
+   { 42747, 0x00008C1D }, /* GL_TEXTURE_BINDING_2D_ARRAY_EXT */
+   { 42779, 0x0000806A }, /* GL_TEXTURE_BINDING_3D */
+   { 42801, 0x0000806A }, /* GL_TEXTURE_BINDING_3D_OES */
+   { 42827, 0x00008C2C }, /* GL_TEXTURE_BINDING_BUFFER */
+   { 42853, 0x00008514 }, /* GL_TEXTURE_BINDING_CUBE_MAP */
+   { 42881, 0x00008514 }, /* GL_TEXTURE_BINDING_CUBE_MAP_ARB */
+   { 42913, 0x00008514 }, /* GL_TEXTURE_BINDING_CUBE_MAP_OES */
+   { 42945, 0x000084F6 }, /* GL_TEXTURE_BINDING_RECTANGLE */
+   { 42974, 0x000084F6 }, /* GL_TEXTURE_BINDING_RECTANGLE_ARB */
+   { 43007, 0x000084F6 }, /* GL_TEXTURE_BINDING_RECTANGLE_NV */
+   { 43039, 0x00040000 }, /* GL_TEXTURE_BIT */
+   { 43054, 0x0000805E }, /* GL_TEXTURE_BLUE_SIZE */
+   { 43075, 0x0000805E }, /* GL_TEXTURE_BLUE_SIZE_EXT */
+   { 43100, 0x00001005 }, /* GL_TEXTURE_BORDER */
+   { 43118, 0x00001004 }, /* GL_TEXTURE_BORDER_COLOR */
+   { 43142, 0x00008C2A }, /* GL_TEXTURE_BUFFER */
+   { 43160, 0x00008C2D }, /* GL_TEXTURE_BUFFER_DATA_STORE_BINDING */
+   { 43197, 0x00008C2E }, /* GL_TEXTURE_BUFFER_FORMAT */
+   { 43222, 0x00008171 }, /* GL_TEXTURE_CLIPMAP_CENTER_SGIX */
+   { 43253, 0x00008176 }, /* GL_TEXTURE_CLIPMAP_DEPTH_SGIX */
+   { 43283, 0x00008172 }, /* GL_TEXTURE_CLIPMAP_FRAME_SGIX */
+   { 43313, 0x00008175 }, /* GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX */
+   { 43348, 0x00008173 }, /* GL_TEXTURE_CLIPMAP_OFFSET_SGIX */
+   { 43379, 0x00008174 }, /* GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX */
+   { 43417, 0x000080BC }, /* GL_TEXTURE_COLOR_TABLE_SGI */
+   { 43444, 0x000081EF }, /* GL_TEXTURE_COLOR_WRITEMASK_SGIS */
+   { 43476, 0x000080BF }, /* GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */
+   { 43510, 0x0000884D }, /* GL_TEXTURE_COMPARE_FUNC */
+   { 43534, 0x0000884D }, /* GL_TEXTURE_COMPARE_FUNC_ARB */
+   { 43562, 0x0000884C }, /* GL_TEXTURE_COMPARE_MODE */
+   { 43586, 0x0000884C }, /* GL_TEXTURE_COMPARE_MODE_ARB */
+   { 43614, 0x0000819B }, /* GL_TEXTURE_COMPARE_OPERATOR_SGIX */
+   { 43647, 0x0000819A }, /* GL_TEXTURE_COMPARE_SGIX */
+   { 43671, 0x00001003 }, /* GL_TEXTURE_COMPONENTS */
+   { 43693, 0x000086A1 }, /* GL_TEXTURE_COMPRESSED */
+   { 43715, 0x000086A1 }, /* GL_TEXTURE_COMPRESSED_ARB */
+   { 43741, 0x000086A3 }, /* GL_TEXTURE_COMPRESSED_FORMATS_ARB */
+   { 43775, 0x000086A0 }, /* GL_TEXTURE_COMPRESSED_IMAGE_SIZE */
+   { 43808, 0x000086A0 }, /* GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB */
+   { 43845, 0x000084EF }, /* GL_TEXTURE_COMPRESSION_HINT */
+   { 43873, 0x000084EF }, /* GL_TEXTURE_COMPRESSION_HINT_ARB */
+   { 43905, 0x00008078 }, /* GL_TEXTURE_COORD_ARRAY */
+   { 43928, 0x0000889A }, /* GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING */
+   { 43966, 0x0000889A }, /* GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB */
+   { 44008, 0x00008092 }, /* GL_TEXTURE_COORD_ARRAY_POINTER */
+   { 44039, 0x00008088 }, /* GL_TEXTURE_COORD_ARRAY_SIZE */
+   { 44067, 0x0000808A }, /* GL_TEXTURE_COORD_ARRAY_STRIDE */
+   { 44097, 0x00008089 }, /* GL_TEXTURE_COORD_ARRAY_TYPE */
+   { 44125, 0x00008B9D }, /* GL_TEXTURE_CROP_RECT_OES */
+   { 44150, 0x00008513 }, /* GL_TEXTURE_CUBE_MAP */
+   { 44170, 0x00008513 }, /* GL_TEXTURE_CUBE_MAP_ARB */
+   { 44194, 0x00008516 }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_X */
+   { 44225, 0x00008516 }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB */
+   { 44260, 0x00008516 }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_X_OES */
+   { 44295, 0x00008518 }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Y */
+   { 44326, 0x00008518 }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB */
+   { 44361, 0x00008518 }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_OES */
+   { 44396, 0x0000851A }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Z */
+   { 44427, 0x0000851A }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB */
+   { 44462, 0x0000851A }, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_OES */
+   { 44497, 0x00008513 }, /* GL_TEXTURE_CUBE_MAP_OES */
+   { 44521, 0x00008515 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_X */
+   { 44552, 0x00008515 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB */
+   { 44587, 0x00008515 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_X_OES */
+   { 44622, 0x00008517 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Y */
+   { 44653, 0x00008517 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB */
+   { 44688, 0x00008517 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Y_OES */
+   { 44723, 0x00008519 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Z */
+   { 44754, 0x00008519 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB */
+   { 44789, 0x00008519 }, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Z_OES */
+   { 44824, 0x000088F4 }, /* GL_TEXTURE_CUBE_MAP_SEAMLESS */
+   { 44853, 0x00008071 }, /* GL_TEXTURE_DEPTH */
+   { 44870, 0x0000884A }, /* GL_TEXTURE_DEPTH_SIZE */
+   { 44892, 0x0000884A }, /* GL_TEXTURE_DEPTH_SIZE_ARB */
+   { 44918, 0x00002300 }, /* GL_TEXTURE_ENV */
+   { 44933, 0x00002201 }, /* GL_TEXTURE_ENV_COLOR */
+   { 44954, 0x00002200 }, /* GL_TEXTURE_ENV_MODE */
+   { 44974, 0x00008500 }, /* GL_TEXTURE_FILTER_CONTROL */
+   { 45000, 0x00008500 }, /* GL_TEXTURE_FILTER_CONTROL_EXT */
+   { 45030, 0x00002500 }, /* GL_TEXTURE_GEN_MODE */
+   { 45050, 0x00002500 }, /* GL_TEXTURE_GEN_MODE_OES */
+   { 45074, 0x00000C63 }, /* GL_TEXTURE_GEN_Q */
+   { 45091, 0x00000C62 }, /* GL_TEXTURE_GEN_R */
+   { 45108, 0x00000C60 }, /* GL_TEXTURE_GEN_S */
+   { 45125, 0x00008D60 }, /* GL_TEXTURE_GEN_STR_OES */
+   { 45148, 0x00000C61 }, /* GL_TEXTURE_GEN_T */
+   { 45165, 0x0000819D }, /* GL_TEXTURE_GEQUAL_R_SGIX */
+   { 45190, 0x0000805D }, /* GL_TEXTURE_GREEN_SIZE */
+   { 45212, 0x0000805D }, /* GL_TEXTURE_GREEN_SIZE_EXT */
+   { 45238, 0x00001001 }, /* GL_TEXTURE_HEIGHT */
+   { 45256, 0x000080ED }, /* GL_TEXTURE_INDEX_SIZE_EXT */
+   { 45282, 0x00008061 }, /* GL_TEXTURE_INTENSITY_SIZE */
+   { 45308, 0x00008061 }, /* GL_TEXTURE_INTENSITY_SIZE_EXT */
+   { 45338, 0x00001003 }, /* GL_TEXTURE_INTERNAL_FORMAT */
+   { 45365, 0x0000819C }, /* GL_TEXTURE_LEQUAL_R_SGIX */
+   { 45390, 0x00008501 }, /* GL_TEXTURE_LOD_BIAS */
+   { 45410, 0x00008501 }, /* GL_TEXTURE_LOD_BIAS_EXT */
+   { 45434, 0x00008190 }, /* GL_TEXTURE_LOD_BIAS_R_SGIX */
+   { 45461, 0x0000818E }, /* GL_TEXTURE_LOD_BIAS_S_SGIX */
+   { 45488, 0x0000818F }, /* GL_TEXTURE_LOD_BIAS_T_SGIX */
+   { 45515, 0x00008060 }, /* GL_TEXTURE_LUMINANCE_SIZE */
+   { 45541, 0x00008060 }, /* GL_TEXTURE_LUMINANCE_SIZE_EXT */
+   { 45571, 0x00002800 }, /* GL_TEXTURE_MAG_FILTER */
+   { 45593, 0x00000BA8 }, /* GL_TEXTURE_MATRIX */
+   { 45611, 0x0000898F }, /* GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES */
+   { 45651, 0x000084FE }, /* GL_TEXTURE_MAX_ANISOTROPY_EXT */
+   { 45681, 0x0000836B }, /* GL_TEXTURE_MAX_CLAMP_R_SGIX */
+   { 45709, 0x00008369 }, /* GL_TEXTURE_MAX_CLAMP_S_SGIX */
+   { 45737, 0x0000836A }, /* GL_TEXTURE_MAX_CLAMP_T_SGIX */
+   { 45765, 0x0000813D }, /* GL_TEXTURE_MAX_LEVEL */
+   { 45786, 0x0000813B }, /* GL_TEXTURE_MAX_LOD */
+   { 45805, 0x00002801 }, /* GL_TEXTURE_MIN_FILTER */
+   { 45827, 0x0000813A }, /* GL_TEXTURE_MIN_LOD */
+   { 45846, 0x00008066 }, /* GL_TEXTURE_PRIORITY */
+   { 45866, 0x000085B7 }, /* GL_TEXTURE_RANGE_LENGTH_APPLE */
+   { 45896, 0x000085B8 }, /* GL_TEXTURE_RANGE_POINTER_APPLE */
+   { 45927, 0x000084F5 }, /* GL_TEXTURE_RECTANGLE */
+   { 45948, 0x000084F5 }, /* GL_TEXTURE_RECTANGLE_ARB */
+   { 45973, 0x000084F5 }, /* GL_TEXTURE_RECTANGLE_NV */
+   { 45997, 0x0000805C }, /* GL_TEXTURE_RED_SIZE */
+   { 46017, 0x0000805C }, /* GL_TEXTURE_RED_SIZE_EXT */
+   { 46041, 0x00008067 }, /* GL_TEXTURE_RESIDENT */
+   { 46061, 0x00008C3F }, /* GL_TEXTURE_SHARED_SIZE */
+   { 46084, 0x00000BA5 }, /* GL_TEXTURE_STACK_DEPTH */
+   { 46107, 0x000088F1 }, /* GL_TEXTURE_STENCIL_SIZE */
+   { 46131, 0x000088F1 }, /* GL_TEXTURE_STENCIL_SIZE_EXT */
+   { 46159, 0x000085BC }, /* GL_TEXTURE_STORAGE_HINT_APPLE */
+   { 46189, 0x00008065 }, /* GL_TEXTURE_TOO_LARGE_EXT */
+   { 46214, 0x0000888F }, /* GL_TEXTURE_UNSIGNED_REMAP_MODE_NV */
+   { 46248, 0x00001000 }, /* GL_TEXTURE_WIDTH */
+   { 46265, 0x00008072 }, /* GL_TEXTURE_WRAP_R */
+   { 46283, 0x00008072 }, /* GL_TEXTURE_WRAP_R_OES */
+   { 46305, 0x00002802 }, /* GL_TEXTURE_WRAP_S */
+   { 46323, 0x00002803 }, /* GL_TEXTURE_WRAP_T */
+   { 46341, 0x0000911B }, /* GL_TIMEOUT_EXPIRED */
+   { 46360, 0x000088BF }, /* GL_TIME_ELAPSED_EXT */
+   { 46380, 0x00008648 }, /* GL_TRACK_MATRIX_NV */
+   { 46399, 0x00008649 }, /* GL_TRACK_MATRIX_TRANSFORM_NV */
+   { 46428, 0x00001000 }, /* GL_TRANSFORM_BIT */
+   { 46445, 0x00008E22 }, /* GL_TRANSFORM_FEEDBACK */
+   { 46467, 0x00008E25 }, /* GL_TRANSFORM_FEEDBACK_BINDING */
+   { 46497, 0x00008C8E }, /* GL_TRANSFORM_FEEDBACK_BUFFER */
+   { 46526, 0x00008E24 }, /* GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE */
+   { 46562, 0x00008C8F }, /* GL_TRANSFORM_FEEDBACK_BUFFER_BINDING */
+   { 46599, 0x00008C8F }, /* GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT */
+   { 46640, 0x00008C8E }, /* GL_TRANSFORM_FEEDBACK_BUFFER_EXT */
+   { 46673, 0x00008C7F }, /* GL_TRANSFORM_FEEDBACK_BUFFER_MODE */
+   { 46707, 0x00008C7F }, /* GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT */
+   { 46745, 0x00008E23 }, /* GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED */
+   { 46781, 0x00008C85 }, /* GL_TRANSFORM_FEEDBACK_BUFFER_SIZE */
+   { 46815, 0x00008C85 }, /* GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT */
+   { 46853, 0x00008C84 }, /* GL_TRANSFORM_FEEDBACK_BUFFER_START */
+   { 46888, 0x00008C84 }, /* GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT */
+   { 46927, 0x00008C88 }, /* GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN */
+   { 46968, 0x00008C88 }, /* GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT */
+   { 47013, 0x00008C83 }, /* GL_TRANSFORM_FEEDBACK_VARYINGS */
+   { 47044, 0x00008C83 }, /* GL_TRANSFORM_FEEDBACK_VARYINGS_EXT */
+   { 47079, 0x00008C76 }, /* GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH */
+   { 47120, 0x00008C76 }, /* GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT */
+   { 47165, 0x000084E6 }, /* GL_TRANSPOSE_COLOR_MATRIX */
+   { 47191, 0x000084E6 }, /* GL_TRANSPOSE_COLOR_MATRIX_ARB */
+   { 47221, 0x000088B7 }, /* GL_TRANSPOSE_CURRENT_MATRIX_ARB */
+   { 47253, 0x000084E3 }, /* GL_TRANSPOSE_MODELVIEW_MATRIX */
+   { 47283, 0x000084E3 }, /* GL_TRANSPOSE_MODELVIEW_MATRIX_ARB */
+   { 47317, 0x0000862C }, /* GL_TRANSPOSE_NV */
+   { 47333, 0x000084E4 }, /* GL_TRANSPOSE_PROJECTION_MATRIX */
+   { 47364, 0x000084E4 }, /* GL_TRANSPOSE_PROJECTION_MATRIX_ARB */
+   { 47399, 0x000084E5 }, /* GL_TRANSPOSE_TEXTURE_MATRIX */
+   { 47427, 0x000084E5 }, /* GL_TRANSPOSE_TEXTURE_MATRIX_ARB */
+   { 47459, 0x00000004 }, /* GL_TRIANGLES */
+   { 47472, 0x0000000C }, /* GL_TRIANGLES_ADJACENCY */
+   { 47495, 0x0000000C }, /* GL_TRIANGLES_ADJACENCY_ARB */
+   { 47522, 0x00000006 }, /* GL_TRIANGLE_FAN */
+   { 47538, 0x00008615 }, /* GL_TRIANGLE_MESH_SUN */
+   { 47559, 0x00000005 }, /* GL_TRIANGLE_STRIP */
+   { 47577, 0x0000000D }, /* GL_TRIANGLE_STRIP_ADJACENCY */
+   { 47605, 0x0000000D }, /* GL_TRIANGLE_STRIP_ADJACENCY_ARB */
+   { 47637, 0x00000001 }, /* GL_TRUE */
+   { 47645, 0x00008A1C }, /* GL_UNDEFINED_APPLE */
+   { 47664, 0x00000CF5 }, /* GL_UNPACK_ALIGNMENT */
+   { 47684, 0x0000806E }, /* GL_UNPACK_IMAGE_HEIGHT */
+   { 47707, 0x00000CF1 }, /* GL_UNPACK_LSB_FIRST */
+   { 47727, 0x00000CF2 }, /* GL_UNPACK_ROW_LENGTH */
+   { 47748, 0x0000806D }, /* GL_UNPACK_SKIP_IMAGES */
+   { 47770, 0x00000CF4 }, /* GL_UNPACK_SKIP_PIXELS */
+   { 47792, 0x00000CF3 }, /* GL_UNPACK_SKIP_ROWS */
+   { 47812, 0x00000CF0 }, /* GL_UNPACK_SWAP_BYTES */
+   { 47833, 0x00009118 }, /* GL_UNSIGNALED */
+   { 47847, 0x00001401 }, /* GL_UNSIGNED_BYTE */
+   { 47864, 0x00008362 }, /* GL_UNSIGNED_BYTE_2_3_3_REV */
+   { 47891, 0x00008032 }, /* GL_UNSIGNED_BYTE_3_3_2 */
+   { 47914, 0x00001405 }, /* GL_UNSIGNED_INT */
+   { 47930, 0x00008C3B }, /* GL_UNSIGNED_INT_10F_11F_11F_REV */
+   { 47962, 0x00008036 }, /* GL_UNSIGNED_INT_10_10_10_2 */
+   { 47989, 0x00008DF6 }, /* GL_UNSIGNED_INT_10_10_10_2_OES */
+   { 48020, 0x000084FA }, /* GL_UNSIGNED_INT_24_8 */
+   { 48041, 0x000084FA }, /* GL_UNSIGNED_INT_24_8_EXT */
+   { 48066, 0x000084FA }, /* GL_UNSIGNED_INT_24_8_NV */
+   { 48090, 0x000084FA }, /* GL_UNSIGNED_INT_24_8_OES */
+   { 48115, 0x00008368 }, /* GL_UNSIGNED_INT_2_10_10_10_REV */
+   { 48146, 0x00008368 }, /* GL_UNSIGNED_INT_2_10_10_10_REV_EXT */
+   { 48181, 0x00008C3E }, /* GL_UNSIGNED_INT_5_9_9_9_REV */
+   { 48209, 0x00008035 }, /* GL_UNSIGNED_INT_8_8_8_8 */
+   { 48233, 0x00008367 }, /* GL_UNSIGNED_INT_8_8_8_8_REV */
+   { 48261, 0x00008DD1 }, /* GL_UNSIGNED_INT_SAMPLER_1D */
+   { 48288, 0x00008DD6 }, /* GL_UNSIGNED_INT_SAMPLER_1D_ARRAY */
+   { 48321, 0x00008DD6 }, /* GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT */
+   { 48358, 0x00008DD1 }, /* GL_UNSIGNED_INT_SAMPLER_1D_EXT */
+   { 48389, 0x00008DD2 }, /* GL_UNSIGNED_INT_SAMPLER_2D */
+   { 48416, 0x00008DD7 }, /* GL_UNSIGNED_INT_SAMPLER_2D_ARRAY */
+   { 48449, 0x00008DD7 }, /* GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT */
+   { 48486, 0x00008DD2 }, /* GL_UNSIGNED_INT_SAMPLER_2D_EXT */
+   { 48517, 0x00008DD5 }, /* GL_UNSIGNED_INT_SAMPLER_2D_RECT */
+   { 48549, 0x00008DD5 }, /* GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT */
+   { 48585, 0x00008DD3 }, /* GL_UNSIGNED_INT_SAMPLER_3D */
+   { 48612, 0x00008DD3 }, /* GL_UNSIGNED_INT_SAMPLER_3D_EXT */
+   { 48643, 0x00008DD8 }, /* GL_UNSIGNED_INT_SAMPLER_BUFFER */
+   { 48674, 0x00008DD8 }, /* GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT */
+   { 48709, 0x00008DD4 }, /* GL_UNSIGNED_INT_SAMPLER_CUBE */
+   { 48738, 0x00008DD4 }, /* GL_UNSIGNED_INT_SAMPLER_CUBE_EXT */
+   { 48771, 0x00008DC6 }, /* GL_UNSIGNED_INT_VEC2 */
+   { 48792, 0x00008DC6 }, /* GL_UNSIGNED_INT_VEC2_EXT */
+   { 48817, 0x00008DC7 }, /* GL_UNSIGNED_INT_VEC3 */
+   { 48838, 0x00008DC7 }, /* GL_UNSIGNED_INT_VEC3_EXT */
+   { 48863, 0x00008DC8 }, /* GL_UNSIGNED_INT_VEC4 */
+   { 48884, 0x00008DC8 }, /* GL_UNSIGNED_INT_VEC4_EXT */
+   { 48909, 0x00008C17 }, /* GL_UNSIGNED_NORMALIZED */
+   { 48932, 0x00001403 }, /* GL_UNSIGNED_SHORT */
+   { 48950, 0x00008366 }, /* GL_UNSIGNED_SHORT_1_5_5_5_REV */
+   { 48980, 0x00008366 }, /* GL_UNSIGNED_SHORT_1_5_5_5_REV_EXT */
+   { 49014, 0x00008033 }, /* GL_UNSIGNED_SHORT_4_4_4_4 */
+   { 49040, 0x00008365 }, /* GL_UNSIGNED_SHORT_4_4_4_4_REV */
+   { 49070, 0x00008365 }, /* GL_UNSIGNED_SHORT_4_4_4_4_REV_EXT */
+   { 49104, 0x00008034 }, /* GL_UNSIGNED_SHORT_5_5_5_1 */
+   { 49130, 0x00008363 }, /* GL_UNSIGNED_SHORT_5_6_5 */
+   { 49154, 0x00008364 }, /* GL_UNSIGNED_SHORT_5_6_5_REV */
+   { 49182, 0x000085BA }, /* GL_UNSIGNED_SHORT_8_8_APPLE */
+   { 49210, 0x000085BA }, /* GL_UNSIGNED_SHORT_8_8_MESA */
+   { 49237, 0x000085BB }, /* GL_UNSIGNED_SHORT_8_8_REV_APPLE */
+   { 49269, 0x000085BB }, /* GL_UNSIGNED_SHORT_8_8_REV_MESA */
+   { 49300, 0x00008CA2 }, /* GL_UPPER_LEFT */
+   { 49314, 0x00002A20 }, /* GL_V2F */
+   { 49321, 0x00002A21 }, /* GL_V3F */
+   { 49328, 0x00008B83 }, /* GL_VALIDATE_STATUS */
+   { 49347, 0x00001F00 }, /* GL_VENDOR */
+   { 49357, 0x00001F02 }, /* GL_VERSION */
+   { 49368, 0x00008074 }, /* GL_VERTEX_ARRAY */
+   { 49384, 0x000085B5 }, /* GL_VERTEX_ARRAY_BINDING */
+   { 49408, 0x000085B5 }, /* GL_VERTEX_ARRAY_BINDING_APPLE */
+   { 49438, 0x00008896 }, /* GL_VERTEX_ARRAY_BUFFER_BINDING */
+   { 49469, 0x00008896 }, /* GL_VERTEX_ARRAY_BUFFER_BINDING_ARB */
+   { 49504, 0x0000808E }, /* GL_VERTEX_ARRAY_POINTER */
+   { 49528, 0x0000807A }, /* GL_VERTEX_ARRAY_SIZE */
+   { 49549, 0x0000807C }, /* GL_VERTEX_ARRAY_STRIDE */
+   { 49572, 0x0000807B }, /* GL_VERTEX_ARRAY_TYPE */
+   { 49593, 0x00008650 }, /* GL_VERTEX_ATTRIB_ARRAY0_NV */
+   { 49620, 0x0000865A }, /* GL_VERTEX_ATTRIB_ARRAY10_NV */
+   { 49648, 0x0000865B }, /* GL_VERTEX_ATTRIB_ARRAY11_NV */
+   { 49676, 0x0000865C }, /* GL_VERTEX_ATTRIB_ARRAY12_NV */
+   { 49704, 0x0000865D }, /* GL_VERTEX_ATTRIB_ARRAY13_NV */
+   { 49732, 0x0000865E }, /* GL_VERTEX_ATTRIB_ARRAY14_NV */
+   { 49760, 0x0000865F }, /* GL_VERTEX_ATTRIB_ARRAY15_NV */
+   { 49788, 0x00008651 }, /* GL_VERTEX_ATTRIB_ARRAY1_NV */
+   { 49815, 0x00008652 }, /* GL_VERTEX_ATTRIB_ARRAY2_NV */
+   { 49842, 0x00008653 }, /* GL_VERTEX_ATTRIB_ARRAY3_NV */
+   { 49869, 0x00008654 }, /* GL_VERTEX_ATTRIB_ARRAY4_NV */
+   { 49896, 0x00008655 }, /* GL_VERTEX_ATTRIB_ARRAY5_NV */
+   { 49923, 0x00008656 }, /* GL_VERTEX_ATTRIB_ARRAY6_NV */
+   { 49950, 0x00008657 }, /* GL_VERTEX_ATTRIB_ARRAY7_NV */
+   { 49977, 0x00008658 }, /* GL_VERTEX_ATTRIB_ARRAY8_NV */
+   { 50004, 0x00008659 }, /* GL_VERTEX_ATTRIB_ARRAY9_NV */
+   { 50031, 0x0000889F }, /* GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING */
+   { 50069, 0x0000889F }, /* GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB */
+   { 50111, 0x000088FE }, /* GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB */
+   { 50146, 0x00008622 }, /* GL_VERTEX_ATTRIB_ARRAY_ENABLED */
+   { 50177, 0x00008622 }, /* GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB */
+   { 50212, 0x000088FD }, /* GL_VERTEX_ATTRIB_ARRAY_INTEGER */
+   { 50243, 0x000088FD }, /* GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT */
+   { 50278, 0x0000886A }, /* GL_VERTEX_ATTRIB_ARRAY_NORMALIZED */
+   { 50312, 0x0000886A }, /* GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB */
+   { 50350, 0x00008645 }, /* GL_VERTEX_ATTRIB_ARRAY_POINTER */
+   { 50381, 0x00008645 }, /* GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB */
+   { 50416, 0x00008623 }, /* GL_VERTEX_ATTRIB_ARRAY_SIZE */
+   { 50444, 0x00008623 }, /* GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB */
+   { 50476, 0x00008624 }, /* GL_VERTEX_ATTRIB_ARRAY_STRIDE */
+   { 50506, 0x00008624 }, /* GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB */
+   { 50540, 0x00008625 }, /* GL_VERTEX_ATTRIB_ARRAY_TYPE */
+   { 50568, 0x00008625 }, /* GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB */
+   { 50600, 0x000086A7 }, /* GL_VERTEX_BLEND_ARB */
+   { 50620, 0x00008620 }, /* GL_VERTEX_PROGRAM_ARB */
+   { 50642, 0x0000864A }, /* GL_VERTEX_PROGRAM_BINDING_NV */
+   { 50671, 0x00008620 }, /* GL_VERTEX_PROGRAM_NV */
+   { 50692, 0x00008642 }, /* GL_VERTEX_PROGRAM_POINT_SIZE */
+   { 50721, 0x00008642 }, /* GL_VERTEX_PROGRAM_POINT_SIZE_ARB */
+   { 50754, 0x00008642 }, /* GL_VERTEX_PROGRAM_POINT_SIZE_NV */
+   { 50786, 0x00008643 }, /* GL_VERTEX_PROGRAM_TWO_SIDE */
+   { 50813, 0x00008643 }, /* GL_VERTEX_PROGRAM_TWO_SIDE_ARB */
+   { 50844, 0x00008643 }, /* GL_VERTEX_PROGRAM_TWO_SIDE_NV */
+   { 50874, 0x00008B31 }, /* GL_VERTEX_SHADER */
+   { 50891, 0x00008B31 }, /* GL_VERTEX_SHADER_ARB */
+   { 50912, 0x00008621 }, /* GL_VERTEX_STATE_PROGRAM_NV */
+   { 50939, 0x00000BA2 }, /* GL_VIEWPORT */
+   { 50951, 0x00000800 }, /* GL_VIEWPORT_BIT */
+   { 50967, 0x00008A1A }, /* GL_VOLATILE_APPLE */
+   { 50985, 0x0000911D }, /* GL_WAIT_FAILED */
+   { 51000, 0x000086AD }, /* GL_WEIGHT_ARRAY_ARB */
+   { 51020, 0x0000889E }, /* GL_WEIGHT_ARRAY_BUFFER_BINDING */
+   { 51051, 0x0000889E }, /* GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB */
+   { 51086, 0x0000889E }, /* GL_WEIGHT_ARRAY_BUFFER_BINDING_OES */
+   { 51121, 0x000086AD }, /* GL_WEIGHT_ARRAY_OES */
+   { 51141, 0x000086AC }, /* GL_WEIGHT_ARRAY_POINTER_ARB */
+   { 51169, 0x000086AC }, /* GL_WEIGHT_ARRAY_POINTER_OES */
+   { 51197, 0x000086AB }, /* GL_WEIGHT_ARRAY_SIZE_ARB */
+   { 51222, 0x000086AB }, /* GL_WEIGHT_ARRAY_SIZE_OES */
+   { 51247, 0x000086AA }, /* GL_WEIGHT_ARRAY_STRIDE_ARB */
+   { 51274, 0x000086AA }, /* GL_WEIGHT_ARRAY_STRIDE_OES */
+   { 51301, 0x000086A9 }, /* GL_WEIGHT_ARRAY_TYPE_ARB */
+   { 51326, 0x000086A9 }, /* GL_WEIGHT_ARRAY_TYPE_OES */
+   { 51351, 0x000086A6 }, /* GL_WEIGHT_SUM_UNITY_ARB */
+   { 51375, 0x000081D4 }, /* GL_WRAP_BORDER_SUN */
+   { 51394, 0x000088B9 }, /* GL_WRITE_ONLY */
+   { 51408, 0x000088B9 }, /* GL_WRITE_ONLY_ARB */
+   { 51426, 0x000088B9 }, /* GL_WRITE_ONLY_OES */
+   { 51444, 0x00001506 }, /* GL_XOR */
+   { 51451, 0x000085B9 }, /* GL_YCBCR_422_APPLE */
+   { 51470, 0x00008757 }, /* GL_YCBCR_MESA */
+   { 51484, 0x00000000 }, /* GL_ZERO */
+   { 51492, 0x00000D16 }, /* GL_ZOOM_X */
+   { 51502, 0x00000D17 }, /* GL_ZOOM_Y */
+};
+
+static const unsigned reduced_enums[1555] =
+{
+       538, /* GL_FALSE */
+       831, /* GL_LINES */
+       835, /* GL_LINE_LOOP */
+       842, /* GL_LINE_STRIP */
+      2140, /* GL_TRIANGLES */
+      2145, /* GL_TRIANGLE_STRIP */
+      2143, /* GL_TRIANGLE_FAN */
+      1511, /* GL_QUADS */
+      1515, /* GL_QUAD_STRIP */
+      1382, /* GL_POLYGON */
+       832, /* GL_LINES_ADJACENCY */
+       843, /* GL_LINE_STRIP_ADJACENCY */
+      2141, /* GL_TRIANGLES_ADJACENCY */
+      2146, /* GL_TRIANGLE_STRIP_ADJACENCY */
+      1394, /* GL_POLYGON_STIPPLE_BIT */
+      1337, /* GL_PIXEL_MODE_BIT */
+       818, /* GL_LIGHTING_BIT */
+       572, /* GL_FOG_BIT */
+         8, /* GL_ACCUM */
+       854, /* GL_LOAD */
+      1600, /* GL_RETURN */
+      1204, /* GL_MULT */
+        24, /* GL_ADD */
+      1220, /* GL_NEVER */
+       808, /* GL_LESS */
+       528, /* GL_EQUAL */
+       807, /* GL_LEQUAL */
+       695, /* GL_GREATER */
+      1237, /* GL_NOTEQUAL */
+       694, /* GL_GEQUAL */
+        55, /* GL_ALWAYS */
+      1808, /* GL_SRC_COLOR */
+      1270, /* GL_ONE_MINUS_SRC_COLOR */
+      1806, /* GL_SRC_ALPHA */
+      1269, /* GL_ONE_MINUS_SRC_ALPHA */
+       507, /* GL_DST_ALPHA */
+      1267, /* GL_ONE_MINUS_DST_ALPHA */
+       508, /* GL_DST_COLOR */
+      1268, /* GL_ONE_MINUS_DST_COLOR */
+      1807, /* GL_SRC_ALPHA_SATURATE */
+       671, /* GL_FRONT_LEFT */
+       672, /* GL_FRONT_RIGHT */
+        77, /* GL_BACK_LEFT */
+        78, /* GL_BACK_RIGHT */
+       668, /* GL_FRONT */
+        76, /* GL_BACK */
+       806, /* GL_LEFT */
+      1690, /* GL_RIGHT */
+       669, /* GL_FRONT_AND_BACK */
+        71, /* GL_AUX0 */
+        72, /* GL_AUX1 */
+        73, /* GL_AUX2 */
+        74, /* GL_AUX3 */
+       794, /* GL_INVALID_ENUM */
+       799, /* GL_INVALID_VALUE */
+       798, /* GL_INVALID_OPERATION */
+      1813, /* GL_STACK_OVERFLOW */
+      1814, /* GL_STACK_UNDERFLOW */
+      1295, /* GL_OUT_OF_MEMORY */
+       795, /* GL_INVALID_FRAMEBUFFER_OPERATION */
+         0, /* GL_2D */
+         2, /* GL_3D */
+         3, /* GL_3D_COLOR */
+         4, /* GL_3D_COLOR_TEXTURE */
+         6, /* GL_4D_COLOR_TEXTURE */
+      1315, /* GL_PASS_THROUGH_TOKEN */
+      1381, /* GL_POINT_TOKEN */
+       845, /* GL_LINE_TOKEN */
+      1395, /* GL_POLYGON_TOKEN */
+        87, /* GL_BITMAP_TOKEN */
+       506, /* GL_DRAW_PIXEL_TOKEN */
+       352, /* GL_COPY_PIXEL_TOKEN */
+       836, /* GL_LINE_RESET_TOKEN */
+       531, /* GL_EXP */
+       532, /* GL_EXP2 */
+       389, /* GL_CW */
+       154, /* GL_CCW */
+       187, /* GL_COEFF */
+      1292, /* GL_ORDER */
+       443, /* GL_DOMAIN */
+       362, /* GL_CURRENT_COLOR */
+       365, /* GL_CURRENT_INDEX */
+       371, /* GL_CURRENT_NORMAL */
+       385, /* GL_CURRENT_TEXTURE_COORDS */
+       377, /* GL_CURRENT_RASTER_COLOR */
+       379, /* GL_CURRENT_RASTER_INDEX */
+       383, /* GL_CURRENT_RASTER_TEXTURE_COORDS */
+       380, /* GL_CURRENT_RASTER_POSITION */
+       381, /* GL_CURRENT_RASTER_POSITION_VALID */
+       378, /* GL_CURRENT_RASTER_DISTANCE */
+      1373, /* GL_POINT_SMOOTH */
+      1357, /* GL_POINT_SIZE */
+      1372, /* GL_POINT_SIZE_RANGE */
+      1363, /* GL_POINT_SIZE_GRANULARITY */
+       837, /* GL_LINE_SMOOTH */
+       846, /* GL_LINE_WIDTH */
+       848, /* GL_LINE_WIDTH_RANGE */
+       847, /* GL_LINE_WIDTH_GRANULARITY */
+       839, /* GL_LINE_STIPPLE */
+       840, /* GL_LINE_STIPPLE_PATTERN */
+       841, /* GL_LINE_STIPPLE_REPEAT */
+       853, /* GL_LIST_MODE */
+      1060, /* GL_MAX_LIST_NESTING */
+       850, /* GL_LIST_BASE */
+       852, /* GL_LIST_INDEX */
+      1384, /* GL_POLYGON_MODE */
+      1391, /* GL_POLYGON_SMOOTH */
+      1393, /* GL_POLYGON_STIPPLE */
+       517, /* GL_EDGE_FLAG */
+       355, /* GL_CULL_FACE */
+       356, /* GL_CULL_FACE_MODE */
+       670, /* GL_FRONT_FACE */
+       817, /* GL_LIGHTING */
+       822, /* GL_LIGHT_MODEL_LOCAL_VIEWER */
+       823, /* GL_LIGHT_MODEL_TWO_SIDE */
+       819, /* GL_LIGHT_MODEL_AMBIENT */
+      1755, /* GL_SHADE_MODEL */
+       235, /* GL_COLOR_MATERIAL_FACE */
+       236, /* GL_COLOR_MATERIAL_PARAMETER */
+       234, /* GL_COLOR_MATERIAL */
+       571, /* GL_FOG */
+       593, /* GL_FOG_INDEX */
+       589, /* GL_FOG_DENSITY */
+       597, /* GL_FOG_START */
+       591, /* GL_FOG_END */
+       594, /* GL_FOG_MODE */
+       573, /* GL_FOG_COLOR */
+       428, /* GL_DEPTH_RANGE */
+       437, /* GL_DEPTH_TEST */
+       440, /* GL_DEPTH_WRITEMASK */
+       413, /* GL_DEPTH_CLEAR_VALUE */
+       427, /* GL_DEPTH_FUNC */
+        12, /* GL_ACCUM_CLEAR_VALUE */
+      1858, /* GL_STENCIL_TEST */
+      1839, /* GL_STENCIL_CLEAR_VALUE */
+      1841, /* GL_STENCIL_FUNC */
+      1860, /* GL_STENCIL_VALUE_MASK */
+      1840, /* GL_STENCIL_FAIL */
+      1855, /* GL_STENCIL_PASS_DEPTH_FAIL */
+      1856, /* GL_STENCIL_PASS_DEPTH_PASS */
+      1857, /* GL_STENCIL_REF */
+      1861, /* GL_STENCIL_WRITEMASK */
+      1010, /* GL_MATRIX_MODE */
+      1226, /* GL_NORMALIZE */
+      2272, /* GL_VIEWPORT */
+      1199, /* GL_MODELVIEW_STACK_DEPTH */
+      1485, /* GL_PROJECTION_STACK_DEPTH */
+      2094, /* GL_TEXTURE_STACK_DEPTH */
+      1196, /* GL_MODELVIEW_MATRIX */
+      1483, /* GL_PROJECTION_MATRIX */
+      2074, /* GL_TEXTURE_MATRIX */
+        69, /* GL_ATTRIB_STACK_DEPTH */
+       169, /* GL_CLIENT_ATTRIB_STACK_DEPTH */
+        51, /* GL_ALPHA_TEST */
+        52, /* GL_ALPHA_TEST_FUNC */
+        53, /* GL_ALPHA_TEST_REF */
+       442, /* GL_DITHER */
+        91, /* GL_BLEND_DST */
+       105, /* GL_BLEND_SRC */
+        88, /* GL_BLEND */
+       856, /* GL_LOGIC_OP_MODE */
+       743, /* GL_INDEX_LOGIC_OP */
+       233, /* GL_COLOR_LOGIC_OP */
+        75, /* GL_AUX_BUFFERS */
+       453, /* GL_DRAW_BUFFER */
+      1538, /* GL_READ_BUFFER */
+      1732, /* GL_SCISSOR_BOX */
+      1733, /* GL_SCISSOR_TEST */
+       742, /* GL_INDEX_CLEAR_VALUE */
+       747, /* GL_INDEX_WRITEMASK */
+       230, /* GL_COLOR_CLEAR_VALUE */
+       272, /* GL_COLOR_WRITEMASK */
+       744, /* GL_INDEX_MODE */
+      1679, /* GL_RGBA_MODE */
+       452, /* GL_DOUBLEBUFFER */
+      1862, /* GL_STEREO */
+      1592, /* GL_RENDER_MODE */
+      1316, /* GL_PERSPECTIVE_CORRECTION_HINT */
+      1374, /* GL_POINT_SMOOTH_HINT */
+       838, /* GL_LINE_SMOOTH_HINT */
+      1392, /* GL_POLYGON_SMOOTH_HINT */
+       592, /* GL_FOG_HINT */
+      2054, /* GL_TEXTURE_GEN_S */
+      2056, /* GL_TEXTURE_GEN_T */
+      2053, /* GL_TEXTURE_GEN_R */
+      2052, /* GL_TEXTURE_GEN_Q */
+      1329, /* GL_PIXEL_MAP_I_TO_I */
+      1335, /* GL_PIXEL_MAP_S_TO_S */
+      1331, /* GL_PIXEL_MAP_I_TO_R */
+      1327, /* GL_PIXEL_MAP_I_TO_G */
+      1325, /* GL_PIXEL_MAP_I_TO_B */
+      1323, /* GL_PIXEL_MAP_I_TO_A */
+      1333, /* GL_PIXEL_MAP_R_TO_R */
+      1321, /* GL_PIXEL_MAP_G_TO_G */
+      1319, /* GL_PIXEL_MAP_B_TO_B */
+      1317, /* GL_PIXEL_MAP_A_TO_A */
+      1330, /* GL_PIXEL_MAP_I_TO_I_SIZE */
+      1336, /* GL_PIXEL_MAP_S_TO_S_SIZE */
+      1332, /* GL_PIXEL_MAP_I_TO_R_SIZE */
+      1328, /* GL_PIXEL_MAP_I_TO_G_SIZE */
+      1326, /* GL_PIXEL_MAP_I_TO_B_SIZE */
+      1324, /* GL_PIXEL_MAP_I_TO_A_SIZE */
+      1334, /* GL_PIXEL_MAP_R_TO_R_SIZE */
+      1322, /* GL_PIXEL_MAP_G_TO_G_SIZE */
+      1320, /* GL_PIXEL_MAP_B_TO_B_SIZE */
+      1318, /* GL_PIXEL_MAP_A_TO_A_SIZE */
+      2157, /* GL_UNPACK_SWAP_BYTES */
+      2152, /* GL_UNPACK_LSB_FIRST */
+      2153, /* GL_UNPACK_ROW_LENGTH */
+      2156, /* GL_UNPACK_SKIP_ROWS */
+      2155, /* GL_UNPACK_SKIP_PIXELS */
+      2150, /* GL_UNPACK_ALIGNMENT */
+      1304, /* GL_PACK_SWAP_BYTES */
+      1299, /* GL_PACK_LSB_FIRST */
+      1300, /* GL_PACK_ROW_LENGTH */
+      1303, /* GL_PACK_SKIP_ROWS */
+      1302, /* GL_PACK_SKIP_PIXELS */
+      1296, /* GL_PACK_ALIGNMENT */
+       951, /* GL_MAP_COLOR */
+       956, /* GL_MAP_STENCIL */
+       746, /* GL_INDEX_SHIFT */
+       745, /* GL_INDEX_OFFSET */
+      1554, /* GL_RED_SCALE */
+      1550, /* GL_RED_BIAS */
+      2298, /* GL_ZOOM_X */
+      2299, /* GL_ZOOM_Y */
+       701, /* GL_GREEN_SCALE */
+       697, /* GL_GREEN_BIAS */
+       115, /* GL_BLUE_SCALE */
+       111, /* GL_BLUE_BIAS */
+        50, /* GL_ALPHA_SCALE */
+        47, /* GL_ALPHA_BIAS */
+       429, /* GL_DEPTH_SCALE */
+       405, /* GL_DEPTH_BIAS */
+      1042, /* GL_MAX_EVAL_ORDER */
+      1059, /* GL_MAX_LIGHTS */
+      1022, /* GL_MAX_CLIP_DISTANCES */
+      1114, /* GL_MAX_TEXTURE_SIZE */
+      1066, /* GL_MAX_PIXEL_MAP_TABLE */
+      1018, /* GL_MAX_ATTRIB_STACK_DEPTH */
+      1062, /* GL_MAX_MODELVIEW_STACK_DEPTH */
+      1063, /* GL_MAX_NAME_STACK_DEPTH */
+      1094, /* GL_MAX_PROJECTION_STACK_DEPTH */
+      1115, /* GL_MAX_TEXTURE_STACK_DEPTH */
+      1141, /* GL_MAX_VIEWPORT_DIMS */
+      1019, /* GL_MAX_CLIENT_ATTRIB_STACK_DEPTH */
+      1872, /* GL_SUBPIXEL_BITS */
+       741, /* GL_INDEX_BITS */
+      1551, /* GL_RED_BITS */
+       698, /* GL_GREEN_BITS */
+       112, /* GL_BLUE_BITS */
+        48, /* GL_ALPHA_BITS */
+       406, /* GL_DEPTH_BITS */
+      1836, /* GL_STENCIL_BITS */
+        14, /* GL_ACCUM_RED_BITS */
+        13, /* GL_ACCUM_GREEN_BITS */
+        10, /* GL_ACCUM_BLUE_BITS */
+         9, /* GL_ACCUM_ALPHA_BITS */
+      1213, /* GL_NAME_STACK_DEPTH */
+        70, /* GL_AUTO_NORMAL */
+       897, /* GL_MAP1_COLOR_4 */
+       900, /* GL_MAP1_INDEX */
+       901, /* GL_MAP1_NORMAL */
+       902, /* GL_MAP1_TEXTURE_COORD_1 */
+       903, /* GL_MAP1_TEXTURE_COORD_2 */
+       904, /* GL_MAP1_TEXTURE_COORD_3 */
+       905, /* GL_MAP1_TEXTURE_COORD_4 */
+       906, /* GL_MAP1_VERTEX_3 */
+       907, /* GL_MAP1_VERTEX_4 */
+       924, /* GL_MAP2_COLOR_4 */
+       927, /* GL_MAP2_INDEX */
+       928, /* GL_MAP2_NORMAL */
+       929, /* GL_MAP2_TEXTURE_COORD_1 */
+       930, /* GL_MAP2_TEXTURE_COORD_2 */
+       931, /* GL_MAP2_TEXTURE_COORD_3 */
+       932, /* GL_MAP2_TEXTURE_COORD_4 */
+       933, /* GL_MAP2_VERTEX_3 */
+       934, /* GL_MAP2_VERTEX_4 */
+       898, /* GL_MAP1_GRID_DOMAIN */
+       899, /* GL_MAP1_GRID_SEGMENTS */
+       925, /* GL_MAP2_GRID_DOMAIN */
+       926, /* GL_MAP2_GRID_SEGMENTS */
+      1955, /* GL_TEXTURE_1D */
+      1958, /* GL_TEXTURE_2D */
+       541, /* GL_FEEDBACK_BUFFER_POINTER */
+       542, /* GL_FEEDBACK_BUFFER_SIZE */
+       543, /* GL_FEEDBACK_BUFFER_TYPE */
+      1742, /* GL_SELECTION_BUFFER_POINTER */
+      1743, /* GL_SELECTION_BUFFER_SIZE */
+      2100, /* GL_TEXTURE_WIDTH */
+      2060, /* GL_TEXTURE_HEIGHT */
+      2004, /* GL_TEXTURE_COMPONENTS */
+      1985, /* GL_TEXTURE_BORDER_COLOR */
+      1984, /* GL_TEXTURE_BORDER */
+       444, /* GL_DONT_CARE */
+       539, /* GL_FASTEST */
+      1221, /* GL_NICEST */
+        56, /* GL_AMBIENT */
+       441, /* GL_DIFFUSE */
+      1795, /* GL_SPECULAR */
+      1396, /* GL_POSITION */
+      1798, /* GL_SPOT_DIRECTION */
+      1799, /* GL_SPOT_EXPONENT */
+      1797, /* GL_SPOT_CUTOFF */
+       320, /* GL_CONSTANT_ATTENUATION */
+       826, /* GL_LINEAR_ATTENUATION */
+      1510, /* GL_QUADRATIC_ATTENUATION */
+       287, /* GL_COMPILE */
+       288, /* GL_COMPILE_AND_EXECUTE */
+       149, /* GL_BYTE */
+      2159, /* GL_UNSIGNED_BYTE */
+      1760, /* GL_SHORT */
+      2198, /* GL_UNSIGNED_SHORT */
+       749, /* GL_INT */
+      2162, /* GL_UNSIGNED_INT */
+       552, /* GL_FLOAT */
+         1, /* GL_2_BYTES */
+         5, /* GL_3_BYTES */
+         7, /* GL_4_BYTES */
+       451, /* GL_DOUBLE */
+       702, /* GL_HALF_FLOAT */
+       547, /* GL_FIXED */
+       165, /* GL_CLEAR */
+        58, /* GL_AND */
+        60, /* GL_AND_REVERSE */
+       350, /* GL_COPY */
+        59, /* GL_AND_INVERTED */
+      1224, /* GL_NOOP */
+      2294, /* GL_XOR */
+      1291, /* GL_OR */
+      1225, /* GL_NOR */
+       529, /* GL_EQUIV */
+       802, /* GL_INVERT */
+      1294, /* GL_OR_REVERSE */
+       351, /* GL_COPY_INVERTED */
+      1293, /* GL_OR_INVERTED */
+      1214, /* GL_NAND */
+      1749, /* GL_SET */
+       526, /* GL_EMISSION */
+      1759, /* GL_SHININESS */
+        57, /* GL_AMBIENT_AND_DIFFUSE */
+       232, /* GL_COLOR_INDEXES */
+      1163, /* GL_MODELVIEW */
+      1482, /* GL_PROJECTION */
+      1890, /* GL_TEXTURE */
+       188, /* GL_COLOR */
+       398, /* GL_DEPTH */
+      1821, /* GL_STENCIL */
+       231, /* GL_COLOR_INDEX */
+      1842, /* GL_STENCIL_INDEX */
+       414, /* GL_DEPTH_COMPONENT */
+      1547, /* GL_RED */
+       696, /* GL_GREEN */
+       110, /* GL_BLUE */
+        32, /* GL_ALPHA */
+      1603, /* GL_RGB */
+      1643, /* GL_RGBA */
+       860, /* GL_LUMINANCE */
+       887, /* GL_LUMINANCE_ALPHA */
+        86, /* GL_BITMAP */
+      1346, /* GL_POINT */
+       824, /* GL_LINE */
+       544, /* GL_FILL */
+      1561, /* GL_RENDER */
+       540, /* GL_FEEDBACK */
+      1741, /* GL_SELECT */
+       551, /* GL_FLAT */
+      1770, /* GL_SMOOTH */
+       803, /* GL_KEEP */
+      1594, /* GL_REPLACE */
+       731, /* GL_INCR */
+       394, /* GL_DECR */
+      2215, /* GL_VENDOR */
+      1591, /* GL_RENDERER */
+      2216, /* GL_VERSION */
+       533, /* GL_EXTENSIONS */
+      1691, /* GL_S */
+      1881, /* GL_T */
+      1530, /* GL_R */
+      1509, /* GL_Q */
+      1200, /* GL_MODULATE */
+       393, /* GL_DECAL */
+      2047, /* GL_TEXTURE_ENV_MODE */
+      2046, /* GL_TEXTURE_ENV_COLOR */
+      2045, /* GL_TEXTURE_ENV */
+       534, /* GL_EYE_LINEAR */
+      1252, /* GL_OBJECT_LINEAR */
+      1796, /* GL_SPHERE_MAP */
+      2050, /* GL_TEXTURE_GEN_MODE */
+      1254, /* GL_OBJECT_PLANE */
+       535, /* GL_EYE_PLANE */
+      1215, /* GL_NEAREST */
+       825, /* GL_LINEAR */
+      1219, /* GL_NEAREST_MIPMAP_NEAREST */
+       830, /* GL_LINEAR_MIPMAP_NEAREST */
+      1218, /* GL_NEAREST_MIPMAP_LINEAR */
+       829, /* GL_LINEAR_MIPMAP_LINEAR */
+      2073, /* GL_TEXTURE_MAG_FILTER */
+      2082, /* GL_TEXTURE_MIN_FILTER */
+      2103, /* GL_TEXTURE_WRAP_S */
+      2104, /* GL_TEXTURE_WRAP_T */
+       155, /* GL_CLAMP */
+      1593, /* GL_REPEAT */
+      1390, /* GL_POLYGON_OFFSET_UNITS */
+      1389, /* GL_POLYGON_OFFSET_POINT */
+      1388, /* GL_POLYGON_OFFSET_LINE */
+      1533, /* GL_R3_G3_B2 */
+      2212, /* GL_V2F */
+      2213, /* GL_V3F */
+       152, /* GL_C4UB_V2F */
+       153, /* GL_C4UB_V3F */
+       150, /* GL_C3F_V3F */
+      1212, /* GL_N3F_V3F */
+       151, /* GL_C4F_N3F_V3F */
+      1886, /* GL_T2F_V3F */
+      1888, /* GL_T4F_V4F */
+      1884, /* GL_T2F_C4UB_V3F */
+      1882, /* GL_T2F_C3F_V3F */
+      1885, /* GL_T2F_N3F_V3F */
+      1883, /* GL_T2F_C4F_N3F_V3F */
+      1887, /* GL_T4F_C4F_N3F_V4F */
+       172, /* GL_CLIP_DISTANCE0 */
+       173, /* GL_CLIP_DISTANCE1 */
+       174, /* GL_CLIP_DISTANCE2 */
+       175, /* GL_CLIP_DISTANCE3 */
+       176, /* GL_CLIP_DISTANCE4 */
+       177, /* GL_CLIP_DISTANCE5 */
+       178, /* GL_CLIP_DISTANCE6 */
+       179, /* GL_CLIP_DISTANCE7 */
+       809, /* GL_LIGHT0 */
+       810, /* GL_LIGHT1 */
+       811, /* GL_LIGHT2 */
+       812, /* GL_LIGHT3 */
+       813, /* GL_LIGHT4 */
+       814, /* GL_LIGHT5 */
+       815, /* GL_LIGHT6 */
+       816, /* GL_LIGHT7 */
+       706, /* GL_HINT_BIT */
+       322, /* GL_CONSTANT_COLOR */
+      1265, /* GL_ONE_MINUS_CONSTANT_COLOR */
+       317, /* GL_CONSTANT_ALPHA */
+      1263, /* GL_ONE_MINUS_CONSTANT_ALPHA */
+        89, /* GL_BLEND_COLOR */
+       673, /* GL_FUNC_ADD */
+      1144, /* GL_MIN */
+      1013, /* GL_MAX */
+        96, /* GL_BLEND_EQUATION */
+       679, /* GL_FUNC_SUBTRACT */
+       676, /* GL_FUNC_REVERSE_SUBTRACT */
+       330, /* GL_CONVOLUTION_1D */
+       331, /* GL_CONVOLUTION_2D */
+      1744, /* GL_SEPARABLE_2D */
+       334, /* GL_CONVOLUTION_BORDER_MODE */
+       338, /* GL_CONVOLUTION_FILTER_SCALE */
+       336, /* GL_CONVOLUTION_FILTER_BIAS */
+      1548, /* GL_REDUCE */
+       340, /* GL_CONVOLUTION_FORMAT */
+       344, /* GL_CONVOLUTION_WIDTH */
+       342, /* GL_CONVOLUTION_HEIGHT */
+      1032, /* GL_MAX_CONVOLUTION_WIDTH */
+      1030, /* GL_MAX_CONVOLUTION_HEIGHT */
+      1429, /* GL_POST_CONVOLUTION_RED_SCALE */
+      1425, /* GL_POST_CONVOLUTION_GREEN_SCALE */
+      1420, /* GL_POST_CONVOLUTION_BLUE_SCALE */
+      1416, /* GL_POST_CONVOLUTION_ALPHA_SCALE */
+      1427, /* GL_POST_CONVOLUTION_RED_BIAS */
+      1423, /* GL_POST_CONVOLUTION_GREEN_BIAS */
+      1418, /* GL_POST_CONVOLUTION_BLUE_BIAS */
+      1414, /* GL_POST_CONVOLUTION_ALPHA_BIAS */
+       707, /* GL_HISTOGRAM */
+      1489, /* GL_PROXY_HISTOGRAM */
+       723, /* GL_HISTOGRAM_WIDTH */
+       713, /* GL_HISTOGRAM_FORMAT */
+       719, /* GL_HISTOGRAM_RED_SIZE */
+       715, /* GL_HISTOGRAM_GREEN_SIZE */
+       710, /* GL_HISTOGRAM_BLUE_SIZE */
+       708, /* GL_HISTOGRAM_ALPHA_SIZE */
+       717, /* GL_HISTOGRAM_LUMINANCE_SIZE */
+       721, /* GL_HISTOGRAM_SINK */
+      1145, /* GL_MINMAX */
+      1147, /* GL_MINMAX_FORMAT */
+      1149, /* GL_MINMAX_SINK */
+      1889, /* GL_TABLE_TOO_LARGE_EXT */
+      2161, /* GL_UNSIGNED_BYTE_3_3_2 */
+      2201, /* GL_UNSIGNED_SHORT_4_4_4_4 */
+      2204, /* GL_UNSIGNED_SHORT_5_5_5_1 */
+      2173, /* GL_UNSIGNED_INT_8_8_8_8 */
+      2164, /* GL_UNSIGNED_INT_10_10_10_2 */
+      1387, /* GL_POLYGON_OFFSET_FILL */
+      1386, /* GL_POLYGON_OFFSET_FACTOR */
+      1385, /* GL_POLYGON_OFFSET_BIAS */
+      1597, /* GL_RESCALE_NORMAL */
+        41, /* GL_ALPHA4 */
+        43, /* GL_ALPHA8 */
+        33, /* GL_ALPHA12 */
+        35, /* GL_ALPHA16 */
+       875, /* GL_LUMINANCE4 */
+       881, /* GL_LUMINANCE8 */
+       861, /* GL_LUMINANCE12 */
+       867, /* GL_LUMINANCE16 */
+       876, /* GL_LUMINANCE4_ALPHA4 */
+       879, /* GL_LUMINANCE6_ALPHA2 */
+       884, /* GL_LUMINANCE8_ALPHA8 */
+       864, /* GL_LUMINANCE12_ALPHA4 */
+       862, /* GL_LUMINANCE12_ALPHA12 */
+       870, /* GL_LUMINANCE16_ALPHA16 */
+       750, /* GL_INTENSITY */
+       759, /* GL_INTENSITY4 */
+       761, /* GL_INTENSITY8 */
+       751, /* GL_INTENSITY12 */
+       753, /* GL_INTENSITY16 */
+      1618, /* GL_RGB2_EXT */
+      1624, /* GL_RGB4 */
+      1627, /* GL_RGB5 */
+      1634, /* GL_RGB8 */
+      1604, /* GL_RGB10 */
+      1608, /* GL_RGB12 */
+      1610, /* GL_RGB16 */
+      1654, /* GL_RGBA2 */
+      1661, /* GL_RGBA4 */
+      1630, /* GL_RGB5_A1 */
+      1666, /* GL_RGBA8 */
+      1605, /* GL_RGB10_A2 */
+      1644, /* GL_RGBA12 */
+      1646, /* GL_RGBA16 */
+      2090, /* GL_TEXTURE_RED_SIZE */
+      2058, /* GL_TEXTURE_GREEN_SIZE */
+      1982, /* GL_TEXTURE_BLUE_SIZE */
+      1963, /* GL_TEXTURE_ALPHA_SIZE */
+      2071, /* GL_TEXTURE_LUMINANCE_SIZE */
+      2062, /* GL_TEXTURE_INTENSITY_SIZE */
+      1595, /* GL_REPLACE_EXT */
+      1493, /* GL_PROXY_TEXTURE_1D */
+      1497, /* GL_PROXY_TEXTURE_2D */
+      2098, /* GL_TEXTURE_TOO_LARGE_EXT */
+      2084, /* GL_TEXTURE_PRIORITY */
+      2092, /* GL_TEXTURE_RESIDENT */
+      1966, /* GL_TEXTURE_BINDING_1D */
+      1969, /* GL_TEXTURE_BINDING_2D */
+      1972, /* GL_TEXTURE_BINDING_3D */
+      1301, /* GL_PACK_SKIP_IMAGES */
+      1297, /* GL_PACK_IMAGE_HEIGHT */
+      2154, /* GL_UNPACK_SKIP_IMAGES */
+      2151, /* GL_UNPACK_IMAGE_HEIGHT */
+      1961, /* GL_TEXTURE_3D */
+      1501, /* GL_PROXY_TEXTURE_3D */
+      2042, /* GL_TEXTURE_DEPTH */
+      2101, /* GL_TEXTURE_WRAP_R */
+      1014, /* GL_MAX_3D_TEXTURE_SIZE */
+      2217, /* GL_VERTEX_ARRAY */
+      1227, /* GL_NORMAL_ARRAY */
+       189, /* GL_COLOR_ARRAY */
+       735, /* GL_INDEX_ARRAY */
+      2012, /* GL_TEXTURE_COORD_ARRAY */
+       518, /* GL_EDGE_FLAG_ARRAY */
+      2223, /* GL_VERTEX_ARRAY_SIZE */
+      2225, /* GL_VERTEX_ARRAY_TYPE */
+      2224, /* GL_VERTEX_ARRAY_STRIDE */
+      1232, /* GL_NORMAL_ARRAY_TYPE */
+      1231, /* GL_NORMAL_ARRAY_STRIDE */
+       193, /* GL_COLOR_ARRAY_SIZE */
+       195, /* GL_COLOR_ARRAY_TYPE */
+       194, /* GL_COLOR_ARRAY_STRIDE */
+       740, /* GL_INDEX_ARRAY_TYPE */
+       739, /* GL_INDEX_ARRAY_STRIDE */
+      2016, /* GL_TEXTURE_COORD_ARRAY_SIZE */
+      2018, /* GL_TEXTURE_COORD_ARRAY_TYPE */
+      2017, /* GL_TEXTURE_COORD_ARRAY_STRIDE */
+       522, /* GL_EDGE_FLAG_ARRAY_STRIDE */
+      2222, /* GL_VERTEX_ARRAY_POINTER */
+      1230, /* GL_NORMAL_ARRAY_POINTER */
+       192, /* GL_COLOR_ARRAY_POINTER */
+       738, /* GL_INDEX_ARRAY_POINTER */
+      2015, /* GL_TEXTURE_COORD_ARRAY_POINTER */
+       521, /* GL_EDGE_FLAG_ARRAY_POINTER */
+      1205, /* GL_MULTISAMPLE */
+      1718, /* GL_SAMPLE_ALPHA_TO_COVERAGE */
+      1720, /* GL_SAMPLE_ALPHA_TO_ONE */
+      1725, /* GL_SAMPLE_COVERAGE */
+      1722, /* GL_SAMPLE_BUFFERS */
+      1713, /* GL_SAMPLES */
+      1729, /* GL_SAMPLE_COVERAGE_VALUE */
+      1727, /* GL_SAMPLE_COVERAGE_INVERT */
+       237, /* GL_COLOR_MATRIX */
+       239, /* GL_COLOR_MATRIX_STACK_DEPTH */
+      1026, /* GL_MAX_COLOR_MATRIX_STACK_DEPTH */
+      1412, /* GL_POST_COLOR_MATRIX_RED_SCALE */
+      1408, /* GL_POST_COLOR_MATRIX_GREEN_SCALE */
+      1403, /* GL_POST_COLOR_MATRIX_BLUE_SCALE */
+      1399, /* GL_POST_COLOR_MATRIX_ALPHA_SCALE */
+      1410, /* GL_POST_COLOR_MATRIX_RED_BIAS */
+      1406, /* GL_POST_COLOR_MATRIX_GREEN_BIAS */
+      1401, /* GL_POST_COLOR_MATRIX_BLUE_BIAS */
+      1397, /* GL_POST_COLOR_MATRIX_ALPHA_BIAS */
+      1995, /* GL_TEXTURE_COLOR_TABLE_SGI */
+      1502, /* GL_PROXY_TEXTURE_COLOR_TABLE_SGI */
+      1997, /* GL_TEXTURE_COMPARE_FAIL_VALUE_ARB */
+        94, /* GL_BLEND_DST_RGB */
+       108, /* GL_BLEND_SRC_RGB */
+        92, /* GL_BLEND_DST_ALPHA */
+       106, /* GL_BLEND_SRC_ALPHA */
+       243, /* GL_COLOR_TABLE */
+      1422, /* GL_POST_CONVOLUTION_COLOR_TABLE */
+      1405, /* GL_POST_COLOR_MATRIX_COLOR_TABLE */
+      1488, /* GL_PROXY_COLOR_TABLE */
+      1492, /* GL_PROXY_POST_CONVOLUTION_COLOR_TABLE */
+      1491, /* GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE */
+       267, /* GL_COLOR_TABLE_SCALE */
+       247, /* GL_COLOR_TABLE_BIAS */
+       252, /* GL_COLOR_TABLE_FORMAT */
+       269, /* GL_COLOR_TABLE_WIDTH */
+       264, /* GL_COLOR_TABLE_RED_SIZE */
+       255, /* GL_COLOR_TABLE_GREEN_SIZE */
+       249, /* GL_COLOR_TABLE_BLUE_SIZE */
+       244, /* GL_COLOR_TABLE_ALPHA_SIZE */
+       261, /* GL_COLOR_TABLE_LUMINANCE_SIZE */
+       258, /* GL_COLOR_TABLE_INTENSITY_SIZE */
+        79, /* GL_BGR */
+        80, /* GL_BGRA */
+      1041, /* GL_MAX_ELEMENTS_VERTICES */
+      1040, /* GL_MAX_ELEMENTS_INDICES */
+      2061, /* GL_TEXTURE_INDEX_SIZE_EXT */
+       186, /* GL_CLIP_VOLUME_CLIPPING_HINT_EXT */
+      1368, /* GL_POINT_SIZE_MIN */
+      1364, /* GL_POINT_SIZE_MAX */
+      1353, /* GL_POINT_FADE_THRESHOLD_SIZE */
+      1349, /* GL_POINT_DISTANCE_ATTENUATION */
+       159, /* GL_CLAMP_TO_BORDER */
+       162, /* GL_CLAMP_TO_EDGE */
+      2083, /* GL_TEXTURE_MIN_LOD */
+      2081, /* GL_TEXTURE_MAX_LOD */
+      1965, /* GL_TEXTURE_BASE_LEVEL */
+      2080, /* GL_TEXTURE_MAX_LEVEL */
+       726, /* GL_IGNORE_BORDER_HP */
+       321, /* GL_CONSTANT_BORDER_HP */
+      1596, /* GL_REPLICATE_BORDER_HP */
+       332, /* GL_CONVOLUTION_BORDER_COLOR */
+      1260, /* GL_OCCLUSION_TEST_HP */
+      1261, /* GL_OCCLUSION_TEST_RESULT_HP */
+       827, /* GL_LINEAR_CLIPMAP_LINEAR_SGIX */
+      1989, /* GL_TEXTURE_CLIPMAP_CENTER_SGIX */
+      1991, /* GL_TEXTURE_CLIPMAP_FRAME_SGIX */
+      1993, /* GL_TEXTURE_CLIPMAP_OFFSET_SGIX */
+      1994, /* GL_TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX */
+      1992, /* GL_TEXTURE_CLIPMAP_LOD_OFFSET_SGIX */
+      1990, /* GL_TEXTURE_CLIPMAP_DEPTH_SGIX */
+      1020, /* GL_MAX_CLIPMAP_DEPTH_SGIX */
+      1021, /* GL_MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX */
+      1432, /* GL_POST_TEXTURE_FILTER_BIAS_SGIX */
+      1434, /* GL_POST_TEXTURE_FILTER_SCALE_SGIX */
+      1431, /* GL_POST_TEXTURE_FILTER_BIAS_RANGE_SGIX */
+      1433, /* GL_POST_TEXTURE_FILTER_SCALE_RANGE_SGIX */
+      2069, /* GL_TEXTURE_LOD_BIAS_S_SGIX */
+      2070, /* GL_TEXTURE_LOD_BIAS_T_SGIX */
+      2068, /* GL_TEXTURE_LOD_BIAS_R_SGIX */
+       682, /* GL_GENERATE_MIPMAP */
+       683, /* GL_GENERATE_MIPMAP_HINT */
+       595, /* GL_FOG_OFFSET_SGIX */
+       596, /* GL_FOG_OFFSET_VALUE_SGIX */
+      2003, /* GL_TEXTURE_COMPARE_SGIX */
+      2002, /* GL_TEXTURE_COMPARE_OPERATOR_SGIX */
+      2065, /* GL_TEXTURE_LEQUAL_R_SGIX */
+      2057, /* GL_TEXTURE_GEQUAL_R_SGIX */
+       415, /* GL_DEPTH_COMPONENT16 */
+       419, /* GL_DEPTH_COMPONENT24 */
+       423, /* GL_DEPTH_COMPONENT32 */
+       357, /* GL_CULL_VERTEX_EXT */
+       359, /* GL_CULL_VERTEX_OBJECT_POSITION_EXT */
+       358, /* GL_CULL_VERTEX_EYE_POSITION_EXT */
+      2290, /* GL_WRAP_BORDER_SUN */
+      1996, /* GL_TEXTURE_COLOR_WRITEMASK_SGIS */
+       820, /* GL_LIGHT_MODEL_COLOR_CONTROL */
+      1763, /* GL_SINGLE_COLOR */
+      1747, /* GL_SEPARATE_SPECULAR_COLOR */
+      1758, /* GL_SHARED_TEXTURE_PALETTE_EXT */
+       607, /* GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING */
+       608, /* GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE */
+       619, /* GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE */
+       610, /* GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE */
+       606, /* GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE */
+       605, /* GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE */
+       609, /* GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE */
+       620, /* GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE */
+       637, /* GL_FRAMEBUFFER_DEFAULT */
+       664, /* GL_FRAMEBUFFER_UNDEFINED */
+       431, /* GL_DEPTH_STENCIL_ATTACHMENT */
+       896, /* GL_MAJOR_VERSION */
+      1151, /* GL_MINOR_VERSION */
+      1241, /* GL_NUM_EXTENSIONS */
+       327, /* GL_CONTEXT_FLAGS */
+       734, /* GL_INDEX */
+       409, /* GL_DEPTH_BUFFER */
+      1837, /* GL_STENCIL_BUFFER */
+       298, /* GL_COMPRESSED_RED */
+       299, /* GL_COMPRESSED_RG */
+      2160, /* GL_UNSIGNED_BYTE_2_3_3_REV */
+      2205, /* GL_UNSIGNED_SHORT_5_6_5 */
+      2206, /* GL_UNSIGNED_SHORT_5_6_5_REV */
+      2202, /* GL_UNSIGNED_SHORT_4_4_4_4_REV */
+      2199, /* GL_UNSIGNED_SHORT_1_5_5_5_REV */
+      2174, /* GL_UNSIGNED_INT_8_8_8_8_REV */
+      2170, /* GL_UNSIGNED_INT_2_10_10_10_REV */
+      2078, /* GL_TEXTURE_MAX_CLAMP_S_SGIX */
+      2079, /* GL_TEXTURE_MAX_CLAMP_T_SGIX */
+      2077, /* GL_TEXTURE_MAX_CLAMP_R_SGIX */
+      1155, /* GL_MIRRORED_REPEAT */
+      1684, /* GL_RGB_S3TC */
+      1626, /* GL_RGB4_S3TC */
+      1680, /* GL_RGBA_S3TC */
+      1665, /* GL_RGBA4_S3TC */
+      1674, /* GL_RGBA_DXT5_S3TC */
+      1662, /* GL_RGBA4_DXT5_S3TC */
+       309, /* GL_COMPRESSED_RGB_S3TC_DXT1_EXT */
+       304, /* GL_COMPRESSED_RGBA_S3TC_DXT1_EXT */
+       305, /* GL_COMPRESSED_RGBA_S3TC_DXT3_EXT */
+       306, /* GL_COMPRESSED_RGBA_S3TC_DXT5_EXT */
+      1217, /* GL_NEAREST_CLIPMAP_NEAREST_SGIX */
+      1216, /* GL_NEAREST_CLIPMAP_LINEAR_SGIX */
+       828, /* GL_LINEAR_CLIPMAP_NEAREST_SGIX */
+       582, /* GL_FOG_COORDINATE_SOURCE */
+       574, /* GL_FOG_COORD */
+       598, /* GL_FRAGMENT_DEPTH */
+       363, /* GL_CURRENT_FOG_COORD */
+       581, /* GL_FOG_COORDINATE_ARRAY_TYPE */
+       580, /* GL_FOG_COORDINATE_ARRAY_STRIDE */
+       579, /* GL_FOG_COORDINATE_ARRAY_POINTER */
+       576, /* GL_FOG_COORDINATE_ARRAY */
+       241, /* GL_COLOR_SUM */
+       384, /* GL_CURRENT_SECONDARY_COLOR */
+      1738, /* GL_SECONDARY_COLOR_ARRAY_SIZE */
+      1740, /* GL_SECONDARY_COLOR_ARRAY_TYPE */
+      1739, /* GL_SECONDARY_COLOR_ARRAY_STRIDE */
+      1737, /* GL_SECONDARY_COLOR_ARRAY_POINTER */
+      1734, /* GL_SECONDARY_COLOR_ARRAY */
+       382, /* GL_CURRENT_RASTER_SECONDARY_COLOR */
+        29, /* GL_ALIASED_POINT_SIZE_RANGE */
+        28, /* GL_ALIASED_LINE_WIDTH_RANGE */
+      1891, /* GL_TEXTURE0 */
+      1893, /* GL_TEXTURE1 */
+      1915, /* GL_TEXTURE2 */
+      1937, /* GL_TEXTURE3 */
+      1943, /* GL_TEXTURE4 */
+      1945, /* GL_TEXTURE5 */
+      1947, /* GL_TEXTURE6 */
+      1949, /* GL_TEXTURE7 */
+      1951, /* GL_TEXTURE8 */
+      1953, /* GL_TEXTURE9 */
+      1894, /* GL_TEXTURE10 */
+      1896, /* GL_TEXTURE11 */
+      1898, /* GL_TEXTURE12 */
+      1900, /* GL_TEXTURE13 */
+      1902, /* GL_TEXTURE14 */
+      1904, /* GL_TEXTURE15 */
+      1906, /* GL_TEXTURE16 */
+      1908, /* GL_TEXTURE17 */
+      1910, /* GL_TEXTURE18 */
+      1912, /* GL_TEXTURE19 */
+      1916, /* GL_TEXTURE20 */
+      1918, /* GL_TEXTURE21 */
+      1920, /* GL_TEXTURE22 */
+      1922, /* GL_TEXTURE23 */
+      1924, /* GL_TEXTURE24 */
+      1926, /* GL_TEXTURE25 */
+      1928, /* GL_TEXTURE26 */
+      1930, /* GL_TEXTURE27 */
+      1932, /* GL_TEXTURE28 */
+      1934, /* GL_TEXTURE29 */
+      1938, /* GL_TEXTURE30 */
+      1940, /* GL_TEXTURE31 */
+        19, /* GL_ACTIVE_TEXTURE */
+       166, /* GL_CLIENT_ACTIVE_TEXTURE */
+      1116, /* GL_MAX_TEXTURE_UNITS */
+      2133, /* GL_TRANSPOSE_MODELVIEW_MATRIX */
+      2136, /* GL_TRANSPOSE_PROJECTION_MATRIX */
+      2138, /* GL_TRANSPOSE_TEXTURE_MATRIX */
+      2130, /* GL_TRANSPOSE_COLOR_MATRIX */
+      1873, /* GL_SUBTRACT */
+      1098, /* GL_MAX_RENDERBUFFER_SIZE */
+       290, /* GL_COMPRESSED_ALPHA */
+       294, /* GL_COMPRESSED_LUMINANCE */
+       295, /* GL_COMPRESSED_LUMINANCE_ALPHA */
+       292, /* GL_COMPRESSED_INTENSITY */
+       300, /* GL_COMPRESSED_RGB */
+       301, /* GL_COMPRESSED_RGBA */
+      2010, /* GL_TEXTURE_COMPRESSION_HINT */
+      2087, /* GL_TEXTURE_RECTANGLE */
+      1978, /* GL_TEXTURE_BINDING_RECTANGLE */
+      1505, /* GL_PROXY_TEXTURE_RECTANGLE */
+      1095, /* GL_MAX_RECTANGLE_TEXTURE_SIZE */
+       430, /* GL_DEPTH_STENCIL */
+      2166, /* GL_UNSIGNED_INT_24_8 */
+      1111, /* GL_MAX_TEXTURE_LOD_BIAS */
+      2076, /* GL_TEXTURE_MAX_ANISOTROPY_EXT */
+      1113, /* GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT */
+      2048, /* GL_TEXTURE_FILTER_CONTROL */
+      2066, /* GL_TEXTURE_LOD_BIAS */
+       274, /* GL_COMBINE4 */
+      1104, /* GL_MAX_SHININESS_NV */
+      1105, /* GL_MAX_SPOT_EXPONENT_NV */
+       732, /* GL_INCR_WRAP */
+       395, /* GL_DECR_WRAP */
+      1175, /* GL_MODELVIEW1_ARB */
+      1233, /* GL_NORMAL_MAP */
+      1556, /* GL_REFLECTION_MAP */
+      2020, /* GL_TEXTURE_CUBE_MAP */
+      1975, /* GL_TEXTURE_BINDING_CUBE_MAP */
+      2032, /* GL_TEXTURE_CUBE_MAP_POSITIVE_X */
+      2022, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_X */
+      2035, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Y */
+      2025, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Y */
+      2038, /* GL_TEXTURE_CUBE_MAP_POSITIVE_Z */
+      2028, /* GL_TEXTURE_CUBE_MAP_NEGATIVE_Z */
+      1503, /* GL_PROXY_TEXTURE_CUBE_MAP */
+      1034, /* GL_MAX_CUBE_MAP_TEXTURE_SIZE */
+      1211, /* GL_MULTISAMPLE_FILTER_HINT_NV */
+      1446, /* GL_PRIMITIVE_RESTART_NV */
+      1445, /* GL_PRIMITIVE_RESTART_INDEX_NV */
+       590, /* GL_FOG_DISTANCE_MODE_NV */
+       537, /* GL_EYE_RADIAL_NV */
+       536, /* GL_EYE_PLANE_ABSOLUTE_NV */
+       273, /* GL_COMBINE */
+       280, /* GL_COMBINE_RGB */
+       275, /* GL_COMBINE_ALPHA */
+      1685, /* GL_RGB_SCALE */
+        25, /* GL_ADD_SIGNED */
+       768, /* GL_INTERPOLATE */
+       316, /* GL_CONSTANT */
+      1438, /* GL_PRIMARY_COLOR */
+      1435, /* GL_PREVIOUS */
+      1778, /* GL_SOURCE0_RGB */
+      1784, /* GL_SOURCE1_RGB */
+      1790, /* GL_SOURCE2_RGB */
+      1794, /* GL_SOURCE3_RGB_NV */
+      1775, /* GL_SOURCE0_ALPHA */
+      1781, /* GL_SOURCE1_ALPHA */
+      1787, /* GL_SOURCE2_ALPHA */
+      1793, /* GL_SOURCE3_ALPHA_NV */
+      1274, /* GL_OPERAND0_RGB */
+      1280, /* GL_OPERAND1_RGB */
+      1286, /* GL_OPERAND2_RGB */
+      1290, /* GL_OPERAND3_RGB_NV */
+      1271, /* GL_OPERAND0_ALPHA */
+      1277, /* GL_OPERAND1_ALPHA */
+      1283, /* GL_OPERAND2_ALPHA */
+      1289, /* GL_OPERAND3_ALPHA_NV */
+       137, /* GL_BUFFER_OBJECT_APPLE */
+      2218, /* GL_VERTEX_ARRAY_BINDING */
+      2085, /* GL_TEXTURE_RANGE_LENGTH_APPLE */
+      2086, /* GL_TEXTURE_RANGE_POINTER_APPLE */
+      2295, /* GL_YCBCR_422_APPLE */
+      2207, /* GL_UNSIGNED_SHORT_8_8_APPLE */
+      2209, /* GL_UNSIGNED_SHORT_8_8_REV_APPLE */
+      2097, /* GL_TEXTURE_STORAGE_HINT_APPLE */
+      1864, /* GL_STORAGE_PRIVATE_APPLE */
+      1863, /* GL_STORAGE_CACHED_APPLE */
+      1865, /* GL_STORAGE_SHARED_APPLE */
+      1765, /* GL_SLICE_ACCUM_SUN */
+      1514, /* GL_QUAD_MESH_SUN */
+      2144, /* GL_TRIANGLE_MESH_SUN */
+      2260, /* GL_VERTEX_PROGRAM_ARB */
+      2271, /* GL_VERTEX_STATE_PROGRAM_NV */
+      2245, /* GL_VERTEX_ATTRIB_ARRAY_ENABLED */
+      2253, /* GL_VERTEX_ATTRIB_ARRAY_SIZE */
+      2255, /* GL_VERTEX_ATTRIB_ARRAY_STRIDE */
+      2257, /* GL_VERTEX_ATTRIB_ARRAY_TYPE */
+       386, /* GL_CURRENT_VERTEX_ATTRIB */
+      1459, /* GL_PROGRAM_LENGTH_ARB */
+      1475, /* GL_PROGRAM_STRING_ARB */
+      1198, /* GL_MODELVIEW_PROJECTION_NV */
+       725, /* GL_IDENTITY_NV */
+       800, /* GL_INVERSE_NV */
+      2135, /* GL_TRANSPOSE_NV */
+       801, /* GL_INVERSE_TRANSPOSE_NV */
+      1079, /* GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB */
+      1078, /* GL_MAX_PROGRAM_MATRICES_ARB */
+       960, /* GL_MATRIX0_NV */
+       972, /* GL_MATRIX1_NV */
+       984, /* GL_MATRIX2_NV */
+       988, /* GL_MATRIX3_NV */
+       990, /* GL_MATRIX4_NV */
+       992, /* GL_MATRIX5_NV */
+       994, /* GL_MATRIX6_NV */
+       996, /* GL_MATRIX7_NV */
+       369, /* GL_CURRENT_MATRIX_STACK_DEPTH_ARB */
+       366, /* GL_CURRENT_MATRIX_ARB */
+      1472, /* GL_PROGRAM_POINT_SIZE */
+      2266, /* GL_VERTEX_PROGRAM_TWO_SIDE */
+      1471, /* GL_PROGRAM_PARAMETER_NV */
+      2251, /* GL_VERTEX_ATTRIB_ARRAY_POINTER */
+      1477, /* GL_PROGRAM_TARGET_NV */
+      1474, /* GL_PROGRAM_RESIDENT_NV */
+      2107, /* GL_TRACK_MATRIX_NV */
+      2108, /* GL_TRACK_MATRIX_TRANSFORM_NV */
+      2261, /* GL_VERTEX_PROGRAM_BINDING_NV */
+      1453, /* GL_PROGRAM_ERROR_POSITION_ARB */
+       411, /* GL_DEPTH_CLAMP */
+      2226, /* GL_VERTEX_ATTRIB_ARRAY0_NV */
+      2233, /* GL_VERTEX_ATTRIB_ARRAY1_NV */
+      2234, /* GL_VERTEX_ATTRIB_ARRAY2_NV */
+      2235, /* GL_VERTEX_ATTRIB_ARRAY3_NV */
+      2236, /* GL_VERTEX_ATTRIB_ARRAY4_NV */
+      2237, /* GL_VERTEX_ATTRIB_ARRAY5_NV */
+      2238, /* GL_VERTEX_ATTRIB_ARRAY6_NV */
+      2239, /* GL_VERTEX_ATTRIB_ARRAY7_NV */
+      2240, /* GL_VERTEX_ATTRIB_ARRAY8_NV */
+      2241, /* GL_VERTEX_ATTRIB_ARRAY9_NV */
+      2227, /* GL_VERTEX_ATTRIB_ARRAY10_NV */
+      2228, /* GL_VERTEX_ATTRIB_ARRAY11_NV */
+      2229, /* GL_VERTEX_ATTRIB_ARRAY12_NV */
+      2230, /* GL_VERTEX_ATTRIB_ARRAY13_NV */
+      2231, /* GL_VERTEX_ATTRIB_ARRAY14_NV */
+      2232, /* GL_VERTEX_ATTRIB_ARRAY15_NV */
+       908, /* GL_MAP1_VERTEX_ATTRIB0_4_NV */
+       915, /* GL_MAP1_VERTEX_ATTRIB1_4_NV */
+       916, /* GL_MAP1_VERTEX_ATTRIB2_4_NV */
+       917, /* GL_MAP1_VERTEX_ATTRIB3_4_NV */
+       918, /* GL_MAP1_VERTEX_ATTRIB4_4_NV */
+       919, /* GL_MAP1_VERTEX_ATTRIB5_4_NV */
+       920, /* GL_MAP1_VERTEX_ATTRIB6_4_NV */
+       921, /* GL_MAP1_VERTEX_ATTRIB7_4_NV */
+       922, /* GL_MAP1_VERTEX_ATTRIB8_4_NV */
+       923, /* GL_MAP1_VERTEX_ATTRIB9_4_NV */
+       909, /* GL_MAP1_VERTEX_ATTRIB10_4_NV */
+       910, /* GL_MAP1_VERTEX_ATTRIB11_4_NV */
+       911, /* GL_MAP1_VERTEX_ATTRIB12_4_NV */
+       912, /* GL_MAP1_VERTEX_ATTRIB13_4_NV */
+       913, /* GL_MAP1_VERTEX_ATTRIB14_4_NV */
+       914, /* GL_MAP1_VERTEX_ATTRIB15_4_NV */
+       935, /* GL_MAP2_VERTEX_ATTRIB0_4_NV */
+       942, /* GL_MAP2_VERTEX_ATTRIB1_4_NV */
+       943, /* GL_MAP2_VERTEX_ATTRIB2_4_NV */
+       944, /* GL_MAP2_VERTEX_ATTRIB3_4_NV */
+       945, /* GL_MAP2_VERTEX_ATTRIB4_4_NV */
+       946, /* GL_MAP2_VERTEX_ATTRIB5_4_NV */
+       947, /* GL_MAP2_VERTEX_ATTRIB6_4_NV */
+      1452, /* GL_PROGRAM_BINDING_ARB */
+       949, /* GL_MAP2_VERTEX_ATTRIB8_4_NV */
+       950, /* GL_MAP2_VERTEX_ATTRIB9_4_NV */
+       936, /* GL_MAP2_VERTEX_ATTRIB10_4_NV */
+       937, /* GL_MAP2_VERTEX_ATTRIB11_4_NV */
+       938, /* GL_MAP2_VERTEX_ATTRIB12_4_NV */
+       939, /* GL_MAP2_VERTEX_ATTRIB13_4_NV */
+       940, /* GL_MAP2_VERTEX_ATTRIB14_4_NV */
+       941, /* GL_MAP2_VERTEX_ATTRIB15_4_NV */
+      2008, /* GL_TEXTURE_COMPRESSED_IMAGE_SIZE */
+      2005, /* GL_TEXTURE_COMPRESSED */
+      1239, /* GL_NUM_COMPRESSED_TEXTURE_FORMATS */
+       314, /* GL_COMPRESSED_TEXTURE_FORMATS */
+      1138, /* GL_MAX_VERTEX_UNITS_ARB */
+        23, /* GL_ACTIVE_VERTEX_UNITS_ARB */
+      2289, /* GL_WEIGHT_SUM_UNITY_ARB */
+      2259, /* GL_VERTEX_BLEND_ARB */
+       388, /* GL_CURRENT_WEIGHT_ARB */
+      2287, /* GL_WEIGHT_ARRAY_TYPE_ARB */
+      2285, /* GL_WEIGHT_ARRAY_STRIDE_ARB */
+      2283, /* GL_WEIGHT_ARRAY_SIZE_ARB */
+      2281, /* GL_WEIGHT_ARRAY_POINTER_ARB */
+      2276, /* GL_WEIGHT_ARRAY_ARB */
+       445, /* GL_DOT3_RGB */
+       446, /* GL_DOT3_RGBA */
+       308, /* GL_COMPRESSED_RGB_FXT1_3DFX */
+       303, /* GL_COMPRESSED_RGBA_FXT1_3DFX */
+      1206, /* GL_MULTISAMPLE_3DFX */
+      1723, /* GL_SAMPLE_BUFFERS_3DFX */
+      1714, /* GL_SAMPLES_3DFX */
+      1186, /* GL_MODELVIEW2_ARB */
+      1189, /* GL_MODELVIEW3_ARB */
+      1190, /* GL_MODELVIEW4_ARB */
+      1191, /* GL_MODELVIEW5_ARB */
+      1192, /* GL_MODELVIEW6_ARB */
+      1193, /* GL_MODELVIEW7_ARB */
+      1194, /* GL_MODELVIEW8_ARB */
+      1195, /* GL_MODELVIEW9_ARB */
+      1165, /* GL_MODELVIEW10_ARB */
+      1166, /* GL_MODELVIEW11_ARB */
+      1167, /* GL_MODELVIEW12_ARB */
+      1168, /* GL_MODELVIEW13_ARB */
+      1169, /* GL_MODELVIEW14_ARB */
+      1170, /* GL_MODELVIEW15_ARB */
+      1171, /* GL_MODELVIEW16_ARB */
+      1172, /* GL_MODELVIEW17_ARB */
+      1173, /* GL_MODELVIEW18_ARB */
+      1174, /* GL_MODELVIEW19_ARB */
+      1176, /* GL_MODELVIEW20_ARB */
+      1177, /* GL_MODELVIEW21_ARB */
+      1178, /* GL_MODELVIEW22_ARB */
+      1179, /* GL_MODELVIEW23_ARB */
+      1180, /* GL_MODELVIEW24_ARB */
+      1181, /* GL_MODELVIEW25_ARB */
+      1182, /* GL_MODELVIEW26_ARB */
+      1183, /* GL_MODELVIEW27_ARB */
+      1184, /* GL_MODELVIEW28_ARB */
+      1185, /* GL_MODELVIEW29_ARB */
+      1187, /* GL_MODELVIEW30_ARB */
+      1188, /* GL_MODELVIEW31_ARB */
+       450, /* GL_DOT3_RGB_EXT */
+       448, /* GL_DOT3_RGBA_EXT */
+      1159, /* GL_MIRROR_CLAMP_EXT */
+      1162, /* GL_MIRROR_CLAMP_TO_EDGE_EXT */
+      1201, /* GL_MODULATE_ADD_ATI */
+      1202, /* GL_MODULATE_SIGNED_ADD_ATI */
+      1203, /* GL_MODULATE_SUBTRACT_ATI */
+      2296, /* GL_YCBCR_MESA */
+      1298, /* GL_PACK_INVERT_MESA */
+       391, /* GL_DEBUG_OBJECT_MESA */
+       392, /* GL_DEBUG_PRINT_MESA */
+       390, /* GL_DEBUG_ASSERT_MESA */
+       139, /* GL_BUFFER_SIZE */
+       141, /* GL_BUFFER_USAGE */
+       145, /* GL_BUMP_ROT_MATRIX_ATI */
+       146, /* GL_BUMP_ROT_MATRIX_SIZE_ATI */
+       144, /* GL_BUMP_NUM_TEX_UNITS_ATI */
+       148, /* GL_BUMP_TEX_UNITS_ATI */
+       510, /* GL_DUDV_ATI */
+       509, /* GL_DU8DV8_ATI */
+       143, /* GL_BUMP_ENVMAP_ATI */
+       147, /* GL_BUMP_TARGET_ATI */
+      1242, /* GL_NUM_PROGRAM_BINARY_FORMATS_OES */
+      1450, /* GL_PROGRAM_BINARY_FORMATS_OES */
+      1827, /* GL_STENCIL_BACK_FUNC */
+      1825, /* GL_STENCIL_BACK_FAIL */
+      1829, /* GL_STENCIL_BACK_PASS_DEPTH_FAIL */
+      1831, /* GL_STENCIL_BACK_PASS_DEPTH_PASS */
+       599, /* GL_FRAGMENT_PROGRAM_ARB */
+      1448, /* GL_PROGRAM_ALU_INSTRUCTIONS_ARB */
+      1480, /* GL_PROGRAM_TEX_INSTRUCTIONS_ARB */
+      1479, /* GL_PROGRAM_TEX_INDIRECTIONS_ARB */
+      1462, /* GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB */
+      1468, /* GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB */
+      1467, /* GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB */
+      1068, /* GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB */
+      1093, /* GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB */
+      1092, /* GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB */
+      1081, /* GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB */
+      1087, /* GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB */
+      1086, /* GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB */
+      1656, /* GL_RGBA32F */
+      1619, /* GL_RGB32F */
+      1647, /* GL_RGBA16F */
+      1611, /* GL_RGB16F */
+      1675, /* GL_RGBA_FLOAT_MODE_ARB */
+      1037, /* GL_MAX_DRAW_BUFFERS */
+       454, /* GL_DRAW_BUFFER0 */
+       457, /* GL_DRAW_BUFFER1 */
+       478, /* GL_DRAW_BUFFER2 */
+       481, /* GL_DRAW_BUFFER3 */
+       484, /* GL_DRAW_BUFFER4 */
+       487, /* GL_DRAW_BUFFER5 */
+       490, /* GL_DRAW_BUFFER6 */
+       493, /* GL_DRAW_BUFFER7 */
+       496, /* GL_DRAW_BUFFER8 */
+       499, /* GL_DRAW_BUFFER9 */
+       458, /* GL_DRAW_BUFFER10 */
+       461, /* GL_DRAW_BUFFER11 */
+       464, /* GL_DRAW_BUFFER12 */
+       467, /* GL_DRAW_BUFFER13 */
+       470, /* GL_DRAW_BUFFER14 */
+       473, /* GL_DRAW_BUFFER15 */
+        97, /* GL_BLEND_EQUATION_ALPHA */
+      1011, /* GL_MATRIX_PALETTE_ARB */
+      1061, /* GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB */
+      1064, /* GL_MAX_PALETTE_MATRICES_ARB */
+       372, /* GL_CURRENT_PALETTE_MATRIX_ARB */
+       999, /* GL_MATRIX_INDEX_ARRAY_ARB */
+       367, /* GL_CURRENT_MATRIX_INDEX_ARB */
+      1004, /* GL_MATRIX_INDEX_ARRAY_SIZE_ARB */
+      1008, /* GL_MATRIX_INDEX_ARRAY_TYPE_ARB */
+      1006, /* GL_MATRIX_INDEX_ARRAY_STRIDE_ARB */
+      1002, /* GL_MATRIX_INDEX_ARRAY_POINTER_ARB */
+      2043, /* GL_TEXTURE_DEPTH_SIZE */
+       438, /* GL_DEPTH_TEXTURE_MODE */
+      2000, /* GL_TEXTURE_COMPARE_MODE */
+      1998, /* GL_TEXTURE_COMPARE_FUNC */
+       284, /* GL_COMPARE_REF_TO_TEXTURE */
+      1375, /* GL_POINT_SPRITE */
+       346, /* GL_COORD_REPLACE */
+      1380, /* GL_POINT_SPRITE_R_MODE_NV */
+      1520, /* GL_QUERY_COUNTER_BITS */
+       375, /* GL_CURRENT_QUERY */
+      1524, /* GL_QUERY_RESULT */
+      1526, /* GL_QUERY_RESULT_AVAILABLE */
+      1130, /* GL_MAX_VERTEX_ATTRIBS */
+      2249, /* GL_VERTEX_ATTRIB_ARRAY_NORMALIZED */
+       436, /* GL_DEPTH_STENCIL_TO_RGBA_NV */
+       435, /* GL_DEPTH_STENCIL_TO_BGRA_NV */
+      1107, /* GL_MAX_TEXTURE_COORDS */
+      1109, /* GL_MAX_TEXTURE_IMAGE_UNITS */
+      1455, /* GL_PROGRAM_ERROR_STRING_ARB */
+      1457, /* GL_PROGRAM_FORMAT_ASCII_ARB */
+      1456, /* GL_PROGRAM_FORMAT_ARB */
+      2099, /* GL_TEXTURE_UNSIGNED_REMAP_MODE_NV */
+       408, /* GL_DEPTH_BOUNDS_TEST_EXT */
+       407, /* GL_DEPTH_BOUNDS_EXT */
+        61, /* GL_ARRAY_BUFFER */
+       523, /* GL_ELEMENT_ARRAY_BUFFER */
+        62, /* GL_ARRAY_BUFFER_BINDING */
+       524, /* GL_ELEMENT_ARRAY_BUFFER_BINDING */
+      2220, /* GL_VERTEX_ARRAY_BUFFER_BINDING */
+      1228, /* GL_NORMAL_ARRAY_BUFFER_BINDING */
+       190, /* GL_COLOR_ARRAY_BUFFER_BINDING */
+       736, /* GL_INDEX_ARRAY_BUFFER_BINDING */
+      2013, /* GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING */
+       519, /* GL_EDGE_FLAG_ARRAY_BUFFER_BINDING */
+      1735, /* GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING */
+       577, /* GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING */
+      2277, /* GL_WEIGHT_ARRAY_BUFFER_BINDING */
+      2242, /* GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING */
+      1458, /* GL_PROGRAM_INSTRUCTIONS_ARB */
+      1074, /* GL_MAX_PROGRAM_INSTRUCTIONS_ARB */
+      1464, /* GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB */
+      1083, /* GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB */
+      1478, /* GL_PROGRAM_TEMPORARIES_ARB */
+      1089, /* GL_MAX_PROGRAM_TEMPORARIES_ARB */
+      1466, /* GL_PROGRAM_NATIVE_TEMPORARIES_ARB */
+      1085, /* GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB */
+      1470, /* GL_PROGRAM_PARAMETERS_ARB */
+      1088, /* GL_MAX_PROGRAM_PARAMETERS_ARB */
+      1465, /* GL_PROGRAM_NATIVE_PARAMETERS_ARB */
+      1084, /* GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB */
+      1449, /* GL_PROGRAM_ATTRIBS_ARB */
+      1069, /* GL_MAX_PROGRAM_ATTRIBS_ARB */
+      1463, /* GL_PROGRAM_NATIVE_ATTRIBS_ARB */
+      1082, /* GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB */
+      1447, /* GL_PROGRAM_ADDRESS_REGISTERS_ARB */
+      1067, /* GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB */
+      1461, /* GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB */
+      1080, /* GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB */
+      1075, /* GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB */
+      1071, /* GL_MAX_PROGRAM_ENV_PARAMETERS_ARB */
+      1481, /* GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB */
+      2132, /* GL_TRANSPOSE_CURRENT_MATRIX_ARB */
+      1543, /* GL_READ_ONLY */
+      2291, /* GL_WRITE_ONLY */
+      1545, /* GL_READ_WRITE */
+       124, /* GL_BUFFER_ACCESS */
+       129, /* GL_BUFFER_MAPPED */
+       134, /* GL_BUFFER_MAP_POINTER */
+      2106, /* GL_TIME_ELAPSED_EXT */
+       959, /* GL_MATRIX0_ARB */
+       971, /* GL_MATRIX1_ARB */
+       983, /* GL_MATRIX2_ARB */
+       987, /* GL_MATRIX3_ARB */
+       989, /* GL_MATRIX4_ARB */
+       991, /* GL_MATRIX5_ARB */
+       993, /* GL_MATRIX6_ARB */
+       995, /* GL_MATRIX7_ARB */
+       997, /* GL_MATRIX8_ARB */
+       998, /* GL_MATRIX9_ARB */
+       961, /* GL_MATRIX10_ARB */
+       962, /* GL_MATRIX11_ARB */
+       963, /* GL_MATRIX12_ARB */
+       964, /* GL_MATRIX13_ARB */
+       965, /* GL_MATRIX14_ARB */
+       966, /* GL_MATRIX15_ARB */
+       967, /* GL_MATRIX16_ARB */
+       968, /* GL_MATRIX17_ARB */
+       969, /* GL_MATRIX18_ARB */
+       970, /* GL_MATRIX19_ARB */
+       973, /* GL_MATRIX20_ARB */
+       974, /* GL_MATRIX21_ARB */
+       975, /* GL_MATRIX22_ARB */
+       976, /* GL_MATRIX23_ARB */
+       977, /* GL_MATRIX24_ARB */
+       978, /* GL_MATRIX25_ARB */
+       979, /* GL_MATRIX26_ARB */
+       980, /* GL_MATRIX27_ARB */
+       981, /* GL_MATRIX28_ARB */
+       982, /* GL_MATRIX29_ARB */
+       985, /* GL_MATRIX30_ARB */
+       986, /* GL_MATRIX31_ARB */
+      1868, /* GL_STREAM_DRAW */
+      1870, /* GL_STREAM_READ */
+      1866, /* GL_STREAM_COPY */
+      1817, /* GL_STATIC_DRAW */
+      1819, /* GL_STATIC_READ */
+      1815, /* GL_STATIC_COPY */
+       513, /* GL_DYNAMIC_DRAW */
+       515, /* GL_DYNAMIC_READ */
+       511, /* GL_DYNAMIC_COPY */
+      1338, /* GL_PIXEL_PACK_BUFFER */
+      1342, /* GL_PIXEL_UNPACK_BUFFER */
+      1339, /* GL_PIXEL_PACK_BUFFER_BINDING */
+      1343, /* GL_PIXEL_UNPACK_BUFFER_BINDING */
+       399, /* GL_DEPTH24_STENCIL8 */
+      2095, /* GL_TEXTURE_STENCIL_SIZE */
+      2041, /* GL_TEXTURE_CUBE_MAP_SEAMLESS */
+      1070, /* GL_MAX_PROGRAM_CALL_DEPTH_NV */
+      1073, /* GL_MAX_PROGRAM_IF_DEPTH_NV */
+      1077, /* GL_MAX_PROGRAM_LOOP_DEPTH_NV */
+      1076, /* GL_MAX_PROGRAM_LOOP_COUNT_NV */
+      2247, /* GL_VERTEX_ATTRIB_ARRAY_INTEGER */
+      2244, /* GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB */
+      1016, /* GL_MAX_ARRAY_TEXTURE_LAYERS */
+      1153, /* GL_MIN_PROGRAM_TEXEL_OFFSET */
+      1090, /* GL_MAX_PROGRAM_TEXEL_OFFSET */
+      1859, /* GL_STENCIL_TEST_TWO_SIDE_EXT */
+        18, /* GL_ACTIVE_STENCIL_FACE_EXT */
+      1160, /* GL_MIRROR_CLAMP_TO_BORDER_EXT */
+      1716, /* GL_SAMPLES_PASSED */
+       692, /* GL_GEOMETRY_VERTICES_OUT */
+       686, /* GL_GEOMETRY_INPUT_TYPE */
+       688, /* GL_GEOMETRY_OUTPUT_TYPE */
+       164, /* GL_CLAMP_VERTEX_COLOR_ARB */
+       156, /* GL_CLAMP_FRAGMENT_COLOR_ARB */
+       157, /* GL_CLAMP_READ_COLOR */
+       549, /* GL_FIXED_ONLY */
+      1362, /* GL_POINT_SIZE_ARRAY_TYPE_OES */
+      1361, /* GL_POINT_SIZE_ARRAY_STRIDE_OES */
+      1360, /* GL_POINT_SIZE_ARRAY_POINTER_OES */
+      1197, /* GL_MODELVIEW_MATRIX_FLOAT_AS_INT_BITS_OES */
+      1484, /* GL_PROJECTION_MATRIX_FLOAT_AS_INT_BITS_OES */
+      2075, /* GL_TEXTURE_MATRIX_FLOAT_AS_INT_BITS_OES */
+       138, /* GL_BUFFER_SERIALIZED_MODIFY_APPLE */
+       128, /* GL_BUFFER_FLUSHING_UNMAP_APPLE */
+      1560, /* GL_RELEASED_APPLE */
+      2274, /* GL_VOLATILE_APPLE */
+      1599, /* GL_RETAINED_APPLE */
+      2149, /* GL_UNDEFINED_APPLE */
+      1508, /* GL_PURGEABLE_APPLE */
+       600, /* GL_FRAGMENT_SHADER */
+      2269, /* GL_VERTEX_SHADER */
+      1469, /* GL_PROGRAM_OBJECT_ARB */
+      1752, /* GL_SHADER_OBJECT_ARB */
+      1045, /* GL_MAX_FRAGMENT_UNIFORM_COMPONENTS */
+      1135, /* GL_MAX_VERTEX_UNIFORM_COMPONENTS */
+      1126, /* GL_MAX_VARYING_COMPONENTS */
+      1133, /* GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS */
+      1028, /* GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS */
+      1258, /* GL_OBJECT_TYPE_ARB */
+      1754, /* GL_SHADER_TYPE */
+       565, /* GL_FLOAT_VEC2 */
+       567, /* GL_FLOAT_VEC3 */
+       569, /* GL_FLOAT_VEC4 */
+       788, /* GL_INT_VEC2 */
+       790, /* GL_INT_VEC3 */
+       792, /* GL_INT_VEC4 */
+       116, /* GL_BOOL */
+       118, /* GL_BOOL_VEC2 */
+       120, /* GL_BOOL_VEC3 */
+       122, /* GL_BOOL_VEC4 */
+       553, /* GL_FLOAT_MAT2 */
+       557, /* GL_FLOAT_MAT3 */
+       561, /* GL_FLOAT_MAT4 */
+      1692, /* GL_SAMPLER_1D */
+      1698, /* GL_SAMPLER_2D */
+      1706, /* GL_SAMPLER_3D */
+      1710, /* GL_SAMPLER_CUBE */
+      1697, /* GL_SAMPLER_1D_SHADOW */
+      1705, /* GL_SAMPLER_2D_SHADOW */
+      1703, /* GL_SAMPLER_2D_RECT */
+      1704, /* GL_SAMPLER_2D_RECT_SHADOW */
+       555, /* GL_FLOAT_MAT2x3 */
+       556, /* GL_FLOAT_MAT2x4 */
+       559, /* GL_FLOAT_MAT3x2 */
+       560, /* GL_FLOAT_MAT3x4 */
+       563, /* GL_FLOAT_MAT4x2 */
+       564, /* GL_FLOAT_MAT4x3 */
+       397, /* GL_DELETE_STATUS */
+       289, /* GL_COMPILE_STATUS */
+       849, /* GL_LINK_STATUS */
+      2214, /* GL_VALIDATE_STATUS */
+       748, /* GL_INFO_LOG_LENGTH */
+        64, /* GL_ATTACHED_SHADERS */
+        21, /* GL_ACTIVE_UNIFORMS */
+        22, /* GL_ACTIVE_UNIFORM_MAX_LENGTH */
+      1753, /* GL_SHADER_SOURCE_LENGTH */
+        15, /* GL_ACTIVE_ATTRIBUTES */
+        16, /* GL_ACTIVE_ATTRIBUTE_MAX_LENGTH */
+       602, /* GL_FRAGMENT_SHADER_DERIVATIVE_HINT */
+      1756, /* GL_SHADING_LANGUAGE_VERSION */
+       374, /* GL_CURRENT_PROGRAM */
+      1307, /* GL_PALETTE4_RGB8_OES */
+      1309, /* GL_PALETTE4_RGBA8_OES */
+      1305, /* GL_PALETTE4_R5_G6_B5_OES */
+      1308, /* GL_PALETTE4_RGBA4_OES */
+      1306, /* GL_PALETTE4_RGB5_A1_OES */
+      1312, /* GL_PALETTE8_RGB8_OES */
+      1314, /* GL_PALETTE8_RGBA8_OES */
+      1310, /* GL_PALETTE8_R5_G6_B5_OES */
+      1313, /* GL_PALETTE8_RGBA4_OES */
+      1311, /* GL_PALETTE8_RGB5_A1_OES */
+       729, /* GL_IMPLEMENTATION_COLOR_READ_TYPE */
+       727, /* GL_IMPLEMENTATION_COLOR_READ_FORMAT */
+      1359, /* GL_POINT_SIZE_ARRAY_OES */
+      2019, /* GL_TEXTURE_CROP_RECT_OES */
+      1000, /* GL_MATRIX_INDEX_ARRAY_BUFFER_BINDING_OES */
+      1358, /* GL_POINT_SIZE_ARRAY_BUFFER_BINDING_OES */
+      2197, /* GL_UNSIGNED_NORMALIZED */
+      1956, /* GL_TEXTURE_1D_ARRAY */
+      1494, /* GL_PROXY_TEXTURE_1D_ARRAY */
+      1959, /* GL_TEXTURE_2D_ARRAY */
+      1498, /* GL_PROXY_TEXTURE_2D_ARRAY */
+      1967, /* GL_TEXTURE_BINDING_1D_ARRAY */
+      1970, /* GL_TEXTURE_BINDING_2D_ARRAY */
+      1052, /* GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS */
+      1986, /* GL_TEXTURE_BUFFER */
+      1106, /* GL_MAX_TEXTURE_BUFFER_SIZE */
+      1974, /* GL_TEXTURE_BINDING_BUFFER */
+      1987, /* GL_TEXTURE_BUFFER_DATA_STORE_BINDING */
+      1988, /* GL_TEXTURE_BUFFER_FORMAT */
+      1531, /* GL_R11F_G11F_B10F */
+      2163, /* GL_UNSIGNED_INT_10F_11F_11F_REV */
+      1642, /* GL_RGB9_E5 */
+      2172, /* GL_UNSIGNED_INT_5_9_9_9_REV */
+      2093, /* GL_TEXTURE_SHARED_SIZE */
+      1809, /* GL_SRGB */
+      1810, /* GL_SRGB8 */
+      1812, /* GL_SRGB_ALPHA */
+      1811, /* GL_SRGB8_ALPHA8 */
+      1769, /* GL_SLUMINANCE_ALPHA */
+      1768, /* GL_SLUMINANCE8_ALPHA8 */
+      1766, /* GL_SLUMINANCE */
+      1767, /* GL_SLUMINANCE8 */
+       312, /* GL_COMPRESSED_SRGB */
+       313, /* GL_COMPRESSED_SRGB_ALPHA */
+       310, /* GL_COMPRESSED_SLUMINANCE */
+       311, /* GL_COMPRESSED_SLUMINANCE_ALPHA */
+      2128, /* GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH */
+      2117, /* GL_TRANSFORM_FEEDBACK_BUFFER_MODE */
+      1124, /* GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS */
+      2126, /* GL_TRANSFORM_FEEDBACK_VARYINGS */
+      2122, /* GL_TRANSFORM_FEEDBACK_BUFFER_START */
+      2120, /* GL_TRANSFORM_FEEDBACK_BUFFER_SIZE */
+      1441, /* GL_PRIMITIVES_GENERATED */
+      2124, /* GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN */
+      1535, /* GL_RASTERIZER_DISCARD */
+      1120, /* GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS */
+      1122, /* GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS */
+       766, /* GL_INTERLEAVED_ATTRIBS */
+      1745, /* GL_SEPARATE_ATTRIBS */
+      2112, /* GL_TRANSFORM_FEEDBACK_BUFFER */
+      2114, /* GL_TRANSFORM_FEEDBACK_BUFFER_BINDING */
+      1377, /* GL_POINT_SPRITE_COORD_ORIGIN */
+       857, /* GL_LOWER_LEFT */
+      2211, /* GL_UPPER_LEFT */
+      1833, /* GL_STENCIL_BACK_REF */
+      1834, /* GL_STENCIL_BACK_VALUE_MASK */
+      1835, /* GL_STENCIL_BACK_WRITEMASK */
+       503, /* GL_DRAW_FRAMEBUFFER_BINDING */
+      1565, /* GL_RENDERBUFFER_BINDING */
+      1539, /* GL_READ_FRAMEBUFFER */
+       502, /* GL_DRAW_FRAMEBUFFER */
+      1540, /* GL_READ_FRAMEBUFFER_BINDING */
+      1584, /* GL_RENDERBUFFER_SAMPLES */
+       616, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE */
+       613, /* GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME */
+       628, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL */
+       623, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE */
+       626, /* GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER */
+       634, /* GL_FRAMEBUFFER_COMPLETE */
+       639, /* GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT */
+       654, /* GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT */
+       648, /* GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT */
+       643, /* GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT */
+       649, /* GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT */
+       645, /* GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER */
+       659, /* GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER */
+       665, /* GL_FRAMEBUFFER_UNSUPPORTED */
+       663, /* GL_FRAMEBUFFER_STATUS_ERROR_EXT */
+      1024, /* GL_MAX_COLOR_ATTACHMENTS */
+       196, /* GL_COLOR_ATTACHMENT0 */
+       199, /* GL_COLOR_ATTACHMENT1 */
+       213, /* GL_COLOR_ATTACHMENT2 */
+       215, /* GL_COLOR_ATTACHMENT3 */
+       217, /* GL_COLOR_ATTACHMENT4 */
+       219, /* GL_COLOR_ATTACHMENT5 */
+       221, /* GL_COLOR_ATTACHMENT6 */
+       223, /* GL_COLOR_ATTACHMENT7 */
+       225, /* GL_COLOR_ATTACHMENT8 */
+       227, /* GL_COLOR_ATTACHMENT9 */
+       200, /* GL_COLOR_ATTACHMENT10 */
+       202, /* GL_COLOR_ATTACHMENT11 */
+       204, /* GL_COLOR_ATTACHMENT12 */
+       206, /* GL_COLOR_ATTACHMENT13 */
+       208, /* GL_COLOR_ATTACHMENT14 */
+       210, /* GL_COLOR_ATTACHMENT15 */
+       402, /* GL_DEPTH_ATTACHMENT */
+      1822, /* GL_STENCIL_ATTACHMENT */
+       604, /* GL_FRAMEBUFFER */
+      1562, /* GL_RENDERBUFFER */
+      1588, /* GL_RENDERBUFFER_WIDTH */
+      1575, /* GL_RENDERBUFFER_HEIGHT */
+      1578, /* GL_RENDERBUFFER_INTERNAL_FORMAT */
+      1854, /* GL_STENCIL_INDEX_EXT */
+      1843, /* GL_STENCIL_INDEX1 */
+      1848, /* GL_STENCIL_INDEX4 */
+      1851, /* GL_STENCIL_INDEX8 */
+      1844, /* GL_STENCIL_INDEX16 */
+      1582, /* GL_RENDERBUFFER_RED_SIZE */
+      1573, /* GL_RENDERBUFFER_GREEN_SIZE */
+      1568, /* GL_RENDERBUFFER_BLUE_SIZE */
+      1563, /* GL_RENDERBUFFER_ALPHA_SIZE */
+      1570, /* GL_RENDERBUFFER_DEPTH_SIZE */
+      1586, /* GL_RENDERBUFFER_STENCIL_SIZE */
+       657, /* GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE */
+      1101, /* GL_MAX_SAMPLES */
+      2055, /* GL_TEXTURE_GEN_STR_OES */
+       703, /* GL_HALF_FLOAT_OES */
+      1629, /* GL_RGB565_OES */
+      1659, /* GL_RGBA32UI */
+      1622, /* GL_RGB32UI */
+        40, /* GL_ALPHA32UI_EXT */
+       758, /* GL_INTENSITY32UI_EXT */
+       874, /* GL_LUMINANCE32UI_EXT */
+       891, /* GL_LUMINANCE_ALPHA32UI_EXT */
+      1650, /* GL_RGBA16UI */
+      1614, /* GL_RGB16UI */
+        37, /* GL_ALPHA16UI_EXT */
+       755, /* GL_INTENSITY16UI_EXT */
+       869, /* GL_LUMINANCE16UI_EXT */
+       889, /* GL_LUMINANCE_ALPHA16UI_EXT */
+      1669, /* GL_RGBA8UI */
+      1637, /* GL_RGB8UI */
+        45, /* GL_ALPHA8UI_EXT */
+       763, /* GL_INTENSITY8UI_EXT */
+       883, /* GL_LUMINANCE8UI_EXT */
+       893, /* GL_LUMINANCE_ALPHA8UI_EXT */
+      1657, /* GL_RGBA32I */
+      1620, /* GL_RGB32I */
+        39, /* GL_ALPHA32I_EXT */
+       757, /* GL_INTENSITY32I_EXT */
+       873, /* GL_LUMINANCE32I_EXT */
+       890, /* GL_LUMINANCE_ALPHA32I_EXT */
+      1648, /* GL_RGBA16I */
+      1612, /* GL_RGB16I */
+        36, /* GL_ALPHA16I_EXT */
+       754, /* GL_INTENSITY16I_EXT */
+       868, /* GL_LUMINANCE16I_EXT */
+       888, /* GL_LUMINANCE_ALPHA16I_EXT */
+      1667, /* GL_RGBA8I */
+      1635, /* GL_RGB8I */
+        44, /* GL_ALPHA8I_EXT */
+       762, /* GL_INTENSITY8I_EXT */
+       882, /* GL_LUMINANCE8I_EXT */
+       892, /* GL_LUMINANCE_ALPHA8I_EXT */
+      1552, /* GL_RED_INTEGER */
+       699, /* GL_GREEN_INTEGER */
+       113, /* GL_BLUE_INTEGER */
+        49, /* GL_ALPHA_INTEGER_EXT */
+      1682, /* GL_RGB_INTEGER */
+      1676, /* GL_RGBA_INTEGER */
+        84, /* GL_BGR_INTEGER */
+        82, /* GL_BGRA_INTEGER */
+       895, /* GL_LUMINANCE_INTEGER_EXT */
+       894, /* GL_LUMINANCE_ALPHA_INTEGER_EXT */
+      1678, /* GL_RGBA_INTEGER_MODE_EXT */
+       611, /* GL_FRAMEBUFFER_ATTACHMENT_LAYERED */
+       652, /* GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS */
+       651, /* GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB */
+      1693, /* GL_SAMPLER_1D_ARRAY */
+      1699, /* GL_SAMPLER_2D_ARRAY */
+      1708, /* GL_SAMPLER_BUFFER */
+      1695, /* GL_SAMPLER_1D_ARRAY_SHADOW */
+      1701, /* GL_SAMPLER_2D_ARRAY_SHADOW */
+      1711, /* GL_SAMPLER_CUBE_SHADOW */
+      2191, /* GL_UNSIGNED_INT_VEC2 */
+      2193, /* GL_UNSIGNED_INT_VEC3 */
+      2195, /* GL_UNSIGNED_INT_VEC4 */
+       772, /* GL_INT_SAMPLER_1D */
+       776, /* GL_INT_SAMPLER_2D */
+       782, /* GL_INT_SAMPLER_3D */
+       786, /* GL_INT_SAMPLER_CUBE */
+       780, /* GL_INT_SAMPLER_2D_RECT */
+       773, /* GL_INT_SAMPLER_1D_ARRAY */
+       777, /* GL_INT_SAMPLER_2D_ARRAY */
+       784, /* GL_INT_SAMPLER_BUFFER */
+      2175, /* GL_UNSIGNED_INT_SAMPLER_1D */
+      2179, /* GL_UNSIGNED_INT_SAMPLER_2D */
+      2185, /* GL_UNSIGNED_INT_SAMPLER_3D */
+      2189, /* GL_UNSIGNED_INT_SAMPLER_CUBE */
+      2183, /* GL_UNSIGNED_INT_SAMPLER_2D_RECT */
+      2176, /* GL_UNSIGNED_INT_SAMPLER_1D_ARRAY */
+      2180, /* GL_UNSIGNED_INT_SAMPLER_2D_ARRAY */
+      2187, /* GL_UNSIGNED_INT_SAMPLER_BUFFER */
+       690, /* GL_GEOMETRY_SHADER */
+       693, /* GL_GEOMETRY_VERTICES_OUT_ARB */
+       687, /* GL_GEOMETRY_INPUT_TYPE_ARB */
+       689, /* GL_GEOMETRY_OUTPUT_TYPE_ARB */
+      1058, /* GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB */
+      1140, /* GL_MAX_VERTEX_VARYING_COMPONENTS_ARB */
+      1056, /* GL_MAX_GEOMETRY_UNIFORM_COMPONENTS */
+      1050, /* GL_MAX_GEOMETRY_OUTPUT_VERTICES */
+      1054, /* GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS */
+       858, /* GL_LOW_FLOAT */
+      1142, /* GL_MEDIUM_FLOAT */
+       704, /* GL_HIGH_FLOAT */
+       859, /* GL_LOW_INT */
+      1143, /* GL_MEDIUM_INT */
+       705, /* GL_HIGH_INT */
+      2165, /* GL_UNSIGNED_INT_10_10_10_2_OES */
+       771, /* GL_INT_10_10_10_2_OES */
+      1750, /* GL_SHADER_BINARY_FORMATS */
+      1243, /* GL_NUM_SHADER_BINARY_FORMATS */
+      1751, /* GL_SHADER_COMPILER */
+      1137, /* GL_MAX_VERTEX_UNIFORM_VECTORS */
+      1129, /* GL_MAX_VARYING_VECTORS */
+      1047, /* GL_MAX_FRAGMENT_UNIFORM_VECTORS */
+      1528, /* GL_QUERY_WAIT */
+      1522, /* GL_QUERY_NO_WAIT */
+      1518, /* GL_QUERY_BY_REGION_WAIT */
+      1516, /* GL_QUERY_BY_REGION_NO_WAIT */
+      2110, /* GL_TRANSFORM_FEEDBACK */
+      2119, /* GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED */
+      2113, /* GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE */
+      2111, /* GL_TRANSFORM_FEEDBACK_BINDING */
+      1512, /* GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION */
+       545, /* GL_FIRST_VERTEX_CONVENTION */
+       804, /* GL_LAST_VERTEX_CONVENTION */
+      1486, /* GL_PROVOKING_VERTEX */
+       353, /* GL_COPY_READ_BUFFER */
+       354, /* GL_COPY_WRITE_BUFFER */
+      1555, /* GL_RED_SNORM */
+      1689, /* GL_RG_SNORM */
+      1688, /* GL_RGB_SNORM */
+      1681, /* GL_RGBA_SNORM */
+      1534, /* GL_R8_SNORM */
+      1602, /* GL_RG8_SNORM */
+      1641, /* GL_RGB8_SNORM */
+      1673, /* GL_RGBA8_SNORM */
+      1532, /* GL_R16_SNORM */
+      1601, /* GL_RG16_SNORM */
+      1617, /* GL_RGB16_SNORM */
+      1653, /* GL_RGBA16_SNORM */
+      1762, /* GL_SIGNED_NORMALIZED */
+      1443, /* GL_PRIMITIVE_RESTART */
+      1444, /* GL_PRIMITIVE_RESTART_INDEX */
+      1103, /* GL_MAX_SERVER_WAIT_TIMEOUT */
+      1257, /* GL_OBJECT_TYPE */
+      1875, /* GL_SYNC_CONDITION */
+      1880, /* GL_SYNC_STATUS */
+      1877, /* GL_SYNC_FLAGS */
+      1876, /* GL_SYNC_FENCE */
+      1879, /* GL_SYNC_GPU_COMMANDS_COMPLETE */
+      2158, /* GL_UNSIGNALED */
+      1761, /* GL_SIGNALED */
+        54, /* GL_ALREADY_SIGNALED */
+      2105, /* GL_TIMEOUT_EXPIRED */
+       315, /* GL_CONDITION_SATISFIED */
+      2275, /* GL_WAIT_FAILED */
+       126, /* GL_BUFFER_ACCESS_FLAGS */
+       132, /* GL_BUFFER_MAP_LENGTH */
+       133, /* GL_BUFFER_MAP_OFFSET */
+      1132, /* GL_MAX_VERTEX_OUTPUT_COMPONENTS */
+      1048, /* GL_MAX_GEOMETRY_INPUT_COMPONENTS */
+      1049, /* GL_MAX_GEOMETRY_OUTPUT_COMPONENTS */
+      1044, /* GL_MAX_FRAGMENT_INPUT_COMPONENTS */
+       329, /* GL_CONTEXT_PROFILE_MASK */
+       530, /* GL_EVAL_BIT */
+      1537, /* GL_RASTER_POSITION_UNCLIPPED_IBM */
+       851, /* GL_LIST_BIT */
+      1981, /* GL_TEXTURE_BIT */
+      1731, /* GL_SCISSOR_BIT */
+        30, /* GL_ALL_ATTRIB_BITS */
+      1208, /* GL_MULTISAMPLE_BIT */
+        31, /* GL_ALL_CLIENT_ATTRIB_BITS */
+};
+
+typedef int (*cfunc)(const void *, const void *);
+
+/**
+ * Compare a key name to an element in the \c all_enums array.
+ *
+ * \c bsearch always passes the key as the first parameter and the pointer
+ * to the array element as the second parameter.  We can elimiate some
+ * extra work by taking advantage of that fact.
+ *
+ * \param a  Pointer to the desired enum name.
+ * \param b  Pointer to an element of the \c all_enums array.
+ */
+static int compar_name( const char *a, const enum_elt *b )
+{
+   return strcmp( a, & enum_string_table[ b->offset ] );
+}
+
+/**
+ * Compare a key enum value to an element in the \c all_enums array.
+ *
+ * \c bsearch always passes the key as the first parameter and the pointer
+ * to the array element as the second parameter.  We can elimiate some
+ * extra work by taking advantage of that fact.
+ *
+ * \param a  Pointer to the desired enum name.
+ * \param b  Pointer to an index into the \c all_enums array.
+ */
+static int compar_nr( const int *a, const unsigned *b )
+{
+   return a[0] - all_enums[*b].n;
+}
+
+
+static char token_tmp[20];
+
+const char *_mesa_lookup_enum_by_nr( int nr )
+{
+   unsigned * i;
+
+   i = (unsigned *) _mesa_bsearch(& nr, reduced_enums,
+                                  Elements(reduced_enums),
+                                  sizeof(reduced_enums[0]),
+                                  (cfunc) compar_nr);
+
+   if ( i != NULL ) {
+      return & enum_string_table[ all_enums[ *i ].offset ];
+   }
+   else {
+      /* this is not re-entrant safe, no big deal here */
+      _mesa_snprintf(token_tmp, sizeof(token_tmp) - 1, "0x%x", nr);
+      token_tmp[sizeof(token_tmp) - 1] = '\0';
+      return token_tmp;
+   }
+}
+
+/**
+ * Primitive names
+ */
+static const char *prim_names[PRIM_UNKNOWN + 1] = {
+   "GL_POINTS",
+   "GL_LINES",
+   "GL_LINE_LOOP",
+   "GL_LINE_STRIP",
+   "GL_TRIANGLES",
+   "GL_TRIANGLE_STRIP",
+   "GL_TRIANGLE_FAN",
+   "GL_QUADS",
+   "GL_QUAD_STRIP",
+   "GL_POLYGON",
+   "outside begin/end",
+   "inside unknown primitive",
+   "unknown state"
+};
+
+
+/* Get the name of an enum given that it is a primitive type.  Avoids
+ * GL_FALSE/GL_POINTS ambiguity and others.
+ */
+const char *
+_mesa_lookup_prim_by_nr(GLuint nr)
+{
+   if (nr < Elements(prim_names))
+      return prim_names[nr];
+   else
+      return "invalid mode";
+}
+
+
+int _mesa_lookup_enum_by_name( const char *symbol )
+{
+   enum_elt * f = NULL;
+
+   if ( symbol != NULL ) {
+      f = (enum_elt *) _mesa_bsearch(symbol, all_enums,
+                                     Elements(all_enums),
+                                     sizeof( enum_elt ),
+                                     (cfunc) compar_name);
+   }
+
+   return (f != NULL) ? f->n : -1;
+}
+
+
diff --git a/mesalib/src/mesa/main/extensions.c b/mesalib/src/mesa/main/extensions.c
index d0c08ca71..285e08d75 100644
--- a/mesalib/src/mesa/main/extensions.c
+++ b/mesalib/src/mesa/main/extensions.c
@@ -79,6 +79,7 @@ static const struct extension extension_table[] = {
    /* ARB Extensions */
    { "GL_ARB_ES2_compatibility",                   o(ARB_ES2_compatibility),                   GL,             2009 },
    { "GL_ARB_blend_func_extended",                 o(ARB_blend_func_extended),                 GL,             2009 },
+   { "GL_ARB_color_buffer_float",                  o(ARB_color_buffer_float),                  GL,             2004 },
    { "GL_ARB_copy_buffer",                         o(ARB_copy_buffer),                         GL,             2008 },
    { "GL_ARB_depth_buffer_float",                  o(ARB_depth_buffer_float),                  GL,             2008 },
    { "GL_ARB_depth_clamp",                         o(ARB_depth_clamp),                         GL,             2003 },
@@ -202,6 +203,7 @@ static const struct extension extension_table[] = {
    { "GL_EXT_texture",                             o(EXT_texture),                             GL,             1996 },
    { "GL_EXT_texture_rectangle",                   o(NV_texture_rectangle),                    GL,             2004 },
    { "GL_EXT_texture_shared_exponent",             o(EXT_texture_shared_exponent),             GL,             2004 },
+   { "GL_EXT_texture_snorm",                       o(EXT_texture_snorm),                       GL,             2009 },
    { "GL_EXT_texture_sRGB",                        o(EXT_texture_sRGB),                        GL,             2004 },
    { "GL_EXT_texture_sRGB_decode",                 o(EXT_texture_sRGB_decode),                        GL,      2006 },
    { "GL_EXT_texture_swizzle",                     o(EXT_texture_swizzle),                     GL,             2008 },
@@ -273,7 +275,7 @@ static const struct extension extension_table[] = {
    { "GL_MESA_pack_invert",                        o(MESA_pack_invert),                        GL,             2002 },
    { "GL_MESA_resize_buffers",                     o(MESA_resize_buffers),                     GL,             1999 },
    { "GL_MESA_texture_array",                      o(MESA_texture_array),                      GL,             2007 },
-   { "GL_MESA_texture_signed_rgba",                o(MESA_texture_signed_rgba),                GL,             2009 },
+   { "GL_MESA_texture_signed_rgba",                o(EXT_texture_snorm),                       GL,             2009 },
    { "GL_MESA_window_pos",                         o(ARB_window_pos),                          GL,             2000 },
    { "GL_MESAX_texture_float",                     o(ARB_texture_float),                       GL,             2009 },
    { "GL_MESA_ycbcr_texture",                      o(MESA_ycbcr_texture),                      GL,             2002 },
diff --git a/mesalib/src/mesa/main/fbobject.c b/mesalib/src/mesa/main/fbobject.c
index cc13103de..4eab3e119 100644
--- a/mesalib/src/mesa/main/fbobject.c
+++ b/mesalib/src/mesa/main/fbobject.c
@@ -1081,7 +1081,6 @@ _mesa_base_fbo_format(struct gl_context *ctx, GLenum internalFormat)
    case GL_RGB10_A2:
    case GL_RGBA12:
    case GL_RGBA16:
-   case GL_RGBA16_SNORM:
    case GL_SRGB8_ALPHA8_EXT:
       return GL_RGBA;
    case GL_STENCIL_INDEX:
@@ -1109,6 +1108,43 @@ _mesa_base_fbo_format(struct gl_context *ctx, GLenum internalFormat)
    case GL_RG8:
    case GL_RG16:
       return ctx->Extensions.ARB_texture_rg ? GL_RG : 0;
+   /* signed normalized texture formats */
+   case GL_RED_SNORM:
+   case GL_R8_SNORM:
+   case GL_R16_SNORM:
+      return ctx->Extensions.EXT_texture_snorm ? GL_RED : 0;
+   case GL_RG_SNORM:
+   case GL_RG8_SNORM:
+   case GL_RG16_SNORM:
+      return ctx->Extensions.EXT_texture_snorm ? GL_RG : 0;
+   case GL_RGB_SNORM:
+   case GL_RGB8_SNORM:
+   case GL_RGB16_SNORM:
+      return ctx->Extensions.EXT_texture_snorm ? GL_RGB : 0;
+   case GL_RGBA_SNORM:
+   case GL_RGBA8_SNORM:
+   case GL_RGBA16_SNORM:
+      return ctx->Extensions.EXT_texture_snorm ? GL_RGBA : 0;
+   case GL_ALPHA_SNORM:
+   case GL_ALPHA8_SNORM:
+   case GL_ALPHA16_SNORM:
+      return ctx->Extensions.EXT_texture_snorm &&
+             ctx->Extensions.ARB_framebuffer_object ? GL_ALPHA : 0;
+   case GL_LUMINANCE_SNORM:
+   case GL_LUMINANCE8_SNORM:
+   case GL_LUMINANCE16_SNORM:
+      return ctx->Extensions.EXT_texture_snorm &&
+             ctx->Extensions.ARB_framebuffer_object ? GL_LUMINANCE : 0;
+   case GL_LUMINANCE_ALPHA_SNORM:
+   case GL_LUMINANCE8_ALPHA8_SNORM:
+   case GL_LUMINANCE16_ALPHA16_SNORM:
+      return ctx->Extensions.EXT_texture_snorm &&
+             ctx->Extensions.ARB_framebuffer_object ? GL_LUMINANCE_ALPHA : 0;
+   case GL_INTENSITY_SNORM:
+   case GL_INTENSITY8_SNORM:
+   case GL_INTENSITY16_SNORM:
+      return ctx->Extensions.EXT_texture_snorm &&
+             ctx->Extensions.ARB_framebuffer_object ? GL_INTENSITY : 0;
    /* XXX add floating point and integer formats eventually */
    default:
       return 0;
diff --git a/mesalib/src/mesa/main/ff_fragment_shader.cpp b/mesalib/src/mesa/main/ff_fragment_shader.cpp
index 0bc534df5..bf65a4f64 100644
--- a/mesalib/src/mesa/main/ff_fragment_shader.cpp
+++ b/mesalib/src/mesa/main/ff_fragment_shader.cpp
@@ -1,1623 +1,1623 @@
-/**************************************************************************
- * 
- * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
- * All Rights Reserved.
- * Copyright 2009 VMware, Inc.  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"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- * 
- **************************************************************************/
-
-extern "C" {
-#include "glheader.h"
-#include "imports.h"
-#include "mtypes.h"
-#include "program/program.h"
-#include "program/prog_parameter.h"
-#include "program/prog_cache.h"
-#include "program/prog_instruction.h"
-#include "program/prog_print.h"
-#include "program/prog_statevars.h"
-#include "program/programopt.h"
-#include "texenvprogram.h"
-}
-
-/*
- * Note on texture units:
- *
- * The number of texture units supported by fixed-function fragment
- * processing is MAX_TEXTURE_COORD_UNITS, not MAX_TEXTURE_IMAGE_UNITS.
- * That's because there's a one-to-one correspondence between texture
- * coordinates and samplers in fixed-function processing.
- *
- * Since fixed-function vertex processing is limited to MAX_TEXTURE_COORD_UNITS
- * sets of texcoords, so is fixed-function fragment processing.
- *
- * We can safely use ctx->Const.MaxTextureUnits for loop bounds.
- */
-
-
-struct texenvprog_cache_item
-{
-   GLuint hash;
-   void *key;
-   struct gl_fragment_program *data;
-   struct texenvprog_cache_item *next;
-};
-
-static GLboolean
-texenv_doing_secondary_color(struct gl_context *ctx)
-{
-   if (ctx->Light.Enabled &&
-       (ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR))
-      return GL_TRUE;
-
-   if (ctx->Fog.ColorSumEnabled)
-      return GL_TRUE;
-
-   return GL_FALSE;
-}
-
-/**
- * Up to nine instructions per tex unit, plus fog, specular color.
- */
-#define MAX_INSTRUCTIONS ((MAX_TEXTURE_COORD_UNITS * 9) + 12)
-
-#define DISASSEM (MESA_VERBOSE & VERBOSE_DISASSEM)
-
-struct mode_opt {
-#ifdef __GNUC__
-   __extension__ GLubyte Source:4;  /**< SRC_x */
-   __extension__ GLubyte Operand:3; /**< OPR_x */
-#else
-   GLubyte Source;  /**< SRC_x */
-   GLubyte Operand; /**< OPR_x */
-#endif
-};
-
-struct state_key {
-   GLuint nr_enabled_units:8;
-   GLuint enabled_units:8;
-   GLuint separate_specular:1;
-   GLuint fog_enabled:1;
-   GLuint fog_mode:2;          /**< FOG_x */
-   GLuint inputs_available:12;
-   GLuint num_draw_buffers:4;
-
-   /* NOTE: This array of structs must be last! (see "keySize" below) */
-   struct {
-      GLuint enabled:1;
-      GLuint source_index:3;   /**< TEXTURE_x_INDEX */
-      GLuint shadow:1;
-      GLuint ScaleShiftRGB:2;
-      GLuint ScaleShiftA:2;
-
-      GLuint NumArgsRGB:3;  /**< up to MAX_COMBINER_TERMS */
-      GLuint ModeRGB:5;     /**< MODE_x */
-
-      GLuint NumArgsA:3;  /**< up to MAX_COMBINER_TERMS */
-      GLuint ModeA:5;     /**< MODE_x */
-
-      GLuint texture_cyl_wrap:1; /**< For gallium test/debug only */
-
-      struct mode_opt OptRGB[MAX_COMBINER_TERMS];
-      struct mode_opt OptA[MAX_COMBINER_TERMS];
-   } unit[MAX_TEXTURE_UNITS];
-};
-
-#define FOG_LINEAR  0
-#define FOG_EXP     1
-#define FOG_EXP2    2
-#define FOG_UNKNOWN 3
-
-static GLuint translate_fog_mode( GLenum mode )
-{
-   switch (mode) {
-   case GL_LINEAR: return FOG_LINEAR;
-   case GL_EXP: return FOG_EXP;
-   case GL_EXP2: return FOG_EXP2;
-   default: return FOG_UNKNOWN;
-   }
-}
-
-#define OPR_SRC_COLOR           0
-#define OPR_ONE_MINUS_SRC_COLOR 1
-#define OPR_SRC_ALPHA           2
-#define OPR_ONE_MINUS_SRC_ALPHA	3
-#define OPR_ZERO                4
-#define OPR_ONE                 5
-#define OPR_UNKNOWN             7
-
-static GLuint translate_operand( GLenum operand )
-{
-   switch (operand) {
-   case GL_SRC_COLOR: return OPR_SRC_COLOR;
-   case GL_ONE_MINUS_SRC_COLOR: return OPR_ONE_MINUS_SRC_COLOR;
-   case GL_SRC_ALPHA: return OPR_SRC_ALPHA;
-   case GL_ONE_MINUS_SRC_ALPHA: return OPR_ONE_MINUS_SRC_ALPHA;
-   case GL_ZERO: return OPR_ZERO;
-   case GL_ONE: return OPR_ONE;
-   default:
-      assert(0);
-      return OPR_UNKNOWN;
-   }
-}
-
-#define SRC_TEXTURE  0
-#define SRC_TEXTURE0 1
-#define SRC_TEXTURE1 2
-#define SRC_TEXTURE2 3
-#define SRC_TEXTURE3 4
-#define SRC_TEXTURE4 5
-#define SRC_TEXTURE5 6
-#define SRC_TEXTURE6 7
-#define SRC_TEXTURE7 8
-#define SRC_CONSTANT 9
-#define SRC_PRIMARY_COLOR 10
-#define SRC_PREVIOUS 11
-#define SRC_ZERO     12
-#define SRC_UNKNOWN  15
-
-static GLuint translate_source( GLenum src )
-{
-   switch (src) {
-   case GL_TEXTURE: return SRC_TEXTURE;
-   case GL_TEXTURE0:
-   case GL_TEXTURE1:
-   case GL_TEXTURE2:
-   case GL_TEXTURE3:
-   case GL_TEXTURE4:
-   case GL_TEXTURE5:
-   case GL_TEXTURE6:
-   case GL_TEXTURE7: return SRC_TEXTURE0 + (src - GL_TEXTURE0);
-   case GL_CONSTANT: return SRC_CONSTANT;
-   case GL_PRIMARY_COLOR: return SRC_PRIMARY_COLOR;
-   case GL_PREVIOUS: return SRC_PREVIOUS;
-   case GL_ZERO:
-      return SRC_ZERO;
-   default:
-      assert(0);
-      return SRC_UNKNOWN;
-   }
-}
-
-#define MODE_REPLACE                     0  /* r = a0 */
-#define MODE_MODULATE                    1  /* r = a0 * a1 */
-#define MODE_ADD                         2  /* r = a0 + a1 */
-#define MODE_ADD_SIGNED                  3  /* r = a0 + a1 - 0.5 */
-#define MODE_INTERPOLATE                 4  /* r = a0 * a2 + a1 * (1 - a2) */
-#define MODE_SUBTRACT                    5  /* r = a0 - a1 */
-#define MODE_DOT3_RGB                    6  /* r = a0 . a1 */
-#define MODE_DOT3_RGB_EXT                7  /* r = a0 . a1 */
-#define MODE_DOT3_RGBA                   8  /* r = a0 . a1 */
-#define MODE_DOT3_RGBA_EXT               9  /* r = a0 . a1 */
-#define MODE_MODULATE_ADD_ATI           10  /* r = a0 * a2 + a1 */
-#define MODE_MODULATE_SIGNED_ADD_ATI    11  /* r = a0 * a2 + a1 - 0.5 */
-#define MODE_MODULATE_SUBTRACT_ATI      12  /* r = a0 * a2 - a1 */
-#define MODE_ADD_PRODUCTS               13  /* r = a0 * a1 + a2 * a3 */
-#define MODE_ADD_PRODUCTS_SIGNED        14  /* r = a0 * a1 + a2 * a3 - 0.5 */
-#define MODE_BUMP_ENVMAP_ATI            15  /* special */
-#define MODE_UNKNOWN                    16
-
-/**
- * Translate GL combiner state into a MODE_x value
- */
-static GLuint translate_mode( GLenum envMode, GLenum mode )
-{
-   switch (mode) {
-   case GL_REPLACE: return MODE_REPLACE;
-   case GL_MODULATE: return MODE_MODULATE;
-   case GL_ADD:
-      if (envMode == GL_COMBINE4_NV)
-         return MODE_ADD_PRODUCTS;
-      else
-         return MODE_ADD;
-   case GL_ADD_SIGNED:
-      if (envMode == GL_COMBINE4_NV)
-         return MODE_ADD_PRODUCTS_SIGNED;
-      else
-         return MODE_ADD_SIGNED;
-   case GL_INTERPOLATE: return MODE_INTERPOLATE;
-   case GL_SUBTRACT: return MODE_SUBTRACT;
-   case GL_DOT3_RGB: return MODE_DOT3_RGB;
-   case GL_DOT3_RGB_EXT: return MODE_DOT3_RGB_EXT;
-   case GL_DOT3_RGBA: return MODE_DOT3_RGBA;
-   case GL_DOT3_RGBA_EXT: return MODE_DOT3_RGBA_EXT;
-   case GL_MODULATE_ADD_ATI: return MODE_MODULATE_ADD_ATI;
-   case GL_MODULATE_SIGNED_ADD_ATI: return MODE_MODULATE_SIGNED_ADD_ATI;
-   case GL_MODULATE_SUBTRACT_ATI: return MODE_MODULATE_SUBTRACT_ATI;
-   case GL_BUMP_ENVMAP_ATI: return MODE_BUMP_ENVMAP_ATI;
-   default:
-      assert(0);
-      return MODE_UNKNOWN;
-   }
-}
-
-
-/**
- * Do we need to clamp the results of the given texture env/combine mode?
- * If the inputs to the mode are in [0,1] we don't always have to clamp
- * the results.
- */
-static GLboolean
-need_saturate( GLuint mode )
-{
-   switch (mode) {
-   case MODE_REPLACE:
-   case MODE_MODULATE:
-   case MODE_INTERPOLATE:
-      return GL_FALSE;
-   case MODE_ADD:
-   case MODE_ADD_SIGNED:
-   case MODE_SUBTRACT:
-   case MODE_DOT3_RGB:
-   case MODE_DOT3_RGB_EXT:
-   case MODE_DOT3_RGBA:
-   case MODE_DOT3_RGBA_EXT:
-   case MODE_MODULATE_ADD_ATI:
-   case MODE_MODULATE_SIGNED_ADD_ATI:
-   case MODE_MODULATE_SUBTRACT_ATI:
-   case MODE_ADD_PRODUCTS:
-   case MODE_ADD_PRODUCTS_SIGNED:
-   case MODE_BUMP_ENVMAP_ATI:
-      return GL_TRUE;
-   default:
-      assert(0);
-      return GL_FALSE;
-   }
-}
-
-
-
-/**
- * Translate TEXTURE_x_BIT to TEXTURE_x_INDEX.
- */
-static GLuint translate_tex_src_bit( GLbitfield bit )
-{
-   ASSERT(bit);
-   return _mesa_ffs(bit) - 1;
-}
-
-
-#define VERT_BIT_TEX_ANY    (0xff << VERT_ATTRIB_TEX0)
-#define VERT_RESULT_TEX_ANY (0xff << VERT_RESULT_TEX0)
-
-/**
- * Identify all possible varying inputs.  The fragment program will
- * never reference non-varying inputs, but will track them via state
- * constants instead.
- *
- * This function figures out all the inputs that the fragment program
- * has access to.  The bitmask is later reduced to just those which
- * are actually referenced.
- */
-static GLbitfield get_fp_input_mask( struct gl_context *ctx )
-{
-   /* _NEW_PROGRAM */
-   const GLboolean vertexShader =
-      (ctx->Shader.CurrentVertexProgram &&
-       ctx->Shader.CurrentVertexProgram->LinkStatus &&
-       ctx->Shader.CurrentVertexProgram->VertexProgram);
-   const GLboolean vertexProgram = ctx->VertexProgram._Enabled;
-   GLbitfield fp_inputs = 0x0;
-
-   if (ctx->VertexProgram._Overriden) {
-      /* Somebody's messing with the vertex program and we don't have
-       * a clue what's happening.  Assume that it could be producing
-       * all possible outputs.
-       */
-      fp_inputs = ~0;
-   }
-   else if (ctx->RenderMode == GL_FEEDBACK) {
-      /* _NEW_RENDERMODE */
-      fp_inputs = (FRAG_BIT_COL0 | FRAG_BIT_TEX0);
-   }
-   else if (!(vertexProgram || vertexShader) ||
-            !ctx->VertexProgram._Current) {
-      /* Fixed function vertex logic */
-      /* _NEW_ARRAY */
-      GLbitfield varying_inputs = ctx->varying_vp_inputs;
-
-      /* These get generated in the setup routine regardless of the
-       * vertex program:
-       */
-      /* _NEW_POINT */
-      if (ctx->Point.PointSprite)
-         varying_inputs |= FRAG_BITS_TEX_ANY;
-
-      /* First look at what values may be computed by the generated
-       * vertex program:
-       */
-      /* _NEW_LIGHT */
-      if (ctx->Light.Enabled) {
-         fp_inputs |= FRAG_BIT_COL0;
-
-         if (texenv_doing_secondary_color(ctx))
-            fp_inputs |= FRAG_BIT_COL1;
-      }
-
-      /* _NEW_TEXTURE */
-      fp_inputs |= (ctx->Texture._TexGenEnabled |
-                    ctx->Texture._TexMatEnabled) << FRAG_ATTRIB_TEX0;
-
-      /* Then look at what might be varying as a result of enabled
-       * arrays, etc:
-       */
-      if (varying_inputs & VERT_BIT_COLOR0)
-         fp_inputs |= FRAG_BIT_COL0;
-      if (varying_inputs & VERT_BIT_COLOR1)
-         fp_inputs |= FRAG_BIT_COL1;
-
-      fp_inputs |= (((varying_inputs & VERT_BIT_TEX_ANY) >> VERT_ATTRIB_TEX0) 
-                    << FRAG_ATTRIB_TEX0);
-
-   }
-   else {
-      /* calculate from vp->outputs */
-      struct gl_vertex_program *vprog;
-      GLbitfield64 vp_outputs;
-
-      /* Choose GLSL vertex shader over ARB vertex program.  Need this
-       * since vertex shader state validation comes after fragment state
-       * validation (see additional comments in state.c).
-       */
-      if (vertexShader)
-         vprog = ctx->Shader.CurrentVertexProgram->VertexProgram;
-      else
-         vprog = ctx->VertexProgram.Current;
-
-      vp_outputs = vprog->Base.OutputsWritten;
-
-      /* These get generated in the setup routine regardless of the
-       * vertex program:
-       */
-      /* _NEW_POINT */
-      if (ctx->Point.PointSprite)
-         vp_outputs |= FRAG_BITS_TEX_ANY;
-
-      if (vp_outputs & (1 << VERT_RESULT_COL0))
-         fp_inputs |= FRAG_BIT_COL0;
-      if (vp_outputs & (1 << VERT_RESULT_COL1))
-         fp_inputs |= FRAG_BIT_COL1;
-
-      fp_inputs |= (((vp_outputs & VERT_RESULT_TEX_ANY) >> VERT_RESULT_TEX0) 
-                    << FRAG_ATTRIB_TEX0);
-   }
-   
-   return fp_inputs;
-}
-
-
-/**
- * Examine current texture environment state and generate a unique
- * key to identify it.
- */
-static GLuint make_state_key( struct gl_context *ctx,  struct state_key *key )
-{
-   GLuint i, j;
-   GLbitfield inputs_referenced = FRAG_BIT_COL0;
-   const GLbitfield inputs_available = get_fp_input_mask( ctx );
-   GLuint keySize;
-
-   memset(key, 0, sizeof(*key));
-
-   /* _NEW_TEXTURE */
-   for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
-      const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[i];
-      const struct gl_texture_object *texObj = texUnit->_Current;
-      const struct gl_tex_env_combine_state *comb = texUnit->_CurrentCombine;
-      GLenum format;
-
-      if (!texUnit->_ReallyEnabled || !texUnit->Enabled)
-         continue;
-
-      format = texObj->Image[0][texObj->BaseLevel]->_BaseFormat;
-
-      key->unit[i].enabled = 1;
-      key->enabled_units |= (1<<i);
-      key->nr_enabled_units = i + 1;
-      inputs_referenced |= FRAG_BIT_TEX(i);
-
-      key->unit[i].source_index =
-         translate_tex_src_bit(texUnit->_ReallyEnabled);
-
-      key->unit[i].shadow = ((texObj->CompareMode == GL_COMPARE_R_TO_TEXTURE) &&
-                             ((format == GL_DEPTH_COMPONENT) || 
-                              (format == GL_DEPTH_STENCIL_EXT)));
-
-      key->unit[i].NumArgsRGB = comb->_NumArgsRGB;
-      key->unit[i].NumArgsA = comb->_NumArgsA;
-
-      key->unit[i].ModeRGB =
-	 translate_mode(texUnit->EnvMode, comb->ModeRGB);
-      key->unit[i].ModeA =
-	 translate_mode(texUnit->EnvMode, comb->ModeA);
-
-      key->unit[i].ScaleShiftRGB = comb->ScaleShiftRGB;
-      key->unit[i].ScaleShiftA = comb->ScaleShiftA;
-
-      for (j = 0; j < MAX_COMBINER_TERMS; j++) {
-         key->unit[i].OptRGB[j].Operand = translate_operand(comb->OperandRGB[j]);
-         key->unit[i].OptA[j].Operand = translate_operand(comb->OperandA[j]);
-         key->unit[i].OptRGB[j].Source = translate_source(comb->SourceRGB[j]);
-         key->unit[i].OptA[j].Source = translate_source(comb->SourceA[j]);
-      }
-
-      if (key->unit[i].ModeRGB == MODE_BUMP_ENVMAP_ATI) {
-         /* requires some special translation */
-         key->unit[i].NumArgsRGB = 2;
-         key->unit[i].ScaleShiftRGB = 0;
-         key->unit[i].OptRGB[0].Operand = OPR_SRC_COLOR;
-         key->unit[i].OptRGB[0].Source = SRC_TEXTURE;
-         key->unit[i].OptRGB[1].Operand = OPR_SRC_COLOR;
-         key->unit[i].OptRGB[1].Source = texUnit->BumpTarget - GL_TEXTURE0 + SRC_TEXTURE0;
-       }
-
-      /* this is a back-door for enabling cylindrical texture wrap mode */
-      if (texObj->Priority == 0.125)
-         key->unit[i].texture_cyl_wrap = 1;
-   }
-
-   /* _NEW_LIGHT | _NEW_FOG */
-   if (texenv_doing_secondary_color(ctx)) {
-      key->separate_specular = 1;
-      inputs_referenced |= FRAG_BIT_COL1;
-   }
-
-   /* _NEW_FOG */
-   if (ctx->Fog.Enabled) {
-      key->fog_enabled = 1;
-      key->fog_mode = translate_fog_mode(ctx->Fog.Mode);
-      inputs_referenced |= FRAG_BIT_FOGC; /* maybe */
-   }
-
-   /* _NEW_BUFFERS */
-   key->num_draw_buffers = ctx->DrawBuffer->_NumColorDrawBuffers;
-
-   key->inputs_available = (inputs_available & inputs_referenced);
-
-   /* compute size of state key, ignoring unused texture units */
-   keySize = sizeof(*key) - sizeof(key->unit)
-      + key->nr_enabled_units * sizeof(key->unit[0]);
-
-   return keySize;
-}
-
-
-/**
- * Use uregs to represent registers internally, translate to Mesa's
- * expected formats on emit.  
- *
- * NOTE: These are passed by value extensively in this file rather
- * than as usual by pointer reference.  If this disturbs you, try
- * remembering they are just 32bits in size.
- *
- * GCC is smart enough to deal with these dword-sized structures in
- * much the same way as if I had defined them as dwords and was using
- * macros to access and set the fields.  This is much nicer and easier
- * to evolve.
- */
-struct ureg {
-   GLuint file:4;
-   GLuint idx:8;
-   GLuint negatebase:1;
-   GLuint swz:12;
-   GLuint pad:7;
-};
-
-static const struct ureg undef = { 
-   PROGRAM_UNDEFINED,
-   255,
-   0,
-   0,
-   0
-};
-
-
-/** State used to build the fragment program:
- */
-struct texenv_fragment_program {
-   struct gl_fragment_program *program;
-   struct state_key *state;
-
-   GLbitfield alu_temps;	/**< Track texture indirections, see spec. */
-   GLbitfield temps_output;	/**< Track texture indirections, see spec. */
-   GLbitfield temp_in_use;	/**< Tracks temporary regs which are in use. */
-   GLboolean error;
-
-   struct ureg src_texture[MAX_TEXTURE_COORD_UNITS];   
-   /* Reg containing each texture unit's sampled texture color,
-    * else undef.
-    */
-
-   struct ureg texcoord_tex[MAX_TEXTURE_COORD_UNITS];
-   /* Reg containing texcoord for a texture unit,
-    * needed for bump mapping, else undef.
-    */
-
-   struct ureg src_previous;	/**< Reg containing color from previous 
-				 * stage.  May need to be decl'd.
-				 */
-
-   GLuint last_tex_stage;	/**< Number of last enabled texture unit */
-
-   struct ureg half;
-   struct ureg one;
-   struct ureg zero;
-};
-
-
-
-static struct ureg make_ureg(GLuint file, GLuint idx)
-{
-   struct ureg reg;
-   reg.file = file;
-   reg.idx = idx;
-   reg.negatebase = 0;
-   reg.swz = SWIZZLE_NOOP;
-   reg.pad = 0;
-   return reg;
-}
-
-static struct ureg swizzle( struct ureg reg, int x, int y, int z, int w )
-{
-   reg.swz = MAKE_SWIZZLE4(GET_SWZ(reg.swz, x),
-			   GET_SWZ(reg.swz, y),
-			   GET_SWZ(reg.swz, z),
-			   GET_SWZ(reg.swz, w));
-
-   return reg;
-}
-
-static struct ureg swizzle1( struct ureg reg, int x )
-{
-   return swizzle(reg, x, x, x, x);
-}
-
-static struct ureg negate( struct ureg reg )
-{
-   reg.negatebase ^= 1;
-   return reg;
-}
-
-static GLboolean is_undef( struct ureg reg )
-{
-   return reg.file == PROGRAM_UNDEFINED;
-}
-
-
-static struct ureg get_temp( struct texenv_fragment_program *p )
-{
-   GLint bit;
-   
-   /* First try and reuse temps which have been used already:
-    */
-   bit = _mesa_ffs( ~p->temp_in_use & p->alu_temps );
-
-   /* Then any unused temporary:
-    */
-   if (!bit)
-      bit = _mesa_ffs( ~p->temp_in_use );
-
-   if (!bit) {
-      _mesa_problem(NULL, "%s: out of temporaries\n", __FILE__);
-      exit(1);
-   }
-
-   if ((GLuint) bit > p->program->Base.NumTemporaries)
-      p->program->Base.NumTemporaries = bit;
-
-   p->temp_in_use |= 1<<(bit-1);
-   return make_ureg(PROGRAM_TEMPORARY, (bit-1));
-}
-
-static struct ureg get_tex_temp( struct texenv_fragment_program *p )
-{
-   int bit;
-   
-   /* First try to find available temp not previously used (to avoid
-    * starting a new texture indirection).  According to the spec, the
-    * ~p->temps_output isn't necessary, but will keep it there for
-    * now:
-    */
-   bit = _mesa_ffs( ~p->temp_in_use & ~p->alu_temps & ~p->temps_output );
-
-   /* Then any unused temporary:
-    */
-   if (!bit) 
-      bit = _mesa_ffs( ~p->temp_in_use );
-
-   if (!bit) {
-      _mesa_problem(NULL, "%s: out of temporaries\n", __FILE__);
-      exit(1);
-   }
-
-   if ((GLuint) bit > p->program->Base.NumTemporaries)
-      p->program->Base.NumTemporaries = bit;
-
-   p->temp_in_use |= 1<<(bit-1);
-   return make_ureg(PROGRAM_TEMPORARY, (bit-1));
-}
-
-
-/** Mark a temp reg as being no longer allocatable. */
-static void reserve_temp( struct texenv_fragment_program *p, struct ureg r )
-{
-   if (r.file == PROGRAM_TEMPORARY)
-      p->temps_output |= (1 << r.idx);
-}
-
-
-static void release_temps(struct gl_context *ctx, struct texenv_fragment_program *p )
-{
-   GLuint max_temp = ctx->Const.FragmentProgram.MaxTemps;
-
-   /* KW: To support tex_env_crossbar, don't release the registers in
-    * temps_output.
-    */
-   if (max_temp >= sizeof(int) * 8)
-      p->temp_in_use = p->temps_output;
-   else
-      p->temp_in_use = ~((1<<max_temp)-1) | p->temps_output;
-}
-
-
-static struct ureg register_param5( struct texenv_fragment_program *p, 
-				    GLint s0,
-				    GLint s1,
-				    GLint s2,
-				    GLint s3,
-				    GLint s4)
-{
-   int tokens[STATE_LENGTH];
-   GLuint idx;
-   tokens[0] = s0;
-   tokens[1] = s1;
-   tokens[2] = s2;
-   tokens[3] = s3;
-   tokens[4] = s4;
-   idx = _mesa_add_state_reference(p->program->Base.Parameters,
-				   (gl_state_index *)tokens);
-   return make_ureg(PROGRAM_STATE_VAR, idx);
-}
-
-
-#define register_param1(p,s0)          register_param5(p,s0,0,0,0,0)
-#define register_param2(p,s0,s1)       register_param5(p,s0,s1,0,0,0)
-#define register_param3(p,s0,s1,s2)    register_param5(p,s0,s1,s2,0,0)
-#define register_param4(p,s0,s1,s2,s3) register_param5(p,s0,s1,s2,s3,0)
-
-static GLuint frag_to_vert_attrib( GLuint attrib )
-{
-   switch (attrib) {
-   case FRAG_ATTRIB_COL0: return VERT_ATTRIB_COLOR0;
-   case FRAG_ATTRIB_COL1: return VERT_ATTRIB_COLOR1;
-   default:
-      assert(attrib >= FRAG_ATTRIB_TEX0);
-      assert(attrib <= FRAG_ATTRIB_TEX7);
-      return attrib - FRAG_ATTRIB_TEX0 + VERT_ATTRIB_TEX0;
-   }
-}
-
-
-static struct ureg register_input( struct texenv_fragment_program *p, GLuint input )
-{
-   if (p->state->inputs_available & (1<<input)) {
-      p->program->Base.InputsRead |= (1 << input);
-      return make_ureg(PROGRAM_INPUT, input);
-   }
-   else {
-      GLuint idx = frag_to_vert_attrib( input );
-      return register_param3( p, STATE_INTERNAL, STATE_CURRENT_ATTRIB, idx );
-   }
-}
-
-
-static void emit_arg( struct prog_src_register *reg,
-		      struct ureg ureg )
-{
-   reg->File = ureg.file;
-   reg->Index = ureg.idx;
-   reg->Swizzle = ureg.swz;
-   reg->Negate = ureg.negatebase ? NEGATE_XYZW : NEGATE_NONE;
-   reg->Abs = GL_FALSE;
-}
-
-static void emit_dst( struct prog_dst_register *dst,
-		      struct ureg ureg, GLuint mask )
-{
-   dst->File = ureg.file;
-   dst->Index = ureg.idx;
-   dst->WriteMask = mask;
-   dst->CondMask = COND_TR;  /* always pass cond test */
-   dst->CondSwizzle = SWIZZLE_NOOP;
-}
-
-static struct prog_instruction *
-emit_op(struct texenv_fragment_program *p,
-	enum prog_opcode op,
-	struct ureg dest,
-	GLuint mask,
-	GLboolean saturate,
-	struct ureg src0,
-	struct ureg src1,
-	struct ureg src2 )
-{
-   const GLuint nr = p->program->Base.NumInstructions++;
-   struct prog_instruction *inst = &p->program->Base.Instructions[nr];
-
-   assert(nr < MAX_INSTRUCTIONS);
-
-   _mesa_init_instructions(inst, 1);
-   inst->Opcode = op;
-   
-   emit_arg( &inst->SrcReg[0], src0 );
-   emit_arg( &inst->SrcReg[1], src1 );
-   emit_arg( &inst->SrcReg[2], src2 );
-   
-   inst->SaturateMode = saturate ? SATURATE_ZERO_ONE : SATURATE_OFF;
-
-   emit_dst( &inst->DstReg, dest, mask );
-
-#if 0
-   /* Accounting for indirection tracking:
-    */
-   if (dest.file == PROGRAM_TEMPORARY)
-      p->temps_output |= 1 << dest.idx;
-#endif
-
-   return inst;
-}
-   
-
-static struct ureg emit_arith( struct texenv_fragment_program *p,
-			       enum prog_opcode op,
-			       struct ureg dest,
-			       GLuint mask,
-			       GLboolean saturate,
-			       struct ureg src0,
-			       struct ureg src1,
-			       struct ureg src2 )
-{
-   emit_op(p, op, dest, mask, saturate, src0, src1, src2);
-   
-   /* Accounting for indirection tracking:
-    */
-   if (src0.file == PROGRAM_TEMPORARY)
-      p->alu_temps |= 1 << src0.idx;
-
-   if (!is_undef(src1) && src1.file == PROGRAM_TEMPORARY)
-      p->alu_temps |= 1 << src1.idx;
-
-   if (!is_undef(src2) && src2.file == PROGRAM_TEMPORARY)
-      p->alu_temps |= 1 << src2.idx;
-
-   if (dest.file == PROGRAM_TEMPORARY)
-      p->alu_temps |= 1 << dest.idx;
-       
-   p->program->Base.NumAluInstructions++;
-   return dest;
-}
-
-static struct ureg emit_texld( struct texenv_fragment_program *p,
-			       enum prog_opcode op,
-			       struct ureg dest,
-			       GLuint destmask,
-			       GLuint tex_unit,
-			       GLuint tex_idx,
-                               GLuint tex_shadow,
-			       struct ureg coord )
-{
-   struct prog_instruction *inst = emit_op( p, op, 
-					  dest, destmask, 
-					  GL_FALSE,	/* don't saturate? */
-					  coord, 	/* arg 0? */
-					  undef,
-					  undef);
-   
-   inst->TexSrcTarget = tex_idx;
-   inst->TexSrcUnit = tex_unit;
-   inst->TexShadow = tex_shadow;
-
-   p->program->Base.NumTexInstructions++;
-
-   /* Accounting for indirection tracking:
-    */
-   reserve_temp(p, dest);
-
-#if 0
-   /* Is this a texture indirection?
-    */
-   if ((coord.file == PROGRAM_TEMPORARY &&
-	(p->temps_output & (1<<coord.idx))) ||
-       (dest.file == PROGRAM_TEMPORARY &&
-	(p->alu_temps & (1<<dest.idx)))) {
-      p->program->Base.NumTexIndirections++;
-      p->temps_output = 1<<coord.idx;
-      p->alu_temps = 0;
-      assert(0);		/* KW: texture env crossbar */
-   }
-#endif
-
-   return dest;
-}
-
-
-static struct ureg register_const4f( struct texenv_fragment_program *p, 
-				     GLfloat s0,
-				     GLfloat s1,
-				     GLfloat s2,
-				     GLfloat s3)
-{
-   GLfloat values[4];
-   GLuint idx, swizzle;
-   struct ureg r;
-   values[0] = s0;
-   values[1] = s1;
-   values[2] = s2;
-   values[3] = s3;
-   idx = _mesa_add_unnamed_constant( p->program->Base.Parameters, values, 4,
-                                     &swizzle );
-   r = make_ureg(PROGRAM_CONSTANT, idx);
-   r.swz = swizzle;
-   return r;
-}
-
-#define register_scalar_const(p, s0)    register_const4f(p, s0, s0, s0, s0)
-#define register_const1f(p, s0)         register_const4f(p, s0, 0, 0, 1)
-#define register_const2f(p, s0, s1)     register_const4f(p, s0, s1, 0, 1)
-#define register_const3f(p, s0, s1, s2) register_const4f(p, s0, s1, s2, 1)
-
-
-static struct ureg get_one( struct texenv_fragment_program *p )
-{
-   if (is_undef(p->one)) 
-      p->one = register_scalar_const(p, 1.0);
-   return p->one;
-}
-
-static struct ureg get_half( struct texenv_fragment_program *p )
-{
-   if (is_undef(p->half)) 
-      p->half = register_scalar_const(p, 0.5);
-   return p->half;
-}
-
-static struct ureg get_zero( struct texenv_fragment_program *p )
-{
-   if (is_undef(p->zero)) 
-      p->zero = register_scalar_const(p, 0.0);
-   return p->zero;
-}
-
-
-static void program_error( struct texenv_fragment_program *p, const char *msg )
-{
-   _mesa_problem(NULL, "%s", msg);
-   p->error = 1;
-}
-
-static struct ureg get_source( struct texenv_fragment_program *p, 
-			       GLuint src, GLuint unit )
-{
-   switch (src) {
-   case SRC_TEXTURE: 
-      assert(!is_undef(p->src_texture[unit]));
-      return p->src_texture[unit];
-
-   case SRC_TEXTURE0:
-   case SRC_TEXTURE1:
-   case SRC_TEXTURE2:
-   case SRC_TEXTURE3:
-   case SRC_TEXTURE4:
-   case SRC_TEXTURE5:
-   case SRC_TEXTURE6:
-   case SRC_TEXTURE7: 
-      assert(!is_undef(p->src_texture[src - SRC_TEXTURE0]));
-      return p->src_texture[src - SRC_TEXTURE0];
-
-   case SRC_CONSTANT:
-      return register_param2(p, STATE_TEXENV_COLOR, unit);
-
-   case SRC_PRIMARY_COLOR:
-      return register_input(p, FRAG_ATTRIB_COL0);
-
-   case SRC_ZERO:
-      return get_zero(p);
-
-   case SRC_PREVIOUS:
-      if (is_undef(p->src_previous))
-	 return register_input(p, FRAG_ATTRIB_COL0);
-      else
-	 return p->src_previous;
-
-   default:
-      assert(0);
-      return undef;
-   }
-}
-
-static struct ureg emit_combine_source( struct texenv_fragment_program *p, 
-					GLuint mask,
-					GLuint unit,
-					GLuint source, 
-					GLuint operand )
-{
-   struct ureg arg, src, one;
-
-   src = get_source(p, source, unit);
-
-   switch (operand) {
-   case OPR_ONE_MINUS_SRC_COLOR: 
-      /* Get unused tmp,
-       * Emit tmp = 1.0 - arg.xyzw
-       */
-      arg = get_temp( p );
-      one = get_one( p );
-      return emit_arith( p, OPCODE_SUB, arg, mask, 0, one, src, undef);
-
-   case OPR_SRC_ALPHA: 
-      if (mask == WRITEMASK_W)
-	 return src;
-      else
-	 return swizzle1( src, SWIZZLE_W );
-   case OPR_ONE_MINUS_SRC_ALPHA: 
-      /* Get unused tmp,
-       * Emit tmp = 1.0 - arg.wwww
-       */
-      arg = get_temp(p);
-      one = get_one(p);
-      return emit_arith(p, OPCODE_SUB, arg, mask, 0,
-			one, swizzle1(src, SWIZZLE_W), undef);
-   case OPR_ZERO:
-      return get_zero(p);
-   case OPR_ONE:
-      return get_one(p);
-   case OPR_SRC_COLOR: 
-      return src;
-   default:
-      assert(0);
-      return src;
-   }
-}
-
-/**
- * Check if the RGB and Alpha sources and operands match for the given
- * texture unit's combinder state.  When the RGB and A sources and
- * operands match, we can emit fewer instructions.
- */
-static GLboolean args_match( const struct state_key *key, GLuint unit )
-{
-   GLuint i, numArgs = key->unit[unit].NumArgsRGB;
-
-   for (i = 0; i < numArgs; i++) {
-      if (key->unit[unit].OptA[i].Source != key->unit[unit].OptRGB[i].Source) 
-	 return GL_FALSE;
-
-      switch (key->unit[unit].OptA[i].Operand) {
-      case OPR_SRC_ALPHA: 
-	 switch (key->unit[unit].OptRGB[i].Operand) {
-	 case OPR_SRC_COLOR: 
-	 case OPR_SRC_ALPHA: 
-	    break;
-	 default:
-	    return GL_FALSE;
-	 }
-	 break;
-      case OPR_ONE_MINUS_SRC_ALPHA: 
-	 switch (key->unit[unit].OptRGB[i].Operand) {
-	 case OPR_ONE_MINUS_SRC_COLOR: 
-	 case OPR_ONE_MINUS_SRC_ALPHA: 
-	    break;
-	 default:
-	    return GL_FALSE;
-	 }
-	 break;
-      default: 
-	 return GL_FALSE;	/* impossible */
-      }
-   }
-
-   return GL_TRUE;
-}
-
-static struct ureg emit_combine( struct texenv_fragment_program *p,
-				 struct ureg dest,
-				 GLuint mask,
-				 GLboolean saturate,
-				 GLuint unit,
-				 GLuint nr,
-				 GLuint mode,
-				 const struct mode_opt *opt)
-{
-   struct ureg src[MAX_COMBINER_TERMS];
-   struct ureg tmp, half;
-   GLuint i;
-
-   assert(nr <= MAX_COMBINER_TERMS);
-
-   for (i = 0; i < nr; i++)
-      src[i] = emit_combine_source( p, mask, unit, opt[i].Source, opt[i].Operand );
-
-   switch (mode) {
-   case MODE_REPLACE: 
-      if (mask == WRITEMASK_XYZW && !saturate)
-	 return src[0];
-      else
-	 return emit_arith( p, OPCODE_MOV, dest, mask, saturate, src[0], undef, undef );
-   case MODE_MODULATE: 
-      return emit_arith( p, OPCODE_MUL, dest, mask, saturate,
-			 src[0], src[1], undef );
-   case MODE_ADD: 
-      return emit_arith( p, OPCODE_ADD, dest, mask, saturate, 
-			 src[0], src[1], undef );
-   case MODE_ADD_SIGNED:
-      /* tmp = arg0 + arg1
-       * result = tmp - .5
-       */
-      half = get_half(p);
-      tmp = get_temp( p );
-      emit_arith( p, OPCODE_ADD, tmp, mask, 0, src[0], src[1], undef );
-      emit_arith( p, OPCODE_SUB, dest, mask, saturate, tmp, half, undef );
-      return dest;
-   case MODE_INTERPOLATE: 
-      /* Arg0 * (Arg2) + Arg1 * (1-Arg2) -- note arguments are reordered:
-       */
-      return emit_arith( p, OPCODE_LRP, dest, mask, saturate, src[2], src[0], src[1] );
-
-   case MODE_SUBTRACT: 
-      return emit_arith( p, OPCODE_SUB, dest, mask, saturate, src[0], src[1], undef );
-
-   case MODE_DOT3_RGBA:
-   case MODE_DOT3_RGBA_EXT: 
-   case MODE_DOT3_RGB_EXT:
-   case MODE_DOT3_RGB: {
-      struct ureg tmp0 = get_temp( p );
-      struct ureg tmp1 = get_temp( p );
-      struct ureg neg1 = register_scalar_const(p, -1);
-      struct ureg two  = register_scalar_const(p, 2);
-
-      /* tmp0 = 2*src0 - 1
-       * tmp1 = 2*src1 - 1
-       *
-       * dst = tmp0 dot3 tmp1 
-       */
-      emit_arith( p, OPCODE_MAD, tmp0, WRITEMASK_XYZW, 0, 
-		  two, src[0], neg1);
-
-      if (memcmp(&src[0], &src[1], sizeof(struct ureg)) == 0)
-	 tmp1 = tmp0;
-      else
-	 emit_arith( p, OPCODE_MAD, tmp1, WRITEMASK_XYZW, 0, 
-		     two, src[1], neg1);
-      emit_arith( p, OPCODE_DP3, dest, mask, saturate, tmp0, tmp1, undef);
-      return dest;
-   }
-   case MODE_MODULATE_ADD_ATI:
-      /* Arg0 * Arg2 + Arg1 */
-      return emit_arith( p, OPCODE_MAD, dest, mask, saturate,
-			 src[0], src[2], src[1] );
-   case MODE_MODULATE_SIGNED_ADD_ATI: {
-      /* Arg0 * Arg2 + Arg1 - 0.5 */
-      struct ureg tmp0 = get_temp(p);
-      half = get_half(p);
-      emit_arith( p, OPCODE_MAD, tmp0, mask, 0, src[0], src[2], src[1] );
-      emit_arith( p, OPCODE_SUB, dest, mask, saturate, tmp0, half, undef );
-      return dest;
-   }
-   case MODE_MODULATE_SUBTRACT_ATI:
-      /* Arg0 * Arg2 - Arg1 */
-      emit_arith( p, OPCODE_MAD, dest, mask, 0, src[0], src[2], negate(src[1]) );
-      return dest;
-   case MODE_ADD_PRODUCTS:
-      /* Arg0 * Arg1 + Arg2 * Arg3 */
-      {
-         struct ureg tmp0 = get_temp(p);
-         emit_arith( p, OPCODE_MUL, tmp0, mask, 0, src[0], src[1], undef );
-         emit_arith( p, OPCODE_MAD, dest, mask, saturate, src[2], src[3], tmp0 );
-      }
-      return dest;
-   case MODE_ADD_PRODUCTS_SIGNED:
-      /* Arg0 * Arg1 + Arg2 * Arg3 - 0.5 */
-      {
-         struct ureg tmp0 = get_temp(p);
-         half = get_half(p);
-         emit_arith( p, OPCODE_MUL, tmp0, mask, 0, src[0], src[1], undef );
-         emit_arith( p, OPCODE_MAD, tmp0, mask, 0, src[2], src[3], tmp0 );
-         emit_arith( p, OPCODE_SUB, dest, mask, saturate, tmp0, half, undef );
-      }
-      return dest;
-   case MODE_BUMP_ENVMAP_ATI:
-      /* special - not handled here */
-      assert(0);
-      return src[0];
-   default: 
-      assert(0);
-      return src[0];
-   }
-}
-
-
-/**
- * Generate instructions for one texture unit's env/combiner mode.
- */
-static struct ureg
-emit_texenv(struct texenv_fragment_program *p, GLuint unit)
-{
-   const struct state_key *key = p->state;
-   GLboolean rgb_saturate, alpha_saturate;
-   GLuint rgb_shift, alpha_shift;
-   struct ureg out, dest;
-
-   if (!key->unit[unit].enabled) {
-      return get_source(p, SRC_PREVIOUS, 0);
-   }
-   if (key->unit[unit].ModeRGB == MODE_BUMP_ENVMAP_ATI) {
-      /* this isn't really a env stage delivering a color and handled elsewhere */
-      return get_source(p, SRC_PREVIOUS, 0);
-   }
-   
-   switch (key->unit[unit].ModeRGB) {
-   case MODE_DOT3_RGB_EXT:
-      alpha_shift = key->unit[unit].ScaleShiftA;
-      rgb_shift = 0;
-      break;
-   case MODE_DOT3_RGBA_EXT:
-      alpha_shift = 0;
-      rgb_shift = 0;
-      break;
-   default:
-      rgb_shift = key->unit[unit].ScaleShiftRGB;
-      alpha_shift = key->unit[unit].ScaleShiftA;
-      break;
-   }
-   
-   /* If we'll do rgb/alpha shifting don't saturate in emit_combine().
-    * We don't want to clamp twice.
-    */
-   if (rgb_shift)
-      rgb_saturate = GL_FALSE;  /* saturate after rgb shift */
-   else if (need_saturate(key->unit[unit].ModeRGB))
-      rgb_saturate = GL_TRUE;
-   else
-      rgb_saturate = GL_FALSE;
-
-   if (alpha_shift)
-      alpha_saturate = GL_FALSE;  /* saturate after alpha shift */
-   else if (need_saturate(key->unit[unit].ModeA))
-      alpha_saturate = GL_TRUE;
-   else
-      alpha_saturate = GL_FALSE;
-
-   /* If this is the very last calculation (and various other conditions
-    * are met), emit directly to the color output register.  Otherwise,
-    * emit to a temporary register.
-    */
-   if (key->separate_specular ||
-       unit != p->last_tex_stage ||
-       alpha_shift ||
-       key->num_draw_buffers != 1 ||
-       rgb_shift)
-      dest = get_temp( p );
-   else
-      dest = make_ureg(PROGRAM_OUTPUT, FRAG_RESULT_COLOR);
-
-   /* Emit the RGB and A combine ops
-    */
-   if (key->unit[unit].ModeRGB == key->unit[unit].ModeA &&
-       args_match(key, unit)) {
-      out = emit_combine( p, dest, WRITEMASK_XYZW, rgb_saturate,
-			  unit,
-			  key->unit[unit].NumArgsRGB,
-			  key->unit[unit].ModeRGB,
-			  key->unit[unit].OptRGB);
-   }
-   else if (key->unit[unit].ModeRGB == MODE_DOT3_RGBA_EXT ||
-	    key->unit[unit].ModeRGB == MODE_DOT3_RGBA) {
-      out = emit_combine( p, dest, WRITEMASK_XYZW, rgb_saturate,
-			  unit,
-			  key->unit[unit].NumArgsRGB,
-			  key->unit[unit].ModeRGB,
-			  key->unit[unit].OptRGB);
-   }
-   else {
-      /* Need to do something to stop from re-emitting identical
-       * argument calculations here:
-       */
-      out = emit_combine( p, dest, WRITEMASK_XYZ, rgb_saturate,
-			  unit,
-			  key->unit[unit].NumArgsRGB,
-			  key->unit[unit].ModeRGB,
-			  key->unit[unit].OptRGB);
-      out = emit_combine( p, dest, WRITEMASK_W, alpha_saturate,
-			  unit,
-			  key->unit[unit].NumArgsA,
-			  key->unit[unit].ModeA,
-			  key->unit[unit].OptA);
-   }
-
-   /* Deal with the final shift:
-    */
-   if (alpha_shift || rgb_shift) {
-      struct ureg shift;
-      GLboolean saturate = GL_TRUE;  /* always saturate at this point */
-
-      if (rgb_shift == alpha_shift) {
-	 shift = register_scalar_const(p, (GLfloat)(1<<rgb_shift));
-      }
-      else {
-	 shift = register_const4f(p, 
-				  (GLfloat)(1<<rgb_shift),
-				  (GLfloat)(1<<rgb_shift),
-				  (GLfloat)(1<<rgb_shift),
-				  (GLfloat)(1<<alpha_shift));
-      }
-      return emit_arith( p, OPCODE_MUL, dest, WRITEMASK_XYZW, 
-			 saturate, out, shift, undef );
-   }
-   else
-      return out;
-}
-
-
-/**
- * Generate instruction for getting a texture source term.
- */
-static void load_texture( struct texenv_fragment_program *p, GLuint unit )
-{
-   if (is_undef(p->src_texture[unit])) {
-      const GLuint texTarget = p->state->unit[unit].source_index;
-      struct ureg texcoord;
-      struct ureg tmp = get_tex_temp( p );
-
-      if (is_undef(p->texcoord_tex[unit])) {
-         texcoord = register_input(p, FRAG_ATTRIB_TEX0+unit);
-      }
-      else {
-         /* might want to reuse this reg for tex output actually */
-         texcoord = p->texcoord_tex[unit];
-      }
-
-      /* TODO: Use D0_MASK_XY where possible.
-       */
-      if (p->state->unit[unit].enabled) {
-         GLboolean shadow = GL_FALSE;
-
-	 if (p->state->unit[unit].shadow) {
-	    p->program->Base.ShadowSamplers |= 1 << unit;
-            shadow = GL_TRUE;
-         }
-
-	 p->src_texture[unit] = emit_texld( p, OPCODE_TXP,
-					    tmp, WRITEMASK_XYZW, 
-					    unit, texTarget, shadow,
-                                            texcoord );
-
-         p->program->Base.SamplersUsed |= (1 << unit);
-         /* This identity mapping should already be in place
-          * (see _mesa_init_program_struct()) but let's be safe.
-          */
-         p->program->Base.SamplerUnits[unit] = unit;
-      }
-      else
-	 p->src_texture[unit] = get_zero(p);
-
-      if (p->state->unit[unit].texture_cyl_wrap) {
-         /* set flag which is checked by Mesa->Gallium program translation */
-         p->program->Base.InputFlags[0] |= PROG_PARAM_BIT_CYL_WRAP;
-      }
-
-   }
-}
-
-static GLboolean load_texenv_source( struct texenv_fragment_program *p, 
-				     GLuint src, GLuint unit )
-{
-   switch (src) {
-   case SRC_TEXTURE:
-      load_texture(p, unit);
-      break;
-
-   case SRC_TEXTURE0:
-   case SRC_TEXTURE1:
-   case SRC_TEXTURE2:
-   case SRC_TEXTURE3:
-   case SRC_TEXTURE4:
-   case SRC_TEXTURE5:
-   case SRC_TEXTURE6:
-   case SRC_TEXTURE7:       
-      load_texture(p, src - SRC_TEXTURE0);
-      break;
-      
-   default:
-      /* not a texture src - do nothing */
-      break;
-   }
- 
-   return GL_TRUE;
-}
-
-
-/**
- * Generate instructions for loading all texture source terms.
- */
-static GLboolean
-load_texunit_sources( struct texenv_fragment_program *p, GLuint unit )
-{
-   const struct state_key *key = p->state;
-   GLuint i;
-
-   for (i = 0; i < key->unit[unit].NumArgsRGB; i++) {
-      load_texenv_source( p, key->unit[unit].OptRGB[i].Source, unit );
-   }
-
-   for (i = 0; i < key->unit[unit].NumArgsA; i++) {
-      load_texenv_source( p, key->unit[unit].OptA[i].Source, unit );
-   }
-
-   return GL_TRUE;
-}
-
-/**
- * Generate instructions for loading bump map textures.
- */
-static GLboolean
-load_texunit_bumpmap( struct texenv_fragment_program *p, GLuint unit )
-{
-   const struct state_key *key = p->state;
-   GLuint bumpedUnitNr = key->unit[unit].OptRGB[1].Source - SRC_TEXTURE0;
-   struct ureg texcDst, bumpMapRes;
-   struct ureg constdudvcolor = register_const4f(p, 0.0, 0.0, 0.0, 1.0);
-   struct ureg texcSrc = register_input(p, FRAG_ATTRIB_TEX0 + bumpedUnitNr);
-   struct ureg rotMat0 = register_param3( p, STATE_INTERNAL, STATE_ROT_MATRIX_0, unit );
-   struct ureg rotMat1 = register_param3( p, STATE_INTERNAL, STATE_ROT_MATRIX_1, unit );
-
-   load_texenv_source( p, unit + SRC_TEXTURE0, unit );
-
-   bumpMapRes = get_source(p, key->unit[unit].OptRGB[0].Source, unit);
-   texcDst = get_tex_temp( p );
-   p->texcoord_tex[bumpedUnitNr] = texcDst;
-
-   /* Apply rot matrix and add coords to be available in next phase.
-    * dest = (Arg0.xxxx * rotMat0 + Arg1) + (Arg0.yyyy * rotMat1)
-    * note only 2 coords are affected the rest are left unchanged (mul by 0)
-    */
-   emit_arith( p, OPCODE_MAD, texcDst, WRITEMASK_XYZW, 0,
-               swizzle1(bumpMapRes, SWIZZLE_X), rotMat0, texcSrc );
-   emit_arith( p, OPCODE_MAD, texcDst, WRITEMASK_XYZW, 0,
-               swizzle1(bumpMapRes, SWIZZLE_Y), rotMat1, texcDst );
-
-   /* Move 0,0,0,1 into bumpmap src if someone (crossbar) is foolish
-    * enough to access this later, should optimize away.
-    */
-   emit_arith( p, OPCODE_MOV, bumpMapRes, WRITEMASK_XYZW, 0,
-               constdudvcolor, undef, undef );
-
-   return GL_TRUE;
-}
-
-/**
- * Generate a new fragment program which implements the context's
- * current texture env/combine mode.
- */
-static void
-create_new_program(struct gl_context *ctx, struct state_key *key,
-                   struct gl_fragment_program *program)
-{
-   struct prog_instruction instBuffer[MAX_INSTRUCTIONS];
-   struct texenv_fragment_program p;
-   GLuint unit;
-   struct ureg cf, out;
-   int i;
-
-   memset(&p, 0, sizeof(p));
-   p.state = key;
-   p.program = program;
-
-   /* During code generation, use locally-allocated instruction buffer,
-    * then alloc dynamic storage below.
-    */
-   p.program->Base.Instructions = instBuffer;
-   p.program->Base.Target = GL_FRAGMENT_PROGRAM_ARB;
-   p.program->Base.String = NULL;
-   p.program->Base.NumTexIndirections = 1; /* is this right? */
-   p.program->Base.NumTexInstructions = 0;
-   p.program->Base.NumAluInstructions = 0;
-   p.program->Base.NumInstructions = 0;
-   p.program->Base.NumTemporaries = 0;
-   p.program->Base.NumParameters = 0;
-   p.program->Base.NumAttributes = 0;
-   p.program->Base.NumAddressRegs = 0;
-   p.program->Base.Parameters = _mesa_new_parameter_list();
-   p.program->Base.InputsRead = 0x0;
-
-   if (key->num_draw_buffers == 1)
-      p.program->Base.OutputsWritten = 1 << FRAG_RESULT_COLOR;
-   else {
-      for (i = 0; i < key->num_draw_buffers; i++)
-	 p.program->Base.OutputsWritten |= (1 << (FRAG_RESULT_DATA0 + i));
-   }
-
-   for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {
-      p.src_texture[unit] = undef;
-      p.texcoord_tex[unit] = undef;
-   }
-
-   p.src_previous = undef;
-   p.half = undef;
-   p.zero = undef;
-   p.one = undef;
-
-   p.last_tex_stage = 0;
-   release_temps(ctx, &p);
-
-   if (key->enabled_units && key->num_draw_buffers) {
-      GLboolean needbumpstage = GL_FALSE;
-
-      /* Zeroth pass - bump map textures first */
-      for (unit = 0; unit < key->nr_enabled_units; unit++)
-	 if (key->unit[unit].enabled &&
-             key->unit[unit].ModeRGB == MODE_BUMP_ENVMAP_ATI) {
-	    needbumpstage = GL_TRUE;
-	    load_texunit_bumpmap( &p, unit );
-	 }
-      if (needbumpstage)
-	 p.program->Base.NumTexIndirections++;
-
-      /* First pass - to support texture_env_crossbar, first identify
-       * all referenced texture sources and emit texld instructions
-       * for each:
-       */
-      for (unit = 0; unit < key->nr_enabled_units; unit++)
-	 if (key->unit[unit].enabled) {
-	    load_texunit_sources( &p, unit );
-	    p.last_tex_stage = unit;
-	 }
-
-      /* Second pass - emit combine instructions to build final color:
-       */
-      for (unit = 0; unit < key->nr_enabled_units; unit++)
-	 if (key->unit[unit].enabled) {
-	    p.src_previous = emit_texenv( &p, unit );
-            reserve_temp(&p, p.src_previous); /* don't re-use this temp reg */
-	    release_temps(ctx, &p);	/* release all temps */
-	 }
-   }
-
-   cf = get_source( &p, SRC_PREVIOUS, 0 );
-
-   for (i = 0; i < key->num_draw_buffers; i++) {
-      if (key->num_draw_buffers == 1)
-	 out = make_ureg( PROGRAM_OUTPUT, FRAG_RESULT_COLOR );
-      else {
-	 out = make_ureg( PROGRAM_OUTPUT, FRAG_RESULT_DATA0 + i );
-      }
-
-      if (key->separate_specular) {
-	 /* Emit specular add.
-	  */
-	 struct ureg s = register_input(&p, FRAG_ATTRIB_COL1);
-	 emit_arith( &p, OPCODE_ADD, out, WRITEMASK_XYZ, 0, cf, s, undef );
-	 emit_arith( &p, OPCODE_MOV, out, WRITEMASK_W, 0, cf, undef, undef );
-      }
-      else if (memcmp(&cf, &out, sizeof(cf)) != 0) {
-	 /* Will wind up in here if no texture enabled or a couple of
-	  * other scenarios (GL_REPLACE for instance).
-	  */
-	 emit_arith( &p, OPCODE_MOV, out, WRITEMASK_XYZW, 0, cf, undef, undef );
-      }
-   }
-   /* Finish up:
-    */
-   emit_arith( &p, OPCODE_END, undef, WRITEMASK_XYZW, 0, undef, undef, undef);
-
-   if (key->fog_enabled) {
-      /* Pull fog mode from struct gl_context, the value in the state key is
-       * a reduced value and not what is expected in FogOption
-       */
-      p.program->FogOption = ctx->Fog.Mode;
-      p.program->Base.InputsRead |= FRAG_BIT_FOGC;
-   }
-   else {
-      p.program->FogOption = GL_NONE;
-   }
-
-   if (p.program->Base.NumTexIndirections > ctx->Const.FragmentProgram.MaxTexIndirections) 
-      program_error(&p, "Exceeded max nr indirect texture lookups");
-
-   if (p.program->Base.NumTexInstructions > ctx->Const.FragmentProgram.MaxTexInstructions)
-      program_error(&p, "Exceeded max TEX instructions");
-
-   if (p.program->Base.NumAluInstructions > ctx->Const.FragmentProgram.MaxAluInstructions)
-      program_error(&p, "Exceeded max ALU instructions");
-
-   ASSERT(p.program->Base.NumInstructions <= MAX_INSTRUCTIONS);
-
-   /* Allocate final instruction array */
-   p.program->Base.Instructions
-      = _mesa_alloc_instructions(p.program->Base.NumInstructions);
-   if (!p.program->Base.Instructions) {
-      _mesa_error(ctx, GL_OUT_OF_MEMORY,
-                  "generating tex env program");
-      return;
-   }
-   _mesa_copy_instructions(p.program->Base.Instructions, instBuffer,
-                           p.program->Base.NumInstructions);
-
-   if (key->num_draw_buffers && p.program->FogOption) {
-      _mesa_append_fog_code(ctx, p.program);
-      p.program->FogOption = GL_NONE;
-   }
-
-
-   /* Notify driver the fragment program has (actually) changed.
-    */
-   if (ctx->Driver.ProgramStringNotify) {
-      GLboolean ok = ctx->Driver.ProgramStringNotify(ctx,
-                                                     GL_FRAGMENT_PROGRAM_ARB, 
-                                                     &p.program->Base);
-      /* Driver should be able to handle any texenv programs as long as
-       * the driver correctly reported max number of texture units correctly,
-       * etc.
-       */
-      ASSERT(ok);
-      (void) ok; /* silence unused var warning */
-   }
-
-   if (DISASSEM) {
-      _mesa_print_program(&p.program->Base);
-      printf("\n");
-   }
-}
-
-extern "C" {
-
-/**
- * Return a fragment program which implements the current
- * fixed-function texture, fog and color-sum operations.
- */
-struct gl_fragment_program *
-_mesa_get_fixed_func_fragment_program(struct gl_context *ctx)
-{
-   struct gl_fragment_program *prog;
-   struct state_key key;
-   GLuint keySize;
-	
-   keySize = make_state_key(ctx, &key);
-      
-   prog = (struct gl_fragment_program *)
-      _mesa_search_program_cache(ctx->FragmentProgram.Cache,
-                                 &key, keySize);
-
-   if (!prog) {
-      prog = (struct gl_fragment_program *) 
-         ctx->Driver.NewProgram(ctx, GL_FRAGMENT_PROGRAM_ARB, 0);
-
-      create_new_program(ctx, &key, prog);
-
-      _mesa_program_cache_insert(ctx, ctx->FragmentProgram.Cache,
-                                 &key, keySize, &prog->Base);
-   }
-
-   return prog;
-}
-
-}
+/**************************************************************************
+ * 
+ * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * All Rights Reserved.
+ * Copyright 2009 VMware, Inc.  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"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ * 
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * 
+ **************************************************************************/
+
+extern "C" {
+#include "glheader.h"
+#include "imports.h"
+#include "mtypes.h"
+#include "program/program.h"
+#include "program/prog_parameter.h"
+#include "program/prog_cache.h"
+#include "program/prog_instruction.h"
+#include "program/prog_print.h"
+#include "program/prog_statevars.h"
+#include "program/programopt.h"
+#include "texenvprogram.h"
+}
+
+/*
+ * Note on texture units:
+ *
+ * The number of texture units supported by fixed-function fragment
+ * processing is MAX_TEXTURE_COORD_UNITS, not MAX_TEXTURE_IMAGE_UNITS.
+ * That's because there's a one-to-one correspondence between texture
+ * coordinates and samplers in fixed-function processing.
+ *
+ * Since fixed-function vertex processing is limited to MAX_TEXTURE_COORD_UNITS
+ * sets of texcoords, so is fixed-function fragment processing.
+ *
+ * We can safely use ctx->Const.MaxTextureUnits for loop bounds.
+ */
+
+
+struct texenvprog_cache_item
+{
+   GLuint hash;
+   void *key;
+   struct gl_fragment_program *data;
+   struct texenvprog_cache_item *next;
+};
+
+static GLboolean
+texenv_doing_secondary_color(struct gl_context *ctx)
+{
+   if (ctx->Light.Enabled &&
+       (ctx->Light.Model.ColorControl == GL_SEPARATE_SPECULAR_COLOR))
+      return GL_TRUE;
+
+   if (ctx->Fog.ColorSumEnabled)
+      return GL_TRUE;
+
+   return GL_FALSE;
+}
+
+/**
+ * Up to nine instructions per tex unit, plus fog, specular color.
+ */
+#define MAX_INSTRUCTIONS ((MAX_TEXTURE_COORD_UNITS * 9) + 12)
+
+#define DISASSEM (MESA_VERBOSE & VERBOSE_DISASSEM)
+
+struct mode_opt {
+#ifdef __GNUC__
+   __extension__ GLubyte Source:4;  /**< SRC_x */
+   __extension__ GLubyte Operand:3; /**< OPR_x */
+#else
+   GLubyte Source;  /**< SRC_x */
+   GLubyte Operand; /**< OPR_x */
+#endif
+};
+
+struct state_key {
+   GLuint nr_enabled_units:8;
+   GLuint enabled_units:8;
+   GLuint separate_specular:1;
+   GLuint fog_enabled:1;
+   GLuint fog_mode:2;          /**< FOG_x */
+   GLuint inputs_available:12;
+   GLuint num_draw_buffers:4;
+
+   /* NOTE: This array of structs must be last! (see "keySize" below) */
+   struct {
+      GLuint enabled:1;
+      GLuint source_index:3;   /**< TEXTURE_x_INDEX */
+      GLuint shadow:1;
+      GLuint ScaleShiftRGB:2;
+      GLuint ScaleShiftA:2;
+
+      GLuint NumArgsRGB:3;  /**< up to MAX_COMBINER_TERMS */
+      GLuint ModeRGB:5;     /**< MODE_x */
+
+      GLuint NumArgsA:3;  /**< up to MAX_COMBINER_TERMS */
+      GLuint ModeA:5;     /**< MODE_x */
+
+      GLuint texture_cyl_wrap:1; /**< For gallium test/debug only */
+
+      struct mode_opt OptRGB[MAX_COMBINER_TERMS];
+      struct mode_opt OptA[MAX_COMBINER_TERMS];
+   } unit[MAX_TEXTURE_UNITS];
+};
+
+#define FOG_LINEAR  0
+#define FOG_EXP     1
+#define FOG_EXP2    2
+#define FOG_UNKNOWN 3
+
+static GLuint translate_fog_mode( GLenum mode )
+{
+   switch (mode) {
+   case GL_LINEAR: return FOG_LINEAR;
+   case GL_EXP: return FOG_EXP;
+   case GL_EXP2: return FOG_EXP2;
+   default: return FOG_UNKNOWN;
+   }
+}
+
+#define OPR_SRC_COLOR           0
+#define OPR_ONE_MINUS_SRC_COLOR 1
+#define OPR_SRC_ALPHA           2
+#define OPR_ONE_MINUS_SRC_ALPHA	3
+#define OPR_ZERO                4
+#define OPR_ONE                 5
+#define OPR_UNKNOWN             7
+
+static GLuint translate_operand( GLenum operand )
+{
+   switch (operand) {
+   case GL_SRC_COLOR: return OPR_SRC_COLOR;
+   case GL_ONE_MINUS_SRC_COLOR: return OPR_ONE_MINUS_SRC_COLOR;
+   case GL_SRC_ALPHA: return OPR_SRC_ALPHA;
+   case GL_ONE_MINUS_SRC_ALPHA: return OPR_ONE_MINUS_SRC_ALPHA;
+   case GL_ZERO: return OPR_ZERO;
+   case GL_ONE: return OPR_ONE;
+   default:
+      assert(0);
+      return OPR_UNKNOWN;
+   }
+}
+
+#define SRC_TEXTURE  0
+#define SRC_TEXTURE0 1
+#define SRC_TEXTURE1 2
+#define SRC_TEXTURE2 3
+#define SRC_TEXTURE3 4
+#define SRC_TEXTURE4 5
+#define SRC_TEXTURE5 6
+#define SRC_TEXTURE6 7
+#define SRC_TEXTURE7 8
+#define SRC_CONSTANT 9
+#define SRC_PRIMARY_COLOR 10
+#define SRC_PREVIOUS 11
+#define SRC_ZERO     12
+#define SRC_UNKNOWN  15
+
+static GLuint translate_source( GLenum src )
+{
+   switch (src) {
+   case GL_TEXTURE: return SRC_TEXTURE;
+   case GL_TEXTURE0:
+   case GL_TEXTURE1:
+   case GL_TEXTURE2:
+   case GL_TEXTURE3:
+   case GL_TEXTURE4:
+   case GL_TEXTURE5:
+   case GL_TEXTURE6:
+   case GL_TEXTURE7: return SRC_TEXTURE0 + (src - GL_TEXTURE0);
+   case GL_CONSTANT: return SRC_CONSTANT;
+   case GL_PRIMARY_COLOR: return SRC_PRIMARY_COLOR;
+   case GL_PREVIOUS: return SRC_PREVIOUS;
+   case GL_ZERO:
+      return SRC_ZERO;
+   default:
+      assert(0);
+      return SRC_UNKNOWN;
+   }
+}
+
+#define MODE_REPLACE                     0  /* r = a0 */
+#define MODE_MODULATE                    1  /* r = a0 * a1 */
+#define MODE_ADD                         2  /* r = a0 + a1 */
+#define MODE_ADD_SIGNED                  3  /* r = a0 + a1 - 0.5 */
+#define MODE_INTERPOLATE                 4  /* r = a0 * a2 + a1 * (1 - a2) */
+#define MODE_SUBTRACT                    5  /* r = a0 - a1 */
+#define MODE_DOT3_RGB                    6  /* r = a0 . a1 */
+#define MODE_DOT3_RGB_EXT                7  /* r = a0 . a1 */
+#define MODE_DOT3_RGBA                   8  /* r = a0 . a1 */
+#define MODE_DOT3_RGBA_EXT               9  /* r = a0 . a1 */
+#define MODE_MODULATE_ADD_ATI           10  /* r = a0 * a2 + a1 */
+#define MODE_MODULATE_SIGNED_ADD_ATI    11  /* r = a0 * a2 + a1 - 0.5 */
+#define MODE_MODULATE_SUBTRACT_ATI      12  /* r = a0 * a2 - a1 */
+#define MODE_ADD_PRODUCTS               13  /* r = a0 * a1 + a2 * a3 */
+#define MODE_ADD_PRODUCTS_SIGNED        14  /* r = a0 * a1 + a2 * a3 - 0.5 */
+#define MODE_BUMP_ENVMAP_ATI            15  /* special */
+#define MODE_UNKNOWN                    16
+
+/**
+ * Translate GL combiner state into a MODE_x value
+ */
+static GLuint translate_mode( GLenum envMode, GLenum mode )
+{
+   switch (mode) {
+   case GL_REPLACE: return MODE_REPLACE;
+   case GL_MODULATE: return MODE_MODULATE;
+   case GL_ADD:
+      if (envMode == GL_COMBINE4_NV)
+         return MODE_ADD_PRODUCTS;
+      else
+         return MODE_ADD;
+   case GL_ADD_SIGNED:
+      if (envMode == GL_COMBINE4_NV)
+         return MODE_ADD_PRODUCTS_SIGNED;
+      else
+         return MODE_ADD_SIGNED;
+   case GL_INTERPOLATE: return MODE_INTERPOLATE;
+   case GL_SUBTRACT: return MODE_SUBTRACT;
+   case GL_DOT3_RGB: return MODE_DOT3_RGB;
+   case GL_DOT3_RGB_EXT: return MODE_DOT3_RGB_EXT;
+   case GL_DOT3_RGBA: return MODE_DOT3_RGBA;
+   case GL_DOT3_RGBA_EXT: return MODE_DOT3_RGBA_EXT;
+   case GL_MODULATE_ADD_ATI: return MODE_MODULATE_ADD_ATI;
+   case GL_MODULATE_SIGNED_ADD_ATI: return MODE_MODULATE_SIGNED_ADD_ATI;
+   case GL_MODULATE_SUBTRACT_ATI: return MODE_MODULATE_SUBTRACT_ATI;
+   case GL_BUMP_ENVMAP_ATI: return MODE_BUMP_ENVMAP_ATI;
+   default:
+      assert(0);
+      return MODE_UNKNOWN;
+   }
+}
+
+
+/**
+ * Do we need to clamp the results of the given texture env/combine mode?
+ * If the inputs to the mode are in [0,1] we don't always have to clamp
+ * the results.
+ */
+static GLboolean
+need_saturate( GLuint mode )
+{
+   switch (mode) {
+   case MODE_REPLACE:
+   case MODE_MODULATE:
+   case MODE_INTERPOLATE:
+      return GL_FALSE;
+   case MODE_ADD:
+   case MODE_ADD_SIGNED:
+   case MODE_SUBTRACT:
+   case MODE_DOT3_RGB:
+   case MODE_DOT3_RGB_EXT:
+   case MODE_DOT3_RGBA:
+   case MODE_DOT3_RGBA_EXT:
+   case MODE_MODULATE_ADD_ATI:
+   case MODE_MODULATE_SIGNED_ADD_ATI:
+   case MODE_MODULATE_SUBTRACT_ATI:
+   case MODE_ADD_PRODUCTS:
+   case MODE_ADD_PRODUCTS_SIGNED:
+   case MODE_BUMP_ENVMAP_ATI:
+      return GL_TRUE;
+   default:
+      assert(0);
+      return GL_FALSE;
+   }
+}
+
+
+
+/**
+ * Translate TEXTURE_x_BIT to TEXTURE_x_INDEX.
+ */
+static GLuint translate_tex_src_bit( GLbitfield bit )
+{
+   ASSERT(bit);
+   return _mesa_ffs(bit) - 1;
+}
+
+
+#define VERT_BIT_TEX_ANY    (0xff << VERT_ATTRIB_TEX0)
+#define VERT_RESULT_TEX_ANY (0xff << VERT_RESULT_TEX0)
+
+/**
+ * Identify all possible varying inputs.  The fragment program will
+ * never reference non-varying inputs, but will track them via state
+ * constants instead.
+ *
+ * This function figures out all the inputs that the fragment program
+ * has access to.  The bitmask is later reduced to just those which
+ * are actually referenced.
+ */
+static GLbitfield get_fp_input_mask( struct gl_context *ctx )
+{
+   /* _NEW_PROGRAM */
+   const GLboolean vertexShader =
+      (ctx->Shader.CurrentVertexProgram &&
+       ctx->Shader.CurrentVertexProgram->LinkStatus &&
+       ctx->Shader.CurrentVertexProgram->VertexProgram);
+   const GLboolean vertexProgram = ctx->VertexProgram._Enabled;
+   GLbitfield fp_inputs = 0x0;
+
+   if (ctx->VertexProgram._Overriden) {
+      /* Somebody's messing with the vertex program and we don't have
+       * a clue what's happening.  Assume that it could be producing
+       * all possible outputs.
+       */
+      fp_inputs = ~0;
+   }
+   else if (ctx->RenderMode == GL_FEEDBACK) {
+      /* _NEW_RENDERMODE */
+      fp_inputs = (FRAG_BIT_COL0 | FRAG_BIT_TEX0);
+   }
+   else if (!(vertexProgram || vertexShader) ||
+            !ctx->VertexProgram._Current) {
+      /* Fixed function vertex logic */
+      /* _NEW_ARRAY */
+      GLbitfield varying_inputs = ctx->varying_vp_inputs;
+
+      /* These get generated in the setup routine regardless of the
+       * vertex program:
+       */
+      /* _NEW_POINT */
+      if (ctx->Point.PointSprite)
+         varying_inputs |= FRAG_BITS_TEX_ANY;
+
+      /* First look at what values may be computed by the generated
+       * vertex program:
+       */
+      /* _NEW_LIGHT */
+      if (ctx->Light.Enabled) {
+         fp_inputs |= FRAG_BIT_COL0;
+
+         if (texenv_doing_secondary_color(ctx))
+            fp_inputs |= FRAG_BIT_COL1;
+      }
+
+      /* _NEW_TEXTURE */
+      fp_inputs |= (ctx->Texture._TexGenEnabled |
+                    ctx->Texture._TexMatEnabled) << FRAG_ATTRIB_TEX0;
+
+      /* Then look at what might be varying as a result of enabled
+       * arrays, etc:
+       */
+      if (varying_inputs & VERT_BIT_COLOR0)
+         fp_inputs |= FRAG_BIT_COL0;
+      if (varying_inputs & VERT_BIT_COLOR1)
+         fp_inputs |= FRAG_BIT_COL1;
+
+      fp_inputs |= (((varying_inputs & VERT_BIT_TEX_ANY) >> VERT_ATTRIB_TEX0) 
+                    << FRAG_ATTRIB_TEX0);
+
+   }
+   else {
+      /* calculate from vp->outputs */
+      struct gl_vertex_program *vprog;
+      GLbitfield64 vp_outputs;
+
+      /* Choose GLSL vertex shader over ARB vertex program.  Need this
+       * since vertex shader state validation comes after fragment state
+       * validation (see additional comments in state.c).
+       */
+      if (vertexShader)
+         vprog = ctx->Shader.CurrentVertexProgram->VertexProgram;
+      else
+         vprog = ctx->VertexProgram.Current;
+
+      vp_outputs = vprog->Base.OutputsWritten;
+
+      /* These get generated in the setup routine regardless of the
+       * vertex program:
+       */
+      /* _NEW_POINT */
+      if (ctx->Point.PointSprite)
+         vp_outputs |= FRAG_BITS_TEX_ANY;
+
+      if (vp_outputs & (1 << VERT_RESULT_COL0))
+         fp_inputs |= FRAG_BIT_COL0;
+      if (vp_outputs & (1 << VERT_RESULT_COL1))
+         fp_inputs |= FRAG_BIT_COL1;
+
+      fp_inputs |= (((vp_outputs & VERT_RESULT_TEX_ANY) >> VERT_RESULT_TEX0) 
+                    << FRAG_ATTRIB_TEX0);
+   }
+   
+   return fp_inputs;
+}
+
+
+/**
+ * Examine current texture environment state and generate a unique
+ * key to identify it.
+ */
+static GLuint make_state_key( struct gl_context *ctx,  struct state_key *key )
+{
+   GLuint i, j;
+   GLbitfield inputs_referenced = FRAG_BIT_COL0;
+   const GLbitfield inputs_available = get_fp_input_mask( ctx );
+   GLuint keySize;
+
+   memset(key, 0, sizeof(*key));
+
+   /* _NEW_TEXTURE */
+   for (i = 0; i < ctx->Const.MaxTextureUnits; i++) {
+      const struct gl_texture_unit *texUnit = &ctx->Texture.Unit[i];
+      const struct gl_texture_object *texObj = texUnit->_Current;
+      const struct gl_tex_env_combine_state *comb = texUnit->_CurrentCombine;
+      GLenum format;
+
+      if (!texUnit->_ReallyEnabled || !texUnit->Enabled)
+         continue;
+
+      format = texObj->Image[0][texObj->BaseLevel]->_BaseFormat;
+
+      key->unit[i].enabled = 1;
+      key->enabled_units |= (1<<i);
+      key->nr_enabled_units = i + 1;
+      inputs_referenced |= FRAG_BIT_TEX(i);
+
+      key->unit[i].source_index =
+         translate_tex_src_bit(texUnit->_ReallyEnabled);
+
+      key->unit[i].shadow = ((texObj->CompareMode == GL_COMPARE_R_TO_TEXTURE) &&
+                             ((format == GL_DEPTH_COMPONENT) || 
+                              (format == GL_DEPTH_STENCIL_EXT)));
+
+      key->unit[i].NumArgsRGB = comb->_NumArgsRGB;
+      key->unit[i].NumArgsA = comb->_NumArgsA;
+
+      key->unit[i].ModeRGB =
+	 translate_mode(texUnit->EnvMode, comb->ModeRGB);
+      key->unit[i].ModeA =
+	 translate_mode(texUnit->EnvMode, comb->ModeA);
+
+      key->unit[i].ScaleShiftRGB = comb->ScaleShiftRGB;
+      key->unit[i].ScaleShiftA = comb->ScaleShiftA;
+
+      for (j = 0; j < MAX_COMBINER_TERMS; j++) {
+         key->unit[i].OptRGB[j].Operand = translate_operand(comb->OperandRGB[j]);
+         key->unit[i].OptA[j].Operand = translate_operand(comb->OperandA[j]);
+         key->unit[i].OptRGB[j].Source = translate_source(comb->SourceRGB[j]);
+         key->unit[i].OptA[j].Source = translate_source(comb->SourceA[j]);
+      }
+
+      if (key->unit[i].ModeRGB == MODE_BUMP_ENVMAP_ATI) {
+         /* requires some special translation */
+         key->unit[i].NumArgsRGB = 2;
+         key->unit[i].ScaleShiftRGB = 0;
+         key->unit[i].OptRGB[0].Operand = OPR_SRC_COLOR;
+         key->unit[i].OptRGB[0].Source = SRC_TEXTURE;
+         key->unit[i].OptRGB[1].Operand = OPR_SRC_COLOR;
+         key->unit[i].OptRGB[1].Source = texUnit->BumpTarget - GL_TEXTURE0 + SRC_TEXTURE0;
+       }
+
+      /* this is a back-door for enabling cylindrical texture wrap mode */
+      if (texObj->Priority == 0.125)
+         key->unit[i].texture_cyl_wrap = 1;
+   }
+
+   /* _NEW_LIGHT | _NEW_FOG */
+   if (texenv_doing_secondary_color(ctx)) {
+      key->separate_specular = 1;
+      inputs_referenced |= FRAG_BIT_COL1;
+   }
+
+   /* _NEW_FOG */
+   if (ctx->Fog.Enabled) {
+      key->fog_enabled = 1;
+      key->fog_mode = translate_fog_mode(ctx->Fog.Mode);
+      inputs_referenced |= FRAG_BIT_FOGC; /* maybe */
+   }
+
+   /* _NEW_BUFFERS */
+   key->num_draw_buffers = ctx->DrawBuffer->_NumColorDrawBuffers;
+
+   key->inputs_available = (inputs_available & inputs_referenced);
+
+   /* compute size of state key, ignoring unused texture units */
+   keySize = sizeof(*key) - sizeof(key->unit)
+      + key->nr_enabled_units * sizeof(key->unit[0]);
+
+   return keySize;
+}
+
+
+/**
+ * Use uregs to represent registers internally, translate to Mesa's
+ * expected formats on emit.  
+ *
+ * NOTE: These are passed by value extensively in this file rather
+ * than as usual by pointer reference.  If this disturbs you, try
+ * remembering they are just 32bits in size.
+ *
+ * GCC is smart enough to deal with these dword-sized structures in
+ * much the same way as if I had defined them as dwords and was using
+ * macros to access and set the fields.  This is much nicer and easier
+ * to evolve.
+ */
+struct ureg {
+   GLuint file:4;
+   GLuint idx:8;
+   GLuint negatebase:1;
+   GLuint swz:12;
+   GLuint pad:7;
+};
+
+static const struct ureg undef = { 
+   PROGRAM_UNDEFINED,
+   255,
+   0,
+   0,
+   0
+};
+
+
+/** State used to build the fragment program:
+ */
+struct texenv_fragment_program {
+   struct gl_fragment_program *program;
+   struct state_key *state;
+
+   GLbitfield alu_temps;	/**< Track texture indirections, see spec. */
+   GLbitfield temps_output;	/**< Track texture indirections, see spec. */
+   GLbitfield temp_in_use;	/**< Tracks temporary regs which are in use. */
+   GLboolean error;
+
+   struct ureg src_texture[MAX_TEXTURE_COORD_UNITS];   
+   /* Reg containing each texture unit's sampled texture color,
+    * else undef.
+    */
+
+   struct ureg texcoord_tex[MAX_TEXTURE_COORD_UNITS];
+   /* Reg containing texcoord for a texture unit,
+    * needed for bump mapping, else undef.
+    */
+
+   struct ureg src_previous;	/**< Reg containing color from previous 
+				 * stage.  May need to be decl'd.
+				 */
+
+   GLuint last_tex_stage;	/**< Number of last enabled texture unit */
+
+   struct ureg half;
+   struct ureg one;
+   struct ureg zero;
+};
+
+
+
+static struct ureg make_ureg(GLuint file, GLuint idx)
+{
+   struct ureg reg;
+   reg.file = file;
+   reg.idx = idx;
+   reg.negatebase = 0;
+   reg.swz = SWIZZLE_NOOP;
+   reg.pad = 0;
+   return reg;
+}
+
+static struct ureg swizzle( struct ureg reg, int x, int y, int z, int w )
+{
+   reg.swz = MAKE_SWIZZLE4(GET_SWZ(reg.swz, x),
+			   GET_SWZ(reg.swz, y),
+			   GET_SWZ(reg.swz, z),
+			   GET_SWZ(reg.swz, w));
+
+   return reg;
+}
+
+static struct ureg swizzle1( struct ureg reg, int x )
+{
+   return swizzle(reg, x, x, x, x);
+}
+
+static struct ureg negate( struct ureg reg )
+{
+   reg.negatebase ^= 1;
+   return reg;
+}
+
+static GLboolean is_undef( struct ureg reg )
+{
+   return reg.file == PROGRAM_UNDEFINED;
+}
+
+
+static struct ureg get_temp( struct texenv_fragment_program *p )
+{
+   GLint bit;
+   
+   /* First try and reuse temps which have been used already:
+    */
+   bit = _mesa_ffs( ~p->temp_in_use & p->alu_temps );
+
+   /* Then any unused temporary:
+    */
+   if (!bit)
+      bit = _mesa_ffs( ~p->temp_in_use );
+
+   if (!bit) {
+      _mesa_problem(NULL, "%s: out of temporaries\n", __FILE__);
+      exit(1);
+   }
+
+   if ((GLuint) bit > p->program->Base.NumTemporaries)
+      p->program->Base.NumTemporaries = bit;
+
+   p->temp_in_use |= 1<<(bit-1);
+   return make_ureg(PROGRAM_TEMPORARY, (bit-1));
+}
+
+static struct ureg get_tex_temp( struct texenv_fragment_program *p )
+{
+   int bit;
+   
+   /* First try to find available temp not previously used (to avoid
+    * starting a new texture indirection).  According to the spec, the
+    * ~p->temps_output isn't necessary, but will keep it there for
+    * now:
+    */
+   bit = _mesa_ffs( ~p->temp_in_use & ~p->alu_temps & ~p->temps_output );
+
+   /* Then any unused temporary:
+    */
+   if (!bit) 
+      bit = _mesa_ffs( ~p->temp_in_use );
+
+   if (!bit) {
+      _mesa_problem(NULL, "%s: out of temporaries\n", __FILE__);
+      exit(1);
+   }
+
+   if ((GLuint) bit > p->program->Base.NumTemporaries)
+      p->program->Base.NumTemporaries = bit;
+
+   p->temp_in_use |= 1<<(bit-1);
+   return make_ureg(PROGRAM_TEMPORARY, (bit-1));
+}
+
+
+/** Mark a temp reg as being no longer allocatable. */
+static void reserve_temp( struct texenv_fragment_program *p, struct ureg r )
+{
+   if (r.file == PROGRAM_TEMPORARY)
+      p->temps_output |= (1 << r.idx);
+}
+
+
+static void release_temps(struct gl_context *ctx, struct texenv_fragment_program *p )
+{
+   GLuint max_temp = ctx->Const.FragmentProgram.MaxTemps;
+
+   /* KW: To support tex_env_crossbar, don't release the registers in
+    * temps_output.
+    */
+   if (max_temp >= sizeof(int) * 8)
+      p->temp_in_use = p->temps_output;
+   else
+      p->temp_in_use = ~((1<<max_temp)-1) | p->temps_output;
+}
+
+
+static struct ureg register_param5( struct texenv_fragment_program *p, 
+				    GLint s0,
+				    GLint s1,
+				    GLint s2,
+				    GLint s3,
+				    GLint s4)
+{
+   int tokens[STATE_LENGTH];
+   GLuint idx;
+   tokens[0] = s0;
+   tokens[1] = s1;
+   tokens[2] = s2;
+   tokens[3] = s3;
+   tokens[4] = s4;
+   idx = _mesa_add_state_reference(p->program->Base.Parameters,
+				   (gl_state_index *)tokens);
+   return make_ureg(PROGRAM_STATE_VAR, idx);
+}
+
+
+#define register_param1(p,s0)          register_param5(p,s0,0,0,0,0)
+#define register_param2(p,s0,s1)       register_param5(p,s0,s1,0,0,0)
+#define register_param3(p,s0,s1,s2)    register_param5(p,s0,s1,s2,0,0)
+#define register_param4(p,s0,s1,s2,s3) register_param5(p,s0,s1,s2,s3,0)
+
+static GLuint frag_to_vert_attrib( GLuint attrib )
+{
+   switch (attrib) {
+   case FRAG_ATTRIB_COL0: return VERT_ATTRIB_COLOR0;
+   case FRAG_ATTRIB_COL1: return VERT_ATTRIB_COLOR1;
+   default:
+      assert(attrib >= FRAG_ATTRIB_TEX0);
+      assert(attrib <= FRAG_ATTRIB_TEX7);
+      return attrib - FRAG_ATTRIB_TEX0 + VERT_ATTRIB_TEX0;
+   }
+}
+
+
+static struct ureg register_input( struct texenv_fragment_program *p, GLuint input )
+{
+   if (p->state->inputs_available & (1<<input)) {
+      p->program->Base.InputsRead |= (1 << input);
+      return make_ureg(PROGRAM_INPUT, input);
+   }
+   else {
+      GLuint idx = frag_to_vert_attrib( input );
+      return register_param3( p, STATE_INTERNAL, STATE_CURRENT_ATTRIB_MAYBE_VP_CLAMPED, idx );
+   }
+}
+
+
+static void emit_arg( struct prog_src_register *reg,
+		      struct ureg ureg )
+{
+   reg->File = ureg.file;
+   reg->Index = ureg.idx;
+   reg->Swizzle = ureg.swz;
+   reg->Negate = ureg.negatebase ? NEGATE_XYZW : NEGATE_NONE;
+   reg->Abs = GL_FALSE;
+}
+
+static void emit_dst( struct prog_dst_register *dst,
+		      struct ureg ureg, GLuint mask )
+{
+   dst->File = ureg.file;
+   dst->Index = ureg.idx;
+   dst->WriteMask = mask;
+   dst->CondMask = COND_TR;  /* always pass cond test */
+   dst->CondSwizzle = SWIZZLE_NOOP;
+}
+
+static struct prog_instruction *
+emit_op(struct texenv_fragment_program *p,
+	enum prog_opcode op,
+	struct ureg dest,
+	GLuint mask,
+	GLboolean saturate,
+	struct ureg src0,
+	struct ureg src1,
+	struct ureg src2 )
+{
+   const GLuint nr = p->program->Base.NumInstructions++;
+   struct prog_instruction *inst = &p->program->Base.Instructions[nr];
+
+   assert(nr < MAX_INSTRUCTIONS);
+
+   _mesa_init_instructions(inst, 1);
+   inst->Opcode = op;
+   
+   emit_arg( &inst->SrcReg[0], src0 );
+   emit_arg( &inst->SrcReg[1], src1 );
+   emit_arg( &inst->SrcReg[2], src2 );
+   
+   inst->SaturateMode = saturate ? SATURATE_ZERO_ONE : SATURATE_OFF;
+
+   emit_dst( &inst->DstReg, dest, mask );
+
+#if 0
+   /* Accounting for indirection tracking:
+    */
+   if (dest.file == PROGRAM_TEMPORARY)
+      p->temps_output |= 1 << dest.idx;
+#endif
+
+   return inst;
+}
+   
+
+static struct ureg emit_arith( struct texenv_fragment_program *p,
+			       enum prog_opcode op,
+			       struct ureg dest,
+			       GLuint mask,
+			       GLboolean saturate,
+			       struct ureg src0,
+			       struct ureg src1,
+			       struct ureg src2 )
+{
+   emit_op(p, op, dest, mask, saturate, src0, src1, src2);
+   
+   /* Accounting for indirection tracking:
+    */
+   if (src0.file == PROGRAM_TEMPORARY)
+      p->alu_temps |= 1 << src0.idx;
+
+   if (!is_undef(src1) && src1.file == PROGRAM_TEMPORARY)
+      p->alu_temps |= 1 << src1.idx;
+
+   if (!is_undef(src2) && src2.file == PROGRAM_TEMPORARY)
+      p->alu_temps |= 1 << src2.idx;
+
+   if (dest.file == PROGRAM_TEMPORARY)
+      p->alu_temps |= 1 << dest.idx;
+       
+   p->program->Base.NumAluInstructions++;
+   return dest;
+}
+
+static struct ureg emit_texld( struct texenv_fragment_program *p,
+			       enum prog_opcode op,
+			       struct ureg dest,
+			       GLuint destmask,
+			       GLuint tex_unit,
+			       GLuint tex_idx,
+                               GLuint tex_shadow,
+			       struct ureg coord )
+{
+   struct prog_instruction *inst = emit_op( p, op, 
+					  dest, destmask, 
+					  GL_FALSE,	/* don't saturate? */
+					  coord, 	/* arg 0? */
+					  undef,
+					  undef);
+   
+   inst->TexSrcTarget = tex_idx;
+   inst->TexSrcUnit = tex_unit;
+   inst->TexShadow = tex_shadow;
+
+   p->program->Base.NumTexInstructions++;
+
+   /* Accounting for indirection tracking:
+    */
+   reserve_temp(p, dest);
+
+#if 0
+   /* Is this a texture indirection?
+    */
+   if ((coord.file == PROGRAM_TEMPORARY &&
+	(p->temps_output & (1<<coord.idx))) ||
+       (dest.file == PROGRAM_TEMPORARY &&
+	(p->alu_temps & (1<<dest.idx)))) {
+      p->program->Base.NumTexIndirections++;
+      p->temps_output = 1<<coord.idx;
+      p->alu_temps = 0;
+      assert(0);		/* KW: texture env crossbar */
+   }
+#endif
+
+   return dest;
+}
+
+
+static struct ureg register_const4f( struct texenv_fragment_program *p, 
+				     GLfloat s0,
+				     GLfloat s1,
+				     GLfloat s2,
+				     GLfloat s3)
+{
+   GLfloat values[4];
+   GLuint idx, swizzle;
+   struct ureg r;
+   values[0] = s0;
+   values[1] = s1;
+   values[2] = s2;
+   values[3] = s3;
+   idx = _mesa_add_unnamed_constant( p->program->Base.Parameters, values, 4,
+                                     &swizzle );
+   r = make_ureg(PROGRAM_CONSTANT, idx);
+   r.swz = swizzle;
+   return r;
+}
+
+#define register_scalar_const(p, s0)    register_const4f(p, s0, s0, s0, s0)
+#define register_const1f(p, s0)         register_const4f(p, s0, 0, 0, 1)
+#define register_const2f(p, s0, s1)     register_const4f(p, s0, s1, 0, 1)
+#define register_const3f(p, s0, s1, s2) register_const4f(p, s0, s1, s2, 1)
+
+
+static struct ureg get_one( struct texenv_fragment_program *p )
+{
+   if (is_undef(p->one)) 
+      p->one = register_scalar_const(p, 1.0);
+   return p->one;
+}
+
+static struct ureg get_half( struct texenv_fragment_program *p )
+{
+   if (is_undef(p->half)) 
+      p->half = register_scalar_const(p, 0.5);
+   return p->half;
+}
+
+static struct ureg get_zero( struct texenv_fragment_program *p )
+{
+   if (is_undef(p->zero)) 
+      p->zero = register_scalar_const(p, 0.0);
+   return p->zero;
+}
+
+
+static void program_error( struct texenv_fragment_program *p, const char *msg )
+{
+   _mesa_problem(NULL, "%s", msg);
+   p->error = 1;
+}
+
+static struct ureg get_source( struct texenv_fragment_program *p, 
+			       GLuint src, GLuint unit )
+{
+   switch (src) {
+   case SRC_TEXTURE: 
+      assert(!is_undef(p->src_texture[unit]));
+      return p->src_texture[unit];
+
+   case SRC_TEXTURE0:
+   case SRC_TEXTURE1:
+   case SRC_TEXTURE2:
+   case SRC_TEXTURE3:
+   case SRC_TEXTURE4:
+   case SRC_TEXTURE5:
+   case SRC_TEXTURE6:
+   case SRC_TEXTURE7: 
+      assert(!is_undef(p->src_texture[src - SRC_TEXTURE0]));
+      return p->src_texture[src - SRC_TEXTURE0];
+
+   case SRC_CONSTANT:
+      return register_param2(p, STATE_TEXENV_COLOR, unit);
+
+   case SRC_PRIMARY_COLOR:
+      return register_input(p, FRAG_ATTRIB_COL0);
+
+   case SRC_ZERO:
+      return get_zero(p);
+
+   case SRC_PREVIOUS:
+      if (is_undef(p->src_previous))
+	 return register_input(p, FRAG_ATTRIB_COL0);
+      else
+	 return p->src_previous;
+
+   default:
+      assert(0);
+      return undef;
+   }
+}
+
+static struct ureg emit_combine_source( struct texenv_fragment_program *p, 
+					GLuint mask,
+					GLuint unit,
+					GLuint source, 
+					GLuint operand )
+{
+   struct ureg arg, src, one;
+
+   src = get_source(p, source, unit);
+
+   switch (operand) {
+   case OPR_ONE_MINUS_SRC_COLOR: 
+      /* Get unused tmp,
+       * Emit tmp = 1.0 - arg.xyzw
+       */
+      arg = get_temp( p );
+      one = get_one( p );
+      return emit_arith( p, OPCODE_SUB, arg, mask, 0, one, src, undef);
+
+   case OPR_SRC_ALPHA: 
+      if (mask == WRITEMASK_W)
+	 return src;
+      else
+	 return swizzle1( src, SWIZZLE_W );
+   case OPR_ONE_MINUS_SRC_ALPHA: 
+      /* Get unused tmp,
+       * Emit tmp = 1.0 - arg.wwww
+       */
+      arg = get_temp(p);
+      one = get_one(p);
+      return emit_arith(p, OPCODE_SUB, arg, mask, 0,
+			one, swizzle1(src, SWIZZLE_W), undef);
+   case OPR_ZERO:
+      return get_zero(p);
+   case OPR_ONE:
+      return get_one(p);
+   case OPR_SRC_COLOR: 
+      return src;
+   default:
+      assert(0);
+      return src;
+   }
+}
+
+/**
+ * Check if the RGB and Alpha sources and operands match for the given
+ * texture unit's combinder state.  When the RGB and A sources and
+ * operands match, we can emit fewer instructions.
+ */
+static GLboolean args_match( const struct state_key *key, GLuint unit )
+{
+   GLuint i, numArgs = key->unit[unit].NumArgsRGB;
+
+   for (i = 0; i < numArgs; i++) {
+      if (key->unit[unit].OptA[i].Source != key->unit[unit].OptRGB[i].Source) 
+	 return GL_FALSE;
+
+      switch (key->unit[unit].OptA[i].Operand) {
+      case OPR_SRC_ALPHA: 
+	 switch (key->unit[unit].OptRGB[i].Operand) {
+	 case OPR_SRC_COLOR: 
+	 case OPR_SRC_ALPHA: 
+	    break;
+	 default:
+	    return GL_FALSE;
+	 }
+	 break;
+      case OPR_ONE_MINUS_SRC_ALPHA: 
+	 switch (key->unit[unit].OptRGB[i].Operand) {
+	 case OPR_ONE_MINUS_SRC_COLOR: 
+	 case OPR_ONE_MINUS_SRC_ALPHA: 
+	    break;
+	 default:
+	    return GL_FALSE;
+	 }
+	 break;
+      default: 
+	 return GL_FALSE;	/* impossible */
+      }
+   }
+
+   return GL_TRUE;
+}
+
+static struct ureg emit_combine( struct texenv_fragment_program *p,
+				 struct ureg dest,
+				 GLuint mask,
+				 GLboolean saturate,
+				 GLuint unit,
+				 GLuint nr,
+				 GLuint mode,
+				 const struct mode_opt *opt)
+{
+   struct ureg src[MAX_COMBINER_TERMS];
+   struct ureg tmp, half;
+   GLuint i;
+
+   assert(nr <= MAX_COMBINER_TERMS);
+
+   for (i = 0; i < nr; i++)
+      src[i] = emit_combine_source( p, mask, unit, opt[i].Source, opt[i].Operand );
+
+   switch (mode) {
+   case MODE_REPLACE: 
+      if (mask == WRITEMASK_XYZW && !saturate)
+	 return src[0];
+      else
+	 return emit_arith( p, OPCODE_MOV, dest, mask, saturate, src[0], undef, undef );
+   case MODE_MODULATE: 
+      return emit_arith( p, OPCODE_MUL, dest, mask, saturate,
+			 src[0], src[1], undef );
+   case MODE_ADD: 
+      return emit_arith( p, OPCODE_ADD, dest, mask, saturate, 
+			 src[0], src[1], undef );
+   case MODE_ADD_SIGNED:
+      /* tmp = arg0 + arg1
+       * result = tmp - .5
+       */
+      half = get_half(p);
+      tmp = get_temp( p );
+      emit_arith( p, OPCODE_ADD, tmp, mask, 0, src[0], src[1], undef );
+      emit_arith( p, OPCODE_SUB, dest, mask, saturate, tmp, half, undef );
+      return dest;
+   case MODE_INTERPOLATE: 
+      /* Arg0 * (Arg2) + Arg1 * (1-Arg2) -- note arguments are reordered:
+       */
+      return emit_arith( p, OPCODE_LRP, dest, mask, saturate, src[2], src[0], src[1] );
+
+   case MODE_SUBTRACT: 
+      return emit_arith( p, OPCODE_SUB, dest, mask, saturate, src[0], src[1], undef );
+
+   case MODE_DOT3_RGBA:
+   case MODE_DOT3_RGBA_EXT: 
+   case MODE_DOT3_RGB_EXT:
+   case MODE_DOT3_RGB: {
+      struct ureg tmp0 = get_temp( p );
+      struct ureg tmp1 = get_temp( p );
+      struct ureg neg1 = register_scalar_const(p, -1);
+      struct ureg two  = register_scalar_const(p, 2);
+
+      /* tmp0 = 2*src0 - 1
+       * tmp1 = 2*src1 - 1
+       *
+       * dst = tmp0 dot3 tmp1 
+       */
+      emit_arith( p, OPCODE_MAD, tmp0, WRITEMASK_XYZW, 0, 
+		  two, src[0], neg1);
+
+      if (memcmp(&src[0], &src[1], sizeof(struct ureg)) == 0)
+	 tmp1 = tmp0;
+      else
+	 emit_arith( p, OPCODE_MAD, tmp1, WRITEMASK_XYZW, 0, 
+		     two, src[1], neg1);
+      emit_arith( p, OPCODE_DP3, dest, mask, saturate, tmp0, tmp1, undef);
+      return dest;
+   }
+   case MODE_MODULATE_ADD_ATI:
+      /* Arg0 * Arg2 + Arg1 */
+      return emit_arith( p, OPCODE_MAD, dest, mask, saturate,
+			 src[0], src[2], src[1] );
+   case MODE_MODULATE_SIGNED_ADD_ATI: {
+      /* Arg0 * Arg2 + Arg1 - 0.5 */
+      struct ureg tmp0 = get_temp(p);
+      half = get_half(p);
+      emit_arith( p, OPCODE_MAD, tmp0, mask, 0, src[0], src[2], src[1] );
+      emit_arith( p, OPCODE_SUB, dest, mask, saturate, tmp0, half, undef );
+      return dest;
+   }
+   case MODE_MODULATE_SUBTRACT_ATI:
+      /* Arg0 * Arg2 - Arg1 */
+      emit_arith( p, OPCODE_MAD, dest, mask, 0, src[0], src[2], negate(src[1]) );
+      return dest;
+   case MODE_ADD_PRODUCTS:
+      /* Arg0 * Arg1 + Arg2 * Arg3 */
+      {
+         struct ureg tmp0 = get_temp(p);
+         emit_arith( p, OPCODE_MUL, tmp0, mask, 0, src[0], src[1], undef );
+         emit_arith( p, OPCODE_MAD, dest, mask, saturate, src[2], src[3], tmp0 );
+      }
+      return dest;
+   case MODE_ADD_PRODUCTS_SIGNED:
+      /* Arg0 * Arg1 + Arg2 * Arg3 - 0.5 */
+      {
+         struct ureg tmp0 = get_temp(p);
+         half = get_half(p);
+         emit_arith( p, OPCODE_MUL, tmp0, mask, 0, src[0], src[1], undef );
+         emit_arith( p, OPCODE_MAD, tmp0, mask, 0, src[2], src[3], tmp0 );
+         emit_arith( p, OPCODE_SUB, dest, mask, saturate, tmp0, half, undef );
+      }
+      return dest;
+   case MODE_BUMP_ENVMAP_ATI:
+      /* special - not handled here */
+      assert(0);
+      return src[0];
+   default: 
+      assert(0);
+      return src[0];
+   }
+}
+
+
+/**
+ * Generate instructions for one texture unit's env/combiner mode.
+ */
+static struct ureg
+emit_texenv(struct texenv_fragment_program *p, GLuint unit)
+{
+   const struct state_key *key = p->state;
+   GLboolean rgb_saturate, alpha_saturate;
+   GLuint rgb_shift, alpha_shift;
+   struct ureg out, dest;
+
+   if (!key->unit[unit].enabled) {
+      return get_source(p, SRC_PREVIOUS, 0);
+   }
+   if (key->unit[unit].ModeRGB == MODE_BUMP_ENVMAP_ATI) {
+      /* this isn't really a env stage delivering a color and handled elsewhere */
+      return get_source(p, SRC_PREVIOUS, 0);
+   }
+   
+   switch (key->unit[unit].ModeRGB) {
+   case MODE_DOT3_RGB_EXT:
+      alpha_shift = key->unit[unit].ScaleShiftA;
+      rgb_shift = 0;
+      break;
+   case MODE_DOT3_RGBA_EXT:
+      alpha_shift = 0;
+      rgb_shift = 0;
+      break;
+   default:
+      rgb_shift = key->unit[unit].ScaleShiftRGB;
+      alpha_shift = key->unit[unit].ScaleShiftA;
+      break;
+   }
+   
+   /* If we'll do rgb/alpha shifting don't saturate in emit_combine().
+    * We don't want to clamp twice.
+    */
+   if (rgb_shift)
+      rgb_saturate = GL_FALSE;  /* saturate after rgb shift */
+   else if (need_saturate(key->unit[unit].ModeRGB))
+      rgb_saturate = GL_TRUE;
+   else
+      rgb_saturate = GL_FALSE;
+
+   if (alpha_shift)
+      alpha_saturate = GL_FALSE;  /* saturate after alpha shift */
+   else if (need_saturate(key->unit[unit].ModeA))
+      alpha_saturate = GL_TRUE;
+   else
+      alpha_saturate = GL_FALSE;
+
+   /* If this is the very last calculation (and various other conditions
+    * are met), emit directly to the color output register.  Otherwise,
+    * emit to a temporary register.
+    */
+   if (key->separate_specular ||
+       unit != p->last_tex_stage ||
+       alpha_shift ||
+       key->num_draw_buffers != 1 ||
+       rgb_shift)
+      dest = get_temp( p );
+   else
+      dest = make_ureg(PROGRAM_OUTPUT, FRAG_RESULT_COLOR);
+
+   /* Emit the RGB and A combine ops
+    */
+   if (key->unit[unit].ModeRGB == key->unit[unit].ModeA &&
+       args_match(key, unit)) {
+      out = emit_combine( p, dest, WRITEMASK_XYZW, rgb_saturate,
+			  unit,
+			  key->unit[unit].NumArgsRGB,
+			  key->unit[unit].ModeRGB,
+			  key->unit[unit].OptRGB);
+   }
+   else if (key->unit[unit].ModeRGB == MODE_DOT3_RGBA_EXT ||
+	    key->unit[unit].ModeRGB == MODE_DOT3_RGBA) {
+      out = emit_combine( p, dest, WRITEMASK_XYZW, rgb_saturate,
+			  unit,
+			  key->unit[unit].NumArgsRGB,
+			  key->unit[unit].ModeRGB,
+			  key->unit[unit].OptRGB);
+   }
+   else {
+      /* Need to do something to stop from re-emitting identical
+       * argument calculations here:
+       */
+      out = emit_combine( p, dest, WRITEMASK_XYZ, rgb_saturate,
+			  unit,
+			  key->unit[unit].NumArgsRGB,
+			  key->unit[unit].ModeRGB,
+			  key->unit[unit].OptRGB);
+      out = emit_combine( p, dest, WRITEMASK_W, alpha_saturate,
+			  unit,
+			  key->unit[unit].NumArgsA,
+			  key->unit[unit].ModeA,
+			  key->unit[unit].OptA);
+   }
+
+   /* Deal with the final shift:
+    */
+   if (alpha_shift || rgb_shift) {
+      struct ureg shift;
+      GLboolean saturate = GL_TRUE;  /* always saturate at this point */
+
+      if (rgb_shift == alpha_shift) {
+	 shift = register_scalar_const(p, (GLfloat)(1<<rgb_shift));
+      }
+      else {
+	 shift = register_const4f(p, 
+				  (GLfloat)(1<<rgb_shift),
+				  (GLfloat)(1<<rgb_shift),
+				  (GLfloat)(1<<rgb_shift),
+				  (GLfloat)(1<<alpha_shift));
+      }
+      return emit_arith( p, OPCODE_MUL, dest, WRITEMASK_XYZW, 
+			 saturate, out, shift, undef );
+   }
+   else
+      return out;
+}
+
+
+/**
+ * Generate instruction for getting a texture source term.
+ */
+static void load_texture( struct texenv_fragment_program *p, GLuint unit )
+{
+   if (is_undef(p->src_texture[unit])) {
+      const GLuint texTarget = p->state->unit[unit].source_index;
+      struct ureg texcoord;
+      struct ureg tmp = get_tex_temp( p );
+
+      if (is_undef(p->texcoord_tex[unit])) {
+         texcoord = register_input(p, FRAG_ATTRIB_TEX0+unit);
+      }
+      else {
+         /* might want to reuse this reg for tex output actually */
+         texcoord = p->texcoord_tex[unit];
+      }
+
+      /* TODO: Use D0_MASK_XY where possible.
+       */
+      if (p->state->unit[unit].enabled) {
+         GLboolean shadow = GL_FALSE;
+
+	 if (p->state->unit[unit].shadow) {
+	    p->program->Base.ShadowSamplers |= 1 << unit;
+            shadow = GL_TRUE;
+         }
+
+	 p->src_texture[unit] = emit_texld( p, OPCODE_TXP,
+					    tmp, WRITEMASK_XYZW, 
+					    unit, texTarget, shadow,
+                                            texcoord );
+
+         p->program->Base.SamplersUsed |= (1 << unit);
+         /* This identity mapping should already be in place
+          * (see _mesa_init_program_struct()) but let's be safe.
+          */
+         p->program->Base.SamplerUnits[unit] = unit;
+      }
+      else
+	 p->src_texture[unit] = get_zero(p);
+
+      if (p->state->unit[unit].texture_cyl_wrap) {
+         /* set flag which is checked by Mesa->Gallium program translation */
+         p->program->Base.InputFlags[0] |= PROG_PARAM_BIT_CYL_WRAP;
+      }
+
+   }
+}
+
+static GLboolean load_texenv_source( struct texenv_fragment_program *p, 
+				     GLuint src, GLuint unit )
+{
+   switch (src) {
+   case SRC_TEXTURE:
+      load_texture(p, unit);
+      break;
+
+   case SRC_TEXTURE0:
+   case SRC_TEXTURE1:
+   case SRC_TEXTURE2:
+   case SRC_TEXTURE3:
+   case SRC_TEXTURE4:
+   case SRC_TEXTURE5:
+   case SRC_TEXTURE6:
+   case SRC_TEXTURE7:       
+      load_texture(p, src - SRC_TEXTURE0);
+      break;
+      
+   default:
+      /* not a texture src - do nothing */
+      break;
+   }
+ 
+   return GL_TRUE;
+}
+
+
+/**
+ * Generate instructions for loading all texture source terms.
+ */
+static GLboolean
+load_texunit_sources( struct texenv_fragment_program *p, GLuint unit )
+{
+   const struct state_key *key = p->state;
+   GLuint i;
+
+   for (i = 0; i < key->unit[unit].NumArgsRGB; i++) {
+      load_texenv_source( p, key->unit[unit].OptRGB[i].Source, unit );
+   }
+
+   for (i = 0; i < key->unit[unit].NumArgsA; i++) {
+      load_texenv_source( p, key->unit[unit].OptA[i].Source, unit );
+   }
+
+   return GL_TRUE;
+}
+
+/**
+ * Generate instructions for loading bump map textures.
+ */
+static GLboolean
+load_texunit_bumpmap( struct texenv_fragment_program *p, GLuint unit )
+{
+   const struct state_key *key = p->state;
+   GLuint bumpedUnitNr = key->unit[unit].OptRGB[1].Source - SRC_TEXTURE0;
+   struct ureg texcDst, bumpMapRes;
+   struct ureg constdudvcolor = register_const4f(p, 0.0, 0.0, 0.0, 1.0);
+   struct ureg texcSrc = register_input(p, FRAG_ATTRIB_TEX0 + bumpedUnitNr);
+   struct ureg rotMat0 = register_param3( p, STATE_INTERNAL, STATE_ROT_MATRIX_0, unit );
+   struct ureg rotMat1 = register_param3( p, STATE_INTERNAL, STATE_ROT_MATRIX_1, unit );
+
+   load_texenv_source( p, unit + SRC_TEXTURE0, unit );
+
+   bumpMapRes = get_source(p, key->unit[unit].OptRGB[0].Source, unit);
+   texcDst = get_tex_temp( p );
+   p->texcoord_tex[bumpedUnitNr] = texcDst;
+
+   /* Apply rot matrix and add coords to be available in next phase.
+    * dest = (Arg0.xxxx * rotMat0 + Arg1) + (Arg0.yyyy * rotMat1)
+    * note only 2 coords are affected the rest are left unchanged (mul by 0)
+    */
+   emit_arith( p, OPCODE_MAD, texcDst, WRITEMASK_XYZW, 0,
+               swizzle1(bumpMapRes, SWIZZLE_X), rotMat0, texcSrc );
+   emit_arith( p, OPCODE_MAD, texcDst, WRITEMASK_XYZW, 0,
+               swizzle1(bumpMapRes, SWIZZLE_Y), rotMat1, texcDst );
+
+   /* Move 0,0,0,1 into bumpmap src if someone (crossbar) is foolish
+    * enough to access this later, should optimize away.
+    */
+   emit_arith( p, OPCODE_MOV, bumpMapRes, WRITEMASK_XYZW, 0,
+               constdudvcolor, undef, undef );
+
+   return GL_TRUE;
+}
+
+/**
+ * Generate a new fragment program which implements the context's
+ * current texture env/combine mode.
+ */
+static void
+create_new_program(struct gl_context *ctx, struct state_key *key,
+                   struct gl_fragment_program *program)
+{
+   struct prog_instruction instBuffer[MAX_INSTRUCTIONS];
+   struct texenv_fragment_program p;
+   GLuint unit;
+   struct ureg cf, out;
+   int i;
+
+   memset(&p, 0, sizeof(p));
+   p.state = key;
+   p.program = program;
+
+   /* During code generation, use locally-allocated instruction buffer,
+    * then alloc dynamic storage below.
+    */
+   p.program->Base.Instructions = instBuffer;
+   p.program->Base.Target = GL_FRAGMENT_PROGRAM_ARB;
+   p.program->Base.String = NULL;
+   p.program->Base.NumTexIndirections = 1; /* is this right? */
+   p.program->Base.NumTexInstructions = 0;
+   p.program->Base.NumAluInstructions = 0;
+   p.program->Base.NumInstructions = 0;
+   p.program->Base.NumTemporaries = 0;
+   p.program->Base.NumParameters = 0;
+   p.program->Base.NumAttributes = 0;
+   p.program->Base.NumAddressRegs = 0;
+   p.program->Base.Parameters = _mesa_new_parameter_list();
+   p.program->Base.InputsRead = 0x0;
+
+   if (key->num_draw_buffers == 1)
+      p.program->Base.OutputsWritten = 1 << FRAG_RESULT_COLOR;
+   else {
+      for (i = 0; i < key->num_draw_buffers; i++)
+	 p.program->Base.OutputsWritten |= (1 << (FRAG_RESULT_DATA0 + i));
+   }
+
+   for (unit = 0; unit < ctx->Const.MaxTextureUnits; unit++) {
+      p.src_texture[unit] = undef;
+      p.texcoord_tex[unit] = undef;
+   }
+
+   p.src_previous = undef;
+   p.half = undef;
+   p.zero = undef;
+   p.one = undef;
+
+   p.last_tex_stage = 0;
+   release_temps(ctx, &p);
+
+   if (key->enabled_units && key->num_draw_buffers) {
+      GLboolean needbumpstage = GL_FALSE;
+
+      /* Zeroth pass - bump map textures first */
+      for (unit = 0; unit < key->nr_enabled_units; unit++)
+	 if (key->unit[unit].enabled &&
+             key->unit[unit].ModeRGB == MODE_BUMP_ENVMAP_ATI) {
+	    needbumpstage = GL_TRUE;
+	    load_texunit_bumpmap( &p, unit );
+	 }
+      if (needbumpstage)
+	 p.program->Base.NumTexIndirections++;
+
+      /* First pass - to support texture_env_crossbar, first identify
+       * all referenced texture sources and emit texld instructions
+       * for each:
+       */
+      for (unit = 0; unit < key->nr_enabled_units; unit++)
+	 if (key->unit[unit].enabled) {
+	    load_texunit_sources( &p, unit );
+	    p.last_tex_stage = unit;
+	 }
+
+      /* Second pass - emit combine instructions to build final color:
+       */
+      for (unit = 0; unit < key->nr_enabled_units; unit++)
+	 if (key->unit[unit].enabled) {
+	    p.src_previous = emit_texenv( &p, unit );
+            reserve_temp(&p, p.src_previous); /* don't re-use this temp reg */
+	    release_temps(ctx, &p);	/* release all temps */
+	 }
+   }
+
+   cf = get_source( &p, SRC_PREVIOUS, 0 );
+
+   for (i = 0; i < key->num_draw_buffers; i++) {
+      if (key->num_draw_buffers == 1)
+	 out = make_ureg( PROGRAM_OUTPUT, FRAG_RESULT_COLOR );
+      else {
+	 out = make_ureg( PROGRAM_OUTPUT, FRAG_RESULT_DATA0 + i );
+      }
+
+      if (key->separate_specular) {
+	 /* Emit specular add.
+	  */
+	 struct ureg s = register_input(&p, FRAG_ATTRIB_COL1);
+	 emit_arith( &p, OPCODE_ADD, out, WRITEMASK_XYZ, 0, cf, s, undef );
+	 emit_arith( &p, OPCODE_MOV, out, WRITEMASK_W, 0, cf, undef, undef );
+      }
+      else if (memcmp(&cf, &out, sizeof(cf)) != 0) {
+	 /* Will wind up in here if no texture enabled or a couple of
+	  * other scenarios (GL_REPLACE for instance).
+	  */
+	 emit_arith( &p, OPCODE_MOV, out, WRITEMASK_XYZW, 0, cf, undef, undef );
+      }
+   }
+   /* Finish up:
+    */
+   emit_arith( &p, OPCODE_END, undef, WRITEMASK_XYZW, 0, undef, undef, undef);
+
+   if (key->fog_enabled) {
+      /* Pull fog mode from struct gl_context, the value in the state key is
+       * a reduced value and not what is expected in FogOption
+       */
+      p.program->FogOption = ctx->Fog.Mode;
+      p.program->Base.InputsRead |= FRAG_BIT_FOGC;
+   }
+   else {
+      p.program->FogOption = GL_NONE;
+   }
+
+   if (p.program->Base.NumTexIndirections > ctx->Const.FragmentProgram.MaxTexIndirections) 
+      program_error(&p, "Exceeded max nr indirect texture lookups");
+
+   if (p.program->Base.NumTexInstructions > ctx->Const.FragmentProgram.MaxTexInstructions)
+      program_error(&p, "Exceeded max TEX instructions");
+
+   if (p.program->Base.NumAluInstructions > ctx->Const.FragmentProgram.MaxAluInstructions)
+      program_error(&p, "Exceeded max ALU instructions");
+
+   ASSERT(p.program->Base.NumInstructions <= MAX_INSTRUCTIONS);
+
+   /* Allocate final instruction array */
+   p.program->Base.Instructions
+      = _mesa_alloc_instructions(p.program->Base.NumInstructions);
+   if (!p.program->Base.Instructions) {
+      _mesa_error(ctx, GL_OUT_OF_MEMORY,
+                  "generating tex env program");
+      return;
+   }
+   _mesa_copy_instructions(p.program->Base.Instructions, instBuffer,
+                           p.program->Base.NumInstructions);
+
+   if (key->num_draw_buffers && p.program->FogOption) {
+      _mesa_append_fog_code(ctx, p.program, GL_FALSE);
+      p.program->FogOption = GL_NONE;
+   }
+
+
+   /* Notify driver the fragment program has (actually) changed.
+    */
+   if (ctx->Driver.ProgramStringNotify) {
+      GLboolean ok = ctx->Driver.ProgramStringNotify(ctx,
+                                                     GL_FRAGMENT_PROGRAM_ARB, 
+                                                     &p.program->Base);
+      /* Driver should be able to handle any texenv programs as long as
+       * the driver correctly reported max number of texture units correctly,
+       * etc.
+       */
+      ASSERT(ok);
+      (void) ok; /* silence unused var warning */
+   }
+
+   if (DISASSEM) {
+      _mesa_print_program(&p.program->Base);
+      printf("\n");
+   }
+}
+
+extern "C" {
+
+/**
+ * Return a fragment program which implements the current
+ * fixed-function texture, fog and color-sum operations.
+ */
+struct gl_fragment_program *
+_mesa_get_fixed_func_fragment_program(struct gl_context *ctx)
+{
+   struct gl_fragment_program *prog;
+   struct state_key key;
+   GLuint keySize;
+	
+   keySize = make_state_key(ctx, &key);
+      
+   prog = (struct gl_fragment_program *)
+      _mesa_search_program_cache(ctx->FragmentProgram.Cache,
+                                 &key, keySize);
+
+   if (!prog) {
+      prog = (struct gl_fragment_program *) 
+         ctx->Driver.NewProgram(ctx, GL_FRAGMENT_PROGRAM_ARB, 0);
+
+      create_new_program(ctx, &key, prog);
+
+      _mesa_program_cache_insert(ctx, ctx->FragmentProgram.Cache,
+                                 &key, keySize, &prog->Base);
+   }
+
+   return prog;
+}
+
+}
diff --git a/mesalib/src/mesa/main/fog.c b/mesalib/src/mesa/main/fog.c
index 70603576c..88aa31a7f 100644
--- a/mesalib/src/mesa/main/fog.c
+++ b/mesalib/src/mesa/main/fog.c
@@ -1,199 +1,204 @@
-/*
- * Mesa 3-D graphics library
- * Version:  5.1
- *
- * Copyright (C) 1999-2003  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"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-
-#include "glheader.h"
-#include "colormac.h"
-#include "context.h"
-#include "fog.h"
-#include "macros.h"
-#include "mtypes.h"
-
-
-
-void GLAPIENTRY
-_mesa_Fogf(GLenum pname, GLfloat param)
-{
-   GLfloat fparam[4];
-   fparam[0] = param;
-   fparam[1] = fparam[2] = fparam[3] = 0.0F;
-   _mesa_Fogfv(pname, fparam);
-}
-
-
-void GLAPIENTRY
-_mesa_Fogi(GLenum pname, GLint param )
-{
-   GLfloat fparam[4];
-   fparam[0] = (GLfloat) param;
-   fparam[1] = fparam[2] = fparam[3] = 0.0F;
-   _mesa_Fogfv(pname, fparam);
-}
-
-
-void GLAPIENTRY
-_mesa_Fogiv(GLenum pname, const GLint *params )
-{
-   GLfloat p[4];
-   switch (pname) {
-      case GL_FOG_MODE:
-      case GL_FOG_DENSITY:
-      case GL_FOG_START:
-      case GL_FOG_END:
-      case GL_FOG_INDEX:
-      case GL_FOG_COORDINATE_SOURCE_EXT:
-	 p[0] = (GLfloat) *params;
-	 break;
-      case GL_FOG_COLOR:
-	 p[0] = INT_TO_FLOAT( params[0] );
-	 p[1] = INT_TO_FLOAT( params[1] );
-	 p[2] = INT_TO_FLOAT( params[2] );
-	 p[3] = INT_TO_FLOAT( params[3] );
-	 break;
-      default:
-         /* Error will be caught later in _mesa_Fogfv */
-         ASSIGN_4V(p, 0.0F, 0.0F, 0.0F, 0.0F);
-   }
-   _mesa_Fogfv(pname, p);
-}
-
-
-/**
- * Update the gl_fog_attrib::_Scale field.
- */
-static void
-update_fog_scale(struct gl_context *ctx)
-{
-   if (ctx->Fog.End == ctx->Fog.Start)
-      ctx->Fog._Scale = 1.0f;
-   else
-      ctx->Fog._Scale = 1.0f / (ctx->Fog.End - ctx->Fog.Start);
-}
-
-
-void GLAPIENTRY
-_mesa_Fogfv( GLenum pname, const GLfloat *params )
-{
-   GET_CURRENT_CONTEXT(ctx);
-   GLenum m;
-   ASSERT_OUTSIDE_BEGIN_END(ctx);
-
-   switch (pname) {
-      case GL_FOG_MODE:
-         m = (GLenum) (GLint) *params;
-	 switch (m) {
-	 case GL_LINEAR:
-	 case GL_EXP:
-	 case GL_EXP2:
-	    break;
-	 default:
-	    _mesa_error( ctx, GL_INVALID_ENUM, "glFog" );
-            return;
-	 }
-	 if (ctx->Fog.Mode == m)
-	    return;
-	 FLUSH_VERTICES(ctx, _NEW_FOG);
-	 ctx->Fog.Mode = m;
-	 break;
-      case GL_FOG_DENSITY:
-	 if (*params<0.0) {
-	    _mesa_error( ctx, GL_INVALID_VALUE, "glFog" );
-            return;
-	 }
-	 if (ctx->Fog.Density == *params)
-	    return;
-	 FLUSH_VERTICES(ctx, _NEW_FOG);
-	 ctx->Fog.Density = *params;
-	 break;
-      case GL_FOG_START:
-         if (ctx->Fog.Start == *params)
-            return;
-         FLUSH_VERTICES(ctx, _NEW_FOG);
-         ctx->Fog.Start = *params;
-         update_fog_scale(ctx);
-         break;
-      case GL_FOG_END:
-         if (ctx->Fog.End == *params)
-            return;
-         FLUSH_VERTICES(ctx, _NEW_FOG);
-         ctx->Fog.End = *params;
-         update_fog_scale(ctx);
-         break;
-      case GL_FOG_INDEX:
- 	 if (ctx->Fog.Index == *params)
-	    return;
-	 FLUSH_VERTICES(ctx, _NEW_FOG);
- 	 ctx->Fog.Index = *params;
-	 break;
-      case GL_FOG_COLOR:
-	 if (TEST_EQ_4V(ctx->Fog.Color, params))
-	    return;
-	 FLUSH_VERTICES(ctx, _NEW_FOG);
-	 ctx->Fog.Color[0] = CLAMP(params[0], 0.0F, 1.0F);
-	 ctx->Fog.Color[1] = CLAMP(params[1], 0.0F, 1.0F);
-	 ctx->Fog.Color[2] = CLAMP(params[2], 0.0F, 1.0F);
-	 ctx->Fog.Color[3] = CLAMP(params[3], 0.0F, 1.0F);
-         break;
-      case GL_FOG_COORDINATE_SOURCE_EXT: {
-	 GLenum p = (GLenum) (GLint) *params;
-         if (!ctx->Extensions.EXT_fog_coord ||
-             (p != GL_FOG_COORDINATE_EXT && p != GL_FRAGMENT_DEPTH_EXT)) {
-	    _mesa_error(ctx, GL_INVALID_ENUM, "glFog");
-	    return;
-	 }
-	 if (ctx->Fog.FogCoordinateSource == p)
-	    return;
-	 FLUSH_VERTICES(ctx, _NEW_FOG);
-	 ctx->Fog.FogCoordinateSource = p;
-	 break;
-      }
-      default:
-         _mesa_error( ctx, GL_INVALID_ENUM, "glFog" );
-         return;
-   }
-
-   if (ctx->Driver.Fogfv) {
-      (*ctx->Driver.Fogfv)( ctx, pname, params );
-   }
-}
-
-
-/**********************************************************************/
-/*****                      Initialization                        *****/
-/**********************************************************************/
-
-void _mesa_init_fog( struct gl_context * ctx )
-{
-   /* Fog group */
-   ctx->Fog.Enabled = GL_FALSE;
-   ctx->Fog.Mode = GL_EXP;
-   ASSIGN_4V( ctx->Fog.Color, 0.0, 0.0, 0.0, 0.0 );
-   ctx->Fog.Index = 0.0;
-   ctx->Fog.Density = 1.0;
-   ctx->Fog.Start = 0.0;
-   ctx->Fog.End = 1.0;
-   ctx->Fog.ColorSumEnabled = GL_FALSE;
-   ctx->Fog.FogCoordinateSource = GL_FRAGMENT_DEPTH_EXT;
-   ctx->Fog._Scale = 1.0f;
-}
+/*
+ * Mesa 3-D graphics library
+ * Version:  5.1
+ *
+ * Copyright (C) 1999-2003  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"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+
+#include "glheader.h"
+#include "colormac.h"
+#include "context.h"
+#include "fog.h"
+#include "macros.h"
+#include "mtypes.h"
+
+
+
+void GLAPIENTRY
+_mesa_Fogf(GLenum pname, GLfloat param)
+{
+   GLfloat fparam[4];
+   fparam[0] = param;
+   fparam[1] = fparam[2] = fparam[3] = 0.0F;
+   _mesa_Fogfv(pname, fparam);
+}
+
+
+void GLAPIENTRY
+_mesa_Fogi(GLenum pname, GLint param )
+{
+   GLfloat fparam[4];
+   fparam[0] = (GLfloat) param;
+   fparam[1] = fparam[2] = fparam[3] = 0.0F;
+   _mesa_Fogfv(pname, fparam);
+}
+
+
+void GLAPIENTRY
+_mesa_Fogiv(GLenum pname, const GLint *params )
+{
+   GLfloat p[4];
+   switch (pname) {
+      case GL_FOG_MODE:
+      case GL_FOG_DENSITY:
+      case GL_FOG_START:
+      case GL_FOG_END:
+      case GL_FOG_INDEX:
+      case GL_FOG_COORDINATE_SOURCE_EXT:
+	 p[0] = (GLfloat) *params;
+	 break;
+      case GL_FOG_COLOR:
+	 p[0] = INT_TO_FLOAT( params[0] );
+	 p[1] = INT_TO_FLOAT( params[1] );
+	 p[2] = INT_TO_FLOAT( params[2] );
+	 p[3] = INT_TO_FLOAT( params[3] );
+	 break;
+      default:
+         /* Error will be caught later in _mesa_Fogfv */
+         ASSIGN_4V(p, 0.0F, 0.0F, 0.0F, 0.0F);
+   }
+   _mesa_Fogfv(pname, p);
+}
+
+
+/**
+ * Update the gl_fog_attrib::_Scale field.
+ */
+static void
+update_fog_scale(struct gl_context *ctx)
+{
+   if (ctx->Fog.End == ctx->Fog.Start)
+      ctx->Fog._Scale = 1.0f;
+   else
+      ctx->Fog._Scale = 1.0f / (ctx->Fog.End - ctx->Fog.Start);
+}
+
+
+void GLAPIENTRY
+_mesa_Fogfv( GLenum pname, const GLfloat *params )
+{
+   GET_CURRENT_CONTEXT(ctx);
+   GLenum m;
+   ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+   switch (pname) {
+      case GL_FOG_MODE:
+         m = (GLenum) (GLint) *params;
+	 switch (m) {
+	 case GL_LINEAR:
+	 case GL_EXP:
+	 case GL_EXP2:
+	    break;
+	 default:
+	    _mesa_error( ctx, GL_INVALID_ENUM, "glFog" );
+            return;
+	 }
+	 if (ctx->Fog.Mode == m)
+	    return;
+	 FLUSH_VERTICES(ctx, _NEW_FOG);
+	 ctx->Fog.Mode = m;
+	 break;
+      case GL_FOG_DENSITY:
+	 if (*params<0.0) {
+	    _mesa_error( ctx, GL_INVALID_VALUE, "glFog" );
+            return;
+	 }
+	 if (ctx->Fog.Density == *params)
+	    return;
+	 FLUSH_VERTICES(ctx, _NEW_FOG);
+	 ctx->Fog.Density = *params;
+	 break;
+      case GL_FOG_START:
+         if (ctx->Fog.Start == *params)
+            return;
+         FLUSH_VERTICES(ctx, _NEW_FOG);
+         ctx->Fog.Start = *params;
+         update_fog_scale(ctx);
+         break;
+      case GL_FOG_END:
+         if (ctx->Fog.End == *params)
+            return;
+         FLUSH_VERTICES(ctx, _NEW_FOG);
+         ctx->Fog.End = *params;
+         update_fog_scale(ctx);
+         break;
+      case GL_FOG_INDEX:
+ 	 if (ctx->Fog.Index == *params)
+	    return;
+	 FLUSH_VERTICES(ctx, _NEW_FOG);
+ 	 ctx->Fog.Index = *params;
+	 break;
+      case GL_FOG_COLOR:
+	 if (TEST_EQ_4V(ctx->Fog.Color, params))
+	    return;
+	 FLUSH_VERTICES(ctx, _NEW_FOG);
+	 ctx->Fog.ColorUnclamped[0] = params[0];
+	 ctx->Fog.ColorUnclamped[1] = params[1];
+	 ctx->Fog.ColorUnclamped[2] = params[2];
+	 ctx->Fog.ColorUnclamped[3] = params[3];
+	 ctx->Fog.Color[0] = CLAMP(params[0], 0.0F, 1.0F);
+	 ctx->Fog.Color[1] = CLAMP(params[1], 0.0F, 1.0F);
+	 ctx->Fog.Color[2] = CLAMP(params[2], 0.0F, 1.0F);
+	 ctx->Fog.Color[3] = CLAMP(params[3], 0.0F, 1.0F);
+         break;
+      case GL_FOG_COORDINATE_SOURCE_EXT: {
+	 GLenum p = (GLenum) (GLint) *params;
+         if (!ctx->Extensions.EXT_fog_coord ||
+             (p != GL_FOG_COORDINATE_EXT && p != GL_FRAGMENT_DEPTH_EXT)) {
+	    _mesa_error(ctx, GL_INVALID_ENUM, "glFog");
+	    return;
+	 }
+	 if (ctx->Fog.FogCoordinateSource == p)
+	    return;
+	 FLUSH_VERTICES(ctx, _NEW_FOG);
+	 ctx->Fog.FogCoordinateSource = p;
+	 break;
+      }
+      default:
+         _mesa_error( ctx, GL_INVALID_ENUM, "glFog" );
+         return;
+   }
+
+   if (ctx->Driver.Fogfv) {
+      (*ctx->Driver.Fogfv)( ctx, pname, params );
+   }
+}
+
+
+/**********************************************************************/
+/*****                      Initialization                        *****/
+/**********************************************************************/
+
+void _mesa_init_fog( struct gl_context * ctx )
+{
+   /* Fog group */
+   ctx->Fog.Enabled = GL_FALSE;
+   ctx->Fog.Mode = GL_EXP;
+   ASSIGN_4V( ctx->Fog.Color, 0.0, 0.0, 0.0, 0.0 );
+   ASSIGN_4V( ctx->Fog.ColorUnclamped, 0.0, 0.0, 0.0, 0.0 );
+   ctx->Fog.Index = 0.0;
+   ctx->Fog.Density = 1.0;
+   ctx->Fog.Start = 0.0;
+   ctx->Fog.End = 1.0;
+   ctx->Fog.ColorSumEnabled = GL_FALSE;
+   ctx->Fog.FogCoordinateSource = GL_FRAGMENT_DEPTH_EXT;
+   ctx->Fog._Scale = 1.0f;
+}
diff --git a/mesalib/src/mesa/main/formats.c b/mesalib/src/mesa/main/formats.c
index db10c9b4c..e62170b71 100644
--- a/mesalib/src/mesa/main/formats.c
+++ b/mesalib/src/mesa/main/formats.c
@@ -809,8 +809,8 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] =
       1, 1, 1                       /* BlockWidth/Height,Bytes */
    },
    {
-      MESA_FORMAT_SIGNED_RG88,
-      "MESA_FORMAT_SIGNED_RG88",
+      MESA_FORMAT_SIGNED_RG88_REV,
+      "MESA_FORMAT_SIGNED_RG88_REV",
       GL_RG,
       GL_SIGNED_NORMALIZED,
       8, 8, 0, 0,
@@ -847,8 +847,8 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] =
 
    /* Signed 16 bits / channel */
    {
-      MESA_FORMAT_SIGNED_R_16,
-      "MESA_FORMAT_SIGNED_R_16",
+      MESA_FORMAT_SIGNED_R16,
+      "MESA_FORMAT_SIGNED_R16",
       GL_RED,
       GL_SIGNED_NORMALIZED,
       16, 0, 0, 0,
@@ -856,8 +856,8 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] =
       1, 1, 2
    },
    {
-      MESA_FORMAT_SIGNED_RG_16,
-      "MESA_FORMAT_SIGNED_RG_16",
+      MESA_FORMAT_SIGNED_GR1616,
+      "MESA_FORMAT_SIGNED_GR1616",
       GL_RG,
       GL_SIGNED_NORMALIZED,
       16, 16, 0, 0,
@@ -963,6 +963,80 @@ static struct gl_format_info format_info[MESA_FORMAT_COUNT] =
      4, 0, 0, 0, 0,
      4, 4, 16                     /* 16 bytes per 4x4 block */
    },
+
+   /* Signed formats from EXT_texture_snorm that are not in GL3.1 */
+   {
+      MESA_FORMAT_SIGNED_A8,
+      "MESA_FORMAT_SIGNED_A8",
+      GL_ALPHA,
+      GL_SIGNED_NORMALIZED,
+      0, 0, 0, 8,
+      0, 0, 0, 0, 0,
+      1, 1, 1
+   },
+   {
+      MESA_FORMAT_SIGNED_L8,
+      "MESA_FORMAT_SIGNED_L8",
+      GL_LUMINANCE,
+      GL_SIGNED_NORMALIZED,
+      0, 0, 0, 0,
+      8, 0, 0, 0, 0,
+      1, 1, 1
+   },
+   {
+      MESA_FORMAT_SIGNED_AL88,
+      "MESA_FORMAT_SIGNED_AL88",
+      GL_LUMINANCE_ALPHA,
+      GL_SIGNED_NORMALIZED,
+      0, 0, 0, 8,
+      8, 0, 0, 0, 0,
+      1, 1, 2
+   },
+   {
+      MESA_FORMAT_SIGNED_I8,
+      "MESA_FORMAT_SIGNED_I8",
+      GL_INTENSITY,
+      GL_SIGNED_NORMALIZED,
+      0, 0, 0, 0,
+      0, 8, 0, 0, 0,
+      1, 1, 1
+   },
+   {
+      MESA_FORMAT_SIGNED_A16,
+      "MESA_FORMAT_SIGNED_A16",
+      GL_ALPHA,
+      GL_SIGNED_NORMALIZED,
+      0, 0, 0, 16,
+      0, 0, 0, 0, 0,
+      1, 1, 2
+   },
+   {
+      MESA_FORMAT_SIGNED_L16,
+      "MESA_FORMAT_SIGNED_L16",
+      GL_LUMINANCE,
+      GL_SIGNED_NORMALIZED,
+      0, 0, 0, 0,
+      16, 0, 0, 0, 0,
+      1, 1, 2
+   },
+   {
+      MESA_FORMAT_SIGNED_AL1616,
+      "MESA_FORMAT_SIGNED_AL1616",
+      GL_LUMINANCE_ALPHA,
+      GL_SIGNED_NORMALIZED,
+      0, 0, 0, 16,
+      16, 0, 0, 0, 0,
+      1, 1, 4
+   },
+   {
+      MESA_FORMAT_SIGNED_I16,
+      "MESA_FORMAT_SIGNED_I16",
+      GL_INTENSITY,
+      GL_SIGNED_NORMALIZED,
+      0, 0, 0, 0,
+      0, 16, 0, 0, 0,
+      1, 1, 2
+   }
 };
 
 
@@ -1530,10 +1604,14 @@ _mesa_format_to_type_and_comps(gl_format format,
       return;
 
    case MESA_FORMAT_SIGNED_R8:
+   case MESA_FORMAT_SIGNED_A8:
+   case MESA_FORMAT_SIGNED_L8:
+   case MESA_FORMAT_SIGNED_I8:
       *datatype = GL_BYTE;
       *comps = 1;
       return;
-   case MESA_FORMAT_SIGNED_RG88:
+   case MESA_FORMAT_SIGNED_RG88_REV:
+   case MESA_FORMAT_SIGNED_AL88:
       *datatype = GL_BYTE;
       *comps = 2;
       return;
@@ -1549,11 +1627,15 @@ _mesa_format_to_type_and_comps(gl_format format,
       *comps = 4;
       return;
 
-   case MESA_FORMAT_SIGNED_R_16:
+   case MESA_FORMAT_SIGNED_R16:
+   case MESA_FORMAT_SIGNED_A16:
+   case MESA_FORMAT_SIGNED_L16:
+   case MESA_FORMAT_SIGNED_I16:
       *datatype = GL_SHORT;
       *comps = 1;
       return;
-   case MESA_FORMAT_SIGNED_RG_16:
+   case MESA_FORMAT_SIGNED_GR1616:
+   case MESA_FORMAT_SIGNED_AL1616:
       *datatype = GL_SHORT;
       *comps = 2;
       return;
diff --git a/mesalib/src/mesa/main/formats.h b/mesalib/src/mesa/main/formats.h
index 04a18930b..e0c2acbb9 100644
--- a/mesalib/src/mesa/main/formats.h
+++ b/mesalib/src/mesa/main/formats.h
@@ -168,12 +168,12 @@ typedef enum
    /*@{*/
    MESA_FORMAT_DUDV8,             /*                     DUDU DUDU DVDV DVDV */
    MESA_FORMAT_SIGNED_R8,         /*                               RRRR RRRR */
-   MESA_FORMAT_SIGNED_RG88,       /*                     RRRR RRRR GGGG GGGG */
+   MESA_FORMAT_SIGNED_RG88_REV,   /*                     GGGG GGGG RRRR RRRR */
    MESA_FORMAT_SIGNED_RGBX8888,   /* RRRR RRRR GGGG GGGG BBBB BBBB xxxx xxxx */
    MESA_FORMAT_SIGNED_RGBA8888,   /* RRRR RRRR GGGG GGGG BBBB BBBB AAAA AAAA */
    MESA_FORMAT_SIGNED_RGBA8888_REV,/*AAAA AAAA BBBB BBBB GGGG GGGG RRRR RRRR */
-   MESA_FORMAT_SIGNED_R_16,       /* ushort[0]=R */
-   MESA_FORMAT_SIGNED_RG_16,      /* ushort[0]=R, ushort[1]=G */
+   MESA_FORMAT_SIGNED_R16,        /*                     RRRR RRRR RRRR RRRR */
+   MESA_FORMAT_SIGNED_GR1616,     /* GGGG GGGG GGGG GGGG RRRR RRRR RRRR RRRR */
    MESA_FORMAT_SIGNED_RGB_16,     /* ushort[0]=R, ushort[1]=G, ushort[2]=B */
    MESA_FORMAT_SIGNED_RGBA_16,    /* ... */
    MESA_FORMAT_RGBA_16,           /* ... */
@@ -193,6 +193,15 @@ typedef enum
    MESA_FORMAT_SIGNED_LA_LATC2,
    /*@}*/
 
+   MESA_FORMAT_SIGNED_A8,         /*                               AAAA AAAA */
+   MESA_FORMAT_SIGNED_L8,         /*                               LLLL LLLL */
+   MESA_FORMAT_SIGNED_AL88,       /*                     AAAA AAAA LLLL LLLL */
+   MESA_FORMAT_SIGNED_I8,         /*                               IIII IIII */
+   MESA_FORMAT_SIGNED_A16,        /*                     AAAA AAAA AAAA AAAA */
+   MESA_FORMAT_SIGNED_L16,        /*                     LLLL LLLL LLLL LLLL */
+   MESA_FORMAT_SIGNED_AL1616,     /* AAAA AAAA AAAA AAAA LLLL LLLL LLLL LLLL */
+   MESA_FORMAT_SIGNED_I16,        /*                     IIII IIII IIII IIII */
+
    MESA_FORMAT_COUNT
 } gl_format;
 
diff --git a/mesalib/src/mesa/main/get.c b/mesalib/src/mesa/main/get.c
index 81a2a4e7c..9090ca661 100644
--- a/mesalib/src/mesa/main/get.c
+++ b/mesalib/src/mesa/main/get.c
@@ -131,6 +131,7 @@ enum value_extra {
    EXTRA_VERSION_32,
    EXTRA_VERSION_ES2,
    EXTRA_NEW_BUFFERS, 
+   EXTRA_NEW_FRAG_CLAMP,
    EXTRA_VALID_DRAW_BUFFER,
    EXTRA_VALID_TEXTURE_UNIT,
    EXTRA_FLUSH_CURRENT,
@@ -223,6 +224,11 @@ static const int extra_new_buffers[] = {
    EXTRA_END
 };
 
+static const int extra_new_frag_clamp[] = {
+   EXTRA_NEW_FRAG_CLAMP,
+   EXTRA_END
+};
+
 static const int extra_valid_draw_buffer[] = {
    EXTRA_VALID_DRAW_BUFFER,
    EXTRA_END
@@ -374,7 +380,7 @@ static const struct value_desc values[] = {
    { GL_BLEND, CONTEXT_BIT0(Color.BlendEnabled), NO_EXTRA },
    { GL_BLEND_SRC, CONTEXT_ENUM(Color.Blend[0].SrcRGB), NO_EXTRA },
    { GL_BLUE_BITS, BUFFER_INT(Visual.blueBits), extra_new_buffers },
-   { GL_COLOR_CLEAR_VALUE, CONTEXT_FIELD(Color.ClearColor[0], TYPE_FLOATN_4), NO_EXTRA },
+   { GL_COLOR_CLEAR_VALUE, LOC_CUSTOM, TYPE_FLOATN_4, 0, extra_new_frag_clamp },
    { GL_COLOR_WRITEMASK, LOC_CUSTOM, TYPE_INT_4, 0, NO_EXTRA },
    { GL_CULL_FACE, CONTEXT_BOOL(Polygon.CullFlag), NO_EXTRA },
    { GL_CULL_FACE_MODE, CONTEXT_ENUM(Polygon.CullFaceMode), NO_EXTRA },
@@ -511,7 +517,7 @@ static const struct value_desc values[] = {
    { GL_LIGHT_MODEL_TWO_SIDE, CONTEXT_BOOL(Light.Model.TwoSide), NO_EXTRA },
    { GL_ALPHA_TEST, CONTEXT_BOOL(Color.AlphaEnabled), NO_EXTRA },
    { GL_ALPHA_TEST_FUNC, CONTEXT_ENUM(Color.AlphaFunc), NO_EXTRA },
-   { GL_ALPHA_TEST_REF, CONTEXT_FIELD(Color.AlphaRef, TYPE_FLOATN), NO_EXTRA },
+   { GL_ALPHA_TEST_REF, LOC_CUSTOM, TYPE_FLOATN, 0, extra_new_frag_clamp },
    { GL_BLEND_DST, CONTEXT_ENUM(Color.Blend[0].DstRGB), NO_EXTRA },
    { GL_CLIP_PLANE0, CONTEXT_BIT0(Transform.ClipPlanesEnabled), NO_EXTRA },
    { GL_CLIP_PLANE1, CONTEXT_BIT1(Transform.ClipPlanesEnabled), NO_EXTRA },
@@ -530,7 +536,7 @@ static const struct value_desc values[] = {
      extra_flush_current_valid_texture_unit },
    { GL_DISTANCE_ATTENUATION_EXT, CONTEXT_FLOAT3(Point.Params[0]), NO_EXTRA },
    { GL_FOG, CONTEXT_BOOL(Fog.Enabled), NO_EXTRA },
-   { GL_FOG_COLOR, CONTEXT_FIELD(Fog.Color[0], TYPE_FLOATN_4), NO_EXTRA },
+   { GL_FOG_COLOR, LOC_CUSTOM, TYPE_FLOATN_4, 0, extra_new_frag_clamp },
    { GL_FOG_DENSITY, CONTEXT_FLOAT(Fog.Density), NO_EXTRA },
    { GL_FOG_END, CONTEXT_FLOAT(Fog.End), NO_EXTRA },
    { GL_FOG_HINT, CONTEXT_ENUM(Hint.Fog), NO_EXTRA },
@@ -674,7 +680,7 @@ static const struct value_desc values[] = {
    /* GL_ARB_draw_buffers */
    { GL_MAX_DRAW_BUFFERS_ARB, CONTEXT_INT(Const.MaxDrawBuffers), NO_EXTRA },
 
-   { GL_BLEND_COLOR_EXT, CONTEXT_FIELD(Color.BlendColor[0], TYPE_FLOATN_4), NO_EXTRA },
+   { GL_BLEND_COLOR_EXT, LOC_CUSTOM, TYPE_FLOATN_4, 0, extra_new_frag_clamp },
    /* GL_ARB_fragment_program */
    { GL_MAX_TEXTURE_IMAGE_UNITS_ARB, /* == GL_MAX_TEXTURE_IMAGE_UNITS_NV */
      CONTEXT_INT(Const.MaxTextureImageUnits),
@@ -1219,6 +1225,9 @@ static const struct value_desc values[] = {
      CONTEXT_INT(Const.MaxVertexVaryingComponents),
      extra_ARB_geometry_shader4 },
 
+   /* GL_ARB_color_buffer_float */
+   { GL_RGBA_FLOAT_MODE_ARB, BUFFER_FIELD(Visual.floatMode, TYPE_BOOLEAN), 0 },
+
    /* GL_EXT_gpu_shader4 / GL 3.0 */
    { GL_MIN_PROGRAM_TEXEL_OFFSET,
      CONTEXT_INT(Const.MinProgramTexelOffset),
@@ -1633,6 +1642,30 @@ find_custom_value(struct gl_context *ctx, const struct value_desc *d, union valu
       v->value_int = ctx->Array.ArrayObj->PointSize.BufferObj->Name;
       break;
 
+   case GL_FOG_COLOR:
+      if(ctx->Color._ClampFragmentColor)
+         COPY_4FV(v->value_float_4, ctx->Fog.Color);
+      else
+         COPY_4FV(v->value_float_4, ctx->Fog.ColorUnclamped);
+      break;
+   case GL_COLOR_CLEAR_VALUE:
+      if(ctx->Color._ClampFragmentColor)
+         COPY_4FV(v->value_float_4, ctx->Color.ClearColor);
+      else
+         COPY_4FV(v->value_float_4, ctx->Color.ClearColorUnclamped);
+      break;
+   case GL_BLEND_COLOR_EXT:
+      if(ctx->Color._ClampFragmentColor)
+         COPY_4FV(v->value_float_4, ctx->Color.BlendColor);
+      else
+         COPY_4FV(v->value_float_4, ctx->Color.BlendColorUnclamped);
+      break;
+   case GL_ALPHA_TEST_REF:
+      if(ctx->Color._ClampFragmentColor)
+         v->value_float = ctx->Color.AlphaRef;
+      else
+         v->value_float = ctx->Color.AlphaRefUnclamped;
+      break;
    case GL_MAX_VERTEX_UNIFORM_VECTORS:
       v->value_int = ctx->Const.VertexProgram.MaxUniformComponents / 4;
       break;
@@ -1687,6 +1720,10 @@ check_extra(struct gl_context *ctx, const char *func, const struct value_desc *d
 	    enabled++;
 	 }
 	 break;
+      case EXTRA_NEW_FRAG_CLAMP:
+         if (ctx->NewState & (_NEW_BUFFERS | _NEW_FRAG_CLAMP))
+            _mesa_update_state(ctx);
+         break;
       case EXTRA_VERSION_ES2:
 	 if (ctx->API == API_OPENGLES2) {
 	    total++;
diff --git a/mesalib/src/mesa/main/glapidispatch.h b/mesalib/src/mesa/main/glapidispatch.h
index b29c7cb78..e733a8d76 100644
--- a/mesalib/src/mesa/main/glapidispatch.h
+++ b/mesalib/src/mesa/main/glapidispatch.h
@@ -59,7 +59,7 @@
     } while(0)
 
 /* total number of offsets below */
-#define _gloffset_COUNT 892
+#define _gloffset_COUNT 893
 
 #define _gloffset_NewList 0
 #define _gloffset_EndList 1
@@ -636,330 +636,331 @@
 #define _gloffset_GetActiveAttribARB 569
 #define _gloffset_GetAttribLocationARB 570
 #define _gloffset_DrawBuffersARB 571
-#define _gloffset_DrawArraysInstancedARB 572
-#define _gloffset_DrawElementsInstancedARB 573
-#define _gloffset_RenderbufferStorageMultisample 574
-#define _gloffset_FramebufferTextureARB 575
-#define _gloffset_FramebufferTextureFaceARB 576
-#define _gloffset_ProgramParameteriARB 577
-#define _gloffset_VertexAttribDivisorARB 578
-#define _gloffset_FlushMappedBufferRange 579
-#define _gloffset_MapBufferRange 580
-#define _gloffset_BindVertexArray 581
-#define _gloffset_GenVertexArrays 582
-#define _gloffset_CopyBufferSubData 583
-#define _gloffset_ClientWaitSync 584
-#define _gloffset_DeleteSync 585
-#define _gloffset_FenceSync 586
-#define _gloffset_GetInteger64v 587
-#define _gloffset_GetSynciv 588
-#define _gloffset_IsSync 589
-#define _gloffset_WaitSync 590
-#define _gloffset_DrawElementsBaseVertex 591
-#define _gloffset_DrawRangeElementsBaseVertex 592
-#define _gloffset_MultiDrawElementsBaseVertex 593
-#define _gloffset_BlendEquationSeparateiARB 594
-#define _gloffset_BlendEquationiARB 595
-#define _gloffset_BlendFuncSeparateiARB 596
-#define _gloffset_BlendFunciARB 597
-#define _gloffset_BindTransformFeedback 598
-#define _gloffset_DeleteTransformFeedbacks 599
-#define _gloffset_DrawTransformFeedback 600
-#define _gloffset_GenTransformFeedbacks 601
-#define _gloffset_IsTransformFeedback 602
-#define _gloffset_PauseTransformFeedback 603
-#define _gloffset_ResumeTransformFeedback 604
-#define _gloffset_ClearDepthf 605
-#define _gloffset_DepthRangef 606
-#define _gloffset_GetShaderPrecisionFormat 607
-#define _gloffset_ReleaseShaderCompiler 608
-#define _gloffset_ShaderBinary 609
-#define _gloffset_PolygonOffsetEXT 610
-#define _gloffset_GetPixelTexGenParameterfvSGIS 611
-#define _gloffset_GetPixelTexGenParameterivSGIS 612
-#define _gloffset_PixelTexGenParameterfSGIS 613
-#define _gloffset_PixelTexGenParameterfvSGIS 614
-#define _gloffset_PixelTexGenParameteriSGIS 615
-#define _gloffset_PixelTexGenParameterivSGIS 616
-#define _gloffset_SampleMaskSGIS 617
-#define _gloffset_SamplePatternSGIS 618
-#define _gloffset_ColorPointerEXT 619
-#define _gloffset_EdgeFlagPointerEXT 620
-#define _gloffset_IndexPointerEXT 621
-#define _gloffset_NormalPointerEXT 622
-#define _gloffset_TexCoordPointerEXT 623
-#define _gloffset_VertexPointerEXT 624
-#define _gloffset_PointParameterfEXT 625
-#define _gloffset_PointParameterfvEXT 626
-#define _gloffset_LockArraysEXT 627
-#define _gloffset_UnlockArraysEXT 628
-#define _gloffset_SecondaryColor3bEXT 629
-#define _gloffset_SecondaryColor3bvEXT 630
-#define _gloffset_SecondaryColor3dEXT 631
-#define _gloffset_SecondaryColor3dvEXT 632
-#define _gloffset_SecondaryColor3fEXT 633
-#define _gloffset_SecondaryColor3fvEXT 634
-#define _gloffset_SecondaryColor3iEXT 635
-#define _gloffset_SecondaryColor3ivEXT 636
-#define _gloffset_SecondaryColor3sEXT 637
-#define _gloffset_SecondaryColor3svEXT 638
-#define _gloffset_SecondaryColor3ubEXT 639
-#define _gloffset_SecondaryColor3ubvEXT 640
-#define _gloffset_SecondaryColor3uiEXT 641
-#define _gloffset_SecondaryColor3uivEXT 642
-#define _gloffset_SecondaryColor3usEXT 643
-#define _gloffset_SecondaryColor3usvEXT 644
-#define _gloffset_SecondaryColorPointerEXT 645
-#define _gloffset_MultiDrawArraysEXT 646
-#define _gloffset_MultiDrawElementsEXT 647
-#define _gloffset_FogCoordPointerEXT 648
-#define _gloffset_FogCoorddEXT 649
-#define _gloffset_FogCoorddvEXT 650
-#define _gloffset_FogCoordfEXT 651
-#define _gloffset_FogCoordfvEXT 652
-#define _gloffset_PixelTexGenSGIX 653
-#define _gloffset_BlendFuncSeparateEXT 654
-#define _gloffset_FlushVertexArrayRangeNV 655
-#define _gloffset_VertexArrayRangeNV 656
-#define _gloffset_CombinerInputNV 657
-#define _gloffset_CombinerOutputNV 658
-#define _gloffset_CombinerParameterfNV 659
-#define _gloffset_CombinerParameterfvNV 660
-#define _gloffset_CombinerParameteriNV 661
-#define _gloffset_CombinerParameterivNV 662
-#define _gloffset_FinalCombinerInputNV 663
-#define _gloffset_GetCombinerInputParameterfvNV 664
-#define _gloffset_GetCombinerInputParameterivNV 665
-#define _gloffset_GetCombinerOutputParameterfvNV 666
-#define _gloffset_GetCombinerOutputParameterivNV 667
-#define _gloffset_GetFinalCombinerInputParameterfvNV 668
-#define _gloffset_GetFinalCombinerInputParameterivNV 669
-#define _gloffset_ResizeBuffersMESA 670
-#define _gloffset_WindowPos2dMESA 671
-#define _gloffset_WindowPos2dvMESA 672
-#define _gloffset_WindowPos2fMESA 673
-#define _gloffset_WindowPos2fvMESA 674
-#define _gloffset_WindowPos2iMESA 675
-#define _gloffset_WindowPos2ivMESA 676
-#define _gloffset_WindowPos2sMESA 677
-#define _gloffset_WindowPos2svMESA 678
-#define _gloffset_WindowPos3dMESA 679
-#define _gloffset_WindowPos3dvMESA 680
-#define _gloffset_WindowPos3fMESA 681
-#define _gloffset_WindowPos3fvMESA 682
-#define _gloffset_WindowPos3iMESA 683
-#define _gloffset_WindowPos3ivMESA 684
-#define _gloffset_WindowPos3sMESA 685
-#define _gloffset_WindowPos3svMESA 686
-#define _gloffset_WindowPos4dMESA 687
-#define _gloffset_WindowPos4dvMESA 688
-#define _gloffset_WindowPos4fMESA 689
-#define _gloffset_WindowPos4fvMESA 690
-#define _gloffset_WindowPos4iMESA 691
-#define _gloffset_WindowPos4ivMESA 692
-#define _gloffset_WindowPos4sMESA 693
-#define _gloffset_WindowPos4svMESA 694
-#define _gloffset_MultiModeDrawArraysIBM 695
-#define _gloffset_MultiModeDrawElementsIBM 696
-#define _gloffset_DeleteFencesNV 697
-#define _gloffset_FinishFenceNV 698
-#define _gloffset_GenFencesNV 699
-#define _gloffset_GetFenceivNV 700
-#define _gloffset_IsFenceNV 701
-#define _gloffset_SetFenceNV 702
-#define _gloffset_TestFenceNV 703
-#define _gloffset_AreProgramsResidentNV 704
-#define _gloffset_BindProgramNV 705
-#define _gloffset_DeleteProgramsNV 706
-#define _gloffset_ExecuteProgramNV 707
-#define _gloffset_GenProgramsNV 708
-#define _gloffset_GetProgramParameterdvNV 709
-#define _gloffset_GetProgramParameterfvNV 710
-#define _gloffset_GetProgramStringNV 711
-#define _gloffset_GetProgramivNV 712
-#define _gloffset_GetTrackMatrixivNV 713
-#define _gloffset_GetVertexAttribPointervNV 714
-#define _gloffset_GetVertexAttribdvNV 715
-#define _gloffset_GetVertexAttribfvNV 716
-#define _gloffset_GetVertexAttribivNV 717
-#define _gloffset_IsProgramNV 718
-#define _gloffset_LoadProgramNV 719
-#define _gloffset_ProgramParameters4dvNV 720
-#define _gloffset_ProgramParameters4fvNV 721
-#define _gloffset_RequestResidentProgramsNV 722
-#define _gloffset_TrackMatrixNV 723
-#define _gloffset_VertexAttrib1dNV 724
-#define _gloffset_VertexAttrib1dvNV 725
-#define _gloffset_VertexAttrib1fNV 726
-#define _gloffset_VertexAttrib1fvNV 727
-#define _gloffset_VertexAttrib1sNV 728
-#define _gloffset_VertexAttrib1svNV 729
-#define _gloffset_VertexAttrib2dNV 730
-#define _gloffset_VertexAttrib2dvNV 731
-#define _gloffset_VertexAttrib2fNV 732
-#define _gloffset_VertexAttrib2fvNV 733
-#define _gloffset_VertexAttrib2sNV 734
-#define _gloffset_VertexAttrib2svNV 735
-#define _gloffset_VertexAttrib3dNV 736
-#define _gloffset_VertexAttrib3dvNV 737
-#define _gloffset_VertexAttrib3fNV 738
-#define _gloffset_VertexAttrib3fvNV 739
-#define _gloffset_VertexAttrib3sNV 740
-#define _gloffset_VertexAttrib3svNV 741
-#define _gloffset_VertexAttrib4dNV 742
-#define _gloffset_VertexAttrib4dvNV 743
-#define _gloffset_VertexAttrib4fNV 744
-#define _gloffset_VertexAttrib4fvNV 745
-#define _gloffset_VertexAttrib4sNV 746
-#define _gloffset_VertexAttrib4svNV 747
-#define _gloffset_VertexAttrib4ubNV 748
-#define _gloffset_VertexAttrib4ubvNV 749
-#define _gloffset_VertexAttribPointerNV 750
-#define _gloffset_VertexAttribs1dvNV 751
-#define _gloffset_VertexAttribs1fvNV 752
-#define _gloffset_VertexAttribs1svNV 753
-#define _gloffset_VertexAttribs2dvNV 754
-#define _gloffset_VertexAttribs2fvNV 755
-#define _gloffset_VertexAttribs2svNV 756
-#define _gloffset_VertexAttribs3dvNV 757
-#define _gloffset_VertexAttribs3fvNV 758
-#define _gloffset_VertexAttribs3svNV 759
-#define _gloffset_VertexAttribs4dvNV 760
-#define _gloffset_VertexAttribs4fvNV 761
-#define _gloffset_VertexAttribs4svNV 762
-#define _gloffset_VertexAttribs4ubvNV 763
-#define _gloffset_GetTexBumpParameterfvATI 764
-#define _gloffset_GetTexBumpParameterivATI 765
-#define _gloffset_TexBumpParameterfvATI 766
-#define _gloffset_TexBumpParameterivATI 767
-#define _gloffset_AlphaFragmentOp1ATI 768
-#define _gloffset_AlphaFragmentOp2ATI 769
-#define _gloffset_AlphaFragmentOp3ATI 770
-#define _gloffset_BeginFragmentShaderATI 771
-#define _gloffset_BindFragmentShaderATI 772
-#define _gloffset_ColorFragmentOp1ATI 773
-#define _gloffset_ColorFragmentOp2ATI 774
-#define _gloffset_ColorFragmentOp3ATI 775
-#define _gloffset_DeleteFragmentShaderATI 776
-#define _gloffset_EndFragmentShaderATI 777
-#define _gloffset_GenFragmentShadersATI 778
-#define _gloffset_PassTexCoordATI 779
-#define _gloffset_SampleMapATI 780
-#define _gloffset_SetFragmentShaderConstantATI 781
-#define _gloffset_PointParameteriNV 782
-#define _gloffset_PointParameterivNV 783
-#define _gloffset_ActiveStencilFaceEXT 784
-#define _gloffset_BindVertexArrayAPPLE 785
-#define _gloffset_DeleteVertexArraysAPPLE 786
-#define _gloffset_GenVertexArraysAPPLE 787
-#define _gloffset_IsVertexArrayAPPLE 788
-#define _gloffset_GetProgramNamedParameterdvNV 789
-#define _gloffset_GetProgramNamedParameterfvNV 790
-#define _gloffset_ProgramNamedParameter4dNV 791
-#define _gloffset_ProgramNamedParameter4dvNV 792
-#define _gloffset_ProgramNamedParameter4fNV 793
-#define _gloffset_ProgramNamedParameter4fvNV 794
-#define _gloffset_PrimitiveRestartIndexNV 795
-#define _gloffset_PrimitiveRestartNV 796
-#define _gloffset_DepthBoundsEXT 797
-#define _gloffset_BlendEquationSeparateEXT 798
-#define _gloffset_BindFramebufferEXT 799
-#define _gloffset_BindRenderbufferEXT 800
-#define _gloffset_CheckFramebufferStatusEXT 801
-#define _gloffset_DeleteFramebuffersEXT 802
-#define _gloffset_DeleteRenderbuffersEXT 803
-#define _gloffset_FramebufferRenderbufferEXT 804
-#define _gloffset_FramebufferTexture1DEXT 805
-#define _gloffset_FramebufferTexture2DEXT 806
-#define _gloffset_FramebufferTexture3DEXT 807
-#define _gloffset_GenFramebuffersEXT 808
-#define _gloffset_GenRenderbuffersEXT 809
-#define _gloffset_GenerateMipmapEXT 810
-#define _gloffset_GetFramebufferAttachmentParameterivEXT 811
-#define _gloffset_GetRenderbufferParameterivEXT 812
-#define _gloffset_IsFramebufferEXT 813
-#define _gloffset_IsRenderbufferEXT 814
-#define _gloffset_RenderbufferStorageEXT 815
-#define _gloffset_BlitFramebufferEXT 816
-#define _gloffset_BufferParameteriAPPLE 817
-#define _gloffset_FlushMappedBufferRangeAPPLE 818
-#define _gloffset_BindFragDataLocationEXT 819
-#define _gloffset_GetFragDataLocationEXT 820
-#define _gloffset_GetUniformuivEXT 821
-#define _gloffset_GetVertexAttribIivEXT 822
-#define _gloffset_GetVertexAttribIuivEXT 823
-#define _gloffset_Uniform1uiEXT 824
-#define _gloffset_Uniform1uivEXT 825
-#define _gloffset_Uniform2uiEXT 826
-#define _gloffset_Uniform2uivEXT 827
-#define _gloffset_Uniform3uiEXT 828
-#define _gloffset_Uniform3uivEXT 829
-#define _gloffset_Uniform4uiEXT 830
-#define _gloffset_Uniform4uivEXT 831
-#define _gloffset_VertexAttribI1iEXT 832
-#define _gloffset_VertexAttribI1ivEXT 833
-#define _gloffset_VertexAttribI1uiEXT 834
-#define _gloffset_VertexAttribI1uivEXT 835
-#define _gloffset_VertexAttribI2iEXT 836
-#define _gloffset_VertexAttribI2ivEXT 837
-#define _gloffset_VertexAttribI2uiEXT 838
-#define _gloffset_VertexAttribI2uivEXT 839
-#define _gloffset_VertexAttribI3iEXT 840
-#define _gloffset_VertexAttribI3ivEXT 841
-#define _gloffset_VertexAttribI3uiEXT 842
-#define _gloffset_VertexAttribI3uivEXT 843
-#define _gloffset_VertexAttribI4bvEXT 844
-#define _gloffset_VertexAttribI4iEXT 845
-#define _gloffset_VertexAttribI4ivEXT 846
-#define _gloffset_VertexAttribI4svEXT 847
-#define _gloffset_VertexAttribI4ubvEXT 848
-#define _gloffset_VertexAttribI4uiEXT 849
-#define _gloffset_VertexAttribI4uivEXT 850
-#define _gloffset_VertexAttribI4usvEXT 851
-#define _gloffset_VertexAttribIPointerEXT 852
-#define _gloffset_FramebufferTextureLayerEXT 853
-#define _gloffset_ColorMaskIndexedEXT 854
-#define _gloffset_DisableIndexedEXT 855
-#define _gloffset_EnableIndexedEXT 856
-#define _gloffset_GetBooleanIndexedvEXT 857
-#define _gloffset_GetIntegerIndexedvEXT 858
-#define _gloffset_IsEnabledIndexedEXT 859
-#define _gloffset_ClearColorIiEXT 860
-#define _gloffset_ClearColorIuiEXT 861
-#define _gloffset_GetTexParameterIivEXT 862
-#define _gloffset_GetTexParameterIuivEXT 863
-#define _gloffset_TexParameterIivEXT 864
-#define _gloffset_TexParameterIuivEXT 865
-#define _gloffset_BeginConditionalRenderNV 866
-#define _gloffset_EndConditionalRenderNV 867
-#define _gloffset_BeginTransformFeedbackEXT 868
-#define _gloffset_BindBufferBaseEXT 869
-#define _gloffset_BindBufferOffsetEXT 870
-#define _gloffset_BindBufferRangeEXT 871
-#define _gloffset_EndTransformFeedbackEXT 872
-#define _gloffset_GetTransformFeedbackVaryingEXT 873
-#define _gloffset_TransformFeedbackVaryingsEXT 874
-#define _gloffset_ProvokingVertexEXT 875
-#define _gloffset_GetTexParameterPointervAPPLE 876
-#define _gloffset_TextureRangeAPPLE 877
-#define _gloffset_GetObjectParameterivAPPLE 878
-#define _gloffset_ObjectPurgeableAPPLE 879
-#define _gloffset_ObjectUnpurgeableAPPLE 880
-#define _gloffset_ActiveProgramEXT 881
-#define _gloffset_CreateShaderProgramEXT 882
-#define _gloffset_UseShaderProgramEXT 883
-#define _gloffset_TextureBarrierNV 884
-#define _gloffset_StencilFuncSeparateATI 885
-#define _gloffset_ProgramEnvParameters4fvEXT 886
-#define _gloffset_ProgramLocalParameters4fvEXT 887
-#define _gloffset_GetQueryObjecti64vEXT 888
-#define _gloffset_GetQueryObjectui64vEXT 889
-#define _gloffset_EGLImageTargetRenderbufferStorageOES 890
-#define _gloffset_EGLImageTargetTexture2DOES 891
+#define _gloffset_ClampColorARB 572
+#define _gloffset_DrawArraysInstancedARB 573
+#define _gloffset_DrawElementsInstancedARB 574
+#define _gloffset_RenderbufferStorageMultisample 575
+#define _gloffset_FramebufferTextureARB 576
+#define _gloffset_FramebufferTextureFaceARB 577
+#define _gloffset_ProgramParameteriARB 578
+#define _gloffset_VertexAttribDivisorARB 579
+#define _gloffset_FlushMappedBufferRange 580
+#define _gloffset_MapBufferRange 581
+#define _gloffset_BindVertexArray 582
+#define _gloffset_GenVertexArrays 583
+#define _gloffset_CopyBufferSubData 584
+#define _gloffset_ClientWaitSync 585
+#define _gloffset_DeleteSync 586
+#define _gloffset_FenceSync 587
+#define _gloffset_GetInteger64v 588
+#define _gloffset_GetSynciv 589
+#define _gloffset_IsSync 590
+#define _gloffset_WaitSync 591
+#define _gloffset_DrawElementsBaseVertex 592
+#define _gloffset_DrawRangeElementsBaseVertex 593
+#define _gloffset_MultiDrawElementsBaseVertex 594
+#define _gloffset_BlendEquationSeparateiARB 595
+#define _gloffset_BlendEquationiARB 596
+#define _gloffset_BlendFuncSeparateiARB 597
+#define _gloffset_BlendFunciARB 598
+#define _gloffset_BindTransformFeedback 599
+#define _gloffset_DeleteTransformFeedbacks 600
+#define _gloffset_DrawTransformFeedback 601
+#define _gloffset_GenTransformFeedbacks 602
+#define _gloffset_IsTransformFeedback 603
+#define _gloffset_PauseTransformFeedback 604
+#define _gloffset_ResumeTransformFeedback 605
+#define _gloffset_ClearDepthf 606
+#define _gloffset_DepthRangef 607
+#define _gloffset_GetShaderPrecisionFormat 608
+#define _gloffset_ReleaseShaderCompiler 609
+#define _gloffset_ShaderBinary 610
+#define _gloffset_PolygonOffsetEXT 611
+#define _gloffset_GetPixelTexGenParameterfvSGIS 612
+#define _gloffset_GetPixelTexGenParameterivSGIS 613
+#define _gloffset_PixelTexGenParameterfSGIS 614
+#define _gloffset_PixelTexGenParameterfvSGIS 615
+#define _gloffset_PixelTexGenParameteriSGIS 616
+#define _gloffset_PixelTexGenParameterivSGIS 617
+#define _gloffset_SampleMaskSGIS 618
+#define _gloffset_SamplePatternSGIS 619
+#define _gloffset_ColorPointerEXT 620
+#define _gloffset_EdgeFlagPointerEXT 621
+#define _gloffset_IndexPointerEXT 622
+#define _gloffset_NormalPointerEXT 623
+#define _gloffset_TexCoordPointerEXT 624
+#define _gloffset_VertexPointerEXT 625
+#define _gloffset_PointParameterfEXT 626
+#define _gloffset_PointParameterfvEXT 627
+#define _gloffset_LockArraysEXT 628
+#define _gloffset_UnlockArraysEXT 629
+#define _gloffset_SecondaryColor3bEXT 630
+#define _gloffset_SecondaryColor3bvEXT 631
+#define _gloffset_SecondaryColor3dEXT 632
+#define _gloffset_SecondaryColor3dvEXT 633
+#define _gloffset_SecondaryColor3fEXT 634
+#define _gloffset_SecondaryColor3fvEXT 635
+#define _gloffset_SecondaryColor3iEXT 636
+#define _gloffset_SecondaryColor3ivEXT 637
+#define _gloffset_SecondaryColor3sEXT 638
+#define _gloffset_SecondaryColor3svEXT 639
+#define _gloffset_SecondaryColor3ubEXT 640
+#define _gloffset_SecondaryColor3ubvEXT 641
+#define _gloffset_SecondaryColor3uiEXT 642
+#define _gloffset_SecondaryColor3uivEXT 643
+#define _gloffset_SecondaryColor3usEXT 644
+#define _gloffset_SecondaryColor3usvEXT 645
+#define _gloffset_SecondaryColorPointerEXT 646
+#define _gloffset_MultiDrawArraysEXT 647
+#define _gloffset_MultiDrawElementsEXT 648
+#define _gloffset_FogCoordPointerEXT 649
+#define _gloffset_FogCoorddEXT 650
+#define _gloffset_FogCoorddvEXT 651
+#define _gloffset_FogCoordfEXT 652
+#define _gloffset_FogCoordfvEXT 653
+#define _gloffset_PixelTexGenSGIX 654
+#define _gloffset_BlendFuncSeparateEXT 655
+#define _gloffset_FlushVertexArrayRangeNV 656
+#define _gloffset_VertexArrayRangeNV 657
+#define _gloffset_CombinerInputNV 658
+#define _gloffset_CombinerOutputNV 659
+#define _gloffset_CombinerParameterfNV 660
+#define _gloffset_CombinerParameterfvNV 661
+#define _gloffset_CombinerParameteriNV 662
+#define _gloffset_CombinerParameterivNV 663
+#define _gloffset_FinalCombinerInputNV 664
+#define _gloffset_GetCombinerInputParameterfvNV 665
+#define _gloffset_GetCombinerInputParameterivNV 666
+#define _gloffset_GetCombinerOutputParameterfvNV 667
+#define _gloffset_GetCombinerOutputParameterivNV 668
+#define _gloffset_GetFinalCombinerInputParameterfvNV 669
+#define _gloffset_GetFinalCombinerInputParameterivNV 670
+#define _gloffset_ResizeBuffersMESA 671
+#define _gloffset_WindowPos2dMESA 672
+#define _gloffset_WindowPos2dvMESA 673
+#define _gloffset_WindowPos2fMESA 674
+#define _gloffset_WindowPos2fvMESA 675
+#define _gloffset_WindowPos2iMESA 676
+#define _gloffset_WindowPos2ivMESA 677
+#define _gloffset_WindowPos2sMESA 678
+#define _gloffset_WindowPos2svMESA 679
+#define _gloffset_WindowPos3dMESA 680
+#define _gloffset_WindowPos3dvMESA 681
+#define _gloffset_WindowPos3fMESA 682
+#define _gloffset_WindowPos3fvMESA 683
+#define _gloffset_WindowPos3iMESA 684
+#define _gloffset_WindowPos3ivMESA 685
+#define _gloffset_WindowPos3sMESA 686
+#define _gloffset_WindowPos3svMESA 687
+#define _gloffset_WindowPos4dMESA 688
+#define _gloffset_WindowPos4dvMESA 689
+#define _gloffset_WindowPos4fMESA 690
+#define _gloffset_WindowPos4fvMESA 691
+#define _gloffset_WindowPos4iMESA 692
+#define _gloffset_WindowPos4ivMESA 693
+#define _gloffset_WindowPos4sMESA 694
+#define _gloffset_WindowPos4svMESA 695
+#define _gloffset_MultiModeDrawArraysIBM 696
+#define _gloffset_MultiModeDrawElementsIBM 697
+#define _gloffset_DeleteFencesNV 698
+#define _gloffset_FinishFenceNV 699
+#define _gloffset_GenFencesNV 700
+#define _gloffset_GetFenceivNV 701
+#define _gloffset_IsFenceNV 702
+#define _gloffset_SetFenceNV 703
+#define _gloffset_TestFenceNV 704
+#define _gloffset_AreProgramsResidentNV 705
+#define _gloffset_BindProgramNV 706
+#define _gloffset_DeleteProgramsNV 707
+#define _gloffset_ExecuteProgramNV 708
+#define _gloffset_GenProgramsNV 709
+#define _gloffset_GetProgramParameterdvNV 710
+#define _gloffset_GetProgramParameterfvNV 711
+#define _gloffset_GetProgramStringNV 712
+#define _gloffset_GetProgramivNV 713
+#define _gloffset_GetTrackMatrixivNV 714
+#define _gloffset_GetVertexAttribPointervNV 715
+#define _gloffset_GetVertexAttribdvNV 716
+#define _gloffset_GetVertexAttribfvNV 717
+#define _gloffset_GetVertexAttribivNV 718
+#define _gloffset_IsProgramNV 719
+#define _gloffset_LoadProgramNV 720
+#define _gloffset_ProgramParameters4dvNV 721
+#define _gloffset_ProgramParameters4fvNV 722
+#define _gloffset_RequestResidentProgramsNV 723
+#define _gloffset_TrackMatrixNV 724
+#define _gloffset_VertexAttrib1dNV 725
+#define _gloffset_VertexAttrib1dvNV 726
+#define _gloffset_VertexAttrib1fNV 727
+#define _gloffset_VertexAttrib1fvNV 728
+#define _gloffset_VertexAttrib1sNV 729
+#define _gloffset_VertexAttrib1svNV 730
+#define _gloffset_VertexAttrib2dNV 731
+#define _gloffset_VertexAttrib2dvNV 732
+#define _gloffset_VertexAttrib2fNV 733
+#define _gloffset_VertexAttrib2fvNV 734
+#define _gloffset_VertexAttrib2sNV 735
+#define _gloffset_VertexAttrib2svNV 736
+#define _gloffset_VertexAttrib3dNV 737
+#define _gloffset_VertexAttrib3dvNV 738
+#define _gloffset_VertexAttrib3fNV 739
+#define _gloffset_VertexAttrib3fvNV 740
+#define _gloffset_VertexAttrib3sNV 741
+#define _gloffset_VertexAttrib3svNV 742
+#define _gloffset_VertexAttrib4dNV 743
+#define _gloffset_VertexAttrib4dvNV 744
+#define _gloffset_VertexAttrib4fNV 745
+#define _gloffset_VertexAttrib4fvNV 746
+#define _gloffset_VertexAttrib4sNV 747
+#define _gloffset_VertexAttrib4svNV 748
+#define _gloffset_VertexAttrib4ubNV 749
+#define _gloffset_VertexAttrib4ubvNV 750
+#define _gloffset_VertexAttribPointerNV 751
+#define _gloffset_VertexAttribs1dvNV 752
+#define _gloffset_VertexAttribs1fvNV 753
+#define _gloffset_VertexAttribs1svNV 754
+#define _gloffset_VertexAttribs2dvNV 755
+#define _gloffset_VertexAttribs2fvNV 756
+#define _gloffset_VertexAttribs2svNV 757
+#define _gloffset_VertexAttribs3dvNV 758
+#define _gloffset_VertexAttribs3fvNV 759
+#define _gloffset_VertexAttribs3svNV 760
+#define _gloffset_VertexAttribs4dvNV 761
+#define _gloffset_VertexAttribs4fvNV 762
+#define _gloffset_VertexAttribs4svNV 763
+#define _gloffset_VertexAttribs4ubvNV 764
+#define _gloffset_GetTexBumpParameterfvATI 765
+#define _gloffset_GetTexBumpParameterivATI 766
+#define _gloffset_TexBumpParameterfvATI 767
+#define _gloffset_TexBumpParameterivATI 768
+#define _gloffset_AlphaFragmentOp1ATI 769
+#define _gloffset_AlphaFragmentOp2ATI 770
+#define _gloffset_AlphaFragmentOp3ATI 771
+#define _gloffset_BeginFragmentShaderATI 772
+#define _gloffset_BindFragmentShaderATI 773
+#define _gloffset_ColorFragmentOp1ATI 774
+#define _gloffset_ColorFragmentOp2ATI 775
+#define _gloffset_ColorFragmentOp3ATI 776
+#define _gloffset_DeleteFragmentShaderATI 777
+#define _gloffset_EndFragmentShaderATI 778
+#define _gloffset_GenFragmentShadersATI 779
+#define _gloffset_PassTexCoordATI 780
+#define _gloffset_SampleMapATI 781
+#define _gloffset_SetFragmentShaderConstantATI 782
+#define _gloffset_PointParameteriNV 783
+#define _gloffset_PointParameterivNV 784
+#define _gloffset_ActiveStencilFaceEXT 785
+#define _gloffset_BindVertexArrayAPPLE 786
+#define _gloffset_DeleteVertexArraysAPPLE 787
+#define _gloffset_GenVertexArraysAPPLE 788
+#define _gloffset_IsVertexArrayAPPLE 789
+#define _gloffset_GetProgramNamedParameterdvNV 790
+#define _gloffset_GetProgramNamedParameterfvNV 791
+#define _gloffset_ProgramNamedParameter4dNV 792
+#define _gloffset_ProgramNamedParameter4dvNV 793
+#define _gloffset_ProgramNamedParameter4fNV 794
+#define _gloffset_ProgramNamedParameter4fvNV 795
+#define _gloffset_PrimitiveRestartIndexNV 796
+#define _gloffset_PrimitiveRestartNV 797
+#define _gloffset_DepthBoundsEXT 798
+#define _gloffset_BlendEquationSeparateEXT 799
+#define _gloffset_BindFramebufferEXT 800
+#define _gloffset_BindRenderbufferEXT 801
+#define _gloffset_CheckFramebufferStatusEXT 802
+#define _gloffset_DeleteFramebuffersEXT 803
+#define _gloffset_DeleteRenderbuffersEXT 804
+#define _gloffset_FramebufferRenderbufferEXT 805
+#define _gloffset_FramebufferTexture1DEXT 806
+#define _gloffset_FramebufferTexture2DEXT 807
+#define _gloffset_FramebufferTexture3DEXT 808
+#define _gloffset_GenFramebuffersEXT 809
+#define _gloffset_GenRenderbuffersEXT 810
+#define _gloffset_GenerateMipmapEXT 811
+#define _gloffset_GetFramebufferAttachmentParameterivEXT 812
+#define _gloffset_GetRenderbufferParameterivEXT 813
+#define _gloffset_IsFramebufferEXT 814
+#define _gloffset_IsRenderbufferEXT 815
+#define _gloffset_RenderbufferStorageEXT 816
+#define _gloffset_BlitFramebufferEXT 817
+#define _gloffset_BufferParameteriAPPLE 818
+#define _gloffset_FlushMappedBufferRangeAPPLE 819
+#define _gloffset_BindFragDataLocationEXT 820
+#define _gloffset_GetFragDataLocationEXT 821
+#define _gloffset_GetUniformuivEXT 822
+#define _gloffset_GetVertexAttribIivEXT 823
+#define _gloffset_GetVertexAttribIuivEXT 824
+#define _gloffset_Uniform1uiEXT 825
+#define _gloffset_Uniform1uivEXT 826
+#define _gloffset_Uniform2uiEXT 827
+#define _gloffset_Uniform2uivEXT 828
+#define _gloffset_Uniform3uiEXT 829
+#define _gloffset_Uniform3uivEXT 830
+#define _gloffset_Uniform4uiEXT 831
+#define _gloffset_Uniform4uivEXT 832
+#define _gloffset_VertexAttribI1iEXT 833
+#define _gloffset_VertexAttribI1ivEXT 834
+#define _gloffset_VertexAttribI1uiEXT 835
+#define _gloffset_VertexAttribI1uivEXT 836
+#define _gloffset_VertexAttribI2iEXT 837
+#define _gloffset_VertexAttribI2ivEXT 838
+#define _gloffset_VertexAttribI2uiEXT 839
+#define _gloffset_VertexAttribI2uivEXT 840
+#define _gloffset_VertexAttribI3iEXT 841
+#define _gloffset_VertexAttribI3ivEXT 842
+#define _gloffset_VertexAttribI3uiEXT 843
+#define _gloffset_VertexAttribI3uivEXT 844
+#define _gloffset_VertexAttribI4bvEXT 845
+#define _gloffset_VertexAttribI4iEXT 846
+#define _gloffset_VertexAttribI4ivEXT 847
+#define _gloffset_VertexAttribI4svEXT 848
+#define _gloffset_VertexAttribI4ubvEXT 849
+#define _gloffset_VertexAttribI4uiEXT 850
+#define _gloffset_VertexAttribI4uivEXT 851
+#define _gloffset_VertexAttribI4usvEXT 852
+#define _gloffset_VertexAttribIPointerEXT 853
+#define _gloffset_FramebufferTextureLayerEXT 854
+#define _gloffset_ColorMaskIndexedEXT 855
+#define _gloffset_DisableIndexedEXT 856
+#define _gloffset_EnableIndexedEXT 857
+#define _gloffset_GetBooleanIndexedvEXT 858
+#define _gloffset_GetIntegerIndexedvEXT 859
+#define _gloffset_IsEnabledIndexedEXT 860
+#define _gloffset_ClearColorIiEXT 861
+#define _gloffset_ClearColorIuiEXT 862
+#define _gloffset_GetTexParameterIivEXT 863
+#define _gloffset_GetTexParameterIuivEXT 864
+#define _gloffset_TexParameterIivEXT 865
+#define _gloffset_TexParameterIuivEXT 866
+#define _gloffset_BeginConditionalRenderNV 867
+#define _gloffset_EndConditionalRenderNV 868
+#define _gloffset_BeginTransformFeedbackEXT 869
+#define _gloffset_BindBufferBaseEXT 870
+#define _gloffset_BindBufferOffsetEXT 871
+#define _gloffset_BindBufferRangeEXT 872
+#define _gloffset_EndTransformFeedbackEXT 873
+#define _gloffset_GetTransformFeedbackVaryingEXT 874
+#define _gloffset_TransformFeedbackVaryingsEXT 875
+#define _gloffset_ProvokingVertexEXT 876
+#define _gloffset_GetTexParameterPointervAPPLE 877
+#define _gloffset_TextureRangeAPPLE 878
+#define _gloffset_GetObjectParameterivAPPLE 879
+#define _gloffset_ObjectPurgeableAPPLE 880
+#define _gloffset_ObjectUnpurgeableAPPLE 881
+#define _gloffset_ActiveProgramEXT 882
+#define _gloffset_CreateShaderProgramEXT 883
+#define _gloffset_UseShaderProgramEXT 884
+#define _gloffset_TextureBarrierNV 885
+#define _gloffset_StencilFuncSeparateATI 886
+#define _gloffset_ProgramEnvParameters4fvEXT 887
+#define _gloffset_ProgramLocalParameters4fvEXT 888
+#define _gloffset_GetQueryObjecti64vEXT 889
+#define _gloffset_GetQueryObjectui64vEXT 890
+#define _gloffset_EGLImageTargetRenderbufferStorageOES 891
+#define _gloffset_EGLImageTargetTexture2DOES 892
 
 #else /* !_GLAPI_USE_REMAP_TABLE */
 
-#define driDispatchRemapTable_size 484
+#define driDispatchRemapTable_size 485
 extern int driDispatchRemapTable[ driDispatchRemapTable_size ];
 
 #define AttachShader_remap_index 0
@@ -1126,326 +1127,327 @@ extern int driDispatchRemapTable[ driDispatchRemapTable_size ];
 #define GetActiveAttribARB_remap_index 161
 #define GetAttribLocationARB_remap_index 162
 #define DrawBuffersARB_remap_index 163
-#define DrawArraysInstancedARB_remap_index 164
-#define DrawElementsInstancedARB_remap_index 165
-#define RenderbufferStorageMultisample_remap_index 166
-#define FramebufferTextureARB_remap_index 167
-#define FramebufferTextureFaceARB_remap_index 168
-#define ProgramParameteriARB_remap_index 169
-#define VertexAttribDivisorARB_remap_index 170
-#define FlushMappedBufferRange_remap_index 171
-#define MapBufferRange_remap_index 172
-#define BindVertexArray_remap_index 173
-#define GenVertexArrays_remap_index 174
-#define CopyBufferSubData_remap_index 175
-#define ClientWaitSync_remap_index 176
-#define DeleteSync_remap_index 177
-#define FenceSync_remap_index 178
-#define GetInteger64v_remap_index 179
-#define GetSynciv_remap_index 180
-#define IsSync_remap_index 181
-#define WaitSync_remap_index 182
-#define DrawElementsBaseVertex_remap_index 183
-#define DrawRangeElementsBaseVertex_remap_index 184
-#define MultiDrawElementsBaseVertex_remap_index 185
-#define BlendEquationSeparateiARB_remap_index 186
-#define BlendEquationiARB_remap_index 187
-#define BlendFuncSeparateiARB_remap_index 188
-#define BlendFunciARB_remap_index 189
-#define BindTransformFeedback_remap_index 190
-#define DeleteTransformFeedbacks_remap_index 191
-#define DrawTransformFeedback_remap_index 192
-#define GenTransformFeedbacks_remap_index 193
-#define IsTransformFeedback_remap_index 194
-#define PauseTransformFeedback_remap_index 195
-#define ResumeTransformFeedback_remap_index 196
-#define ClearDepthf_remap_index 197
-#define DepthRangef_remap_index 198
-#define GetShaderPrecisionFormat_remap_index 199
-#define ReleaseShaderCompiler_remap_index 200
-#define ShaderBinary_remap_index 201
-#define PolygonOffsetEXT_remap_index 202
-#define GetPixelTexGenParameterfvSGIS_remap_index 203
-#define GetPixelTexGenParameterivSGIS_remap_index 204
-#define PixelTexGenParameterfSGIS_remap_index 205
-#define PixelTexGenParameterfvSGIS_remap_index 206
-#define PixelTexGenParameteriSGIS_remap_index 207
-#define PixelTexGenParameterivSGIS_remap_index 208
-#define SampleMaskSGIS_remap_index 209
-#define SamplePatternSGIS_remap_index 210
-#define ColorPointerEXT_remap_index 211
-#define EdgeFlagPointerEXT_remap_index 212
-#define IndexPointerEXT_remap_index 213
-#define NormalPointerEXT_remap_index 214
-#define TexCoordPointerEXT_remap_index 215
-#define VertexPointerEXT_remap_index 216
-#define PointParameterfEXT_remap_index 217
-#define PointParameterfvEXT_remap_index 218
-#define LockArraysEXT_remap_index 219
-#define UnlockArraysEXT_remap_index 220
-#define SecondaryColor3bEXT_remap_index 221
-#define SecondaryColor3bvEXT_remap_index 222
-#define SecondaryColor3dEXT_remap_index 223
-#define SecondaryColor3dvEXT_remap_index 224
-#define SecondaryColor3fEXT_remap_index 225
-#define SecondaryColor3fvEXT_remap_index 226
-#define SecondaryColor3iEXT_remap_index 227
-#define SecondaryColor3ivEXT_remap_index 228
-#define SecondaryColor3sEXT_remap_index 229
-#define SecondaryColor3svEXT_remap_index 230
-#define SecondaryColor3ubEXT_remap_index 231
-#define SecondaryColor3ubvEXT_remap_index 232
-#define SecondaryColor3uiEXT_remap_index 233
-#define SecondaryColor3uivEXT_remap_index 234
-#define SecondaryColor3usEXT_remap_index 235
-#define SecondaryColor3usvEXT_remap_index 236
-#define SecondaryColorPointerEXT_remap_index 237
-#define MultiDrawArraysEXT_remap_index 238
-#define MultiDrawElementsEXT_remap_index 239
-#define FogCoordPointerEXT_remap_index 240
-#define FogCoorddEXT_remap_index 241
-#define FogCoorddvEXT_remap_index 242
-#define FogCoordfEXT_remap_index 243
-#define FogCoordfvEXT_remap_index 244
-#define PixelTexGenSGIX_remap_index 245
-#define BlendFuncSeparateEXT_remap_index 246
-#define FlushVertexArrayRangeNV_remap_index 247
-#define VertexArrayRangeNV_remap_index 248
-#define CombinerInputNV_remap_index 249
-#define CombinerOutputNV_remap_index 250
-#define CombinerParameterfNV_remap_index 251
-#define CombinerParameterfvNV_remap_index 252
-#define CombinerParameteriNV_remap_index 253
-#define CombinerParameterivNV_remap_index 254
-#define FinalCombinerInputNV_remap_index 255
-#define GetCombinerInputParameterfvNV_remap_index 256
-#define GetCombinerInputParameterivNV_remap_index 257
-#define GetCombinerOutputParameterfvNV_remap_index 258
-#define GetCombinerOutputParameterivNV_remap_index 259
-#define GetFinalCombinerInputParameterfvNV_remap_index 260
-#define GetFinalCombinerInputParameterivNV_remap_index 261
-#define ResizeBuffersMESA_remap_index 262
-#define WindowPos2dMESA_remap_index 263
-#define WindowPos2dvMESA_remap_index 264
-#define WindowPos2fMESA_remap_index 265
-#define WindowPos2fvMESA_remap_index 266
-#define WindowPos2iMESA_remap_index 267
-#define WindowPos2ivMESA_remap_index 268
-#define WindowPos2sMESA_remap_index 269
-#define WindowPos2svMESA_remap_index 270
-#define WindowPos3dMESA_remap_index 271
-#define WindowPos3dvMESA_remap_index 272
-#define WindowPos3fMESA_remap_index 273
-#define WindowPos3fvMESA_remap_index 274
-#define WindowPos3iMESA_remap_index 275
-#define WindowPos3ivMESA_remap_index 276
-#define WindowPos3sMESA_remap_index 277
-#define WindowPos3svMESA_remap_index 278
-#define WindowPos4dMESA_remap_index 279
-#define WindowPos4dvMESA_remap_index 280
-#define WindowPos4fMESA_remap_index 281
-#define WindowPos4fvMESA_remap_index 282
-#define WindowPos4iMESA_remap_index 283
-#define WindowPos4ivMESA_remap_index 284
-#define WindowPos4sMESA_remap_index 285
-#define WindowPos4svMESA_remap_index 286
-#define MultiModeDrawArraysIBM_remap_index 287
-#define MultiModeDrawElementsIBM_remap_index 288
-#define DeleteFencesNV_remap_index 289
-#define FinishFenceNV_remap_index 290
-#define GenFencesNV_remap_index 291
-#define GetFenceivNV_remap_index 292
-#define IsFenceNV_remap_index 293
-#define SetFenceNV_remap_index 294
-#define TestFenceNV_remap_index 295
-#define AreProgramsResidentNV_remap_index 296
-#define BindProgramNV_remap_index 297
-#define DeleteProgramsNV_remap_index 298
-#define ExecuteProgramNV_remap_index 299
-#define GenProgramsNV_remap_index 300
-#define GetProgramParameterdvNV_remap_index 301
-#define GetProgramParameterfvNV_remap_index 302
-#define GetProgramStringNV_remap_index 303
-#define GetProgramivNV_remap_index 304
-#define GetTrackMatrixivNV_remap_index 305
-#define GetVertexAttribPointervNV_remap_index 306
-#define GetVertexAttribdvNV_remap_index 307
-#define GetVertexAttribfvNV_remap_index 308
-#define GetVertexAttribivNV_remap_index 309
-#define IsProgramNV_remap_index 310
-#define LoadProgramNV_remap_index 311
-#define ProgramParameters4dvNV_remap_index 312
-#define ProgramParameters4fvNV_remap_index 313
-#define RequestResidentProgramsNV_remap_index 314
-#define TrackMatrixNV_remap_index 315
-#define VertexAttrib1dNV_remap_index 316
-#define VertexAttrib1dvNV_remap_index 317
-#define VertexAttrib1fNV_remap_index 318
-#define VertexAttrib1fvNV_remap_index 319
-#define VertexAttrib1sNV_remap_index 320
-#define VertexAttrib1svNV_remap_index 321
-#define VertexAttrib2dNV_remap_index 322
-#define VertexAttrib2dvNV_remap_index 323
-#define VertexAttrib2fNV_remap_index 324
-#define VertexAttrib2fvNV_remap_index 325
-#define VertexAttrib2sNV_remap_index 326
-#define VertexAttrib2svNV_remap_index 327
-#define VertexAttrib3dNV_remap_index 328
-#define VertexAttrib3dvNV_remap_index 329
-#define VertexAttrib3fNV_remap_index 330
-#define VertexAttrib3fvNV_remap_index 331
-#define VertexAttrib3sNV_remap_index 332
-#define VertexAttrib3svNV_remap_index 333
-#define VertexAttrib4dNV_remap_index 334
-#define VertexAttrib4dvNV_remap_index 335
-#define VertexAttrib4fNV_remap_index 336
-#define VertexAttrib4fvNV_remap_index 337
-#define VertexAttrib4sNV_remap_index 338
-#define VertexAttrib4svNV_remap_index 339
-#define VertexAttrib4ubNV_remap_index 340
-#define VertexAttrib4ubvNV_remap_index 341
-#define VertexAttribPointerNV_remap_index 342
-#define VertexAttribs1dvNV_remap_index 343
-#define VertexAttribs1fvNV_remap_index 344
-#define VertexAttribs1svNV_remap_index 345
-#define VertexAttribs2dvNV_remap_index 346
-#define VertexAttribs2fvNV_remap_index 347
-#define VertexAttribs2svNV_remap_index 348
-#define VertexAttribs3dvNV_remap_index 349
-#define VertexAttribs3fvNV_remap_index 350
-#define VertexAttribs3svNV_remap_index 351
-#define VertexAttribs4dvNV_remap_index 352
-#define VertexAttribs4fvNV_remap_index 353
-#define VertexAttribs4svNV_remap_index 354
-#define VertexAttribs4ubvNV_remap_index 355
-#define GetTexBumpParameterfvATI_remap_index 356
-#define GetTexBumpParameterivATI_remap_index 357
-#define TexBumpParameterfvATI_remap_index 358
-#define TexBumpParameterivATI_remap_index 359
-#define AlphaFragmentOp1ATI_remap_index 360
-#define AlphaFragmentOp2ATI_remap_index 361
-#define AlphaFragmentOp3ATI_remap_index 362
-#define BeginFragmentShaderATI_remap_index 363
-#define BindFragmentShaderATI_remap_index 364
-#define ColorFragmentOp1ATI_remap_index 365
-#define ColorFragmentOp2ATI_remap_index 366
-#define ColorFragmentOp3ATI_remap_index 367
-#define DeleteFragmentShaderATI_remap_index 368
-#define EndFragmentShaderATI_remap_index 369
-#define GenFragmentShadersATI_remap_index 370
-#define PassTexCoordATI_remap_index 371
-#define SampleMapATI_remap_index 372
-#define SetFragmentShaderConstantATI_remap_index 373
-#define PointParameteriNV_remap_index 374
-#define PointParameterivNV_remap_index 375
-#define ActiveStencilFaceEXT_remap_index 376
-#define BindVertexArrayAPPLE_remap_index 377
-#define DeleteVertexArraysAPPLE_remap_index 378
-#define GenVertexArraysAPPLE_remap_index 379
-#define IsVertexArrayAPPLE_remap_index 380
-#define GetProgramNamedParameterdvNV_remap_index 381
-#define GetProgramNamedParameterfvNV_remap_index 382
-#define ProgramNamedParameter4dNV_remap_index 383
-#define ProgramNamedParameter4dvNV_remap_index 384
-#define ProgramNamedParameter4fNV_remap_index 385
-#define ProgramNamedParameter4fvNV_remap_index 386
-#define PrimitiveRestartIndexNV_remap_index 387
-#define PrimitiveRestartNV_remap_index 388
-#define DepthBoundsEXT_remap_index 389
-#define BlendEquationSeparateEXT_remap_index 390
-#define BindFramebufferEXT_remap_index 391
-#define BindRenderbufferEXT_remap_index 392
-#define CheckFramebufferStatusEXT_remap_index 393
-#define DeleteFramebuffersEXT_remap_index 394
-#define DeleteRenderbuffersEXT_remap_index 395
-#define FramebufferRenderbufferEXT_remap_index 396
-#define FramebufferTexture1DEXT_remap_index 397
-#define FramebufferTexture2DEXT_remap_index 398
-#define FramebufferTexture3DEXT_remap_index 399
-#define GenFramebuffersEXT_remap_index 400
-#define GenRenderbuffersEXT_remap_index 401
-#define GenerateMipmapEXT_remap_index 402
-#define GetFramebufferAttachmentParameterivEXT_remap_index 403
-#define GetRenderbufferParameterivEXT_remap_index 404
-#define IsFramebufferEXT_remap_index 405
-#define IsRenderbufferEXT_remap_index 406
-#define RenderbufferStorageEXT_remap_index 407
-#define BlitFramebufferEXT_remap_index 408
-#define BufferParameteriAPPLE_remap_index 409
-#define FlushMappedBufferRangeAPPLE_remap_index 410
-#define BindFragDataLocationEXT_remap_index 411
-#define GetFragDataLocationEXT_remap_index 412
-#define GetUniformuivEXT_remap_index 413
-#define GetVertexAttribIivEXT_remap_index 414
-#define GetVertexAttribIuivEXT_remap_index 415
-#define Uniform1uiEXT_remap_index 416
-#define Uniform1uivEXT_remap_index 417
-#define Uniform2uiEXT_remap_index 418
-#define Uniform2uivEXT_remap_index 419
-#define Uniform3uiEXT_remap_index 420
-#define Uniform3uivEXT_remap_index 421
-#define Uniform4uiEXT_remap_index 422
-#define Uniform4uivEXT_remap_index 423
-#define VertexAttribI1iEXT_remap_index 424
-#define VertexAttribI1ivEXT_remap_index 425
-#define VertexAttribI1uiEXT_remap_index 426
-#define VertexAttribI1uivEXT_remap_index 427
-#define VertexAttribI2iEXT_remap_index 428
-#define VertexAttribI2ivEXT_remap_index 429
-#define VertexAttribI2uiEXT_remap_index 430
-#define VertexAttribI2uivEXT_remap_index 431
-#define VertexAttribI3iEXT_remap_index 432
-#define VertexAttribI3ivEXT_remap_index 433
-#define VertexAttribI3uiEXT_remap_index 434
-#define VertexAttribI3uivEXT_remap_index 435
-#define VertexAttribI4bvEXT_remap_index 436
-#define VertexAttribI4iEXT_remap_index 437
-#define VertexAttribI4ivEXT_remap_index 438
-#define VertexAttribI4svEXT_remap_index 439
-#define VertexAttribI4ubvEXT_remap_index 440
-#define VertexAttribI4uiEXT_remap_index 441
-#define VertexAttribI4uivEXT_remap_index 442
-#define VertexAttribI4usvEXT_remap_index 443
-#define VertexAttribIPointerEXT_remap_index 444
-#define FramebufferTextureLayerEXT_remap_index 445
-#define ColorMaskIndexedEXT_remap_index 446
-#define DisableIndexedEXT_remap_index 447
-#define EnableIndexedEXT_remap_index 448
-#define GetBooleanIndexedvEXT_remap_index 449
-#define GetIntegerIndexedvEXT_remap_index 450
-#define IsEnabledIndexedEXT_remap_index 451
-#define ClearColorIiEXT_remap_index 452
-#define ClearColorIuiEXT_remap_index 453
-#define GetTexParameterIivEXT_remap_index 454
-#define GetTexParameterIuivEXT_remap_index 455
-#define TexParameterIivEXT_remap_index 456
-#define TexParameterIuivEXT_remap_index 457
-#define BeginConditionalRenderNV_remap_index 458
-#define EndConditionalRenderNV_remap_index 459
-#define BeginTransformFeedbackEXT_remap_index 460
-#define BindBufferBaseEXT_remap_index 461
-#define BindBufferOffsetEXT_remap_index 462
-#define BindBufferRangeEXT_remap_index 463
-#define EndTransformFeedbackEXT_remap_index 464
-#define GetTransformFeedbackVaryingEXT_remap_index 465
-#define TransformFeedbackVaryingsEXT_remap_index 466
-#define ProvokingVertexEXT_remap_index 467
-#define GetTexParameterPointervAPPLE_remap_index 468
-#define TextureRangeAPPLE_remap_index 469
-#define GetObjectParameterivAPPLE_remap_index 470
-#define ObjectPurgeableAPPLE_remap_index 471
-#define ObjectUnpurgeableAPPLE_remap_index 472
-#define ActiveProgramEXT_remap_index 473
-#define CreateShaderProgramEXT_remap_index 474
-#define UseShaderProgramEXT_remap_index 475
-#define TextureBarrierNV_remap_index 476
-#define StencilFuncSeparateATI_remap_index 477
-#define ProgramEnvParameters4fvEXT_remap_index 478
-#define ProgramLocalParameters4fvEXT_remap_index 479
-#define GetQueryObjecti64vEXT_remap_index 480
-#define GetQueryObjectui64vEXT_remap_index 481
-#define EGLImageTargetRenderbufferStorageOES_remap_index 482
-#define EGLImageTargetTexture2DOES_remap_index 483
+#define ClampColorARB_remap_index 164
+#define DrawArraysInstancedARB_remap_index 165
+#define DrawElementsInstancedARB_remap_index 166
+#define RenderbufferStorageMultisample_remap_index 167
+#define FramebufferTextureARB_remap_index 168
+#define FramebufferTextureFaceARB_remap_index 169
+#define ProgramParameteriARB_remap_index 170
+#define VertexAttribDivisorARB_remap_index 171
+#define FlushMappedBufferRange_remap_index 172
+#define MapBufferRange_remap_index 173
+#define BindVertexArray_remap_index 174
+#define GenVertexArrays_remap_index 175
+#define CopyBufferSubData_remap_index 176
+#define ClientWaitSync_remap_index 177
+#define DeleteSync_remap_index 178
+#define FenceSync_remap_index 179
+#define GetInteger64v_remap_index 180
+#define GetSynciv_remap_index 181
+#define IsSync_remap_index 182
+#define WaitSync_remap_index 183
+#define DrawElementsBaseVertex_remap_index 184
+#define DrawRangeElementsBaseVertex_remap_index 185
+#define MultiDrawElementsBaseVertex_remap_index 186
+#define BlendEquationSeparateiARB_remap_index 187
+#define BlendEquationiARB_remap_index 188
+#define BlendFuncSeparateiARB_remap_index 189
+#define BlendFunciARB_remap_index 190
+#define BindTransformFeedback_remap_index 191
+#define DeleteTransformFeedbacks_remap_index 192
+#define DrawTransformFeedback_remap_index 193
+#define GenTransformFeedbacks_remap_index 194
+#define IsTransformFeedback_remap_index 195
+#define PauseTransformFeedback_remap_index 196
+#define ResumeTransformFeedback_remap_index 197
+#define ClearDepthf_remap_index 198
+#define DepthRangef_remap_index 199
+#define GetShaderPrecisionFormat_remap_index 200
+#define ReleaseShaderCompiler_remap_index 201
+#define ShaderBinary_remap_index 202
+#define PolygonOffsetEXT_remap_index 203
+#define GetPixelTexGenParameterfvSGIS_remap_index 204
+#define GetPixelTexGenParameterivSGIS_remap_index 205
+#define PixelTexGenParameterfSGIS_remap_index 206
+#define PixelTexGenParameterfvSGIS_remap_index 207
+#define PixelTexGenParameteriSGIS_remap_index 208
+#define PixelTexGenParameterivSGIS_remap_index 209
+#define SampleMaskSGIS_remap_index 210
+#define SamplePatternSGIS_remap_index 211
+#define ColorPointerEXT_remap_index 212
+#define EdgeFlagPointerEXT_remap_index 213
+#define IndexPointerEXT_remap_index 214
+#define NormalPointerEXT_remap_index 215
+#define TexCoordPointerEXT_remap_index 216
+#define VertexPointerEXT_remap_index 217
+#define PointParameterfEXT_remap_index 218
+#define PointParameterfvEXT_remap_index 219
+#define LockArraysEXT_remap_index 220
+#define UnlockArraysEXT_remap_index 221
+#define SecondaryColor3bEXT_remap_index 222
+#define SecondaryColor3bvEXT_remap_index 223
+#define SecondaryColor3dEXT_remap_index 224
+#define SecondaryColor3dvEXT_remap_index 225
+#define SecondaryColor3fEXT_remap_index 226
+#define SecondaryColor3fvEXT_remap_index 227
+#define SecondaryColor3iEXT_remap_index 228
+#define SecondaryColor3ivEXT_remap_index 229
+#define SecondaryColor3sEXT_remap_index 230
+#define SecondaryColor3svEXT_remap_index 231
+#define SecondaryColor3ubEXT_remap_index 232
+#define SecondaryColor3ubvEXT_remap_index 233
+#define SecondaryColor3uiEXT_remap_index 234
+#define SecondaryColor3uivEXT_remap_index 235
+#define SecondaryColor3usEXT_remap_index 236
+#define SecondaryColor3usvEXT_remap_index 237
+#define SecondaryColorPointerEXT_remap_index 238
+#define MultiDrawArraysEXT_remap_index 239
+#define MultiDrawElementsEXT_remap_index 240
+#define FogCoordPointerEXT_remap_index 241
+#define FogCoorddEXT_remap_index 242
+#define FogCoorddvEXT_remap_index 243
+#define FogCoordfEXT_remap_index 244
+#define FogCoordfvEXT_remap_index 245
+#define PixelTexGenSGIX_remap_index 246
+#define BlendFuncSeparateEXT_remap_index 247
+#define FlushVertexArrayRangeNV_remap_index 248
+#define VertexArrayRangeNV_remap_index 249
+#define CombinerInputNV_remap_index 250
+#define CombinerOutputNV_remap_index 251
+#define CombinerParameterfNV_remap_index 252
+#define CombinerParameterfvNV_remap_index 253
+#define CombinerParameteriNV_remap_index 254
+#define CombinerParameterivNV_remap_index 255
+#define FinalCombinerInputNV_remap_index 256
+#define GetCombinerInputParameterfvNV_remap_index 257
+#define GetCombinerInputParameterivNV_remap_index 258
+#define GetCombinerOutputParameterfvNV_remap_index 259
+#define GetCombinerOutputParameterivNV_remap_index 260
+#define GetFinalCombinerInputParameterfvNV_remap_index 261
+#define GetFinalCombinerInputParameterivNV_remap_index 262
+#define ResizeBuffersMESA_remap_index 263
+#define WindowPos2dMESA_remap_index 264
+#define WindowPos2dvMESA_remap_index 265
+#define WindowPos2fMESA_remap_index 266
+#define WindowPos2fvMESA_remap_index 267
+#define WindowPos2iMESA_remap_index 268
+#define WindowPos2ivMESA_remap_index 269
+#define WindowPos2sMESA_remap_index 270
+#define WindowPos2svMESA_remap_index 271
+#define WindowPos3dMESA_remap_index 272
+#define WindowPos3dvMESA_remap_index 273
+#define WindowPos3fMESA_remap_index 274
+#define WindowPos3fvMESA_remap_index 275
+#define WindowPos3iMESA_remap_index 276
+#define WindowPos3ivMESA_remap_index 277
+#define WindowPos3sMESA_remap_index 278
+#define WindowPos3svMESA_remap_index 279
+#define WindowPos4dMESA_remap_index 280
+#define WindowPos4dvMESA_remap_index 281
+#define WindowPos4fMESA_remap_index 282
+#define WindowPos4fvMESA_remap_index 283
+#define WindowPos4iMESA_remap_index 284
+#define WindowPos4ivMESA_remap_index 285
+#define WindowPos4sMESA_remap_index 286
+#define WindowPos4svMESA_remap_index 287
+#define MultiModeDrawArraysIBM_remap_index 288
+#define MultiModeDrawElementsIBM_remap_index 289
+#define DeleteFencesNV_remap_index 290
+#define FinishFenceNV_remap_index 291
+#define GenFencesNV_remap_index 292
+#define GetFenceivNV_remap_index 293
+#define IsFenceNV_remap_index 294
+#define SetFenceNV_remap_index 295
+#define TestFenceNV_remap_index 296
+#define AreProgramsResidentNV_remap_index 297
+#define BindProgramNV_remap_index 298
+#define DeleteProgramsNV_remap_index 299
+#define ExecuteProgramNV_remap_index 300
+#define GenProgramsNV_remap_index 301
+#define GetProgramParameterdvNV_remap_index 302
+#define GetProgramParameterfvNV_remap_index 303
+#define GetProgramStringNV_remap_index 304
+#define GetProgramivNV_remap_index 305
+#define GetTrackMatrixivNV_remap_index 306
+#define GetVertexAttribPointervNV_remap_index 307
+#define GetVertexAttribdvNV_remap_index 308
+#define GetVertexAttribfvNV_remap_index 309
+#define GetVertexAttribivNV_remap_index 310
+#define IsProgramNV_remap_index 311
+#define LoadProgramNV_remap_index 312
+#define ProgramParameters4dvNV_remap_index 313
+#define ProgramParameters4fvNV_remap_index 314
+#define RequestResidentProgramsNV_remap_index 315
+#define TrackMatrixNV_remap_index 316
+#define VertexAttrib1dNV_remap_index 317
+#define VertexAttrib1dvNV_remap_index 318
+#define VertexAttrib1fNV_remap_index 319
+#define VertexAttrib1fvNV_remap_index 320
+#define VertexAttrib1sNV_remap_index 321
+#define VertexAttrib1svNV_remap_index 322
+#define VertexAttrib2dNV_remap_index 323
+#define VertexAttrib2dvNV_remap_index 324
+#define VertexAttrib2fNV_remap_index 325
+#define VertexAttrib2fvNV_remap_index 326
+#define VertexAttrib2sNV_remap_index 327
+#define VertexAttrib2svNV_remap_index 328
+#define VertexAttrib3dNV_remap_index 329
+#define VertexAttrib3dvNV_remap_index 330
+#define VertexAttrib3fNV_remap_index 331
+#define VertexAttrib3fvNV_remap_index 332
+#define VertexAttrib3sNV_remap_index 333
+#define VertexAttrib3svNV_remap_index 334
+#define VertexAttrib4dNV_remap_index 335
+#define VertexAttrib4dvNV_remap_index 336
+#define VertexAttrib4fNV_remap_index 337
+#define VertexAttrib4fvNV_remap_index 338
+#define VertexAttrib4sNV_remap_index 339
+#define VertexAttrib4svNV_remap_index 340
+#define VertexAttrib4ubNV_remap_index 341
+#define VertexAttrib4ubvNV_remap_index 342
+#define VertexAttribPointerNV_remap_index 343
+#define VertexAttribs1dvNV_remap_index 344
+#define VertexAttribs1fvNV_remap_index 345
+#define VertexAttribs1svNV_remap_index 346
+#define VertexAttribs2dvNV_remap_index 347
+#define VertexAttribs2fvNV_remap_index 348
+#define VertexAttribs2svNV_remap_index 349
+#define VertexAttribs3dvNV_remap_index 350
+#define VertexAttribs3fvNV_remap_index 351
+#define VertexAttribs3svNV_remap_index 352
+#define VertexAttribs4dvNV_remap_index 353
+#define VertexAttribs4fvNV_remap_index 354
+#define VertexAttribs4svNV_remap_index 355
+#define VertexAttribs4ubvNV_remap_index 356
+#define GetTexBumpParameterfvATI_remap_index 357
+#define GetTexBumpParameterivATI_remap_index 358
+#define TexBumpParameterfvATI_remap_index 359
+#define TexBumpParameterivATI_remap_index 360
+#define AlphaFragmentOp1ATI_remap_index 361
+#define AlphaFragmentOp2ATI_remap_index 362
+#define AlphaFragmentOp3ATI_remap_index 363
+#define BeginFragmentShaderATI_remap_index 364
+#define BindFragmentShaderATI_remap_index 365
+#define ColorFragmentOp1ATI_remap_index 366
+#define ColorFragmentOp2ATI_remap_index 367
+#define ColorFragmentOp3ATI_remap_index 368
+#define DeleteFragmentShaderATI_remap_index 369
+#define EndFragmentShaderATI_remap_index 370
+#define GenFragmentShadersATI_remap_index 371
+#define PassTexCoordATI_remap_index 372
+#define SampleMapATI_remap_index 373
+#define SetFragmentShaderConstantATI_remap_index 374
+#define PointParameteriNV_remap_index 375
+#define PointParameterivNV_remap_index 376
+#define ActiveStencilFaceEXT_remap_index 377
+#define BindVertexArrayAPPLE_remap_index 378
+#define DeleteVertexArraysAPPLE_remap_index 379
+#define GenVertexArraysAPPLE_remap_index 380
+#define IsVertexArrayAPPLE_remap_index 381
+#define GetProgramNamedParameterdvNV_remap_index 382
+#define GetProgramNamedParameterfvNV_remap_index 383
+#define ProgramNamedParameter4dNV_remap_index 384
+#define ProgramNamedParameter4dvNV_remap_index 385
+#define ProgramNamedParameter4fNV_remap_index 386
+#define ProgramNamedParameter4fvNV_remap_index 387
+#define PrimitiveRestartIndexNV_remap_index 388
+#define PrimitiveRestartNV_remap_index 389
+#define DepthBoundsEXT_remap_index 390
+#define BlendEquationSeparateEXT_remap_index 391
+#define BindFramebufferEXT_remap_index 392
+#define BindRenderbufferEXT_remap_index 393
+#define CheckFramebufferStatusEXT_remap_index 394
+#define DeleteFramebuffersEXT_remap_index 395
+#define DeleteRenderbuffersEXT_remap_index 396
+#define FramebufferRenderbufferEXT_remap_index 397
+#define FramebufferTexture1DEXT_remap_index 398
+#define FramebufferTexture2DEXT_remap_index 399
+#define FramebufferTexture3DEXT_remap_index 400
+#define GenFramebuffersEXT_remap_index 401
+#define GenRenderbuffersEXT_remap_index 402
+#define GenerateMipmapEXT_remap_index 403
+#define GetFramebufferAttachmentParameterivEXT_remap_index 404
+#define GetRenderbufferParameterivEXT_remap_index 405
+#define IsFramebufferEXT_remap_index 406
+#define IsRenderbufferEXT_remap_index 407
+#define RenderbufferStorageEXT_remap_index 408
+#define BlitFramebufferEXT_remap_index 409
+#define BufferParameteriAPPLE_remap_index 410
+#define FlushMappedBufferRangeAPPLE_remap_index 411
+#define BindFragDataLocationEXT_remap_index 412
+#define GetFragDataLocationEXT_remap_index 413
+#define GetUniformuivEXT_remap_index 414
+#define GetVertexAttribIivEXT_remap_index 415
+#define GetVertexAttribIuivEXT_remap_index 416
+#define Uniform1uiEXT_remap_index 417
+#define Uniform1uivEXT_remap_index 418
+#define Uniform2uiEXT_remap_index 419
+#define Uniform2uivEXT_remap_index 420
+#define Uniform3uiEXT_remap_index 421
+#define Uniform3uivEXT_remap_index 422
+#define Uniform4uiEXT_remap_index 423
+#define Uniform4uivEXT_remap_index 424
+#define VertexAttribI1iEXT_remap_index 425
+#define VertexAttribI1ivEXT_remap_index 426
+#define VertexAttribI1uiEXT_remap_index 427
+#define VertexAttribI1uivEXT_remap_index 428
+#define VertexAttribI2iEXT_remap_index 429
+#define VertexAttribI2ivEXT_remap_index 430
+#define VertexAttribI2uiEXT_remap_index 431
+#define VertexAttribI2uivEXT_remap_index 432
+#define VertexAttribI3iEXT_remap_index 433
+#define VertexAttribI3ivEXT_remap_index 434
+#define VertexAttribI3uiEXT_remap_index 435
+#define VertexAttribI3uivEXT_remap_index 436
+#define VertexAttribI4bvEXT_remap_index 437
+#define VertexAttribI4iEXT_remap_index 438
+#define VertexAttribI4ivEXT_remap_index 439
+#define VertexAttribI4svEXT_remap_index 440
+#define VertexAttribI4ubvEXT_remap_index 441
+#define VertexAttribI4uiEXT_remap_index 442
+#define VertexAttribI4uivEXT_remap_index 443
+#define VertexAttribI4usvEXT_remap_index 444
+#define VertexAttribIPointerEXT_remap_index 445
+#define FramebufferTextureLayerEXT_remap_index 446
+#define ColorMaskIndexedEXT_remap_index 447
+#define DisableIndexedEXT_remap_index 448
+#define EnableIndexedEXT_remap_index 449
+#define GetBooleanIndexedvEXT_remap_index 450
+#define GetIntegerIndexedvEXT_remap_index 451
+#define IsEnabledIndexedEXT_remap_index 452
+#define ClearColorIiEXT_remap_index 453
+#define ClearColorIuiEXT_remap_index 454
+#define GetTexParameterIivEXT_remap_index 455
+#define GetTexParameterIuivEXT_remap_index 456
+#define TexParameterIivEXT_remap_index 457
+#define TexParameterIuivEXT_remap_index 458
+#define BeginConditionalRenderNV_remap_index 459
+#define EndConditionalRenderNV_remap_index 460
+#define BeginTransformFeedbackEXT_remap_index 461
+#define BindBufferBaseEXT_remap_index 462
+#define BindBufferOffsetEXT_remap_index 463
+#define BindBufferRangeEXT_remap_index 464
+#define EndTransformFeedbackEXT_remap_index 465
+#define GetTransformFeedbackVaryingEXT_remap_index 466
+#define TransformFeedbackVaryingsEXT_remap_index 467
+#define ProvokingVertexEXT_remap_index 468
+#define GetTexParameterPointervAPPLE_remap_index 469
+#define TextureRangeAPPLE_remap_index 470
+#define GetObjectParameterivAPPLE_remap_index 471
+#define ObjectPurgeableAPPLE_remap_index 472
+#define ObjectUnpurgeableAPPLE_remap_index 473
+#define ActiveProgramEXT_remap_index 474
+#define CreateShaderProgramEXT_remap_index 475
+#define UseShaderProgramEXT_remap_index 476
+#define TextureBarrierNV_remap_index 477
+#define StencilFuncSeparateATI_remap_index 478
+#define ProgramEnvParameters4fvEXT_remap_index 479
+#define ProgramLocalParameters4fvEXT_remap_index 480
+#define GetQueryObjecti64vEXT_remap_index 481
+#define GetQueryObjectui64vEXT_remap_index 482
+#define EGLImageTargetRenderbufferStorageOES_remap_index 483
+#define EGLImageTargetTexture2DOES_remap_index 484
 
 #define _gloffset_AttachShader driDispatchRemapTable[AttachShader_remap_index]
 #define _gloffset_CreateProgram driDispatchRemapTable[CreateProgram_remap_index]
@@ -1611,6 +1613,7 @@ extern int driDispatchRemapTable[ driDispatchRemapTable_size ];
 #define _gloffset_GetActiveAttribARB driDispatchRemapTable[GetActiveAttribARB_remap_index]
 #define _gloffset_GetAttribLocationARB driDispatchRemapTable[GetAttribLocationARB_remap_index]
 #define _gloffset_DrawBuffersARB driDispatchRemapTable[DrawBuffersARB_remap_index]
+#define _gloffset_ClampColorARB driDispatchRemapTable[ClampColorARB_remap_index]
 #define _gloffset_DrawArraysInstancedARB driDispatchRemapTable[DrawArraysInstancedARB_remap_index]
 #define _gloffset_DrawElementsInstancedARB driDispatchRemapTable[DrawElementsInstancedARB_remap_index]
 #define _gloffset_RenderbufferStorageMultisample driDispatchRemapTable[RenderbufferStorageMultisample_remap_index]
@@ -3650,6 +3653,9 @@ extern int driDispatchRemapTable[ driDispatchRemapTable_size ];
 #define CALL_DrawBuffersARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLsizei, const GLenum *)), _gloffset_DrawBuffersARB, parameters)
 #define GET_DrawBuffersARB(disp) GET_by_offset(disp, _gloffset_DrawBuffersARB)
 #define SET_DrawBuffersARB(disp, fn) SET_by_offset(disp, _gloffset_DrawBuffersARB, fn)
+#define CALL_ClampColorARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLenum)), _gloffset_ClampColorARB, parameters)
+#define GET_ClampColorARB(disp) GET_by_offset(disp, _gloffset_ClampColorARB)
+#define SET_ClampColorARB(disp, fn) SET_by_offset(disp, _gloffset_ClampColorARB, fn)
 #define CALL_DrawArraysInstancedARB(disp, parameters) CALL_by_offset(disp, (void (GLAPIENTRYP)(GLenum, GLint, GLsizei, GLsizei)), _gloffset_DrawArraysInstancedARB, parameters)
 #define GET_DrawArraysInstancedARB(disp) GET_by_offset(disp, _gloffset_DrawArraysInstancedARB)
 #define SET_DrawArraysInstancedARB(disp, fn) SET_by_offset(disp, _gloffset_DrawArraysInstancedARB, fn)
diff --git a/mesalib/src/mesa/main/image.c b/mesalib/src/mesa/main/image.c
index bbde3800e..28841c251 100644
--- a/mesalib/src/mesa/main/image.c
+++ b/mesalib/src/mesa/main/image.c
@@ -748,9 +748,6 @@ _mesa_is_color_format(GLenum format)
       case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
       case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
       case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
-      /* signed, normalized texture formats */
-      case GL_RGBA_SNORM:
-      case GL_RGBA8_SNORM:
       /* generic integer formats */
       case GL_RED_INTEGER_EXT:
       case GL_GREEN_INTEGER_EXT:
@@ -799,6 +796,31 @@ _mesa_is_color_format(GLenum format)
       case GL_INTENSITY8I_EXT:
       case GL_LUMINANCE8I_EXT:
       case GL_LUMINANCE_ALPHA8I_EXT:
+      /* signed, normalized texture formats */
+      case GL_RED_SNORM:
+      case GL_R8_SNORM:
+      case GL_R16_SNORM:
+      case GL_RG_SNORM:
+      case GL_RG8_SNORM:
+      case GL_RG16_SNORM:
+      case GL_RGB_SNORM:
+      case GL_RGB8_SNORM:
+      case GL_RGB16_SNORM:
+      case GL_RGBA_SNORM:
+      case GL_RGBA8_SNORM:
+      case GL_RGBA16_SNORM:
+      case GL_ALPHA_SNORM:
+      case GL_ALPHA8_SNORM:
+      case GL_ALPHA16_SNORM:
+      case GL_LUMINANCE_SNORM:
+      case GL_LUMINANCE8_SNORM:
+      case GL_LUMINANCE16_SNORM:
+      case GL_LUMINANCE_ALPHA_SNORM:
+      case GL_LUMINANCE8_ALPHA8_SNORM:
+      case GL_LUMINANCE16_ALPHA16_SNORM:
+      case GL_INTENSITY_SNORM:
+      case GL_INTENSITY8_SNORM:
+      case GL_INTENSITY16_SNORM:
          return GL_TRUE;
       case GL_YCBCR_MESA:  /* not considered to be RGB */
          /* fall-through */
diff --git a/mesalib/src/mesa/main/macros.h b/mesalib/src/mesa/main/macros.h
index b2ec0ba9b..86a58cc6b 100644
--- a/mesalib/src/mesa/main/macros.h
+++ b/mesalib/src/mesa/main/macros.h
@@ -58,8 +58,7 @@ extern GLfloat _mesa_ubyte_to_float_color_tab[256];
 #define BYTE_TO_FLOAT_TEX(B)    ((B) == -128 ? -1.0F : (B) * (1.0F/127.0F))
 
 /** Convert GLfloat in [-1.0,1.0] to GLbyte in [-128,127], texture/fb data */
-#define FLOAT_TO_BYTE_TEX(X)    ( (GLint) (127.0F * (X)) )
-
+#define FLOAT_TO_BYTE_TEX(X)    CLAMP( (GLint) (127.0F * (X)), -128, 127 )
 
 /** Convert GLushort in [0,65535] to GLfloat in [0.0,1.0] */
 #define USHORT_TO_FLOAT(S)  ((GLfloat) (S) * (1.0F / 65535.0F))
diff --git a/mesalib/src/mesa/main/mtypes.h b/mesalib/src/mesa/main/mtypes.h
index 39577bb02..02676006a 100644
--- a/mesalib/src/mesa/main/mtypes.h
+++ b/mesalib/src/mesa/main/mtypes.h
@@ -691,7 +691,8 @@ struct gl_accum_attrib
 struct gl_colorbuffer_attrib
 {
    GLuint ClearIndex;			/**< Index to use for glClear */
-   GLclampf ClearColor[4];		/**< Color to use for glClear */
+   GLfloat ClearColorUnclamped[4];              /**< Color to use for glClear*/
+   GLclampf ClearColor[4];               /**< Color to use for glClear */
 
    GLuint IndexMask;			/**< Color index write mask */
    GLubyte ColorMask[MAX_DRAW_BUFFERS][4];/**< Each flag is 0xff or 0x0 */
@@ -704,6 +705,7 @@ struct gl_colorbuffer_attrib
    /*@{*/
    GLboolean AlphaEnabled;		/**< Alpha test enabled flag */
    GLenum AlphaFunc;			/**< Alpha test function */
+   GLfloat AlphaRefUnclamped;
    GLclampf AlphaRef;			/**< Alpha reference value */
    /*@}*/
 
@@ -712,7 +714,14 @@ struct gl_colorbuffer_attrib
     */
    /*@{*/
    GLbitfield BlendEnabled;		/**< Per-buffer blend enable flags */
+
+   /* NOTE: this does _not_ depend on fragment clamping or any other clamping control,
+    * only on the fixed-pointness of the render target.
+    * The query does however depend on fragment color clamping.
+    */
+   GLfloat BlendColorUnclamped[4];               /**< Blending color */
    GLfloat BlendColor[4];		/**< Blending color */
+
    struct
    {
       GLenum SrcRGB;             /**< RGB blend source term */
@@ -741,7 +750,9 @@ struct gl_colorbuffer_attrib
    GLboolean DitherFlag;		/**< Dither enable flag */
 
    GLenum ClampFragmentColor; /**< GL_TRUE, GL_FALSE or GL_FIXED_ONLY_ARB */
+   GLboolean _ClampFragmentColor; /** < with GL_FIXED_ONLY_ARB resolved */
    GLenum ClampReadColor;     /**< GL_TRUE, GL_FALSE or GL_FIXED_ONLY_ARB */
+   GLboolean _ClampReadColor;     /** < with GL_FIXED_ONLY_ARB resolved */
 
    GLboolean sRGBEnabled;	/**< Framebuffer sRGB blending/updating requested */
 };
@@ -840,6 +851,7 @@ struct gl_eval_attrib
 struct gl_fog_attrib
 {
    GLboolean Enabled;		/**< Fog enabled flag */
+   GLfloat ColorUnclamped[4];            /**< Fog color */
    GLfloat Color[4];		/**< Fog color */
    GLfloat Density;		/**< Density >= 0.0 */
    GLfloat Start;		/**< Start distance in eye coords */
@@ -921,6 +933,7 @@ struct gl_light_attrib
    GLbitfield ColorMaterialBitmask;	/**< bitmask formed from Face and Mode */
    GLboolean ColorMaterialEnabled;
    GLenum ClampVertexColor;
+   GLboolean _ClampVertexColor;
 
    struct gl_light EnabledList;         /**< List sentinel */
 
@@ -1396,7 +1409,8 @@ struct gl_texture_unit
    GLbitfield _ReallyEnabled;   /**< 0 or exactly one of TEXTURE_*_BIT flags */
 
    GLenum EnvMode;              /**< GL_MODULATE, GL_DECAL, GL_BLEND, etc. */
-   GLfloat EnvColor[4];
+   GLclampf EnvColor[4];
+   GLfloat EnvColorUnclamped[4];
 
    struct gl_texgen GenS;
    struct gl_texgen GenT;
@@ -2704,6 +2718,7 @@ struct gl_extensions
    GLboolean dummy_false; /* Set false by _mesa_init_extensions(). */
    GLboolean ARB_ES2_compatibility;
    GLboolean ARB_blend_func_extended;
+   GLboolean ARB_color_buffer_float;
    GLboolean ARB_copy_buffer;
    GLboolean ARB_depth_buffer_float;
    GLboolean ARB_depth_clamp;
@@ -2813,6 +2828,7 @@ struct gl_extensions
    GLboolean EXT_texture_lod_bias;
    GLboolean EXT_texture_mirror_clamp;
    GLboolean EXT_texture_shared_exponent;
+   GLboolean EXT_texture_snorm;
    GLboolean EXT_texture_sRGB;
    GLboolean EXT_texture_sRGB_decode;
    GLboolean EXT_texture_swizzle;
@@ -2840,7 +2856,6 @@ struct gl_extensions
    GLboolean MESA_resize_buffers;
    GLboolean MESA_ycbcr_texture;
    GLboolean MESA_texture_array;
-   GLboolean MESA_texture_signed_rgba;
    GLboolean NV_blend_square;
    GLboolean NV_conditional_render;
    GLboolean NV_fragment_program;
@@ -2933,6 +2948,7 @@ struct gl_matrix_stack
 #define _NEW_PROGRAM           (1 << 26)  /**< New program/shader state */
 #define _NEW_PROGRAM_CONSTANTS (1 << 27)
 #define _NEW_BUFFER_OBJECT     (1 << 28)
+#define _NEW_FRAG_CLAMP        (1 << 29)
 #define _NEW_ALL ~0
 /*@}*/
 
diff --git a/mesalib/src/mesa/main/pack.c b/mesalib/src/mesa/main/pack.c
index 6463ddfbd..02154585a 100644
--- a/mesalib/src/mesa/main/pack.c
+++ b/mesalib/src/mesa/main/pack.c
@@ -1,5064 +1,5053 @@
-/*
- * Mesa 3-D graphics library
- *
- * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
- * Copyright (C) 2009-2010  VMware, Inc.  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"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THEA AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-
-/**
- * \file pack.c
- * Image and pixel span packing and unpacking.
- */
-
-
-#include "glheader.h"
-#include "colormac.h"
-#include "enums.h"
-#include "image.h"
-#include "imports.h"
-#include "mtypes.h"
-#include "pack.h"
-#include "pixeltransfer.h"
-#include "imports.h"
-
-
-/**
- * NOTE:
- * Normally, BYTE_TO_FLOAT(0) returns 0.00392  That causes problems when
- * we later convert the float to a packed integer value (such as for
- * GL_RGB5_A1) because we'll wind up with a non-zero value.
- *
- * We redefine the macros here so zero is handled correctly.
- */
-#undef BYTE_TO_FLOAT
-#define BYTE_TO_FLOAT(B)    ((B) == 0 ? 0.0F : ((2.0F * (B) + 1.0F) * (1.0F/255.0F)))
-
-#undef SHORT_TO_FLOAT
-#define SHORT_TO_FLOAT(S)   ((S) == 0 ? 0.0F : ((2.0F * (S) + 1.0F) * (1.0F/65535.0F)))
-
-
-
-/** Compute ceiling of integer quotient of A divided by B. */
-#define CEILING( A, B )  ( (A) % (B) == 0 ? (A)/(B) : (A)/(B)+1 )
-
-
-/**
- * Flip the 8 bits in each byte of the given array.
- *
- * \param p array.
- * \param n number of bytes.
- *
- * \todo try this trick to flip bytes someday:
- * \code
- *  v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
- *  v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
- *  v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
- * \endcode
- */
-static void
-flip_bytes( GLubyte *p, GLuint n )
-{
-   GLuint i, a, b;
-   for (i = 0; i < n; i++) {
-      b = (GLuint) p[i];        /* words are often faster than bytes */
-      a = ((b & 0x01) << 7) |
-	  ((b & 0x02) << 5) |
-	  ((b & 0x04) << 3) |
-	  ((b & 0x08) << 1) |
-	  ((b & 0x10) >> 1) |
-	  ((b & 0x20) >> 3) |
-	  ((b & 0x40) >> 5) |
-	  ((b & 0x80) >> 7);
-      p[i] = (GLubyte) a;
-   }
-}
-
-
-
-/*
- * Unpack a 32x32 pixel polygon stipple from user memory using the
- * current pixel unpack settings.
- */
-void
-_mesa_unpack_polygon_stipple( const GLubyte *pattern, GLuint dest[32],
-                              const struct gl_pixelstore_attrib *unpacking )
-{
-   GLubyte *ptrn = (GLubyte *) _mesa_unpack_bitmap(32, 32, pattern, unpacking);
-   if (ptrn) {
-      /* Convert pattern from GLubytes to GLuints and handle big/little
-       * endian differences
-       */
-      GLubyte *p = ptrn;
-      GLint i;
-      for (i = 0; i < 32; i++) {
-         dest[i] = (p[0] << 24)
-                 | (p[1] << 16)
-                 | (p[2] <<  8)
-                 | (p[3]      );
-         p += 4;
-      }
-      free(ptrn);
-   }
-}
-
-
-/*
- * Pack polygon stipple into user memory given current pixel packing
- * settings.
- */
-void
-_mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest,
-                            const struct gl_pixelstore_attrib *packing )
-{
-   /* Convert pattern from GLuints to GLubytes to handle big/little
-    * endian differences.
-    */
-   GLubyte ptrn[32*4];
-   GLint i;
-   for (i = 0; i < 32; i++) {
-      ptrn[i * 4 + 0] = (GLubyte) ((pattern[i] >> 24) & 0xff);
-      ptrn[i * 4 + 1] = (GLubyte) ((pattern[i] >> 16) & 0xff);
-      ptrn[i * 4 + 2] = (GLubyte) ((pattern[i] >> 8 ) & 0xff);
-      ptrn[i * 4 + 3] = (GLubyte) ((pattern[i]      ) & 0xff);
-   }
-
-   _mesa_pack_bitmap(32, 32, ptrn, dest, packing);
-}
-
-
-/*
- * Unpack bitmap data.  Resulting data will be in most-significant-bit-first
- * order with row alignment = 1 byte.
- */
-GLvoid *
-_mesa_unpack_bitmap( GLint width, GLint height, const GLubyte *pixels,
-                     const struct gl_pixelstore_attrib *packing )
-{
-   GLint bytes, row, width_in_bytes;
-   GLubyte *buffer, *dst;
-
-   if (!pixels)
-      return NULL;
-
-   /* Alloc dest storage */
-   bytes = ((width + 7) / 8 * height);
-   buffer = (GLubyte *) malloc( bytes );
-   if (!buffer)
-      return NULL;
-
-   width_in_bytes = CEILING( width, 8 );
-   dst = buffer;
-   for (row = 0; row < height; row++) {
-      const GLubyte *src = (const GLubyte *)
-         _mesa_image_address2d(packing, pixels, width, height,
-                               GL_COLOR_INDEX, GL_BITMAP, row, 0);
-      if (!src) {
-         free(buffer);
-         return NULL;
-      }
-
-      if ((packing->SkipPixels & 7) == 0) {
-         memcpy( dst, src, width_in_bytes );
-         if (packing->LsbFirst) {
-            flip_bytes( dst, width_in_bytes );
-         }
-      }
-      else {
-         /* handling SkipPixels is a bit tricky (no pun intended!) */
-         GLint i;
-         if (packing->LsbFirst) {
-            GLubyte srcMask = 1 << (packing->SkipPixels & 0x7);
-            GLubyte dstMask = 128;
-            const GLubyte *s = src;
-            GLubyte *d = dst;
-            *d = 0;
-            for (i = 0; i < width; i++) {
-               if (*s & srcMask) {
-                  *d |= dstMask;
-               }
-               if (srcMask == 128) {
-                  srcMask = 1;
-                  s++;
-               }
-               else {
-                  srcMask = srcMask << 1;
-               }
-               if (dstMask == 1) {
-                  dstMask = 128;
-                  d++;
-                  *d = 0;
-               }
-               else {
-                  dstMask = dstMask >> 1;
-               }
-            }
-         }
-         else {
-            GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7);
-            GLubyte dstMask = 128;
-            const GLubyte *s = src;
-            GLubyte *d = dst;
-            *d = 0;
-            for (i = 0; i < width; i++) {
-               if (*s & srcMask) {
-                  *d |= dstMask;
-               }
-               if (srcMask == 1) {
-                  srcMask = 128;
-                  s++;
-               }
-               else {
-                  srcMask = srcMask >> 1;
-               }
-               if (dstMask == 1) {
-                  dstMask = 128;
-                  d++;
-                  *d = 0;
-               }
-               else {
-                  dstMask = dstMask >> 1;
-               }
-            }
-         }
-      }
-      dst += width_in_bytes;
-   }
-
-   return buffer;
-}
-
-
-/*
- * Pack bitmap data.
- */
-void
-_mesa_pack_bitmap( GLint width, GLint height, const GLubyte *source,
-                   GLubyte *dest, const struct gl_pixelstore_attrib *packing )
-{
-   GLint row, width_in_bytes;
-   const GLubyte *src;
-
-   if (!source)
-      return;
-
-   width_in_bytes = CEILING( width, 8 );
-   src = source;
-   for (row = 0; row < height; row++) {
-      GLubyte *dst = (GLubyte *) _mesa_image_address2d(packing, dest,
-                       width, height, GL_COLOR_INDEX, GL_BITMAP, row, 0);
-      if (!dst)
-         return;
-
-      if ((packing->SkipPixels & 7) == 0) {
-         memcpy( dst, src, width_in_bytes );
-         if (packing->LsbFirst) {
-            flip_bytes( dst, width_in_bytes );
-         }
-      }
-      else {
-         /* handling SkipPixels is a bit tricky (no pun intended!) */
-         GLint i;
-         if (packing->LsbFirst) {
-            GLubyte srcMask = 128;
-            GLubyte dstMask = 1 << (packing->SkipPixels & 0x7);
-            const GLubyte *s = src;
-            GLubyte *d = dst;
-            *d = 0;
-            for (i = 0; i < width; i++) {
-               if (*s & srcMask) {
-                  *d |= dstMask;
-               }
-               if (srcMask == 1) {
-                  srcMask = 128;
-                  s++;
-               }
-               else {
-                  srcMask = srcMask >> 1;
-               }
-               if (dstMask == 128) {
-                  dstMask = 1;
-                  d++;
-                  *d = 0;
-               }
-               else {
-                  dstMask = dstMask << 1;
-               }
-            }
-         }
-         else {
-            GLubyte srcMask = 128;
-            GLubyte dstMask = 128 >> (packing->SkipPixels & 0x7);
-            const GLubyte *s = src;
-            GLubyte *d = dst;
-            *d = 0;
-            for (i = 0; i < width; i++) {
-               if (*s & srcMask) {
-                  *d |= dstMask;
-               }
-               if (srcMask == 1) {
-                  srcMask = 128;
-                  s++;
-               }
-               else {
-                  srcMask = srcMask >> 1;
-               }
-               if (dstMask == 1) {
-                  dstMask = 128;
-                  d++;
-                  *d = 0;
-               }
-               else {
-                  dstMask = dstMask >> 1;
-               }
-            }
-         }
-      }
-      src += width_in_bytes;
-   }
-}
-
-
-/**
- * Get indexes of color components for a basic color format, such as
- * GL_RGBA, GL_RED, GL_LUMINANCE_ALPHA, etc.  Return -1 for indexes
- * that do not apply.
- */
-static void
-get_component_indexes(GLenum format,
-                      GLint *redIndex,
-                      GLint *greenIndex,
-                      GLint *blueIndex,
-                      GLint *alphaIndex,
-                      GLint *luminanceIndex,
-                      GLint *intensityIndex)
-{
-   *redIndex = -1;
-   *greenIndex = -1;
-   *blueIndex = -1;
-   *alphaIndex = -1;
-   *luminanceIndex = -1;
-   *intensityIndex = -1;
-
-   switch (format) {
-   case GL_LUMINANCE:
-   case GL_LUMINANCE_INTEGER_EXT:
-      *luminanceIndex = 0;
-      break;
-   case GL_LUMINANCE_ALPHA:
-   case GL_LUMINANCE_ALPHA_INTEGER_EXT:
-      *luminanceIndex = 0;
-      *alphaIndex = 1;
-      break;
-   case GL_INTENSITY:
-      *intensityIndex = 0;
-      break;
-   case GL_RED:
-   case GL_RED_INTEGER_EXT:
-      *redIndex = 0;
-      break;
-   case GL_GREEN:
-   case GL_GREEN_INTEGER_EXT:
-      *greenIndex = 0;
-      break;
-   case GL_BLUE:
-   case GL_BLUE_INTEGER_EXT:
-      *blueIndex = 0;
-      break;
-   case GL_ALPHA:
-   case GL_ALPHA_INTEGER_EXT:
-      *alphaIndex = 0;
-      break;
-   case GL_RG:
-   case GL_RG_INTEGER:
-      *redIndex = 0;
-      *greenIndex = 1;
-      break;
-   case GL_RGB:
-   case GL_RGB_INTEGER_EXT:
-      *redIndex = 0;
-      *greenIndex = 1;
-      *blueIndex = 2;
-      break;
-   case GL_BGR:
-   case GL_BGR_INTEGER_EXT:
-      *blueIndex = 0;
-      *greenIndex = 1;
-      *redIndex = 2;
-      break;
-   case GL_RGBA:
-   case GL_RGBA_INTEGER_EXT:
-      *redIndex = 0;
-      *greenIndex = 1;
-      *blueIndex = 2;
-      *alphaIndex = 3;
-      break;
-   case GL_BGRA:
-   case GL_BGRA_INTEGER:
-      *redIndex = 2;
-      *greenIndex = 1;
-      *blueIndex = 0;
-      *alphaIndex = 3;
-      break;
-   case GL_ABGR_EXT:
-      *redIndex = 3;
-      *greenIndex = 2;
-      *blueIndex = 1;
-      *alphaIndex = 0;
-      break;
-   case GL_DU8DV8_ATI:
-   case GL_DUDV_ATI:
-      *redIndex = 0;
-      *greenIndex = 1;
-      break;
-   default:
-      assert(0 && "bad format in get_component_indexes()");
-   }
-}
-
-
-
-/**
- * For small integer types, return the min and max possible values.
- * Used for clamping floats to unscaled integer types.
- * \return GL_TRUE if type is handled, GL_FALSE otherwise.
- */
-static GLboolean
-get_type_min_max(GLenum type, GLfloat *min, GLfloat *max)
-{
-   switch (type) {
-   case GL_BYTE:
-      *min = -128.0;
-      *max = 127.0;
-      return GL_TRUE;
-   case GL_UNSIGNED_BYTE:
-      *min = 0.0;
-      *max = 255.0;
-      return GL_TRUE;
-   case GL_SHORT:
-      *min = -32768.0;
-      *max = 32767.0;
-      return GL_TRUE;
-   case GL_UNSIGNED_SHORT:
-      *min = 0.0;
-      *max = 65535.0;
-      return GL_TRUE;
-   default:
-      return GL_FALSE;
-   }
-}
-
-
-
-/**
- * Used to pack an array [][4] of RGBA float colors as specified
- * by the dstFormat, dstType and dstPacking.  Used by glReadPixels.
- * Historically, the RGBA values were in [0,1] and rescaled to fit
- * into GLubytes, etc.  But with new integer formats, the RGBA values
- * may have any value and we don't always rescale when converting to
- * integers.
- *
- * Note: the rgba values will be modified by this function when any pixel
- * transfer ops are enabled.
- */
-void
-_mesa_pack_rgba_span_float(struct gl_context *ctx, GLuint n, GLfloat rgba[][4],
-                           GLenum dstFormat, GLenum dstType,
-                           GLvoid *dstAddr,
-                           const struct gl_pixelstore_attrib *dstPacking,
-                           GLbitfield transferOps)
-{
-   GLfloat *luminance;
-   const GLint comps = _mesa_components_in_format(dstFormat);
-   const GLboolean intDstFormat = _mesa_is_integer_format(dstFormat);
-   GLuint i;
-
-   if (dstFormat == GL_LUMINANCE ||
-       dstFormat == GL_LUMINANCE_ALPHA ||
-       dstFormat == GL_LUMINANCE_INTEGER_EXT ||
-       dstFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT) {
-      luminance = (GLfloat *) malloc(n * sizeof(GLfloat));
-      if (!luminance) {
-         _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing");
-         return;
-      }
-   }
-   else {
-      luminance = NULL;
-   }
-
-   /* XXX
-    * This test should probably go away.  Have the caller set/clear the
-    * IMAGE_CLAMP_BIT as needed.
-    */
-   if (dstType != GL_FLOAT || ctx->Color.ClampReadColor == GL_TRUE) {
-      if (!intDstFormat) {
-         /* need to clamp to [0, 1] */
-         transferOps |= IMAGE_CLAMP_BIT;
-      }
-   }
-
-   if (transferOps) {
-      _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
-   }
-
-   /*
-    * Component clamping (besides clamping to [0,1] in
-    * _mesa_apply_rgba_transfer_ops()).
-    */
-   if (intDstFormat) {
-      /* clamping to dest type's min/max values */
-      GLfloat min, max;
-      if (get_type_min_max(dstType, &min, &max)) {
-         for (i = 0; i < n; i++) {
-            rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], min, max);
-            rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], min, max);
-            rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], min, max);
-            rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], min, max);
-         }
-      }
-   }
-   else if (dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA) {
-      /* compute luminance values */
-      if (transferOps & IMAGE_CLAMP_BIT) {
-         for (i = 0; i < n; i++) {
-            GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
-            luminance[i] = CLAMP(sum, 0.0F, 1.0F);
-         }
-      }
-      else {
-         for (i = 0; i < n; i++) {
-            luminance[i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
-         }
-      }
-   }
-
-   /*
-    * Pack/store the pixels.  Ugh!  Lots of cases!!!
-    */
-   switch (dstType) {
-      case GL_UNSIGNED_BYTE:
-         {
-            GLubyte *dst = (GLubyte *) dstAddr;
-            switch (dstFormat) {
-               case GL_RED:
-                  for (i=0;i<n;i++)
-                     dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
-                  break;
-               case GL_GREEN:
-                  for (i=0;i<n;i++)
-                     dst[i] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
-                  break;
-               case GL_BLUE:
-                  for (i=0;i<n;i++)
-                     dst[i] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
-                  break;
-               case GL_ALPHA:
-                  for (i=0;i<n;i++)
-                     dst[i] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
-                  break;
-               case GL_LUMINANCE:
-                  for (i=0;i<n;i++)
-                     dst[i] = FLOAT_TO_UBYTE(luminance[i]);
-                  break;
-               case GL_LUMINANCE_ALPHA:
-                  for (i=0;i<n;i++) {
-                     dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]);
-                     dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
-                  }
-                  break;
-               case GL_RG:
-                  for (i=0;i<n;i++) {
-                     dst[i*2+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
-                     dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
-                  }
-                  break;
-               case GL_RGB:
-                  for (i=0;i<n;i++) {
-                     dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
-                     dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
-                     dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
-                  }
-                  break;
-               case GL_RGBA:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
-                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
-                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
-                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
-                  }
-                  break;
-               case GL_BGR:
-                  for (i=0;i<n;i++) {
-                     dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
-                     dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
-                     dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
-                  }
-                  break;
-               case GL_BGRA:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
-                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
-                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
-                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
-                  }
-                  break;
-               case GL_ABGR_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
-                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
-                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
-                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
-                  }
-                  break;
-               case GL_RED_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLubyte) rgba[i][RCOMP];
-                  }
-                  break;
-               case GL_GREEN_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLubyte) rgba[i][GCOMP];
-                  }
-                  break;
-               case GL_BLUE_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLubyte) rgba[i][BCOMP];
-                  }
-                  break;
-               case GL_ALPHA_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLubyte) rgba[i][ACOMP];
-                  }
-                  break;
-               case GL_RGB_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*3+0] = (GLubyte) rgba[i][RCOMP];
-                     dst[i*3+1] = (GLubyte) rgba[i][GCOMP];
-                     dst[i*3+2] = (GLubyte) rgba[i][BCOMP];
-                  }
-                  break;
-               case GL_RGBA_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = (GLubyte) rgba[i][RCOMP];
-                     dst[i*4+1] = (GLubyte) rgba[i][GCOMP];
-                     dst[i*4+2] = (GLubyte) rgba[i][BCOMP];
-                     dst[i*4+3] = (GLubyte) rgba[i][ACOMP];
-                  }
-                  break;
-               case GL_BGR_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*3+0] = (GLubyte) rgba[i][BCOMP];
-                     dst[i*3+1] = (GLubyte) rgba[i][GCOMP];
-                     dst[i*3+2] = (GLubyte) rgba[i][RCOMP];
-                  }
-                  break;
-               case GL_BGRA_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = (GLubyte) rgba[i][BCOMP];
-                     dst[i*4+1] = (GLubyte) rgba[i][GCOMP];
-                     dst[i*4+2] = (GLubyte) rgba[i][RCOMP];
-                     dst[i*4+3] = (GLubyte) rgba[i][ACOMP];
-                  }
-                  break;
-               case GL_LUMINANCE_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*2+0] = (GLubyte) (rgba[i][RCOMP] +
-                                             rgba[i][GCOMP] +
-                                             rgba[i][BCOMP]);
-                     dst[i*2+1] = (GLubyte) rgba[i][ACOMP];
-                  }
-                  break;
-               case GL_LUMINANCE_ALPHA_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLubyte) (rgba[i][RCOMP] +
-                                         rgba[i][GCOMP] +
-                                         rgba[i][BCOMP]);
-                  }
-                  break;
-               case GL_DUDV_ATI:
-               case GL_DU8DV8_ATI:
-                  for (i=0;i<n;i++) {
-                     dst[i*2+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
-                     dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
-                  }
-                  break;
-               default:
-                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
-            }
-         }
-         break;
-      case GL_BYTE:
-         {
-            GLbyte *dst = (GLbyte *) dstAddr;
-            switch (dstFormat) {
-               case GL_RED:
-                  for (i=0;i<n;i++)
-                     dst[i] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
-                  break;
-               case GL_GREEN:
-                  for (i=0;i<n;i++)
-                     dst[i] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
-                  break;
-               case GL_BLUE:
-                  for (i=0;i<n;i++)
-                     dst[i] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
-                  break;
-               case GL_ALPHA:
-                  for (i=0;i<n;i++)
-                     dst[i] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
-                  break;
-               case GL_LUMINANCE:
-                  for (i=0;i<n;i++)
-                     dst[i] = FLOAT_TO_BYTE(luminance[i]);
-                  break;
-               case GL_LUMINANCE_ALPHA:
-                  for (i=0;i<n;i++) {
-                     dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]);
-                     dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
-                  }
-                  break;
-               case GL_RG:
-                  for (i=0;i<n;i++) {
-                     dst[i*2+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
-                     dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
-                  }
-                  break;
-               case GL_RGB:
-                  for (i=0;i<n;i++) {
-                     dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
-                     dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
-                     dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
-                  }
-                  break;
-               case GL_RGBA:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
-                     dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
-                     dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
-                     dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
-                  }
-                  break;
-               case GL_BGR:
-                  for (i=0;i<n;i++) {
-                     dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
-                     dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
-                     dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
-                  }
-                  break;
-               case GL_BGRA:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
-                     dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
-                     dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
-                     dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
-                  }
-		  break;
-               case GL_ABGR_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
-                     dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
-                     dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
-                     dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
-                  }
-                  break;
-               case GL_RED_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLbyte) rgba[i][RCOMP];
-                  }
-                  break;
-               case GL_GREEN_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLbyte) rgba[i][GCOMP];
-                  }
-                  break;
-               case GL_BLUE_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLbyte) rgba[i][BCOMP];
-                  }
-                  break;
-               case GL_ALPHA_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLbyte) rgba[i][ACOMP];
-                  }
-                  break;
-               case GL_RGB_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*3+0] = (GLbyte) rgba[i][RCOMP];
-                     dst[i*3+1] = (GLbyte) rgba[i][GCOMP];
-                     dst[i*3+2] = (GLbyte) rgba[i][BCOMP];
-                  }
-                  break;
-               case GL_RGBA_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = (GLbyte) rgba[i][RCOMP];
-                     dst[i*4+1] = (GLbyte) rgba[i][GCOMP];
-                     dst[i*4+2] = (GLbyte) rgba[i][BCOMP];
-                     dst[i*4+3] = (GLbyte) rgba[i][ACOMP];
-                  }
-                  break;
-               case GL_BGR_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*3+0] = (GLbyte) rgba[i][BCOMP];
-                     dst[i*3+1] = (GLbyte) rgba[i][GCOMP];
-                     dst[i*3+2] = (GLbyte) rgba[i][RCOMP];
-                  }
-                  break;
-               case GL_BGRA_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = (GLbyte) rgba[i][BCOMP];
-                     dst[i*4+1] = (GLbyte) rgba[i][GCOMP];
-                     dst[i*4+2] = (GLbyte) rgba[i][RCOMP];
-                     dst[i*4+3] = (GLbyte) rgba[i][ACOMP];
-                  }
-                  break;
-               case GL_LUMINANCE_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*2+0] = (GLbyte) (rgba[i][RCOMP] +
-                                            rgba[i][GCOMP] +
-                                            rgba[i][BCOMP]);
-                     dst[i*2+1] = (GLbyte) rgba[i][ACOMP];
-                  }
-                  break;
-               case GL_LUMINANCE_ALPHA_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLbyte) (rgba[i][RCOMP] +
-                                        rgba[i][GCOMP] +
-                                        rgba[i][BCOMP]);
-                  }
-                  break;
-               case GL_DUDV_ATI:
-               case GL_DU8DV8_ATI:
-                  for (i=0;i<n;i++) {
-                     dst[i*2+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
-                     dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
-                  }
-                  break;
-               default:
-                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
-            }
-         }
-         break;
-      case GL_UNSIGNED_SHORT:
-         {
-            GLushort *dst = (GLushort *) dstAddr;
-            switch (dstFormat) {
-               case GL_RED:
-                  for (i=0;i<n;i++)
-                     CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][RCOMP]);
-                  break;
-               case GL_GREEN:
-                  for (i=0;i<n;i++)
-                     CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][GCOMP]);
-                  break;
-               case GL_BLUE:
-                  for (i=0;i<n;i++)
-                     CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][BCOMP]);
-                  break;
-               case GL_ALPHA:
-                  for (i=0;i<n;i++)
-                     CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][ACOMP]);
-                  break;
-               case GL_LUMINANCE:
-                  for (i=0;i<n;i++)
-                     UNCLAMPED_FLOAT_TO_USHORT(dst[i], luminance[i]);
-                  break;
-               case GL_LUMINANCE_ALPHA:
-                  for (i=0;i<n;i++) {
-                     UNCLAMPED_FLOAT_TO_USHORT(dst[i*2+0], luminance[i]);
-                     CLAMPED_FLOAT_TO_USHORT(dst[i*2+1], rgba[i][ACOMP]);
-                  }
-                  break;
-               case GL_RG:
-                  for (i=0;i<n;i++) {
-                     CLAMPED_FLOAT_TO_USHORT(dst[i*2+0], rgba[i][RCOMP]);
-                     CLAMPED_FLOAT_TO_USHORT(dst[i*2+1], rgba[i][GCOMP]);
-                  }
-                  break;
-               case GL_RGB:
-                  for (i=0;i<n;i++) {
-                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][RCOMP]);
-                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]);
-                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][BCOMP]);
-                  }
-                  break;
-               case GL_RGBA:
-                  for (i=0;i<n;i++) {
-                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][RCOMP]);
-                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]);
-                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][BCOMP]);
-                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]);
-                  }
-                  break;
-               case GL_BGR:
-                  for (i=0;i<n;i++) {
-                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][BCOMP]);
-                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]);
-                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][RCOMP]);
-                  }
-                  break;
-               case GL_BGRA:
-                  for (i=0;i<n;i++) {
-                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][BCOMP]);
-                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]);
-                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][RCOMP]);
-                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]);
-                  }
-                  break;
-               case GL_ABGR_EXT:
-                  for (i=0;i<n;i++) {
-                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][ACOMP]);
-                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][BCOMP]);
-                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][GCOMP]);
-                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][RCOMP]);
-                  }
-                  break;
-               case GL_RED_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLushort) rgba[i][RCOMP];
-                  }
-                  break;
-               case GL_GREEN_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLushort) rgba[i][GCOMP];
-                  }
-                  break;
-               case GL_BLUE_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLushort) rgba[i][BCOMP];
-                  }
-                  break;
-               case GL_ALPHA_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLushort) rgba[i][ACOMP];
-                  }
-                  break;
-               case GL_RGB_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*3+0] = (GLushort) rgba[i][RCOMP];
-                     dst[i*3+1] = (GLushort) rgba[i][GCOMP];
-                     dst[i*3+2] = (GLushort) rgba[i][BCOMP];
-                  }
-                  break;
-               case GL_RGBA_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = (GLushort) rgba[i][RCOMP];
-                     dst[i*4+1] = (GLushort) rgba[i][GCOMP];
-                     dst[i*4+2] = (GLushort) rgba[i][BCOMP];
-                     dst[i*4+3] = (GLushort) rgba[i][ACOMP];
-                  }
-                  break;
-               case GL_BGR_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*3+0] = (GLushort) rgba[i][BCOMP];
-                     dst[i*3+1] = (GLushort) rgba[i][GCOMP];
-                     dst[i*3+2] = (GLushort) rgba[i][RCOMP];
-                  }
-                  break;
-               case GL_BGRA_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = (GLushort) rgba[i][BCOMP];
-                     dst[i*4+1] = (GLushort) rgba[i][GCOMP];
-                     dst[i*4+2] = (GLushort) rgba[i][RCOMP];
-                     dst[i*4+3] = (GLushort) rgba[i][ACOMP];
-                  }
-                  break;
-               case GL_LUMINANCE_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*2+0] = (GLushort) (rgba[i][RCOMP] +
-                                              rgba[i][GCOMP] +
-                                              rgba[i][BCOMP]);
-                     dst[i*2+1] = (GLushort) rgba[i][ACOMP];
-                  }
-                  break;
-               case GL_LUMINANCE_ALPHA_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLushort) (rgba[i][RCOMP] +
-                                          rgba[i][GCOMP] +
-                                          rgba[i][BCOMP]);
-                  }
-                  break;
-               case GL_DUDV_ATI:
-               case GL_DU8DV8_ATI:
-                  for (i=0;i<n;i++) {
-                     dst[i*2+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
-                     dst[i*2+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
-                  }
-                  break;
-               default:
-                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
-            }
-         }
-         break;
-      case GL_SHORT:
-         {
-            GLshort *dst = (GLshort *) dstAddr;
-            switch (dstFormat) {
-               case GL_RED:
-                  for (i=0;i<n;i++)
-                     dst[i] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
-                  break;
-               case GL_GREEN:
-                  for (i=0;i<n;i++)
-                     dst[i] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
-                  break;
-               case GL_BLUE:
-                  for (i=0;i<n;i++)
-                     dst[i] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
-                  break;
-               case GL_ALPHA:
-                  for (i=0;i<n;i++)
-                     dst[i] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
-                  break;
-               case GL_LUMINANCE:
-                  for (i=0;i<n;i++)
-                     dst[i] = FLOAT_TO_SHORT(luminance[i]);
-                  break;
-               case GL_LUMINANCE_ALPHA:
-                  for (i=0;i<n;i++) {
-                     dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]);
-                     dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
-                  }
-                  break;
-               case GL_RG:
-                  for (i=0;i<n;i++) {
-                     dst[i*2+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
-                     dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
-                  }
-                  break;
-               case GL_RGB:
-                  for (i=0;i<n;i++) {
-                     dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
-                     dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
-                     dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
-                  }
-                  break;
-               case GL_RGBA:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
-                     dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
-                     dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
-                     dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
-                  }
-                  break;
-               case GL_BGR:
-                  for (i=0;i<n;i++) {
-                     dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
-                     dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
-                     dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
-                  }
-                  break;
-               case GL_BGRA:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
-                     dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
-                     dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
-                     dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
-                  }
-		  break;
-               case GL_ABGR_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
-                     dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
-                     dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
-                     dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
-                  }
-                  break;
-               case GL_RED_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLshort) rgba[i][RCOMP];
-                  }
-                  break;
-               case GL_GREEN_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLshort) rgba[i][GCOMP];
-                  }
-                  break;
-               case GL_BLUE_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLshort) rgba[i][BCOMP];
-                  }
-                  break;
-               case GL_ALPHA_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLshort) rgba[i][ACOMP];
-                  }
-                  break;
-               case GL_RGB_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*3+0] = (GLshort) rgba[i][RCOMP];
-                     dst[i*3+1] = (GLshort) rgba[i][GCOMP];
-                     dst[i*3+2] = (GLshort) rgba[i][BCOMP];
-                  }
-                  break;
-               case GL_RGBA_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = (GLshort) rgba[i][RCOMP];
-                     dst[i*4+1] = (GLshort) rgba[i][GCOMP];
-                     dst[i*4+2] = (GLshort) rgba[i][BCOMP];
-                     dst[i*4+3] = (GLshort) rgba[i][ACOMP];
-                  }
-                  break;
-               case GL_BGR_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*3+0] = (GLshort) rgba[i][BCOMP];
-                     dst[i*3+1] = (GLshort) rgba[i][GCOMP];
-                     dst[i*3+2] = (GLshort) rgba[i][RCOMP];
-                  }
-                  break;
-               case GL_BGRA_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = (GLshort) rgba[i][BCOMP];
-                     dst[i*4+1] = (GLshort) rgba[i][GCOMP];
-                     dst[i*4+2] = (GLshort) rgba[i][RCOMP];
-                     dst[i*4+3] = (GLshort) rgba[i][ACOMP];
-                  }
-                  break;
-               case GL_LUMINANCE_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*2+0] = (GLshort) (rgba[i][RCOMP] +
-                                             rgba[i][GCOMP] +
-                                             rgba[i][BCOMP]);
-                     dst[i*2+1] = (GLshort) rgba[i][ACOMP];
-                  }
-                  break;
-               case GL_LUMINANCE_ALPHA_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLshort) (rgba[i][RCOMP] +
-                                         rgba[i][GCOMP] +
-                                         rgba[i][BCOMP]);
-                  }
-                  break;
-               case GL_DUDV_ATI:
-               case GL_DU8DV8_ATI:
-                  for (i=0;i<n;i++) {
-                     dst[i*2+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
-                     dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
-                  }
-                  break;
-               default:
-                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
-            }
-         }
-         break;
-      case GL_UNSIGNED_INT:
-         {
-            GLuint *dst = (GLuint *) dstAddr;
-            switch (dstFormat) {
-               case GL_RED:
-                  for (i=0;i<n;i++)
-                     dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]);
-                  break;
-               case GL_GREEN:
-                  for (i=0;i<n;i++)
-                     dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]);
-                  break;
-               case GL_BLUE:
-                  for (i=0;i<n;i++)
-                     dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]);
-                  break;
-               case GL_ALPHA:
-                  for (i=0;i<n;i++)
-                     dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]);
-                  break;
-               case GL_LUMINANCE:
-                  for (i=0;i<n;i++)
-                     dst[i] = FLOAT_TO_UINT(luminance[i]);
-                  break;
-               case GL_LUMINANCE_ALPHA:
-                  for (i=0;i<n;i++) {
-                     dst[i*2+0] = FLOAT_TO_UINT(luminance[i]);
-                     dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]);
-                  }
-                  break;
-               case GL_RG:
-                  for (i=0;i<n;i++) {
-                     dst[i*2+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
-                     dst[i*2+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
-                  }
-                  break;
-               case GL_RGB:
-                  for (i=0;i<n;i++) {
-                     dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
-                     dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
-                     dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
-                  }
-                  break;
-               case GL_RGBA:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
-                     dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
-                     dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
-                     dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
-                  }
-                  break;
-               case GL_BGR:
-                  for (i=0;i<n;i++) {
-                     dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
-                     dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
-                     dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
-                  }
-                  break;
-               case GL_BGRA:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
-                     dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
-                     dst[i*4+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
-                     dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
-                  }
-                  break;
-               case GL_ABGR_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = FLOAT_TO_UINT(rgba[i][ACOMP]);
-                     dst[i*4+1] = FLOAT_TO_UINT(rgba[i][BCOMP]);
-                     dst[i*4+2] = FLOAT_TO_UINT(rgba[i][GCOMP]);
-                     dst[i*4+3] = FLOAT_TO_UINT(rgba[i][RCOMP]);
-                  }
-                  break;
-               case GL_RED_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLuint) rgba[i][RCOMP];
-                  }
-                  break;
-               case GL_GREEN_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLuint) rgba[i][GCOMP];
-                  }
-                  break;
-               case GL_BLUE_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLuint) rgba[i][BCOMP];
-                  }
-                  break;
-               case GL_ALPHA_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLuint) rgba[i][ACOMP];
-                  }
-                  break;
-               case GL_RGB_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*3+0] = (GLuint) rgba[i][RCOMP];
-                     dst[i*3+1] = (GLuint) rgba[i][GCOMP];
-                     dst[i*3+2] = (GLuint) rgba[i][BCOMP];
-                  }
-                  break;
-               case GL_RGBA_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = (GLuint) rgba[i][RCOMP];
-                     dst[i*4+1] = (GLuint) rgba[i][GCOMP];
-                     dst[i*4+2] = (GLuint) rgba[i][BCOMP];
-                     dst[i*4+3] = (GLuint) rgba[i][ACOMP];
-                  }
-                  break;
-               case GL_BGR_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*3+0] = (GLuint) rgba[i][BCOMP];
-                     dst[i*3+1] = (GLuint) rgba[i][GCOMP];
-                     dst[i*3+2] = (GLuint) rgba[i][RCOMP];
-                  }
-                  break;
-               case GL_BGRA_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = (GLuint) rgba[i][BCOMP];
-                     dst[i*4+1] = (GLuint) rgba[i][GCOMP];
-                     dst[i*4+2] = (GLuint) rgba[i][RCOMP];
-                     dst[i*4+3] = (GLuint) rgba[i][ACOMP];
-                  }
-                  break;
-               case GL_LUMINANCE_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*2+0] = (GLuint) (rgba[i][RCOMP] +
-                                            rgba[i][GCOMP] +
-                                            rgba[i][BCOMP]);
-                     dst[i*2+1] = (GLuint) rgba[i][ACOMP];
-                  }
-                  break;
-               case GL_LUMINANCE_ALPHA_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLuint) (rgba[i][RCOMP] +
-                                        rgba[i][GCOMP] +
-                                        rgba[i][BCOMP]);
-                  }
-                  break;
-               case GL_DUDV_ATI:
-               case GL_DU8DV8_ATI:
-                  for (i=0;i<n;i++) {
-                     dst[i*2+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
-                     dst[i*2+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
-                  }
-                  break;
-               default:
-                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
-            }
-         }
-         break;
-      case GL_INT:
-         {
-            GLint *dst = (GLint *) dstAddr;
-            switch (dstFormat) {
-               case GL_RED:
-                  for (i=0;i<n;i++)
-                     dst[i] = FLOAT_TO_INT(rgba[i][RCOMP]);
-                  break;
-               case GL_GREEN:
-                  for (i=0;i<n;i++)
-                     dst[i] = FLOAT_TO_INT(rgba[i][GCOMP]);
-                  break;
-               case GL_BLUE:
-                  for (i=0;i<n;i++)
-                     dst[i] = FLOAT_TO_INT(rgba[i][BCOMP]);
-                  break;
-               case GL_ALPHA:
-                  for (i=0;i<n;i++)
-                     dst[i] = FLOAT_TO_INT(rgba[i][ACOMP]);
-                  break;
-               case GL_LUMINANCE:
-                  for (i=0;i<n;i++)
-                     dst[i] = FLOAT_TO_INT(luminance[i]);
-                  break;
-               case GL_LUMINANCE_ALPHA:
-                  for (i=0;i<n;i++) {
-                     dst[i*2+0] = FLOAT_TO_INT(luminance[i]);
-                     dst[i*2+1] = FLOAT_TO_INT(rgba[i][ACOMP]);
-                  }
-                  break;
-               case GL_RG:
-                  for (i=0;i<n;i++) {
-                     dst[i*2+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
-                     dst[i*2+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
-                  }
-                  break;
-               case GL_RGB:
-                  for (i=0;i<n;i++) {
-                     dst[i*3+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
-                     dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
-                     dst[i*3+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
-                  }
-                  break;
-               case GL_RGBA:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
-                     dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
-                     dst[i*4+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
-                     dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
-                  }
-                  break;
-               case GL_BGR:
-                  for (i=0;i<n;i++) {
-                     dst[i*3+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
-                     dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
-                     dst[i*3+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
-                  }
-                  break;
-               case GL_BGRA:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
-                     dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
-                     dst[i*4+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
-                     dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
-                  }
-                  break;
-               case GL_ABGR_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = FLOAT_TO_INT(rgba[i][ACOMP]);
-                     dst[i*4+1] = FLOAT_TO_INT(rgba[i][BCOMP]);
-                     dst[i*4+2] = FLOAT_TO_INT(rgba[i][GCOMP]);
-                     dst[i*4+3] = FLOAT_TO_INT(rgba[i][RCOMP]);
-                  }
-                  break;
-               case GL_DUDV_ATI:
-               case GL_DU8DV8_ATI:
-                  for (i=0;i<n;i++) {
-                     dst[i*2+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
-                     dst[i*2+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
-                  }
-                  break;
-               case GL_RED_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLint) rgba[i][RCOMP];
-                  }
-                  break;
-               case GL_GREEN_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLint) rgba[i][GCOMP];
-                  }
-                  break;
-               case GL_BLUE_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLint) rgba[i][BCOMP];
-                  }
-                  break;
-               case GL_ALPHA_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLint) rgba[i][ACOMP];
-                  }
-                  break;
-               case GL_RGB_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*3+0] = (GLint) rgba[i][RCOMP];
-                     dst[i*3+1] = (GLint) rgba[i][GCOMP];
-                     dst[i*3+2] = (GLint) rgba[i][BCOMP];
-                  }
-                  break;
-               case GL_RGBA_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = (GLint) rgba[i][RCOMP];
-                     dst[i*4+1] = (GLint) rgba[i][GCOMP];
-                     dst[i*4+2] = (GLint) rgba[i][BCOMP];
-                     dst[i*4+3] = (GLint) rgba[i][ACOMP];
-                  }
-                  break;
-               case GL_BGR_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*3+0] = (GLint) rgba[i][BCOMP];
-                     dst[i*3+1] = (GLint) rgba[i][GCOMP];
-                     dst[i*3+2] = (GLint) rgba[i][RCOMP];
-                  }
-                  break;
-               case GL_BGRA_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = (GLint) rgba[i][BCOMP];
-                     dst[i*4+1] = (GLint) rgba[i][GCOMP];
-                     dst[i*4+2] = (GLint) rgba[i][RCOMP];
-                     dst[i*4+3] = (GLint) rgba[i][ACOMP];
-                  }
-                  break;
-               case GL_LUMINANCE_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*2+0] = (GLint) (rgba[i][RCOMP] +
-                                           rgba[i][GCOMP] +
-                                           rgba[i][BCOMP]);
-                     dst[i*2+1] = (GLint) rgba[i][ACOMP];
-                  }
-                  break;
-               case GL_LUMINANCE_ALPHA_INTEGER_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i] = (GLint) (rgba[i][RCOMP] +
-                                       rgba[i][GCOMP] +
-                                       rgba[i][BCOMP]);
-                  }
-                  break;
-               default:
-                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
-            }
-         }
-         break;
-      case GL_FLOAT:
-         {
-            GLfloat *dst = (GLfloat *) dstAddr;
-            switch (dstFormat) {
-               case GL_RED:
-                  for (i=0;i<n;i++)
-                     dst[i] = rgba[i][RCOMP];
-                  break;
-               case GL_GREEN:
-                  for (i=0;i<n;i++)
-                     dst[i] = rgba[i][GCOMP];
-                  break;
-               case GL_BLUE:
-                  for (i=0;i<n;i++)
-                     dst[i] = rgba[i][BCOMP];
-                  break;
-               case GL_ALPHA:
-                  for (i=0;i<n;i++)
-                     dst[i] = rgba[i][ACOMP];
-                  break;
-               case GL_LUMINANCE:
-                  for (i=0;i<n;i++)
-                     dst[i] = luminance[i];
-                  break;
-               case GL_LUMINANCE_ALPHA:
-                  for (i=0;i<n;i++) {
-                     dst[i*2+0] = luminance[i];
-                     dst[i*2+1] = rgba[i][ACOMP];
-                  }
-                  break;
-               case GL_RG:
-                  for (i=0;i<n;i++) {
-                     dst[i*2+0] = rgba[i][RCOMP];
-                     dst[i*2+1] = rgba[i][GCOMP];
-                  }
-                  break;
-               case GL_RGB:
-                  for (i=0;i<n;i++) {
-                     dst[i*3+0] = rgba[i][RCOMP];
-                     dst[i*3+1] = rgba[i][GCOMP];
-                     dst[i*3+2] = rgba[i][BCOMP];
-                  }
-                  break;
-               case GL_RGBA:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = rgba[i][RCOMP];
-                     dst[i*4+1] = rgba[i][GCOMP];
-                     dst[i*4+2] = rgba[i][BCOMP];
-                     dst[i*4+3] = rgba[i][ACOMP];
-                  }
-                  break;
-               case GL_BGR:
-                  for (i=0;i<n;i++) {
-                     dst[i*3+0] = rgba[i][BCOMP];
-                     dst[i*3+1] = rgba[i][GCOMP];
-                     dst[i*3+2] = rgba[i][RCOMP];
-                  }
-                  break;
-               case GL_BGRA:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = rgba[i][BCOMP];
-                     dst[i*4+1] = rgba[i][GCOMP];
-                     dst[i*4+2] = rgba[i][RCOMP];
-                     dst[i*4+3] = rgba[i][ACOMP];
-                  }
-                  break;
-               case GL_ABGR_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = rgba[i][ACOMP];
-                     dst[i*4+1] = rgba[i][BCOMP];
-                     dst[i*4+2] = rgba[i][GCOMP];
-                     dst[i*4+3] = rgba[i][RCOMP];
-                  }
-                  break;
-               case GL_DUDV_ATI:
-               case GL_DU8DV8_ATI:
-                  for (i=0;i<n;i++) {
-                     dst[i*2+0] = rgba[i][RCOMP];
-                     dst[i*2+1] = rgba[i][GCOMP];
-                  }
-                  break;
-               default:
-                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
-            }
-         }
-         break;
-      case GL_HALF_FLOAT_ARB:
-         {
-            GLhalfARB *dst = (GLhalfARB *) dstAddr;
-            switch (dstFormat) {
-               case GL_RED:
-                  for (i=0;i<n;i++)
-                     dst[i] = _mesa_float_to_half(rgba[i][RCOMP]);
-                  break;
-               case GL_GREEN:
-                  for (i=0;i<n;i++)
-                     dst[i] = _mesa_float_to_half(rgba[i][GCOMP]);
-                  break;
-               case GL_BLUE:
-                  for (i=0;i<n;i++)
-                     dst[i] = _mesa_float_to_half(rgba[i][BCOMP]);
-                  break;
-               case GL_ALPHA:
-                  for (i=0;i<n;i++)
-                     dst[i] = _mesa_float_to_half(rgba[i][ACOMP]);
-                  break;
-               case GL_LUMINANCE:
-                  for (i=0;i<n;i++)
-                     dst[i] = _mesa_float_to_half(luminance[i]);
-                  break;
-               case GL_LUMINANCE_ALPHA:
-                  for (i=0;i<n;i++) {
-                     dst[i*2+0] = _mesa_float_to_half(luminance[i]);
-                     dst[i*2+1] = _mesa_float_to_half(rgba[i][ACOMP]);
-                  }
-                  break;
-               case GL_RG:
-                  for (i=0;i<n;i++) {
-                     dst[i*2+0] = _mesa_float_to_half(rgba[i][RCOMP]);
-                     dst[i*2+1] = _mesa_float_to_half(rgba[i][GCOMP]);
-                  }
-                  break;
-               case GL_RGB:
-                  for (i=0;i<n;i++) {
-                     dst[i*3+0] = _mesa_float_to_half(rgba[i][RCOMP]);
-                     dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]);
-                     dst[i*3+2] = _mesa_float_to_half(rgba[i][BCOMP]);
-                  }
-                  break;
-               case GL_RGBA:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = _mesa_float_to_half(rgba[i][RCOMP]);
-                     dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]);
-                     dst[i*4+2] = _mesa_float_to_half(rgba[i][BCOMP]);
-                     dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]);
-                  }
-                  break;
-               case GL_BGR:
-                  for (i=0;i<n;i++) {
-                     dst[i*3+0] = _mesa_float_to_half(rgba[i][BCOMP]);
-                     dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]);
-                     dst[i*3+2] = _mesa_float_to_half(rgba[i][RCOMP]);
-                  }
-                  break;
-               case GL_BGRA:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = _mesa_float_to_half(rgba[i][BCOMP]);
-                     dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]);
-                     dst[i*4+2] = _mesa_float_to_half(rgba[i][RCOMP]);
-                     dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]);
-                  }
-                  break;
-               case GL_ABGR_EXT:
-                  for (i=0;i<n;i++) {
-                     dst[i*4+0] = _mesa_float_to_half(rgba[i][ACOMP]);
-                     dst[i*4+1] = _mesa_float_to_half(rgba[i][BCOMP]);
-                     dst[i*4+2] = _mesa_float_to_half(rgba[i][GCOMP]);
-                     dst[i*4+3] = _mesa_float_to_half(rgba[i][RCOMP]);
-                  }
-                  break;
-               case GL_DUDV_ATI:
-               case GL_DU8DV8_ATI:
-                  for (i=0;i<n;i++) {
-                     dst[i*2+0] = _mesa_float_to_half(rgba[i][RCOMP]);
-                     dst[i*2+1] = _mesa_float_to_half(rgba[i][GCOMP]);
-                  }
-                  break;
-               default:
-                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
-            }
-         }
-         break;
-      case GL_UNSIGNED_BYTE_3_3_2:
-         if (dstFormat == GL_RGB) {
-            GLubyte *dst = (GLubyte *) dstAddr;
-            for (i=0;i<n;i++) {
-               dst[i] = (IROUND(rgba[i][RCOMP] * 7.0F) << 5)
-                      | (IROUND(rgba[i][GCOMP] * 7.0F) << 2)
-                      | (IROUND(rgba[i][BCOMP] * 3.0F)     );
-            }
-         }
-         break;
-      case GL_UNSIGNED_BYTE_2_3_3_REV:
-         if (dstFormat == GL_RGB) {
-            GLubyte *dst = (GLubyte *) dstAddr;
-            for (i=0;i<n;i++) {
-               dst[i] = (IROUND(rgba[i][RCOMP] * 7.0F)     )
-                      | (IROUND(rgba[i][GCOMP] * 7.0F) << 3)
-                      | (IROUND(rgba[i][BCOMP] * 3.0F) << 6);
-            }
-         }
-         break;
-      case GL_UNSIGNED_SHORT_5_6_5:
-         if (dstFormat == GL_RGB) {
-            GLushort *dst = (GLushort *) dstAddr;
-            for (i=0;i<n;i++) {
-               dst[i] = (IROUND(rgba[i][RCOMP] * 31.0F) << 11)
-                      | (IROUND(rgba[i][GCOMP] * 63.0F) <<  5)
-                      | (IROUND(rgba[i][BCOMP] * 31.0F)      );
-            }
-         }
-         break;
-      case GL_UNSIGNED_SHORT_5_6_5_REV:
-         if (dstFormat == GL_RGB) {
-            GLushort *dst = (GLushort *) dstAddr;
-            for (i=0;i<n;i++) {
-               dst[i] = (IROUND(rgba[i][RCOMP] * 31.0F)      )
-                      | (IROUND(rgba[i][GCOMP] * 63.0F) <<  5)
-                      | (IROUND(rgba[i][BCOMP] * 31.0F) << 11);
-            }
-         }
-         break;
-      case GL_UNSIGNED_SHORT_4_4_4_4:
-         if (dstFormat == GL_RGBA) {
-            GLushort *dst = (GLushort *) dstAddr;
-            for (i=0;i<n;i++) {
-               dst[i] = (IROUND(rgba[i][RCOMP] * 15.0F) << 12)
-                      | (IROUND(rgba[i][GCOMP] * 15.0F) <<  8)
-                      | (IROUND(rgba[i][BCOMP] * 15.0F) <<  4)
-                      | (IROUND(rgba[i][ACOMP] * 15.0F)      );
-            }
-         }
-         else if (dstFormat == GL_BGRA) {
-            GLushort *dst = (GLushort *) dstAddr;
-            for (i=0;i<n;i++) {
-               dst[i] = (IROUND(rgba[i][BCOMP] * 15.0F) << 12)
-                      | (IROUND(rgba[i][GCOMP] * 15.0F) <<  8)
-                      | (IROUND(rgba[i][RCOMP] * 15.0F) <<  4)
-                      | (IROUND(rgba[i][ACOMP] * 15.0F)      );
-            }
-         }
-         else if (dstFormat == GL_ABGR_EXT) {
-            GLushort *dst = (GLushort *) dstAddr;
-            for (i=0;i<n;i++) {
-               dst[i] = (IROUND(rgba[i][ACOMP] * 15.0F) << 12)
-                      | (IROUND(rgba[i][BCOMP] * 15.0F) <<  8)
-                      | (IROUND(rgba[i][GCOMP] * 15.0F) <<  4)
-                      | (IROUND(rgba[i][RCOMP] * 15.0F)      );
-            }
-         }
-         break;
-      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
-         if (dstFormat == GL_RGBA) {
-            GLushort *dst = (GLushort *) dstAddr;
-            for (i=0;i<n;i++) {
-               dst[i] = (IROUND(rgba[i][RCOMP] * 15.0F)      )
-                      | (IROUND(rgba[i][GCOMP] * 15.0F) <<  4)
-                      | (IROUND(rgba[i][BCOMP] * 15.0F) <<  8)
-                      | (IROUND(rgba[i][ACOMP] * 15.0F) << 12);
-            }
-         }
-         else if (dstFormat == GL_BGRA) {
-            GLushort *dst = (GLushort *) dstAddr;
-            for (i=0;i<n;i++) {
-               dst[i] = (IROUND(rgba[i][BCOMP] * 15.0F)      )
-                      | (IROUND(rgba[i][GCOMP] * 15.0F) <<  4)
-                      | (IROUND(rgba[i][RCOMP] * 15.0F) <<  8)
-                      | (IROUND(rgba[i][ACOMP] * 15.0F) << 12);
-            }
-         }
-         else if (dstFormat == GL_ABGR_EXT) {
-            GLushort *dst = (GLushort *) dstAddr;
-            for (i=0;i<n;i++) {
-               dst[i] = (IROUND(rgba[i][ACOMP] * 15.0F)      )
-                      | (IROUND(rgba[i][BCOMP] * 15.0F) <<  4)
-                      | (IROUND(rgba[i][GCOMP] * 15.0F) <<  8)
-                      | (IROUND(rgba[i][RCOMP] * 15.0F) << 12);
-            }
-         }
-         break;
-      case GL_UNSIGNED_SHORT_5_5_5_1:
-         if (dstFormat == GL_RGBA) {
-            GLushort *dst = (GLushort *) dstAddr;
-            for (i=0;i<n;i++) {
-               dst[i] = (IROUND(rgba[i][RCOMP] * 31.0F) << 11)
-                      | (IROUND(rgba[i][GCOMP] * 31.0F) <<  6)
-                      | (IROUND(rgba[i][BCOMP] * 31.0F) <<  1)
-                      | (IROUND(rgba[i][ACOMP] *  1.0F)      );
-            }
-         }
-         else if (dstFormat == GL_BGRA) {
-            GLushort *dst = (GLushort *) dstAddr;
-            for (i=0;i<n;i++) {
-               dst[i] = (IROUND(rgba[i][BCOMP] * 31.0F) << 11)
-                      | (IROUND(rgba[i][GCOMP] * 31.0F) <<  6)
-                      | (IROUND(rgba[i][RCOMP] * 31.0F) <<  1)
-                      | (IROUND(rgba[i][ACOMP] *  1.0F)      );
-            }
-         }
-         else if (dstFormat == GL_ABGR_EXT) {
-            GLushort *dst = (GLushort *) dstAddr;
-            for (i=0;i<n;i++) {
-               dst[i] = (IROUND(rgba[i][ACOMP] * 31.0F) << 11)
-                      | (IROUND(rgba[i][BCOMP] * 31.0F) <<  6)
-                      | (IROUND(rgba[i][GCOMP] * 31.0F) <<  1)
-                      | (IROUND(rgba[i][RCOMP] *  1.0F)      );
-            }
-         }
-         break;
-      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
-         if (dstFormat == GL_RGBA) {
-            GLushort *dst = (GLushort *) dstAddr;
-            for (i=0;i<n;i++) {
-               dst[i] = (IROUND(rgba[i][RCOMP] * 31.0F)      )
-                      | (IROUND(rgba[i][GCOMP] * 31.0F) <<  5)
-                      | (IROUND(rgba[i][BCOMP] * 31.0F) << 10)
-                      | (IROUND(rgba[i][ACOMP] *  1.0F) << 15);
-            }
-         }
-         else if (dstFormat == GL_BGRA) {
-            GLushort *dst = (GLushort *) dstAddr;
-            for (i=0;i<n;i++) {
-               dst[i] = (IROUND(rgba[i][BCOMP] * 31.0F)      )
-                      | (IROUND(rgba[i][GCOMP] * 31.0F) <<  5)
-                      | (IROUND(rgba[i][RCOMP] * 31.0F) << 10)
-                      | (IROUND(rgba[i][ACOMP] *  1.0F) << 15);
-            }
-         }
-         else if (dstFormat == GL_ABGR_EXT) {
-            GLushort *dst = (GLushort *) dstAddr;
-            for (i=0;i<n;i++) {
-               dst[i] = (IROUND(rgba[i][ACOMP] * 31.0F)      )
-                      | (IROUND(rgba[i][BCOMP] * 31.0F) <<  5)
-                      | (IROUND(rgba[i][GCOMP] * 31.0F) << 10)
-                      | (IROUND(rgba[i][RCOMP] *  1.0F) << 15);
-            }
-         }
-         break;
-      case GL_UNSIGNED_INT_8_8_8_8:
-         if (dstFormat == GL_RGBA) {
-            GLuint *dst = (GLuint *) dstAddr;
-            for (i=0;i<n;i++) {
-               dst[i] = (IROUND(rgba[i][RCOMP] * 255.F) << 24)
-                      | (IROUND(rgba[i][GCOMP] * 255.F) << 16)
-                      | (IROUND(rgba[i][BCOMP] * 255.F) <<  8)
-                      | (IROUND(rgba[i][ACOMP] * 255.F)      );
-            }
-         }
-         else if (dstFormat == GL_BGRA) {
-            GLuint *dst = (GLuint *) dstAddr;
-            for (i=0;i<n;i++) {
-               dst[i] = (IROUND(rgba[i][BCOMP] * 255.F) << 24)
-                      | (IROUND(rgba[i][GCOMP] * 255.F) << 16)
-                      | (IROUND(rgba[i][RCOMP] * 255.F) <<  8)
-                      | (IROUND(rgba[i][ACOMP] * 255.F)      );
-            }
-         }
-         else if (dstFormat == GL_ABGR_EXT) {
-            GLuint *dst = (GLuint *) dstAddr;
-            for (i=0;i<n;i++) {
-               dst[i] = (IROUND(rgba[i][ACOMP] * 255.F) << 24)
-                      | (IROUND(rgba[i][BCOMP] * 255.F) << 16)
-                      | (IROUND(rgba[i][GCOMP] * 255.F) <<  8)
-                      | (IROUND(rgba[i][RCOMP] * 255.F)      );
-            }
-         }
-         break;
-      case GL_UNSIGNED_INT_8_8_8_8_REV:
-         if (dstFormat == GL_RGBA) {
-            GLuint *dst = (GLuint *) dstAddr;
-            for (i=0;i<n;i++) {
-               dst[i] = (IROUND(rgba[i][RCOMP] * 255.0F)      )
-                      | (IROUND(rgba[i][GCOMP] * 255.0F) <<  8)
-                      | (IROUND(rgba[i][BCOMP] * 255.0F) << 16)
-                      | (IROUND(rgba[i][ACOMP] * 255.0F) << 24);
-            }
-         }
-         else if (dstFormat == GL_BGRA) {
-            GLuint *dst = (GLuint *) dstAddr;
-            for (i=0;i<n;i++) {
-               dst[i] = (IROUND(rgba[i][BCOMP] * 255.0F)      )
-                      | (IROUND(rgba[i][GCOMP] * 255.0F) <<  8)
-                      | (IROUND(rgba[i][RCOMP] * 255.0F) << 16)
-                      | (IROUND(rgba[i][ACOMP] * 255.0F) << 24);
-            }
-         }
-         else if (dstFormat == GL_ABGR_EXT) {
-            GLuint *dst = (GLuint *) dstAddr;
-            for (i=0;i<n;i++) {
-               dst[i] = (IROUND(rgba[i][ACOMP] * 255.0F)      )
-                      | (IROUND(rgba[i][BCOMP] * 255.0F) <<  8)
-                      | (IROUND(rgba[i][GCOMP] * 255.0F) << 16)
-                      | (IROUND(rgba[i][RCOMP] * 255.0F) << 24);
-            }
-         }
-         break;
-      case GL_UNSIGNED_INT_10_10_10_2:
-         if (dstFormat == GL_RGBA) {
-            GLuint *dst = (GLuint *) dstAddr;
-            for (i=0;i<n;i++) {
-               dst[i] = (IROUND(rgba[i][RCOMP] * 1023.0F) << 22)
-                      | (IROUND(rgba[i][GCOMP] * 1023.0F) << 12)
-                      | (IROUND(rgba[i][BCOMP] * 1023.0F) <<  2)
-                      | (IROUND(rgba[i][ACOMP] *    3.0F)      );
-            }
-         }
-         else if (dstFormat == GL_BGRA) {
-            GLuint *dst = (GLuint *) dstAddr;
-            for (i=0;i<n;i++) {
-               dst[i] = (IROUND(rgba[i][BCOMP] * 1023.0F) << 22)
-                      | (IROUND(rgba[i][GCOMP] * 1023.0F) << 12)
-                      | (IROUND(rgba[i][RCOMP] * 1023.0F) <<  2)
-                      | (IROUND(rgba[i][ACOMP] *    3.0F)      );
-            }
-         }
-         else if (dstFormat == GL_ABGR_EXT) {
-            GLuint *dst = (GLuint *) dstAddr;
-            for (i=0;i<n;i++) {
-               dst[i] = (IROUND(rgba[i][ACOMP] * 1023.0F) << 22)
-                      | (IROUND(rgba[i][BCOMP] * 1023.0F) << 12)
-                      | (IROUND(rgba[i][GCOMP] * 1023.0F) <<  2)
-                      | (IROUND(rgba[i][RCOMP] *    3.0F)      );
-            }
-         }
-         break;
-      case GL_UNSIGNED_INT_2_10_10_10_REV:
-         if (dstFormat == GL_RGBA) {
-            GLuint *dst = (GLuint *) dstAddr;
-            for (i=0;i<n;i++) {
-               dst[i] = (IROUND(rgba[i][RCOMP] * 1023.0F)      )
-                      | (IROUND(rgba[i][GCOMP] * 1023.0F) << 10)
-                      | (IROUND(rgba[i][BCOMP] * 1023.0F) << 20)
-                      | (IROUND(rgba[i][ACOMP] *    3.0F) << 30);
-            }
-         }
-         else if (dstFormat == GL_BGRA) {
-            GLuint *dst = (GLuint *) dstAddr;
-            for (i=0;i<n;i++) {
-               dst[i] = (IROUND(rgba[i][BCOMP] * 1023.0F)      )
-                      | (IROUND(rgba[i][GCOMP] * 1023.0F) << 10)
-                      | (IROUND(rgba[i][RCOMP] * 1023.0F) << 20)
-                      | (IROUND(rgba[i][ACOMP] *    3.0F) << 30);
-            }
-         }
-         else if (dstFormat == GL_ABGR_EXT) {
-            GLuint *dst = (GLuint *) dstAddr;
-            for (i=0;i<n;i++) {
-               dst[i] = (IROUND(rgba[i][ACOMP] * 1023.0F)      )
-                      | (IROUND(rgba[i][BCOMP] * 1023.0F) << 10)
-                      | (IROUND(rgba[i][GCOMP] * 1023.0F) << 20)
-                      | (IROUND(rgba[i][RCOMP] *    3.0F) << 30);
-            }
-         }
-         break;
-      default:
-         _mesa_problem(ctx, "bad type in _mesa_pack_rgba_span_float");
-         return;
-   }
-
-   if (dstPacking->SwapBytes) {
-      GLint swapSize = _mesa_sizeof_packed_type(dstType);
-      if (swapSize == 2) {
-         if (dstPacking->SwapBytes) {
-            _mesa_swap2((GLushort *) dstAddr, n * comps);
-         }
-      }
-      else if (swapSize == 4) {
-         if (dstPacking->SwapBytes) {
-            _mesa_swap4((GLuint *) dstAddr, n * comps);
-         }
-      }
-   }
-
-   free(luminance);
-}
-
-
-
-#define SWAP2BYTE(VALUE)			\
-   {						\
-      GLubyte *bytes = (GLubyte *) &(VALUE);	\
-      GLubyte tmp = bytes[0];			\
-      bytes[0] = bytes[1];			\
-      bytes[1] = tmp;				\
-   }
-
-#define SWAP4BYTE(VALUE)			\
-   {						\
-      GLubyte *bytes = (GLubyte *) &(VALUE);	\
-      GLubyte tmp = bytes[0];			\
-      bytes[0] = bytes[3];			\
-      bytes[3] = tmp;				\
-      tmp = bytes[1];				\
-      bytes[1] = bytes[2];			\
-      bytes[2] = tmp;				\
-   }
-
-
-static void
-extract_uint_indexes(GLuint n, GLuint indexes[],
-                     GLenum srcFormat, GLenum srcType, const GLvoid *src,
-                     const struct gl_pixelstore_attrib *unpack )
-{
-   ASSERT(srcFormat == GL_COLOR_INDEX || srcFormat == GL_STENCIL_INDEX);
-
-   ASSERT(srcType == GL_BITMAP ||
-          srcType == GL_UNSIGNED_BYTE ||
-          srcType == GL_BYTE ||
-          srcType == GL_UNSIGNED_SHORT ||
-          srcType == GL_SHORT ||
-          srcType == GL_UNSIGNED_INT ||
-          srcType == GL_INT ||
-          srcType == GL_UNSIGNED_INT_24_8_EXT ||
-          srcType == GL_HALF_FLOAT_ARB ||
-          srcType == GL_FLOAT);
-
-   switch (srcType) {
-      case GL_BITMAP:
-         {
-            GLubyte *ubsrc = (GLubyte *) src;
-            if (unpack->LsbFirst) {
-               GLubyte mask = 1 << (unpack->SkipPixels & 0x7);
-               GLuint i;
-               for (i = 0; i < n; i++) {
-                  indexes[i] = (*ubsrc & mask) ? 1 : 0;
-                  if (mask == 128) {
-                     mask = 1;
-                     ubsrc++;
-                  }
-                  else {
-                     mask = mask << 1;
-                  }
-               }
-            }
-            else {
-               GLubyte mask = 128 >> (unpack->SkipPixels & 0x7);
-               GLuint i;
-               for (i = 0; i < n; i++) {
-                  indexes[i] = (*ubsrc & mask) ? 1 : 0;
-                  if (mask == 1) {
-                     mask = 128;
-                     ubsrc++;
-                  }
-                  else {
-                     mask = mask >> 1;
-                  }
-               }
-            }
-         }
-         break;
-      case GL_UNSIGNED_BYTE:
-         {
-            GLuint i;
-            const GLubyte *s = (const GLubyte *) src;
-            for (i = 0; i < n; i++)
-               indexes[i] = s[i];
-         }
-         break;
-      case GL_BYTE:
-         {
-            GLuint i;
-            const GLbyte *s = (const GLbyte *) src;
-            for (i = 0; i < n; i++)
-               indexes[i] = s[i];
-         }
-         break;
-      case GL_UNSIGNED_SHORT:
-         {
-            GLuint i;
-            const GLushort *s = (const GLushort *) src;
-            if (unpack->SwapBytes) {
-               for (i = 0; i < n; i++) {
-                  GLushort value = s[i];
-                  SWAP2BYTE(value);
-                  indexes[i] = value;
-               }
-            }
-            else {
-               for (i = 0; i < n; i++)
-                  indexes[i] = s[i];
-            }
-         }
-         break;
-      case GL_SHORT:
-         {
-            GLuint i;
-            const GLshort *s = (const GLshort *) src;
-            if (unpack->SwapBytes) {
-               for (i = 0; i < n; i++) {
-                  GLshort value = s[i];
-                  SWAP2BYTE(value);
-                  indexes[i] = value;
-               }
-            }
-            else {
-               for (i = 0; i < n; i++)
-                  indexes[i] = s[i];
-            }
-         }
-         break;
-      case GL_UNSIGNED_INT:
-         {
-            GLuint i;
-            const GLuint *s = (const GLuint *) src;
-            if (unpack->SwapBytes) {
-               for (i = 0; i < n; i++) {
-                  GLuint value = s[i];
-                  SWAP4BYTE(value);
-                  indexes[i] = value;
-               }
-            }
-            else {
-               for (i = 0; i < n; i++)
-                  indexes[i] = s[i];
-            }
-         }
-         break;
-      case GL_INT:
-         {
-            GLuint i;
-            const GLint *s = (const GLint *) src;
-            if (unpack->SwapBytes) {
-               for (i = 0; i < n; i++) {
-                  GLint value = s[i];
-                  SWAP4BYTE(value);
-                  indexes[i] = value;
-               }
-            }
-            else {
-               for (i = 0; i < n; i++)
-                  indexes[i] = s[i];
-            }
-         }
-         break;
-      case GL_FLOAT:
-         {
-            GLuint i;
-            const GLfloat *s = (const GLfloat *) src;
-            if (unpack->SwapBytes) {
-               for (i = 0; i < n; i++) {
-                  GLfloat value = s[i];
-                  SWAP4BYTE(value);
-                  indexes[i] = (GLuint) value;
-               }
-            }
-            else {
-               for (i = 0; i < n; i++)
-                  indexes[i] = (GLuint) s[i];
-            }
-         }
-         break;
-      case GL_HALF_FLOAT_ARB:
-         {
-            GLuint i;
-            const GLhalfARB *s = (const GLhalfARB *) src;
-            if (unpack->SwapBytes) {
-               for (i = 0; i < n; i++) {
-                  GLhalfARB value = s[i];
-                  SWAP2BYTE(value);
-                  indexes[i] = (GLuint) _mesa_half_to_float(value);
-               }
-            }
-            else {
-               for (i = 0; i < n; i++)
-                  indexes[i] = (GLuint) _mesa_half_to_float(s[i]);
-            }
-         }
-         break;
-      case GL_UNSIGNED_INT_24_8_EXT:
-         {
-            GLuint i;
-            const GLuint *s = (const GLuint *) src;
-            if (unpack->SwapBytes) {
-               for (i = 0; i < n; i++) {
-                  GLuint value = s[i];
-                  SWAP4BYTE(value);
-                  indexes[i] = value & 0xff;  /* lower 8 bits */
-               }
-            }
-            else {
-               for (i = 0; i < n; i++)
-                  indexes[i] = s[i] & 0xff;  /* lower 8 bits */
-            }
-         }
-         break;
-
-      default:
-         _mesa_problem(NULL, "bad srcType in extract_uint_indexes");
-         return;
-   }
-}
-
-
-/**
- * Return source/dest RGBA indexes for unpacking pixels.
- */
-static void
-get_component_mapping(GLenum format,
-                      GLint *rSrc,
-                      GLint *gSrc,
-                      GLint *bSrc,
-                      GLint *aSrc,
-                      GLint *rDst,
-                      GLint *gDst,
-                      GLint *bDst,
-                      GLint *aDst)
-{
-   switch (format) {
-   case GL_RED:
-   case GL_RED_INTEGER_EXT:
-      *rSrc = 0;
-      *gSrc = *bSrc = *aSrc = -1;
-      break;
-   case GL_GREEN:
-   case GL_GREEN_INTEGER_EXT:
-      *gSrc = 0;
-      *rSrc = *bSrc = *aSrc = -1;
-      break;
-      case GL_BLUE:
-   case GL_BLUE_INTEGER_EXT:
-      *bSrc = 0;
-      *rSrc = *gSrc = *aSrc = -1;
-      break;
-   case GL_ALPHA:
-   case GL_ALPHA_INTEGER_EXT:
-      *rSrc = *gSrc = *bSrc = -1;
-      *aSrc = 0;
-      break;
-   case GL_LUMINANCE:
-   case GL_LUMINANCE_INTEGER_EXT:
-      *rSrc = *gSrc = *bSrc = 0;
-      *aSrc = -1;
-      break;
-   case GL_LUMINANCE_ALPHA:
-   case GL_LUMINANCE_ALPHA_INTEGER_EXT:
-      *rSrc = *gSrc = *bSrc = 0;
-      *aSrc = 1;
-      break;
-   case GL_INTENSITY:
-      *rSrc = *gSrc = *bSrc = *aSrc = 0;
-      break;
-   case GL_RG:
-   case GL_RG_INTEGER:
-      *rSrc = 0;
-      *gSrc = 1;
-      *bSrc = -1;
-      *aSrc = -1;
-      *rDst = 0;
-      *gDst = 1;
-      *bDst = 2;
-      *aDst = 3;
-      break;
-   case GL_RGB:
-   case GL_RGB_INTEGER:
-      *rSrc = 0;
-      *gSrc = 1;
-      *bSrc = 2;
-      *aSrc = -1;
-      *rDst = 0;
-      *gDst = 1;
-      *bDst = 2;
-      *aDst = 3;
-      break;
-   case GL_BGR:
-      *rSrc = 2;
-      *gSrc = 1;
-      *bSrc = 0;
-      *aSrc = -1;
-      *rDst = 2;
-      *gDst = 1;
-      *bDst = 0;
-      *aDst = 3;
-      break;
-   case GL_RGBA:
-   case GL_RGBA_INTEGER:
-      *rSrc = 0;
-      *gSrc = 1;
-      *bSrc = 2;
-      *aSrc = 3;
-      *rDst = 0;
-      *gDst = 1;
-      *bDst = 2;
-      *aDst = 3;
-      break;
-   case GL_BGRA:
-      *rSrc = 2;
-      *gSrc = 1;
-      *bSrc = 0;
-      *aSrc = 3;
-      *rDst = 2;
-      *gDst = 1;
-      *bDst = 0;
-      *aDst = 3;
-      break;
-   case GL_ABGR_EXT:
-      *rSrc = 3;
-      *gSrc = 2;
-      *bSrc = 1;
-      *aSrc = 0;
-      *rDst = 3;
-      *gDst = 2;
-      *bDst = 1;
-      *aDst = 0;
-      break;
-   case GL_DU8DV8_ATI:
-   case GL_DUDV_ATI:
-      *rSrc = 0;
-      *gSrc = 1;
-      *bSrc = -1;
-      *aSrc = -1;
-      break;
-   default:
-      _mesa_problem(NULL, "bad srcFormat %s in get_component_mapping",
-                    _mesa_lookup_enum_by_nr(format));
-      return;
-   }
-}
-
-
-
-/*
- * This function extracts floating point RGBA values from arbitrary
- * image data.  srcFormat and srcType are the format and type parameters
- * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
- *
- * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
- * implements the "Conversion to floating point", "Conversion to RGB",
- * and "Final Expansion to RGBA" operations.
- *
- * Args:  n - number of pixels
- *        rgba - output colors
- *        srcFormat - format of incoming data
- *        srcType - data type of incoming data
- *        src - source data pointer
- *        swapBytes - perform byteswapping of incoming data?
- */
-static void
-extract_float_rgba(GLuint n, GLfloat rgba[][4],
-                   GLenum srcFormat, GLenum srcType, const GLvoid *src,
-                   GLboolean swapBytes)
-{
-   GLint rSrc, gSrc, bSrc, aSrc;
-   GLint stride;
-   GLint rDst, bDst, gDst, aDst;
-   GLboolean intFormat;
-   GLfloat rs = 1.0f, gs = 1.0f, bs = 1.0f, as = 1.0f; /* scale factors */
-
-   ASSERT(srcFormat == GL_RED ||
-          srcFormat == GL_GREEN ||
-          srcFormat == GL_BLUE ||
-          srcFormat == GL_ALPHA ||
-          srcFormat == GL_LUMINANCE ||
-          srcFormat == GL_LUMINANCE_ALPHA ||
-          srcFormat == GL_INTENSITY ||
-          srcFormat == GL_RG ||
-          srcFormat == GL_RGB ||
-          srcFormat == GL_BGR ||
-          srcFormat == GL_RGBA ||
-          srcFormat == GL_BGRA ||
-          srcFormat == GL_ABGR_EXT ||
-          srcFormat == GL_DU8DV8_ATI ||
-          srcFormat == GL_DUDV_ATI ||
-          srcFormat == GL_RED_INTEGER_EXT ||
-          srcFormat == GL_GREEN_INTEGER_EXT ||
-          srcFormat == GL_BLUE_INTEGER_EXT ||
-          srcFormat == GL_ALPHA_INTEGER_EXT ||
-          srcFormat == GL_RGB_INTEGER_EXT ||
-          srcFormat == GL_RGBA_INTEGER_EXT ||
-          srcFormat == GL_BGR_INTEGER_EXT ||
-          srcFormat == GL_BGRA_INTEGER_EXT ||
-          srcFormat == GL_LUMINANCE_INTEGER_EXT ||
-          srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT);
-
-   ASSERT(srcType == GL_UNSIGNED_BYTE ||
-          srcType == GL_BYTE ||
-          srcType == GL_UNSIGNED_SHORT ||
-          srcType == GL_SHORT ||
-          srcType == GL_UNSIGNED_INT ||
-          srcType == GL_INT ||
-          srcType == GL_HALF_FLOAT_ARB ||
-          srcType == GL_FLOAT ||
-          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
-          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
-          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
-          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
-          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
-          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
-          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
-          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
-          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
-          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
-          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
-          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
-
-   get_component_mapping(srcFormat,
-                         &rSrc, &gSrc, &bSrc, &aSrc,
-                         &rDst, &gDst, &bDst, &aDst);
-
-   stride = _mesa_components_in_format(srcFormat);
-
-   intFormat = _mesa_is_integer_format(srcFormat);
-
-#define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \
-   if ((SRC_INDEX) < 0) {						\
-      GLuint i;								\
-      if (intFormat) {							\
-         for (i = 0; i < n; i++) {					\
-            rgba[i][DST_INDEX] = DEFAULT_INT;				\
-         }								\
-      }									\
-      else {								\
-         for (i = 0; i < n; i++) {					\
-            rgba[i][DST_INDEX] = DEFAULT_FLT;				\
-         }								\
-      }									\
-   }									\
-   else if (swapBytes) {						\
-      const TYPE *s = (const TYPE *) src;				\
-      GLuint i;								\
-      for (i = 0; i < n; i++) {						\
-         TYPE value = s[SRC_INDEX];					\
-         if (sizeof(TYPE) == 2) {					\
-            SWAP2BYTE(value);						\
-         }								\
-         else if (sizeof(TYPE) == 4) {					\
-            SWAP4BYTE(value);						\
-         }								\
-         if (intFormat)							\
-            rgba[i][DST_INDEX] = (GLfloat) value;			\
-         else								\
-            rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value);		\
-         s += stride;							\
-      }									\
-   }									\
-   else {								\
-      const TYPE *s = (const TYPE *) src;				\
-      GLuint i;								\
-      if (intFormat) {							\
-         for (i = 0; i < n; i++) {					\
-            rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX];		\
-            s += stride;						\
-         }								\
-      }									\
-      else {								\
-         for (i = 0; i < n; i++) {					\
-            rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]);	\
-            s += stride;						\
-         }								\
-      }									\
-   }
-
-   switch (srcType) {
-      case GL_UNSIGNED_BYTE:
-         PROCESS(rSrc, RCOMP, 0.0F,   0, GLubyte, UBYTE_TO_FLOAT);
-         PROCESS(gSrc, GCOMP, 0.0F,   0, GLubyte, UBYTE_TO_FLOAT);
-         PROCESS(bSrc, BCOMP, 0.0F,   0, GLubyte, UBYTE_TO_FLOAT);
-         PROCESS(aSrc, ACOMP, 1.0F, 255, GLubyte, UBYTE_TO_FLOAT);
-         break;
-      case GL_BYTE:
-         PROCESS(rSrc, RCOMP, 0.0F,   0, GLbyte, BYTE_TO_FLOAT);
-         PROCESS(gSrc, GCOMP, 0.0F,   0, GLbyte, BYTE_TO_FLOAT);
-         PROCESS(bSrc, BCOMP, 0.0F,   0, GLbyte, BYTE_TO_FLOAT);
-         PROCESS(aSrc, ACOMP, 1.0F, 127, GLbyte, BYTE_TO_FLOAT);
-         break;
-      case GL_UNSIGNED_SHORT:
-         PROCESS(rSrc, RCOMP, 0.0F,      0, GLushort, USHORT_TO_FLOAT);
-         PROCESS(gSrc, GCOMP, 0.0F,      0, GLushort, USHORT_TO_FLOAT);
-         PROCESS(bSrc, BCOMP, 0.0F,      0, GLushort, USHORT_TO_FLOAT);
-         PROCESS(aSrc, ACOMP, 1.0F, 0xffff, GLushort, USHORT_TO_FLOAT);
-         break;
-      case GL_SHORT:
-         PROCESS(rSrc, RCOMP, 0.0F,     0, GLshort, SHORT_TO_FLOAT);
-         PROCESS(gSrc, GCOMP, 0.0F,     0, GLshort, SHORT_TO_FLOAT);
-         PROCESS(bSrc, BCOMP, 0.0F,     0, GLshort, SHORT_TO_FLOAT);
-         PROCESS(aSrc, ACOMP, 1.0F, 32767, GLshort, SHORT_TO_FLOAT);
-         break;
-      case GL_UNSIGNED_INT:
-         PROCESS(rSrc, RCOMP, 0.0F,          0, GLuint, UINT_TO_FLOAT);
-         PROCESS(gSrc, GCOMP, 0.0F,          0, GLuint, UINT_TO_FLOAT);
-         PROCESS(bSrc, BCOMP, 0.0F,          0, GLuint, UINT_TO_FLOAT);
-         PROCESS(aSrc, ACOMP, 1.0F, 0xffffffff, GLuint, UINT_TO_FLOAT);
-         break;
-      case GL_INT:
-         PROCESS(rSrc, RCOMP, 0.0F,          0, GLint, INT_TO_FLOAT);
-         PROCESS(gSrc, GCOMP, 0.0F,          0, GLint, INT_TO_FLOAT);
-         PROCESS(bSrc, BCOMP, 0.0F,          0, GLint, INT_TO_FLOAT);
-         PROCESS(aSrc, ACOMP, 1.0F, 2147483647, GLint, INT_TO_FLOAT);
-         break;
-      case GL_FLOAT:
-         PROCESS(rSrc, RCOMP, 0.0F, 0.0F, GLfloat, (GLfloat));
-         PROCESS(gSrc, GCOMP, 0.0F, 0.0F, GLfloat, (GLfloat));
-         PROCESS(bSrc, BCOMP, 0.0F, 0.0F, GLfloat, (GLfloat));
-         PROCESS(aSrc, ACOMP, 1.0F, 1.0F, GLfloat, (GLfloat));
-         break;
-      case GL_HALF_FLOAT_ARB:
-         PROCESS(rSrc, RCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float);
-         PROCESS(gSrc, GCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float);
-         PROCESS(bSrc, BCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float);
-         PROCESS(aSrc, ACOMP, 1.0F, 1.0F, GLhalfARB, _mesa_half_to_float);
-         break;
-      case GL_UNSIGNED_BYTE_3_3_2:
-         {
-            const GLubyte *ubsrc = (const GLubyte *) src;
-            GLuint i;
-            if (!intFormat) {
-               rs = 1.0F / 7.0F;
-               gs = 1.0F / 7.0F;
-               bs = 1.0F / 3.0F;
-            }
-            for (i = 0; i < n; i ++) {
-               GLubyte p = ubsrc[i];
-               rgba[i][rDst] = ((p >> 5)      ) * rs;
-               rgba[i][gDst] = ((p >> 2) & 0x7) * gs;
-               rgba[i][bDst] = ((p     ) & 0x3) * bs;
-               rgba[i][aDst] = 1.0F;
-            }
-         }
-         break;
-      case GL_UNSIGNED_BYTE_2_3_3_REV:
-         {
-            const GLubyte *ubsrc = (const GLubyte *) src;
-            GLuint i;
-            if (!intFormat) {
-               rs = 1.0F / 7.0F;
-               gs = 1.0F / 7.0F;
-               bs = 1.0F / 3.0F;
-            }
-            for (i = 0; i < n; i ++) {
-               GLubyte p = ubsrc[i];
-               rgba[i][rDst] = ((p     ) & 0x7) * rs;
-               rgba[i][gDst] = ((p >> 3) & 0x7) * gs;
-               rgba[i][bDst] = ((p >> 6)      ) * bs;
-               rgba[i][aDst] = 1.0F;
-            }
-         }
-         break;
-      case GL_UNSIGNED_SHORT_5_6_5:
-         if (!intFormat) {
-            rs = 1.0F / 31.0F;
-            gs = 1.0F / 63.0F;
-            bs = 1.0F / 31.0F;
-         }
-         if (swapBytes) {
-            const GLushort *ussrc = (const GLushort *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLushort p = ussrc[i];
-               SWAP2BYTE(p);
-               rgba[i][rDst] = ((p >> 11)       ) * rs;
-               rgba[i][gDst] = ((p >>  5) & 0x3f) * gs;
-               rgba[i][bDst] = ((p      ) & 0x1f) * bs;
-               rgba[i][aDst] = 1.0F;
-            }
-         }
-         else {
-            const GLushort *ussrc = (const GLushort *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLushort p = ussrc[i];
-               rgba[i][rDst] = ((p >> 11)       ) * rs;
-               rgba[i][gDst] = ((p >>  5) & 0x3f) * gs;
-               rgba[i][bDst] = ((p      ) & 0x1f) * bs;
-               rgba[i][aDst] = 1.0F;
-            }
-         }
-         break;
-      case GL_UNSIGNED_SHORT_5_6_5_REV:
-         if (!intFormat) {
-            rs = 1.0F / 31.0F;
-            gs = 1.0F / 63.0F;
-            bs = 1.0F / 31.0F;
-         }
-         if (swapBytes) {
-            const GLushort *ussrc = (const GLushort *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLushort p = ussrc[i];
-               SWAP2BYTE(p);
-               rgba[i][rDst] = ((p      ) & 0x1f) * rs;
-               rgba[i][gDst] = ((p >>  5) & 0x3f) * gs;
-               rgba[i][bDst] = ((p >> 11)       ) * bs;
-               rgba[i][aDst] = 1.0F;
-            }
-         }
-         else {
-            const GLushort *ussrc = (const GLushort *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLushort p = ussrc[i];
-               rgba[i][rDst] = ((p      ) & 0x1f) * rs;
-               rgba[i][gDst] = ((p >>  5) & 0x3f) * gs;
-               rgba[i][bDst] = ((p >> 11)       ) * bs;
-               rgba[i][aDst] = 1.0F;
-            }
-         }
-         break;
-      case GL_UNSIGNED_SHORT_4_4_4_4:
-         if (!intFormat) {
-            rs = gs = bs = as = 1.0F / 15.0F;
-         }
-         if (swapBytes) {
-            const GLushort *ussrc = (const GLushort *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLushort p = ussrc[i];
-               SWAP2BYTE(p);
-               rgba[i][rDst] = ((p >> 12)      ) * rs;
-               rgba[i][gDst] = ((p >>  8) & 0xf) * gs;
-               rgba[i][bDst] = ((p >>  4) & 0xf) * bs;
-               rgba[i][aDst] = ((p      ) & 0xf) * as;
-            }
-         }
-         else {
-            const GLushort *ussrc = (const GLushort *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLushort p = ussrc[i];
-               rgba[i][rDst] = ((p >> 12)      ) * rs;
-               rgba[i][gDst] = ((p >>  8) & 0xf) * gs;
-               rgba[i][bDst] = ((p >>  4) & 0xf) * bs;
-               rgba[i][aDst] = ((p      ) & 0xf) * as;
-            }
-         }
-         break;
-      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
-         if (!intFormat) {
-            rs = gs = bs = as = 1.0F / 15.0F;
-         }
-         if (swapBytes) {
-            const GLushort *ussrc = (const GLushort *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLushort p = ussrc[i];
-               SWAP2BYTE(p);
-               rgba[i][rDst] = ((p      ) & 0xf) * rs;
-               rgba[i][gDst] = ((p >>  4) & 0xf) * gs;
-               rgba[i][bDst] = ((p >>  8) & 0xf) * bs;
-               rgba[i][aDst] = ((p >> 12)      ) * as;
-            }
-         }
-         else {
-            const GLushort *ussrc = (const GLushort *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLushort p = ussrc[i];
-               rgba[i][rDst] = ((p      ) & 0xf) * rs;
-               rgba[i][gDst] = ((p >>  4) & 0xf) * gs;
-               rgba[i][bDst] = ((p >>  8) & 0xf) * bs;
-               rgba[i][aDst] = ((p >> 12)      ) * as;
-            }
-         }
-         break;
-      case GL_UNSIGNED_SHORT_5_5_5_1:
-         if (!intFormat) {
-            rs = gs = bs = 1.0F / 31.0F;
-         }
-         if (swapBytes) {
-            const GLushort *ussrc = (const GLushort *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLushort p = ussrc[i];
-               SWAP2BYTE(p);
-               rgba[i][rDst] = ((p >> 11)       ) * rs;
-               rgba[i][gDst] = ((p >>  6) & 0x1f) * gs;
-               rgba[i][bDst] = ((p >>  1) & 0x1f) * bs;
-               rgba[i][aDst] = ((p      ) & 0x1)  * as;
-            }
-         }
-         else {
-            const GLushort *ussrc = (const GLushort *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLushort p = ussrc[i];
-               rgba[i][rDst] = ((p >> 11)       ) * rs;
-               rgba[i][gDst] = ((p >>  6) & 0x1f) * gs;
-               rgba[i][bDst] = ((p >>  1) & 0x1f) * bs;
-               rgba[i][aDst] = ((p      ) & 0x1)  * as;
-            }
-         }
-         break;
-      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
-         if (!intFormat) {
-            rs = gs = bs = 1.0F / 31.0F;
-         }
-         if (swapBytes) {
-            const GLushort *ussrc = (const GLushort *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLushort p = ussrc[i];
-               SWAP2BYTE(p);
-               rgba[i][rDst] = ((p      ) & 0x1f) * rs;
-               rgba[i][gDst] = ((p >>  5) & 0x1f) * gs;
-               rgba[i][bDst] = ((p >> 10) & 0x1f) * bs;
-               rgba[i][aDst] = ((p >> 15)       ) * as;
-            }
-         }
-         else {
-            const GLushort *ussrc = (const GLushort *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLushort p = ussrc[i];
-               rgba[i][rDst] = ((p      ) & 0x1f) * rs;
-               rgba[i][gDst] = ((p >>  5) & 0x1f) * gs;
-               rgba[i][bDst] = ((p >> 10) & 0x1f) * bs;
-               rgba[i][aDst] = ((p >> 15)       ) * as;
-            }
-         }
-         break;
-      case GL_UNSIGNED_INT_8_8_8_8:
-         if (swapBytes) {
-            const GLuint *uisrc = (const GLuint *) src;
-            GLuint i;
-            if (intFormat) {
-               for (i = 0; i < n; i ++) {
-                  GLuint p = uisrc[i];
-                  rgba[i][rDst] = (GLfloat) ((p      ) & 0xff);
-                  rgba[i][gDst] = (GLfloat) ((p >>  8) & 0xff);
-                  rgba[i][bDst] = (GLfloat) ((p >> 16) & 0xff);
-                  rgba[i][aDst] = (GLfloat) ((p >> 24)       );
-               }
-            }
-            else {
-               for (i = 0; i < n; i ++) {
-                  GLuint p = uisrc[i];
-                  rgba[i][rDst] = UBYTE_TO_FLOAT((p      ) & 0xff);
-                  rgba[i][gDst] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
-                  rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
-                  rgba[i][aDst] = UBYTE_TO_FLOAT((p >> 24)       );
-               }
-            }
-         }
-         else {
-            const GLuint *uisrc = (const GLuint *) src;
-            GLuint i;
-            if (intFormat) {
-               for (i = 0; i < n; i ++) {
-                  GLuint p = uisrc[i];
-                  rgba[i][rDst] = (GLfloat) ((p >> 24)       );
-                  rgba[i][gDst] = (GLfloat) ((p >> 16) & 0xff);
-                  rgba[i][bDst] = (GLfloat) ((p >>  8) & 0xff);
-                  rgba[i][aDst] = (GLfloat) ((p      ) & 0xff);
-               }
-            }
-            else {
-               for (i = 0; i < n; i ++) {
-                  GLuint p = uisrc[i];
-                  rgba[i][rDst] = UBYTE_TO_FLOAT((p >> 24)       );
-                  rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
-                  rgba[i][bDst] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
-                  rgba[i][aDst] = UBYTE_TO_FLOAT((p      ) & 0xff);
-               }
-            }
-         }
-         break;
-      case GL_UNSIGNED_INT_8_8_8_8_REV:
-         if (swapBytes) {
-            const GLuint *uisrc = (const GLuint *) src;
-            GLuint i;
-            if (intFormat) {
-               for (i = 0; i < n; i ++) {
-                  GLuint p = uisrc[i];
-                  rgba[i][rDst] = (GLfloat) ((p >> 24)       );
-                  rgba[i][gDst] = (GLfloat) ((p >> 16) & 0xff);
-                  rgba[i][bDst] = (GLfloat) ((p >>  8) & 0xff);
-                  rgba[i][aDst] = (GLfloat) ((p      ) & 0xff);
-               }
-            }
-            else {
-               for (i = 0; i < n; i ++) {
-                  GLuint p = uisrc[i];
-                  rgba[i][rDst] = UBYTE_TO_FLOAT((p >> 24)       );
-                  rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
-                  rgba[i][bDst] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
-                  rgba[i][aDst] = UBYTE_TO_FLOAT((p      ) & 0xff);
-               }
-            }
-         }
-         else {
-            const GLuint *uisrc = (const GLuint *) src;
-            GLuint i;
-            if (intFormat) {
-               for (i = 0; i < n; i ++) {
-                  GLuint p = uisrc[i];
-                  rgba[i][rDst] = (GLfloat) ((p      ) & 0xff);
-                  rgba[i][gDst] = (GLfloat) ((p >>  8) & 0xff);
-                  rgba[i][bDst] = (GLfloat) ((p >> 16) & 0xff);
-                  rgba[i][aDst] = (GLfloat) ((p >> 24)       );
-               }
-            }
-            else {
-               for (i = 0; i < n; i ++) {
-                  GLuint p = uisrc[i];
-                  rgba[i][rDst] = UBYTE_TO_FLOAT((p      ) & 0xff);
-                  rgba[i][gDst] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
-                  rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
-                  rgba[i][aDst] = UBYTE_TO_FLOAT((p >> 24)       );
-               }
-            }
-         }
-         break;
-      case GL_UNSIGNED_INT_10_10_10_2:
-         if (!intFormat) {
-            rs = 1.0F / 1023.0F;
-            gs = 1.0F / 1023.0F;
-            bs = 1.0F / 1023.0F;
-            as = 1.0F / 3.0F;
-         }
-         if (swapBytes) {
-            const GLuint *uisrc = (const GLuint *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLuint p = uisrc[i];
-               SWAP4BYTE(p);
-               rgba[i][rDst] = ((p >> 22)        ) * rs;
-               rgba[i][gDst] = ((p >> 12) & 0x3ff) * gs;
-               rgba[i][bDst] = ((p >>  2) & 0x3ff) * bs;
-               rgba[i][aDst] = ((p      ) & 0x3  ) * as;
-            }
-         }
-         else {
-            const GLuint *uisrc = (const GLuint *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLuint p = uisrc[i];
-               rgba[i][rDst] = ((p >> 22)        ) * rs;
-               rgba[i][gDst] = ((p >> 12) & 0x3ff) * gs;
-               rgba[i][bDst] = ((p >>  2) & 0x3ff) * bs;
-               rgba[i][aDst] = ((p      ) & 0x3  ) * as;
-            }
-         }
-         break;
-      case GL_UNSIGNED_INT_2_10_10_10_REV:
-         if (!intFormat) {
-            rs = 1.0F / 1023.0F;
-            gs = 1.0F / 1023.0F;
-            bs = 1.0F / 1023.0F;
-            as = 1.0F / 3.0F;
-         }
-         if (swapBytes) {
-            const GLuint *uisrc = (const GLuint *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLuint p = uisrc[i];
-               SWAP4BYTE(p);
-               rgba[i][rDst] = ((p      ) & 0x3ff) * rs;
-               rgba[i][gDst] = ((p >> 10) & 0x3ff) * gs;
-               rgba[i][bDst] = ((p >> 20) & 0x3ff) * bs;
-               rgba[i][aDst] = ((p >> 30)        ) * as;
-            }
-         }
-         else {
-            const GLuint *uisrc = (const GLuint *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLuint p = uisrc[i];
-               rgba[i][rDst] = ((p      ) & 0x3ff) * rs;
-               rgba[i][gDst] = ((p >> 10) & 0x3ff) * gs;
-               rgba[i][bDst] = ((p >> 20) & 0x3ff) * bs;
-               rgba[i][aDst] = ((p >> 30)        ) * as;
-            }
-         }
-         break;
-      default:
-         _mesa_problem(NULL, "bad srcType in extract float data");
-         break;
-   }
-#undef PROCESS
-}
-
-
-static INLINE GLuint
-clamp_byte_to_uint(GLbyte b)
-{
-   return b < 0 ? 0 : b;
-}
-
-
-static INLINE GLuint
-clamp_short_to_uint(GLshort s)
-{
-   return s < 0 ? 0 : s;
-}
-
-
-static INLINE GLuint
-clamp_int_to_uint(GLint i)
-{
-   return i < 0 ? 0 : i;
-}
-
-
-static INLINE GLuint
-clamp_float_to_uint(GLfloat f)
-{
-   return f < 0.0F ? 0 : IROUND(f);
-}
-
-
-static INLINE GLuint
-clamp_half_to_uint(GLhalfARB h)
-{
-   GLfloat f = _mesa_half_to_float(h);
-   return f < 0.0F ? 0 : IROUND(f);
-}
-
-
-/**
- * \sa extract_float_rgba()
- */
-static void
-extract_uint_rgba(GLuint n, GLuint rgba[][4],
-                  GLenum srcFormat, GLenum srcType, const GLvoid *src,
-                  GLboolean swapBytes)
-{
-   GLint rSrc, gSrc, bSrc, aSrc;
-   GLint stride;
-   GLint rDst, bDst, gDst, aDst;
-   GLboolean intFormat;
-
-   ASSERT(srcFormat == GL_RED ||
-          srcFormat == GL_GREEN ||
-          srcFormat == GL_BLUE ||
-          srcFormat == GL_ALPHA ||
-          srcFormat == GL_LUMINANCE ||
-          srcFormat == GL_LUMINANCE_ALPHA ||
-          srcFormat == GL_INTENSITY ||
-          srcFormat == GL_RG ||
-          srcFormat == GL_RGB ||
-          srcFormat == GL_BGR ||
-          srcFormat == GL_RGBA ||
-          srcFormat == GL_BGRA ||
-          srcFormat == GL_ABGR_EXT ||
-          srcFormat == GL_DU8DV8_ATI ||
-          srcFormat == GL_DUDV_ATI ||
-          srcFormat == GL_RED_INTEGER_EXT ||
-          srcFormat == GL_GREEN_INTEGER_EXT ||
-          srcFormat == GL_BLUE_INTEGER_EXT ||
-          srcFormat == GL_ALPHA_INTEGER_EXT ||
-          srcFormat == GL_RGB_INTEGER_EXT ||
-          srcFormat == GL_RGBA_INTEGER_EXT ||
-          srcFormat == GL_BGR_INTEGER_EXT ||
-          srcFormat == GL_BGRA_INTEGER_EXT ||
-          srcFormat == GL_LUMINANCE_INTEGER_EXT ||
-          srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT);
-
-   ASSERT(srcType == GL_UNSIGNED_BYTE ||
-          srcType == GL_BYTE ||
-          srcType == GL_UNSIGNED_SHORT ||
-          srcType == GL_SHORT ||
-          srcType == GL_UNSIGNED_INT ||
-          srcType == GL_INT ||
-          srcType == GL_HALF_FLOAT_ARB ||
-          srcType == GL_FLOAT ||
-          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
-          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
-          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
-          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
-          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
-          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
-          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
-          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
-          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
-          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
-          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
-          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
-
-   get_component_mapping(srcFormat,
-                         &rSrc, &gSrc, &bSrc, &aSrc,
-                         &rDst, &gDst, &bDst, &aDst);
-
-   stride = _mesa_components_in_format(srcFormat);
-
-   intFormat = _mesa_is_integer_format(srcFormat);
-
-#define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION)	\
-   if ((SRC_INDEX) < 0) {						\
-      GLuint i;								\
-      for (i = 0; i < n; i++) {						\
-         rgba[i][DST_INDEX] = DEFAULT;					\
-      }									\
-   }									\
-   else if (swapBytes) {						\
-      const TYPE *s = (const TYPE *) src;				\
-      GLuint i;								\
-      for (i = 0; i < n; i++) {						\
-         TYPE value = s[SRC_INDEX];					\
-         if (sizeof(TYPE) == 2) {					\
-            SWAP2BYTE(value);						\
-         }								\
-         else if (sizeof(TYPE) == 4) {					\
-            SWAP4BYTE(value);						\
-         }								\
-         rgba[i][DST_INDEX] = CONVERSION(value);                        \
-         s += stride;							\
-      }									\
-   }									\
-   else {								\
-      const TYPE *s = (const TYPE *) src;				\
-      GLuint i;								\
-      for (i = 0; i < n; i++) {						\
-         rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]);			\
-         s += stride;							\
-      }									\
-   }
-
-   switch (srcType) {
-      case GL_UNSIGNED_BYTE:
-         PROCESS(rSrc, RCOMP, 0, GLubyte, (GLuint));
-         PROCESS(gSrc, GCOMP, 0, GLubyte, (GLuint));
-         PROCESS(bSrc, BCOMP, 0, GLubyte, (GLuint));
-         PROCESS(aSrc, ACOMP, 1, GLubyte, (GLuint));
-         break;
-      case GL_BYTE:
-         PROCESS(rSrc, RCOMP, 0, GLbyte, clamp_byte_to_uint);
-         PROCESS(gSrc, GCOMP, 0, GLbyte, clamp_byte_to_uint);
-         PROCESS(bSrc, BCOMP, 0, GLbyte, clamp_byte_to_uint);
-         PROCESS(aSrc, ACOMP, 1, GLbyte, clamp_byte_to_uint);
-         break;
-      case GL_UNSIGNED_SHORT:
-         PROCESS(rSrc, RCOMP, 0, GLushort, (GLuint));
-         PROCESS(gSrc, GCOMP, 0, GLushort, (GLuint));
-         PROCESS(bSrc, BCOMP, 0, GLushort, (GLuint));
-         PROCESS(aSrc, ACOMP, 1, GLushort, (GLuint));
-         break;
-      case GL_SHORT:
-         PROCESS(rSrc, RCOMP, 0, GLshort, clamp_short_to_uint);
-         PROCESS(gSrc, GCOMP, 0, GLshort, clamp_short_to_uint);
-         PROCESS(bSrc, BCOMP, 0, GLshort, clamp_short_to_uint);
-         PROCESS(aSrc, ACOMP, 1, GLshort, clamp_short_to_uint);
-         break;
-      case GL_UNSIGNED_INT:
-         PROCESS(rSrc, RCOMP, 0, GLuint, (GLuint));
-         PROCESS(gSrc, GCOMP, 0, GLuint, (GLuint));
-         PROCESS(bSrc, BCOMP, 0, GLuint, (GLuint));
-         PROCESS(aSrc, ACOMP, 1, GLuint, (GLuint));
-         break;
-      case GL_INT:
-         PROCESS(rSrc, RCOMP, 0, GLint, clamp_int_to_uint);
-         PROCESS(gSrc, GCOMP, 0, GLint, clamp_int_to_uint);
-         PROCESS(bSrc, BCOMP, 0, GLint, clamp_int_to_uint);
-         PROCESS(aSrc, ACOMP, 1, GLint, clamp_int_to_uint);
-         break;
-      case GL_FLOAT:
-         PROCESS(rSrc, RCOMP, 0, GLfloat, clamp_float_to_uint);
-         PROCESS(gSrc, GCOMP, 0, GLfloat, clamp_float_to_uint);
-         PROCESS(bSrc, BCOMP, 0, GLfloat, clamp_float_to_uint);
-         PROCESS(aSrc, ACOMP, 1, GLfloat, clamp_float_to_uint);
-         break;
-      case GL_HALF_FLOAT_ARB:
-         PROCESS(rSrc, RCOMP, 0, GLhalfARB, clamp_half_to_uint);
-         PROCESS(gSrc, GCOMP, 0, GLhalfARB, clamp_half_to_uint);
-         PROCESS(bSrc, BCOMP, 0, GLhalfARB, clamp_half_to_uint);
-         PROCESS(aSrc, ACOMP, 1, GLhalfARB, clamp_half_to_uint);
-         break;
-      case GL_UNSIGNED_BYTE_3_3_2:
-         {
-            const GLubyte *ubsrc = (const GLubyte *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLubyte p = ubsrc[i];
-               rgba[i][rDst] = ((p >> 5)      );
-               rgba[i][gDst] = ((p >> 2) & 0x7);
-               rgba[i][bDst] = ((p     ) & 0x3);
-               rgba[i][aDst] = 1;
-            }
-         }
-         break;
-      case GL_UNSIGNED_BYTE_2_3_3_REV:
-         {
-            const GLubyte *ubsrc = (const GLubyte *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLubyte p = ubsrc[i];
-               rgba[i][rDst] = ((p     ) & 0x7);
-               rgba[i][gDst] = ((p >> 3) & 0x7);
-               rgba[i][bDst] = ((p >> 6)      );
-               rgba[i][aDst] = 1;
-            }
-         }
-         break;
-      case GL_UNSIGNED_SHORT_5_6_5:
-         if (swapBytes) {
-            const GLushort *ussrc = (const GLushort *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLushort p = ussrc[i];
-               SWAP2BYTE(p);
-               rgba[i][rDst] = ((p >> 11)       );
-               rgba[i][gDst] = ((p >>  5) & 0x3f);
-               rgba[i][bDst] = ((p      ) & 0x1f);
-               rgba[i][aDst] = 1;
-            }
-         }
-         else {
-            const GLushort *ussrc = (const GLushort *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLushort p = ussrc[i];
-               rgba[i][rDst] = ((p >> 11)       );
-               rgba[i][gDst] = ((p >>  5) & 0x3f);
-               rgba[i][bDst] = ((p      ) & 0x1f);
-               rgba[i][aDst] = 1;
-            }
-         }
-         break;
-      case GL_UNSIGNED_SHORT_5_6_5_REV:
-         if (swapBytes) {
-            const GLushort *ussrc = (const GLushort *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLushort p = ussrc[i];
-               SWAP2BYTE(p);
-               rgba[i][rDst] = ((p      ) & 0x1f);
-               rgba[i][gDst] = ((p >>  5) & 0x3f);
-               rgba[i][bDst] = ((p >> 11)       );
-               rgba[i][aDst] = 1;
-            }
-         }
-         else {
-            const GLushort *ussrc = (const GLushort *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLushort p = ussrc[i];
-               rgba[i][rDst] = ((p      ) & 0x1f);
-               rgba[i][gDst] = ((p >>  5) & 0x3f);
-               rgba[i][bDst] = ((p >> 11)       );
-               rgba[i][aDst] = 1;
-            }
-         }
-         break;
-      case GL_UNSIGNED_SHORT_4_4_4_4:
-         if (swapBytes) {
-            const GLushort *ussrc = (const GLushort *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLushort p = ussrc[i];
-               SWAP2BYTE(p);
-               rgba[i][rDst] = ((p >> 12)      );
-               rgba[i][gDst] = ((p >>  8) & 0xf);
-               rgba[i][bDst] = ((p >>  4) & 0xf);
-               rgba[i][aDst] = ((p      ) & 0xf);
-            }
-         }
-         else {
-            const GLushort *ussrc = (const GLushort *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLushort p = ussrc[i];
-               rgba[i][rDst] = ((p >> 12)      );
-               rgba[i][gDst] = ((p >>  8) & 0xf);
-               rgba[i][bDst] = ((p >>  4) & 0xf);
-               rgba[i][aDst] = ((p      ) & 0xf);
-            }
-         }
-         break;
-      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
-         if (swapBytes) {
-            const GLushort *ussrc = (const GLushort *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLushort p = ussrc[i];
-               SWAP2BYTE(p);
-               rgba[i][rDst] = ((p      ) & 0xf);
-               rgba[i][gDst] = ((p >>  4) & 0xf);
-               rgba[i][bDst] = ((p >>  8) & 0xf);
-               rgba[i][aDst] = ((p >> 12)      );
-            }
-         }
-         else {
-            const GLushort *ussrc = (const GLushort *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLushort p = ussrc[i];
-               rgba[i][rDst] = ((p      ) & 0xf);
-               rgba[i][gDst] = ((p >>  4) & 0xf);
-               rgba[i][bDst] = ((p >>  8) & 0xf);
-               rgba[i][aDst] = ((p >> 12)      );
-            }
-         }
-         break;
-      case GL_UNSIGNED_SHORT_5_5_5_1:
-         if (swapBytes) {
-            const GLushort *ussrc = (const GLushort *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLushort p = ussrc[i];
-               SWAP2BYTE(p);
-               rgba[i][rDst] = ((p >> 11)       );
-               rgba[i][gDst] = ((p >>  6) & 0x1f);
-               rgba[i][bDst] = ((p >>  1) & 0x1f);
-               rgba[i][aDst] = ((p      ) & 0x1 );
-            }
-         }
-         else {
-            const GLushort *ussrc = (const GLushort *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLushort p = ussrc[i];
-               rgba[i][rDst] = ((p >> 11)       );
-               rgba[i][gDst] = ((p >>  6) & 0x1f);
-               rgba[i][bDst] = ((p >>  1) & 0x1f);
-               rgba[i][aDst] = ((p      ) & 0x1 );
-            }
-         }
-         break;
-      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
-         if (swapBytes) {
-            const GLushort *ussrc = (const GLushort *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLushort p = ussrc[i];
-               SWAP2BYTE(p);
-               rgba[i][rDst] = ((p      ) & 0x1f);
-               rgba[i][gDst] = ((p >>  5) & 0x1f);
-               rgba[i][bDst] = ((p >> 10) & 0x1f);
-               rgba[i][aDst] = ((p >> 15)       );
-            }
-         }
-         else {
-            const GLushort *ussrc = (const GLushort *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLushort p = ussrc[i];
-               rgba[i][rDst] = ((p      ) & 0x1f);
-               rgba[i][gDst] = ((p >>  5) & 0x1f);
-               rgba[i][bDst] = ((p >> 10) & 0x1f);
-               rgba[i][aDst] = ((p >> 15)       );
-            }
-         }
-         break;
-      case GL_UNSIGNED_INT_8_8_8_8:
-         if (swapBytes) {
-            const GLuint *uisrc = (const GLuint *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLuint p = uisrc[i];
-               rgba[i][rDst] = ((p      ) & 0xff);
-               rgba[i][gDst] = ((p >>  8) & 0xff);
-               rgba[i][bDst] = ((p >> 16) & 0xff);
-               rgba[i][aDst] = ((p >> 24)       );
-            }
-         }
-         else {
-            const GLuint *uisrc = (const GLuint *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLuint p = uisrc[i];
-               rgba[i][rDst] = ((p >> 24)       );
-               rgba[i][gDst] = ((p >> 16) & 0xff);
-               rgba[i][bDst] = ((p >>  8) & 0xff);
-               rgba[i][aDst] = ((p      ) & 0xff);
-            }
-         }
-         break;
-      case GL_UNSIGNED_INT_8_8_8_8_REV:
-         if (swapBytes) {
-            const GLuint *uisrc = (const GLuint *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLuint p = uisrc[i];
-               rgba[i][rDst] = ((p >> 24)       );
-               rgba[i][gDst] = ((p >> 16) & 0xff);
-               rgba[i][bDst] = ((p >>  8) & 0xff);
-               rgba[i][aDst] = ((p      ) & 0xff);
-            }
-         }
-         else {
-            const GLuint *uisrc = (const GLuint *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLuint p = uisrc[i];
-               rgba[i][rDst] = ((p      ) & 0xff);
-               rgba[i][gDst] = ((p >>  8) & 0xff);
-               rgba[i][bDst] = ((p >> 16) & 0xff);
-               rgba[i][aDst] = ((p >> 24)       );
-            }
-         }
-         break;
-      case GL_UNSIGNED_INT_10_10_10_2:
-         if (swapBytes) {
-            const GLuint *uisrc = (const GLuint *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLuint p = uisrc[i];
-               SWAP4BYTE(p);
-               rgba[i][rDst] = ((p >> 22)        );
-               rgba[i][gDst] = ((p >> 12) & 0x3ff);
-               rgba[i][bDst] = ((p >>  2) & 0x3ff);
-               rgba[i][aDst] = ((p      ) & 0x3  );
-            }
-         }
-         else {
-            const GLuint *uisrc = (const GLuint *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLuint p = uisrc[i];
-               rgba[i][rDst] = ((p >> 22)        );
-               rgba[i][gDst] = ((p >> 12) & 0x3ff);
-               rgba[i][bDst] = ((p >>  2) & 0x3ff);
-               rgba[i][aDst] = ((p      ) & 0x3  );
-            }
-         }
-         break;
-      case GL_UNSIGNED_INT_2_10_10_10_REV:
-         if (swapBytes) {
-            const GLuint *uisrc = (const GLuint *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLuint p = uisrc[i];
-               SWAP4BYTE(p);
-               rgba[i][rDst] = ((p      ) & 0x3ff);
-               rgba[i][gDst] = ((p >> 10) & 0x3ff);
-               rgba[i][bDst] = ((p >> 20) & 0x3ff);
-               rgba[i][aDst] = ((p >> 30)        );
-            }
-         }
-         else {
-            const GLuint *uisrc = (const GLuint *) src;
-            GLuint i;
-            for (i = 0; i < n; i ++) {
-               GLuint p = uisrc[i];
-               rgba[i][rDst] = ((p      ) & 0x3ff);
-               rgba[i][gDst] = ((p >> 10) & 0x3ff);
-               rgba[i][bDst] = ((p >> 20) & 0x3ff);
-               rgba[i][aDst] = ((p >> 30)        );
-            }
-         }
-         break;
-      default:
-         _mesa_problem(NULL, "bad srcType in extract uint data");
-         break;
-   }
-#undef PROCESS
-}
-
-
-
-/*
- * Unpack a row of color image data from a client buffer according to
- * the pixel unpacking parameters.
- * Return GLchan values in the specified dest image format.
- * This is used by glDrawPixels and glTexImage?D().
- * \param ctx - the context
- *         n - number of pixels in the span
- *         dstFormat - format of destination color array
- *         dest - the destination color array
- *         srcFormat - source image format
- *         srcType - source image  data type
- *         source - source image pointer
- *         srcPacking - pixel unpacking parameters
- *         transferOps - bitmask of IMAGE_*_BIT values of operations to apply
- *
- * XXX perhaps expand this to process whole images someday.
- */
-void
-_mesa_unpack_color_span_chan( struct gl_context *ctx,
-                              GLuint n, GLenum dstFormat, GLchan dest[],
-                              GLenum srcFormat, GLenum srcType,
-                              const GLvoid *source,
-                              const struct gl_pixelstore_attrib *srcPacking,
-                              GLbitfield transferOps )
-{
-   ASSERT(dstFormat == GL_ALPHA ||
-          dstFormat == GL_LUMINANCE ||
-          dstFormat == GL_LUMINANCE_ALPHA ||
-          dstFormat == GL_INTENSITY ||
-          dstFormat == GL_RED ||
-          dstFormat == GL_RG ||
-          dstFormat == GL_RGB ||
-          dstFormat == GL_RGBA ||
-          dstFormat == GL_COLOR_INDEX);
-
-   ASSERT(srcFormat == GL_RED ||
-          srcFormat == GL_GREEN ||
-          srcFormat == GL_BLUE ||
-          srcFormat == GL_ALPHA ||
-          srcFormat == GL_LUMINANCE ||
-          srcFormat == GL_LUMINANCE_ALPHA ||
-          srcFormat == GL_INTENSITY ||
-          srcFormat == GL_RG ||
-          srcFormat == GL_RGB ||
-          srcFormat == GL_BGR ||
-          srcFormat == GL_RGBA ||
-          srcFormat == GL_BGRA ||
-          srcFormat == GL_ABGR_EXT ||
-          srcFormat == GL_COLOR_INDEX);
-
-   ASSERT(srcType == GL_BITMAP ||
-          srcType == GL_UNSIGNED_BYTE ||
-          srcType == GL_BYTE ||
-          srcType == GL_UNSIGNED_SHORT ||
-          srcType == GL_SHORT ||
-          srcType == GL_UNSIGNED_INT ||
-          srcType == GL_INT ||
-          srcType == GL_HALF_FLOAT_ARB ||
-          srcType == GL_FLOAT ||
-          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
-          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
-          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
-          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
-          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
-          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
-          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
-          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
-          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
-          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
-          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
-          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
-
-   /* Try simple cases first */
-   if (transferOps == 0) {
-      if (srcType == CHAN_TYPE) {
-         if (dstFormat == GL_RGBA) {
-            if (srcFormat == GL_RGBA) {
-               memcpy( dest, source, n * 4 * sizeof(GLchan) );
-               return;
-            }
-            else if (srcFormat == GL_RGB) {
-               GLuint i;
-               const GLchan *src = (const GLchan *) source;
-               GLchan *dst = dest;
-               for (i = 0; i < n; i++) {
-                  dst[0] = src[0];
-                  dst[1] = src[1];
-                  dst[2] = src[2];
-                  dst[3] = CHAN_MAX;
-                  src += 3;
-                  dst += 4;
-               }
-               return;
-            }
-         }
-         else if (dstFormat == GL_RGB) {
-            if (srcFormat == GL_RGB) {
-               memcpy( dest, source, n * 3 * sizeof(GLchan) );
-               return;
-            }
-            else if (srcFormat == GL_RGBA) {
-               GLuint i;
-               const GLchan *src = (const GLchan *) source;
-               GLchan *dst = dest;
-               for (i = 0; i < n; i++) {
-                  dst[0] = src[0];
-                  dst[1] = src[1];
-                  dst[2] = src[2];
-                  src += 4;
-                  dst += 3;
-               }
-               return;
-            }
-         }
-         else if (dstFormat == srcFormat) {
-            GLint comps = _mesa_components_in_format(srcFormat);
-            assert(comps > 0);
-            memcpy( dest, source, n * comps * sizeof(GLchan) );
-            return;
-         }
-      }
-      /*
-       * Common situation, loading 8bit RGBA/RGB source images
-       * into 16/32 bit destination. (OSMesa16/32)
-       */
-      else if (srcType == GL_UNSIGNED_BYTE) {
-         if (dstFormat == GL_RGBA) {
-            if (srcFormat == GL_RGB) {
-               GLuint i;
-               const GLubyte *src = (const GLubyte *) source;
-               GLchan *dst = dest;
-               for (i = 0; i < n; i++) {
-                  dst[0] = UBYTE_TO_CHAN(src[0]);
-                  dst[1] = UBYTE_TO_CHAN(src[1]);
-                  dst[2] = UBYTE_TO_CHAN(src[2]);
-                  dst[3] = CHAN_MAX;
-                  src += 3;
-                  dst += 4;
-               }
-               return;
-            }
-            else if (srcFormat == GL_RGBA) {
-               GLuint i;
-               const GLubyte *src = (const GLubyte *) source;
-               GLchan *dst = dest;
-               for (i = 0; i < n; i++) {
-                  dst[0] = UBYTE_TO_CHAN(src[0]);
-                  dst[1] = UBYTE_TO_CHAN(src[1]);
-                  dst[2] = UBYTE_TO_CHAN(src[2]);
-                  dst[3] = UBYTE_TO_CHAN(src[3]);
-                  src += 4;
-                  dst += 4;
-               }
-               return;
-             }
-         }
-         else if (dstFormat == GL_RGB) {
-            if (srcFormat == GL_RGB) {
-               GLuint i;
-               const GLubyte *src = (const GLubyte *) source;
-               GLchan *dst = dest;
-               for (i = 0; i < n; i++) {
-                  dst[0] = UBYTE_TO_CHAN(src[0]);
-                  dst[1] = UBYTE_TO_CHAN(src[1]);
-                  dst[2] = UBYTE_TO_CHAN(src[2]);
-                  src += 3;
-                  dst += 3;
-               }
-               return;
-            }
-            else if (srcFormat == GL_RGBA) {
-               GLuint i;
-               const GLubyte *src = (const GLubyte *) source;
-               GLchan *dst = dest;
-               for (i = 0; i < n; i++) {
-                  dst[0] = UBYTE_TO_CHAN(src[0]);
-                  dst[1] = UBYTE_TO_CHAN(src[1]);
-                  dst[2] = UBYTE_TO_CHAN(src[2]);
-                  src += 4;
-                  dst += 3;
-               }
-               return;
-            }
-         }
-      }
-   }
-
-
-   /* general solution begins here */
-   {
-      GLint dstComponents;
-      GLint rDst, gDst, bDst, aDst, lDst, iDst;
-      GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat));
-
-      if (!rgba) {
-         _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
-         return;
-      }
-
-      dstComponents = _mesa_components_in_format( dstFormat );
-      /* source & dest image formats should have been error checked by now */
-      assert(dstComponents > 0);
-
-      /*
-       * Extract image data and convert to RGBA floats
-       */
-      if (srcFormat == GL_COLOR_INDEX) {
-         GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
-
-         if (!indexes) {
-            _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
-            return;
-         }
-
-         extract_uint_indexes(n, indexes, srcFormat, srcType, source,
-                              srcPacking);
-
-         if (dstFormat == GL_COLOR_INDEX) {
-            GLuint i;
-            _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes);
-            /* convert to GLchan and return */
-            for (i = 0; i < n; i++) {
-               dest[i] = (GLchan) (indexes[i] & 0xff);
-            }
-            free(indexes);
-            free(rgba);
-            return;
-         }
-         else {
-            /* Convert indexes to RGBA */
-            if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
-               _mesa_shift_and_offset_ci(ctx, n, indexes);
-            }
-            _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
-         }
-
-         /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
-          * with color indexes.
-          */
-         transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT);
-
-         free(indexes);
-      }
-      else {
-         /* non-color index data */
-         extract_float_rgba(n, rgba, srcFormat, srcType, source,
-                            srcPacking->SwapBytes);
-      }
-
-      /* Need to clamp if returning GLubytes or GLushorts */
-#if CHAN_TYPE != GL_FLOAT
-      transferOps |= IMAGE_CLAMP_BIT;
-#endif
-
-      if (transferOps) {
-         _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
-      }
-
-      get_component_indexes(dstFormat,
-                            &rDst, &gDst, &bDst, &aDst, &lDst, &iDst);
-
-      /* Now return the GLchan data in the requested dstFormat */
-      if (rDst >= 0) {
-         GLchan *dst = dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            CLAMPED_FLOAT_TO_CHAN(dst[rDst], rgba[i][RCOMP]);
-            dst += dstComponents;
-         }
-      }
-
-      if (gDst >= 0) {
-         GLchan *dst = dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            CLAMPED_FLOAT_TO_CHAN(dst[gDst], rgba[i][GCOMP]);
-            dst += dstComponents;
-         }
-      }
-
-      if (bDst >= 0) {
-         GLchan *dst = dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            CLAMPED_FLOAT_TO_CHAN(dst[bDst], rgba[i][BCOMP]);
-            dst += dstComponents;
-         }
-      }
-
-      if (aDst >= 0) {
-         GLchan *dst = dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            CLAMPED_FLOAT_TO_CHAN(dst[aDst], rgba[i][ACOMP]);
-            dst += dstComponents;
-         }
-      }
-
-      if (iDst >= 0) {
-         GLchan *dst = dest;
-         GLuint i;
-         assert(iDst == 0);
-         assert(dstComponents == 1);
-         for (i = 0; i < n; i++) {
-            /* Intensity comes from red channel */
-            CLAMPED_FLOAT_TO_CHAN(dst[i], rgba[i][RCOMP]);
-         }
-      }
-
-      if (lDst >= 0) {
-         GLchan *dst = dest;
-         GLuint i;
-         assert(lDst == 0);
-         for (i = 0; i < n; i++) {
-            /* Luminance comes from red channel */
-            CLAMPED_FLOAT_TO_CHAN(dst[0], rgba[i][RCOMP]);
-            dst += dstComponents;
-         }
-      }
-
-      free(rgba);
-   }
-}
-
-
-/**
- * Same as _mesa_unpack_color_span_chan(), but return GLfloat data
- * instead of GLchan.
- */
-void
-_mesa_unpack_color_span_float( struct gl_context *ctx,
-                               GLuint n, GLenum dstFormat, GLfloat dest[],
-                               GLenum srcFormat, GLenum srcType,
-                               const GLvoid *source,
-                               const struct gl_pixelstore_attrib *srcPacking,
-                               GLbitfield transferOps )
-{
-   ASSERT(dstFormat == GL_ALPHA ||
-          dstFormat == GL_LUMINANCE ||
-          dstFormat == GL_LUMINANCE_ALPHA ||
-          dstFormat == GL_INTENSITY ||
-          dstFormat == GL_RED ||
-          dstFormat == GL_RG ||
-          dstFormat == GL_RGB ||
-          dstFormat == GL_RGBA ||
-          dstFormat == GL_COLOR_INDEX);
-
-   ASSERT(srcFormat == GL_RED ||
-          srcFormat == GL_GREEN ||
-          srcFormat == GL_BLUE ||
-          srcFormat == GL_ALPHA ||
-          srcFormat == GL_LUMINANCE ||
-          srcFormat == GL_LUMINANCE_ALPHA ||
-          srcFormat == GL_INTENSITY ||
-          srcFormat == GL_RG ||
-          srcFormat == GL_RGB ||
-          srcFormat == GL_BGR ||
-          srcFormat == GL_RGBA ||
-          srcFormat == GL_BGRA ||
-          srcFormat == GL_ABGR_EXT ||
-          srcFormat == GL_RED_INTEGER_EXT ||
-          srcFormat == GL_GREEN_INTEGER_EXT ||
-          srcFormat == GL_BLUE_INTEGER_EXT ||
-          srcFormat == GL_ALPHA_INTEGER_EXT ||
-          srcFormat == GL_RGB_INTEGER_EXT ||
-          srcFormat == GL_RGBA_INTEGER_EXT ||
-          srcFormat == GL_BGR_INTEGER_EXT ||
-          srcFormat == GL_BGRA_INTEGER_EXT ||
-          srcFormat == GL_LUMINANCE_INTEGER_EXT ||
-          srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT ||
-          srcFormat == GL_COLOR_INDEX);
-
-   ASSERT(srcType == GL_BITMAP ||
-          srcType == GL_UNSIGNED_BYTE ||
-          srcType == GL_BYTE ||
-          srcType == GL_UNSIGNED_SHORT ||
-          srcType == GL_SHORT ||
-          srcType == GL_UNSIGNED_INT ||
-          srcType == GL_INT ||
-          srcType == GL_HALF_FLOAT_ARB ||
-          srcType == GL_FLOAT ||
-          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
-          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
-          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
-          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
-          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
-          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
-          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
-          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
-          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
-          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
-          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
-          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
-
-   /* general solution, no special cases, yet */
-   {
-      GLint dstComponents;
-      GLint rDst, gDst, bDst, aDst, lDst, iDst;
-      GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat));
-
-      if (!rgba) {
-         _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
-         return;
-      }
-
-      dstComponents = _mesa_components_in_format( dstFormat );
-      /* source & dest image formats should have been error checked by now */
-      assert(dstComponents > 0);
-
-      /*
-       * Extract image data and convert to RGBA floats
-       */
-      if (srcFormat == GL_COLOR_INDEX) {
-         GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
-
-         if (!indexes) {
-            _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
-            free(rgba);
-            return;
-         }
-
-         extract_uint_indexes(n, indexes, srcFormat, srcType, source,
-                              srcPacking);
-
-         if (dstFormat == GL_COLOR_INDEX) {
-            GLuint i;
-            _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes);
-            /* convert to GLchan and return */
-            for (i = 0; i < n; i++) {
-               dest[i] = (GLchan) (indexes[i] & 0xff);
-            }
-            free(indexes);
-            free(rgba);
-            return;
-         }
-         else {
-            /* Convert indexes to RGBA */
-            if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
-               _mesa_shift_and_offset_ci(ctx, n, indexes);
-            }
-            _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
-         }
-
-         /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
-          * with color indexes.
-          */
-         transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT);
-
-         free(indexes);
-      }
-      else {
-         /* non-color index data */
-         extract_float_rgba(n, rgba, srcFormat, srcType, source,
-                            srcPacking->SwapBytes);
-      }
-
-      if (transferOps) {
-         _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
-      }
-
-      get_component_indexes(dstFormat,
-                            &rDst, &gDst, &bDst, &aDst, &lDst, &iDst);
-
-      /* Now pack results in the requested dstFormat */
-      if (rDst >= 0) {
-         GLfloat *dst = dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            dst[rDst] = rgba[i][RCOMP];
-            dst += dstComponents;
-         }
-      }
-
-      if (gDst >= 0) {
-         GLfloat *dst = dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            dst[gDst] = rgba[i][GCOMP];
-            dst += dstComponents;
-         }
-      }
-
-      if (bDst >= 0) {
-         GLfloat *dst = dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            dst[bDst] = rgba[i][BCOMP];
-            dst += dstComponents;
-         }
-      }
-
-      if (aDst >= 0) {
-         GLfloat *dst = dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            dst[aDst] = rgba[i][ACOMP];
-            dst += dstComponents;
-         }
-      }
-
-      if (iDst >= 0) {
-         GLfloat *dst = dest;
-         GLuint i;
-         assert(iDst == 0);
-         assert(dstComponents == 1);
-         for (i = 0; i < n; i++) {
-            /* Intensity comes from red channel */
-            dst[i] = rgba[i][RCOMP];
-         }
-      }
-
-      if (lDst >= 0) {
-         GLfloat *dst = dest;
-         GLuint i;
-         assert(lDst == 0);
-         for (i = 0; i < n; i++) {
-            /* Luminance comes from red channel */
-            dst[0] = rgba[i][RCOMP];
-            dst += dstComponents;
-         }
-      }
-
-      free(rgba);
-   }
-}
-
-
-/**
- * Same as _mesa_unpack_color_span_chan(), but return GLuint data
- * instead of GLchan.
- * No pixel transfer ops are applied.
- */
-void
-_mesa_unpack_color_span_uint(struct gl_context *ctx,
-                             GLuint n, GLenum dstFormat, GLuint *dest,
-                             GLenum srcFormat, GLenum srcType,
-                             const GLvoid *source,
-                             const struct gl_pixelstore_attrib *srcPacking)
-{
-   GLuint (*rgba)[4] = (GLuint (*)[4]) malloc(n * 4 * sizeof(GLfloat));
-
-   if (!rgba) {
-      _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
-      return;
-   }
-
-   ASSERT(dstFormat == GL_ALPHA ||
-          dstFormat == GL_LUMINANCE ||
-          dstFormat == GL_LUMINANCE_ALPHA ||
-          dstFormat == GL_INTENSITY ||
-          dstFormat == GL_RED ||
-          dstFormat == GL_RG ||
-          dstFormat == GL_RGB ||
-          dstFormat == GL_RGBA);
-
-   ASSERT(srcFormat == GL_RED ||
-          srcFormat == GL_GREEN ||
-          srcFormat == GL_BLUE ||
-          srcFormat == GL_ALPHA ||
-          srcFormat == GL_LUMINANCE ||
-          srcFormat == GL_LUMINANCE_ALPHA ||
-          srcFormat == GL_INTENSITY ||
-          srcFormat == GL_RG ||
-          srcFormat == GL_RGB ||
-          srcFormat == GL_BGR ||
-          srcFormat == GL_RGBA ||
-          srcFormat == GL_BGRA ||
-          srcFormat == GL_ABGR_EXT ||
-          srcFormat == GL_RED_INTEGER_EXT ||
-          srcFormat == GL_GREEN_INTEGER_EXT ||
-          srcFormat == GL_BLUE_INTEGER_EXT ||
-          srcFormat == GL_ALPHA_INTEGER_EXT ||
-          srcFormat == GL_RGB_INTEGER_EXT ||
-          srcFormat == GL_RGBA_INTEGER_EXT ||
-          srcFormat == GL_BGR_INTEGER_EXT ||
-          srcFormat == GL_BGRA_INTEGER_EXT ||
-          srcFormat == GL_LUMINANCE_INTEGER_EXT ||
-          srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT);
-
-   ASSERT(srcType == GL_UNSIGNED_BYTE ||
-          srcType == GL_BYTE ||
-          srcType == GL_UNSIGNED_SHORT ||
-          srcType == GL_SHORT ||
-          srcType == GL_UNSIGNED_INT ||
-          srcType == GL_INT ||
-          srcType == GL_HALF_FLOAT_ARB ||
-          srcType == GL_FLOAT ||
-          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
-          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
-          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
-          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
-          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
-          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
-          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
-          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
-          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
-          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
-          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
-          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
-
-
-   /* Extract image data as uint[4] pixels */
-   extract_uint_rgba(n, rgba, srcFormat, srcType, source,
-                     srcPacking->SwapBytes);
-
-   if (dstFormat == GL_RGBA) {
-      /* simple case */
-      memcpy(dest, rgba, 4 * sizeof(GLuint) * n);
-   }
-   else {
-      /* general case */
-      GLint rDst, gDst, bDst, aDst, lDst, iDst;
-      GLint dstComponents = _mesa_components_in_format( dstFormat );
-
-      assert(dstComponents > 0);
-
-      get_component_indexes(dstFormat,
-                            &rDst, &gDst, &bDst, &aDst, &lDst, &iDst);
-
-      /* Now pack values in the requested dest format */
-      if (rDst >= 0) {
-         GLuint *dst = dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            dst[rDst] = rgba[i][RCOMP];
-            dst += dstComponents;
-         }
-      }
-
-      if (gDst >= 0) {
-         GLuint *dst = dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            dst[gDst] = rgba[i][GCOMP];
-            dst += dstComponents;
-         }
-      }
-
-      if (bDst >= 0) {
-         GLuint *dst = dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            dst[bDst] = rgba[i][BCOMP];
-            dst += dstComponents;
-         }
-      }
-
-      if (aDst >= 0) {
-         GLuint *dst = dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            dst[aDst] = rgba[i][ACOMP];
-            dst += dstComponents;
-         }
-      }
-
-      if (iDst >= 0) {
-         GLuint *dst = dest;
-         GLuint i;
-         assert(iDst == 0);
-         assert(dstComponents == 1);
-         for (i = 0; i < n; i++) {
-            /* Intensity comes from red channel */
-            dst[i] = rgba[i][RCOMP];
-         }
-      }
-
-      if (lDst >= 0) {
-         GLuint *dst = dest;
-         GLuint i;
-         assert(lDst == 0);
-         for (i = 0; i < n; i++) {
-            /* Luminance comes from red channel */
-            dst[0] = rgba[i][RCOMP];
-            dst += dstComponents;
-         }
-      }
-   }
-
-   free(rgba);
-}
-
-
-
-/**
- * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
- * directly return GLbyte data, no transfer ops apply.
- */
-void
-_mesa_unpack_dudv_span_byte( struct gl_context *ctx,
-                             GLuint n, GLenum dstFormat, GLbyte dest[],
-                             GLenum srcFormat, GLenum srcType,
-                             const GLvoid *source,
-                             const struct gl_pixelstore_attrib *srcPacking,
-                             GLbitfield transferOps )
-{
-   ASSERT(dstFormat == GL_DUDV_ATI);
-   ASSERT(srcFormat == GL_DUDV_ATI);
-
-   ASSERT(srcType == GL_UNSIGNED_BYTE ||
-          srcType == GL_BYTE ||
-          srcType == GL_UNSIGNED_SHORT ||
-          srcType == GL_SHORT ||
-          srcType == GL_UNSIGNED_INT ||
-          srcType == GL_INT ||
-          srcType == GL_HALF_FLOAT_ARB ||
-          srcType == GL_FLOAT);
-
-   /* general solution */
-   {
-      GLint dstComponents;
-      GLbyte *dst = dest;
-      GLuint i;
-      GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat));
-
-      if (!rgba) {
-         _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
-         return;
-      }
-
-      dstComponents = _mesa_components_in_format( dstFormat );
-      /* source & dest image formats should have been error checked by now */
-      assert(dstComponents > 0);
-
-      /*
-       * Extract image data and convert to RGBA floats
-       */
-      extract_float_rgba(n, rgba, srcFormat, srcType, source,
-                         srcPacking->SwapBytes);
-
-
-      /* Now determine which color channels we need to produce.
-       * And determine the dest index (offset) within each color tuple.
-       */
-
-      /* Now pack results in the requested dstFormat */
-      for (i = 0; i < n; i++) {
-         /* not sure - need clamp[-1,1] here? */
-         dst[0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
-         dst[1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
-         dst += dstComponents;
-      }
-
-      free(rgba);
-   }
-}
-
-/*
- * Unpack a row of color index data from a client buffer according to
- * the pixel unpacking parameters.
- * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
- *
- * Args:  ctx - the context
- *        n - number of pixels
- *        dstType - destination data type
- *        dest - destination array
- *        srcType - source pixel type
- *        source - source data pointer
- *        srcPacking - pixel unpacking parameters
- *        transferOps - the pixel transfer operations to apply
- */
-void
-_mesa_unpack_index_span( struct gl_context *ctx, GLuint n,
-                         GLenum dstType, GLvoid *dest,
-                         GLenum srcType, const GLvoid *source,
-                         const struct gl_pixelstore_attrib *srcPacking,
-                         GLbitfield transferOps )
-{
-   ASSERT(srcType == GL_BITMAP ||
-          srcType == GL_UNSIGNED_BYTE ||
-          srcType == GL_BYTE ||
-          srcType == GL_UNSIGNED_SHORT ||
-          srcType == GL_SHORT ||
-          srcType == GL_UNSIGNED_INT ||
-          srcType == GL_INT ||
-          srcType == GL_HALF_FLOAT_ARB ||
-          srcType == GL_FLOAT);
-
-   ASSERT(dstType == GL_UNSIGNED_BYTE ||
-          dstType == GL_UNSIGNED_SHORT ||
-          dstType == GL_UNSIGNED_INT);
-
-
-   transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
-
-   /*
-    * Try simple cases first
-    */
-   if (transferOps == 0 && srcType == GL_UNSIGNED_BYTE
-       && dstType == GL_UNSIGNED_BYTE) {
-      memcpy(dest, source, n * sizeof(GLubyte));
-   }
-   else if (transferOps == 0 && srcType == GL_UNSIGNED_INT
-            && dstType == GL_UNSIGNED_INT && !srcPacking->SwapBytes) {
-      memcpy(dest, source, n * sizeof(GLuint));
-   }
-   else {
-      /*
-       * general solution
-       */
-      GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
-
-      if (!indexes) {
-         _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
-         return;
-      }
-
-      extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source,
-                           srcPacking);
-
-      if (transferOps)
-         _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes);
-
-      /* convert to dest type */
-      switch (dstType) {
-         case GL_UNSIGNED_BYTE:
-            {
-               GLubyte *dst = (GLubyte *) dest;
-               GLuint i;
-               for (i = 0; i < n; i++) {
-                  dst[i] = (GLubyte) (indexes[i] & 0xff);
-               }
-            }
-            break;
-         case GL_UNSIGNED_SHORT:
-            {
-               GLuint *dst = (GLuint *) dest;
-               GLuint i;
-               for (i = 0; i < n; i++) {
-                  dst[i] = (GLushort) (indexes[i] & 0xffff);
-               }
-            }
-            break;
-         case GL_UNSIGNED_INT:
-            memcpy(dest, indexes, n * sizeof(GLuint));
-            break;
-         default:
-            _mesa_problem(ctx, "bad dstType in _mesa_unpack_index_span");
-      }
-
-      free(indexes);
-   }
-}
-
-
-void
-_mesa_pack_index_span( struct gl_context *ctx, GLuint n,
-                       GLenum dstType, GLvoid *dest, const GLuint *source,
-                       const struct gl_pixelstore_attrib *dstPacking,
-                       GLbitfield transferOps )
-{
-   GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
-
-   if (!indexes) {
-      _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing");
-      return;
-   }
-
-   transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
-
-   if (transferOps & (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT)) {
-      /* make a copy of input */
-      memcpy(indexes, source, n * sizeof(GLuint));
-      _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes);
-      source = indexes;
-   }
-
-   switch (dstType) {
-   case GL_UNSIGNED_BYTE:
-      {
-         GLubyte *dst = (GLubyte *) dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            *dst++ = (GLubyte) source[i];
-         }
-      }
-      break;
-   case GL_BYTE:
-      {
-         GLbyte *dst = (GLbyte *) dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            dst[i] = (GLbyte) source[i];
-         }
-      }
-      break;
-   case GL_UNSIGNED_SHORT:
-      {
-         GLushort *dst = (GLushort *) dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            dst[i] = (GLushort) source[i];
-         }
-         if (dstPacking->SwapBytes) {
-            _mesa_swap2( (GLushort *) dst, n );
-         }
-      }
-      break;
-   case GL_SHORT:
-      {
-         GLshort *dst = (GLshort *) dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            dst[i] = (GLshort) source[i];
-         }
-         if (dstPacking->SwapBytes) {
-            _mesa_swap2( (GLushort *) dst, n );
-         }
-      }
-      break;
-   case GL_UNSIGNED_INT:
-      {
-         GLuint *dst = (GLuint *) dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            dst[i] = (GLuint) source[i];
-         }
-         if (dstPacking->SwapBytes) {
-            _mesa_swap4( (GLuint *) dst, n );
-         }
-      }
-      break;
-   case GL_INT:
-      {
-         GLint *dst = (GLint *) dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            dst[i] = (GLint) source[i];
-         }
-         if (dstPacking->SwapBytes) {
-            _mesa_swap4( (GLuint *) dst, n );
-         }
-      }
-      break;
-   case GL_FLOAT:
-      {
-         GLfloat *dst = (GLfloat *) dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            dst[i] = (GLfloat) source[i];
-         }
-         if (dstPacking->SwapBytes) {
-            _mesa_swap4( (GLuint *) dst, n );
-         }
-      }
-      break;
-   case GL_HALF_FLOAT_ARB:
-      {
-         GLhalfARB *dst = (GLhalfARB *) dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            dst[i] = _mesa_float_to_half((GLfloat) source[i]);
-         }
-         if (dstPacking->SwapBytes) {
-            _mesa_swap2( (GLushort *) dst, n );
-         }
-      }
-      break;
-   default:
-      _mesa_problem(ctx, "bad type in _mesa_pack_index_span");
-   }
-
-   free(indexes);
-}
-
-
-/*
- * Unpack a row of stencil data from a client buffer according to
- * the pixel unpacking parameters.
- * This is (or will be) used by glDrawPixels
- *
- * Args:  ctx - the context
- *        n - number of pixels
- *        dstType - destination data type
- *        dest - destination array
- *        srcType - source pixel type
- *        source - source data pointer
- *        srcPacking - pixel unpacking parameters
- *        transferOps - apply offset/bias/lookup ops?
- */
-void
-_mesa_unpack_stencil_span( struct gl_context *ctx, GLuint n,
-                           GLenum dstType, GLvoid *dest,
-                           GLenum srcType, const GLvoid *source,
-                           const struct gl_pixelstore_attrib *srcPacking,
-                           GLbitfield transferOps )
-{
-   ASSERT(srcType == GL_BITMAP ||
-          srcType == GL_UNSIGNED_BYTE ||
-          srcType == GL_BYTE ||
-          srcType == GL_UNSIGNED_SHORT ||
-          srcType == GL_SHORT ||
-          srcType == GL_UNSIGNED_INT ||
-          srcType == GL_INT ||
-          srcType == GL_UNSIGNED_INT_24_8_EXT ||
-          srcType == GL_HALF_FLOAT_ARB ||
-          srcType == GL_FLOAT);
-
-   ASSERT(dstType == GL_UNSIGNED_BYTE ||
-          dstType == GL_UNSIGNED_SHORT ||
-          dstType == GL_UNSIGNED_INT);
-
-   /* only shift and offset apply to stencil */
-   transferOps &= IMAGE_SHIFT_OFFSET_BIT;
-
-   /*
-    * Try simple cases first
-    */
-   if (transferOps == 0 &&
-       !ctx->Pixel.MapStencilFlag &&
-       srcType == GL_UNSIGNED_BYTE &&
-       dstType == GL_UNSIGNED_BYTE) {
-      memcpy(dest, source, n * sizeof(GLubyte));
-   }
-   else if (transferOps == 0 &&
-            !ctx->Pixel.MapStencilFlag &&
-            srcType == GL_UNSIGNED_INT &&
-            dstType == GL_UNSIGNED_INT &&
-            !srcPacking->SwapBytes) {
-      memcpy(dest, source, n * sizeof(GLuint));
-   }
-   else {
-      /*
-       * general solution
-       */
-      GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
-
-      if (!indexes) {
-         _mesa_error(ctx, GL_OUT_OF_MEMORY, "stencil unpacking");
-         return;
-      }
-
-      extract_uint_indexes(n, indexes, GL_STENCIL_INDEX, srcType, source,
-                           srcPacking);
-
-      if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
-         /* shift and offset indexes */
-         _mesa_shift_and_offset_ci(ctx, n, indexes);
-      }
-
-      if (ctx->Pixel.MapStencilFlag) {
-         /* Apply stencil lookup table */
-         const GLuint mask = ctx->PixelMaps.StoS.Size - 1;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            indexes[i] = (GLuint)ctx->PixelMaps.StoS.Map[ indexes[i] & mask ];
-         }
-      }
-
-      /* convert to dest type */
-      switch (dstType) {
-         case GL_UNSIGNED_BYTE:
-            {
-               GLubyte *dst = (GLubyte *) dest;
-               GLuint i;
-               for (i = 0; i < n; i++) {
-                  dst[i] = (GLubyte) (indexes[i] & 0xff);
-               }
-            }
-            break;
-         case GL_UNSIGNED_SHORT:
-            {
-               GLuint *dst = (GLuint *) dest;
-               GLuint i;
-               for (i = 0; i < n; i++) {
-                  dst[i] = (GLushort) (indexes[i] & 0xffff);
-               }
-            }
-            break;
-         case GL_UNSIGNED_INT:
-            memcpy(dest, indexes, n * sizeof(GLuint));
-            break;
-         default:
-            _mesa_problem(ctx, "bad dstType in _mesa_unpack_stencil_span");
-      }
-
-      free(indexes);
-   }
-}
-
-
-void
-_mesa_pack_stencil_span( struct gl_context *ctx, GLuint n,
-                         GLenum dstType, GLvoid *dest, const GLstencil *source,
-                         const struct gl_pixelstore_attrib *dstPacking )
-{
-   GLstencil *stencil = (GLstencil *) malloc(n * sizeof(GLstencil));
-
-   if (!stencil) {
-      _mesa_error(ctx, GL_OUT_OF_MEMORY, "stencil packing");
-      return;
-   }
-
-   if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset ||
-       ctx->Pixel.MapStencilFlag) {
-      /* make a copy of input */
-      memcpy(stencil, source, n * sizeof(GLstencil));
-      _mesa_apply_stencil_transfer_ops(ctx, n, stencil);
-      source = stencil;
-   }
-
-   switch (dstType) {
-   case GL_UNSIGNED_BYTE:
-      if (sizeof(GLstencil) == 1) {
-         memcpy( dest, source, n );
-      }
-      else {
-         GLubyte *dst = (GLubyte *) dest;
-         GLuint i;
-         for (i=0;i<n;i++) {
-            dst[i] = (GLubyte) source[i];
-         }
-      }
-      break;
-   case GL_BYTE:
-      {
-         GLbyte *dst = (GLbyte *) dest;
-         GLuint i;
-         for (i=0;i<n;i++) {
-            dst[i] = (GLbyte) (source[i] & 0x7f);
-         }
-      }
-      break;
-   case GL_UNSIGNED_SHORT:
-      {
-         GLushort *dst = (GLushort *) dest;
-         GLuint i;
-         for (i=0;i<n;i++) {
-            dst[i] = (GLushort) source[i];
-         }
-         if (dstPacking->SwapBytes) {
-            _mesa_swap2( (GLushort *) dst, n );
-         }
-      }
-      break;
-   case GL_SHORT:
-      {
-         GLshort *dst = (GLshort *) dest;
-         GLuint i;
-         for (i=0;i<n;i++) {
-            dst[i] = (GLshort) source[i];
-         }
-         if (dstPacking->SwapBytes) {
-            _mesa_swap2( (GLushort *) dst, n );
-         }
-      }
-      break;
-   case GL_UNSIGNED_INT:
-      {
-         GLuint *dst = (GLuint *) dest;
-         GLuint i;
-         for (i=0;i<n;i++) {
-            dst[i] = (GLuint) source[i];
-         }
-         if (dstPacking->SwapBytes) {
-            _mesa_swap4( (GLuint *) dst, n );
-         }
-      }
-      break;
-   case GL_INT:
-      {
-         GLint *dst = (GLint *) dest;
-         GLuint i;
-         for (i=0;i<n;i++) {
-            dst[i] = (GLint) source[i];
-         }
-         if (dstPacking->SwapBytes) {
-            _mesa_swap4( (GLuint *) dst, n );
-         }
-      }
-      break;
-   case GL_FLOAT:
-      {
-         GLfloat *dst = (GLfloat *) dest;
-         GLuint i;
-         for (i=0;i<n;i++) {
-            dst[i] = (GLfloat) source[i];
-         }
-         if (dstPacking->SwapBytes) {
-            _mesa_swap4( (GLuint *) dst, n );
-         }
-      }
-      break;
-   case GL_HALF_FLOAT_ARB:
-      {
-         GLhalfARB *dst = (GLhalfARB *) dest;
-         GLuint i;
-         for (i=0;i<n;i++) {
-            dst[i] = _mesa_float_to_half( (float) source[i] );
-         }
-         if (dstPacking->SwapBytes) {
-            _mesa_swap2( (GLushort *) dst, n );
-         }
-      }
-      break;
-   case GL_BITMAP:
-      if (dstPacking->LsbFirst) {
-         GLubyte *dst = (GLubyte *) dest;
-         GLint shift = 0;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            if (shift == 0)
-               *dst = 0;
-            *dst |= ((source[i] != 0) << shift);
-            shift++;
-            if (shift == 8) {
-               shift = 0;
-               dst++;
-            }
-         }
-      }
-      else {
-         GLubyte *dst = (GLubyte *) dest;
-         GLint shift = 7;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            if (shift == 7)
-               *dst = 0;
-            *dst |= ((source[i] != 0) << shift);
-            shift--;
-            if (shift < 0) {
-               shift = 7;
-               dst++;
-            }
-         }
-      }
-      break;
-   default:
-      _mesa_problem(ctx, "bad type in _mesa_pack_index_span");
-   }
-
-   free(stencil);
-}
-
-#define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT)                              \
-    do {                                                                \
-        GLuint i;                                                       \
-        const GLTYPE *src = (const GLTYPE *)source;                     \
-        for (i = 0; i < n; i++) {                                       \
-            GLTYPE value = src[i];                                      \
-            if (srcPacking->SwapBytes) {                                \
-                if (sizeof(GLTYPE) == 2) {                              \
-                    SWAP2BYTE(value);                                   \
-                } else if (sizeof(GLTYPE) == 4) {                       \
-                    SWAP4BYTE(value);                                   \
-                }                                                       \
-            }                                                           \
-            depthValues[i] = GLTYPE2FLOAT(value);                       \
-        }                                                               \
-    } while (0)
-
-
-/**
- * Unpack a row of depth/z values from memory, returning GLushort, GLuint
- * or GLfloat values.
- * The glPixelTransfer (scale/bias) params will be applied.
- *
- * \param dstType  one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
- * \param depthMax  max value for returned GLushort or GLuint values
- *                  (ignored for GLfloat).
- */
-void
-_mesa_unpack_depth_span( struct gl_context *ctx, GLuint n,
-                         GLenum dstType, GLvoid *dest, GLuint depthMax,
-                         GLenum srcType, const GLvoid *source,
-                         const struct gl_pixelstore_attrib *srcPacking )
-{
-   GLfloat *depthTemp, *depthValues;
-   GLboolean needClamp = GL_FALSE;
-
-   /* Look for special cases first.
-    * Not only are these faster, they're less prone to numeric conversion
-    * problems.  Otherwise, converting from an int type to a float then
-    * back to an int type can introduce errors that will show up as
-    * artifacts in things like depth peeling which uses glCopyTexImage.
-    */
-   if (ctx->Pixel.DepthScale == 1.0 && ctx->Pixel.DepthBias == 0.0) {
-      if (srcType == GL_UNSIGNED_INT && dstType == GL_UNSIGNED_SHORT) {
-         const GLuint *src = (const GLuint *) source;
-         GLushort *dst = (GLushort *) dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            dst[i] = src[i] >> 16;
-         }
-         return;
-      }
-      if (srcType == GL_UNSIGNED_SHORT
-          && dstType == GL_UNSIGNED_INT
-          && depthMax == 0xffffffff) {
-         const GLushort *src = (const GLushort *) source;
-         GLuint *dst = (GLuint *) dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            dst[i] = src[i] | (src[i] << 16);
-         }
-         return;
-      }
-      if (srcType == GL_UNSIGNED_INT_24_8
-          && dstType == GL_UNSIGNED_INT
-          && depthMax == 0xffffff) {
-         const GLuint *src = (const GLuint *) source;
-         GLuint *dst = (GLuint *) dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            dst[i] = src[i] >> 8;
-         }
-         return;
-      }
-      /* XXX may want to add additional cases here someday */
-   }
-
-   /* general case path follows */
-
-   depthTemp = (GLfloat *) malloc(n * sizeof(GLfloat));
-   if (!depthTemp) {
-      _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
-      return;
-   }
-
-   if (dstType == GL_FLOAT) {
-      depthValues = (GLfloat *) dest;
-   }
-   else {
-      depthValues = depthTemp;
-   }
-
-   /* Convert incoming values to GLfloat.  Some conversions will require
-    * clamping, below.
-    */
-   switch (srcType) {
-      case GL_BYTE:
-         DEPTH_VALUES(GLbyte, BYTE_TO_FLOAT);
-         needClamp = GL_TRUE;
-         break;
-      case GL_UNSIGNED_BYTE:
-         DEPTH_VALUES(GLubyte, UBYTE_TO_FLOAT);
-         break;
-      case GL_SHORT:
-         DEPTH_VALUES(GLshort, SHORT_TO_FLOAT);
-         needClamp = GL_TRUE;
-         break;
-      case GL_UNSIGNED_SHORT:
-         DEPTH_VALUES(GLushort, USHORT_TO_FLOAT);
-         break;
-      case GL_INT:
-         DEPTH_VALUES(GLint, INT_TO_FLOAT);
-         needClamp = GL_TRUE;
-         break;
-      case GL_UNSIGNED_INT:
-         DEPTH_VALUES(GLuint, UINT_TO_FLOAT);
-         break;
-      case GL_UNSIGNED_INT_24_8_EXT: /* GL_EXT_packed_depth_stencil */
-         if (dstType == GL_UNSIGNED_INT_24_8_EXT &&
-             depthMax == 0xffffff &&
-             ctx->Pixel.DepthScale == 1.0 &&
-             ctx->Pixel.DepthBias == 0.0) {
-            const GLuint *src = (const GLuint *) source;
-            GLuint *zValues = (GLuint *) dest;
-            GLuint i;
-            for (i = 0; i < n; i++) {
-                GLuint value = src[i];
-                if (srcPacking->SwapBytes) {
-                    SWAP4BYTE(value);
-                }
-                zValues[i] = value & 0xffffff00;
-            }
-            return;
-         }
-         else {
-            const GLuint *src = (const GLuint *) source;
-            const GLfloat scale = 1.0f / 0xffffff;
-            GLuint i;
-            for (i = 0; i < n; i++) {
-                GLuint value = src[i];
-                if (srcPacking->SwapBytes) {
-                    SWAP4BYTE(value);
-                }
-                depthValues[i] = (value >> 8) * scale;
-            }
-         }
-         break;
-      case GL_FLOAT:
-         DEPTH_VALUES(GLfloat, 1*);
-         needClamp = GL_TRUE;
-         break;
-      case GL_HALF_FLOAT_ARB:
-         {
-            GLuint i;
-            const GLhalfARB *src = (const GLhalfARB *) source;
-            for (i = 0; i < n; i++) {
-               GLhalfARB value = src[i];
-               if (srcPacking->SwapBytes) {
-                  SWAP2BYTE(value);
-               }
-               depthValues[i] = _mesa_half_to_float(value);
-            }
-            needClamp = GL_TRUE;
-         }
-         break;
-      default:
-         _mesa_problem(NULL, "bad type in _mesa_unpack_depth_span()");
-         free(depthTemp);
-         return;
-   }
-
-   /* apply depth scale and bias */
-   {
-      const GLfloat scale = ctx->Pixel.DepthScale;
-      const GLfloat bias = ctx->Pixel.DepthBias;
-      if (scale != 1.0 || bias != 0.0) {
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            depthValues[i] = depthValues[i] * scale + bias;
-         }
-         needClamp = GL_TRUE;
-      }
-   }
-
-   /* clamp to [0, 1] */
-   if (needClamp) {
-      GLuint i;
-      for (i = 0; i < n; i++) {
-         depthValues[i] = (GLfloat)CLAMP(depthValues[i], 0.0, 1.0);
-      }
-   }
-
-   /*
-    * Convert values to dstType
-    */
-   if (dstType == GL_UNSIGNED_INT) {
-      GLuint *zValues = (GLuint *) dest;
-      GLuint i;
-      if (depthMax <= 0xffffff) {
-         /* no overflow worries */
-         for (i = 0; i < n; i++) {
-            zValues[i] = (GLuint) (depthValues[i] * (GLfloat) depthMax);
-         }
-      }
-      else {
-         /* need to use double precision to prevent overflow problems */
-         for (i = 0; i < n; i++) {
-            GLdouble z = depthValues[i] * (GLfloat) depthMax;
-            if (z >= (GLdouble) 0xffffffff)
-               zValues[i] = 0xffffffff;
-            else
-               zValues[i] = (GLuint) z;
-         }
-      }
-   }
-   else if (dstType == GL_UNSIGNED_SHORT) {
-      GLushort *zValues = (GLushort *) dest;
-      GLuint i;
-      ASSERT(depthMax <= 0xffff);
-      for (i = 0; i < n; i++) {
-         zValues[i] = (GLushort) (depthValues[i] * (GLfloat) depthMax);
-      }
-   }
-   else {
-      ASSERT(dstType == GL_FLOAT);
-      /*ASSERT(depthMax == 1.0F);*/
-   }
-
-   free(depthTemp);
-}
-
-
-/*
- * Pack an array of depth values.  The values are floats in [0,1].
- */
-void
-_mesa_pack_depth_span( struct gl_context *ctx, GLuint n, GLvoid *dest,
-                       GLenum dstType, const GLfloat *depthSpan,
-                       const struct gl_pixelstore_attrib *dstPacking )
-{
-   GLfloat *depthCopy = (GLfloat *) malloc(n * sizeof(GLfloat));
-   if (!depthCopy) {
-      _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing");
-      return;
-   }
-
-   if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) {
-      memcpy(depthCopy, depthSpan, n * sizeof(GLfloat));
-      _mesa_scale_and_bias_depth(ctx, n, depthCopy);
-      depthSpan = depthCopy;
-   }
-
-   switch (dstType) {
-   case GL_UNSIGNED_BYTE:
-      {
-         GLubyte *dst = (GLubyte *) dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            dst[i] = FLOAT_TO_UBYTE( depthSpan[i] );
-         }
-      }
-      break;
-   case GL_BYTE:
-      {
-         GLbyte *dst = (GLbyte *) dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            dst[i] = FLOAT_TO_BYTE( depthSpan[i] );
-         }
-      }
-      break;
-   case GL_UNSIGNED_SHORT:
-      {
-         GLushort *dst = (GLushort *) dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            CLAMPED_FLOAT_TO_USHORT(dst[i], depthSpan[i]);
-         }
-         if (dstPacking->SwapBytes) {
-            _mesa_swap2( (GLushort *) dst, n );
-         }
-      }
-      break;
-   case GL_SHORT:
-      {
-         GLshort *dst = (GLshort *) dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            dst[i] = FLOAT_TO_SHORT( depthSpan[i] );
-         }
-         if (dstPacking->SwapBytes) {
-            _mesa_swap2( (GLushort *) dst, n );
-         }
-      }
-      break;
-   case GL_UNSIGNED_INT:
-      {
-         GLuint *dst = (GLuint *) dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            dst[i] = FLOAT_TO_UINT( depthSpan[i] );
-         }
-         if (dstPacking->SwapBytes) {
-            _mesa_swap4( (GLuint *) dst, n );
-         }
-      }
-      break;
-   case GL_INT:
-      {
-         GLint *dst = (GLint *) dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            dst[i] = FLOAT_TO_INT( depthSpan[i] );
-         }
-         if (dstPacking->SwapBytes) {
-            _mesa_swap4( (GLuint *) dst, n );
-         }
-      }
-      break;
-   case GL_FLOAT:
-      {
-         GLfloat *dst = (GLfloat *) dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            dst[i] = depthSpan[i];
-         }
-         if (dstPacking->SwapBytes) {
-            _mesa_swap4( (GLuint *) dst, n );
-         }
-      }
-      break;
-   case GL_HALF_FLOAT_ARB:
-      {
-         GLhalfARB *dst = (GLhalfARB *) dest;
-         GLuint i;
-         for (i = 0; i < n; i++) {
-            dst[i] = _mesa_float_to_half(depthSpan[i]);
-         }
-         if (dstPacking->SwapBytes) {
-            _mesa_swap2( (GLushort *) dst, n );
-         }
-      }
-      break;
-   default:
-      _mesa_problem(ctx, "bad type in _mesa_pack_depth_span");
-   }
-
-   free(depthCopy);
-}
-
-
-
-/**
- * Pack depth and stencil values as GL_DEPTH_STENCIL/GL_UNSIGNED_INT_24_8.
- */
-void
-_mesa_pack_depth_stencil_span(struct gl_context *ctx, GLuint n, GLuint *dest,
-                              const GLfloat *depthVals,
-                              const GLstencil *stencilVals,
-                              const struct gl_pixelstore_attrib *dstPacking)
-{
-   GLfloat *depthCopy = (GLfloat *) malloc(n * sizeof(GLfloat));
-   GLstencil *stencilCopy = (GLstencil *) malloc(n * sizeof(GLstencil));
-   GLuint i;
-
-   if (!depthCopy || !stencilCopy) {
-      _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing");
-      free(depthCopy);
-      free(stencilCopy);
-      return;
-   }
-
-   if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) {
-      memcpy(depthCopy, depthVals, n * sizeof(GLfloat));
-      _mesa_scale_and_bias_depth(ctx, n, depthCopy);
-      depthVals = depthCopy;
-   }
-
-   if (ctx->Pixel.IndexShift ||
-       ctx->Pixel.IndexOffset ||
-       ctx->Pixel.MapStencilFlag) {
-      memcpy(stencilCopy, stencilVals, n * sizeof(GLstencil));
-      _mesa_apply_stencil_transfer_ops(ctx, n, stencilCopy);
-      stencilVals = stencilCopy;
-   }
-
-   for (i = 0; i < n; i++) {
-      GLuint z = (GLuint) (depthVals[i] * 0xffffff);
-      dest[i] = (z << 8) | (stencilVals[i] & 0xff);
-   }
-
-   if (dstPacking->SwapBytes) {
-      _mesa_swap4(dest, n);
-   }
-
-   free(depthCopy);
-   free(stencilCopy);
-}
-
-
-
-
-/**
- * Unpack image data.  Apply byte swapping, byte flipping (bitmap).
- * Return all image data in a contiguous block.  This is used when we
- * compile glDrawPixels, glTexImage, etc into a display list.  We
- * need a copy of the data in a standard format.
- */
-void *
-_mesa_unpack_image( GLuint dimensions,
-                    GLsizei width, GLsizei height, GLsizei depth,
-                    GLenum format, GLenum type, const GLvoid *pixels,
-                    const struct gl_pixelstore_attrib *unpack )
-{
-   GLint bytesPerRow, compsPerRow;
-   GLboolean flipBytes, swap2, swap4;
-
-   if (!pixels)
-      return NULL;  /* not necessarily an error */
-
-   if (width <= 0 || height <= 0 || depth <= 0)
-      return NULL;  /* generate error later */
-
-   if (type == GL_BITMAP) {
-      bytesPerRow = (width + 7) >> 3;
-      flipBytes = unpack->LsbFirst;
-      swap2 = swap4 = GL_FALSE;
-      compsPerRow = 0;
-   }
-   else {
-      const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
-      GLint components = _mesa_components_in_format(format);
-      GLint bytesPerComp;
-
-      if (_mesa_type_is_packed(type))
-          components = 1;
-
-      if (bytesPerPixel <= 0 || components <= 0)
-         return NULL;   /* bad format or type.  generate error later */
-      bytesPerRow = bytesPerPixel * width;
-      bytesPerComp = bytesPerPixel / components;
-      flipBytes = GL_FALSE;
-      swap2 = (bytesPerComp == 2) && unpack->SwapBytes;
-      swap4 = (bytesPerComp == 4) && unpack->SwapBytes;
-      compsPerRow = components * width;
-      assert(compsPerRow >= width);
-   }
-
-   {
-      GLubyte *destBuffer
-         = (GLubyte *) malloc(bytesPerRow * height * depth);
-      GLubyte *dst;
-      GLint img, row;
-      if (!destBuffer)
-         return NULL;   /* generate GL_OUT_OF_MEMORY later */
-
-      dst = destBuffer;
-      for (img = 0; img < depth; img++) {
-         for (row = 0; row < height; row++) {
-            const GLvoid *src = _mesa_image_address(dimensions, unpack, pixels,
-                               width, height, format, type, img, row, 0);
-
-            if ((type == GL_BITMAP) && (unpack->SkipPixels & 0x7)) {
-               GLint i;
-               flipBytes = GL_FALSE;
-               if (unpack->LsbFirst) {
-                  GLubyte srcMask = 1 << (unpack->SkipPixels & 0x7);
-                  GLubyte dstMask = 128;
-                  const GLubyte *s = src;
-                  GLubyte *d = dst;
-                  *d = 0;
-                  for (i = 0; i < width; i++) {
-                     if (*s & srcMask) {
-                        *d |= dstMask;
-                     }      
-                     if (srcMask == 128) {
-                        srcMask = 1;
-                        s++;
-                     }
-                     else {
-                        srcMask = srcMask << 1;
-                     }
-                     if (dstMask == 1) {
-                        dstMask = 128;
-                        d++;
-                        *d = 0;
-                     }
-                     else {
-                        dstMask = dstMask >> 1;
-                     }
-                  }
-               }
-               else {
-                  GLubyte srcMask = 128 >> (unpack->SkipPixels & 0x7);
-                  GLubyte dstMask = 128;
-                  const GLubyte *s = src;
-                  GLubyte *d = dst;
-                  *d = 0;
-                  for (i = 0; i < width; i++) {
-                     if (*s & srcMask) {
-                        *d |= dstMask;
-                     }
-                     if (srcMask == 1) {
-                        srcMask = 128;
-                        s++;
-                     }
-                     else {
-                        srcMask = srcMask >> 1;
-                     }
-                     if (dstMask == 1) {
-                        dstMask = 128;
-                        d++;
-                        *d = 0;
-                     }
-                     else {
-                        dstMask = dstMask >> 1;
-                     }      
-                  }
-               }
-            }
-            else {
-               memcpy(dst, src, bytesPerRow);
-            }
-
-            /* byte flipping/swapping */
-            if (flipBytes) {
-               flip_bytes((GLubyte *) dst, bytesPerRow);
-            }
-            else if (swap2) {
-               _mesa_swap2((GLushort*) dst, compsPerRow);
-            }
-            else if (swap4) {
-               _mesa_swap4((GLuint*) dst, compsPerRow);
-            }
-            dst += bytesPerRow;
-         }
-      }
-      return destBuffer;
-   }
-}
-
+/*
+ * Mesa 3-D graphics library
+ *
+ * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
+ * Copyright (C) 2009-2010  VMware, Inc.  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"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THEA AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+
+/**
+ * \file pack.c
+ * Image and pixel span packing and unpacking.
+ */
+
+
+#include "glheader.h"
+#include "colormac.h"
+#include "enums.h"
+#include "image.h"
+#include "imports.h"
+#include "mtypes.h"
+#include "pack.h"
+#include "pixeltransfer.h"
+#include "imports.h"
+
+
+/**
+ * NOTE:
+ * Normally, BYTE_TO_FLOAT(0) returns 0.00392  That causes problems when
+ * we later convert the float to a packed integer value (such as for
+ * GL_RGB5_A1) because we'll wind up with a non-zero value.
+ *
+ * We redefine the macros here so zero is handled correctly.
+ */
+#undef BYTE_TO_FLOAT
+#define BYTE_TO_FLOAT(B)    ((B) == 0 ? 0.0F : ((2.0F * (B) + 1.0F) * (1.0F/255.0F)))
+
+#undef SHORT_TO_FLOAT
+#define SHORT_TO_FLOAT(S)   ((S) == 0 ? 0.0F : ((2.0F * (S) + 1.0F) * (1.0F/65535.0F)))
+
+
+
+/** Compute ceiling of integer quotient of A divided by B. */
+#define CEILING( A, B )  ( (A) % (B) == 0 ? (A)/(B) : (A)/(B)+1 )
+
+
+/**
+ * Flip the 8 bits in each byte of the given array.
+ *
+ * \param p array.
+ * \param n number of bytes.
+ *
+ * \todo try this trick to flip bytes someday:
+ * \code
+ *  v = ((v & 0x55555555) << 1) | ((v >> 1) & 0x55555555);
+ *  v = ((v & 0x33333333) << 2) | ((v >> 2) & 0x33333333);
+ *  v = ((v & 0x0f0f0f0f) << 4) | ((v >> 4) & 0x0f0f0f0f);
+ * \endcode
+ */
+static void
+flip_bytes( GLubyte *p, GLuint n )
+{
+   GLuint i, a, b;
+   for (i = 0; i < n; i++) {
+      b = (GLuint) p[i];        /* words are often faster than bytes */
+      a = ((b & 0x01) << 7) |
+	  ((b & 0x02) << 5) |
+	  ((b & 0x04) << 3) |
+	  ((b & 0x08) << 1) |
+	  ((b & 0x10) >> 1) |
+	  ((b & 0x20) >> 3) |
+	  ((b & 0x40) >> 5) |
+	  ((b & 0x80) >> 7);
+      p[i] = (GLubyte) a;
+   }
+}
+
+
+
+/*
+ * Unpack a 32x32 pixel polygon stipple from user memory using the
+ * current pixel unpack settings.
+ */
+void
+_mesa_unpack_polygon_stipple( const GLubyte *pattern, GLuint dest[32],
+                              const struct gl_pixelstore_attrib *unpacking )
+{
+   GLubyte *ptrn = (GLubyte *) _mesa_unpack_bitmap(32, 32, pattern, unpacking);
+   if (ptrn) {
+      /* Convert pattern from GLubytes to GLuints and handle big/little
+       * endian differences
+       */
+      GLubyte *p = ptrn;
+      GLint i;
+      for (i = 0; i < 32; i++) {
+         dest[i] = (p[0] << 24)
+                 | (p[1] << 16)
+                 | (p[2] <<  8)
+                 | (p[3]      );
+         p += 4;
+      }
+      free(ptrn);
+   }
+}
+
+
+/*
+ * Pack polygon stipple into user memory given current pixel packing
+ * settings.
+ */
+void
+_mesa_pack_polygon_stipple( const GLuint pattern[32], GLubyte *dest,
+                            const struct gl_pixelstore_attrib *packing )
+{
+   /* Convert pattern from GLuints to GLubytes to handle big/little
+    * endian differences.
+    */
+   GLubyte ptrn[32*4];
+   GLint i;
+   for (i = 0; i < 32; i++) {
+      ptrn[i * 4 + 0] = (GLubyte) ((pattern[i] >> 24) & 0xff);
+      ptrn[i * 4 + 1] = (GLubyte) ((pattern[i] >> 16) & 0xff);
+      ptrn[i * 4 + 2] = (GLubyte) ((pattern[i] >> 8 ) & 0xff);
+      ptrn[i * 4 + 3] = (GLubyte) ((pattern[i]      ) & 0xff);
+   }
+
+   _mesa_pack_bitmap(32, 32, ptrn, dest, packing);
+}
+
+
+/*
+ * Unpack bitmap data.  Resulting data will be in most-significant-bit-first
+ * order with row alignment = 1 byte.
+ */
+GLvoid *
+_mesa_unpack_bitmap( GLint width, GLint height, const GLubyte *pixels,
+                     const struct gl_pixelstore_attrib *packing )
+{
+   GLint bytes, row, width_in_bytes;
+   GLubyte *buffer, *dst;
+
+   if (!pixels)
+      return NULL;
+
+   /* Alloc dest storage */
+   bytes = ((width + 7) / 8 * height);
+   buffer = (GLubyte *) malloc( bytes );
+   if (!buffer)
+      return NULL;
+
+   width_in_bytes = CEILING( width, 8 );
+   dst = buffer;
+   for (row = 0; row < height; row++) {
+      const GLubyte *src = (const GLubyte *)
+         _mesa_image_address2d(packing, pixels, width, height,
+                               GL_COLOR_INDEX, GL_BITMAP, row, 0);
+      if (!src) {
+         free(buffer);
+         return NULL;
+      }
+
+      if ((packing->SkipPixels & 7) == 0) {
+         memcpy( dst, src, width_in_bytes );
+         if (packing->LsbFirst) {
+            flip_bytes( dst, width_in_bytes );
+         }
+      }
+      else {
+         /* handling SkipPixels is a bit tricky (no pun intended!) */
+         GLint i;
+         if (packing->LsbFirst) {
+            GLubyte srcMask = 1 << (packing->SkipPixels & 0x7);
+            GLubyte dstMask = 128;
+            const GLubyte *s = src;
+            GLubyte *d = dst;
+            *d = 0;
+            for (i = 0; i < width; i++) {
+               if (*s & srcMask) {
+                  *d |= dstMask;
+               }
+               if (srcMask == 128) {
+                  srcMask = 1;
+                  s++;
+               }
+               else {
+                  srcMask = srcMask << 1;
+               }
+               if (dstMask == 1) {
+                  dstMask = 128;
+                  d++;
+                  *d = 0;
+               }
+               else {
+                  dstMask = dstMask >> 1;
+               }
+            }
+         }
+         else {
+            GLubyte srcMask = 128 >> (packing->SkipPixels & 0x7);
+            GLubyte dstMask = 128;
+            const GLubyte *s = src;
+            GLubyte *d = dst;
+            *d = 0;
+            for (i = 0; i < width; i++) {
+               if (*s & srcMask) {
+                  *d |= dstMask;
+               }
+               if (srcMask == 1) {
+                  srcMask = 128;
+                  s++;
+               }
+               else {
+                  srcMask = srcMask >> 1;
+               }
+               if (dstMask == 1) {
+                  dstMask = 128;
+                  d++;
+                  *d = 0;
+               }
+               else {
+                  dstMask = dstMask >> 1;
+               }
+            }
+         }
+      }
+      dst += width_in_bytes;
+   }
+
+   return buffer;
+}
+
+
+/*
+ * Pack bitmap data.
+ */
+void
+_mesa_pack_bitmap( GLint width, GLint height, const GLubyte *source,
+                   GLubyte *dest, const struct gl_pixelstore_attrib *packing )
+{
+   GLint row, width_in_bytes;
+   const GLubyte *src;
+
+   if (!source)
+      return;
+
+   width_in_bytes = CEILING( width, 8 );
+   src = source;
+   for (row = 0; row < height; row++) {
+      GLubyte *dst = (GLubyte *) _mesa_image_address2d(packing, dest,
+                       width, height, GL_COLOR_INDEX, GL_BITMAP, row, 0);
+      if (!dst)
+         return;
+
+      if ((packing->SkipPixels & 7) == 0) {
+         memcpy( dst, src, width_in_bytes );
+         if (packing->LsbFirst) {
+            flip_bytes( dst, width_in_bytes );
+         }
+      }
+      else {
+         /* handling SkipPixels is a bit tricky (no pun intended!) */
+         GLint i;
+         if (packing->LsbFirst) {
+            GLubyte srcMask = 128;
+            GLubyte dstMask = 1 << (packing->SkipPixels & 0x7);
+            const GLubyte *s = src;
+            GLubyte *d = dst;
+            *d = 0;
+            for (i = 0; i < width; i++) {
+               if (*s & srcMask) {
+                  *d |= dstMask;
+               }
+               if (srcMask == 1) {
+                  srcMask = 128;
+                  s++;
+               }
+               else {
+                  srcMask = srcMask >> 1;
+               }
+               if (dstMask == 128) {
+                  dstMask = 1;
+                  d++;
+                  *d = 0;
+               }
+               else {
+                  dstMask = dstMask << 1;
+               }
+            }
+         }
+         else {
+            GLubyte srcMask = 128;
+            GLubyte dstMask = 128 >> (packing->SkipPixels & 0x7);
+            const GLubyte *s = src;
+            GLubyte *d = dst;
+            *d = 0;
+            for (i = 0; i < width; i++) {
+               if (*s & srcMask) {
+                  *d |= dstMask;
+               }
+               if (srcMask == 1) {
+                  srcMask = 128;
+                  s++;
+               }
+               else {
+                  srcMask = srcMask >> 1;
+               }
+               if (dstMask == 1) {
+                  dstMask = 128;
+                  d++;
+                  *d = 0;
+               }
+               else {
+                  dstMask = dstMask >> 1;
+               }
+            }
+         }
+      }
+      src += width_in_bytes;
+   }
+}
+
+
+/**
+ * Get indexes of color components for a basic color format, such as
+ * GL_RGBA, GL_RED, GL_LUMINANCE_ALPHA, etc.  Return -1 for indexes
+ * that do not apply.
+ */
+static void
+get_component_indexes(GLenum format,
+                      GLint *redIndex,
+                      GLint *greenIndex,
+                      GLint *blueIndex,
+                      GLint *alphaIndex,
+                      GLint *luminanceIndex,
+                      GLint *intensityIndex)
+{
+   *redIndex = -1;
+   *greenIndex = -1;
+   *blueIndex = -1;
+   *alphaIndex = -1;
+   *luminanceIndex = -1;
+   *intensityIndex = -1;
+
+   switch (format) {
+   case GL_LUMINANCE:
+   case GL_LUMINANCE_INTEGER_EXT:
+      *luminanceIndex = 0;
+      break;
+   case GL_LUMINANCE_ALPHA:
+   case GL_LUMINANCE_ALPHA_INTEGER_EXT:
+      *luminanceIndex = 0;
+      *alphaIndex = 1;
+      break;
+   case GL_INTENSITY:
+      *intensityIndex = 0;
+      break;
+   case GL_RED:
+   case GL_RED_INTEGER_EXT:
+      *redIndex = 0;
+      break;
+   case GL_GREEN:
+   case GL_GREEN_INTEGER_EXT:
+      *greenIndex = 0;
+      break;
+   case GL_BLUE:
+   case GL_BLUE_INTEGER_EXT:
+      *blueIndex = 0;
+      break;
+   case GL_ALPHA:
+   case GL_ALPHA_INTEGER_EXT:
+      *alphaIndex = 0;
+      break;
+   case GL_RG:
+   case GL_RG_INTEGER:
+      *redIndex = 0;
+      *greenIndex = 1;
+      break;
+   case GL_RGB:
+   case GL_RGB_INTEGER_EXT:
+      *redIndex = 0;
+      *greenIndex = 1;
+      *blueIndex = 2;
+      break;
+   case GL_BGR:
+   case GL_BGR_INTEGER_EXT:
+      *blueIndex = 0;
+      *greenIndex = 1;
+      *redIndex = 2;
+      break;
+   case GL_RGBA:
+   case GL_RGBA_INTEGER_EXT:
+      *redIndex = 0;
+      *greenIndex = 1;
+      *blueIndex = 2;
+      *alphaIndex = 3;
+      break;
+   case GL_BGRA:
+   case GL_BGRA_INTEGER:
+      *redIndex = 2;
+      *greenIndex = 1;
+      *blueIndex = 0;
+      *alphaIndex = 3;
+      break;
+   case GL_ABGR_EXT:
+      *redIndex = 3;
+      *greenIndex = 2;
+      *blueIndex = 1;
+      *alphaIndex = 0;
+      break;
+   case GL_DU8DV8_ATI:
+   case GL_DUDV_ATI:
+      *redIndex = 0;
+      *greenIndex = 1;
+      break;
+   default:
+      assert(0 && "bad format in get_component_indexes()");
+   }
+}
+
+
+
+/**
+ * For small integer types, return the min and max possible values.
+ * Used for clamping floats to unscaled integer types.
+ * \return GL_TRUE if type is handled, GL_FALSE otherwise.
+ */
+static GLboolean
+get_type_min_max(GLenum type, GLfloat *min, GLfloat *max)
+{
+   switch (type) {
+   case GL_BYTE:
+      *min = -128.0;
+      *max = 127.0;
+      return GL_TRUE;
+   case GL_UNSIGNED_BYTE:
+      *min = 0.0;
+      *max = 255.0;
+      return GL_TRUE;
+   case GL_SHORT:
+      *min = -32768.0;
+      *max = 32767.0;
+      return GL_TRUE;
+   case GL_UNSIGNED_SHORT:
+      *min = 0.0;
+      *max = 65535.0;
+      return GL_TRUE;
+   default:
+      return GL_FALSE;
+   }
+}
+
+
+
+/**
+ * Used to pack an array [][4] of RGBA float colors as specified
+ * by the dstFormat, dstType and dstPacking.  Used by glReadPixels.
+ * Historically, the RGBA values were in [0,1] and rescaled to fit
+ * into GLubytes, etc.  But with new integer formats, the RGBA values
+ * may have any value and we don't always rescale when converting to
+ * integers.
+ *
+ * Note: the rgba values will be modified by this function when any pixel
+ * transfer ops are enabled.
+ */
+void
+_mesa_pack_rgba_span_float(struct gl_context *ctx, GLuint n, GLfloat rgba[][4],
+                           GLenum dstFormat, GLenum dstType,
+                           GLvoid *dstAddr,
+                           const struct gl_pixelstore_attrib *dstPacking,
+                           GLbitfield transferOps)
+{
+   GLfloat *luminance;
+   const GLint comps = _mesa_components_in_format(dstFormat);
+   const GLboolean intDstFormat = _mesa_is_integer_format(dstFormat);
+   GLuint i;
+
+   if (dstFormat == GL_LUMINANCE ||
+       dstFormat == GL_LUMINANCE_ALPHA ||
+       dstFormat == GL_LUMINANCE_INTEGER_EXT ||
+       dstFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT) {
+      luminance = (GLfloat *) malloc(n * sizeof(GLfloat));
+      if (!luminance) {
+         _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing");
+         return;
+      }
+   }
+   else {
+      luminance = NULL;
+   }
+
+   if (transferOps) {
+      _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
+   }
+
+   /*
+    * Component clamping (besides clamping to [0,1] in
+    * _mesa_apply_rgba_transfer_ops()).
+    */
+   if (intDstFormat) {
+      /* clamping to dest type's min/max values */
+      GLfloat min, max;
+      if (get_type_min_max(dstType, &min, &max)) {
+         for (i = 0; i < n; i++) {
+            rgba[i][RCOMP] = CLAMP(rgba[i][RCOMP], min, max);
+            rgba[i][GCOMP] = CLAMP(rgba[i][GCOMP], min, max);
+            rgba[i][BCOMP] = CLAMP(rgba[i][BCOMP], min, max);
+            rgba[i][ACOMP] = CLAMP(rgba[i][ACOMP], min, max);
+         }
+      }
+   }
+   else if (dstFormat == GL_LUMINANCE || dstFormat == GL_LUMINANCE_ALPHA) {
+      /* compute luminance values */
+      if (transferOps & IMAGE_CLAMP_BIT) {
+         for (i = 0; i < n; i++) {
+            GLfloat sum = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
+            luminance[i] = CLAMP(sum, 0.0F, 1.0F);
+         }
+      }
+      else {
+         for (i = 0; i < n; i++) {
+            luminance[i] = rgba[i][RCOMP] + rgba[i][GCOMP] + rgba[i][BCOMP];
+         }
+      }
+   }
+
+   /*
+    * Pack/store the pixels.  Ugh!  Lots of cases!!!
+    */
+   switch (dstType) {
+      case GL_UNSIGNED_BYTE:
+         {
+            GLubyte *dst = (GLubyte *) dstAddr;
+            switch (dstFormat) {
+               case GL_RED:
+                  for (i=0;i<n;i++)
+                     dst[i] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
+                  break;
+               case GL_GREEN:
+                  for (i=0;i<n;i++)
+                     dst[i] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
+                  break;
+               case GL_BLUE:
+                  for (i=0;i<n;i++)
+                     dst[i] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
+                  break;
+               case GL_ALPHA:
+                  for (i=0;i<n;i++)
+                     dst[i] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
+                  break;
+               case GL_LUMINANCE:
+                  for (i=0;i<n;i++)
+                     dst[i] = FLOAT_TO_UBYTE(luminance[i]);
+                  break;
+               case GL_LUMINANCE_ALPHA:
+                  for (i=0;i<n;i++) {
+                     dst[i*2+0] = FLOAT_TO_UBYTE(luminance[i]);
+                     dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
+                  }
+                  break;
+               case GL_RG:
+                  for (i=0;i<n;i++) {
+                     dst[i*2+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
+                     dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
+                  }
+                  break;
+               case GL_RGB:
+                  for (i=0;i<n;i++) {
+                     dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
+                     dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
+                     dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
+                  }
+                  break;
+               case GL_RGBA:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
+                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
+                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
+                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
+                  }
+                  break;
+               case GL_BGR:
+                  for (i=0;i<n;i++) {
+                     dst[i*3+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
+                     dst[i*3+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
+                     dst[i*3+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
+                  }
+                  break;
+               case GL_BGRA:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
+                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
+                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
+                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
+                  }
+                  break;
+               case GL_ABGR_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = FLOAT_TO_UBYTE(rgba[i][ACOMP]);
+                     dst[i*4+1] = FLOAT_TO_UBYTE(rgba[i][BCOMP]);
+                     dst[i*4+2] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
+                     dst[i*4+3] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
+                  }
+                  break;
+               case GL_RED_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLubyte) rgba[i][RCOMP];
+                  }
+                  break;
+               case GL_GREEN_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLubyte) rgba[i][GCOMP];
+                  }
+                  break;
+               case GL_BLUE_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLubyte) rgba[i][BCOMP];
+                  }
+                  break;
+               case GL_ALPHA_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLubyte) rgba[i][ACOMP];
+                  }
+                  break;
+               case GL_RGB_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*3+0] = (GLubyte) rgba[i][RCOMP];
+                     dst[i*3+1] = (GLubyte) rgba[i][GCOMP];
+                     dst[i*3+2] = (GLubyte) rgba[i][BCOMP];
+                  }
+                  break;
+               case GL_RGBA_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = (GLubyte) rgba[i][RCOMP];
+                     dst[i*4+1] = (GLubyte) rgba[i][GCOMP];
+                     dst[i*4+2] = (GLubyte) rgba[i][BCOMP];
+                     dst[i*4+3] = (GLubyte) rgba[i][ACOMP];
+                  }
+                  break;
+               case GL_BGR_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*3+0] = (GLubyte) rgba[i][BCOMP];
+                     dst[i*3+1] = (GLubyte) rgba[i][GCOMP];
+                     dst[i*3+2] = (GLubyte) rgba[i][RCOMP];
+                  }
+                  break;
+               case GL_BGRA_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = (GLubyte) rgba[i][BCOMP];
+                     dst[i*4+1] = (GLubyte) rgba[i][GCOMP];
+                     dst[i*4+2] = (GLubyte) rgba[i][RCOMP];
+                     dst[i*4+3] = (GLubyte) rgba[i][ACOMP];
+                  }
+                  break;
+               case GL_LUMINANCE_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*2+0] = (GLubyte) (rgba[i][RCOMP] +
+                                             rgba[i][GCOMP] +
+                                             rgba[i][BCOMP]);
+                     dst[i*2+1] = (GLubyte) rgba[i][ACOMP];
+                  }
+                  break;
+               case GL_LUMINANCE_ALPHA_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLubyte) (rgba[i][RCOMP] +
+                                         rgba[i][GCOMP] +
+                                         rgba[i][BCOMP]);
+                  }
+                  break;
+               case GL_DUDV_ATI:
+               case GL_DU8DV8_ATI:
+                  for (i=0;i<n;i++) {
+                     dst[i*2+0] = FLOAT_TO_UBYTE(rgba[i][RCOMP]);
+                     dst[i*2+1] = FLOAT_TO_UBYTE(rgba[i][GCOMP]);
+                  }
+                  break;
+               default:
+                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
+            }
+         }
+         break;
+      case GL_BYTE:
+         {
+            GLbyte *dst = (GLbyte *) dstAddr;
+            switch (dstFormat) {
+               case GL_RED:
+                  for (i=0;i<n;i++)
+                     dst[i] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
+                  break;
+               case GL_GREEN:
+                  for (i=0;i<n;i++)
+                     dst[i] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
+                  break;
+               case GL_BLUE:
+                  for (i=0;i<n;i++)
+                     dst[i] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
+                  break;
+               case GL_ALPHA:
+                  for (i=0;i<n;i++)
+                     dst[i] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
+                  break;
+               case GL_LUMINANCE:
+                  for (i=0;i<n;i++)
+                     dst[i] = FLOAT_TO_BYTE(luminance[i]);
+                  break;
+               case GL_LUMINANCE_ALPHA:
+                  for (i=0;i<n;i++) {
+                     dst[i*2+0] = FLOAT_TO_BYTE(luminance[i]);
+                     dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
+                  }
+                  break;
+               case GL_RG:
+                  for (i=0;i<n;i++) {
+                     dst[i*2+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
+                     dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
+                  }
+                  break;
+               case GL_RGB:
+                  for (i=0;i<n;i++) {
+                     dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
+                     dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
+                     dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
+                  }
+                  break;
+               case GL_RGBA:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
+                     dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
+                     dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
+                     dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
+                  }
+                  break;
+               case GL_BGR:
+                  for (i=0;i<n;i++) {
+                     dst[i*3+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
+                     dst[i*3+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
+                     dst[i*3+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
+                  }
+                  break;
+               case GL_BGRA:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
+                     dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
+                     dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
+                     dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
+                  }
+		  break;
+               case GL_ABGR_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = FLOAT_TO_BYTE(rgba[i][ACOMP]);
+                     dst[i*4+1] = FLOAT_TO_BYTE(rgba[i][BCOMP]);
+                     dst[i*4+2] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
+                     dst[i*4+3] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
+                  }
+                  break;
+               case GL_RED_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLbyte) rgba[i][RCOMP];
+                  }
+                  break;
+               case GL_GREEN_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLbyte) rgba[i][GCOMP];
+                  }
+                  break;
+               case GL_BLUE_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLbyte) rgba[i][BCOMP];
+                  }
+                  break;
+               case GL_ALPHA_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLbyte) rgba[i][ACOMP];
+                  }
+                  break;
+               case GL_RGB_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*3+0] = (GLbyte) rgba[i][RCOMP];
+                     dst[i*3+1] = (GLbyte) rgba[i][GCOMP];
+                     dst[i*3+2] = (GLbyte) rgba[i][BCOMP];
+                  }
+                  break;
+               case GL_RGBA_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = (GLbyte) rgba[i][RCOMP];
+                     dst[i*4+1] = (GLbyte) rgba[i][GCOMP];
+                     dst[i*4+2] = (GLbyte) rgba[i][BCOMP];
+                     dst[i*4+3] = (GLbyte) rgba[i][ACOMP];
+                  }
+                  break;
+               case GL_BGR_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*3+0] = (GLbyte) rgba[i][BCOMP];
+                     dst[i*3+1] = (GLbyte) rgba[i][GCOMP];
+                     dst[i*3+2] = (GLbyte) rgba[i][RCOMP];
+                  }
+                  break;
+               case GL_BGRA_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = (GLbyte) rgba[i][BCOMP];
+                     dst[i*4+1] = (GLbyte) rgba[i][GCOMP];
+                     dst[i*4+2] = (GLbyte) rgba[i][RCOMP];
+                     dst[i*4+3] = (GLbyte) rgba[i][ACOMP];
+                  }
+                  break;
+               case GL_LUMINANCE_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*2+0] = (GLbyte) (rgba[i][RCOMP] +
+                                            rgba[i][GCOMP] +
+                                            rgba[i][BCOMP]);
+                     dst[i*2+1] = (GLbyte) rgba[i][ACOMP];
+                  }
+                  break;
+               case GL_LUMINANCE_ALPHA_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLbyte) (rgba[i][RCOMP] +
+                                        rgba[i][GCOMP] +
+                                        rgba[i][BCOMP]);
+                  }
+                  break;
+               case GL_DUDV_ATI:
+               case GL_DU8DV8_ATI:
+                  for (i=0;i<n;i++) {
+                     dst[i*2+0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
+                     dst[i*2+1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
+                  }
+                  break;
+               default:
+                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
+            }
+         }
+         break;
+      case GL_UNSIGNED_SHORT:
+         {
+            GLushort *dst = (GLushort *) dstAddr;
+            switch (dstFormat) {
+               case GL_RED:
+                  for (i=0;i<n;i++)
+                     CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][RCOMP]);
+                  break;
+               case GL_GREEN:
+                  for (i=0;i<n;i++)
+                     CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][GCOMP]);
+                  break;
+               case GL_BLUE:
+                  for (i=0;i<n;i++)
+                     CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][BCOMP]);
+                  break;
+               case GL_ALPHA:
+                  for (i=0;i<n;i++)
+                     CLAMPED_FLOAT_TO_USHORT(dst[i], rgba[i][ACOMP]);
+                  break;
+               case GL_LUMINANCE:
+                  for (i=0;i<n;i++)
+                     UNCLAMPED_FLOAT_TO_USHORT(dst[i], luminance[i]);
+                  break;
+               case GL_LUMINANCE_ALPHA:
+                  for (i=0;i<n;i++) {
+                     UNCLAMPED_FLOAT_TO_USHORT(dst[i*2+0], luminance[i]);
+                     CLAMPED_FLOAT_TO_USHORT(dst[i*2+1], rgba[i][ACOMP]);
+                  }
+                  break;
+               case GL_RG:
+                  for (i=0;i<n;i++) {
+                     CLAMPED_FLOAT_TO_USHORT(dst[i*2+0], rgba[i][RCOMP]);
+                     CLAMPED_FLOAT_TO_USHORT(dst[i*2+1], rgba[i][GCOMP]);
+                  }
+                  break;
+               case GL_RGB:
+                  for (i=0;i<n;i++) {
+                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][RCOMP]);
+                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]);
+                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][BCOMP]);
+                  }
+                  break;
+               case GL_RGBA:
+                  for (i=0;i<n;i++) {
+                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][RCOMP]);
+                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]);
+                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][BCOMP]);
+                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]);
+                  }
+                  break;
+               case GL_BGR:
+                  for (i=0;i<n;i++) {
+                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+0], rgba[i][BCOMP]);
+                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+1], rgba[i][GCOMP]);
+                     CLAMPED_FLOAT_TO_USHORT(dst[i*3+2], rgba[i][RCOMP]);
+                  }
+                  break;
+               case GL_BGRA:
+                  for (i=0;i<n;i++) {
+                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][BCOMP]);
+                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][GCOMP]);
+                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][RCOMP]);
+                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][ACOMP]);
+                  }
+                  break;
+               case GL_ABGR_EXT:
+                  for (i=0;i<n;i++) {
+                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+0], rgba[i][ACOMP]);
+                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+1], rgba[i][BCOMP]);
+                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+2], rgba[i][GCOMP]);
+                     CLAMPED_FLOAT_TO_USHORT(dst[i*4+3], rgba[i][RCOMP]);
+                  }
+                  break;
+               case GL_RED_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLushort) rgba[i][RCOMP];
+                  }
+                  break;
+               case GL_GREEN_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLushort) rgba[i][GCOMP];
+                  }
+                  break;
+               case GL_BLUE_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLushort) rgba[i][BCOMP];
+                  }
+                  break;
+               case GL_ALPHA_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLushort) rgba[i][ACOMP];
+                  }
+                  break;
+               case GL_RGB_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*3+0] = (GLushort) rgba[i][RCOMP];
+                     dst[i*3+1] = (GLushort) rgba[i][GCOMP];
+                     dst[i*3+2] = (GLushort) rgba[i][BCOMP];
+                  }
+                  break;
+               case GL_RGBA_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = (GLushort) rgba[i][RCOMP];
+                     dst[i*4+1] = (GLushort) rgba[i][GCOMP];
+                     dst[i*4+2] = (GLushort) rgba[i][BCOMP];
+                     dst[i*4+3] = (GLushort) rgba[i][ACOMP];
+                  }
+                  break;
+               case GL_BGR_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*3+0] = (GLushort) rgba[i][BCOMP];
+                     dst[i*3+1] = (GLushort) rgba[i][GCOMP];
+                     dst[i*3+2] = (GLushort) rgba[i][RCOMP];
+                  }
+                  break;
+               case GL_BGRA_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = (GLushort) rgba[i][BCOMP];
+                     dst[i*4+1] = (GLushort) rgba[i][GCOMP];
+                     dst[i*4+2] = (GLushort) rgba[i][RCOMP];
+                     dst[i*4+3] = (GLushort) rgba[i][ACOMP];
+                  }
+                  break;
+               case GL_LUMINANCE_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*2+0] = (GLushort) (rgba[i][RCOMP] +
+                                              rgba[i][GCOMP] +
+                                              rgba[i][BCOMP]);
+                     dst[i*2+1] = (GLushort) rgba[i][ACOMP];
+                  }
+                  break;
+               case GL_LUMINANCE_ALPHA_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLushort) (rgba[i][RCOMP] +
+                                          rgba[i][GCOMP] +
+                                          rgba[i][BCOMP]);
+                  }
+                  break;
+               case GL_DUDV_ATI:
+               case GL_DU8DV8_ATI:
+                  for (i=0;i<n;i++) {
+                     dst[i*2+0] = FLOAT_TO_USHORT(rgba[i][RCOMP]);
+                     dst[i*2+1] = FLOAT_TO_USHORT(rgba[i][GCOMP]);
+                  }
+                  break;
+               default:
+                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
+            }
+         }
+         break;
+      case GL_SHORT:
+         {
+            GLshort *dst = (GLshort *) dstAddr;
+            switch (dstFormat) {
+               case GL_RED:
+                  for (i=0;i<n;i++)
+                     dst[i] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
+                  break;
+               case GL_GREEN:
+                  for (i=0;i<n;i++)
+                     dst[i] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
+                  break;
+               case GL_BLUE:
+                  for (i=0;i<n;i++)
+                     dst[i] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
+                  break;
+               case GL_ALPHA:
+                  for (i=0;i<n;i++)
+                     dst[i] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
+                  break;
+               case GL_LUMINANCE:
+                  for (i=0;i<n;i++)
+                     dst[i] = FLOAT_TO_SHORT(luminance[i]);
+                  break;
+               case GL_LUMINANCE_ALPHA:
+                  for (i=0;i<n;i++) {
+                     dst[i*2+0] = FLOAT_TO_SHORT(luminance[i]);
+                     dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
+                  }
+                  break;
+               case GL_RG:
+                  for (i=0;i<n;i++) {
+                     dst[i*2+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
+                     dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
+                  }
+                  break;
+               case GL_RGB:
+                  for (i=0;i<n;i++) {
+                     dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
+                     dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
+                     dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
+                  }
+                  break;
+               case GL_RGBA:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
+                     dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
+                     dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
+                     dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
+                  }
+                  break;
+               case GL_BGR:
+                  for (i=0;i<n;i++) {
+                     dst[i*3+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
+                     dst[i*3+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
+                     dst[i*3+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
+                  }
+                  break;
+               case GL_BGRA:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
+                     dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
+                     dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
+                     dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
+                  }
+		  break;
+               case GL_ABGR_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = FLOAT_TO_SHORT(rgba[i][ACOMP]);
+                     dst[i*4+1] = FLOAT_TO_SHORT(rgba[i][BCOMP]);
+                     dst[i*4+2] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
+                     dst[i*4+3] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
+                  }
+                  break;
+               case GL_RED_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLshort) rgba[i][RCOMP];
+                  }
+                  break;
+               case GL_GREEN_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLshort) rgba[i][GCOMP];
+                  }
+                  break;
+               case GL_BLUE_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLshort) rgba[i][BCOMP];
+                  }
+                  break;
+               case GL_ALPHA_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLshort) rgba[i][ACOMP];
+                  }
+                  break;
+               case GL_RGB_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*3+0] = (GLshort) rgba[i][RCOMP];
+                     dst[i*3+1] = (GLshort) rgba[i][GCOMP];
+                     dst[i*3+2] = (GLshort) rgba[i][BCOMP];
+                  }
+                  break;
+               case GL_RGBA_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = (GLshort) rgba[i][RCOMP];
+                     dst[i*4+1] = (GLshort) rgba[i][GCOMP];
+                     dst[i*4+2] = (GLshort) rgba[i][BCOMP];
+                     dst[i*4+3] = (GLshort) rgba[i][ACOMP];
+                  }
+                  break;
+               case GL_BGR_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*3+0] = (GLshort) rgba[i][BCOMP];
+                     dst[i*3+1] = (GLshort) rgba[i][GCOMP];
+                     dst[i*3+2] = (GLshort) rgba[i][RCOMP];
+                  }
+                  break;
+               case GL_BGRA_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = (GLshort) rgba[i][BCOMP];
+                     dst[i*4+1] = (GLshort) rgba[i][GCOMP];
+                     dst[i*4+2] = (GLshort) rgba[i][RCOMP];
+                     dst[i*4+3] = (GLshort) rgba[i][ACOMP];
+                  }
+                  break;
+               case GL_LUMINANCE_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*2+0] = (GLshort) (rgba[i][RCOMP] +
+                                             rgba[i][GCOMP] +
+                                             rgba[i][BCOMP]);
+                     dst[i*2+1] = (GLshort) rgba[i][ACOMP];
+                  }
+                  break;
+               case GL_LUMINANCE_ALPHA_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLshort) (rgba[i][RCOMP] +
+                                         rgba[i][GCOMP] +
+                                         rgba[i][BCOMP]);
+                  }
+                  break;
+               case GL_DUDV_ATI:
+               case GL_DU8DV8_ATI:
+                  for (i=0;i<n;i++) {
+                     dst[i*2+0] = FLOAT_TO_SHORT(rgba[i][RCOMP]);
+                     dst[i*2+1] = FLOAT_TO_SHORT(rgba[i][GCOMP]);
+                  }
+                  break;
+               default:
+                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
+            }
+         }
+         break;
+      case GL_UNSIGNED_INT:
+         {
+            GLuint *dst = (GLuint *) dstAddr;
+            switch (dstFormat) {
+               case GL_RED:
+                  for (i=0;i<n;i++)
+                     dst[i] = FLOAT_TO_UINT(rgba[i][RCOMP]);
+                  break;
+               case GL_GREEN:
+                  for (i=0;i<n;i++)
+                     dst[i] = FLOAT_TO_UINT(rgba[i][GCOMP]);
+                  break;
+               case GL_BLUE:
+                  for (i=0;i<n;i++)
+                     dst[i] = FLOAT_TO_UINT(rgba[i][BCOMP]);
+                  break;
+               case GL_ALPHA:
+                  for (i=0;i<n;i++)
+                     dst[i] = FLOAT_TO_UINT(rgba[i][ACOMP]);
+                  break;
+               case GL_LUMINANCE:
+                  for (i=0;i<n;i++)
+                     dst[i] = FLOAT_TO_UINT(luminance[i]);
+                  break;
+               case GL_LUMINANCE_ALPHA:
+                  for (i=0;i<n;i++) {
+                     dst[i*2+0] = FLOAT_TO_UINT(luminance[i]);
+                     dst[i*2+1] = FLOAT_TO_UINT(rgba[i][ACOMP]);
+                  }
+                  break;
+               case GL_RG:
+                  for (i=0;i<n;i++) {
+                     dst[i*2+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
+                     dst[i*2+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
+                  }
+                  break;
+               case GL_RGB:
+                  for (i=0;i<n;i++) {
+                     dst[i*3+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
+                     dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
+                     dst[i*3+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
+                  }
+                  break;
+               case GL_RGBA:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
+                     dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
+                     dst[i*4+2] = FLOAT_TO_UINT(rgba[i][BCOMP]);
+                     dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
+                  }
+                  break;
+               case GL_BGR:
+                  for (i=0;i<n;i++) {
+                     dst[i*3+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
+                     dst[i*3+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
+                     dst[i*3+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
+                  }
+                  break;
+               case GL_BGRA:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = FLOAT_TO_UINT(rgba[i][BCOMP]);
+                     dst[i*4+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
+                     dst[i*4+2] = FLOAT_TO_UINT(rgba[i][RCOMP]);
+                     dst[i*4+3] = FLOAT_TO_UINT(rgba[i][ACOMP]);
+                  }
+                  break;
+               case GL_ABGR_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = FLOAT_TO_UINT(rgba[i][ACOMP]);
+                     dst[i*4+1] = FLOAT_TO_UINT(rgba[i][BCOMP]);
+                     dst[i*4+2] = FLOAT_TO_UINT(rgba[i][GCOMP]);
+                     dst[i*4+3] = FLOAT_TO_UINT(rgba[i][RCOMP]);
+                  }
+                  break;
+               case GL_RED_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLuint) rgba[i][RCOMP];
+                  }
+                  break;
+               case GL_GREEN_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLuint) rgba[i][GCOMP];
+                  }
+                  break;
+               case GL_BLUE_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLuint) rgba[i][BCOMP];
+                  }
+                  break;
+               case GL_ALPHA_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLuint) rgba[i][ACOMP];
+                  }
+                  break;
+               case GL_RGB_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*3+0] = (GLuint) rgba[i][RCOMP];
+                     dst[i*3+1] = (GLuint) rgba[i][GCOMP];
+                     dst[i*3+2] = (GLuint) rgba[i][BCOMP];
+                  }
+                  break;
+               case GL_RGBA_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = (GLuint) rgba[i][RCOMP];
+                     dst[i*4+1] = (GLuint) rgba[i][GCOMP];
+                     dst[i*4+2] = (GLuint) rgba[i][BCOMP];
+                     dst[i*4+3] = (GLuint) rgba[i][ACOMP];
+                  }
+                  break;
+               case GL_BGR_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*3+0] = (GLuint) rgba[i][BCOMP];
+                     dst[i*3+1] = (GLuint) rgba[i][GCOMP];
+                     dst[i*3+2] = (GLuint) rgba[i][RCOMP];
+                  }
+                  break;
+               case GL_BGRA_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = (GLuint) rgba[i][BCOMP];
+                     dst[i*4+1] = (GLuint) rgba[i][GCOMP];
+                     dst[i*4+2] = (GLuint) rgba[i][RCOMP];
+                     dst[i*4+3] = (GLuint) rgba[i][ACOMP];
+                  }
+                  break;
+               case GL_LUMINANCE_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*2+0] = (GLuint) (rgba[i][RCOMP] +
+                                            rgba[i][GCOMP] +
+                                            rgba[i][BCOMP]);
+                     dst[i*2+1] = (GLuint) rgba[i][ACOMP];
+                  }
+                  break;
+               case GL_LUMINANCE_ALPHA_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLuint) (rgba[i][RCOMP] +
+                                        rgba[i][GCOMP] +
+                                        rgba[i][BCOMP]);
+                  }
+                  break;
+               case GL_DUDV_ATI:
+               case GL_DU8DV8_ATI:
+                  for (i=0;i<n;i++) {
+                     dst[i*2+0] = FLOAT_TO_UINT(rgba[i][RCOMP]);
+                     dst[i*2+1] = FLOAT_TO_UINT(rgba[i][GCOMP]);
+                  }
+                  break;
+               default:
+                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
+            }
+         }
+         break;
+      case GL_INT:
+         {
+            GLint *dst = (GLint *) dstAddr;
+            switch (dstFormat) {
+               case GL_RED:
+                  for (i=0;i<n;i++)
+                     dst[i] = FLOAT_TO_INT(rgba[i][RCOMP]);
+                  break;
+               case GL_GREEN:
+                  for (i=0;i<n;i++)
+                     dst[i] = FLOAT_TO_INT(rgba[i][GCOMP]);
+                  break;
+               case GL_BLUE:
+                  for (i=0;i<n;i++)
+                     dst[i] = FLOAT_TO_INT(rgba[i][BCOMP]);
+                  break;
+               case GL_ALPHA:
+                  for (i=0;i<n;i++)
+                     dst[i] = FLOAT_TO_INT(rgba[i][ACOMP]);
+                  break;
+               case GL_LUMINANCE:
+                  for (i=0;i<n;i++)
+                     dst[i] = FLOAT_TO_INT(luminance[i]);
+                  break;
+               case GL_LUMINANCE_ALPHA:
+                  for (i=0;i<n;i++) {
+                     dst[i*2+0] = FLOAT_TO_INT(luminance[i]);
+                     dst[i*2+1] = FLOAT_TO_INT(rgba[i][ACOMP]);
+                  }
+                  break;
+               case GL_RG:
+                  for (i=0;i<n;i++) {
+                     dst[i*2+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
+                     dst[i*2+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
+                  }
+                  break;
+               case GL_RGB:
+                  for (i=0;i<n;i++) {
+                     dst[i*3+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
+                     dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
+                     dst[i*3+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
+                  }
+                  break;
+               case GL_RGBA:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
+                     dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
+                     dst[i*4+2] = FLOAT_TO_INT(rgba[i][BCOMP]);
+                     dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
+                  }
+                  break;
+               case GL_BGR:
+                  for (i=0;i<n;i++) {
+                     dst[i*3+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
+                     dst[i*3+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
+                     dst[i*3+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
+                  }
+                  break;
+               case GL_BGRA:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = FLOAT_TO_INT(rgba[i][BCOMP]);
+                     dst[i*4+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
+                     dst[i*4+2] = FLOAT_TO_INT(rgba[i][RCOMP]);
+                     dst[i*4+3] = FLOAT_TO_INT(rgba[i][ACOMP]);
+                  }
+                  break;
+               case GL_ABGR_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = FLOAT_TO_INT(rgba[i][ACOMP]);
+                     dst[i*4+1] = FLOAT_TO_INT(rgba[i][BCOMP]);
+                     dst[i*4+2] = FLOAT_TO_INT(rgba[i][GCOMP]);
+                     dst[i*4+3] = FLOAT_TO_INT(rgba[i][RCOMP]);
+                  }
+                  break;
+               case GL_DUDV_ATI:
+               case GL_DU8DV8_ATI:
+                  for (i=0;i<n;i++) {
+                     dst[i*2+0] = FLOAT_TO_INT(rgba[i][RCOMP]);
+                     dst[i*2+1] = FLOAT_TO_INT(rgba[i][GCOMP]);
+                  }
+                  break;
+               case GL_RED_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLint) rgba[i][RCOMP];
+                  }
+                  break;
+               case GL_GREEN_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLint) rgba[i][GCOMP];
+                  }
+                  break;
+               case GL_BLUE_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLint) rgba[i][BCOMP];
+                  }
+                  break;
+               case GL_ALPHA_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLint) rgba[i][ACOMP];
+                  }
+                  break;
+               case GL_RGB_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*3+0] = (GLint) rgba[i][RCOMP];
+                     dst[i*3+1] = (GLint) rgba[i][GCOMP];
+                     dst[i*3+2] = (GLint) rgba[i][BCOMP];
+                  }
+                  break;
+               case GL_RGBA_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = (GLint) rgba[i][RCOMP];
+                     dst[i*4+1] = (GLint) rgba[i][GCOMP];
+                     dst[i*4+2] = (GLint) rgba[i][BCOMP];
+                     dst[i*4+3] = (GLint) rgba[i][ACOMP];
+                  }
+                  break;
+               case GL_BGR_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*3+0] = (GLint) rgba[i][BCOMP];
+                     dst[i*3+1] = (GLint) rgba[i][GCOMP];
+                     dst[i*3+2] = (GLint) rgba[i][RCOMP];
+                  }
+                  break;
+               case GL_BGRA_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = (GLint) rgba[i][BCOMP];
+                     dst[i*4+1] = (GLint) rgba[i][GCOMP];
+                     dst[i*4+2] = (GLint) rgba[i][RCOMP];
+                     dst[i*4+3] = (GLint) rgba[i][ACOMP];
+                  }
+                  break;
+               case GL_LUMINANCE_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*2+0] = (GLint) (rgba[i][RCOMP] +
+                                           rgba[i][GCOMP] +
+                                           rgba[i][BCOMP]);
+                     dst[i*2+1] = (GLint) rgba[i][ACOMP];
+                  }
+                  break;
+               case GL_LUMINANCE_ALPHA_INTEGER_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i] = (GLint) (rgba[i][RCOMP] +
+                                       rgba[i][GCOMP] +
+                                       rgba[i][BCOMP]);
+                  }
+                  break;
+               default:
+                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
+            }
+         }
+         break;
+      case GL_FLOAT:
+         {
+            GLfloat *dst = (GLfloat *) dstAddr;
+            switch (dstFormat) {
+               case GL_RED:
+                  for (i=0;i<n;i++)
+                     dst[i] = rgba[i][RCOMP];
+                  break;
+               case GL_GREEN:
+                  for (i=0;i<n;i++)
+                     dst[i] = rgba[i][GCOMP];
+                  break;
+               case GL_BLUE:
+                  for (i=0;i<n;i++)
+                     dst[i] = rgba[i][BCOMP];
+                  break;
+               case GL_ALPHA:
+                  for (i=0;i<n;i++)
+                     dst[i] = rgba[i][ACOMP];
+                  break;
+               case GL_LUMINANCE:
+                  for (i=0;i<n;i++)
+                     dst[i] = luminance[i];
+                  break;
+               case GL_LUMINANCE_ALPHA:
+                  for (i=0;i<n;i++) {
+                     dst[i*2+0] = luminance[i];
+                     dst[i*2+1] = rgba[i][ACOMP];
+                  }
+                  break;
+               case GL_RG:
+                  for (i=0;i<n;i++) {
+                     dst[i*2+0] = rgba[i][RCOMP];
+                     dst[i*2+1] = rgba[i][GCOMP];
+                  }
+                  break;
+               case GL_RGB:
+                  for (i=0;i<n;i++) {
+                     dst[i*3+0] = rgba[i][RCOMP];
+                     dst[i*3+1] = rgba[i][GCOMP];
+                     dst[i*3+2] = rgba[i][BCOMP];
+                  }
+                  break;
+               case GL_RGBA:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = rgba[i][RCOMP];
+                     dst[i*4+1] = rgba[i][GCOMP];
+                     dst[i*4+2] = rgba[i][BCOMP];
+                     dst[i*4+3] = rgba[i][ACOMP];
+                  }
+                  break;
+               case GL_BGR:
+                  for (i=0;i<n;i++) {
+                     dst[i*3+0] = rgba[i][BCOMP];
+                     dst[i*3+1] = rgba[i][GCOMP];
+                     dst[i*3+2] = rgba[i][RCOMP];
+                  }
+                  break;
+               case GL_BGRA:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = rgba[i][BCOMP];
+                     dst[i*4+1] = rgba[i][GCOMP];
+                     dst[i*4+2] = rgba[i][RCOMP];
+                     dst[i*4+3] = rgba[i][ACOMP];
+                  }
+                  break;
+               case GL_ABGR_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = rgba[i][ACOMP];
+                     dst[i*4+1] = rgba[i][BCOMP];
+                     dst[i*4+2] = rgba[i][GCOMP];
+                     dst[i*4+3] = rgba[i][RCOMP];
+                  }
+                  break;
+               case GL_DUDV_ATI:
+               case GL_DU8DV8_ATI:
+                  for (i=0;i<n;i++) {
+                     dst[i*2+0] = rgba[i][RCOMP];
+                     dst[i*2+1] = rgba[i][GCOMP];
+                  }
+                  break;
+               default:
+                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
+            }
+         }
+         break;
+      case GL_HALF_FLOAT_ARB:
+         {
+            GLhalfARB *dst = (GLhalfARB *) dstAddr;
+            switch (dstFormat) {
+               case GL_RED:
+                  for (i=0;i<n;i++)
+                     dst[i] = _mesa_float_to_half(rgba[i][RCOMP]);
+                  break;
+               case GL_GREEN:
+                  for (i=0;i<n;i++)
+                     dst[i] = _mesa_float_to_half(rgba[i][GCOMP]);
+                  break;
+               case GL_BLUE:
+                  for (i=0;i<n;i++)
+                     dst[i] = _mesa_float_to_half(rgba[i][BCOMP]);
+                  break;
+               case GL_ALPHA:
+                  for (i=0;i<n;i++)
+                     dst[i] = _mesa_float_to_half(rgba[i][ACOMP]);
+                  break;
+               case GL_LUMINANCE:
+                  for (i=0;i<n;i++)
+                     dst[i] = _mesa_float_to_half(luminance[i]);
+                  break;
+               case GL_LUMINANCE_ALPHA:
+                  for (i=0;i<n;i++) {
+                     dst[i*2+0] = _mesa_float_to_half(luminance[i]);
+                     dst[i*2+1] = _mesa_float_to_half(rgba[i][ACOMP]);
+                  }
+                  break;
+               case GL_RG:
+                  for (i=0;i<n;i++) {
+                     dst[i*2+0] = _mesa_float_to_half(rgba[i][RCOMP]);
+                     dst[i*2+1] = _mesa_float_to_half(rgba[i][GCOMP]);
+                  }
+                  break;
+               case GL_RGB:
+                  for (i=0;i<n;i++) {
+                     dst[i*3+0] = _mesa_float_to_half(rgba[i][RCOMP]);
+                     dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]);
+                     dst[i*3+2] = _mesa_float_to_half(rgba[i][BCOMP]);
+                  }
+                  break;
+               case GL_RGBA:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = _mesa_float_to_half(rgba[i][RCOMP]);
+                     dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]);
+                     dst[i*4+2] = _mesa_float_to_half(rgba[i][BCOMP]);
+                     dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]);
+                  }
+                  break;
+               case GL_BGR:
+                  for (i=0;i<n;i++) {
+                     dst[i*3+0] = _mesa_float_to_half(rgba[i][BCOMP]);
+                     dst[i*3+1] = _mesa_float_to_half(rgba[i][GCOMP]);
+                     dst[i*3+2] = _mesa_float_to_half(rgba[i][RCOMP]);
+                  }
+                  break;
+               case GL_BGRA:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = _mesa_float_to_half(rgba[i][BCOMP]);
+                     dst[i*4+1] = _mesa_float_to_half(rgba[i][GCOMP]);
+                     dst[i*4+2] = _mesa_float_to_half(rgba[i][RCOMP]);
+                     dst[i*4+3] = _mesa_float_to_half(rgba[i][ACOMP]);
+                  }
+                  break;
+               case GL_ABGR_EXT:
+                  for (i=0;i<n;i++) {
+                     dst[i*4+0] = _mesa_float_to_half(rgba[i][ACOMP]);
+                     dst[i*4+1] = _mesa_float_to_half(rgba[i][BCOMP]);
+                     dst[i*4+2] = _mesa_float_to_half(rgba[i][GCOMP]);
+                     dst[i*4+3] = _mesa_float_to_half(rgba[i][RCOMP]);
+                  }
+                  break;
+               case GL_DUDV_ATI:
+               case GL_DU8DV8_ATI:
+                  for (i=0;i<n;i++) {
+                     dst[i*2+0] = _mesa_float_to_half(rgba[i][RCOMP]);
+                     dst[i*2+1] = _mesa_float_to_half(rgba[i][GCOMP]);
+                  }
+                  break;
+               default:
+                  _mesa_problem(ctx, "bad format in _mesa_pack_rgba_span\n");
+            }
+         }
+         break;
+      case GL_UNSIGNED_BYTE_3_3_2:
+         if (dstFormat == GL_RGB) {
+            GLubyte *dst = (GLubyte *) dstAddr;
+            for (i=0;i<n;i++) {
+               dst[i] = (IROUND(rgba[i][RCOMP] * 7.0F) << 5)
+                      | (IROUND(rgba[i][GCOMP] * 7.0F) << 2)
+                      | (IROUND(rgba[i][BCOMP] * 3.0F)     );
+            }
+         }
+         break;
+      case GL_UNSIGNED_BYTE_2_3_3_REV:
+         if (dstFormat == GL_RGB) {
+            GLubyte *dst = (GLubyte *) dstAddr;
+            for (i=0;i<n;i++) {
+               dst[i] = (IROUND(rgba[i][RCOMP] * 7.0F)     )
+                      | (IROUND(rgba[i][GCOMP] * 7.0F) << 3)
+                      | (IROUND(rgba[i][BCOMP] * 3.0F) << 6);
+            }
+         }
+         break;
+      case GL_UNSIGNED_SHORT_5_6_5:
+         if (dstFormat == GL_RGB) {
+            GLushort *dst = (GLushort *) dstAddr;
+            for (i=0;i<n;i++) {
+               dst[i] = (IROUND(rgba[i][RCOMP] * 31.0F) << 11)
+                      | (IROUND(rgba[i][GCOMP] * 63.0F) <<  5)
+                      | (IROUND(rgba[i][BCOMP] * 31.0F)      );
+            }
+         }
+         break;
+      case GL_UNSIGNED_SHORT_5_6_5_REV:
+         if (dstFormat == GL_RGB) {
+            GLushort *dst = (GLushort *) dstAddr;
+            for (i=0;i<n;i++) {
+               dst[i] = (IROUND(rgba[i][RCOMP] * 31.0F)      )
+                      | (IROUND(rgba[i][GCOMP] * 63.0F) <<  5)
+                      | (IROUND(rgba[i][BCOMP] * 31.0F) << 11);
+            }
+         }
+         break;
+      case GL_UNSIGNED_SHORT_4_4_4_4:
+         if (dstFormat == GL_RGBA) {
+            GLushort *dst = (GLushort *) dstAddr;
+            for (i=0;i<n;i++) {
+               dst[i] = (IROUND(rgba[i][RCOMP] * 15.0F) << 12)
+                      | (IROUND(rgba[i][GCOMP] * 15.0F) <<  8)
+                      | (IROUND(rgba[i][BCOMP] * 15.0F) <<  4)
+                      | (IROUND(rgba[i][ACOMP] * 15.0F)      );
+            }
+         }
+         else if (dstFormat == GL_BGRA) {
+            GLushort *dst = (GLushort *) dstAddr;
+            for (i=0;i<n;i++) {
+               dst[i] = (IROUND(rgba[i][BCOMP] * 15.0F) << 12)
+                      | (IROUND(rgba[i][GCOMP] * 15.0F) <<  8)
+                      | (IROUND(rgba[i][RCOMP] * 15.0F) <<  4)
+                      | (IROUND(rgba[i][ACOMP] * 15.0F)      );
+            }
+         }
+         else if (dstFormat == GL_ABGR_EXT) {
+            GLushort *dst = (GLushort *) dstAddr;
+            for (i=0;i<n;i++) {
+               dst[i] = (IROUND(rgba[i][ACOMP] * 15.0F) << 12)
+                      | (IROUND(rgba[i][BCOMP] * 15.0F) <<  8)
+                      | (IROUND(rgba[i][GCOMP] * 15.0F) <<  4)
+                      | (IROUND(rgba[i][RCOMP] * 15.0F)      );
+            }
+         }
+         break;
+      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
+         if (dstFormat == GL_RGBA) {
+            GLushort *dst = (GLushort *) dstAddr;
+            for (i=0;i<n;i++) {
+               dst[i] = (IROUND(rgba[i][RCOMP] * 15.0F)      )
+                      | (IROUND(rgba[i][GCOMP] * 15.0F) <<  4)
+                      | (IROUND(rgba[i][BCOMP] * 15.0F) <<  8)
+                      | (IROUND(rgba[i][ACOMP] * 15.0F) << 12);
+            }
+         }
+         else if (dstFormat == GL_BGRA) {
+            GLushort *dst = (GLushort *) dstAddr;
+            for (i=0;i<n;i++) {
+               dst[i] = (IROUND(rgba[i][BCOMP] * 15.0F)      )
+                      | (IROUND(rgba[i][GCOMP] * 15.0F) <<  4)
+                      | (IROUND(rgba[i][RCOMP] * 15.0F) <<  8)
+                      | (IROUND(rgba[i][ACOMP] * 15.0F) << 12);
+            }
+         }
+         else if (dstFormat == GL_ABGR_EXT) {
+            GLushort *dst = (GLushort *) dstAddr;
+            for (i=0;i<n;i++) {
+               dst[i] = (IROUND(rgba[i][ACOMP] * 15.0F)      )
+                      | (IROUND(rgba[i][BCOMP] * 15.0F) <<  4)
+                      | (IROUND(rgba[i][GCOMP] * 15.0F) <<  8)
+                      | (IROUND(rgba[i][RCOMP] * 15.0F) << 12);
+            }
+         }
+         break;
+      case GL_UNSIGNED_SHORT_5_5_5_1:
+         if (dstFormat == GL_RGBA) {
+            GLushort *dst = (GLushort *) dstAddr;
+            for (i=0;i<n;i++) {
+               dst[i] = (IROUND(rgba[i][RCOMP] * 31.0F) << 11)
+                      | (IROUND(rgba[i][GCOMP] * 31.0F) <<  6)
+                      | (IROUND(rgba[i][BCOMP] * 31.0F) <<  1)
+                      | (IROUND(rgba[i][ACOMP] *  1.0F)      );
+            }
+         }
+         else if (dstFormat == GL_BGRA) {
+            GLushort *dst = (GLushort *) dstAddr;
+            for (i=0;i<n;i++) {
+               dst[i] = (IROUND(rgba[i][BCOMP] * 31.0F) << 11)
+                      | (IROUND(rgba[i][GCOMP] * 31.0F) <<  6)
+                      | (IROUND(rgba[i][RCOMP] * 31.0F) <<  1)
+                      | (IROUND(rgba[i][ACOMP] *  1.0F)      );
+            }
+         }
+         else if (dstFormat == GL_ABGR_EXT) {
+            GLushort *dst = (GLushort *) dstAddr;
+            for (i=0;i<n;i++) {
+               dst[i] = (IROUND(rgba[i][ACOMP] * 31.0F) << 11)
+                      | (IROUND(rgba[i][BCOMP] * 31.0F) <<  6)
+                      | (IROUND(rgba[i][GCOMP] * 31.0F) <<  1)
+                      | (IROUND(rgba[i][RCOMP] *  1.0F)      );
+            }
+         }
+         break;
+      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
+         if (dstFormat == GL_RGBA) {
+            GLushort *dst = (GLushort *) dstAddr;
+            for (i=0;i<n;i++) {
+               dst[i] = (IROUND(rgba[i][RCOMP] * 31.0F)      )
+                      | (IROUND(rgba[i][GCOMP] * 31.0F) <<  5)
+                      | (IROUND(rgba[i][BCOMP] * 31.0F) << 10)
+                      | (IROUND(rgba[i][ACOMP] *  1.0F) << 15);
+            }
+         }
+         else if (dstFormat == GL_BGRA) {
+            GLushort *dst = (GLushort *) dstAddr;
+            for (i=0;i<n;i++) {
+               dst[i] = (IROUND(rgba[i][BCOMP] * 31.0F)      )
+                      | (IROUND(rgba[i][GCOMP] * 31.0F) <<  5)
+                      | (IROUND(rgba[i][RCOMP] * 31.0F) << 10)
+                      | (IROUND(rgba[i][ACOMP] *  1.0F) << 15);
+            }
+         }
+         else if (dstFormat == GL_ABGR_EXT) {
+            GLushort *dst = (GLushort *) dstAddr;
+            for (i=0;i<n;i++) {
+               dst[i] = (IROUND(rgba[i][ACOMP] * 31.0F)      )
+                      | (IROUND(rgba[i][BCOMP] * 31.0F) <<  5)
+                      | (IROUND(rgba[i][GCOMP] * 31.0F) << 10)
+                      | (IROUND(rgba[i][RCOMP] *  1.0F) << 15);
+            }
+         }
+         break;
+      case GL_UNSIGNED_INT_8_8_8_8:
+         if (dstFormat == GL_RGBA) {
+            GLuint *dst = (GLuint *) dstAddr;
+            for (i=0;i<n;i++) {
+               dst[i] = (IROUND(rgba[i][RCOMP] * 255.F) << 24)
+                      | (IROUND(rgba[i][GCOMP] * 255.F) << 16)
+                      | (IROUND(rgba[i][BCOMP] * 255.F) <<  8)
+                      | (IROUND(rgba[i][ACOMP] * 255.F)      );
+            }
+         }
+         else if (dstFormat == GL_BGRA) {
+            GLuint *dst = (GLuint *) dstAddr;
+            for (i=0;i<n;i++) {
+               dst[i] = (IROUND(rgba[i][BCOMP] * 255.F) << 24)
+                      | (IROUND(rgba[i][GCOMP] * 255.F) << 16)
+                      | (IROUND(rgba[i][RCOMP] * 255.F) <<  8)
+                      | (IROUND(rgba[i][ACOMP] * 255.F)      );
+            }
+         }
+         else if (dstFormat == GL_ABGR_EXT) {
+            GLuint *dst = (GLuint *) dstAddr;
+            for (i=0;i<n;i++) {
+               dst[i] = (IROUND(rgba[i][ACOMP] * 255.F) << 24)
+                      | (IROUND(rgba[i][BCOMP] * 255.F) << 16)
+                      | (IROUND(rgba[i][GCOMP] * 255.F) <<  8)
+                      | (IROUND(rgba[i][RCOMP] * 255.F)      );
+            }
+         }
+         break;
+      case GL_UNSIGNED_INT_8_8_8_8_REV:
+         if (dstFormat == GL_RGBA) {
+            GLuint *dst = (GLuint *) dstAddr;
+            for (i=0;i<n;i++) {
+               dst[i] = (IROUND(rgba[i][RCOMP] * 255.0F)      )
+                      | (IROUND(rgba[i][GCOMP] * 255.0F) <<  8)
+                      | (IROUND(rgba[i][BCOMP] * 255.0F) << 16)
+                      | (IROUND(rgba[i][ACOMP] * 255.0F) << 24);
+            }
+         }
+         else if (dstFormat == GL_BGRA) {
+            GLuint *dst = (GLuint *) dstAddr;
+            for (i=0;i<n;i++) {
+               dst[i] = (IROUND(rgba[i][BCOMP] * 255.0F)      )
+                      | (IROUND(rgba[i][GCOMP] * 255.0F) <<  8)
+                      | (IROUND(rgba[i][RCOMP] * 255.0F) << 16)
+                      | (IROUND(rgba[i][ACOMP] * 255.0F) << 24);
+            }
+         }
+         else if (dstFormat == GL_ABGR_EXT) {
+            GLuint *dst = (GLuint *) dstAddr;
+            for (i=0;i<n;i++) {
+               dst[i] = (IROUND(rgba[i][ACOMP] * 255.0F)      )
+                      | (IROUND(rgba[i][BCOMP] * 255.0F) <<  8)
+                      | (IROUND(rgba[i][GCOMP] * 255.0F) << 16)
+                      | (IROUND(rgba[i][RCOMP] * 255.0F) << 24);
+            }
+         }
+         break;
+      case GL_UNSIGNED_INT_10_10_10_2:
+         if (dstFormat == GL_RGBA) {
+            GLuint *dst = (GLuint *) dstAddr;
+            for (i=0;i<n;i++) {
+               dst[i] = (IROUND(rgba[i][RCOMP] * 1023.0F) << 22)
+                      | (IROUND(rgba[i][GCOMP] * 1023.0F) << 12)
+                      | (IROUND(rgba[i][BCOMP] * 1023.0F) <<  2)
+                      | (IROUND(rgba[i][ACOMP] *    3.0F)      );
+            }
+         }
+         else if (dstFormat == GL_BGRA) {
+            GLuint *dst = (GLuint *) dstAddr;
+            for (i=0;i<n;i++) {
+               dst[i] = (IROUND(rgba[i][BCOMP] * 1023.0F) << 22)
+                      | (IROUND(rgba[i][GCOMP] * 1023.0F) << 12)
+                      | (IROUND(rgba[i][RCOMP] * 1023.0F) <<  2)
+                      | (IROUND(rgba[i][ACOMP] *    3.0F)      );
+            }
+         }
+         else if (dstFormat == GL_ABGR_EXT) {
+            GLuint *dst = (GLuint *) dstAddr;
+            for (i=0;i<n;i++) {
+               dst[i] = (IROUND(rgba[i][ACOMP] * 1023.0F) << 22)
+                      | (IROUND(rgba[i][BCOMP] * 1023.0F) << 12)
+                      | (IROUND(rgba[i][GCOMP] * 1023.0F) <<  2)
+                      | (IROUND(rgba[i][RCOMP] *    3.0F)      );
+            }
+         }
+         break;
+      case GL_UNSIGNED_INT_2_10_10_10_REV:
+         if (dstFormat == GL_RGBA) {
+            GLuint *dst = (GLuint *) dstAddr;
+            for (i=0;i<n;i++) {
+               dst[i] = (IROUND(rgba[i][RCOMP] * 1023.0F)      )
+                      | (IROUND(rgba[i][GCOMP] * 1023.0F) << 10)
+                      | (IROUND(rgba[i][BCOMP] * 1023.0F) << 20)
+                      | (IROUND(rgba[i][ACOMP] *    3.0F) << 30);
+            }
+         }
+         else if (dstFormat == GL_BGRA) {
+            GLuint *dst = (GLuint *) dstAddr;
+            for (i=0;i<n;i++) {
+               dst[i] = (IROUND(rgba[i][BCOMP] * 1023.0F)      )
+                      | (IROUND(rgba[i][GCOMP] * 1023.0F) << 10)
+                      | (IROUND(rgba[i][RCOMP] * 1023.0F) << 20)
+                      | (IROUND(rgba[i][ACOMP] *    3.0F) << 30);
+            }
+         }
+         else if (dstFormat == GL_ABGR_EXT) {
+            GLuint *dst = (GLuint *) dstAddr;
+            for (i=0;i<n;i++) {
+               dst[i] = (IROUND(rgba[i][ACOMP] * 1023.0F)      )
+                      | (IROUND(rgba[i][BCOMP] * 1023.0F) << 10)
+                      | (IROUND(rgba[i][GCOMP] * 1023.0F) << 20)
+                      | (IROUND(rgba[i][RCOMP] *    3.0F) << 30);
+            }
+         }
+         break;
+      default:
+         _mesa_problem(ctx, "bad type in _mesa_pack_rgba_span_float");
+         return;
+   }
+
+   if (dstPacking->SwapBytes) {
+      GLint swapSize = _mesa_sizeof_packed_type(dstType);
+      if (swapSize == 2) {
+         if (dstPacking->SwapBytes) {
+            _mesa_swap2((GLushort *) dstAddr, n * comps);
+         }
+      }
+      else if (swapSize == 4) {
+         if (dstPacking->SwapBytes) {
+            _mesa_swap4((GLuint *) dstAddr, n * comps);
+         }
+      }
+   }
+
+   free(luminance);
+}
+
+
+
+#define SWAP2BYTE(VALUE)			\
+   {						\
+      GLubyte *bytes = (GLubyte *) &(VALUE);	\
+      GLubyte tmp = bytes[0];			\
+      bytes[0] = bytes[1];			\
+      bytes[1] = tmp;				\
+   }
+
+#define SWAP4BYTE(VALUE)			\
+   {						\
+      GLubyte *bytes = (GLubyte *) &(VALUE);	\
+      GLubyte tmp = bytes[0];			\
+      bytes[0] = bytes[3];			\
+      bytes[3] = tmp;				\
+      tmp = bytes[1];				\
+      bytes[1] = bytes[2];			\
+      bytes[2] = tmp;				\
+   }
+
+
+static void
+extract_uint_indexes(GLuint n, GLuint indexes[],
+                     GLenum srcFormat, GLenum srcType, const GLvoid *src,
+                     const struct gl_pixelstore_attrib *unpack )
+{
+   ASSERT(srcFormat == GL_COLOR_INDEX || srcFormat == GL_STENCIL_INDEX);
+
+   ASSERT(srcType == GL_BITMAP ||
+          srcType == GL_UNSIGNED_BYTE ||
+          srcType == GL_BYTE ||
+          srcType == GL_UNSIGNED_SHORT ||
+          srcType == GL_SHORT ||
+          srcType == GL_UNSIGNED_INT ||
+          srcType == GL_INT ||
+          srcType == GL_UNSIGNED_INT_24_8_EXT ||
+          srcType == GL_HALF_FLOAT_ARB ||
+          srcType == GL_FLOAT);
+
+   switch (srcType) {
+      case GL_BITMAP:
+         {
+            GLubyte *ubsrc = (GLubyte *) src;
+            if (unpack->LsbFirst) {
+               GLubyte mask = 1 << (unpack->SkipPixels & 0x7);
+               GLuint i;
+               for (i = 0; i < n; i++) {
+                  indexes[i] = (*ubsrc & mask) ? 1 : 0;
+                  if (mask == 128) {
+                     mask = 1;
+                     ubsrc++;
+                  }
+                  else {
+                     mask = mask << 1;
+                  }
+               }
+            }
+            else {
+               GLubyte mask = 128 >> (unpack->SkipPixels & 0x7);
+               GLuint i;
+               for (i = 0; i < n; i++) {
+                  indexes[i] = (*ubsrc & mask) ? 1 : 0;
+                  if (mask == 1) {
+                     mask = 128;
+                     ubsrc++;
+                  }
+                  else {
+                     mask = mask >> 1;
+                  }
+               }
+            }
+         }
+         break;
+      case GL_UNSIGNED_BYTE:
+         {
+            GLuint i;
+            const GLubyte *s = (const GLubyte *) src;
+            for (i = 0; i < n; i++)
+               indexes[i] = s[i];
+         }
+         break;
+      case GL_BYTE:
+         {
+            GLuint i;
+            const GLbyte *s = (const GLbyte *) src;
+            for (i = 0; i < n; i++)
+               indexes[i] = s[i];
+         }
+         break;
+      case GL_UNSIGNED_SHORT:
+         {
+            GLuint i;
+            const GLushort *s = (const GLushort *) src;
+            if (unpack->SwapBytes) {
+               for (i = 0; i < n; i++) {
+                  GLushort value = s[i];
+                  SWAP2BYTE(value);
+                  indexes[i] = value;
+               }
+            }
+            else {
+               for (i = 0; i < n; i++)
+                  indexes[i] = s[i];
+            }
+         }
+         break;
+      case GL_SHORT:
+         {
+            GLuint i;
+            const GLshort *s = (const GLshort *) src;
+            if (unpack->SwapBytes) {
+               for (i = 0; i < n; i++) {
+                  GLshort value = s[i];
+                  SWAP2BYTE(value);
+                  indexes[i] = value;
+               }
+            }
+            else {
+               for (i = 0; i < n; i++)
+                  indexes[i] = s[i];
+            }
+         }
+         break;
+      case GL_UNSIGNED_INT:
+         {
+            GLuint i;
+            const GLuint *s = (const GLuint *) src;
+            if (unpack->SwapBytes) {
+               for (i = 0; i < n; i++) {
+                  GLuint value = s[i];
+                  SWAP4BYTE(value);
+                  indexes[i] = value;
+               }
+            }
+            else {
+               for (i = 0; i < n; i++)
+                  indexes[i] = s[i];
+            }
+         }
+         break;
+      case GL_INT:
+         {
+            GLuint i;
+            const GLint *s = (const GLint *) src;
+            if (unpack->SwapBytes) {
+               for (i = 0; i < n; i++) {
+                  GLint value = s[i];
+                  SWAP4BYTE(value);
+                  indexes[i] = value;
+               }
+            }
+            else {
+               for (i = 0; i < n; i++)
+                  indexes[i] = s[i];
+            }
+         }
+         break;
+      case GL_FLOAT:
+         {
+            GLuint i;
+            const GLfloat *s = (const GLfloat *) src;
+            if (unpack->SwapBytes) {
+               for (i = 0; i < n; i++) {
+                  GLfloat value = s[i];
+                  SWAP4BYTE(value);
+                  indexes[i] = (GLuint) value;
+               }
+            }
+            else {
+               for (i = 0; i < n; i++)
+                  indexes[i] = (GLuint) s[i];
+            }
+         }
+         break;
+      case GL_HALF_FLOAT_ARB:
+         {
+            GLuint i;
+            const GLhalfARB *s = (const GLhalfARB *) src;
+            if (unpack->SwapBytes) {
+               for (i = 0; i < n; i++) {
+                  GLhalfARB value = s[i];
+                  SWAP2BYTE(value);
+                  indexes[i] = (GLuint) _mesa_half_to_float(value);
+               }
+            }
+            else {
+               for (i = 0; i < n; i++)
+                  indexes[i] = (GLuint) _mesa_half_to_float(s[i]);
+            }
+         }
+         break;
+      case GL_UNSIGNED_INT_24_8_EXT:
+         {
+            GLuint i;
+            const GLuint *s = (const GLuint *) src;
+            if (unpack->SwapBytes) {
+               for (i = 0; i < n; i++) {
+                  GLuint value = s[i];
+                  SWAP4BYTE(value);
+                  indexes[i] = value & 0xff;  /* lower 8 bits */
+               }
+            }
+            else {
+               for (i = 0; i < n; i++)
+                  indexes[i] = s[i] & 0xff;  /* lower 8 bits */
+            }
+         }
+         break;
+
+      default:
+         _mesa_problem(NULL, "bad srcType in extract_uint_indexes");
+         return;
+   }
+}
+
+
+/**
+ * Return source/dest RGBA indexes for unpacking pixels.
+ */
+static void
+get_component_mapping(GLenum format,
+                      GLint *rSrc,
+                      GLint *gSrc,
+                      GLint *bSrc,
+                      GLint *aSrc,
+                      GLint *rDst,
+                      GLint *gDst,
+                      GLint *bDst,
+                      GLint *aDst)
+{
+   switch (format) {
+   case GL_RED:
+   case GL_RED_INTEGER_EXT:
+      *rSrc = 0;
+      *gSrc = *bSrc = *aSrc = -1;
+      break;
+   case GL_GREEN:
+   case GL_GREEN_INTEGER_EXT:
+      *gSrc = 0;
+      *rSrc = *bSrc = *aSrc = -1;
+      break;
+      case GL_BLUE:
+   case GL_BLUE_INTEGER_EXT:
+      *bSrc = 0;
+      *rSrc = *gSrc = *aSrc = -1;
+      break;
+   case GL_ALPHA:
+   case GL_ALPHA_INTEGER_EXT:
+      *rSrc = *gSrc = *bSrc = -1;
+      *aSrc = 0;
+      break;
+   case GL_LUMINANCE:
+   case GL_LUMINANCE_INTEGER_EXT:
+      *rSrc = *gSrc = *bSrc = 0;
+      *aSrc = -1;
+      break;
+   case GL_LUMINANCE_ALPHA:
+   case GL_LUMINANCE_ALPHA_INTEGER_EXT:
+      *rSrc = *gSrc = *bSrc = 0;
+      *aSrc = 1;
+      break;
+   case GL_INTENSITY:
+      *rSrc = *gSrc = *bSrc = *aSrc = 0;
+      break;
+   case GL_RG:
+   case GL_RG_INTEGER:
+      *rSrc = 0;
+      *gSrc = 1;
+      *bSrc = -1;
+      *aSrc = -1;
+      *rDst = 0;
+      *gDst = 1;
+      *bDst = 2;
+      *aDst = 3;
+      break;
+   case GL_RGB:
+   case GL_RGB_INTEGER:
+      *rSrc = 0;
+      *gSrc = 1;
+      *bSrc = 2;
+      *aSrc = -1;
+      *rDst = 0;
+      *gDst = 1;
+      *bDst = 2;
+      *aDst = 3;
+      break;
+   case GL_BGR:
+      *rSrc = 2;
+      *gSrc = 1;
+      *bSrc = 0;
+      *aSrc = -1;
+      *rDst = 2;
+      *gDst = 1;
+      *bDst = 0;
+      *aDst = 3;
+      break;
+   case GL_RGBA:
+   case GL_RGBA_INTEGER:
+      *rSrc = 0;
+      *gSrc = 1;
+      *bSrc = 2;
+      *aSrc = 3;
+      *rDst = 0;
+      *gDst = 1;
+      *bDst = 2;
+      *aDst = 3;
+      break;
+   case GL_BGRA:
+      *rSrc = 2;
+      *gSrc = 1;
+      *bSrc = 0;
+      *aSrc = 3;
+      *rDst = 2;
+      *gDst = 1;
+      *bDst = 0;
+      *aDst = 3;
+      break;
+   case GL_ABGR_EXT:
+      *rSrc = 3;
+      *gSrc = 2;
+      *bSrc = 1;
+      *aSrc = 0;
+      *rDst = 3;
+      *gDst = 2;
+      *bDst = 1;
+      *aDst = 0;
+      break;
+   case GL_DU8DV8_ATI:
+   case GL_DUDV_ATI:
+      *rSrc = 0;
+      *gSrc = 1;
+      *bSrc = -1;
+      *aSrc = -1;
+      break;
+   default:
+      _mesa_problem(NULL, "bad srcFormat %s in get_component_mapping",
+                    _mesa_lookup_enum_by_nr(format));
+      return;
+   }
+}
+
+
+
+/*
+ * This function extracts floating point RGBA values from arbitrary
+ * image data.  srcFormat and srcType are the format and type parameters
+ * passed to glDrawPixels, glTexImage[123]D, glTexSubImage[123]D, etc.
+ *
+ * Refering to section 3.6.4 of the OpenGL 1.2 spec, this function
+ * implements the "Conversion to floating point", "Conversion to RGB",
+ * and "Final Expansion to RGBA" operations.
+ *
+ * Args:  n - number of pixels
+ *        rgba - output colors
+ *        srcFormat - format of incoming data
+ *        srcType - data type of incoming data
+ *        src - source data pointer
+ *        swapBytes - perform byteswapping of incoming data?
+ */
+static void
+extract_float_rgba(GLuint n, GLfloat rgba[][4],
+                   GLenum srcFormat, GLenum srcType, const GLvoid *src,
+                   GLboolean swapBytes)
+{
+   GLint rSrc, gSrc, bSrc, aSrc;
+   GLint stride;
+   GLint rDst, bDst, gDst, aDst;
+   GLboolean intFormat;
+   GLfloat rs = 1.0f, gs = 1.0f, bs = 1.0f, as = 1.0f; /* scale factors */
+
+   ASSERT(srcFormat == GL_RED ||
+          srcFormat == GL_GREEN ||
+          srcFormat == GL_BLUE ||
+          srcFormat == GL_ALPHA ||
+          srcFormat == GL_LUMINANCE ||
+          srcFormat == GL_LUMINANCE_ALPHA ||
+          srcFormat == GL_INTENSITY ||
+          srcFormat == GL_RG ||
+          srcFormat == GL_RGB ||
+          srcFormat == GL_BGR ||
+          srcFormat == GL_RGBA ||
+          srcFormat == GL_BGRA ||
+          srcFormat == GL_ABGR_EXT ||
+          srcFormat == GL_DU8DV8_ATI ||
+          srcFormat == GL_DUDV_ATI ||
+          srcFormat == GL_RED_INTEGER_EXT ||
+          srcFormat == GL_GREEN_INTEGER_EXT ||
+          srcFormat == GL_BLUE_INTEGER_EXT ||
+          srcFormat == GL_ALPHA_INTEGER_EXT ||
+          srcFormat == GL_RGB_INTEGER_EXT ||
+          srcFormat == GL_RGBA_INTEGER_EXT ||
+          srcFormat == GL_BGR_INTEGER_EXT ||
+          srcFormat == GL_BGRA_INTEGER_EXT ||
+          srcFormat == GL_LUMINANCE_INTEGER_EXT ||
+          srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT);
+
+   ASSERT(srcType == GL_UNSIGNED_BYTE ||
+          srcType == GL_BYTE ||
+          srcType == GL_UNSIGNED_SHORT ||
+          srcType == GL_SHORT ||
+          srcType == GL_UNSIGNED_INT ||
+          srcType == GL_INT ||
+          srcType == GL_HALF_FLOAT_ARB ||
+          srcType == GL_FLOAT ||
+          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
+          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
+          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
+          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
+          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
+          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
+          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
+          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
+          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
+          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
+          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
+          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
+
+   get_component_mapping(srcFormat,
+                         &rSrc, &gSrc, &bSrc, &aSrc,
+                         &rDst, &gDst, &bDst, &aDst);
+
+   stride = _mesa_components_in_format(srcFormat);
+
+   intFormat = _mesa_is_integer_format(srcFormat);
+
+#define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT_FLT, DEFAULT_INT, TYPE, CONVERSION) \
+   if ((SRC_INDEX) < 0) {						\
+      GLuint i;								\
+      if (intFormat) {							\
+         for (i = 0; i < n; i++) {					\
+            rgba[i][DST_INDEX] = DEFAULT_INT;				\
+         }								\
+      }									\
+      else {								\
+         for (i = 0; i < n; i++) {					\
+            rgba[i][DST_INDEX] = DEFAULT_FLT;				\
+         }								\
+      }									\
+   }									\
+   else if (swapBytes) {						\
+      const TYPE *s = (const TYPE *) src;				\
+      GLuint i;								\
+      for (i = 0; i < n; i++) {						\
+         TYPE value = s[SRC_INDEX];					\
+         if (sizeof(TYPE) == 2) {					\
+            SWAP2BYTE(value);						\
+         }								\
+         else if (sizeof(TYPE) == 4) {					\
+            SWAP4BYTE(value);						\
+         }								\
+         if (intFormat)							\
+            rgba[i][DST_INDEX] = (GLfloat) value;			\
+         else								\
+            rgba[i][DST_INDEX] = (GLfloat) CONVERSION(value);		\
+         s += stride;							\
+      }									\
+   }									\
+   else {								\
+      const TYPE *s = (const TYPE *) src;				\
+      GLuint i;								\
+      if (intFormat) {							\
+         for (i = 0; i < n; i++) {					\
+            rgba[i][DST_INDEX] = (GLfloat) s[SRC_INDEX];		\
+            s += stride;						\
+         }								\
+      }									\
+      else {								\
+         for (i = 0; i < n; i++) {					\
+            rgba[i][DST_INDEX] = (GLfloat) CONVERSION(s[SRC_INDEX]);	\
+            s += stride;						\
+         }								\
+      }									\
+   }
+
+   switch (srcType) {
+      case GL_UNSIGNED_BYTE:
+         PROCESS(rSrc, RCOMP, 0.0F,   0, GLubyte, UBYTE_TO_FLOAT);
+         PROCESS(gSrc, GCOMP, 0.0F,   0, GLubyte, UBYTE_TO_FLOAT);
+         PROCESS(bSrc, BCOMP, 0.0F,   0, GLubyte, UBYTE_TO_FLOAT);
+         PROCESS(aSrc, ACOMP, 1.0F, 255, GLubyte, UBYTE_TO_FLOAT);
+         break;
+      case GL_BYTE:
+         PROCESS(rSrc, RCOMP, 0.0F,   0, GLbyte, BYTE_TO_FLOAT);
+         PROCESS(gSrc, GCOMP, 0.0F,   0, GLbyte, BYTE_TO_FLOAT);
+         PROCESS(bSrc, BCOMP, 0.0F,   0, GLbyte, BYTE_TO_FLOAT);
+         PROCESS(aSrc, ACOMP, 1.0F, 127, GLbyte, BYTE_TO_FLOAT);
+         break;
+      case GL_UNSIGNED_SHORT:
+         PROCESS(rSrc, RCOMP, 0.0F,      0, GLushort, USHORT_TO_FLOAT);
+         PROCESS(gSrc, GCOMP, 0.0F,      0, GLushort, USHORT_TO_FLOAT);
+         PROCESS(bSrc, BCOMP, 0.0F,      0, GLushort, USHORT_TO_FLOAT);
+         PROCESS(aSrc, ACOMP, 1.0F, 0xffff, GLushort, USHORT_TO_FLOAT);
+         break;
+      case GL_SHORT:
+         PROCESS(rSrc, RCOMP, 0.0F,     0, GLshort, SHORT_TO_FLOAT);
+         PROCESS(gSrc, GCOMP, 0.0F,     0, GLshort, SHORT_TO_FLOAT);
+         PROCESS(bSrc, BCOMP, 0.0F,     0, GLshort, SHORT_TO_FLOAT);
+         PROCESS(aSrc, ACOMP, 1.0F, 32767, GLshort, SHORT_TO_FLOAT);
+         break;
+      case GL_UNSIGNED_INT:
+         PROCESS(rSrc, RCOMP, 0.0F,          0, GLuint, UINT_TO_FLOAT);
+         PROCESS(gSrc, GCOMP, 0.0F,          0, GLuint, UINT_TO_FLOAT);
+         PROCESS(bSrc, BCOMP, 0.0F,          0, GLuint, UINT_TO_FLOAT);
+         PROCESS(aSrc, ACOMP, 1.0F, 0xffffffff, GLuint, UINT_TO_FLOAT);
+         break;
+      case GL_INT:
+         PROCESS(rSrc, RCOMP, 0.0F,          0, GLint, INT_TO_FLOAT);
+         PROCESS(gSrc, GCOMP, 0.0F,          0, GLint, INT_TO_FLOAT);
+         PROCESS(bSrc, BCOMP, 0.0F,          0, GLint, INT_TO_FLOAT);
+         PROCESS(aSrc, ACOMP, 1.0F, 2147483647, GLint, INT_TO_FLOAT);
+         break;
+      case GL_FLOAT:
+         PROCESS(rSrc, RCOMP, 0.0F, 0.0F, GLfloat, (GLfloat));
+         PROCESS(gSrc, GCOMP, 0.0F, 0.0F, GLfloat, (GLfloat));
+         PROCESS(bSrc, BCOMP, 0.0F, 0.0F, GLfloat, (GLfloat));
+         PROCESS(aSrc, ACOMP, 1.0F, 1.0F, GLfloat, (GLfloat));
+         break;
+      case GL_HALF_FLOAT_ARB:
+         PROCESS(rSrc, RCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float);
+         PROCESS(gSrc, GCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float);
+         PROCESS(bSrc, BCOMP, 0.0F, 0.0F, GLhalfARB, _mesa_half_to_float);
+         PROCESS(aSrc, ACOMP, 1.0F, 1.0F, GLhalfARB, _mesa_half_to_float);
+         break;
+      case GL_UNSIGNED_BYTE_3_3_2:
+         {
+            const GLubyte *ubsrc = (const GLubyte *) src;
+            GLuint i;
+            if (!intFormat) {
+               rs = 1.0F / 7.0F;
+               gs = 1.0F / 7.0F;
+               bs = 1.0F / 3.0F;
+            }
+            for (i = 0; i < n; i ++) {
+               GLubyte p = ubsrc[i];
+               rgba[i][rDst] = ((p >> 5)      ) * rs;
+               rgba[i][gDst] = ((p >> 2) & 0x7) * gs;
+               rgba[i][bDst] = ((p     ) & 0x3) * bs;
+               rgba[i][aDst] = 1.0F;
+            }
+         }
+         break;
+      case GL_UNSIGNED_BYTE_2_3_3_REV:
+         {
+            const GLubyte *ubsrc = (const GLubyte *) src;
+            GLuint i;
+            if (!intFormat) {
+               rs = 1.0F / 7.0F;
+               gs = 1.0F / 7.0F;
+               bs = 1.0F / 3.0F;
+            }
+            for (i = 0; i < n; i ++) {
+               GLubyte p = ubsrc[i];
+               rgba[i][rDst] = ((p     ) & 0x7) * rs;
+               rgba[i][gDst] = ((p >> 3) & 0x7) * gs;
+               rgba[i][bDst] = ((p >> 6)      ) * bs;
+               rgba[i][aDst] = 1.0F;
+            }
+         }
+         break;
+      case GL_UNSIGNED_SHORT_5_6_5:
+         if (!intFormat) {
+            rs = 1.0F / 31.0F;
+            gs = 1.0F / 63.0F;
+            bs = 1.0F / 31.0F;
+         }
+         if (swapBytes) {
+            const GLushort *ussrc = (const GLushort *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLushort p = ussrc[i];
+               SWAP2BYTE(p);
+               rgba[i][rDst] = ((p >> 11)       ) * rs;
+               rgba[i][gDst] = ((p >>  5) & 0x3f) * gs;
+               rgba[i][bDst] = ((p      ) & 0x1f) * bs;
+               rgba[i][aDst] = 1.0F;
+            }
+         }
+         else {
+            const GLushort *ussrc = (const GLushort *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLushort p = ussrc[i];
+               rgba[i][rDst] = ((p >> 11)       ) * rs;
+               rgba[i][gDst] = ((p >>  5) & 0x3f) * gs;
+               rgba[i][bDst] = ((p      ) & 0x1f) * bs;
+               rgba[i][aDst] = 1.0F;
+            }
+         }
+         break;
+      case GL_UNSIGNED_SHORT_5_6_5_REV:
+         if (!intFormat) {
+            rs = 1.0F / 31.0F;
+            gs = 1.0F / 63.0F;
+            bs = 1.0F / 31.0F;
+         }
+         if (swapBytes) {
+            const GLushort *ussrc = (const GLushort *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLushort p = ussrc[i];
+               SWAP2BYTE(p);
+               rgba[i][rDst] = ((p      ) & 0x1f) * rs;
+               rgba[i][gDst] = ((p >>  5) & 0x3f) * gs;
+               rgba[i][bDst] = ((p >> 11)       ) * bs;
+               rgba[i][aDst] = 1.0F;
+            }
+         }
+         else {
+            const GLushort *ussrc = (const GLushort *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLushort p = ussrc[i];
+               rgba[i][rDst] = ((p      ) & 0x1f) * rs;
+               rgba[i][gDst] = ((p >>  5) & 0x3f) * gs;
+               rgba[i][bDst] = ((p >> 11)       ) * bs;
+               rgba[i][aDst] = 1.0F;
+            }
+         }
+         break;
+      case GL_UNSIGNED_SHORT_4_4_4_4:
+         if (!intFormat) {
+            rs = gs = bs = as = 1.0F / 15.0F;
+         }
+         if (swapBytes) {
+            const GLushort *ussrc = (const GLushort *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLushort p = ussrc[i];
+               SWAP2BYTE(p);
+               rgba[i][rDst] = ((p >> 12)      ) * rs;
+               rgba[i][gDst] = ((p >>  8) & 0xf) * gs;
+               rgba[i][bDst] = ((p >>  4) & 0xf) * bs;
+               rgba[i][aDst] = ((p      ) & 0xf) * as;
+            }
+         }
+         else {
+            const GLushort *ussrc = (const GLushort *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLushort p = ussrc[i];
+               rgba[i][rDst] = ((p >> 12)      ) * rs;
+               rgba[i][gDst] = ((p >>  8) & 0xf) * gs;
+               rgba[i][bDst] = ((p >>  4) & 0xf) * bs;
+               rgba[i][aDst] = ((p      ) & 0xf) * as;
+            }
+         }
+         break;
+      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
+         if (!intFormat) {
+            rs = gs = bs = as = 1.0F / 15.0F;
+         }
+         if (swapBytes) {
+            const GLushort *ussrc = (const GLushort *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLushort p = ussrc[i];
+               SWAP2BYTE(p);
+               rgba[i][rDst] = ((p      ) & 0xf) * rs;
+               rgba[i][gDst] = ((p >>  4) & 0xf) * gs;
+               rgba[i][bDst] = ((p >>  8) & 0xf) * bs;
+               rgba[i][aDst] = ((p >> 12)      ) * as;
+            }
+         }
+         else {
+            const GLushort *ussrc = (const GLushort *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLushort p = ussrc[i];
+               rgba[i][rDst] = ((p      ) & 0xf) * rs;
+               rgba[i][gDst] = ((p >>  4) & 0xf) * gs;
+               rgba[i][bDst] = ((p >>  8) & 0xf) * bs;
+               rgba[i][aDst] = ((p >> 12)      ) * as;
+            }
+         }
+         break;
+      case GL_UNSIGNED_SHORT_5_5_5_1:
+         if (!intFormat) {
+            rs = gs = bs = 1.0F / 31.0F;
+         }
+         if (swapBytes) {
+            const GLushort *ussrc = (const GLushort *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLushort p = ussrc[i];
+               SWAP2BYTE(p);
+               rgba[i][rDst] = ((p >> 11)       ) * rs;
+               rgba[i][gDst] = ((p >>  6) & 0x1f) * gs;
+               rgba[i][bDst] = ((p >>  1) & 0x1f) * bs;
+               rgba[i][aDst] = ((p      ) & 0x1)  * as;
+            }
+         }
+         else {
+            const GLushort *ussrc = (const GLushort *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLushort p = ussrc[i];
+               rgba[i][rDst] = ((p >> 11)       ) * rs;
+               rgba[i][gDst] = ((p >>  6) & 0x1f) * gs;
+               rgba[i][bDst] = ((p >>  1) & 0x1f) * bs;
+               rgba[i][aDst] = ((p      ) & 0x1)  * as;
+            }
+         }
+         break;
+      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
+         if (!intFormat) {
+            rs = gs = bs = 1.0F / 31.0F;
+         }
+         if (swapBytes) {
+            const GLushort *ussrc = (const GLushort *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLushort p = ussrc[i];
+               SWAP2BYTE(p);
+               rgba[i][rDst] = ((p      ) & 0x1f) * rs;
+               rgba[i][gDst] = ((p >>  5) & 0x1f) * gs;
+               rgba[i][bDst] = ((p >> 10) & 0x1f) * bs;
+               rgba[i][aDst] = ((p >> 15)       ) * as;
+            }
+         }
+         else {
+            const GLushort *ussrc = (const GLushort *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLushort p = ussrc[i];
+               rgba[i][rDst] = ((p      ) & 0x1f) * rs;
+               rgba[i][gDst] = ((p >>  5) & 0x1f) * gs;
+               rgba[i][bDst] = ((p >> 10) & 0x1f) * bs;
+               rgba[i][aDst] = ((p >> 15)       ) * as;
+            }
+         }
+         break;
+      case GL_UNSIGNED_INT_8_8_8_8:
+         if (swapBytes) {
+            const GLuint *uisrc = (const GLuint *) src;
+            GLuint i;
+            if (intFormat) {
+               for (i = 0; i < n; i ++) {
+                  GLuint p = uisrc[i];
+                  rgba[i][rDst] = (GLfloat) ((p      ) & 0xff);
+                  rgba[i][gDst] = (GLfloat) ((p >>  8) & 0xff);
+                  rgba[i][bDst] = (GLfloat) ((p >> 16) & 0xff);
+                  rgba[i][aDst] = (GLfloat) ((p >> 24)       );
+               }
+            }
+            else {
+               for (i = 0; i < n; i ++) {
+                  GLuint p = uisrc[i];
+                  rgba[i][rDst] = UBYTE_TO_FLOAT((p      ) & 0xff);
+                  rgba[i][gDst] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
+                  rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
+                  rgba[i][aDst] = UBYTE_TO_FLOAT((p >> 24)       );
+               }
+            }
+         }
+         else {
+            const GLuint *uisrc = (const GLuint *) src;
+            GLuint i;
+            if (intFormat) {
+               for (i = 0; i < n; i ++) {
+                  GLuint p = uisrc[i];
+                  rgba[i][rDst] = (GLfloat) ((p >> 24)       );
+                  rgba[i][gDst] = (GLfloat) ((p >> 16) & 0xff);
+                  rgba[i][bDst] = (GLfloat) ((p >>  8) & 0xff);
+                  rgba[i][aDst] = (GLfloat) ((p      ) & 0xff);
+               }
+            }
+            else {
+               for (i = 0; i < n; i ++) {
+                  GLuint p = uisrc[i];
+                  rgba[i][rDst] = UBYTE_TO_FLOAT((p >> 24)       );
+                  rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
+                  rgba[i][bDst] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
+                  rgba[i][aDst] = UBYTE_TO_FLOAT((p      ) & 0xff);
+               }
+            }
+         }
+         break;
+      case GL_UNSIGNED_INT_8_8_8_8_REV:
+         if (swapBytes) {
+            const GLuint *uisrc = (const GLuint *) src;
+            GLuint i;
+            if (intFormat) {
+               for (i = 0; i < n; i ++) {
+                  GLuint p = uisrc[i];
+                  rgba[i][rDst] = (GLfloat) ((p >> 24)       );
+                  rgba[i][gDst] = (GLfloat) ((p >> 16) & 0xff);
+                  rgba[i][bDst] = (GLfloat) ((p >>  8) & 0xff);
+                  rgba[i][aDst] = (GLfloat) ((p      ) & 0xff);
+               }
+            }
+            else {
+               for (i = 0; i < n; i ++) {
+                  GLuint p = uisrc[i];
+                  rgba[i][rDst] = UBYTE_TO_FLOAT((p >> 24)       );
+                  rgba[i][gDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
+                  rgba[i][bDst] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
+                  rgba[i][aDst] = UBYTE_TO_FLOAT((p      ) & 0xff);
+               }
+            }
+         }
+         else {
+            const GLuint *uisrc = (const GLuint *) src;
+            GLuint i;
+            if (intFormat) {
+               for (i = 0; i < n; i ++) {
+                  GLuint p = uisrc[i];
+                  rgba[i][rDst] = (GLfloat) ((p      ) & 0xff);
+                  rgba[i][gDst] = (GLfloat) ((p >>  8) & 0xff);
+                  rgba[i][bDst] = (GLfloat) ((p >> 16) & 0xff);
+                  rgba[i][aDst] = (GLfloat) ((p >> 24)       );
+               }
+            }
+            else {
+               for (i = 0; i < n; i ++) {
+                  GLuint p = uisrc[i];
+                  rgba[i][rDst] = UBYTE_TO_FLOAT((p      ) & 0xff);
+                  rgba[i][gDst] = UBYTE_TO_FLOAT((p >>  8) & 0xff);
+                  rgba[i][bDst] = UBYTE_TO_FLOAT((p >> 16) & 0xff);
+                  rgba[i][aDst] = UBYTE_TO_FLOAT((p >> 24)       );
+               }
+            }
+         }
+         break;
+      case GL_UNSIGNED_INT_10_10_10_2:
+         if (!intFormat) {
+            rs = 1.0F / 1023.0F;
+            gs = 1.0F / 1023.0F;
+            bs = 1.0F / 1023.0F;
+            as = 1.0F / 3.0F;
+         }
+         if (swapBytes) {
+            const GLuint *uisrc = (const GLuint *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLuint p = uisrc[i];
+               SWAP4BYTE(p);
+               rgba[i][rDst] = ((p >> 22)        ) * rs;
+               rgba[i][gDst] = ((p >> 12) & 0x3ff) * gs;
+               rgba[i][bDst] = ((p >>  2) & 0x3ff) * bs;
+               rgba[i][aDst] = ((p      ) & 0x3  ) * as;
+            }
+         }
+         else {
+            const GLuint *uisrc = (const GLuint *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLuint p = uisrc[i];
+               rgba[i][rDst] = ((p >> 22)        ) * rs;
+               rgba[i][gDst] = ((p >> 12) & 0x3ff) * gs;
+               rgba[i][bDst] = ((p >>  2) & 0x3ff) * bs;
+               rgba[i][aDst] = ((p      ) & 0x3  ) * as;
+            }
+         }
+         break;
+      case GL_UNSIGNED_INT_2_10_10_10_REV:
+         if (!intFormat) {
+            rs = 1.0F / 1023.0F;
+            gs = 1.0F / 1023.0F;
+            bs = 1.0F / 1023.0F;
+            as = 1.0F / 3.0F;
+         }
+         if (swapBytes) {
+            const GLuint *uisrc = (const GLuint *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLuint p = uisrc[i];
+               SWAP4BYTE(p);
+               rgba[i][rDst] = ((p      ) & 0x3ff) * rs;
+               rgba[i][gDst] = ((p >> 10) & 0x3ff) * gs;
+               rgba[i][bDst] = ((p >> 20) & 0x3ff) * bs;
+               rgba[i][aDst] = ((p >> 30)        ) * as;
+            }
+         }
+         else {
+            const GLuint *uisrc = (const GLuint *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLuint p = uisrc[i];
+               rgba[i][rDst] = ((p      ) & 0x3ff) * rs;
+               rgba[i][gDst] = ((p >> 10) & 0x3ff) * gs;
+               rgba[i][bDst] = ((p >> 20) & 0x3ff) * bs;
+               rgba[i][aDst] = ((p >> 30)        ) * as;
+            }
+         }
+         break;
+      default:
+         _mesa_problem(NULL, "bad srcType in extract float data");
+         break;
+   }
+#undef PROCESS
+}
+
+
+static INLINE GLuint
+clamp_byte_to_uint(GLbyte b)
+{
+   return b < 0 ? 0 : b;
+}
+
+
+static INLINE GLuint
+clamp_short_to_uint(GLshort s)
+{
+   return s < 0 ? 0 : s;
+}
+
+
+static INLINE GLuint
+clamp_int_to_uint(GLint i)
+{
+   return i < 0 ? 0 : i;
+}
+
+
+static INLINE GLuint
+clamp_float_to_uint(GLfloat f)
+{
+   return f < 0.0F ? 0 : IROUND(f);
+}
+
+
+static INLINE GLuint
+clamp_half_to_uint(GLhalfARB h)
+{
+   GLfloat f = _mesa_half_to_float(h);
+   return f < 0.0F ? 0 : IROUND(f);
+}
+
+
+/**
+ * \sa extract_float_rgba()
+ */
+static void
+extract_uint_rgba(GLuint n, GLuint rgba[][4],
+                  GLenum srcFormat, GLenum srcType, const GLvoid *src,
+                  GLboolean swapBytes)
+{
+   GLint rSrc, gSrc, bSrc, aSrc;
+   GLint stride;
+   GLint rDst, bDst, gDst, aDst;
+   GLboolean intFormat;
+
+   ASSERT(srcFormat == GL_RED ||
+          srcFormat == GL_GREEN ||
+          srcFormat == GL_BLUE ||
+          srcFormat == GL_ALPHA ||
+          srcFormat == GL_LUMINANCE ||
+          srcFormat == GL_LUMINANCE_ALPHA ||
+          srcFormat == GL_INTENSITY ||
+          srcFormat == GL_RG ||
+          srcFormat == GL_RGB ||
+          srcFormat == GL_BGR ||
+          srcFormat == GL_RGBA ||
+          srcFormat == GL_BGRA ||
+          srcFormat == GL_ABGR_EXT ||
+          srcFormat == GL_DU8DV8_ATI ||
+          srcFormat == GL_DUDV_ATI ||
+          srcFormat == GL_RED_INTEGER_EXT ||
+          srcFormat == GL_GREEN_INTEGER_EXT ||
+          srcFormat == GL_BLUE_INTEGER_EXT ||
+          srcFormat == GL_ALPHA_INTEGER_EXT ||
+          srcFormat == GL_RGB_INTEGER_EXT ||
+          srcFormat == GL_RGBA_INTEGER_EXT ||
+          srcFormat == GL_BGR_INTEGER_EXT ||
+          srcFormat == GL_BGRA_INTEGER_EXT ||
+          srcFormat == GL_LUMINANCE_INTEGER_EXT ||
+          srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT);
+
+   ASSERT(srcType == GL_UNSIGNED_BYTE ||
+          srcType == GL_BYTE ||
+          srcType == GL_UNSIGNED_SHORT ||
+          srcType == GL_SHORT ||
+          srcType == GL_UNSIGNED_INT ||
+          srcType == GL_INT ||
+          srcType == GL_HALF_FLOAT_ARB ||
+          srcType == GL_FLOAT ||
+          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
+          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
+          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
+          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
+          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
+          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
+          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
+          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
+          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
+          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
+          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
+          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
+
+   get_component_mapping(srcFormat,
+                         &rSrc, &gSrc, &bSrc, &aSrc,
+                         &rDst, &gDst, &bDst, &aDst);
+
+   stride = _mesa_components_in_format(srcFormat);
+
+   intFormat = _mesa_is_integer_format(srcFormat);
+
+#define PROCESS(SRC_INDEX, DST_INDEX, DEFAULT, TYPE, CONVERSION)	\
+   if ((SRC_INDEX) < 0) {						\
+      GLuint i;								\
+      for (i = 0; i < n; i++) {						\
+         rgba[i][DST_INDEX] = DEFAULT;					\
+      }									\
+   }									\
+   else if (swapBytes) {						\
+      const TYPE *s = (const TYPE *) src;				\
+      GLuint i;								\
+      for (i = 0; i < n; i++) {						\
+         TYPE value = s[SRC_INDEX];					\
+         if (sizeof(TYPE) == 2) {					\
+            SWAP2BYTE(value);						\
+         }								\
+         else if (sizeof(TYPE) == 4) {					\
+            SWAP4BYTE(value);						\
+         }								\
+         rgba[i][DST_INDEX] = CONVERSION(value);                        \
+         s += stride;							\
+      }									\
+   }									\
+   else {								\
+      const TYPE *s = (const TYPE *) src;				\
+      GLuint i;								\
+      for (i = 0; i < n; i++) {						\
+         rgba[i][DST_INDEX] = CONVERSION(s[SRC_INDEX]);			\
+         s += stride;							\
+      }									\
+   }
+
+   switch (srcType) {
+      case GL_UNSIGNED_BYTE:
+         PROCESS(rSrc, RCOMP, 0, GLubyte, (GLuint));
+         PROCESS(gSrc, GCOMP, 0, GLubyte, (GLuint));
+         PROCESS(bSrc, BCOMP, 0, GLubyte, (GLuint));
+         PROCESS(aSrc, ACOMP, 1, GLubyte, (GLuint));
+         break;
+      case GL_BYTE:
+         PROCESS(rSrc, RCOMP, 0, GLbyte, clamp_byte_to_uint);
+         PROCESS(gSrc, GCOMP, 0, GLbyte, clamp_byte_to_uint);
+         PROCESS(bSrc, BCOMP, 0, GLbyte, clamp_byte_to_uint);
+         PROCESS(aSrc, ACOMP, 1, GLbyte, clamp_byte_to_uint);
+         break;
+      case GL_UNSIGNED_SHORT:
+         PROCESS(rSrc, RCOMP, 0, GLushort, (GLuint));
+         PROCESS(gSrc, GCOMP, 0, GLushort, (GLuint));
+         PROCESS(bSrc, BCOMP, 0, GLushort, (GLuint));
+         PROCESS(aSrc, ACOMP, 1, GLushort, (GLuint));
+         break;
+      case GL_SHORT:
+         PROCESS(rSrc, RCOMP, 0, GLshort, clamp_short_to_uint);
+         PROCESS(gSrc, GCOMP, 0, GLshort, clamp_short_to_uint);
+         PROCESS(bSrc, BCOMP, 0, GLshort, clamp_short_to_uint);
+         PROCESS(aSrc, ACOMP, 1, GLshort, clamp_short_to_uint);
+         break;
+      case GL_UNSIGNED_INT:
+         PROCESS(rSrc, RCOMP, 0, GLuint, (GLuint));
+         PROCESS(gSrc, GCOMP, 0, GLuint, (GLuint));
+         PROCESS(bSrc, BCOMP, 0, GLuint, (GLuint));
+         PROCESS(aSrc, ACOMP, 1, GLuint, (GLuint));
+         break;
+      case GL_INT:
+         PROCESS(rSrc, RCOMP, 0, GLint, clamp_int_to_uint);
+         PROCESS(gSrc, GCOMP, 0, GLint, clamp_int_to_uint);
+         PROCESS(bSrc, BCOMP, 0, GLint, clamp_int_to_uint);
+         PROCESS(aSrc, ACOMP, 1, GLint, clamp_int_to_uint);
+         break;
+      case GL_FLOAT:
+         PROCESS(rSrc, RCOMP, 0, GLfloat, clamp_float_to_uint);
+         PROCESS(gSrc, GCOMP, 0, GLfloat, clamp_float_to_uint);
+         PROCESS(bSrc, BCOMP, 0, GLfloat, clamp_float_to_uint);
+         PROCESS(aSrc, ACOMP, 1, GLfloat, clamp_float_to_uint);
+         break;
+      case GL_HALF_FLOAT_ARB:
+         PROCESS(rSrc, RCOMP, 0, GLhalfARB, clamp_half_to_uint);
+         PROCESS(gSrc, GCOMP, 0, GLhalfARB, clamp_half_to_uint);
+         PROCESS(bSrc, BCOMP, 0, GLhalfARB, clamp_half_to_uint);
+         PROCESS(aSrc, ACOMP, 1, GLhalfARB, clamp_half_to_uint);
+         break;
+      case GL_UNSIGNED_BYTE_3_3_2:
+         {
+            const GLubyte *ubsrc = (const GLubyte *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLubyte p = ubsrc[i];
+               rgba[i][rDst] = ((p >> 5)      );
+               rgba[i][gDst] = ((p >> 2) & 0x7);
+               rgba[i][bDst] = ((p     ) & 0x3);
+               rgba[i][aDst] = 1;
+            }
+         }
+         break;
+      case GL_UNSIGNED_BYTE_2_3_3_REV:
+         {
+            const GLubyte *ubsrc = (const GLubyte *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLubyte p = ubsrc[i];
+               rgba[i][rDst] = ((p     ) & 0x7);
+               rgba[i][gDst] = ((p >> 3) & 0x7);
+               rgba[i][bDst] = ((p >> 6)      );
+               rgba[i][aDst] = 1;
+            }
+         }
+         break;
+      case GL_UNSIGNED_SHORT_5_6_5:
+         if (swapBytes) {
+            const GLushort *ussrc = (const GLushort *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLushort p = ussrc[i];
+               SWAP2BYTE(p);
+               rgba[i][rDst] = ((p >> 11)       );
+               rgba[i][gDst] = ((p >>  5) & 0x3f);
+               rgba[i][bDst] = ((p      ) & 0x1f);
+               rgba[i][aDst] = 1;
+            }
+         }
+         else {
+            const GLushort *ussrc = (const GLushort *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLushort p = ussrc[i];
+               rgba[i][rDst] = ((p >> 11)       );
+               rgba[i][gDst] = ((p >>  5) & 0x3f);
+               rgba[i][bDst] = ((p      ) & 0x1f);
+               rgba[i][aDst] = 1;
+            }
+         }
+         break;
+      case GL_UNSIGNED_SHORT_5_6_5_REV:
+         if (swapBytes) {
+            const GLushort *ussrc = (const GLushort *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLushort p = ussrc[i];
+               SWAP2BYTE(p);
+               rgba[i][rDst] = ((p      ) & 0x1f);
+               rgba[i][gDst] = ((p >>  5) & 0x3f);
+               rgba[i][bDst] = ((p >> 11)       );
+               rgba[i][aDst] = 1;
+            }
+         }
+         else {
+            const GLushort *ussrc = (const GLushort *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLushort p = ussrc[i];
+               rgba[i][rDst] = ((p      ) & 0x1f);
+               rgba[i][gDst] = ((p >>  5) & 0x3f);
+               rgba[i][bDst] = ((p >> 11)       );
+               rgba[i][aDst] = 1;
+            }
+         }
+         break;
+      case GL_UNSIGNED_SHORT_4_4_4_4:
+         if (swapBytes) {
+            const GLushort *ussrc = (const GLushort *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLushort p = ussrc[i];
+               SWAP2BYTE(p);
+               rgba[i][rDst] = ((p >> 12)      );
+               rgba[i][gDst] = ((p >>  8) & 0xf);
+               rgba[i][bDst] = ((p >>  4) & 0xf);
+               rgba[i][aDst] = ((p      ) & 0xf);
+            }
+         }
+         else {
+            const GLushort *ussrc = (const GLushort *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLushort p = ussrc[i];
+               rgba[i][rDst] = ((p >> 12)      );
+               rgba[i][gDst] = ((p >>  8) & 0xf);
+               rgba[i][bDst] = ((p >>  4) & 0xf);
+               rgba[i][aDst] = ((p      ) & 0xf);
+            }
+         }
+         break;
+      case GL_UNSIGNED_SHORT_4_4_4_4_REV:
+         if (swapBytes) {
+            const GLushort *ussrc = (const GLushort *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLushort p = ussrc[i];
+               SWAP2BYTE(p);
+               rgba[i][rDst] = ((p      ) & 0xf);
+               rgba[i][gDst] = ((p >>  4) & 0xf);
+               rgba[i][bDst] = ((p >>  8) & 0xf);
+               rgba[i][aDst] = ((p >> 12)      );
+            }
+         }
+         else {
+            const GLushort *ussrc = (const GLushort *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLushort p = ussrc[i];
+               rgba[i][rDst] = ((p      ) & 0xf);
+               rgba[i][gDst] = ((p >>  4) & 0xf);
+               rgba[i][bDst] = ((p >>  8) & 0xf);
+               rgba[i][aDst] = ((p >> 12)      );
+            }
+         }
+         break;
+      case GL_UNSIGNED_SHORT_5_5_5_1:
+         if (swapBytes) {
+            const GLushort *ussrc = (const GLushort *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLushort p = ussrc[i];
+               SWAP2BYTE(p);
+               rgba[i][rDst] = ((p >> 11)       );
+               rgba[i][gDst] = ((p >>  6) & 0x1f);
+               rgba[i][bDst] = ((p >>  1) & 0x1f);
+               rgba[i][aDst] = ((p      ) & 0x1 );
+            }
+         }
+         else {
+            const GLushort *ussrc = (const GLushort *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLushort p = ussrc[i];
+               rgba[i][rDst] = ((p >> 11)       );
+               rgba[i][gDst] = ((p >>  6) & 0x1f);
+               rgba[i][bDst] = ((p >>  1) & 0x1f);
+               rgba[i][aDst] = ((p      ) & 0x1 );
+            }
+         }
+         break;
+      case GL_UNSIGNED_SHORT_1_5_5_5_REV:
+         if (swapBytes) {
+            const GLushort *ussrc = (const GLushort *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLushort p = ussrc[i];
+               SWAP2BYTE(p);
+               rgba[i][rDst] = ((p      ) & 0x1f);
+               rgba[i][gDst] = ((p >>  5) & 0x1f);
+               rgba[i][bDst] = ((p >> 10) & 0x1f);
+               rgba[i][aDst] = ((p >> 15)       );
+            }
+         }
+         else {
+            const GLushort *ussrc = (const GLushort *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLushort p = ussrc[i];
+               rgba[i][rDst] = ((p      ) & 0x1f);
+               rgba[i][gDst] = ((p >>  5) & 0x1f);
+               rgba[i][bDst] = ((p >> 10) & 0x1f);
+               rgba[i][aDst] = ((p >> 15)       );
+            }
+         }
+         break;
+      case GL_UNSIGNED_INT_8_8_8_8:
+         if (swapBytes) {
+            const GLuint *uisrc = (const GLuint *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLuint p = uisrc[i];
+               rgba[i][rDst] = ((p      ) & 0xff);
+               rgba[i][gDst] = ((p >>  8) & 0xff);
+               rgba[i][bDst] = ((p >> 16) & 0xff);
+               rgba[i][aDst] = ((p >> 24)       );
+            }
+         }
+         else {
+            const GLuint *uisrc = (const GLuint *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLuint p = uisrc[i];
+               rgba[i][rDst] = ((p >> 24)       );
+               rgba[i][gDst] = ((p >> 16) & 0xff);
+               rgba[i][bDst] = ((p >>  8) & 0xff);
+               rgba[i][aDst] = ((p      ) & 0xff);
+            }
+         }
+         break;
+      case GL_UNSIGNED_INT_8_8_8_8_REV:
+         if (swapBytes) {
+            const GLuint *uisrc = (const GLuint *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLuint p = uisrc[i];
+               rgba[i][rDst] = ((p >> 24)       );
+               rgba[i][gDst] = ((p >> 16) & 0xff);
+               rgba[i][bDst] = ((p >>  8) & 0xff);
+               rgba[i][aDst] = ((p      ) & 0xff);
+            }
+         }
+         else {
+            const GLuint *uisrc = (const GLuint *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLuint p = uisrc[i];
+               rgba[i][rDst] = ((p      ) & 0xff);
+               rgba[i][gDst] = ((p >>  8) & 0xff);
+               rgba[i][bDst] = ((p >> 16) & 0xff);
+               rgba[i][aDst] = ((p >> 24)       );
+            }
+         }
+         break;
+      case GL_UNSIGNED_INT_10_10_10_2:
+         if (swapBytes) {
+            const GLuint *uisrc = (const GLuint *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLuint p = uisrc[i];
+               SWAP4BYTE(p);
+               rgba[i][rDst] = ((p >> 22)        );
+               rgba[i][gDst] = ((p >> 12) & 0x3ff);
+               rgba[i][bDst] = ((p >>  2) & 0x3ff);
+               rgba[i][aDst] = ((p      ) & 0x3  );
+            }
+         }
+         else {
+            const GLuint *uisrc = (const GLuint *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLuint p = uisrc[i];
+               rgba[i][rDst] = ((p >> 22)        );
+               rgba[i][gDst] = ((p >> 12) & 0x3ff);
+               rgba[i][bDst] = ((p >>  2) & 0x3ff);
+               rgba[i][aDst] = ((p      ) & 0x3  );
+            }
+         }
+         break;
+      case GL_UNSIGNED_INT_2_10_10_10_REV:
+         if (swapBytes) {
+            const GLuint *uisrc = (const GLuint *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLuint p = uisrc[i];
+               SWAP4BYTE(p);
+               rgba[i][rDst] = ((p      ) & 0x3ff);
+               rgba[i][gDst] = ((p >> 10) & 0x3ff);
+               rgba[i][bDst] = ((p >> 20) & 0x3ff);
+               rgba[i][aDst] = ((p >> 30)        );
+            }
+         }
+         else {
+            const GLuint *uisrc = (const GLuint *) src;
+            GLuint i;
+            for (i = 0; i < n; i ++) {
+               GLuint p = uisrc[i];
+               rgba[i][rDst] = ((p      ) & 0x3ff);
+               rgba[i][gDst] = ((p >> 10) & 0x3ff);
+               rgba[i][bDst] = ((p >> 20) & 0x3ff);
+               rgba[i][aDst] = ((p >> 30)        );
+            }
+         }
+         break;
+      default:
+         _mesa_problem(NULL, "bad srcType in extract uint data");
+         break;
+   }
+#undef PROCESS
+}
+
+
+
+/*
+ * Unpack a row of color image data from a client buffer according to
+ * the pixel unpacking parameters.
+ * Return GLchan values in the specified dest image format.
+ * This is used by glDrawPixels and glTexImage?D().
+ * \param ctx - the context
+ *         n - number of pixels in the span
+ *         dstFormat - format of destination color array
+ *         dest - the destination color array
+ *         srcFormat - source image format
+ *         srcType - source image  data type
+ *         source - source image pointer
+ *         srcPacking - pixel unpacking parameters
+ *         transferOps - bitmask of IMAGE_*_BIT values of operations to apply
+ *
+ * XXX perhaps expand this to process whole images someday.
+ */
+void
+_mesa_unpack_color_span_chan( struct gl_context *ctx,
+                              GLuint n, GLenum dstFormat, GLchan dest[],
+                              GLenum srcFormat, GLenum srcType,
+                              const GLvoid *source,
+                              const struct gl_pixelstore_attrib *srcPacking,
+                              GLbitfield transferOps )
+{
+   ASSERT(dstFormat == GL_ALPHA ||
+          dstFormat == GL_LUMINANCE ||
+          dstFormat == GL_LUMINANCE_ALPHA ||
+          dstFormat == GL_INTENSITY ||
+          dstFormat == GL_RED ||
+          dstFormat == GL_RG ||
+          dstFormat == GL_RGB ||
+          dstFormat == GL_RGBA ||
+          dstFormat == GL_COLOR_INDEX);
+
+   ASSERT(srcFormat == GL_RED ||
+          srcFormat == GL_GREEN ||
+          srcFormat == GL_BLUE ||
+          srcFormat == GL_ALPHA ||
+          srcFormat == GL_LUMINANCE ||
+          srcFormat == GL_LUMINANCE_ALPHA ||
+          srcFormat == GL_INTENSITY ||
+          srcFormat == GL_RG ||
+          srcFormat == GL_RGB ||
+          srcFormat == GL_BGR ||
+          srcFormat == GL_RGBA ||
+          srcFormat == GL_BGRA ||
+          srcFormat == GL_ABGR_EXT ||
+          srcFormat == GL_COLOR_INDEX);
+
+   ASSERT(srcType == GL_BITMAP ||
+          srcType == GL_UNSIGNED_BYTE ||
+          srcType == GL_BYTE ||
+          srcType == GL_UNSIGNED_SHORT ||
+          srcType == GL_SHORT ||
+          srcType == GL_UNSIGNED_INT ||
+          srcType == GL_INT ||
+          srcType == GL_HALF_FLOAT_ARB ||
+          srcType == GL_FLOAT ||
+          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
+          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
+          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
+          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
+          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
+          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
+          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
+          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
+          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
+          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
+          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
+          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
+
+   /* Try simple cases first */
+   if (transferOps == 0) {
+      if (srcType == CHAN_TYPE) {
+         if (dstFormat == GL_RGBA) {
+            if (srcFormat == GL_RGBA) {
+               memcpy( dest, source, n * 4 * sizeof(GLchan) );
+               return;
+            }
+            else if (srcFormat == GL_RGB) {
+               GLuint i;
+               const GLchan *src = (const GLchan *) source;
+               GLchan *dst = dest;
+               for (i = 0; i < n; i++) {
+                  dst[0] = src[0];
+                  dst[1] = src[1];
+                  dst[2] = src[2];
+                  dst[3] = CHAN_MAX;
+                  src += 3;
+                  dst += 4;
+               }
+               return;
+            }
+         }
+         else if (dstFormat == GL_RGB) {
+            if (srcFormat == GL_RGB) {
+               memcpy( dest, source, n * 3 * sizeof(GLchan) );
+               return;
+            }
+            else if (srcFormat == GL_RGBA) {
+               GLuint i;
+               const GLchan *src = (const GLchan *) source;
+               GLchan *dst = dest;
+               for (i = 0; i < n; i++) {
+                  dst[0] = src[0];
+                  dst[1] = src[1];
+                  dst[2] = src[2];
+                  src += 4;
+                  dst += 3;
+               }
+               return;
+            }
+         }
+         else if (dstFormat == srcFormat) {
+            GLint comps = _mesa_components_in_format(srcFormat);
+            assert(comps > 0);
+            memcpy( dest, source, n * comps * sizeof(GLchan) );
+            return;
+         }
+      }
+      /*
+       * Common situation, loading 8bit RGBA/RGB source images
+       * into 16/32 bit destination. (OSMesa16/32)
+       */
+      else if (srcType == GL_UNSIGNED_BYTE) {
+         if (dstFormat == GL_RGBA) {
+            if (srcFormat == GL_RGB) {
+               GLuint i;
+               const GLubyte *src = (const GLubyte *) source;
+               GLchan *dst = dest;
+               for (i = 0; i < n; i++) {
+                  dst[0] = UBYTE_TO_CHAN(src[0]);
+                  dst[1] = UBYTE_TO_CHAN(src[1]);
+                  dst[2] = UBYTE_TO_CHAN(src[2]);
+                  dst[3] = CHAN_MAX;
+                  src += 3;
+                  dst += 4;
+               }
+               return;
+            }
+            else if (srcFormat == GL_RGBA) {
+               GLuint i;
+               const GLubyte *src = (const GLubyte *) source;
+               GLchan *dst = dest;
+               for (i = 0; i < n; i++) {
+                  dst[0] = UBYTE_TO_CHAN(src[0]);
+                  dst[1] = UBYTE_TO_CHAN(src[1]);
+                  dst[2] = UBYTE_TO_CHAN(src[2]);
+                  dst[3] = UBYTE_TO_CHAN(src[3]);
+                  src += 4;
+                  dst += 4;
+               }
+               return;
+             }
+         }
+         else if (dstFormat == GL_RGB) {
+            if (srcFormat == GL_RGB) {
+               GLuint i;
+               const GLubyte *src = (const GLubyte *) source;
+               GLchan *dst = dest;
+               for (i = 0; i < n; i++) {
+                  dst[0] = UBYTE_TO_CHAN(src[0]);
+                  dst[1] = UBYTE_TO_CHAN(src[1]);
+                  dst[2] = UBYTE_TO_CHAN(src[2]);
+                  src += 3;
+                  dst += 3;
+               }
+               return;
+            }
+            else if (srcFormat == GL_RGBA) {
+               GLuint i;
+               const GLubyte *src = (const GLubyte *) source;
+               GLchan *dst = dest;
+               for (i = 0; i < n; i++) {
+                  dst[0] = UBYTE_TO_CHAN(src[0]);
+                  dst[1] = UBYTE_TO_CHAN(src[1]);
+                  dst[2] = UBYTE_TO_CHAN(src[2]);
+                  src += 4;
+                  dst += 3;
+               }
+               return;
+            }
+         }
+      }
+   }
+
+
+   /* general solution begins here */
+   {
+      GLint dstComponents;
+      GLint rDst, gDst, bDst, aDst, lDst, iDst;
+      GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat));
+
+      if (!rgba) {
+         _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
+         return;
+      }
+
+      dstComponents = _mesa_components_in_format( dstFormat );
+      /* source & dest image formats should have been error checked by now */
+      assert(dstComponents > 0);
+
+      /*
+       * Extract image data and convert to RGBA floats
+       */
+      if (srcFormat == GL_COLOR_INDEX) {
+         GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
+
+         if (!indexes) {
+            _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
+            return;
+         }
+
+         extract_uint_indexes(n, indexes, srcFormat, srcType, source,
+                              srcPacking);
+
+         if (dstFormat == GL_COLOR_INDEX) {
+            GLuint i;
+            _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes);
+            /* convert to GLchan and return */
+            for (i = 0; i < n; i++) {
+               dest[i] = (GLchan) (indexes[i] & 0xff);
+            }
+            free(indexes);
+            free(rgba);
+            return;
+         }
+         else {
+            /* Convert indexes to RGBA */
+            if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
+               _mesa_shift_and_offset_ci(ctx, n, indexes);
+            }
+            _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
+         }
+
+         /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
+          * with color indexes.
+          */
+         transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT);
+
+         free(indexes);
+      }
+      else {
+         /* non-color index data */
+         extract_float_rgba(n, rgba, srcFormat, srcType, source,
+                            srcPacking->SwapBytes);
+      }
+
+      /* Need to clamp if returning GLubytes or GLushorts */
+#if CHAN_TYPE != GL_FLOAT
+      transferOps |= IMAGE_CLAMP_BIT;
+#endif
+
+      if (transferOps) {
+         _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
+      }
+
+      get_component_indexes(dstFormat,
+                            &rDst, &gDst, &bDst, &aDst, &lDst, &iDst);
+
+      /* Now return the GLchan data in the requested dstFormat */
+      if (rDst >= 0) {
+         GLchan *dst = dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            CLAMPED_FLOAT_TO_CHAN(dst[rDst], rgba[i][RCOMP]);
+            dst += dstComponents;
+         }
+      }
+
+      if (gDst >= 0) {
+         GLchan *dst = dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            CLAMPED_FLOAT_TO_CHAN(dst[gDst], rgba[i][GCOMP]);
+            dst += dstComponents;
+         }
+      }
+
+      if (bDst >= 0) {
+         GLchan *dst = dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            CLAMPED_FLOAT_TO_CHAN(dst[bDst], rgba[i][BCOMP]);
+            dst += dstComponents;
+         }
+      }
+
+      if (aDst >= 0) {
+         GLchan *dst = dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            CLAMPED_FLOAT_TO_CHAN(dst[aDst], rgba[i][ACOMP]);
+            dst += dstComponents;
+         }
+      }
+
+      if (iDst >= 0) {
+         GLchan *dst = dest;
+         GLuint i;
+         assert(iDst == 0);
+         assert(dstComponents == 1);
+         for (i = 0; i < n; i++) {
+            /* Intensity comes from red channel */
+            CLAMPED_FLOAT_TO_CHAN(dst[i], rgba[i][RCOMP]);
+         }
+      }
+
+      if (lDst >= 0) {
+         GLchan *dst = dest;
+         GLuint i;
+         assert(lDst == 0);
+         for (i = 0; i < n; i++) {
+            /* Luminance comes from red channel */
+            CLAMPED_FLOAT_TO_CHAN(dst[0], rgba[i][RCOMP]);
+            dst += dstComponents;
+         }
+      }
+
+      free(rgba);
+   }
+}
+
+
+/**
+ * Same as _mesa_unpack_color_span_chan(), but return GLfloat data
+ * instead of GLchan.
+ */
+void
+_mesa_unpack_color_span_float( struct gl_context *ctx,
+                               GLuint n, GLenum dstFormat, GLfloat dest[],
+                               GLenum srcFormat, GLenum srcType,
+                               const GLvoid *source,
+                               const struct gl_pixelstore_attrib *srcPacking,
+                               GLbitfield transferOps )
+{
+   ASSERT(dstFormat == GL_ALPHA ||
+          dstFormat == GL_LUMINANCE ||
+          dstFormat == GL_LUMINANCE_ALPHA ||
+          dstFormat == GL_INTENSITY ||
+          dstFormat == GL_RED ||
+          dstFormat == GL_RG ||
+          dstFormat == GL_RGB ||
+          dstFormat == GL_RGBA ||
+          dstFormat == GL_COLOR_INDEX);
+
+   ASSERT(srcFormat == GL_RED ||
+          srcFormat == GL_GREEN ||
+          srcFormat == GL_BLUE ||
+          srcFormat == GL_ALPHA ||
+          srcFormat == GL_LUMINANCE ||
+          srcFormat == GL_LUMINANCE_ALPHA ||
+          srcFormat == GL_INTENSITY ||
+          srcFormat == GL_RG ||
+          srcFormat == GL_RGB ||
+          srcFormat == GL_BGR ||
+          srcFormat == GL_RGBA ||
+          srcFormat == GL_BGRA ||
+          srcFormat == GL_ABGR_EXT ||
+          srcFormat == GL_RED_INTEGER_EXT ||
+          srcFormat == GL_GREEN_INTEGER_EXT ||
+          srcFormat == GL_BLUE_INTEGER_EXT ||
+          srcFormat == GL_ALPHA_INTEGER_EXT ||
+          srcFormat == GL_RGB_INTEGER_EXT ||
+          srcFormat == GL_RGBA_INTEGER_EXT ||
+          srcFormat == GL_BGR_INTEGER_EXT ||
+          srcFormat == GL_BGRA_INTEGER_EXT ||
+          srcFormat == GL_LUMINANCE_INTEGER_EXT ||
+          srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT ||
+          srcFormat == GL_COLOR_INDEX);
+
+   ASSERT(srcType == GL_BITMAP ||
+          srcType == GL_UNSIGNED_BYTE ||
+          srcType == GL_BYTE ||
+          srcType == GL_UNSIGNED_SHORT ||
+          srcType == GL_SHORT ||
+          srcType == GL_UNSIGNED_INT ||
+          srcType == GL_INT ||
+          srcType == GL_HALF_FLOAT_ARB ||
+          srcType == GL_FLOAT ||
+          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
+          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
+          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
+          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
+          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
+          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
+          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
+          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
+          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
+          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
+          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
+          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
+
+   /* general solution, no special cases, yet */
+   {
+      GLint dstComponents;
+      GLint rDst, gDst, bDst, aDst, lDst, iDst;
+      GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat));
+
+      if (!rgba) {
+         _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
+         return;
+      }
+
+      dstComponents = _mesa_components_in_format( dstFormat );
+      /* source & dest image formats should have been error checked by now */
+      assert(dstComponents > 0);
+
+      /*
+       * Extract image data and convert to RGBA floats
+       */
+      if (srcFormat == GL_COLOR_INDEX) {
+         GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
+
+         if (!indexes) {
+            _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
+            free(rgba);
+            return;
+         }
+
+         extract_uint_indexes(n, indexes, srcFormat, srcType, source,
+                              srcPacking);
+
+         if (dstFormat == GL_COLOR_INDEX) {
+            GLuint i;
+            _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes);
+            /* convert to GLchan and return */
+            for (i = 0; i < n; i++) {
+               dest[i] = (GLchan) (indexes[i] & 0xff);
+            }
+            free(indexes);
+            free(rgba);
+            return;
+         }
+         else {
+            /* Convert indexes to RGBA */
+            if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
+               _mesa_shift_and_offset_ci(ctx, n, indexes);
+            }
+            _mesa_map_ci_to_rgba(ctx, n, indexes, rgba);
+         }
+
+         /* Don't do RGBA scale/bias or RGBA->RGBA mapping if starting
+          * with color indexes.
+          */
+         transferOps &= ~(IMAGE_SCALE_BIAS_BIT | IMAGE_MAP_COLOR_BIT);
+
+         free(indexes);
+      }
+      else {
+         /* non-color index data */
+         extract_float_rgba(n, rgba, srcFormat, srcType, source,
+                            srcPacking->SwapBytes);
+      }
+
+      if (transferOps) {
+         _mesa_apply_rgba_transfer_ops(ctx, transferOps, n, rgba);
+      }
+
+      get_component_indexes(dstFormat,
+                            &rDst, &gDst, &bDst, &aDst, &lDst, &iDst);
+
+      /* Now pack results in the requested dstFormat */
+      if (rDst >= 0) {
+         GLfloat *dst = dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            dst[rDst] = rgba[i][RCOMP];
+            dst += dstComponents;
+         }
+      }
+
+      if (gDst >= 0) {
+         GLfloat *dst = dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            dst[gDst] = rgba[i][GCOMP];
+            dst += dstComponents;
+         }
+      }
+
+      if (bDst >= 0) {
+         GLfloat *dst = dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            dst[bDst] = rgba[i][BCOMP];
+            dst += dstComponents;
+         }
+      }
+
+      if (aDst >= 0) {
+         GLfloat *dst = dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            dst[aDst] = rgba[i][ACOMP];
+            dst += dstComponents;
+         }
+      }
+
+      if (iDst >= 0) {
+         GLfloat *dst = dest;
+         GLuint i;
+         assert(iDst == 0);
+         assert(dstComponents == 1);
+         for (i = 0; i < n; i++) {
+            /* Intensity comes from red channel */
+            dst[i] = rgba[i][RCOMP];
+         }
+      }
+
+      if (lDst >= 0) {
+         GLfloat *dst = dest;
+         GLuint i;
+         assert(lDst == 0);
+         for (i = 0; i < n; i++) {
+            /* Luminance comes from red channel */
+            dst[0] = rgba[i][RCOMP];
+            dst += dstComponents;
+         }
+      }
+
+      free(rgba);
+   }
+}
+
+
+/**
+ * Same as _mesa_unpack_color_span_chan(), but return GLuint data
+ * instead of GLchan.
+ * No pixel transfer ops are applied.
+ */
+void
+_mesa_unpack_color_span_uint(struct gl_context *ctx,
+                             GLuint n, GLenum dstFormat, GLuint *dest,
+                             GLenum srcFormat, GLenum srcType,
+                             const GLvoid *source,
+                             const struct gl_pixelstore_attrib *srcPacking)
+{
+   GLuint (*rgba)[4] = (GLuint (*)[4]) malloc(n * 4 * sizeof(GLfloat));
+
+   if (!rgba) {
+      _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
+      return;
+   }
+
+   ASSERT(dstFormat == GL_ALPHA ||
+          dstFormat == GL_LUMINANCE ||
+          dstFormat == GL_LUMINANCE_ALPHA ||
+          dstFormat == GL_INTENSITY ||
+          dstFormat == GL_RED ||
+          dstFormat == GL_RG ||
+          dstFormat == GL_RGB ||
+          dstFormat == GL_RGBA);
+
+   ASSERT(srcFormat == GL_RED ||
+          srcFormat == GL_GREEN ||
+          srcFormat == GL_BLUE ||
+          srcFormat == GL_ALPHA ||
+          srcFormat == GL_LUMINANCE ||
+          srcFormat == GL_LUMINANCE_ALPHA ||
+          srcFormat == GL_INTENSITY ||
+          srcFormat == GL_RG ||
+          srcFormat == GL_RGB ||
+          srcFormat == GL_BGR ||
+          srcFormat == GL_RGBA ||
+          srcFormat == GL_BGRA ||
+          srcFormat == GL_ABGR_EXT ||
+          srcFormat == GL_RED_INTEGER_EXT ||
+          srcFormat == GL_GREEN_INTEGER_EXT ||
+          srcFormat == GL_BLUE_INTEGER_EXT ||
+          srcFormat == GL_ALPHA_INTEGER_EXT ||
+          srcFormat == GL_RGB_INTEGER_EXT ||
+          srcFormat == GL_RGBA_INTEGER_EXT ||
+          srcFormat == GL_BGR_INTEGER_EXT ||
+          srcFormat == GL_BGRA_INTEGER_EXT ||
+          srcFormat == GL_LUMINANCE_INTEGER_EXT ||
+          srcFormat == GL_LUMINANCE_ALPHA_INTEGER_EXT);
+
+   ASSERT(srcType == GL_UNSIGNED_BYTE ||
+          srcType == GL_BYTE ||
+          srcType == GL_UNSIGNED_SHORT ||
+          srcType == GL_SHORT ||
+          srcType == GL_UNSIGNED_INT ||
+          srcType == GL_INT ||
+          srcType == GL_HALF_FLOAT_ARB ||
+          srcType == GL_FLOAT ||
+          srcType == GL_UNSIGNED_BYTE_3_3_2 ||
+          srcType == GL_UNSIGNED_BYTE_2_3_3_REV ||
+          srcType == GL_UNSIGNED_SHORT_5_6_5 ||
+          srcType == GL_UNSIGNED_SHORT_5_6_5_REV ||
+          srcType == GL_UNSIGNED_SHORT_4_4_4_4 ||
+          srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV ||
+          srcType == GL_UNSIGNED_SHORT_5_5_5_1 ||
+          srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV ||
+          srcType == GL_UNSIGNED_INT_8_8_8_8 ||
+          srcType == GL_UNSIGNED_INT_8_8_8_8_REV ||
+          srcType == GL_UNSIGNED_INT_10_10_10_2 ||
+          srcType == GL_UNSIGNED_INT_2_10_10_10_REV);
+
+
+   /* Extract image data as uint[4] pixels */
+   extract_uint_rgba(n, rgba, srcFormat, srcType, source,
+                     srcPacking->SwapBytes);
+
+   if (dstFormat == GL_RGBA) {
+      /* simple case */
+      memcpy(dest, rgba, 4 * sizeof(GLuint) * n);
+   }
+   else {
+      /* general case */
+      GLint rDst, gDst, bDst, aDst, lDst, iDst;
+      GLint dstComponents = _mesa_components_in_format( dstFormat );
+
+      assert(dstComponents > 0);
+
+      get_component_indexes(dstFormat,
+                            &rDst, &gDst, &bDst, &aDst, &lDst, &iDst);
+
+      /* Now pack values in the requested dest format */
+      if (rDst >= 0) {
+         GLuint *dst = dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            dst[rDst] = rgba[i][RCOMP];
+            dst += dstComponents;
+         }
+      }
+
+      if (gDst >= 0) {
+         GLuint *dst = dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            dst[gDst] = rgba[i][GCOMP];
+            dst += dstComponents;
+         }
+      }
+
+      if (bDst >= 0) {
+         GLuint *dst = dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            dst[bDst] = rgba[i][BCOMP];
+            dst += dstComponents;
+         }
+      }
+
+      if (aDst >= 0) {
+         GLuint *dst = dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            dst[aDst] = rgba[i][ACOMP];
+            dst += dstComponents;
+         }
+      }
+
+      if (iDst >= 0) {
+         GLuint *dst = dest;
+         GLuint i;
+         assert(iDst == 0);
+         assert(dstComponents == 1);
+         for (i = 0; i < n; i++) {
+            /* Intensity comes from red channel */
+            dst[i] = rgba[i][RCOMP];
+         }
+      }
+
+      if (lDst >= 0) {
+         GLuint *dst = dest;
+         GLuint i;
+         assert(lDst == 0);
+         for (i = 0; i < n; i++) {
+            /* Luminance comes from red channel */
+            dst[0] = rgba[i][RCOMP];
+            dst += dstComponents;
+         }
+      }
+   }
+
+   free(rgba);
+}
+
+
+
+/**
+ * Similar to _mesa_unpack_color_span_float(), but for dudv data instead of rgba,
+ * directly return GLbyte data, no transfer ops apply.
+ */
+void
+_mesa_unpack_dudv_span_byte( struct gl_context *ctx,
+                             GLuint n, GLenum dstFormat, GLbyte dest[],
+                             GLenum srcFormat, GLenum srcType,
+                             const GLvoid *source,
+                             const struct gl_pixelstore_attrib *srcPacking,
+                             GLbitfield transferOps )
+{
+   ASSERT(dstFormat == GL_DUDV_ATI);
+   ASSERT(srcFormat == GL_DUDV_ATI);
+
+   ASSERT(srcType == GL_UNSIGNED_BYTE ||
+          srcType == GL_BYTE ||
+          srcType == GL_UNSIGNED_SHORT ||
+          srcType == GL_SHORT ||
+          srcType == GL_UNSIGNED_INT ||
+          srcType == GL_INT ||
+          srcType == GL_HALF_FLOAT_ARB ||
+          srcType == GL_FLOAT);
+
+   /* general solution */
+   {
+      GLint dstComponents;
+      GLbyte *dst = dest;
+      GLuint i;
+      GLfloat (*rgba)[4] = (GLfloat (*)[4]) malloc(4 * n * sizeof(GLfloat));
+
+      if (!rgba) {
+         _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
+         return;
+      }
+
+      dstComponents = _mesa_components_in_format( dstFormat );
+      /* source & dest image formats should have been error checked by now */
+      assert(dstComponents > 0);
+
+      /*
+       * Extract image data and convert to RGBA floats
+       */
+      extract_float_rgba(n, rgba, srcFormat, srcType, source,
+                         srcPacking->SwapBytes);
+
+
+      /* Now determine which color channels we need to produce.
+       * And determine the dest index (offset) within each color tuple.
+       */
+
+      /* Now pack results in the requested dstFormat */
+      for (i = 0; i < n; i++) {
+         /* not sure - need clamp[-1,1] here? */
+         dst[0] = FLOAT_TO_BYTE(rgba[i][RCOMP]);
+         dst[1] = FLOAT_TO_BYTE(rgba[i][GCOMP]);
+         dst += dstComponents;
+      }
+
+      free(rgba);
+   }
+}
+
+/*
+ * Unpack a row of color index data from a client buffer according to
+ * the pixel unpacking parameters.
+ * This is (or will be) used by glDrawPixels, glTexImage[123]D, etc.
+ *
+ * Args:  ctx - the context
+ *        n - number of pixels
+ *        dstType - destination data type
+ *        dest - destination array
+ *        srcType - source pixel type
+ *        source - source data pointer
+ *        srcPacking - pixel unpacking parameters
+ *        transferOps - the pixel transfer operations to apply
+ */
+void
+_mesa_unpack_index_span( struct gl_context *ctx, GLuint n,
+                         GLenum dstType, GLvoid *dest,
+                         GLenum srcType, const GLvoid *source,
+                         const struct gl_pixelstore_attrib *srcPacking,
+                         GLbitfield transferOps )
+{
+   ASSERT(srcType == GL_BITMAP ||
+          srcType == GL_UNSIGNED_BYTE ||
+          srcType == GL_BYTE ||
+          srcType == GL_UNSIGNED_SHORT ||
+          srcType == GL_SHORT ||
+          srcType == GL_UNSIGNED_INT ||
+          srcType == GL_INT ||
+          srcType == GL_HALF_FLOAT_ARB ||
+          srcType == GL_FLOAT);
+
+   ASSERT(dstType == GL_UNSIGNED_BYTE ||
+          dstType == GL_UNSIGNED_SHORT ||
+          dstType == GL_UNSIGNED_INT);
+
+
+   transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
+
+   /*
+    * Try simple cases first
+    */
+   if (transferOps == 0 && srcType == GL_UNSIGNED_BYTE
+       && dstType == GL_UNSIGNED_BYTE) {
+      memcpy(dest, source, n * sizeof(GLubyte));
+   }
+   else if (transferOps == 0 && srcType == GL_UNSIGNED_INT
+            && dstType == GL_UNSIGNED_INT && !srcPacking->SwapBytes) {
+      memcpy(dest, source, n * sizeof(GLuint));
+   }
+   else {
+      /*
+       * general solution
+       */
+      GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
+
+      if (!indexes) {
+         _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
+         return;
+      }
+
+      extract_uint_indexes(n, indexes, GL_COLOR_INDEX, srcType, source,
+                           srcPacking);
+
+      if (transferOps)
+         _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes);
+
+      /* convert to dest type */
+      switch (dstType) {
+         case GL_UNSIGNED_BYTE:
+            {
+               GLubyte *dst = (GLubyte *) dest;
+               GLuint i;
+               for (i = 0; i < n; i++) {
+                  dst[i] = (GLubyte) (indexes[i] & 0xff);
+               }
+            }
+            break;
+         case GL_UNSIGNED_SHORT:
+            {
+               GLuint *dst = (GLuint *) dest;
+               GLuint i;
+               for (i = 0; i < n; i++) {
+                  dst[i] = (GLushort) (indexes[i] & 0xffff);
+               }
+            }
+            break;
+         case GL_UNSIGNED_INT:
+            memcpy(dest, indexes, n * sizeof(GLuint));
+            break;
+         default:
+            _mesa_problem(ctx, "bad dstType in _mesa_unpack_index_span");
+      }
+
+      free(indexes);
+   }
+}
+
+
+void
+_mesa_pack_index_span( struct gl_context *ctx, GLuint n,
+                       GLenum dstType, GLvoid *dest, const GLuint *source,
+                       const struct gl_pixelstore_attrib *dstPacking,
+                       GLbitfield transferOps )
+{
+   GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
+
+   if (!indexes) {
+      _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing");
+      return;
+   }
+
+   transferOps &= (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT);
+
+   if (transferOps & (IMAGE_MAP_COLOR_BIT | IMAGE_SHIFT_OFFSET_BIT)) {
+      /* make a copy of input */
+      memcpy(indexes, source, n * sizeof(GLuint));
+      _mesa_apply_ci_transfer_ops(ctx, transferOps, n, indexes);
+      source = indexes;
+   }
+
+   switch (dstType) {
+   case GL_UNSIGNED_BYTE:
+      {
+         GLubyte *dst = (GLubyte *) dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            *dst++ = (GLubyte) source[i];
+         }
+      }
+      break;
+   case GL_BYTE:
+      {
+         GLbyte *dst = (GLbyte *) dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            dst[i] = (GLbyte) source[i];
+         }
+      }
+      break;
+   case GL_UNSIGNED_SHORT:
+      {
+         GLushort *dst = (GLushort *) dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            dst[i] = (GLushort) source[i];
+         }
+         if (dstPacking->SwapBytes) {
+            _mesa_swap2( (GLushort *) dst, n );
+         }
+      }
+      break;
+   case GL_SHORT:
+      {
+         GLshort *dst = (GLshort *) dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            dst[i] = (GLshort) source[i];
+         }
+         if (dstPacking->SwapBytes) {
+            _mesa_swap2( (GLushort *) dst, n );
+         }
+      }
+      break;
+   case GL_UNSIGNED_INT:
+      {
+         GLuint *dst = (GLuint *) dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            dst[i] = (GLuint) source[i];
+         }
+         if (dstPacking->SwapBytes) {
+            _mesa_swap4( (GLuint *) dst, n );
+         }
+      }
+      break;
+   case GL_INT:
+      {
+         GLint *dst = (GLint *) dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            dst[i] = (GLint) source[i];
+         }
+         if (dstPacking->SwapBytes) {
+            _mesa_swap4( (GLuint *) dst, n );
+         }
+      }
+      break;
+   case GL_FLOAT:
+      {
+         GLfloat *dst = (GLfloat *) dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            dst[i] = (GLfloat) source[i];
+         }
+         if (dstPacking->SwapBytes) {
+            _mesa_swap4( (GLuint *) dst, n );
+         }
+      }
+      break;
+   case GL_HALF_FLOAT_ARB:
+      {
+         GLhalfARB *dst = (GLhalfARB *) dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            dst[i] = _mesa_float_to_half((GLfloat) source[i]);
+         }
+         if (dstPacking->SwapBytes) {
+            _mesa_swap2( (GLushort *) dst, n );
+         }
+      }
+      break;
+   default:
+      _mesa_problem(ctx, "bad type in _mesa_pack_index_span");
+   }
+
+   free(indexes);
+}
+
+
+/*
+ * Unpack a row of stencil data from a client buffer according to
+ * the pixel unpacking parameters.
+ * This is (or will be) used by glDrawPixels
+ *
+ * Args:  ctx - the context
+ *        n - number of pixels
+ *        dstType - destination data type
+ *        dest - destination array
+ *        srcType - source pixel type
+ *        source - source data pointer
+ *        srcPacking - pixel unpacking parameters
+ *        transferOps - apply offset/bias/lookup ops?
+ */
+void
+_mesa_unpack_stencil_span( struct gl_context *ctx, GLuint n,
+                           GLenum dstType, GLvoid *dest,
+                           GLenum srcType, const GLvoid *source,
+                           const struct gl_pixelstore_attrib *srcPacking,
+                           GLbitfield transferOps )
+{
+   ASSERT(srcType == GL_BITMAP ||
+          srcType == GL_UNSIGNED_BYTE ||
+          srcType == GL_BYTE ||
+          srcType == GL_UNSIGNED_SHORT ||
+          srcType == GL_SHORT ||
+          srcType == GL_UNSIGNED_INT ||
+          srcType == GL_INT ||
+          srcType == GL_UNSIGNED_INT_24_8_EXT ||
+          srcType == GL_HALF_FLOAT_ARB ||
+          srcType == GL_FLOAT);
+
+   ASSERT(dstType == GL_UNSIGNED_BYTE ||
+          dstType == GL_UNSIGNED_SHORT ||
+          dstType == GL_UNSIGNED_INT);
+
+   /* only shift and offset apply to stencil */
+   transferOps &= IMAGE_SHIFT_OFFSET_BIT;
+
+   /*
+    * Try simple cases first
+    */
+   if (transferOps == 0 &&
+       !ctx->Pixel.MapStencilFlag &&
+       srcType == GL_UNSIGNED_BYTE &&
+       dstType == GL_UNSIGNED_BYTE) {
+      memcpy(dest, source, n * sizeof(GLubyte));
+   }
+   else if (transferOps == 0 &&
+            !ctx->Pixel.MapStencilFlag &&
+            srcType == GL_UNSIGNED_INT &&
+            dstType == GL_UNSIGNED_INT &&
+            !srcPacking->SwapBytes) {
+      memcpy(dest, source, n * sizeof(GLuint));
+   }
+   else {
+      /*
+       * general solution
+       */
+      GLuint *indexes = (GLuint *) malloc(n * sizeof(GLuint));
+
+      if (!indexes) {
+         _mesa_error(ctx, GL_OUT_OF_MEMORY, "stencil unpacking");
+         return;
+      }
+
+      extract_uint_indexes(n, indexes, GL_STENCIL_INDEX, srcType, source,
+                           srcPacking);
+
+      if (transferOps & IMAGE_SHIFT_OFFSET_BIT) {
+         /* shift and offset indexes */
+         _mesa_shift_and_offset_ci(ctx, n, indexes);
+      }
+
+      if (ctx->Pixel.MapStencilFlag) {
+         /* Apply stencil lookup table */
+         const GLuint mask = ctx->PixelMaps.StoS.Size - 1;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            indexes[i] = (GLuint)ctx->PixelMaps.StoS.Map[ indexes[i] & mask ];
+         }
+      }
+
+      /* convert to dest type */
+      switch (dstType) {
+         case GL_UNSIGNED_BYTE:
+            {
+               GLubyte *dst = (GLubyte *) dest;
+               GLuint i;
+               for (i = 0; i < n; i++) {
+                  dst[i] = (GLubyte) (indexes[i] & 0xff);
+               }
+            }
+            break;
+         case GL_UNSIGNED_SHORT:
+            {
+               GLuint *dst = (GLuint *) dest;
+               GLuint i;
+               for (i = 0; i < n; i++) {
+                  dst[i] = (GLushort) (indexes[i] & 0xffff);
+               }
+            }
+            break;
+         case GL_UNSIGNED_INT:
+            memcpy(dest, indexes, n * sizeof(GLuint));
+            break;
+         default:
+            _mesa_problem(ctx, "bad dstType in _mesa_unpack_stencil_span");
+      }
+
+      free(indexes);
+   }
+}
+
+
+void
+_mesa_pack_stencil_span( struct gl_context *ctx, GLuint n,
+                         GLenum dstType, GLvoid *dest, const GLstencil *source,
+                         const struct gl_pixelstore_attrib *dstPacking )
+{
+   GLstencil *stencil = (GLstencil *) malloc(n * sizeof(GLstencil));
+
+   if (!stencil) {
+      _mesa_error(ctx, GL_OUT_OF_MEMORY, "stencil packing");
+      return;
+   }
+
+   if (ctx->Pixel.IndexShift || ctx->Pixel.IndexOffset ||
+       ctx->Pixel.MapStencilFlag) {
+      /* make a copy of input */
+      memcpy(stencil, source, n * sizeof(GLstencil));
+      _mesa_apply_stencil_transfer_ops(ctx, n, stencil);
+      source = stencil;
+   }
+
+   switch (dstType) {
+   case GL_UNSIGNED_BYTE:
+      if (sizeof(GLstencil) == 1) {
+         memcpy( dest, source, n );
+      }
+      else {
+         GLubyte *dst = (GLubyte *) dest;
+         GLuint i;
+         for (i=0;i<n;i++) {
+            dst[i] = (GLubyte) source[i];
+         }
+      }
+      break;
+   case GL_BYTE:
+      {
+         GLbyte *dst = (GLbyte *) dest;
+         GLuint i;
+         for (i=0;i<n;i++) {
+            dst[i] = (GLbyte) (source[i] & 0x7f);
+         }
+      }
+      break;
+   case GL_UNSIGNED_SHORT:
+      {
+         GLushort *dst = (GLushort *) dest;
+         GLuint i;
+         for (i=0;i<n;i++) {
+            dst[i] = (GLushort) source[i];
+         }
+         if (dstPacking->SwapBytes) {
+            _mesa_swap2( (GLushort *) dst, n );
+         }
+      }
+      break;
+   case GL_SHORT:
+      {
+         GLshort *dst = (GLshort *) dest;
+         GLuint i;
+         for (i=0;i<n;i++) {
+            dst[i] = (GLshort) source[i];
+         }
+         if (dstPacking->SwapBytes) {
+            _mesa_swap2( (GLushort *) dst, n );
+         }
+      }
+      break;
+   case GL_UNSIGNED_INT:
+      {
+         GLuint *dst = (GLuint *) dest;
+         GLuint i;
+         for (i=0;i<n;i++) {
+            dst[i] = (GLuint) source[i];
+         }
+         if (dstPacking->SwapBytes) {
+            _mesa_swap4( (GLuint *) dst, n );
+         }
+      }
+      break;
+   case GL_INT:
+      {
+         GLint *dst = (GLint *) dest;
+         GLuint i;
+         for (i=0;i<n;i++) {
+            dst[i] = (GLint) source[i];
+         }
+         if (dstPacking->SwapBytes) {
+            _mesa_swap4( (GLuint *) dst, n );
+         }
+      }
+      break;
+   case GL_FLOAT:
+      {
+         GLfloat *dst = (GLfloat *) dest;
+         GLuint i;
+         for (i=0;i<n;i++) {
+            dst[i] = (GLfloat) source[i];
+         }
+         if (dstPacking->SwapBytes) {
+            _mesa_swap4( (GLuint *) dst, n );
+         }
+      }
+      break;
+   case GL_HALF_FLOAT_ARB:
+      {
+         GLhalfARB *dst = (GLhalfARB *) dest;
+         GLuint i;
+         for (i=0;i<n;i++) {
+            dst[i] = _mesa_float_to_half( (float) source[i] );
+         }
+         if (dstPacking->SwapBytes) {
+            _mesa_swap2( (GLushort *) dst, n );
+         }
+      }
+      break;
+   case GL_BITMAP:
+      if (dstPacking->LsbFirst) {
+         GLubyte *dst = (GLubyte *) dest;
+         GLint shift = 0;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            if (shift == 0)
+               *dst = 0;
+            *dst |= ((source[i] != 0) << shift);
+            shift++;
+            if (shift == 8) {
+               shift = 0;
+               dst++;
+            }
+         }
+      }
+      else {
+         GLubyte *dst = (GLubyte *) dest;
+         GLint shift = 7;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            if (shift == 7)
+               *dst = 0;
+            *dst |= ((source[i] != 0) << shift);
+            shift--;
+            if (shift < 0) {
+               shift = 7;
+               dst++;
+            }
+         }
+      }
+      break;
+   default:
+      _mesa_problem(ctx, "bad type in _mesa_pack_index_span");
+   }
+
+   free(stencil);
+}
+
+#define DEPTH_VALUES(GLTYPE, GLTYPE2FLOAT)                              \
+    do {                                                                \
+        GLuint i;                                                       \
+        const GLTYPE *src = (const GLTYPE *)source;                     \
+        for (i = 0; i < n; i++) {                                       \
+            GLTYPE value = src[i];                                      \
+            if (srcPacking->SwapBytes) {                                \
+                if (sizeof(GLTYPE) == 2) {                              \
+                    SWAP2BYTE(value);                                   \
+                } else if (sizeof(GLTYPE) == 4) {                       \
+                    SWAP4BYTE(value);                                   \
+                }                                                       \
+            }                                                           \
+            depthValues[i] = GLTYPE2FLOAT(value);                       \
+        }                                                               \
+    } while (0)
+
+
+/**
+ * Unpack a row of depth/z values from memory, returning GLushort, GLuint
+ * or GLfloat values.
+ * The glPixelTransfer (scale/bias) params will be applied.
+ *
+ * \param dstType  one of GL_UNSIGNED_SHORT, GL_UNSIGNED_INT, GL_FLOAT
+ * \param depthMax  max value for returned GLushort or GLuint values
+ *                  (ignored for GLfloat).
+ */
+void
+_mesa_unpack_depth_span( struct gl_context *ctx, GLuint n,
+                         GLenum dstType, GLvoid *dest, GLuint depthMax,
+                         GLenum srcType, const GLvoid *source,
+                         const struct gl_pixelstore_attrib *srcPacking )
+{
+   GLfloat *depthTemp, *depthValues;
+   GLboolean needClamp = GL_FALSE;
+
+   /* Look for special cases first.
+    * Not only are these faster, they're less prone to numeric conversion
+    * problems.  Otherwise, converting from an int type to a float then
+    * back to an int type can introduce errors that will show up as
+    * artifacts in things like depth peeling which uses glCopyTexImage.
+    */
+   if (ctx->Pixel.DepthScale == 1.0 && ctx->Pixel.DepthBias == 0.0) {
+      if (srcType == GL_UNSIGNED_INT && dstType == GL_UNSIGNED_SHORT) {
+         const GLuint *src = (const GLuint *) source;
+         GLushort *dst = (GLushort *) dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            dst[i] = src[i] >> 16;
+         }
+         return;
+      }
+      if (srcType == GL_UNSIGNED_SHORT
+          && dstType == GL_UNSIGNED_INT
+          && depthMax == 0xffffffff) {
+         const GLushort *src = (const GLushort *) source;
+         GLuint *dst = (GLuint *) dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            dst[i] = src[i] | (src[i] << 16);
+         }
+         return;
+      }
+      if (srcType == GL_UNSIGNED_INT_24_8
+          && dstType == GL_UNSIGNED_INT
+          && depthMax == 0xffffff) {
+         const GLuint *src = (const GLuint *) source;
+         GLuint *dst = (GLuint *) dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            dst[i] = src[i] >> 8;
+         }
+         return;
+      }
+      /* XXX may want to add additional cases here someday */
+   }
+
+   /* general case path follows */
+
+   depthTemp = (GLfloat *) malloc(n * sizeof(GLfloat));
+   if (!depthTemp) {
+      _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel unpacking");
+      return;
+   }
+
+   if (dstType == GL_FLOAT) {
+      depthValues = (GLfloat *) dest;
+   }
+   else {
+      depthValues = depthTemp;
+   }
+
+   /* Convert incoming values to GLfloat.  Some conversions will require
+    * clamping, below.
+    */
+   switch (srcType) {
+      case GL_BYTE:
+         DEPTH_VALUES(GLbyte, BYTE_TO_FLOAT);
+         needClamp = GL_TRUE;
+         break;
+      case GL_UNSIGNED_BYTE:
+         DEPTH_VALUES(GLubyte, UBYTE_TO_FLOAT);
+         break;
+      case GL_SHORT:
+         DEPTH_VALUES(GLshort, SHORT_TO_FLOAT);
+         needClamp = GL_TRUE;
+         break;
+      case GL_UNSIGNED_SHORT:
+         DEPTH_VALUES(GLushort, USHORT_TO_FLOAT);
+         break;
+      case GL_INT:
+         DEPTH_VALUES(GLint, INT_TO_FLOAT);
+         needClamp = GL_TRUE;
+         break;
+      case GL_UNSIGNED_INT:
+         DEPTH_VALUES(GLuint, UINT_TO_FLOAT);
+         break;
+      case GL_UNSIGNED_INT_24_8_EXT: /* GL_EXT_packed_depth_stencil */
+         if (dstType == GL_UNSIGNED_INT_24_8_EXT &&
+             depthMax == 0xffffff &&
+             ctx->Pixel.DepthScale == 1.0 &&
+             ctx->Pixel.DepthBias == 0.0) {
+            const GLuint *src = (const GLuint *) source;
+            GLuint *zValues = (GLuint *) dest;
+            GLuint i;
+            for (i = 0; i < n; i++) {
+                GLuint value = src[i];
+                if (srcPacking->SwapBytes) {
+                    SWAP4BYTE(value);
+                }
+                zValues[i] = value & 0xffffff00;
+            }
+            return;
+         }
+         else {
+            const GLuint *src = (const GLuint *) source;
+            const GLfloat scale = 1.0f / 0xffffff;
+            GLuint i;
+            for (i = 0; i < n; i++) {
+                GLuint value = src[i];
+                if (srcPacking->SwapBytes) {
+                    SWAP4BYTE(value);
+                }
+                depthValues[i] = (value >> 8) * scale;
+            }
+         }
+         break;
+      case GL_FLOAT:
+         DEPTH_VALUES(GLfloat, 1*);
+         needClamp = GL_TRUE;
+         break;
+      case GL_HALF_FLOAT_ARB:
+         {
+            GLuint i;
+            const GLhalfARB *src = (const GLhalfARB *) source;
+            for (i = 0; i < n; i++) {
+               GLhalfARB value = src[i];
+               if (srcPacking->SwapBytes) {
+                  SWAP2BYTE(value);
+               }
+               depthValues[i] = _mesa_half_to_float(value);
+            }
+            needClamp = GL_TRUE;
+         }
+         break;
+      default:
+         _mesa_problem(NULL, "bad type in _mesa_unpack_depth_span()");
+         free(depthTemp);
+         return;
+   }
+
+   /* apply depth scale and bias */
+   {
+      const GLfloat scale = ctx->Pixel.DepthScale;
+      const GLfloat bias = ctx->Pixel.DepthBias;
+      if (scale != 1.0 || bias != 0.0) {
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            depthValues[i] = depthValues[i] * scale + bias;
+         }
+         needClamp = GL_TRUE;
+      }
+   }
+
+   /* clamp to [0, 1] */
+   if (needClamp) {
+      GLuint i;
+      for (i = 0; i < n; i++) {
+         depthValues[i] = (GLfloat)CLAMP(depthValues[i], 0.0, 1.0);
+      }
+   }
+
+   /*
+    * Convert values to dstType
+    */
+   if (dstType == GL_UNSIGNED_INT) {
+      GLuint *zValues = (GLuint *) dest;
+      GLuint i;
+      if (depthMax <= 0xffffff) {
+         /* no overflow worries */
+         for (i = 0; i < n; i++) {
+            zValues[i] = (GLuint) (depthValues[i] * (GLfloat) depthMax);
+         }
+      }
+      else {
+         /* need to use double precision to prevent overflow problems */
+         for (i = 0; i < n; i++) {
+            GLdouble z = depthValues[i] * (GLfloat) depthMax;
+            if (z >= (GLdouble) 0xffffffff)
+               zValues[i] = 0xffffffff;
+            else
+               zValues[i] = (GLuint) z;
+         }
+      }
+   }
+   else if (dstType == GL_UNSIGNED_SHORT) {
+      GLushort *zValues = (GLushort *) dest;
+      GLuint i;
+      ASSERT(depthMax <= 0xffff);
+      for (i = 0; i < n; i++) {
+         zValues[i] = (GLushort) (depthValues[i] * (GLfloat) depthMax);
+      }
+   }
+   else {
+      ASSERT(dstType == GL_FLOAT);
+      /*ASSERT(depthMax == 1.0F);*/
+   }
+
+   free(depthTemp);
+}
+
+
+/*
+ * Pack an array of depth values.  The values are floats in [0,1].
+ */
+void
+_mesa_pack_depth_span( struct gl_context *ctx, GLuint n, GLvoid *dest,
+                       GLenum dstType, const GLfloat *depthSpan,
+                       const struct gl_pixelstore_attrib *dstPacking )
+{
+   GLfloat *depthCopy = (GLfloat *) malloc(n * sizeof(GLfloat));
+   if (!depthCopy) {
+      _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing");
+      return;
+   }
+
+   if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) {
+      memcpy(depthCopy, depthSpan, n * sizeof(GLfloat));
+      _mesa_scale_and_bias_depth(ctx, n, depthCopy);
+      depthSpan = depthCopy;
+   }
+
+   switch (dstType) {
+   case GL_UNSIGNED_BYTE:
+      {
+         GLubyte *dst = (GLubyte *) dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            dst[i] = FLOAT_TO_UBYTE( depthSpan[i] );
+         }
+      }
+      break;
+   case GL_BYTE:
+      {
+         GLbyte *dst = (GLbyte *) dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            dst[i] = FLOAT_TO_BYTE( depthSpan[i] );
+         }
+      }
+      break;
+   case GL_UNSIGNED_SHORT:
+      {
+         GLushort *dst = (GLushort *) dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            CLAMPED_FLOAT_TO_USHORT(dst[i], depthSpan[i]);
+         }
+         if (dstPacking->SwapBytes) {
+            _mesa_swap2( (GLushort *) dst, n );
+         }
+      }
+      break;
+   case GL_SHORT:
+      {
+         GLshort *dst = (GLshort *) dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            dst[i] = FLOAT_TO_SHORT( depthSpan[i] );
+         }
+         if (dstPacking->SwapBytes) {
+            _mesa_swap2( (GLushort *) dst, n );
+         }
+      }
+      break;
+   case GL_UNSIGNED_INT:
+      {
+         GLuint *dst = (GLuint *) dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            dst[i] = FLOAT_TO_UINT( depthSpan[i] );
+         }
+         if (dstPacking->SwapBytes) {
+            _mesa_swap4( (GLuint *) dst, n );
+         }
+      }
+      break;
+   case GL_INT:
+      {
+         GLint *dst = (GLint *) dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            dst[i] = FLOAT_TO_INT( depthSpan[i] );
+         }
+         if (dstPacking->SwapBytes) {
+            _mesa_swap4( (GLuint *) dst, n );
+         }
+      }
+      break;
+   case GL_FLOAT:
+      {
+         GLfloat *dst = (GLfloat *) dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            dst[i] = depthSpan[i];
+         }
+         if (dstPacking->SwapBytes) {
+            _mesa_swap4( (GLuint *) dst, n );
+         }
+      }
+      break;
+   case GL_HALF_FLOAT_ARB:
+      {
+         GLhalfARB *dst = (GLhalfARB *) dest;
+         GLuint i;
+         for (i = 0; i < n; i++) {
+            dst[i] = _mesa_float_to_half(depthSpan[i]);
+         }
+         if (dstPacking->SwapBytes) {
+            _mesa_swap2( (GLushort *) dst, n );
+         }
+      }
+      break;
+   default:
+      _mesa_problem(ctx, "bad type in _mesa_pack_depth_span");
+   }
+
+   free(depthCopy);
+}
+
+
+
+/**
+ * Pack depth and stencil values as GL_DEPTH_STENCIL/GL_UNSIGNED_INT_24_8.
+ */
+void
+_mesa_pack_depth_stencil_span(struct gl_context *ctx, GLuint n, GLuint *dest,
+                              const GLfloat *depthVals,
+                              const GLstencil *stencilVals,
+                              const struct gl_pixelstore_attrib *dstPacking)
+{
+   GLfloat *depthCopy = (GLfloat *) malloc(n * sizeof(GLfloat));
+   GLstencil *stencilCopy = (GLstencil *) malloc(n * sizeof(GLstencil));
+   GLuint i;
+
+   if (!depthCopy || !stencilCopy) {
+      _mesa_error(ctx, GL_OUT_OF_MEMORY, "pixel packing");
+      free(depthCopy);
+      free(stencilCopy);
+      return;
+   }
+
+   if (ctx->Pixel.DepthScale != 1.0 || ctx->Pixel.DepthBias != 0.0) {
+      memcpy(depthCopy, depthVals, n * sizeof(GLfloat));
+      _mesa_scale_and_bias_depth(ctx, n, depthCopy);
+      depthVals = depthCopy;
+   }
+
+   if (ctx->Pixel.IndexShift ||
+       ctx->Pixel.IndexOffset ||
+       ctx->Pixel.MapStencilFlag) {
+      memcpy(stencilCopy, stencilVals, n * sizeof(GLstencil));
+      _mesa_apply_stencil_transfer_ops(ctx, n, stencilCopy);
+      stencilVals = stencilCopy;
+   }
+
+   for (i = 0; i < n; i++) {
+      GLuint z = (GLuint) (depthVals[i] * 0xffffff);
+      dest[i] = (z << 8) | (stencilVals[i] & 0xff);
+   }
+
+   if (dstPacking->SwapBytes) {
+      _mesa_swap4(dest, n);
+   }
+
+   free(depthCopy);
+   free(stencilCopy);
+}
+
+
+
+
+/**
+ * Unpack image data.  Apply byte swapping, byte flipping (bitmap).
+ * Return all image data in a contiguous block.  This is used when we
+ * compile glDrawPixels, glTexImage, etc into a display list.  We
+ * need a copy of the data in a standard format.
+ */
+void *
+_mesa_unpack_image( GLuint dimensions,
+                    GLsizei width, GLsizei height, GLsizei depth,
+                    GLenum format, GLenum type, const GLvoid *pixels,
+                    const struct gl_pixelstore_attrib *unpack )
+{
+   GLint bytesPerRow, compsPerRow;
+   GLboolean flipBytes, swap2, swap4;
+
+   if (!pixels)
+      return NULL;  /* not necessarily an error */
+
+   if (width <= 0 || height <= 0 || depth <= 0)
+      return NULL;  /* generate error later */
+
+   if (type == GL_BITMAP) {
+      bytesPerRow = (width + 7) >> 3;
+      flipBytes = unpack->LsbFirst;
+      swap2 = swap4 = GL_FALSE;
+      compsPerRow = 0;
+   }
+   else {
+      const GLint bytesPerPixel = _mesa_bytes_per_pixel(format, type);
+      GLint components = _mesa_components_in_format(format);
+      GLint bytesPerComp;
+
+      if (_mesa_type_is_packed(type))
+          components = 1;
+
+      if (bytesPerPixel <= 0 || components <= 0)
+         return NULL;   /* bad format or type.  generate error later */
+      bytesPerRow = bytesPerPixel * width;
+      bytesPerComp = bytesPerPixel / components;
+      flipBytes = GL_FALSE;
+      swap2 = (bytesPerComp == 2) && unpack->SwapBytes;
+      swap4 = (bytesPerComp == 4) && unpack->SwapBytes;
+      compsPerRow = components * width;
+      assert(compsPerRow >= width);
+   }
+
+   {
+      GLubyte *destBuffer
+         = (GLubyte *) malloc(bytesPerRow * height * depth);
+      GLubyte *dst;
+      GLint img, row;
+      if (!destBuffer)
+         return NULL;   /* generate GL_OUT_OF_MEMORY later */
+
+      dst = destBuffer;
+      for (img = 0; img < depth; img++) {
+         for (row = 0; row < height; row++) {
+            const GLvoid *src = _mesa_image_address(dimensions, unpack, pixels,
+                               width, height, format, type, img, row, 0);
+
+            if ((type == GL_BITMAP) && (unpack->SkipPixels & 0x7)) {
+               GLint i;
+               flipBytes = GL_FALSE;
+               if (unpack->LsbFirst) {
+                  GLubyte srcMask = 1 << (unpack->SkipPixels & 0x7);
+                  GLubyte dstMask = 128;
+                  const GLubyte *s = src;
+                  GLubyte *d = dst;
+                  *d = 0;
+                  for (i = 0; i < width; i++) {
+                     if (*s & srcMask) {
+                        *d |= dstMask;
+                     }      
+                     if (srcMask == 128) {
+                        srcMask = 1;
+                        s++;
+                     }
+                     else {
+                        srcMask = srcMask << 1;
+                     }
+                     if (dstMask == 1) {
+                        dstMask = 128;
+                        d++;
+                        *d = 0;
+                     }
+                     else {
+                        dstMask = dstMask >> 1;
+                     }
+                  }
+               }
+               else {
+                  GLubyte srcMask = 128 >> (unpack->SkipPixels & 0x7);
+                  GLubyte dstMask = 128;
+                  const GLubyte *s = src;
+                  GLubyte *d = dst;
+                  *d = 0;
+                  for (i = 0; i < width; i++) {
+                     if (*s & srcMask) {
+                        *d |= dstMask;
+                     }
+                     if (srcMask == 1) {
+                        srcMask = 128;
+                        s++;
+                     }
+                     else {
+                        srcMask = srcMask >> 1;
+                     }
+                     if (dstMask == 1) {
+                        dstMask = 128;
+                        d++;
+                        *d = 0;
+                     }
+                     else {
+                        dstMask = dstMask >> 1;
+                     }      
+                  }
+               }
+            }
+            else {
+               memcpy(dst, src, bytesPerRow);
+            }
+
+            /* byte flipping/swapping */
+            if (flipBytes) {
+               flip_bytes((GLubyte *) dst, bytesPerRow);
+            }
+            else if (swap2) {
+               _mesa_swap2((GLushort*) dst, compsPerRow);
+            }
+            else if (swap4) {
+               _mesa_swap4((GLuint*) dst, compsPerRow);
+            }
+            dst += bytesPerRow;
+         }
+      }
+      return destBuffer;
+   }
+}
+
diff --git a/mesalib/src/mesa/main/remap_helper.h b/mesalib/src/mesa/main/remap_helper.h
index a2cbc2bc0..637905ab4 100644
--- a/mesalib/src/mesa/main/remap_helper.h
+++ b/mesalib/src/mesa/main/remap_helper.h
@@ -1,6587 +1,6599 @@
-/* DO NOT EDIT - This file generated automatically by remap_helper.py (from Mesa) script */
-
-/*
- * Copyright (C) 2009 Chia-I Wu <olv@0xlab.org>
- * 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"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sub license,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- * 
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
- * Chia-I Wu,
- * AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
- * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
- * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- */
-
-#include "main/dispatch.h"
-#include "main/remap.h"
-
-/* this is internal to remap.c */
-#ifdef need_MESA_remap_table
-
-static const char _mesa_function_pool[] =
-   /* _mesa_function_pool[0]: MapGrid1d (offset 224) */
-   "idd\0"
-   "glMapGrid1d\0"
-   "\0"
-   /* _mesa_function_pool[17]: UniformMatrix3fvARB (will be remapped) */
-   "iiip\0"
-   "glUniformMatrix3fv\0"
-   "glUniformMatrix3fvARB\0"
-   "\0"
-   /* _mesa_function_pool[64]: MapGrid1f (offset 225) */
-   "iff\0"
-   "glMapGrid1f\0"
-   "\0"
-   /* _mesa_function_pool[81]: VertexAttribI2iEXT (will be remapped) */
-   "iii\0"
-   "glVertexAttribI2iEXT\0"
-   "glVertexAttribI2i\0"
-   "\0"
-   /* _mesa_function_pool[125]: RasterPos4i (offset 82) */
-   "iiii\0"
-   "glRasterPos4i\0"
-   "\0"
-   /* _mesa_function_pool[145]: RasterPos4d (offset 78) */
-   "dddd\0"
-   "glRasterPos4d\0"
-   "\0"
-   /* _mesa_function_pool[165]: NewList (dynamic) */
-   "ii\0"
-   "glNewList\0"
-   "\0"
-   /* _mesa_function_pool[179]: RasterPos4f (offset 80) */
-   "ffff\0"
-   "glRasterPos4f\0"
-   "\0"
-   /* _mesa_function_pool[199]: LoadIdentity (offset 290) */
-   "\0"
-   "glLoadIdentity\0"
-   "\0"
-   /* _mesa_function_pool[216]: GetCombinerOutputParameterfvNV (will be remapped) */
-   "iiip\0"
-   "glGetCombinerOutputParameterfvNV\0"
-   "\0"
-   /* _mesa_function_pool[255]: SampleCoverageARB (will be remapped) */
-   "fi\0"
-   "glSampleCoverage\0"
-   "glSampleCoverageARB\0"
-   "\0"
-   /* _mesa_function_pool[296]: ConvolutionFilter1D (offset 348) */
-   "iiiiip\0"
-   "glConvolutionFilter1D\0"
-   "glConvolutionFilter1DEXT\0"
-   "\0"
-   /* _mesa_function_pool[351]: BeginQueryARB (will be remapped) */
-   "ii\0"
-   "glBeginQuery\0"
-   "glBeginQueryARB\0"
-   "\0"
-   /* _mesa_function_pool[384]: RasterPos3dv (offset 71) */
-   "p\0"
-   "glRasterPos3dv\0"
-   "\0"
-   /* _mesa_function_pool[402]: PointParameteriNV (will be remapped) */
-   "ii\0"
-   "glPointParameteri\0"
-   "glPointParameteriNV\0"
-   "\0"
-   /* _mesa_function_pool[444]: GetProgramiv (will be remapped) */
-   "iip\0"
-   "glGetProgramiv\0"
-   "\0"
-   /* _mesa_function_pool[464]: MultiTexCoord3sARB (offset 398) */
-   "iiii\0"
-   "glMultiTexCoord3s\0"
-   "glMultiTexCoord3sARB\0"
-   "\0"
-   /* _mesa_function_pool[509]: SecondaryColor3iEXT (will be remapped) */
-   "iii\0"
-   "glSecondaryColor3i\0"
-   "glSecondaryColor3iEXT\0"
-   "\0"
-   /* _mesa_function_pool[555]: WindowPos3fMESA (will be remapped) */
-   "fff\0"
-   "glWindowPos3f\0"
-   "glWindowPos3fARB\0"
-   "glWindowPos3fMESA\0"
-   "\0"
-   /* _mesa_function_pool[609]: TexCoord1iv (offset 99) */
-   "p\0"
-   "glTexCoord1iv\0"
-   "\0"
-   /* _mesa_function_pool[626]: TexCoord4sv (offset 125) */
-   "p\0"
-   "glTexCoord4sv\0"
-   "\0"
-   /* _mesa_function_pool[643]: RasterPos4s (offset 84) */
-   "iiii\0"
-   "glRasterPos4s\0"
-   "\0"
-   /* _mesa_function_pool[663]: PixelTexGenParameterfvSGIS (will be remapped) */
-   "ip\0"
-   "glPixelTexGenParameterfvSGIS\0"
-   "\0"
-   /* _mesa_function_pool[696]: ActiveTextureARB (offset 374) */
-   "i\0"
-   "glActiveTexture\0"
-   "glActiveTextureARB\0"
-   "\0"
-   /* _mesa_function_pool[734]: BlitFramebufferEXT (will be remapped) */
-   "iiiiiiiiii\0"
-   "glBlitFramebuffer\0"
-   "glBlitFramebufferEXT\0"
-   "\0"
-   /* _mesa_function_pool[785]: TexCoord1f (offset 96) */
-   "f\0"
-   "glTexCoord1f\0"
-   "\0"
-   /* _mesa_function_pool[801]: TexCoord1d (offset 94) */
-   "d\0"
-   "glTexCoord1d\0"
-   "\0"
-   /* _mesa_function_pool[817]: VertexAttrib4ubvNV (will be remapped) */
-   "ip\0"
-   "glVertexAttrib4ubvNV\0"
-   "\0"
-   /* _mesa_function_pool[842]: TexCoord1i (offset 98) */
-   "i\0"
-   "glTexCoord1i\0"
-   "\0"
-   /* _mesa_function_pool[858]: GetProgramNamedParameterdvNV (will be remapped) */
-   "iipp\0"
-   "glGetProgramNamedParameterdvNV\0"
-   "\0"
-   /* _mesa_function_pool[895]: Histogram (offset 367) */
-   "iiii\0"
-   "glHistogram\0"
-   "glHistogramEXT\0"
-   "\0"
-   /* _mesa_function_pool[928]: TexCoord1s (offset 100) */
-   "i\0"
-   "glTexCoord1s\0"
-   "\0"
-   /* _mesa_function_pool[944]: GetMapfv (offset 267) */
-   "iip\0"
-   "glGetMapfv\0"
-   "\0"
-   /* _mesa_function_pool[960]: EvalCoord1f (offset 230) */
-   "f\0"
-   "glEvalCoord1f\0"
-   "\0"
-   /* _mesa_function_pool[977]: FramebufferTexture (will be remapped) */
-   "iiii\0"
-   "glFramebufferTexture\0"
-   "\0"
-   /* _mesa_function_pool[1004]: VertexAttribI1ivEXT (will be remapped) */
-   "ip\0"
-   "glVertexAttribI1ivEXT\0"
-   "glVertexAttribI1iv\0"
-   "\0"
-   /* _mesa_function_pool[1049]: TexImage4DSGIS (dynamic) */
-   "iiiiiiiiiip\0"
-   "glTexImage4DSGIS\0"
-   "\0"
-   /* _mesa_function_pool[1079]: PolygonStipple (offset 175) */
-   "p\0"
-   "glPolygonStipple\0"
-   "\0"
-   /* _mesa_function_pool[1099]: WindowPos2dvMESA (will be remapped) */
-   "p\0"
-   "glWindowPos2dv\0"
-   "glWindowPos2dvARB\0"
-   "glWindowPos2dvMESA\0"
-   "\0"
-   /* _mesa_function_pool[1154]: ReplacementCodeuiColor3fVertex3fvSUN (dynamic) */
-   "ppp\0"
-   "glReplacementCodeuiColor3fVertex3fvSUN\0"
-   "\0"
-   /* _mesa_function_pool[1198]: BlendEquationSeparateEXT (will be remapped) */
-   "ii\0"
-   "glBlendEquationSeparate\0"
-   "glBlendEquationSeparateEXT\0"
-   "glBlendEquationSeparateATI\0"
-   "\0"
-   /* _mesa_function_pool[1280]: ListParameterfSGIX (dynamic) */
-   "iif\0"
-   "glListParameterfSGIX\0"
-   "\0"
-   /* _mesa_function_pool[1306]: SecondaryColor3bEXT (will be remapped) */
-   "iii\0"
-   "glSecondaryColor3b\0"
-   "glSecondaryColor3bEXT\0"
-   "\0"
-   /* _mesa_function_pool[1352]: TexCoord4fColor4fNormal3fVertex4fvSUN (dynamic) */
-   "pppp\0"
-   "glTexCoord4fColor4fNormal3fVertex4fvSUN\0"
-   "\0"
-   /* _mesa_function_pool[1398]: GetPixelMapfv (offset 271) */
-   "ip\0"
-   "glGetPixelMapfv\0"
-   "\0"
-   /* _mesa_function_pool[1418]: Color3uiv (offset 22) */
-   "p\0"
-   "glColor3uiv\0"
-   "\0"
-   /* _mesa_function_pool[1433]: IsEnabled (offset 286) */
-   "i\0"
-   "glIsEnabled\0"
-   "\0"
-   /* _mesa_function_pool[1448]: VertexAttrib4svNV (will be remapped) */
-   "ip\0"
-   "glVertexAttrib4svNV\0"
-   "\0"
-   /* _mesa_function_pool[1472]: EvalCoord2fv (offset 235) */
-   "p\0"
-   "glEvalCoord2fv\0"
-   "\0"
-   /* _mesa_function_pool[1490]: GetBufferSubDataARB (will be remapped) */
-   "iiip\0"
-   "glGetBufferSubData\0"
-   "glGetBufferSubDataARB\0"
-   "\0"
-   /* _mesa_function_pool[1537]: BufferSubDataARB (will be remapped) */
-   "iiip\0"
-   "glBufferSubData\0"
-   "glBufferSubDataARB\0"
-   "\0"
-   /* _mesa_function_pool[1578]: TexCoord2fColor4ubVertex3fvSUN (dynamic) */
-   "ppp\0"
-   "glTexCoord2fColor4ubVertex3fvSUN\0"
-   "\0"
-   /* _mesa_function_pool[1616]: AttachShader (will be remapped) */
-   "ii\0"
-   "glAttachShader\0"
-   "\0"
-   /* _mesa_function_pool[1635]: VertexAttrib2fARB (will be remapped) */
-   "iff\0"
-   "glVertexAttrib2f\0"
-   "glVertexAttrib2fARB\0"
-   "\0"
-   /* _mesa_function_pool[1677]: GetDebugLogLengthMESA (dynamic) */
-   "iii\0"
-   "glGetDebugLogLengthMESA\0"
-   "\0"
-   /* _mesa_function_pool[1706]: GetMapiv (offset 268) */
-   "iip\0"
-   "glGetMapiv\0"
-   "\0"
-   /* _mesa_function_pool[1722]: VertexAttrib3fARB (will be remapped) */
-   "ifff\0"
-   "glVertexAttrib3f\0"
-   "glVertexAttrib3fARB\0"
-   "\0"
-   /* _mesa_function_pool[1765]: Indexubv (offset 316) */
-   "p\0"
-   "glIndexubv\0"
-   "\0"
-   /* _mesa_function_pool[1779]: GetQueryivARB (will be remapped) */
-   "iip\0"
-   "glGetQueryiv\0"
-   "glGetQueryivARB\0"
-   "\0"
-   /* _mesa_function_pool[1813]: TexImage3D (offset 371) */
-   "iiiiiiiiip\0"
-   "glTexImage3D\0"
-   "glTexImage3DEXT\0"
-   "\0"
-   /* _mesa_function_pool[1854]: BindFragDataLocationEXT (will be remapped) */
-   "iip\0"
-   "glBindFragDataLocationEXT\0"
-   "glBindFragDataLocation\0"
-   "\0"
-   /* _mesa_function_pool[1908]: ReplacementCodeuiVertex3fvSUN (dynamic) */
-   "pp\0"
-   "glReplacementCodeuiVertex3fvSUN\0"
-   "\0"
-   /* _mesa_function_pool[1944]: EdgeFlagPointer (offset 312) */
-   "ip\0"
-   "glEdgeFlagPointer\0"
-   "\0"
-   /* _mesa_function_pool[1966]: Color3ubv (offset 20) */
-   "p\0"
-   "glColor3ubv\0"
-   "\0"
-   /* _mesa_function_pool[1981]: GetQueryObjectivARB (will be remapped) */
-   "iip\0"
-   "glGetQueryObjectiv\0"
-   "glGetQueryObjectivARB\0"
-   "\0"
-   /* _mesa_function_pool[2027]: Vertex3dv (offset 135) */
-   "p\0"
-   "glVertex3dv\0"
-   "\0"
-   /* _mesa_function_pool[2042]: ReplacementCodeuiTexCoord2fVertex3fvSUN (dynamic) */
-   "ppp\0"
-   "glReplacementCodeuiTexCoord2fVertex3fvSUN\0"
-   "\0"
-   /* _mesa_function_pool[2089]: CompressedTexSubImage2DARB (will be remapped) */
-   "iiiiiiiip\0"
-   "glCompressedTexSubImage2D\0"
-   "glCompressedTexSubImage2DARB\0"
-   "\0"
-   /* _mesa_function_pool[2155]: CombinerOutputNV (will be remapped) */
-   "iiiiiiiiii\0"
-   "glCombinerOutputNV\0"
-   "\0"
-   /* _mesa_function_pool[2186]: VertexAttribs3fvNV (will be remapped) */
-   "iip\0"
-   "glVertexAttribs3fvNV\0"
-   "\0"
-   /* _mesa_function_pool[2212]: Uniform2fARB (will be remapped) */
-   "iff\0"
-   "glUniform2f\0"
-   "glUniform2fARB\0"
-   "\0"
-   /* _mesa_function_pool[2244]: LightModeliv (offset 166) */
-   "ip\0"
-   "glLightModeliv\0"
-   "\0"
-   /* _mesa_function_pool[2263]: VertexAttrib1svARB (will be remapped) */
-   "ip\0"
-   "glVertexAttrib1sv\0"
-   "glVertexAttrib1svARB\0"
-   "\0"
-   /* _mesa_function_pool[2306]: VertexAttribs1dvNV (will be remapped) */
-   "iip\0"
-   "glVertexAttribs1dvNV\0"
-   "\0"
-   /* _mesa_function_pool[2332]: Uniform2ivARB (will be remapped) */
-   "iip\0"
-   "glUniform2iv\0"
-   "glUniform2ivARB\0"
-   "\0"
-   /* _mesa_function_pool[2366]: GetImageTransformParameterfvHP (dynamic) */
-   "iip\0"
-   "glGetImageTransformParameterfvHP\0"
-   "\0"
-   /* _mesa_function_pool[2404]: Normal3bv (offset 53) */
-   "p\0"
-   "glNormal3bv\0"
-   "\0"
-   /* _mesa_function_pool[2419]: TexGeniv (offset 193) */
-   "iip\0"
-   "glTexGeniv\0"
-   "\0"
-   /* _mesa_function_pool[2435]: WeightubvARB (dynamic) */
-   "ip\0"
-   "glWeightubvARB\0"
-   "\0"
-   /* _mesa_function_pool[2454]: VertexAttrib1fvNV (will be remapped) */
-   "ip\0"
-   "glVertexAttrib1fvNV\0"
-   "\0"
-   /* _mesa_function_pool[2478]: Vertex3iv (offset 139) */
-   "p\0"
-   "glVertex3iv\0"
-   "\0"
-   /* _mesa_function_pool[2493]: CopyConvolutionFilter1D (offset 354) */
-   "iiiii\0"
-   "glCopyConvolutionFilter1D\0"
-   "glCopyConvolutionFilter1DEXT\0"
-   "\0"
-   /* _mesa_function_pool[2555]: VertexAttribI1uiEXT (will be remapped) */
-   "ii\0"
-   "glVertexAttribI1uiEXT\0"
-   "glVertexAttribI1ui\0"
-   "\0"
-   /* _mesa_function_pool[2600]: ReplacementCodeuiNormal3fVertex3fSUN (dynamic) */
-   "iffffff\0"
-   "glReplacementCodeuiNormal3fVertex3fSUN\0"
-   "\0"
-   /* _mesa_function_pool[2648]: DeleteSync (will be remapped) */
-   "i\0"
-   "glDeleteSync\0"
-   "\0"
-   /* _mesa_function_pool[2664]: FragmentMaterialfvSGIX (dynamic) */
-   "iip\0"
-   "glFragmentMaterialfvSGIX\0"
-   "\0"
-   /* _mesa_function_pool[2694]: BlendColor (offset 336) */
-   "ffff\0"
-   "glBlendColor\0"
-   "glBlendColorEXT\0"
-   "\0"
-   /* _mesa_function_pool[2729]: UniformMatrix4fvARB (will be remapped) */
-   "iiip\0"
-   "glUniformMatrix4fv\0"
-   "glUniformMatrix4fvARB\0"
-   "\0"
-   /* _mesa_function_pool[2776]: DeleteVertexArraysAPPLE (will be remapped) */
-   "ip\0"
-   "glDeleteVertexArrays\0"
-   "glDeleteVertexArraysAPPLE\0"
-   "\0"
-   /* _mesa_function_pool[2827]: TexBuffer (will be remapped) */
-   "iii\0"
-   "glTexBuffer\0"
-   "\0"
-   /* _mesa_function_pool[2844]: ReadInstrumentsSGIX (dynamic) */
-   "i\0"
-   "glReadInstrumentsSGIX\0"
-   "\0"
-   /* _mesa_function_pool[2869]: CallLists (offset 3) */
-   "iip\0"
-   "glCallLists\0"
-   "\0"
-   /* _mesa_function_pool[2886]: UniformMatrix2x4fv (will be remapped) */
-   "iiip\0"
-   "glUniformMatrix2x4fv\0"
-   "\0"
-   /* _mesa_function_pool[2913]: Color4ubVertex3fvSUN (dynamic) */
-   "pp\0"
-   "glColor4ubVertex3fvSUN\0"
-   "\0"
-   /* _mesa_function_pool[2940]: Normal3iv (offset 59) */
-   "p\0"
-   "glNormal3iv\0"
-   "\0"
-   /* _mesa_function_pool[2955]: PassThrough (offset 199) */
-   "f\0"
-   "glPassThrough\0"
-   "\0"
-   /* _mesa_function_pool[2972]: GetVertexAttribIivEXT (will be remapped) */
-   "iip\0"
-   "glGetVertexAttribIivEXT\0"
-   "glGetVertexAttribIiv\0"
-   "\0"
-   /* _mesa_function_pool[3022]: TexParameterIivEXT (will be remapped) */
-   "iip\0"
-   "glTexParameterIivEXT\0"
-   "glTexParameterIiv\0"
-   "\0"
-   /* _mesa_function_pool[3066]: FramebufferTextureLayerEXT (will be remapped) */
-   "iiiii\0"
-   "glFramebufferTextureLayer\0"
-   "glFramebufferTextureLayerEXT\0"
-   "\0"
-   /* _mesa_function_pool[3128]: GetListParameterfvSGIX (dynamic) */
-   "iip\0"
-   "glGetListParameterfvSGIX\0"
-   "\0"
-   /* _mesa_function_pool[3158]: Viewport (offset 305) */
-   "iiii\0"
-   "glViewport\0"
-   "\0"
-   /* _mesa_function_pool[3175]: VertexAttrib4NusvARB (will be remapped) */
-   "ip\0"
-   "glVertexAttrib4Nusv\0"
-   "glVertexAttrib4NusvARB\0"
-   "\0"
-   /* _mesa_function_pool[3222]: WindowPos4svMESA (will be remapped) */
-   "p\0"
-   "glWindowPos4svMESA\0"
-   "\0"
-   /* _mesa_function_pool[3244]: CreateProgramObjectARB (will be remapped) */
-   "\0"
-   "glCreateProgramObjectARB\0"
-   "\0"
-   /* _mesa_function_pool[3271]: DeleteTransformFeedbacks (will be remapped) */
-   "ip\0"
-   "glDeleteTransformFeedbacks\0"
-   "\0"
-   /* _mesa_function_pool[3302]: UniformMatrix4x3fv (will be remapped) */
-   "iiip\0"
-   "glUniformMatrix4x3fv\0"
-   "\0"
-   /* _mesa_function_pool[3329]: PrioritizeTextures (offset 331) */
-   "ipp\0"
-   "glPrioritizeTextures\0"
-   "glPrioritizeTexturesEXT\0"
-   "\0"
-   /* _mesa_function_pool[3379]: VertexAttribI3uiEXT (will be remapped) */
-   "iiii\0"
-   "glVertexAttribI3uiEXT\0"
-   "glVertexAttribI3ui\0"
-   "\0"
-   /* _mesa_function_pool[3426]: AsyncMarkerSGIX (dynamic) */
-   "i\0"
-   "glAsyncMarkerSGIX\0"
-   "\0"
-   /* _mesa_function_pool[3447]: GlobalAlphaFactorubSUN (dynamic) */
-   "i\0"
-   "glGlobalAlphaFactorubSUN\0"
-   "\0"
-   /* _mesa_function_pool[3475]: ClearColorIuiEXT (will be remapped) */
-   "iiii\0"
-   "glClearColorIuiEXT\0"
-   "\0"
-   /* _mesa_function_pool[3500]: ClearDebugLogMESA (dynamic) */
-   "iii\0"
-   "glClearDebugLogMESA\0"
-   "\0"
-   /* _mesa_function_pool[3525]: Uniform4uiEXT (will be remapped) */
-   "iiiii\0"
-   "glUniform4uiEXT\0"
-   "glUniform4ui\0"
-   "\0"
-   /* _mesa_function_pool[3561]: ResetHistogram (offset 369) */
-   "i\0"
-   "glResetHistogram\0"
-   "glResetHistogramEXT\0"
-   "\0"
-   /* _mesa_function_pool[3601]: GetProgramNamedParameterfvNV (will be remapped) */
-   "iipp\0"
-   "glGetProgramNamedParameterfvNV\0"
-   "\0"
-   /* _mesa_function_pool[3638]: PointParameterfEXT (will be remapped) */
-   "if\0"
-   "glPointParameterf\0"
-   "glPointParameterfARB\0"
-   "glPointParameterfEXT\0"
-   "glPointParameterfSGIS\0"
-   "\0"
-   /* _mesa_function_pool[3724]: LoadIdentityDeformationMapSGIX (dynamic) */
-   "i\0"
-   "glLoadIdentityDeformationMapSGIX\0"
-   "\0"
-   /* _mesa_function_pool[3760]: GenFencesNV (will be remapped) */
-   "ip\0"
-   "glGenFencesNV\0"
-   "\0"
-   /* _mesa_function_pool[3778]: ImageTransformParameterfHP (dynamic) */
-   "iif\0"
-   "glImageTransformParameterfHP\0"
-   "\0"
-   /* _mesa_function_pool[3812]: MatrixIndexusvARB (dynamic) */
-   "ip\0"
-   "glMatrixIndexusvARB\0"
-   "\0"
-   /* _mesa_function_pool[3836]: DrawElementsBaseVertex (will be remapped) */
-   "iiipi\0"
-   "glDrawElementsBaseVertex\0"
-   "\0"
-   /* _mesa_function_pool[3868]: DisableVertexAttribArrayARB (will be remapped) */
-   "i\0"
-   "glDisableVertexAttribArray\0"
-   "glDisableVertexAttribArrayARB\0"
-   "\0"
-   /* _mesa_function_pool[3928]: TexCoord2sv (offset 109) */
-   "p\0"
-   "glTexCoord2sv\0"
-   "\0"
-   /* _mesa_function_pool[3945]: Vertex4dv (offset 143) */
-   "p\0"
-   "glVertex4dv\0"
-   "\0"
-   /* _mesa_function_pool[3960]: StencilMaskSeparate (will be remapped) */
-   "ii\0"
-   "glStencilMaskSeparate\0"
-   "\0"
-   /* _mesa_function_pool[3986]: ProgramLocalParameter4dARB (will be remapped) */
-   "iidddd\0"
-   "glProgramLocalParameter4dARB\0"
-   "\0"
-   /* _mesa_function_pool[4023]: CompressedTexImage3DARB (will be remapped) */
-   "iiiiiiiip\0"
-   "glCompressedTexImage3D\0"
-   "glCompressedTexImage3DARB\0"
-   "\0"
-   /* _mesa_function_pool[4083]: Color3sv (offset 18) */
-   "p\0"
-   "glColor3sv\0"
-   "\0"
-   /* _mesa_function_pool[4097]: GetConvolutionParameteriv (offset 358) */
-   "iip\0"
-   "glGetConvolutionParameteriv\0"
-   "glGetConvolutionParameterivEXT\0"
-   "\0"
-   /* _mesa_function_pool[4161]: VertexAttrib1fARB (will be remapped) */
-   "if\0"
-   "glVertexAttrib1f\0"
-   "glVertexAttrib1fARB\0"
-   "\0"
-   /* _mesa_function_pool[4202]: Vertex2dv (offset 127) */
-   "p\0"
-   "glVertex2dv\0"
-   "\0"
-   /* _mesa_function_pool[4217]: TestFenceNV (will be remapped) */
-   "i\0"
-   "glTestFenceNV\0"
-   "\0"
-   /* _mesa_function_pool[4234]: MultiTexCoord1fvARB (offset 379) */
-   "ip\0"
-   "glMultiTexCoord1fv\0"
-   "glMultiTexCoord1fvARB\0"
-   "\0"
-   /* _mesa_function_pool[4279]: TexCoord3iv (offset 115) */
-   "p\0"
-   "glTexCoord3iv\0"
-   "\0"
-   /* _mesa_function_pool[4296]: Uniform2uivEXT (will be remapped) */
-   "iip\0"
-   "glUniform2uivEXT\0"
-   "glUniform2uiv\0"
-   "\0"
-   /* _mesa_function_pool[4332]: ColorFragmentOp2ATI (will be remapped) */
-   "iiiiiiiiii\0"
-   "glColorFragmentOp2ATI\0"
-   "\0"
-   /* _mesa_function_pool[4366]: SecondaryColorPointerListIBM (dynamic) */
-   "iiipi\0"
-   "glSecondaryColorPointerListIBM\0"
-   "\0"
-   /* _mesa_function_pool[4404]: GetPixelTexGenParameterivSGIS (will be remapped) */
-   "ip\0"
-   "glGetPixelTexGenParameterivSGIS\0"
-   "\0"
-   /* _mesa_function_pool[4440]: Color3fv (offset 14) */
-   "p\0"
-   "glColor3fv\0"
-   "\0"
-   /* _mesa_function_pool[4454]: VertexAttrib4fNV (will be remapped) */
-   "iffff\0"
-   "glVertexAttrib4fNV\0"
-   "\0"
-   /* _mesa_function_pool[4480]: ReplacementCodeubSUN (dynamic) */
-   "i\0"
-   "glReplacementCodeubSUN\0"
-   "\0"
-   /* _mesa_function_pool[4506]: FinishAsyncSGIX (dynamic) */
-   "p\0"
-   "glFinishAsyncSGIX\0"
-   "\0"
-   /* _mesa_function_pool[4527]: GetDebugLogMESA (dynamic) */
-   "iiiipp\0"
-   "glGetDebugLogMESA\0"
-   "\0"
-   /* _mesa_function_pool[4553]: FogCoorddEXT (will be remapped) */
-   "d\0"
-   "glFogCoordd\0"
-   "glFogCoorddEXT\0"
-   "\0"
-   /* _mesa_function_pool[4583]: BeginConditionalRenderNV (will be remapped) */
-   "ii\0"
-   "glBeginConditionalRenderNV\0"
-   "glBeginConditionalRender\0"
-   "\0"
-   /* _mesa_function_pool[4639]: Color4ubVertex3fSUN (dynamic) */
-   "iiiifff\0"
-   "glColor4ubVertex3fSUN\0"
-   "\0"
-   /* _mesa_function_pool[4670]: FogCoordfEXT (will be remapped) */
-   "f\0"
-   "glFogCoordf\0"
-   "glFogCoordfEXT\0"
-   "\0"
-   /* _mesa_function_pool[4700]: PointSize (offset 173) */
-   "f\0"
-   "glPointSize\0"
-   "\0"
-   /* _mesa_function_pool[4715]: VertexAttribI2uivEXT (will be remapped) */
-   "ip\0"
-   "glVertexAttribI2uivEXT\0"
-   "glVertexAttribI2uiv\0"
-   "\0"
-   /* _mesa_function_pool[4762]: TexCoord2fVertex3fSUN (dynamic) */
-   "fffff\0"
-   "glTexCoord2fVertex3fSUN\0"
-   "\0"
-   /* _mesa_function_pool[4793]: PopName (offset 200) */
-   "\0"
-   "glPopName\0"
-   "\0"
-   /* _mesa_function_pool[4805]: GlobalAlphaFactoriSUN (dynamic) */
-   "i\0"
-   "glGlobalAlphaFactoriSUN\0"
-   "\0"
-   /* _mesa_function_pool[4832]: VertexAttrib2dNV (will be remapped) */
-   "idd\0"
-   "glVertexAttrib2dNV\0"
-   "\0"
-   /* _mesa_function_pool[4856]: GetProgramInfoLog (will be remapped) */
-   "iipp\0"
-   "glGetProgramInfoLog\0"
-   "\0"
-   /* _mesa_function_pool[4882]: VertexAttrib4NbvARB (will be remapped) */
-   "ip\0"
-   "glVertexAttrib4Nbv\0"
-   "glVertexAttrib4NbvARB\0"
-   "\0"
-   /* _mesa_function_pool[4927]: GetActiveAttribARB (will be remapped) */
-   "iiipppp\0"
-   "glGetActiveAttrib\0"
-   "glGetActiveAttribARB\0"
-   "\0"
-   /* _mesa_function_pool[4975]: Vertex4sv (offset 149) */
-   "p\0"
-   "glVertex4sv\0"
-   "\0"
-   /* _mesa_function_pool[4990]: VertexAttrib4ubNV (will be remapped) */
-   "iiiii\0"
-   "glVertexAttrib4ubNV\0"
-   "\0"
-   /* _mesa_function_pool[5017]: ClampColor (will be remapped) */
-   "ii\0"
-   "glClampColor\0"
-   "\0"
-   /* _mesa_function_pool[5034]: TextureRangeAPPLE (will be remapped) */
-   "iip\0"
-   "glTextureRangeAPPLE\0"
-   "\0"
-   /* _mesa_function_pool[5059]: GetTexEnvfv (offset 276) */
-   "iip\0"
-   "glGetTexEnvfv\0"
-   "\0"
-   /* _mesa_function_pool[5078]: BindTransformFeedback (will be remapped) */
-   "ii\0"
-   "glBindTransformFeedback\0"
-   "\0"
-   /* _mesa_function_pool[5106]: TexCoord2fColor4fNormal3fVertex3fSUN (dynamic) */
-   "ffffffffffff\0"
-   "glTexCoord2fColor4fNormal3fVertex3fSUN\0"
-   "\0"
-   /* _mesa_function_pool[5159]: Indexub (offset 315) */
-   "i\0"
-   "glIndexub\0"
-   "\0"
-   /* _mesa_function_pool[5172]: ColorMaskIndexedEXT (will be remapped) */
-   "iiiii\0"
-   "glColorMaskIndexedEXT\0"
-   "glColorMaski\0"
-   "\0"
-   /* _mesa_function_pool[5214]: TexEnvi (offset 186) */
-   "iii\0"
-   "glTexEnvi\0"
-   "\0"
-   /* _mesa_function_pool[5229]: GetClipPlane (offset 259) */
-   "ip\0"
-   "glGetClipPlane\0"
-   "\0"
-   /* _mesa_function_pool[5248]: CombinerParameterfvNV (will be remapped) */
-   "ip\0"
-   "glCombinerParameterfvNV\0"
-   "\0"
-   /* _mesa_function_pool[5276]: VertexAttribs3dvNV (will be remapped) */
-   "iip\0"
-   "glVertexAttribs3dvNV\0"
-   "\0"
-   /* _mesa_function_pool[5302]: VertexAttribI2uiEXT (will be remapped) */
-   "iii\0"
-   "glVertexAttribI2uiEXT\0"
-   "glVertexAttribI2ui\0"
-   "\0"
-   /* _mesa_function_pool[5348]: VertexAttribs4fvNV (will be remapped) */
-   "iip\0"
-   "glVertexAttribs4fvNV\0"
-   "\0"
-   /* _mesa_function_pool[5374]: VertexArrayRangeNV (will be remapped) */
-   "ip\0"
-   "glVertexArrayRangeNV\0"
-   "\0"
-   /* _mesa_function_pool[5399]: FragmentLightiSGIX (dynamic) */
-   "iii\0"
-   "glFragmentLightiSGIX\0"
-   "\0"
-   /* _mesa_function_pool[5425]: PolygonOffsetEXT (will be remapped) */
-   "ff\0"
-   "glPolygonOffsetEXT\0"
-   "\0"
-   /* _mesa_function_pool[5448]: VertexAttribI4uivEXT (will be remapped) */
-   "ip\0"
-   "glVertexAttribI4uivEXT\0"
-   "glVertexAttribI4uiv\0"
-   "\0"
-   /* _mesa_function_pool[5495]: PollAsyncSGIX (dynamic) */
-   "p\0"
-   "glPollAsyncSGIX\0"
-   "\0"
-   /* _mesa_function_pool[5514]: DeleteFragmentShaderATI (will be remapped) */
-   "i\0"
-   "glDeleteFragmentShaderATI\0"
-   "\0"
-   /* _mesa_function_pool[5543]: Scaled (offset 301) */
-   "ddd\0"
-   "glScaled\0"
-   "\0"
-   /* _mesa_function_pool[5557]: ResumeTransformFeedback (will be remapped) */
-   "\0"
-   "glResumeTransformFeedback\0"
-   "\0"
-   /* _mesa_function_pool[5585]: Scalef (offset 302) */
-   "fff\0"
-   "glScalef\0"
-   "\0"
-   /* _mesa_function_pool[5599]: TexCoord2fNormal3fVertex3fvSUN (dynamic) */
-   "ppp\0"
-   "glTexCoord2fNormal3fVertex3fvSUN\0"
-   "\0"
-   /* _mesa_function_pool[5637]: MultTransposeMatrixdARB (will be remapped) */
-   "p\0"
-   "glMultTransposeMatrixd\0"
-   "glMultTransposeMatrixdARB\0"
-   "\0"
-   /* _mesa_function_pool[5689]: ObjectUnpurgeableAPPLE (will be remapped) */
-   "iii\0"
-   "glObjectUnpurgeableAPPLE\0"
-   "\0"
-   /* _mesa_function_pool[5719]: AlphaFunc (offset 240) */
-   "if\0"
-   "glAlphaFunc\0"
-   "\0"
-   /* _mesa_function_pool[5735]: WindowPos2svMESA (will be remapped) */
-   "p\0"
-   "glWindowPos2sv\0"
-   "glWindowPos2svARB\0"
-   "glWindowPos2svMESA\0"
-   "\0"
-   /* _mesa_function_pool[5790]: EdgeFlag (offset 41) */
-   "i\0"
-   "glEdgeFlag\0"
-   "\0"
-   /* _mesa_function_pool[5804]: TexCoord2iv (offset 107) */
-   "p\0"
-   "glTexCoord2iv\0"
-   "\0"
-   /* _mesa_function_pool[5821]: CompressedTexImage1DARB (will be remapped) */
-   "iiiiiip\0"
-   "glCompressedTexImage1D\0"
-   "glCompressedTexImage1DARB\0"
-   "\0"
-   /* _mesa_function_pool[5879]: Rotated (offset 299) */
-   "dddd\0"
-   "glRotated\0"
-   "\0"
-   /* _mesa_function_pool[5895]: GetTexParameterIuivEXT (will be remapped) */
-   "iip\0"
-   "glGetTexParameterIuivEXT\0"
-   "glGetTexParameterIuiv\0"
-   "\0"
-   /* _mesa_function_pool[5947]: VertexAttrib2sNV (will be remapped) */
-   "iii\0"
-   "glVertexAttrib2sNV\0"
-   "\0"
-   /* _mesa_function_pool[5971]: ReadPixels (offset 256) */
-   "iiiiiip\0"
-   "glReadPixels\0"
-   "\0"
-   /* _mesa_function_pool[5993]: EdgeFlagv (offset 42) */
-   "p\0"
-   "glEdgeFlagv\0"
-   "\0"
-   /* _mesa_function_pool[6008]: NormalPointerListIBM (dynamic) */
-   "iipi\0"
-   "glNormalPointerListIBM\0"
-   "\0"
-   /* _mesa_function_pool[6037]: IndexPointerEXT (will be remapped) */
-   "iiip\0"
-   "glIndexPointerEXT\0"
-   "\0"
-   /* _mesa_function_pool[6061]: Color4iv (offset 32) */
-   "p\0"
-   "glColor4iv\0"
-   "\0"
-   /* _mesa_function_pool[6075]: TexParameterf (offset 178) */
-   "iif\0"
-   "glTexParameterf\0"
-   "\0"
-   /* _mesa_function_pool[6096]: TexParameteri (offset 180) */
-   "iii\0"
-   "glTexParameteri\0"
-   "\0"
-   /* _mesa_function_pool[6117]: NormalPointerEXT (will be remapped) */
-   "iiip\0"
-   "glNormalPointerEXT\0"
-   "\0"
-   /* _mesa_function_pool[6142]: MultiTexCoord3dARB (offset 392) */
-   "iddd\0"
-   "glMultiTexCoord3d\0"
-   "glMultiTexCoord3dARB\0"
-   "\0"
-   /* _mesa_function_pool[6187]: MultiTexCoord2iARB (offset 388) */
-   "iii\0"
-   "glMultiTexCoord2i\0"
-   "glMultiTexCoord2iARB\0"
-   "\0"
-   /* _mesa_function_pool[6231]: DrawPixels (offset 257) */
-   "iiiip\0"
-   "glDrawPixels\0"
-   "\0"
-   /* _mesa_function_pool[6251]: ReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (dynamic) */
-   "iffffffff\0"
-   "glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN\0"
-   "\0"
-   /* _mesa_function_pool[6311]: MultiTexCoord2svARB (offset 391) */
-   "ip\0"
-   "glMultiTexCoord2sv\0"
-   "glMultiTexCoord2svARB\0"
-   "\0"
-   /* _mesa_function_pool[6356]: ReplacementCodeubvSUN (dynamic) */
-   "p\0"
-   "glReplacementCodeubvSUN\0"
-   "\0"
-   /* _mesa_function_pool[6383]: Uniform3iARB (will be remapped) */
-   "iiii\0"
-   "glUniform3i\0"
-   "glUniform3iARB\0"
-   "\0"
-   /* _mesa_function_pool[6416]: DrawTransformFeedback (will be remapped) */
-   "ii\0"
-   "glDrawTransformFeedback\0"
-   "\0"
-   /* _mesa_function_pool[6444]: DrawElementsInstancedARB (will be remapped) */
-   "iiipi\0"
-   "glDrawElementsInstancedARB\0"
-   "glDrawElementsInstancedEXT\0"
-   "glDrawElementsInstanced\0"
-   "\0"
-   /* _mesa_function_pool[6529]: GetShaderInfoLog (will be remapped) */
-   "iipp\0"
-   "glGetShaderInfoLog\0"
-   "\0"
-   /* _mesa_function_pool[6554]: WeightivARB (dynamic) */
-   "ip\0"
-   "glWeightivARB\0"
-   "\0"
-   /* _mesa_function_pool[6572]: PollInstrumentsSGIX (dynamic) */
-   "p\0"
-   "glPollInstrumentsSGIX\0"
-   "\0"
-   /* _mesa_function_pool[6597]: GlobalAlphaFactordSUN (dynamic) */
-   "d\0"
-   "glGlobalAlphaFactordSUN\0"
-   "\0"
-   /* _mesa_function_pool[6624]: GetFinalCombinerInputParameterfvNV (will be remapped) */
-   "iip\0"
-   "glGetFinalCombinerInputParameterfvNV\0"
-   "\0"
-   /* _mesa_function_pool[6666]: GenerateMipmapEXT (will be remapped) */
-   "i\0"
-   "glGenerateMipmap\0"
-   "glGenerateMipmapEXT\0"
-   "\0"
-   /* _mesa_function_pool[6706]: GenLists (offset 5) */
-   "i\0"
-   "glGenLists\0"
-   "\0"
-   /* _mesa_function_pool[6720]: DepthRangef (will be remapped) */
-   "ff\0"
-   "glDepthRangef\0"
-   "\0"
-   /* _mesa_function_pool[6738]: GetMapAttribParameterivNV (dynamic) */
-   "iiip\0"
-   "glGetMapAttribParameterivNV\0"
-   "\0"
-   /* _mesa_function_pool[6772]: CreateShaderObjectARB (will be remapped) */
-   "i\0"
-   "glCreateShaderObjectARB\0"
-   "\0"
-   /* _mesa_function_pool[6799]: GetSharpenTexFuncSGIS (dynamic) */
-   "ip\0"
-   "glGetSharpenTexFuncSGIS\0"
-   "\0"
-   /* _mesa_function_pool[6827]: BufferDataARB (will be remapped) */
-   "iipi\0"
-   "glBufferData\0"
-   "glBufferDataARB\0"
-   "\0"
-   /* _mesa_function_pool[6862]: FlushVertexArrayRangeNV (will be remapped) */
-   "\0"
-   "glFlushVertexArrayRangeNV\0"
-   "\0"
-   /* _mesa_function_pool[6890]: MapGrid2d (offset 226) */
-   "iddidd\0"
-   "glMapGrid2d\0"
-   "\0"
-   /* _mesa_function_pool[6910]: MapGrid2f (offset 227) */
-   "iffiff\0"
-   "glMapGrid2f\0"
-   "\0"
-   /* _mesa_function_pool[6930]: SampleMapATI (will be remapped) */
-   "iii\0"
-   "glSampleMapATI\0"
-   "\0"
-   /* _mesa_function_pool[6950]: VertexPointerEXT (will be remapped) */
-   "iiiip\0"
-   "glVertexPointerEXT\0"
-   "\0"
-   /* _mesa_function_pool[6976]: GetTexFilterFuncSGIS (dynamic) */
-   "iip\0"
-   "glGetTexFilterFuncSGIS\0"
-   "\0"
-   /* _mesa_function_pool[7004]: Scissor (offset 176) */
-   "iiii\0"
-   "glScissor\0"
-   "\0"
-   /* _mesa_function_pool[7020]: Fogf (offset 153) */
-   "if\0"
-   "glFogf\0"
-   "\0"
-   /* _mesa_function_pool[7031]: ReplacementCodeuiColor4ubVertex3fvSUN (dynamic) */
-   "ppp\0"
-   "glReplacementCodeuiColor4ubVertex3fvSUN\0"
-   "\0"
-   /* _mesa_function_pool[7076]: TexSubImage1D (offset 332) */
-   "iiiiiip\0"
-   "glTexSubImage1D\0"
-   "glTexSubImage1DEXT\0"
-   "\0"
-   /* _mesa_function_pool[7120]: VertexAttrib1sARB (will be remapped) */
-   "ii\0"
-   "glVertexAttrib1s\0"
-   "glVertexAttrib1sARB\0"
-   "\0"
-   /* _mesa_function_pool[7161]: FenceSync (will be remapped) */
-   "ii\0"
-   "glFenceSync\0"
-   "\0"
-   /* _mesa_function_pool[7177]: Color4usv (offset 40) */
-   "p\0"
-   "glColor4usv\0"
-   "\0"
-   /* _mesa_function_pool[7192]: Fogi (offset 155) */
-   "ii\0"
-   "glFogi\0"
-   "\0"
-   /* _mesa_function_pool[7203]: DepthRange (offset 288) */
-   "dd\0"
-   "glDepthRange\0"
-   "\0"
-   /* _mesa_function_pool[7220]: RasterPos3iv (offset 75) */
-   "p\0"
-   "glRasterPos3iv\0"
-   "\0"
-   /* _mesa_function_pool[7238]: FinalCombinerInputNV (will be remapped) */
-   "iiii\0"
-   "glFinalCombinerInputNV\0"
-   "\0"
-   /* _mesa_function_pool[7267]: TexCoord2i (offset 106) */
-   "ii\0"
-   "glTexCoord2i\0"
-   "\0"
-   /* _mesa_function_pool[7284]: PixelMapfv (offset 251) */
-   "iip\0"
-   "glPixelMapfv\0"
-   "\0"
-   /* _mesa_function_pool[7302]: Color4ui (offset 37) */
-   "iiii\0"
-   "glColor4ui\0"
-   "\0"
-   /* _mesa_function_pool[7319]: RasterPos3s (offset 76) */
-   "iii\0"
-   "glRasterPos3s\0"
-   "\0"
-   /* _mesa_function_pool[7338]: Color3usv (offset 24) */
-   "p\0"
-   "glColor3usv\0"
-   "\0"
-   /* _mesa_function_pool[7353]: FlushRasterSGIX (dynamic) */
-   "\0"
-   "glFlushRasterSGIX\0"
-   "\0"
-   /* _mesa_function_pool[7373]: TexCoord2f (offset 104) */
-   "ff\0"
-   "glTexCoord2f\0"
-   "\0"
-   /* _mesa_function_pool[7390]: ReplacementCodeuiTexCoord2fVertex3fSUN (dynamic) */
-   "ifffff\0"
-   "glReplacementCodeuiTexCoord2fVertex3fSUN\0"
-   "\0"
-   /* _mesa_function_pool[7439]: TexCoord2d (offset 102) */
-   "dd\0"
-   "glTexCoord2d\0"
-   "\0"
-   /* _mesa_function_pool[7456]: RasterPos3d (offset 70) */
-   "ddd\0"
-   "glRasterPos3d\0"
-   "\0"
-   /* _mesa_function_pool[7475]: RasterPos3f (offset 72) */
-   "fff\0"
-   "glRasterPos3f\0"
-   "\0"
-   /* _mesa_function_pool[7494]: Uniform1fARB (will be remapped) */
-   "if\0"
-   "glUniform1f\0"
-   "glUniform1fARB\0"
-   "\0"
-   /* _mesa_function_pool[7525]: AreTexturesResident (offset 322) */
-   "ipp\0"
-   "glAreTexturesResident\0"
-   "glAreTexturesResidentEXT\0"
-   "\0"
-   /* _mesa_function_pool[7577]: TexCoord2s (offset 108) */
-   "ii\0"
-   "glTexCoord2s\0"
-   "\0"
-   /* _mesa_function_pool[7594]: StencilOpSeparate (will be remapped) */
-   "iiii\0"
-   "glStencilOpSeparate\0"
-   "glStencilOpSeparateATI\0"
-   "\0"
-   /* _mesa_function_pool[7643]: ColorTableParameteriv (offset 341) */
-   "iip\0"
-   "glColorTableParameteriv\0"
-   "glColorTableParameterivSGI\0"
-   "\0"
-   /* _mesa_function_pool[7699]: FogCoordPointerListIBM (dynamic) */
-   "iipi\0"
-   "glFogCoordPointerListIBM\0"
-   "\0"
-   /* _mesa_function_pool[7730]: WindowPos3dMESA (will be remapped) */
-   "ddd\0"
-   "glWindowPos3d\0"
-   "glWindowPos3dARB\0"
-   "glWindowPos3dMESA\0"
-   "\0"
-   /* _mesa_function_pool[7784]: Color4us (offset 39) */
-   "iiii\0"
-   "glColor4us\0"
-   "\0"
-   /* _mesa_function_pool[7801]: PointParameterfvEXT (will be remapped) */
-   "ip\0"
-   "glPointParameterfv\0"
-   "glPointParameterfvARB\0"
-   "glPointParameterfvEXT\0"
-   "glPointParameterfvSGIS\0"
-   "\0"
-   /* _mesa_function_pool[7891]: Color3bv (offset 10) */
-   "p\0"
-   "glColor3bv\0"
-   "\0"
-   /* _mesa_function_pool[7905]: WindowPos2fvMESA (will be remapped) */
-   "p\0"
-   "glWindowPos2fv\0"
-   "glWindowPos2fvARB\0"
-   "glWindowPos2fvMESA\0"
-   "\0"
-   /* _mesa_function_pool[7960]: SecondaryColor3bvEXT (will be remapped) */
-   "p\0"
-   "glSecondaryColor3bv\0"
-   "glSecondaryColor3bvEXT\0"
-   "\0"
-   /* _mesa_function_pool[8006]: VertexPointerListIBM (dynamic) */
-   "iiipi\0"
-   "glVertexPointerListIBM\0"
-   "\0"
-   /* _mesa_function_pool[8036]: GetProgramLocalParameterfvARB (will be remapped) */
-   "iip\0"
-   "glGetProgramLocalParameterfvARB\0"
-   "\0"
-   /* _mesa_function_pool[8073]: FragmentMaterialfSGIX (dynamic) */
-   "iif\0"
-   "glFragmentMaterialfSGIX\0"
-   "\0"
-   /* _mesa_function_pool[8102]: TexCoord2fNormal3fVertex3fSUN (dynamic) */
-   "ffffffff\0"
-   "glTexCoord2fNormal3fVertex3fSUN\0"
-   "\0"
-   /* _mesa_function_pool[8144]: RenderbufferStorageEXT (will be remapped) */
-   "iiii\0"
-   "glRenderbufferStorage\0"
-   "glRenderbufferStorageEXT\0"
-   "\0"
-   /* _mesa_function_pool[8197]: IsFenceNV (will be remapped) */
-   "i\0"
-   "glIsFenceNV\0"
-   "\0"
-   /* _mesa_function_pool[8212]: AttachObjectARB (will be remapped) */
-   "ii\0"
-   "glAttachObjectARB\0"
-   "\0"
-   /* _mesa_function_pool[8234]: GetFragmentLightivSGIX (dynamic) */
-   "iip\0"
-   "glGetFragmentLightivSGIX\0"
-   "\0"
-   /* _mesa_function_pool[8264]: UniformMatrix2fvARB (will be remapped) */
-   "iiip\0"
-   "glUniformMatrix2fv\0"
-   "glUniformMatrix2fvARB\0"
-   "\0"
-   /* _mesa_function_pool[8311]: MultiTexCoord2fARB (offset 386) */
-   "iff\0"
-   "glMultiTexCoord2f\0"
-   "glMultiTexCoord2fARB\0"
-   "\0"
-   /* _mesa_function_pool[8355]: ColorTable (offset 339) */
-   "iiiiip\0"
-   "glColorTable\0"
-   "glColorTableSGI\0"
-   "glColorTableEXT\0"
-   "\0"
-   /* _mesa_function_pool[8408]: IndexPointer (offset 314) */
-   "iip\0"
-   "glIndexPointer\0"
-   "\0"
-   /* _mesa_function_pool[8428]: Accum (offset 213) */
-   "if\0"
-   "glAccum\0"
-   "\0"
-   /* _mesa_function_pool[8440]: GetTexImage (offset 281) */
-   "iiiip\0"
-   "glGetTexImage\0"
-   "\0"
-   /* _mesa_function_pool[8461]: MapControlPointsNV (dynamic) */
-   "iiiiiiiip\0"
-   "glMapControlPointsNV\0"
-   "\0"
-   /* _mesa_function_pool[8493]: ConvolutionFilter2D (offset 349) */
-   "iiiiiip\0"
-   "glConvolutionFilter2D\0"
-   "glConvolutionFilter2DEXT\0"
-   "\0"
-   /* _mesa_function_pool[8549]: Finish (offset 216) */
-   "\0"
-   "glFinish\0"
-   "\0"
-   /* _mesa_function_pool[8560]: MapParameterfvNV (dynamic) */
-   "iip\0"
-   "glMapParameterfvNV\0"
-   "\0"
-   /* _mesa_function_pool[8584]: ClearStencil (offset 207) */
-   "i\0"
-   "glClearStencil\0"
-   "\0"
-   /* _mesa_function_pool[8602]: VertexAttrib3dvARB (will be remapped) */
-   "ip\0"
-   "glVertexAttrib3dv\0"
-   "glVertexAttrib3dvARB\0"
-   "\0"
-   /* _mesa_function_pool[8645]: Uniform4uivEXT (will be remapped) */
-   "iip\0"
-   "glUniform4uivEXT\0"
-   "glUniform4uiv\0"
-   "\0"
-   /* _mesa_function_pool[8681]: HintPGI (dynamic) */
-   "ii\0"
-   "glHintPGI\0"
-   "\0"
-   /* _mesa_function_pool[8695]: ConvolutionParameteriv (offset 353) */
-   "iip\0"
-   "glConvolutionParameteriv\0"
-   "glConvolutionParameterivEXT\0"
-   "\0"
-   /* _mesa_function_pool[8753]: Color4s (offset 33) */
-   "iiii\0"
-   "glColor4s\0"
-   "\0"
-   /* _mesa_function_pool[8769]: InterleavedArrays (offset 317) */
-   "iip\0"
-   "glInterleavedArrays\0"
-   "\0"
-   /* _mesa_function_pool[8794]: RasterPos2fv (offset 65) */
-   "p\0"
-   "glRasterPos2fv\0"
-   "\0"
-   /* _mesa_function_pool[8812]: TexCoord1fv (offset 97) */
-   "p\0"
-   "glTexCoord1fv\0"
-   "\0"
-   /* _mesa_function_pool[8829]: Vertex2d (offset 126) */
-   "dd\0"
-   "glVertex2d\0"
-   "\0"
-   /* _mesa_function_pool[8844]: CullParameterdvEXT (dynamic) */
-   "ip\0"
-   "glCullParameterdvEXT\0"
-   "\0"
-   /* _mesa_function_pool[8869]: ProgramNamedParameter4fNV (will be remapped) */
-   "iipffff\0"
-   "glProgramNamedParameter4fNV\0"
-   "\0"
-   /* _mesa_function_pool[8906]: Color3fVertex3fSUN (dynamic) */
-   "ffffff\0"
-   "glColor3fVertex3fSUN\0"
-   "\0"
-   /* _mesa_function_pool[8935]: ProgramEnvParameter4fvARB (will be remapped) */
-   "iip\0"
-   "glProgramEnvParameter4fvARB\0"
-   "glProgramParameter4fvNV\0"
-   "\0"
-   /* _mesa_function_pool[8992]: Color4i (offset 31) */
-   "iiii\0"
-   "glColor4i\0"
-   "\0"
-   /* _mesa_function_pool[9008]: Color4f (offset 29) */
-   "ffff\0"
-   "glColor4f\0"
-   "\0"
-   /* _mesa_function_pool[9024]: RasterPos4fv (offset 81) */
-   "p\0"
-   "glRasterPos4fv\0"
-   "\0"
-   /* _mesa_function_pool[9042]: Color4d (offset 27) */
-   "dddd\0"
-   "glColor4d\0"
-   "\0"
-   /* _mesa_function_pool[9058]: ClearIndex (offset 205) */
-   "f\0"
-   "glClearIndex\0"
-   "\0"
-   /* _mesa_function_pool[9074]: Color4b (offset 25) */
-   "iiii\0"
-   "glColor4b\0"
-   "\0"
-   /* _mesa_function_pool[9090]: LoadMatrixd (offset 292) */
-   "p\0"
-   "glLoadMatrixd\0"
-   "\0"
-   /* _mesa_function_pool[9107]: FragmentLightModeliSGIX (dynamic) */
-   "ii\0"
-   "glFragmentLightModeliSGIX\0"
-   "\0"
-   /* _mesa_function_pool[9137]: RasterPos2dv (offset 63) */
-   "p\0"
-   "glRasterPos2dv\0"
-   "\0"
-   /* _mesa_function_pool[9155]: ConvolutionParameterfv (offset 351) */
-   "iip\0"
-   "glConvolutionParameterfv\0"
-   "glConvolutionParameterfvEXT\0"
-   "\0"
-   /* _mesa_function_pool[9213]: TbufferMask3DFX (dynamic) */
-   "i\0"
-   "glTbufferMask3DFX\0"
-   "\0"
-   /* _mesa_function_pool[9234]: GetTexGendv (offset 278) */
-   "iip\0"
-   "glGetTexGendv\0"
-   "\0"
-   /* _mesa_function_pool[9253]: GetVertexAttribfvNV (will be remapped) */
-   "iip\0"
-   "glGetVertexAttribfvNV\0"
-   "\0"
-   /* _mesa_function_pool[9280]: BeginTransformFeedbackEXT (will be remapped) */
-   "i\0"
-   "glBeginTransformFeedbackEXT\0"
-   "glBeginTransformFeedback\0"
-   "\0"
-   /* _mesa_function_pool[9336]: LoadProgramNV (will be remapped) */
-   "iiip\0"
-   "glLoadProgramNV\0"
-   "\0"
-   /* _mesa_function_pool[9358]: WaitSync (will be remapped) */
-   "iii\0"
-   "glWaitSync\0"
-   "\0"
-   /* _mesa_function_pool[9374]: EndList (offset 1) */
-   "\0"
-   "glEndList\0"
-   "\0"
-   /* _mesa_function_pool[9386]: VertexAttrib4fvNV (will be remapped) */
-   "ip\0"
-   "glVertexAttrib4fvNV\0"
-   "\0"
-   /* _mesa_function_pool[9410]: GetAttachedObjectsARB (will be remapped) */
-   "iipp\0"
-   "glGetAttachedObjectsARB\0"
-   "\0"
-   /* _mesa_function_pool[9440]: Uniform3fvARB (will be remapped) */
-   "iip\0"
-   "glUniform3fv\0"
-   "glUniform3fvARB\0"
-   "\0"
-   /* _mesa_function_pool[9474]: EvalCoord1fv (offset 231) */
-   "p\0"
-   "glEvalCoord1fv\0"
-   "\0"
-   /* _mesa_function_pool[9492]: DrawRangeElements (offset 338) */
-   "iiiiip\0"
-   "glDrawRangeElements\0"
-   "glDrawRangeElementsEXT\0"
-   "\0"
-   /* _mesa_function_pool[9543]: EvalMesh2 (offset 238) */
-   "iiiii\0"
-   "glEvalMesh2\0"
-   "\0"
-   /* _mesa_function_pool[9562]: Vertex4fv (offset 145) */
-   "p\0"
-   "glVertex4fv\0"
-   "\0"
-   /* _mesa_function_pool[9577]: GenTransformFeedbacks (will be remapped) */
-   "ip\0"
-   "glGenTransformFeedbacks\0"
-   "\0"
-   /* _mesa_function_pool[9605]: SpriteParameterfvSGIX (dynamic) */
-   "ip\0"
-   "glSpriteParameterfvSGIX\0"
-   "\0"
-   /* _mesa_function_pool[9633]: CheckFramebufferStatusEXT (will be remapped) */
-   "i\0"
-   "glCheckFramebufferStatus\0"
-   "glCheckFramebufferStatusEXT\0"
-   "\0"
-   /* _mesa_function_pool[9689]: GlobalAlphaFactoruiSUN (dynamic) */
-   "i\0"
-   "glGlobalAlphaFactoruiSUN\0"
-   "\0"
-   /* _mesa_function_pool[9717]: GetHandleARB (will be remapped) */
-   "i\0"
-   "glGetHandleARB\0"
-   "\0"
-   /* _mesa_function_pool[9735]: GetVertexAttribivARB (will be remapped) */
-   "iip\0"
-   "glGetVertexAttribiv\0"
-   "glGetVertexAttribivARB\0"
-   "\0"
-   /* _mesa_function_pool[9783]: BlendFunciARB (will be remapped) */
-   "iii\0"
-   "glBlendFunciARB\0"
-   "\0"
-   /* _mesa_function_pool[9804]: GetCombinerInputParameterfvNV (will be remapped) */
-   "iiiip\0"
-   "glGetCombinerInputParameterfvNV\0"
-   "\0"
-   /* _mesa_function_pool[9843]: GetTexParameterIivEXT (will be remapped) */
-   "iip\0"
-   "glGetTexParameterIivEXT\0"
-   "glGetTexParameterIiv\0"
-   "\0"
-   /* _mesa_function_pool[9893]: CreateProgram (will be remapped) */
-   "\0"
-   "glCreateProgram\0"
-   "\0"
-   /* _mesa_function_pool[9911]: LoadTransposeMatrixdARB (will be remapped) */
-   "p\0"
-   "glLoadTransposeMatrixd\0"
-   "glLoadTransposeMatrixdARB\0"
-   "\0"
-   /* _mesa_function_pool[9963]: ReleaseShaderCompiler (will be remapped) */
-   "\0"
-   "glReleaseShaderCompiler\0"
-   "\0"
-   /* _mesa_function_pool[9989]: GetMinmax (offset 364) */
-   "iiiip\0"
-   "glGetMinmax\0"
-   "glGetMinmaxEXT\0"
-   "\0"
-   /* _mesa_function_pool[10023]: StencilFuncSeparate (will be remapped) */
-   "iiii\0"
-   "glStencilFuncSeparate\0"
-   "\0"
-   /* _mesa_function_pool[10051]: SecondaryColor3sEXT (will be remapped) */
-   "iii\0"
-   "glSecondaryColor3s\0"
-   "glSecondaryColor3sEXT\0"
-   "\0"
-   /* _mesa_function_pool[10097]: Color3fVertex3fvSUN (dynamic) */
-   "pp\0"
-   "glColor3fVertex3fvSUN\0"
-   "\0"
-   /* _mesa_function_pool[10123]: GetInteger64i_v (will be remapped) */
-   "iip\0"
-   "glGetInteger64i_v\0"
-   "\0"
-   /* _mesa_function_pool[10146]: Normal3fv (offset 57) */
-   "p\0"
-   "glNormal3fv\0"
-   "\0"
-   /* _mesa_function_pool[10161]: GlobalAlphaFactorbSUN (dynamic) */
-   "i\0"
-   "glGlobalAlphaFactorbSUN\0"
-   "\0"
-   /* _mesa_function_pool[10188]: Color3us (offset 23) */
-   "iii\0"
-   "glColor3us\0"
-   "\0"
-   /* _mesa_function_pool[10204]: ImageTransformParameterfvHP (dynamic) */
-   "iip\0"
-   "glImageTransformParameterfvHP\0"
-   "\0"
-   /* _mesa_function_pool[10239]: VertexAttrib4ivARB (will be remapped) */
-   "ip\0"
-   "glVertexAttrib4iv\0"
-   "glVertexAttrib4ivARB\0"
-   "\0"
-   /* _mesa_function_pool[10282]: End (offset 43) */
-   "\0"
-   "glEnd\0"
-   "\0"
-   /* _mesa_function_pool[10290]: VertexAttrib3fNV (will be remapped) */
-   "ifff\0"
-   "glVertexAttrib3fNV\0"
-   "\0"
-   /* _mesa_function_pool[10315]: VertexAttribs2dvNV (will be remapped) */
-   "iip\0"
-   "glVertexAttribs2dvNV\0"
-   "\0"
-   /* _mesa_function_pool[10341]: GetQueryObjectui64vEXT (will be remapped) */
-   "iip\0"
-   "glGetQueryObjectui64vEXT\0"
-   "\0"
-   /* _mesa_function_pool[10371]: MultiTexCoord3fvARB (offset 395) */
-   "ip\0"
-   "glMultiTexCoord3fv\0"
-   "glMultiTexCoord3fvARB\0"
-   "\0"
-   /* _mesa_function_pool[10416]: SecondaryColor3dEXT (will be remapped) */
-   "ddd\0"
-   "glSecondaryColor3d\0"
-   "glSecondaryColor3dEXT\0"
-   "\0"
-   /* _mesa_function_pool[10462]: Color3ub (offset 19) */
-   "iii\0"
-   "glColor3ub\0"
-   "\0"
-   /* _mesa_function_pool[10478]: GetProgramParameterfvNV (will be remapped) */
-   "iiip\0"
-   "glGetProgramParameterfvNV\0"
-   "\0"
-   /* _mesa_function_pool[10510]: TangentPointerEXT (dynamic) */
-   "iip\0"
-   "glTangentPointerEXT\0"
-   "\0"
-   /* _mesa_function_pool[10535]: Color4fNormal3fVertex3fvSUN (dynamic) */
-   "ppp\0"
-   "glColor4fNormal3fVertex3fvSUN\0"
-   "\0"
-   /* _mesa_function_pool[10570]: GetInstrumentsSGIX (dynamic) */
-   "\0"
-   "glGetInstrumentsSGIX\0"
-   "\0"
-   /* _mesa_function_pool[10593]: GetUniformuivEXT (will be remapped) */
-   "iip\0"
-   "glGetUniformuivEXT\0"
-   "glGetUniformuiv\0"
-   "\0"
-   /* _mesa_function_pool[10633]: Color3ui (offset 21) */
-   "iii\0"
-   "glColor3ui\0"
-   "\0"
-   /* _mesa_function_pool[10649]: EvalMapsNV (dynamic) */
-   "ii\0"
-   "glEvalMapsNV\0"
-   "\0"
-   /* _mesa_function_pool[10666]: TexSubImage2D (offset 333) */
-   "iiiiiiiip\0"
-   "glTexSubImage2D\0"
-   "glTexSubImage2DEXT\0"
-   "\0"
-   /* _mesa_function_pool[10712]: FragmentLightivSGIX (dynamic) */
-   "iip\0"
-   "glFragmentLightivSGIX\0"
-   "\0"
-   /* _mesa_function_pool[10739]: GetTexParameterPointervAPPLE (will be remapped) */
-   "iip\0"
-   "glGetTexParameterPointervAPPLE\0"
-   "\0"
-   /* _mesa_function_pool[10775]: TexGenfv (offset 191) */
-   "iip\0"
-   "glTexGenfv\0"
-   "\0"
-   /* _mesa_function_pool[10791]: GetTransformFeedbackVaryingEXT (will be remapped) */
-   "iiipppp\0"
-   "glGetTransformFeedbackVaryingEXT\0"
-   "glGetTransformFeedbackVarying\0"
-   "\0"
-   /* _mesa_function_pool[10863]: VertexAttrib4bvARB (will be remapped) */
-   "ip\0"
-   "glVertexAttrib4bv\0"
-   "glVertexAttrib4bvARB\0"
-   "\0"
-   /* _mesa_function_pool[10906]: ShaderBinary (will be remapped) */
-   "ipipi\0"
-   "glShaderBinary\0"
-   "\0"
-   /* _mesa_function_pool[10928]: GetIntegerIndexedvEXT (will be remapped) */
-   "iip\0"
-   "glGetIntegerIndexedvEXT\0"
-   "glGetIntegeri_v\0"
-   "\0"
-   /* _mesa_function_pool[10973]: MultiTexCoord4sARB (offset 406) */
-   "iiiii\0"
-   "glMultiTexCoord4s\0"
-   "glMultiTexCoord4sARB\0"
-   "\0"
-   /* _mesa_function_pool[11019]: GetFragmentMaterialivSGIX (dynamic) */
-   "iip\0"
-   "glGetFragmentMaterialivSGIX\0"
-   "\0"
-   /* _mesa_function_pool[11052]: WindowPos4dMESA (will be remapped) */
-   "dddd\0"
-   "glWindowPos4dMESA\0"
-   "\0"
-   /* _mesa_function_pool[11076]: WeightPointerARB (dynamic) */
-   "iiip\0"
-   "glWeightPointerARB\0"
-   "\0"
-   /* _mesa_function_pool[11101]: WindowPos2dMESA (will be remapped) */
-   "dd\0"
-   "glWindowPos2d\0"
-   "glWindowPos2dARB\0"
-   "glWindowPos2dMESA\0"
-   "\0"
-   /* _mesa_function_pool[11154]: FramebufferTexture3DEXT (will be remapped) */
-   "iiiiii\0"
-   "glFramebufferTexture3D\0"
-   "glFramebufferTexture3DEXT\0"
-   "\0"
-   /* _mesa_function_pool[11211]: BlendEquation (offset 337) */
-   "i\0"
-   "glBlendEquation\0"
-   "glBlendEquationEXT\0"
-   "\0"
-   /* _mesa_function_pool[11249]: VertexAttrib3dNV (will be remapped) */
-   "iddd\0"
-   "glVertexAttrib3dNV\0"
-   "\0"
-   /* _mesa_function_pool[11274]: VertexAttrib3dARB (will be remapped) */
-   "iddd\0"
-   "glVertexAttrib3d\0"
-   "glVertexAttrib3dARB\0"
-   "\0"
-   /* _mesa_function_pool[11317]: VertexAttribI4usvEXT (will be remapped) */
-   "ip\0"
-   "glVertexAttribI4usvEXT\0"
-   "glVertexAttribI4usv\0"
-   "\0"
-   /* _mesa_function_pool[11364]: ReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (dynamic) */
-   "ppppp\0"
-   "glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN\0"
-   "\0"
-   /* _mesa_function_pool[11428]: VertexAttrib4fARB (will be remapped) */
-   "iffff\0"
-   "glVertexAttrib4f\0"
-   "glVertexAttrib4fARB\0"
-   "\0"
-   /* _mesa_function_pool[11472]: GetError (offset 261) */
-   "\0"
-   "glGetError\0"
-   "\0"
-   /* _mesa_function_pool[11485]: IndexFuncEXT (dynamic) */
-   "if\0"
-   "glIndexFuncEXT\0"
-   "\0"
-   /* _mesa_function_pool[11504]: TexCoord3dv (offset 111) */
-   "p\0"
-   "glTexCoord3dv\0"
-   "\0"
-   /* _mesa_function_pool[11521]: Indexdv (offset 45) */
-   "p\0"
-   "glIndexdv\0"
-   "\0"
-   /* _mesa_function_pool[11534]: FramebufferTexture2DEXT (will be remapped) */
-   "iiiii\0"
-   "glFramebufferTexture2D\0"
-   "glFramebufferTexture2DEXT\0"
-   "\0"
-   /* _mesa_function_pool[11590]: Normal3s (offset 60) */
-   "iii\0"
-   "glNormal3s\0"
-   "\0"
-   /* _mesa_function_pool[11606]: GetObjectParameterivAPPLE (will be remapped) */
-   "iiip\0"
-   "glGetObjectParameterivAPPLE\0"
-   "\0"
-   /* _mesa_function_pool[11640]: PushName (offset 201) */
-   "i\0"
-   "glPushName\0"
-   "\0"
-   /* _mesa_function_pool[11654]: MultiTexCoord2dvARB (offset 385) */
-   "ip\0"
-   "glMultiTexCoord2dv\0"
-   "glMultiTexCoord2dvARB\0"
-   "\0"
-   /* _mesa_function_pool[11699]: CullParameterfvEXT (dynamic) */
-   "ip\0"
-   "glCullParameterfvEXT\0"
-   "\0"
-   /* _mesa_function_pool[11724]: Normal3i (offset 58) */
-   "iii\0"
-   "glNormal3i\0"
-   "\0"
-   /* _mesa_function_pool[11740]: ProgramNamedParameter4fvNV (will be remapped) */
-   "iipp\0"
-   "glProgramNamedParameter4fvNV\0"
-   "\0"
-   /* _mesa_function_pool[11775]: SecondaryColorPointerEXT (will be remapped) */
-   "iiip\0"
-   "glSecondaryColorPointer\0"
-   "glSecondaryColorPointerEXT\0"
-   "\0"
-   /* _mesa_function_pool[11832]: VertexAttrib4fvARB (will be remapped) */
-   "ip\0"
-   "glVertexAttrib4fv\0"
-   "glVertexAttrib4fvARB\0"
-   "\0"
-   /* _mesa_function_pool[11875]: ColorPointerListIBM (dynamic) */
-   "iiipi\0"
-   "glColorPointerListIBM\0"
-   "\0"
-   /* _mesa_function_pool[11904]: GetActiveUniformARB (will be remapped) */
-   "iiipppp\0"
-   "glGetActiveUniform\0"
-   "glGetActiveUniformARB\0"
-   "\0"
-   /* _mesa_function_pool[11954]: ImageTransformParameteriHP (dynamic) */
-   "iii\0"
-   "glImageTransformParameteriHP\0"
-   "\0"
-   /* _mesa_function_pool[11988]: Normal3b (offset 52) */
-   "iii\0"
-   "glNormal3b\0"
-   "\0"
-   /* _mesa_function_pool[12004]: Normal3d (offset 54) */
-   "ddd\0"
-   "glNormal3d\0"
-   "\0"
-   /* _mesa_function_pool[12020]: Uniform1uiEXT (will be remapped) */
-   "ii\0"
-   "glUniform1uiEXT\0"
-   "glUniform1ui\0"
-   "\0"
-   /* _mesa_function_pool[12053]: Normal3f (offset 56) */
-   "fff\0"
-   "glNormal3f\0"
-   "\0"
-   /* _mesa_function_pool[12069]: MultiTexCoord1svARB (offset 383) */
-   "ip\0"
-   "glMultiTexCoord1sv\0"
-   "glMultiTexCoord1svARB\0"
-   "\0"
-   /* _mesa_function_pool[12114]: Indexi (offset 48) */
-   "i\0"
-   "glIndexi\0"
-   "\0"
-   /* _mesa_function_pool[12126]: EGLImageTargetTexture2DOES (will be remapped) */
-   "ip\0"
-   "glEGLImageTargetTexture2DOES\0"
-   "\0"
-   /* _mesa_function_pool[12159]: EndQueryARB (will be remapped) */
-   "i\0"
-   "glEndQuery\0"
-   "glEndQueryARB\0"
-   "\0"
-   /* _mesa_function_pool[12187]: DeleteFencesNV (will be remapped) */
-   "ip\0"
-   "glDeleteFencesNV\0"
-   "\0"
-   /* _mesa_function_pool[12208]: DeformationMap3dSGIX (dynamic) */
-   "iddiiddiiddiip\0"
-   "glDeformationMap3dSGIX\0"
-   "\0"
-   /* _mesa_function_pool[12247]: BindBufferRangeEXT (will be remapped) */
-   "iiiii\0"
-   "glBindBufferRangeEXT\0"
-   "glBindBufferRange\0"
-   "\0"
-   /* _mesa_function_pool[12293]: DepthMask (offset 211) */
-   "i\0"
-   "glDepthMask\0"
-   "\0"
-   /* _mesa_function_pool[12308]: IsShader (will be remapped) */
-   "i\0"
-   "glIsShader\0"
-   "\0"
-   /* _mesa_function_pool[12322]: Indexf (offset 46) */
-   "f\0"
-   "glIndexf\0"
-   "\0"
-   /* _mesa_function_pool[12334]: GetImageTransformParameterivHP (dynamic) */
-   "iip\0"
-   "glGetImageTransformParameterivHP\0"
-   "\0"
-   /* _mesa_function_pool[12372]: Indexd (offset 44) */
-   "d\0"
-   "glIndexd\0"
-   "\0"
-   /* _mesa_function_pool[12384]: GetMaterialiv (offset 270) */
-   "iip\0"
-   "glGetMaterialiv\0"
-   "\0"
-   /* _mesa_function_pool[12405]: StencilOp (offset 244) */
-   "iii\0"
-   "glStencilOp\0"
-   "\0"
-   /* _mesa_function_pool[12422]: WindowPos4ivMESA (will be remapped) */
-   "p\0"
-   "glWindowPos4ivMESA\0"
-   "\0"
-   /* _mesa_function_pool[12444]: FramebufferTextureLayer (dynamic) */
-   "iiiii\0"
-   "glFramebufferTextureLayerARB\0"
-   "\0"
-   /* _mesa_function_pool[12480]: MultiTexCoord3svARB (offset 399) */
-   "ip\0"
-   "glMultiTexCoord3sv\0"
-   "glMultiTexCoord3svARB\0"
-   "\0"
-   /* _mesa_function_pool[12525]: TexEnvfv (offset 185) */
-   "iip\0"
-   "glTexEnvfv\0"
-   "\0"
-   /* _mesa_function_pool[12541]: MultiTexCoord4iARB (offset 404) */
-   "iiiii\0"
-   "glMultiTexCoord4i\0"
-   "glMultiTexCoord4iARB\0"
-   "\0"
-   /* _mesa_function_pool[12587]: Indexs (offset 50) */
-   "i\0"
-   "glIndexs\0"
-   "\0"
-   /* _mesa_function_pool[12599]: Binormal3ivEXT (dynamic) */
-   "p\0"
-   "glBinormal3ivEXT\0"
-   "\0"
-   /* _mesa_function_pool[12619]: ResizeBuffersMESA (will be remapped) */
-   "\0"
-   "glResizeBuffersMESA\0"
-   "\0"
-   /* _mesa_function_pool[12641]: BlendFuncSeparateiARB (will be remapped) */
-   "iiiii\0"
-   "glBlendFuncSeparateiARB\0"
-   "\0"
-   /* _mesa_function_pool[12672]: GetUniformivARB (will be remapped) */
-   "iip\0"
-   "glGetUniformiv\0"
-   "glGetUniformivARB\0"
-   "\0"
-   /* _mesa_function_pool[12710]: PixelTexGenParameteriSGIS (will be remapped) */
-   "ii\0"
-   "glPixelTexGenParameteriSGIS\0"
-   "\0"
-   /* _mesa_function_pool[12742]: VertexPointervINTEL (dynamic) */
-   "iip\0"
-   "glVertexPointervINTEL\0"
-   "\0"
-   /* _mesa_function_pool[12769]: Vertex2i (offset 130) */
-   "ii\0"
-   "glVertex2i\0"
-   "\0"
-   /* _mesa_function_pool[12784]: LoadMatrixf (offset 291) */
-   "p\0"
-   "glLoadMatrixf\0"
-   "\0"
-   /* _mesa_function_pool[12801]: VertexAttribI1uivEXT (will be remapped) */
-   "ip\0"
-   "glVertexAttribI1uivEXT\0"
-   "glVertexAttribI1uiv\0"
-   "\0"
-   /* _mesa_function_pool[12848]: Vertex2f (offset 128) */
-   "ff\0"
-   "glVertex2f\0"
-   "\0"
-   /* _mesa_function_pool[12863]: ReplacementCodeuiColor4fNormal3fVertex3fvSUN (dynamic) */
-   "pppp\0"
-   "glReplacementCodeuiColor4fNormal3fVertex3fvSUN\0"
-   "\0"
-   /* _mesa_function_pool[12916]: Color4bv (offset 26) */
-   "p\0"
-   "glColor4bv\0"
-   "\0"
-   /* _mesa_function_pool[12930]: VertexPointer (offset 321) */
-   "iiip\0"
-   "glVertexPointer\0"
-   "\0"
-   /* _mesa_function_pool[12952]: SecondaryColor3uiEXT (will be remapped) */
-   "iii\0"
-   "glSecondaryColor3ui\0"
-   "glSecondaryColor3uiEXT\0"
-   "\0"
-   /* _mesa_function_pool[13000]: StartInstrumentsSGIX (dynamic) */
-   "\0"
-   "glStartInstrumentsSGIX\0"
-   "\0"
-   /* _mesa_function_pool[13025]: SecondaryColor3usvEXT (will be remapped) */
-   "p\0"
-   "glSecondaryColor3usv\0"
-   "glSecondaryColor3usvEXT\0"
-   "\0"
-   /* _mesa_function_pool[13073]: VertexAttrib2fvNV (will be remapped) */
-   "ip\0"
-   "glVertexAttrib2fvNV\0"
-   "\0"
-   /* _mesa_function_pool[13097]: ProgramLocalParameter4dvARB (will be remapped) */
-   "iip\0"
-   "glProgramLocalParameter4dvARB\0"
-   "\0"
-   /* _mesa_function_pool[13132]: DeleteLists (offset 4) */
-   "ii\0"
-   "glDeleteLists\0"
-   "\0"
-   /* _mesa_function_pool[13150]: LogicOp (offset 242) */
-   "i\0"
-   "glLogicOp\0"
-   "\0"
-   /* _mesa_function_pool[13163]: MatrixIndexuivARB (dynamic) */
-   "ip\0"
-   "glMatrixIndexuivARB\0"
-   "\0"
-   /* _mesa_function_pool[13187]: Vertex2s (offset 132) */
-   "ii\0"
-   "glVertex2s\0"
-   "\0"
-   /* _mesa_function_pool[13202]: RenderbufferStorageMultisample (will be remapped) */
-   "iiiii\0"
-   "glRenderbufferStorageMultisample\0"
-   "glRenderbufferStorageMultisampleEXT\0"
-   "\0"
-   /* _mesa_function_pool[13278]: TexCoord4fv (offset 121) */
-   "p\0"
-   "glTexCoord4fv\0"
-   "\0"
-   /* _mesa_function_pool[13295]: Tangent3sEXT (dynamic) */
-   "iii\0"
-   "glTangent3sEXT\0"
-   "\0"
-   /* _mesa_function_pool[13315]: GlobalAlphaFactorfSUN (dynamic) */
-   "f\0"
-   "glGlobalAlphaFactorfSUN\0"
-   "\0"
-   /* _mesa_function_pool[13342]: MultiTexCoord3iARB (offset 396) */
-   "iiii\0"
-   "glMultiTexCoord3i\0"
-   "glMultiTexCoord3iARB\0"
-   "\0"
-   /* _mesa_function_pool[13387]: IsProgram (will be remapped) */
-   "i\0"
-   "glIsProgram\0"
-   "\0"
-   /* _mesa_function_pool[13402]: TexCoordPointerListIBM (dynamic) */
-   "iiipi\0"
-   "glTexCoordPointerListIBM\0"
-   "\0"
-   /* _mesa_function_pool[13434]: VertexAttribI4svEXT (will be remapped) */
-   "ip\0"
-   "glVertexAttribI4svEXT\0"
-   "glVertexAttribI4sv\0"
-   "\0"
-   /* _mesa_function_pool[13479]: GlobalAlphaFactorusSUN (dynamic) */
-   "i\0"
-   "glGlobalAlphaFactorusSUN\0"
-   "\0"
-   /* _mesa_function_pool[13507]: VertexAttrib2dvNV (will be remapped) */
-   "ip\0"
-   "glVertexAttrib2dvNV\0"
-   "\0"
-   /* _mesa_function_pool[13531]: FramebufferRenderbufferEXT (will be remapped) */
-   "iiii\0"
-   "glFramebufferRenderbuffer\0"
-   "glFramebufferRenderbufferEXT\0"
-   "\0"
-   /* _mesa_function_pool[13592]: ClearBufferuiv (will be remapped) */
-   "iip\0"
-   "glClearBufferuiv\0"
-   "\0"
-   /* _mesa_function_pool[13614]: VertexAttrib1dvNV (will be remapped) */
-   "ip\0"
-   "glVertexAttrib1dvNV\0"
-   "\0"
-   /* _mesa_function_pool[13638]: GenTextures (offset 328) */
-   "ip\0"
-   "glGenTextures\0"
-   "glGenTexturesEXT\0"
-   "\0"
-   /* _mesa_function_pool[13673]: FramebufferTextureARB (will be remapped) */
-   "iiii\0"
-   "glFramebufferTextureARB\0"
-   "\0"
-   /* _mesa_function_pool[13703]: SetFenceNV (will be remapped) */
-   "ii\0"
-   "glSetFenceNV\0"
-   "\0"
-   /* _mesa_function_pool[13720]: FramebufferTexture1DEXT (will be remapped) */
-   "iiiii\0"
-   "glFramebufferTexture1D\0"
-   "glFramebufferTexture1DEXT\0"
-   "\0"
-   /* _mesa_function_pool[13776]: GetCombinerOutputParameterivNV (will be remapped) */
-   "iiip\0"
-   "glGetCombinerOutputParameterivNV\0"
-   "\0"
-   /* _mesa_function_pool[13815]: PixelTexGenParameterivSGIS (will be remapped) */
-   "ip\0"
-   "glPixelTexGenParameterivSGIS\0"
-   "\0"
-   /* _mesa_function_pool[13848]: TextureNormalEXT (dynamic) */
-   "i\0"
-   "glTextureNormalEXT\0"
-   "\0"
-   /* _mesa_function_pool[13870]: IndexPointerListIBM (dynamic) */
-   "iipi\0"
-   "glIndexPointerListIBM\0"
-   "\0"
-   /* _mesa_function_pool[13898]: WeightfvARB (dynamic) */
-   "ip\0"
-   "glWeightfvARB\0"
-   "\0"
-   /* _mesa_function_pool[13916]: RasterPos2sv (offset 69) */
-   "p\0"
-   "glRasterPos2sv\0"
-   "\0"
-   /* _mesa_function_pool[13934]: Color4ubv (offset 36) */
-   "p\0"
-   "glColor4ubv\0"
-   "\0"
-   /* _mesa_function_pool[13949]: DrawBuffer (offset 202) */
-   "i\0"
-   "glDrawBuffer\0"
-   "\0"
-   /* _mesa_function_pool[13965]: TexCoord2fv (offset 105) */
-   "p\0"
-   "glTexCoord2fv\0"
-   "\0"
-   /* _mesa_function_pool[13982]: WindowPos4fMESA (will be remapped) */
-   "ffff\0"
-   "glWindowPos4fMESA\0"
-   "\0"
-   /* _mesa_function_pool[14006]: TexCoord1sv (offset 101) */
-   "p\0"
-   "glTexCoord1sv\0"
-   "\0"
-   /* _mesa_function_pool[14023]: WindowPos3dvMESA (will be remapped) */
-   "p\0"
-   "glWindowPos3dv\0"
-   "glWindowPos3dvARB\0"
-   "glWindowPos3dvMESA\0"
-   "\0"
-   /* _mesa_function_pool[14078]: DepthFunc (offset 245) */
-   "i\0"
-   "glDepthFunc\0"
-   "\0"
-   /* _mesa_function_pool[14093]: PixelMapusv (offset 253) */
-   "iip\0"
-   "glPixelMapusv\0"
-   "\0"
-   /* _mesa_function_pool[14112]: GetQueryObjecti64vEXT (will be remapped) */
-   "iip\0"
-   "glGetQueryObjecti64vEXT\0"
-   "\0"
-   /* _mesa_function_pool[14141]: MultiTexCoord1dARB (offset 376) */
-   "id\0"
-   "glMultiTexCoord1d\0"
-   "glMultiTexCoord1dARB\0"
-   "\0"
-   /* _mesa_function_pool[14184]: PointParameterivNV (will be remapped) */
-   "ip\0"
-   "glPointParameteriv\0"
-   "glPointParameterivNV\0"
-   "\0"
-   /* _mesa_function_pool[14228]: BlendFunc (offset 241) */
-   "ii\0"
-   "glBlendFunc\0"
-   "\0"
-   /* _mesa_function_pool[14244]: EndTransformFeedbackEXT (will be remapped) */
-   "\0"
-   "glEndTransformFeedbackEXT\0"
-   "glEndTransformFeedback\0"
-   "\0"
-   /* _mesa_function_pool[14295]: Uniform2fvARB (will be remapped) */
-   "iip\0"
-   "glUniform2fv\0"
-   "glUniform2fvARB\0"
-   "\0"
-   /* _mesa_function_pool[14329]: BufferParameteriAPPLE (will be remapped) */
-   "iii\0"
-   "glBufferParameteriAPPLE\0"
-   "\0"
-   /* _mesa_function_pool[14358]: MultiTexCoord3dvARB (offset 393) */
-   "ip\0"
-   "glMultiTexCoord3dv\0"
-   "glMultiTexCoord3dvARB\0"
-   "\0"
-   /* _mesa_function_pool[14403]: ReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (dynamic) */
-   "pppp\0"
-   "glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN\0"
-   "\0"
-   /* _mesa_function_pool[14459]: DeleteObjectARB (will be remapped) */
-   "i\0"
-   "glDeleteObjectARB\0"
-   "\0"
-   /* _mesa_function_pool[14480]: GetShaderPrecisionFormat (will be remapped) */
-   "iipp\0"
-   "glGetShaderPrecisionFormat\0"
-   "\0"
-   /* _mesa_function_pool[14513]: MatrixIndexPointerARB (dynamic) */
-   "iiip\0"
-   "glMatrixIndexPointerARB\0"
-   "\0"
-   /* _mesa_function_pool[14543]: ProgramNamedParameter4dvNV (will be remapped) */
-   "iipp\0"
-   "glProgramNamedParameter4dvNV\0"
-   "\0"
-   /* _mesa_function_pool[14578]: Tangent3fvEXT (dynamic) */
-   "p\0"
-   "glTangent3fvEXT\0"
-   "\0"
-   /* _mesa_function_pool[14597]: Flush (offset 217) */
-   "\0"
-   "glFlush\0"
-   "\0"
-   /* _mesa_function_pool[14607]: Color4uiv (offset 38) */
-   "p\0"
-   "glColor4uiv\0"
-   "\0"
-   /* _mesa_function_pool[14622]: VertexAttribI4iEXT (will be remapped) */
-   "iiiii\0"
-   "glVertexAttribI4iEXT\0"
-   "glVertexAttribI4i\0"
-   "\0"
-   /* _mesa_function_pool[14668]: GenVertexArrays (will be remapped) */
-   "ip\0"
-   "glGenVertexArrays\0"
-   "\0"
-   /* _mesa_function_pool[14690]: Uniform3uivEXT (will be remapped) */
-   "iip\0"
-   "glUniform3uivEXT\0"
-   "glUniform3uiv\0"
-   "\0"
-   /* _mesa_function_pool[14726]: RasterPos3sv (offset 77) */
-   "p\0"
-   "glRasterPos3sv\0"
-   "\0"
-   /* _mesa_function_pool[14744]: BindFramebufferEXT (will be remapped) */
-   "ii\0"
-   "glBindFramebuffer\0"
-   "glBindFramebufferEXT\0"
-   "\0"
-   /* _mesa_function_pool[14787]: ReferencePlaneSGIX (dynamic) */
-   "p\0"
-   "glReferencePlaneSGIX\0"
-   "\0"
-   /* _mesa_function_pool[14811]: PushAttrib (offset 219) */
-   "i\0"
-   "glPushAttrib\0"
-   "\0"
-   /* _mesa_function_pool[14827]: RasterPos2i (offset 66) */
-   "ii\0"
-   "glRasterPos2i\0"
-   "\0"
-   /* _mesa_function_pool[14845]: ValidateProgramARB (will be remapped) */
-   "i\0"
-   "glValidateProgram\0"
-   "glValidateProgramARB\0"
-   "\0"
-   /* _mesa_function_pool[14887]: TexParameteriv (offset 181) */
-   "iip\0"
-   "glTexParameteriv\0"
-   "\0"
-   /* _mesa_function_pool[14909]: UnlockArraysEXT (will be remapped) */
-   "\0"
-   "glUnlockArraysEXT\0"
-   "\0"
-   /* _mesa_function_pool[14929]: TexCoord2fColor3fVertex3fSUN (dynamic) */
-   "ffffffff\0"
-   "glTexCoord2fColor3fVertex3fSUN\0"
-   "\0"
-   /* _mesa_function_pool[14970]: WindowPos3fvMESA (will be remapped) */
-   "p\0"
-   "glWindowPos3fv\0"
-   "glWindowPos3fvARB\0"
-   "glWindowPos3fvMESA\0"
-   "\0"
-   /* _mesa_function_pool[15025]: RasterPos2f (offset 64) */
-   "ff\0"
-   "glRasterPos2f\0"
-   "\0"
-   /* _mesa_function_pool[15043]: VertexAttrib1svNV (will be remapped) */
-   "ip\0"
-   "glVertexAttrib1svNV\0"
-   "\0"
-   /* _mesa_function_pool[15067]: RasterPos2d (offset 62) */
-   "dd\0"
-   "glRasterPos2d\0"
-   "\0"
-   /* _mesa_function_pool[15085]: RasterPos3fv (offset 73) */
-   "p\0"
-   "glRasterPos3fv\0"
-   "\0"
-   /* _mesa_function_pool[15103]: CopyTexSubImage3D (offset 373) */
-   "iiiiiiiii\0"
-   "glCopyTexSubImage3D\0"
-   "glCopyTexSubImage3DEXT\0"
-   "\0"
-   /* _mesa_function_pool[15157]: VertexAttrib2dARB (will be remapped) */
-   "idd\0"
-   "glVertexAttrib2d\0"
-   "glVertexAttrib2dARB\0"
-   "\0"
-   /* _mesa_function_pool[15199]: Color4ub (offset 35) */
-   "iiii\0"
-   "glColor4ub\0"
-   "\0"
-   /* _mesa_function_pool[15216]: GetInteger64v (will be remapped) */
-   "ip\0"
-   "glGetInteger64v\0"
-   "\0"
-   /* _mesa_function_pool[15236]: TextureColorMaskSGIS (dynamic) */
-   "iiii\0"
-   "glTextureColorMaskSGIS\0"
-   "\0"
-   /* _mesa_function_pool[15265]: RasterPos2s (offset 68) */
-   "ii\0"
-   "glRasterPos2s\0"
-   "\0"
-   /* _mesa_function_pool[15283]: GetColorTable (offset 343) */
-   "iiip\0"
-   "glGetColorTable\0"
-   "glGetColorTableSGI\0"
-   "glGetColorTableEXT\0"
-   "\0"
-   /* _mesa_function_pool[15343]: SelectBuffer (offset 195) */
-   "ip\0"
-   "glSelectBuffer\0"
-   "\0"
-   /* _mesa_function_pool[15362]: Indexiv (offset 49) */
-   "p\0"
-   "glIndexiv\0"
-   "\0"
-   /* _mesa_function_pool[15375]: TexCoord3i (offset 114) */
-   "iii\0"
-   "glTexCoord3i\0"
-   "\0"
-   /* _mesa_function_pool[15393]: CopyColorTable (offset 342) */
-   "iiiii\0"
-   "glCopyColorTable\0"
-   "glCopyColorTableSGI\0"
-   "\0"
-   /* _mesa_function_pool[15437]: GetHistogramParameterfv (offset 362) */
-   "iip\0"
-   "glGetHistogramParameterfv\0"
-   "glGetHistogramParameterfvEXT\0"
-   "\0"
-   /* _mesa_function_pool[15497]: Frustum (offset 289) */
-   "dddddd\0"
-   "glFrustum\0"
-   "\0"
-   /* _mesa_function_pool[15515]: GetString (offset 275) */
-   "i\0"
-   "glGetString\0"
-   "\0"
-   /* _mesa_function_pool[15530]: ColorPointervINTEL (dynamic) */
-   "iip\0"
-   "glColorPointervINTEL\0"
-   "\0"
-   /* _mesa_function_pool[15556]: TexEnvf (offset 184) */
-   "iif\0"
-   "glTexEnvf\0"
-   "\0"
-   /* _mesa_function_pool[15571]: TexCoord3d (offset 110) */
-   "ddd\0"
-   "glTexCoord3d\0"
-   "\0"
-   /* _mesa_function_pool[15589]: AlphaFragmentOp1ATI (will be remapped) */
-   "iiiiii\0"
-   "glAlphaFragmentOp1ATI\0"
-   "\0"
-   /* _mesa_function_pool[15619]: TexCoord3f (offset 112) */
-   "fff\0"
-   "glTexCoord3f\0"
-   "\0"
-   /* _mesa_function_pool[15637]: MultiTexCoord3ivARB (offset 397) */
-   "ip\0"
-   "glMultiTexCoord3iv\0"
-   "glMultiTexCoord3ivARB\0"
-   "\0"
-   /* _mesa_function_pool[15682]: MultiTexCoord2sARB (offset 390) */
-   "iii\0"
-   "glMultiTexCoord2s\0"
-   "glMultiTexCoord2sARB\0"
-   "\0"
-   /* _mesa_function_pool[15726]: VertexAttrib1dvARB (will be remapped) */
-   "ip\0"
-   "glVertexAttrib1dv\0"
-   "glVertexAttrib1dvARB\0"
-   "\0"
-   /* _mesa_function_pool[15769]: DeleteTextures (offset 327) */
-   "ip\0"
-   "glDeleteTextures\0"
-   "glDeleteTexturesEXT\0"
-   "\0"
-   /* _mesa_function_pool[15810]: TexCoordPointerEXT (will be remapped) */
-   "iiiip\0"
-   "glTexCoordPointerEXT\0"
-   "\0"
-   /* _mesa_function_pool[15838]: TexSubImage4DSGIS (dynamic) */
-   "iiiiiiiiiiiip\0"
-   "glTexSubImage4DSGIS\0"
-   "\0"
-   /* _mesa_function_pool[15873]: TexCoord3s (offset 116) */
-   "iii\0"
-   "glTexCoord3s\0"
-   "\0"
-   /* _mesa_function_pool[15891]: GetTexLevelParameteriv (offset 285) */
-   "iiip\0"
-   "glGetTexLevelParameteriv\0"
-   "\0"
-   /* _mesa_function_pool[15922]: CombinerStageParameterfvNV (dynamic) */
-   "iip\0"
-   "glCombinerStageParameterfvNV\0"
-   "\0"
-   /* _mesa_function_pool[15956]: StopInstrumentsSGIX (dynamic) */
-   "i\0"
-   "glStopInstrumentsSGIX\0"
-   "\0"
-   /* _mesa_function_pool[15981]: TexCoord4fColor4fNormal3fVertex4fSUN (dynamic) */
-   "fffffffffffffff\0"
-   "glTexCoord4fColor4fNormal3fVertex4fSUN\0"
-   "\0"
-   /* _mesa_function_pool[16037]: ClearAccum (offset 204) */
-   "ffff\0"
-   "glClearAccum\0"
-   "\0"
-   /* _mesa_function_pool[16056]: DeformSGIX (dynamic) */
-   "i\0"
-   "glDeformSGIX\0"
-   "\0"
-   /* _mesa_function_pool[16072]: GetVertexAttribfvARB (will be remapped) */
-   "iip\0"
-   "glGetVertexAttribfv\0"
-   "glGetVertexAttribfvARB\0"
-   "\0"
-   /* _mesa_function_pool[16120]: SecondaryColor3ivEXT (will be remapped) */
-   "p\0"
-   "glSecondaryColor3iv\0"
-   "glSecondaryColor3ivEXT\0"
-   "\0"
-   /* _mesa_function_pool[16166]: TexCoord4iv (offset 123) */
-   "p\0"
-   "glTexCoord4iv\0"
-   "\0"
-   /* _mesa_function_pool[16183]: VertexAttribI4uiEXT (will be remapped) */
-   "iiiii\0"
-   "glVertexAttribI4uiEXT\0"
-   "glVertexAttribI4ui\0"
-   "\0"
-   /* _mesa_function_pool[16231]: GetFragmentMaterialfvSGIX (dynamic) */
-   "iip\0"
-   "glGetFragmentMaterialfvSGIX\0"
-   "\0"
-   /* _mesa_function_pool[16264]: UniformMatrix4x2fv (will be remapped) */
-   "iiip\0"
-   "glUniformMatrix4x2fv\0"
-   "\0"
-   /* _mesa_function_pool[16291]: GetDetailTexFuncSGIS (dynamic) */
-   "ip\0"
-   "glGetDetailTexFuncSGIS\0"
-   "\0"
-   /* _mesa_function_pool[16318]: GetCombinerStageParameterfvNV (dynamic) */
-   "iip\0"
-   "glGetCombinerStageParameterfvNV\0"
-   "\0"
-   /* _mesa_function_pool[16355]: PolygonOffset (offset 319) */
-   "ff\0"
-   "glPolygonOffset\0"
-   "\0"
-   /* _mesa_function_pool[16375]: BindVertexArray (will be remapped) */
-   "i\0"
-   "glBindVertexArray\0"
-   "\0"
-   /* _mesa_function_pool[16396]: Color4ubVertex2fvSUN (dynamic) */
-   "pp\0"
-   "glColor4ubVertex2fvSUN\0"
-   "\0"
-   /* _mesa_function_pool[16423]: Rectd (offset 86) */
-   "dddd\0"
-   "glRectd\0"
-   "\0"
-   /* _mesa_function_pool[16437]: TexFilterFuncSGIS (dynamic) */
-   "iiip\0"
-   "glTexFilterFuncSGIS\0"
-   "\0"
-   /* _mesa_function_pool[16463]: TextureBarrierNV (will be remapped) */
-   "\0"
-   "glTextureBarrierNV\0"
-   "\0"
-   /* _mesa_function_pool[16484]: VertexAttribI4ubvEXT (will be remapped) */
-   "ip\0"
-   "glVertexAttribI4ubvEXT\0"
-   "glVertexAttribI4ubv\0"
-   "\0"
-   /* _mesa_function_pool[16531]: GetAttribLocationARB (will be remapped) */
-   "ip\0"
-   "glGetAttribLocation\0"
-   "glGetAttribLocationARB\0"
-   "\0"
-   /* _mesa_function_pool[16578]: RasterPos3i (offset 74) */
-   "iii\0"
-   "glRasterPos3i\0"
-   "\0"
-   /* _mesa_function_pool[16597]: VertexAttrib4ubvARB (will be remapped) */
-   "ip\0"
-   "glVertexAttrib4ubv\0"
-   "glVertexAttrib4ubvARB\0"
-   "\0"
-   /* _mesa_function_pool[16642]: DetailTexFuncSGIS (dynamic) */
-   "iip\0"
-   "glDetailTexFuncSGIS\0"
-   "\0"
-   /* _mesa_function_pool[16667]: Normal3fVertex3fSUN (dynamic) */
-   "ffffff\0"
-   "glNormal3fVertex3fSUN\0"
-   "\0"
-   /* _mesa_function_pool[16697]: CopyTexImage2D (offset 324) */
-   "iiiiiiii\0"
-   "glCopyTexImage2D\0"
-   "glCopyTexImage2DEXT\0"
-   "\0"
-   /* _mesa_function_pool[16744]: GetBufferPointervARB (will be remapped) */
-   "iip\0"
-   "glGetBufferPointerv\0"
-   "glGetBufferPointervARB\0"
-   "\0"
-   /* _mesa_function_pool[16792]: ProgramEnvParameter4fARB (will be remapped) */
-   "iiffff\0"
-   "glProgramEnvParameter4fARB\0"
-   "glProgramParameter4fNV\0"
-   "\0"
-   /* _mesa_function_pool[16850]: Uniform3ivARB (will be remapped) */
-   "iip\0"
-   "glUniform3iv\0"
-   "glUniform3ivARB\0"
-   "\0"
-   /* _mesa_function_pool[16884]: Lightfv (offset 160) */
-   "iip\0"
-   "glLightfv\0"
-   "\0"
-   /* _mesa_function_pool[16899]: PrimitiveRestartIndexNV (will be remapped) */
-   "i\0"
-   "glPrimitiveRestartIndexNV\0"
-   "glPrimitiveRestartIndex\0"
-   "\0"
-   /* _mesa_function_pool[16952]: ClearDepth (offset 208) */
-   "d\0"
-   "glClearDepth\0"
-   "\0"
-   /* _mesa_function_pool[16968]: GetFenceivNV (will be remapped) */
-   "iip\0"
-   "glGetFenceivNV\0"
-   "\0"
-   /* _mesa_function_pool[16988]: WindowPos4dvMESA (will be remapped) */
-   "p\0"
-   "glWindowPos4dvMESA\0"
-   "\0"
-   /* _mesa_function_pool[17010]: ColorSubTable (offset 346) */
-   "iiiiip\0"
-   "glColorSubTable\0"
-   "glColorSubTableEXT\0"
-   "\0"
-   /* _mesa_function_pool[17053]: Color4fv (offset 30) */
-   "p\0"
-   "glColor4fv\0"
-   "\0"
-   /* _mesa_function_pool[17067]: MultiTexCoord4ivARB (offset 405) */
-   "ip\0"
-   "glMultiTexCoord4iv\0"
-   "glMultiTexCoord4ivARB\0"
-   "\0"
-   /* _mesa_function_pool[17112]: ProgramLocalParameters4fvEXT (will be remapped) */
-   "iiip\0"
-   "glProgramLocalParameters4fvEXT\0"
-   "\0"
-   /* _mesa_function_pool[17149]: ColorPointer (offset 308) */
-   "iiip\0"
-   "glColorPointer\0"
-   "\0"
-   /* _mesa_function_pool[17170]: Rects (offset 92) */
-   "iiii\0"
-   "glRects\0"
-   "\0"
-   /* _mesa_function_pool[17184]: GetMapAttribParameterfvNV (dynamic) */
-   "iiip\0"
-   "glGetMapAttribParameterfvNV\0"
-   "\0"
-   /* _mesa_function_pool[17218]: CreateShaderProgramEXT (will be remapped) */
-   "ip\0"
-   "glCreateShaderProgramEXT\0"
-   "\0"
-   /* _mesa_function_pool[17247]: ActiveProgramEXT (will be remapped) */
-   "i\0"
-   "glActiveProgramEXT\0"
-   "\0"
-   /* _mesa_function_pool[17269]: Lightiv (offset 162) */
-   "iip\0"
-   "glLightiv\0"
-   "\0"
-   /* _mesa_function_pool[17284]: VertexAttrib4sARB (will be remapped) */
-   "iiiii\0"
-   "glVertexAttrib4s\0"
-   "glVertexAttrib4sARB\0"
-   "\0"
-   /* _mesa_function_pool[17328]: GetQueryObjectuivARB (will be remapped) */
-   "iip\0"
-   "glGetQueryObjectuiv\0"
-   "glGetQueryObjectuivARB\0"
-   "\0"
-   /* _mesa_function_pool[17376]: GetTexParameteriv (offset 283) */
-   "iip\0"
-   "glGetTexParameteriv\0"
-   "\0"
-   /* _mesa_function_pool[17401]: MapParameterivNV (dynamic) */
-   "iip\0"
-   "glMapParameterivNV\0"
-   "\0"
-   /* _mesa_function_pool[17425]: GenRenderbuffersEXT (will be remapped) */
-   "ip\0"
-   "glGenRenderbuffers\0"
-   "glGenRenderbuffersEXT\0"
-   "\0"
-   /* _mesa_function_pool[17470]: ClearBufferfv (will be remapped) */
-   "iip\0"
-   "glClearBufferfv\0"
-   "\0"
-   /* _mesa_function_pool[17491]: VertexAttrib2dvARB (will be remapped) */
-   "ip\0"
-   "glVertexAttrib2dv\0"
-   "glVertexAttrib2dvARB\0"
-   "\0"
-   /* _mesa_function_pool[17534]: EdgeFlagPointerEXT (will be remapped) */
-   "iip\0"
-   "glEdgeFlagPointerEXT\0"
-   "\0"
-   /* _mesa_function_pool[17560]: VertexAttribs2svNV (will be remapped) */
-   "iip\0"
-   "glVertexAttribs2svNV\0"
-   "\0"
-   /* _mesa_function_pool[17586]: WeightbvARB (dynamic) */
-   "ip\0"
-   "glWeightbvARB\0"
-   "\0"
-   /* _mesa_function_pool[17604]: VertexAttrib2fvARB (will be remapped) */
-   "ip\0"
-   "glVertexAttrib2fv\0"
-   "glVertexAttrib2fvARB\0"
-   "\0"
-   /* _mesa_function_pool[17647]: GetBufferParameterivARB (will be remapped) */
-   "iip\0"
-   "glGetBufferParameteriv\0"
-   "glGetBufferParameterivARB\0"
-   "\0"
-   /* _mesa_function_pool[17701]: Rectdv (offset 87) */
-   "pp\0"
-   "glRectdv\0"
-   "\0"
-   /* _mesa_function_pool[17714]: ListParameteriSGIX (dynamic) */
-   "iii\0"
-   "glListParameteriSGIX\0"
-   "\0"
-   /* _mesa_function_pool[17740]: BlendEquationiARB (will be remapped) */
-   "ii\0"
-   "glBlendEquationiARB\0"
-   "\0"
-   /* _mesa_function_pool[17764]: ReplacementCodeuiColor4fNormal3fVertex3fSUN (dynamic) */
-   "iffffffffff\0"
-   "glReplacementCodeuiColor4fNormal3fVertex3fSUN\0"
-   "\0"
-   /* _mesa_function_pool[17823]: InstrumentsBufferSGIX (dynamic) */
-   "ip\0"
-   "glInstrumentsBufferSGIX\0"
-   "\0"
-   /* _mesa_function_pool[17851]: VertexAttrib4NivARB (will be remapped) */
-   "ip\0"
-   "glVertexAttrib4Niv\0"
-   "glVertexAttrib4NivARB\0"
-   "\0"
-   /* _mesa_function_pool[17896]: DrawArraysInstancedARB (will be remapped) */
-   "iiii\0"
-   "glDrawArraysInstancedARB\0"
-   "glDrawArraysInstancedEXT\0"
-   "glDrawArraysInstanced\0"
-   "\0"
-   /* _mesa_function_pool[17974]: GetAttachedShaders (will be remapped) */
-   "iipp\0"
-   "glGetAttachedShaders\0"
-   "\0"
-   /* _mesa_function_pool[18001]: GenVertexArraysAPPLE (will be remapped) */
-   "ip\0"
-   "glGenVertexArraysAPPLE\0"
-   "\0"
-   /* _mesa_function_pool[18028]: ClearBufferfi (will be remapped) */
-   "iifi\0"
-   "glClearBufferfi\0"
-   "\0"
-   /* _mesa_function_pool[18050]: Materialiv (offset 172) */
-   "iip\0"
-   "glMaterialiv\0"
-   "\0"
-   /* _mesa_function_pool[18068]: PushClientAttrib (offset 335) */
-   "i\0"
-   "glPushClientAttrib\0"
-   "\0"
-   /* _mesa_function_pool[18090]: ProgramEnvParameters4fvEXT (will be remapped) */
-   "iiip\0"
-   "glProgramEnvParameters4fvEXT\0"
-   "\0"
-   /* _mesa_function_pool[18125]: TexCoord2fColor4fNormal3fVertex3fvSUN (dynamic) */
-   "pppp\0"
-   "glTexCoord2fColor4fNormal3fVertex3fvSUN\0"
-   "\0"
-   /* _mesa_function_pool[18171]: WindowPos2iMESA (will be remapped) */
-   "ii\0"
-   "glWindowPos2i\0"
-   "glWindowPos2iARB\0"
-   "glWindowPos2iMESA\0"
-   "\0"
-   /* _mesa_function_pool[18224]: SampleMaskSGIS (will be remapped) */
-   "fi\0"
-   "glSampleMaskSGIS\0"
-   "glSampleMaskEXT\0"
-   "\0"
-   /* _mesa_function_pool[18261]: SecondaryColor3fvEXT (will be remapped) */
-   "p\0"
-   "glSecondaryColor3fv\0"
-   "glSecondaryColor3fvEXT\0"
-   "\0"
-   /* _mesa_function_pool[18307]: PolygonMode (offset 174) */
-   "ii\0"
-   "glPolygonMode\0"
-   "\0"
-   /* _mesa_function_pool[18325]: CompressedTexSubImage1DARB (will be remapped) */
-   "iiiiiip\0"
-   "glCompressedTexSubImage1D\0"
-   "glCompressedTexSubImage1DARB\0"
-   "\0"
-   /* _mesa_function_pool[18389]: VertexAttribI1iEXT (will be remapped) */
-   "ii\0"
-   "glVertexAttribI1iEXT\0"
-   "glVertexAttribI1i\0"
-   "\0"
-   /* _mesa_function_pool[18432]: GetVertexAttribivNV (will be remapped) */
-   "iip\0"
-   "glGetVertexAttribivNV\0"
-   "\0"
-   /* _mesa_function_pool[18459]: GetProgramStringARB (will be remapped) */
-   "iip\0"
-   "glGetProgramStringARB\0"
-   "\0"
-   /* _mesa_function_pool[18486]: VertexAttribIPointerEXT (will be remapped) */
-   "iiiip\0"
-   "glVertexAttribIPointerEXT\0"
-   "glVertexAttribIPointer\0"
-   "\0"
-   /* _mesa_function_pool[18542]: TexBumpParameterfvATI (will be remapped) */
-   "ip\0"
-   "glTexBumpParameterfvATI\0"
-   "\0"
-   /* _mesa_function_pool[18570]: CompileShaderARB (will be remapped) */
-   "i\0"
-   "glCompileShader\0"
-   "glCompileShaderARB\0"
-   "\0"
-   /* _mesa_function_pool[18608]: DeleteShader (will be remapped) */
-   "i\0"
-   "glDeleteShader\0"
-   "\0"
-   /* _mesa_function_pool[18626]: DisableClientState (offset 309) */
-   "i\0"
-   "glDisableClientState\0"
-   "\0"
-   /* _mesa_function_pool[18650]: TexGeni (offset 192) */
-   "iii\0"
-   "glTexGeni\0"
-   "\0"
-   /* _mesa_function_pool[18665]: TexGenf (offset 190) */
-   "iif\0"
-   "glTexGenf\0"
-   "\0"
-   /* _mesa_function_pool[18680]: Uniform3fARB (will be remapped) */
-   "ifff\0"
-   "glUniform3f\0"
-   "glUniform3fARB\0"
-   "\0"
-   /* _mesa_function_pool[18713]: TexGend (offset 188) */
-   "iid\0"
-   "glTexGend\0"
-   "\0"
-   /* _mesa_function_pool[18728]: ListParameterfvSGIX (dynamic) */
-   "iip\0"
-   "glListParameterfvSGIX\0"
-   "\0"
-   /* _mesa_function_pool[18755]: GetPolygonStipple (offset 274) */
-   "p\0"
-   "glGetPolygonStipple\0"
-   "\0"
-   /* _mesa_function_pool[18778]: Tangent3dvEXT (dynamic) */
-   "p\0"
-   "glTangent3dvEXT\0"
-   "\0"
-   /* _mesa_function_pool[18797]: BindBufferOffsetEXT (will be remapped) */
-   "iiii\0"
-   "glBindBufferOffsetEXT\0"
-   "\0"
-   /* _mesa_function_pool[18825]: WindowPos3sMESA (will be remapped) */
-   "iii\0"
-   "glWindowPos3s\0"
-   "glWindowPos3sARB\0"
-   "glWindowPos3sMESA\0"
-   "\0"
-   /* _mesa_function_pool[18879]: VertexAttrib2svNV (will be remapped) */
-   "ip\0"
-   "glVertexAttrib2svNV\0"
-   "\0"
-   /* _mesa_function_pool[18903]: DisableIndexedEXT (will be remapped) */
-   "ii\0"
-   "glDisableIndexedEXT\0"
-   "glDisablei\0"
-   "\0"
-   /* _mesa_function_pool[18938]: BindBufferBaseEXT (will be remapped) */
-   "iii\0"
-   "glBindBufferBaseEXT\0"
-   "glBindBufferBase\0"
-   "\0"
-   /* _mesa_function_pool[18980]: TexCoord2fVertex3fvSUN (dynamic) */
-   "pp\0"
-   "glTexCoord2fVertex3fvSUN\0"
-   "\0"
-   /* _mesa_function_pool[19009]: WindowPos4sMESA (will be remapped) */
-   "iiii\0"
-   "glWindowPos4sMESA\0"
-   "\0"
-   /* _mesa_function_pool[19033]: VertexAttrib4NuivARB (will be remapped) */
-   "ip\0"
-   "glVertexAttrib4Nuiv\0"
-   "glVertexAttrib4NuivARB\0"
-   "\0"
-   /* _mesa_function_pool[19080]: ClientActiveTextureARB (offset 375) */
-   "i\0"
-   "glClientActiveTexture\0"
-   "glClientActiveTextureARB\0"
-   "\0"
-   /* _mesa_function_pool[19130]: PixelTexGenSGIX (will be remapped) */
-   "i\0"
-   "glPixelTexGenSGIX\0"
-   "\0"
-   /* _mesa_function_pool[19151]: ReplacementCodeusvSUN (dynamic) */
-   "p\0"
-   "glReplacementCodeusvSUN\0"
-   "\0"
-   /* _mesa_function_pool[19178]: Uniform4fARB (will be remapped) */
-   "iffff\0"
-   "glUniform4f\0"
-   "glUniform4fARB\0"
-   "\0"
-   /* _mesa_function_pool[19212]: Color4sv (offset 34) */
-   "p\0"
-   "glColor4sv\0"
-   "\0"
-   /* _mesa_function_pool[19226]: FlushMappedBufferRange (will be remapped) */
-   "iii\0"
-   "glFlushMappedBufferRange\0"
-   "\0"
-   /* _mesa_function_pool[19256]: IsProgramNV (will be remapped) */
-   "i\0"
-   "glIsProgramARB\0"
-   "glIsProgramNV\0"
-   "\0"
-   /* _mesa_function_pool[19288]: FlushMappedBufferRangeAPPLE (will be remapped) */
-   "iii\0"
-   "glFlushMappedBufferRangeAPPLE\0"
-   "\0"
-   /* _mesa_function_pool[19323]: PixelZoom (offset 246) */
-   "ff\0"
-   "glPixelZoom\0"
-   "\0"
-   /* _mesa_function_pool[19339]: ReplacementCodePointerSUN (dynamic) */
-   "iip\0"
-   "glReplacementCodePointerSUN\0"
-   "\0"
-   /* _mesa_function_pool[19372]: ProgramEnvParameter4dARB (will be remapped) */
-   "iidddd\0"
-   "glProgramEnvParameter4dARB\0"
-   "glProgramParameter4dNV\0"
-   "\0"
-   /* _mesa_function_pool[19430]: ColorTableParameterfv (offset 340) */
-   "iip\0"
-   "glColorTableParameterfv\0"
-   "glColorTableParameterfvSGI\0"
-   "\0"
-   /* _mesa_function_pool[19486]: FragmentLightModelfSGIX (dynamic) */
-   "if\0"
-   "glFragmentLightModelfSGIX\0"
-   "\0"
-   /* _mesa_function_pool[19516]: Binormal3bvEXT (dynamic) */
-   "p\0"
-   "glBinormal3bvEXT\0"
-   "\0"
-   /* _mesa_function_pool[19536]: PixelMapuiv (offset 252) */
-   "iip\0"
-   "glPixelMapuiv\0"
-   "\0"
-   /* _mesa_function_pool[19555]: Color3dv (offset 12) */
-   "p\0"
-   "glColor3dv\0"
-   "\0"
-   /* _mesa_function_pool[19569]: IsTexture (offset 330) */
-   "i\0"
-   "glIsTexture\0"
-   "glIsTextureEXT\0"
-   "\0"
-   /* _mesa_function_pool[19599]: VertexWeightfvEXT (dynamic) */
-   "p\0"
-   "glVertexWeightfvEXT\0"
-   "\0"
-   /* _mesa_function_pool[19622]: VertexAttrib1dARB (will be remapped) */
-   "id\0"
-   "glVertexAttrib1d\0"
-   "glVertexAttrib1dARB\0"
-   "\0"
-   /* _mesa_function_pool[19663]: ImageTransformParameterivHP (dynamic) */
-   "iip\0"
-   "glImageTransformParameterivHP\0"
-   "\0"
-   /* _mesa_function_pool[19698]: TexCoord4i (offset 122) */
-   "iiii\0"
-   "glTexCoord4i\0"
-   "\0"
-   /* _mesa_function_pool[19717]: DeleteQueriesARB (will be remapped) */
-   "ip\0"
-   "glDeleteQueries\0"
-   "glDeleteQueriesARB\0"
-   "\0"
-   /* _mesa_function_pool[19756]: Color4ubVertex2fSUN (dynamic) */
-   "iiiiff\0"
-   "glColor4ubVertex2fSUN\0"
-   "\0"
-   /* _mesa_function_pool[19786]: FragmentColorMaterialSGIX (dynamic) */
-   "ii\0"
-   "glFragmentColorMaterialSGIX\0"
-   "\0"
-   /* _mesa_function_pool[19818]: CurrentPaletteMatrixARB (dynamic) */
-   "i\0"
-   "glCurrentPaletteMatrixARB\0"
-   "\0"
-   /* _mesa_function_pool[19847]: GetMapdv (offset 266) */
-   "iip\0"
-   "glGetMapdv\0"
-   "\0"
-   /* _mesa_function_pool[19863]: ObjectPurgeableAPPLE (will be remapped) */
-   "iii\0"
-   "glObjectPurgeableAPPLE\0"
-   "\0"
-   /* _mesa_function_pool[19891]: GetStringi (will be remapped) */
-   "ii\0"
-   "glGetStringi\0"
-   "\0"
-   /* _mesa_function_pool[19908]: SamplePatternSGIS (will be remapped) */
-   "i\0"
-   "glSamplePatternSGIS\0"
-   "glSamplePatternEXT\0"
-   "\0"
-   /* _mesa_function_pool[19950]: PixelStoref (offset 249) */
-   "if\0"
-   "glPixelStoref\0"
-   "\0"
-   /* _mesa_function_pool[19968]: IsQueryARB (will be remapped) */
-   "i\0"
-   "glIsQuery\0"
-   "glIsQueryARB\0"
-   "\0"
-   /* _mesa_function_pool[19994]: ReplacementCodeuiColor4ubVertex3fSUN (dynamic) */
-   "iiiiifff\0"
-   "glReplacementCodeuiColor4ubVertex3fSUN\0"
-   "\0"
-   /* _mesa_function_pool[20043]: PixelStorei (offset 250) */
-   "ii\0"
-   "glPixelStorei\0"
-   "\0"
-   /* _mesa_function_pool[20061]: VertexAttrib4usvARB (will be remapped) */
-   "ip\0"
-   "glVertexAttrib4usv\0"
-   "glVertexAttrib4usvARB\0"
-   "\0"
-   /* _mesa_function_pool[20106]: LinkProgramARB (will be remapped) */
-   "i\0"
-   "glLinkProgram\0"
-   "glLinkProgramARB\0"
-   "\0"
-   /* _mesa_function_pool[20140]: VertexAttrib2fNV (will be remapped) */
-   "iff\0"
-   "glVertexAttrib2fNV\0"
-   "\0"
-   /* _mesa_function_pool[20164]: ShaderSourceARB (will be remapped) */
-   "iipp\0"
-   "glShaderSource\0"
-   "glShaderSourceARB\0"
-   "\0"
-   /* _mesa_function_pool[20203]: FragmentMaterialiSGIX (dynamic) */
-   "iii\0"
-   "glFragmentMaterialiSGIX\0"
-   "\0"
-   /* _mesa_function_pool[20232]: EvalCoord2dv (offset 233) */
-   "p\0"
-   "glEvalCoord2dv\0"
-   "\0"
-   /* _mesa_function_pool[20250]: VertexAttrib3svARB (will be remapped) */
-   "ip\0"
-   "glVertexAttrib3sv\0"
-   "glVertexAttrib3svARB\0"
-   "\0"
-   /* _mesa_function_pool[20293]: ColorMaterial (offset 151) */
-   "ii\0"
-   "glColorMaterial\0"
-   "\0"
-   /* _mesa_function_pool[20313]: CompressedTexSubImage3DARB (will be remapped) */
-   "iiiiiiiiiip\0"
-   "glCompressedTexSubImage3D\0"
-   "glCompressedTexSubImage3DARB\0"
-   "\0"
-   /* _mesa_function_pool[20381]: WindowPos2ivMESA (will be remapped) */
-   "p\0"
-   "glWindowPos2iv\0"
-   "glWindowPos2ivARB\0"
-   "glWindowPos2ivMESA\0"
-   "\0"
-   /* _mesa_function_pool[20436]: IsFramebufferEXT (will be remapped) */
-   "i\0"
-   "glIsFramebuffer\0"
-   "glIsFramebufferEXT\0"
-   "\0"
-   /* _mesa_function_pool[20474]: Uniform4ivARB (will be remapped) */
-   "iip\0"
-   "glUniform4iv\0"
-   "glUniform4ivARB\0"
-   "\0"
-   /* _mesa_function_pool[20508]: GetVertexAttribdvARB (will be remapped) */
-   "iip\0"
-   "glGetVertexAttribdv\0"
-   "glGetVertexAttribdvARB\0"
-   "\0"
-   /* _mesa_function_pool[20556]: TexBumpParameterivATI (will be remapped) */
-   "ip\0"
-   "glTexBumpParameterivATI\0"
-   "\0"
-   /* _mesa_function_pool[20584]: GetSeparableFilter (offset 359) */
-   "iiippp\0"
-   "glGetSeparableFilter\0"
-   "glGetSeparableFilterEXT\0"
-   "\0"
-   /* _mesa_function_pool[20637]: Binormal3dEXT (dynamic) */
-   "ddd\0"
-   "glBinormal3dEXT\0"
-   "\0"
-   /* _mesa_function_pool[20658]: SpriteParameteriSGIX (dynamic) */
-   "ii\0"
-   "glSpriteParameteriSGIX\0"
-   "\0"
-   /* _mesa_function_pool[20685]: RequestResidentProgramsNV (will be remapped) */
-   "ip\0"
-   "glRequestResidentProgramsNV\0"
-   "\0"
-   /* _mesa_function_pool[20717]: TagSampleBufferSGIX (dynamic) */
-   "\0"
-   "glTagSampleBufferSGIX\0"
-   "\0"
-   /* _mesa_function_pool[20741]: TransformFeedbackVaryingsEXT (will be remapped) */
-   "iipi\0"
-   "glTransformFeedbackVaryingsEXT\0"
-   "glTransformFeedbackVaryings\0"
-   "\0"
-   /* _mesa_function_pool[20806]: FeedbackBuffer (offset 194) */
-   "iip\0"
-   "glFeedbackBuffer\0"
-   "\0"
-   /* _mesa_function_pool[20828]: RasterPos2iv (offset 67) */
-   "p\0"
-   "glRasterPos2iv\0"
-   "\0"
-   /* _mesa_function_pool[20846]: TexImage1D (offset 182) */
-   "iiiiiiip\0"
-   "glTexImage1D\0"
-   "\0"
-   /* _mesa_function_pool[20869]: ListParameterivSGIX (dynamic) */
-   "iip\0"
-   "glListParameterivSGIX\0"
-   "\0"
-   /* _mesa_function_pool[20896]: MultiDrawElementsEXT (will be remapped) */
-   "ipipi\0"
-   "glMultiDrawElements\0"
-   "glMultiDrawElementsEXT\0"
-   "\0"
-   /* _mesa_function_pool[20946]: Color3s (offset 17) */
-   "iii\0"
-   "glColor3s\0"
-   "\0"
-   /* _mesa_function_pool[20961]: Uniform1ivARB (will be remapped) */
-   "iip\0"
-   "glUniform1iv\0"
-   "glUniform1ivARB\0"
-   "\0"
-   /* _mesa_function_pool[20995]: WindowPos2sMESA (will be remapped) */
-   "ii\0"
-   "glWindowPos2s\0"
-   "glWindowPos2sARB\0"
-   "glWindowPos2sMESA\0"
-   "\0"
-   /* _mesa_function_pool[21048]: WeightusvARB (dynamic) */
-   "ip\0"
-   "glWeightusvARB\0"
-   "\0"
-   /* _mesa_function_pool[21067]: TexCoordPointer (offset 320) */
-   "iiip\0"
-   "glTexCoordPointer\0"
-   "\0"
-   /* _mesa_function_pool[21091]: FogCoordPointerEXT (will be remapped) */
-   "iip\0"
-   "glFogCoordPointer\0"
-   "glFogCoordPointerEXT\0"
-   "\0"
-   /* _mesa_function_pool[21135]: IndexMaterialEXT (dynamic) */
-   "ii\0"
-   "glIndexMaterialEXT\0"
-   "\0"
-   /* _mesa_function_pool[21158]: Color3i (offset 15) */
-   "iii\0"
-   "glColor3i\0"
-   "\0"
-   /* _mesa_function_pool[21173]: FrontFace (offset 157) */
-   "i\0"
-   "glFrontFace\0"
-   "\0"
-   /* _mesa_function_pool[21188]: EvalCoord2d (offset 232) */
-   "dd\0"
-   "glEvalCoord2d\0"
-   "\0"
-   /* _mesa_function_pool[21206]: SecondaryColor3ubvEXT (will be remapped) */
-   "p\0"
-   "glSecondaryColor3ubv\0"
-   "glSecondaryColor3ubvEXT\0"
-   "\0"
-   /* _mesa_function_pool[21254]: EvalCoord2f (offset 234) */
-   "ff\0"
-   "glEvalCoord2f\0"
-   "\0"
-   /* _mesa_function_pool[21272]: VertexAttrib4dvARB (will be remapped) */
-   "ip\0"
-   "glVertexAttrib4dv\0"
-   "glVertexAttrib4dvARB\0"
-   "\0"
-   /* _mesa_function_pool[21315]: BindAttribLocationARB (will be remapped) */
-   "iip\0"
-   "glBindAttribLocation\0"
-   "glBindAttribLocationARB\0"
-   "\0"
-   /* _mesa_function_pool[21365]: Color3b (offset 9) */
-   "iii\0"
-   "glColor3b\0"
-   "\0"
-   /* _mesa_function_pool[21380]: MultiTexCoord2dARB (offset 384) */
-   "idd\0"
-   "glMultiTexCoord2d\0"
-   "glMultiTexCoord2dARB\0"
-   "\0"
-   /* _mesa_function_pool[21424]: ExecuteProgramNV (will be remapped) */
-   "iip\0"
-   "glExecuteProgramNV\0"
-   "\0"
-   /* _mesa_function_pool[21448]: Color3f (offset 13) */
-   "fff\0"
-   "glColor3f\0"
-   "\0"
-   /* _mesa_function_pool[21463]: LightEnviSGIX (dynamic) */
-   "ii\0"
-   "glLightEnviSGIX\0"
-   "\0"
-   /* _mesa_function_pool[21483]: Color3d (offset 11) */
-   "ddd\0"
-   "glColor3d\0"
-   "\0"
-   /* _mesa_function_pool[21498]: Normal3dv (offset 55) */
-   "p\0"
-   "glNormal3dv\0"
-   "\0"
-   /* _mesa_function_pool[21513]: Lightf (offset 159) */
-   "iif\0"
-   "glLightf\0"
-   "\0"
-   /* _mesa_function_pool[21527]: ReplacementCodeuiSUN (dynamic) */
-   "i\0"
-   "glReplacementCodeuiSUN\0"
-   "\0"
-   /* _mesa_function_pool[21553]: MatrixMode (offset 293) */
-   "i\0"
-   "glMatrixMode\0"
-   "\0"
-   /* _mesa_function_pool[21569]: GetPixelMapusv (offset 273) */
-   "ip\0"
-   "glGetPixelMapusv\0"
-   "\0"
-   /* _mesa_function_pool[21590]: Lighti (offset 161) */
-   "iii\0"
-   "glLighti\0"
-   "\0"
-   /* _mesa_function_pool[21604]: VertexAttribPointerNV (will be remapped) */
-   "iiiip\0"
-   "glVertexAttribPointerNV\0"
-   "\0"
-   /* _mesa_function_pool[21635]: ClearDepthf (will be remapped) */
-   "f\0"
-   "glClearDepthf\0"
-   "\0"
-   /* _mesa_function_pool[21652]: GetBooleanIndexedvEXT (will be remapped) */
-   "iip\0"
-   "glGetBooleanIndexedvEXT\0"
-   "glGetBooleani_v\0"
-   "\0"
-   /* _mesa_function_pool[21697]: GetFramebufferAttachmentParameterivEXT (will be remapped) */
-   "iiip\0"
-   "glGetFramebufferAttachmentParameteriv\0"
-   "glGetFramebufferAttachmentParameterivEXT\0"
-   "\0"
-   /* _mesa_function_pool[21782]: PixelTransformParameterfEXT (dynamic) */
-   "iif\0"
-   "glPixelTransformParameterfEXT\0"
-   "\0"
-   /* _mesa_function_pool[21817]: MultiTexCoord4dvARB (offset 401) */
-   "ip\0"
-   "glMultiTexCoord4dv\0"
-   "glMultiTexCoord4dvARB\0"
-   "\0"
-   /* _mesa_function_pool[21862]: PixelTransformParameteriEXT (dynamic) */
-   "iii\0"
-   "glPixelTransformParameteriEXT\0"
-   "\0"
-   /* _mesa_function_pool[21897]: GetDoublev (offset 260) */
-   "ip\0"
-   "glGetDoublev\0"
-   "\0"
-   /* _mesa_function_pool[21914]: MultMatrixd (offset 295) */
-   "p\0"
-   "glMultMatrixd\0"
-   "\0"
-   /* _mesa_function_pool[21931]: MultMatrixf (offset 294) */
-   "p\0"
-   "glMultMatrixf\0"
-   "\0"
-   /* _mesa_function_pool[21948]: VertexAttribI4bvEXT (will be remapped) */
-   "ip\0"
-   "glVertexAttribI4bvEXT\0"
-   "glVertexAttribI4bv\0"
-   "\0"
-   /* _mesa_function_pool[21993]: TexCoord2fColor4ubVertex3fSUN (dynamic) */
-   "ffiiiifff\0"
-   "glTexCoord2fColor4ubVertex3fSUN\0"
-   "\0"
-   /* _mesa_function_pool[22036]: Uniform1iARB (will be remapped) */
-   "ii\0"
-   "glUniform1i\0"
-   "glUniform1iARB\0"
-   "\0"
-   /* _mesa_function_pool[22067]: VertexAttribPointerARB (will be remapped) */
-   "iiiiip\0"
-   "glVertexAttribPointer\0"
-   "glVertexAttribPointerARB\0"
-   "\0"
-   /* _mesa_function_pool[22122]: VertexAttrib3sNV (will be remapped) */
-   "iiii\0"
-   "glVertexAttrib3sNV\0"
-   "\0"
-   /* _mesa_function_pool[22147]: SharpenTexFuncSGIS (dynamic) */
-   "iip\0"
-   "glSharpenTexFuncSGIS\0"
-   "\0"
-   /* _mesa_function_pool[22173]: MultiTexCoord4fvARB (offset 403) */
-   "ip\0"
-   "glMultiTexCoord4fv\0"
-   "glMultiTexCoord4fvARB\0"
-   "\0"
-   /* _mesa_function_pool[22218]: Uniform2uiEXT (will be remapped) */
-   "iii\0"
-   "glUniform2uiEXT\0"
-   "glUniform2ui\0"
-   "\0"
-   /* _mesa_function_pool[22252]: UniformMatrix2x3fv (will be remapped) */
-   "iiip\0"
-   "glUniformMatrix2x3fv\0"
-   "\0"
-   /* _mesa_function_pool[22279]: TrackMatrixNV (will be remapped) */
-   "iiii\0"
-   "glTrackMatrixNV\0"
-   "\0"
-   /* _mesa_function_pool[22301]: CombinerParameteriNV (will be remapped) */
-   "ii\0"
-   "glCombinerParameteriNV\0"
-   "\0"
-   /* _mesa_function_pool[22328]: DeleteAsyncMarkersSGIX (dynamic) */
-   "ii\0"
-   "glDeleteAsyncMarkersSGIX\0"
-   "\0"
-   /* _mesa_function_pool[22357]: ReplacementCodeusSUN (dynamic) */
-   "i\0"
-   "glReplacementCodeusSUN\0"
-   "\0"
-   /* _mesa_function_pool[22383]: IsAsyncMarkerSGIX (dynamic) */
-   "i\0"
-   "glIsAsyncMarkerSGIX\0"
-   "\0"
-   /* _mesa_function_pool[22406]: FrameZoomSGIX (dynamic) */
-   "i\0"
-   "glFrameZoomSGIX\0"
-   "\0"
-   /* _mesa_function_pool[22425]: Normal3fVertex3fvSUN (dynamic) */
-   "pp\0"
-   "glNormal3fVertex3fvSUN\0"
-   "\0"
-   /* _mesa_function_pool[22452]: RasterPos4sv (offset 85) */
-   "p\0"
-   "glRasterPos4sv\0"
-   "\0"
-   /* _mesa_function_pool[22470]: VertexAttrib4NsvARB (will be remapped) */
-   "ip\0"
-   "glVertexAttrib4Nsv\0"
-   "glVertexAttrib4NsvARB\0"
-   "\0"
-   /* _mesa_function_pool[22515]: VertexAttrib3fvARB (will be remapped) */
-   "ip\0"
-   "glVertexAttrib3fv\0"
-   "glVertexAttrib3fvARB\0"
-   "\0"
-   /* _mesa_function_pool[22558]: ClearColor (offset 206) */
-   "ffff\0"
-   "glClearColor\0"
-   "\0"
-   /* _mesa_function_pool[22577]: GetSynciv (will be remapped) */
-   "iiipp\0"
-   "glGetSynciv\0"
-   "\0"
-   /* _mesa_function_pool[22596]: ClearColorIiEXT (will be remapped) */
-   "iiii\0"
-   "glClearColorIiEXT\0"
-   "\0"
-   /* _mesa_function_pool[22620]: DeleteFramebuffersEXT (will be remapped) */
-   "ip\0"
-   "glDeleteFramebuffers\0"
-   "glDeleteFramebuffersEXT\0"
-   "\0"
-   /* _mesa_function_pool[22669]: GlobalAlphaFactorsSUN (dynamic) */
-   "i\0"
-   "glGlobalAlphaFactorsSUN\0"
-   "\0"
-   /* _mesa_function_pool[22696]: IsEnabledIndexedEXT (will be remapped) */
-   "ii\0"
-   "glIsEnabledIndexedEXT\0"
-   "glIsEnabledi\0"
-   "\0"
-   /* _mesa_function_pool[22735]: TexEnviv (offset 187) */
-   "iip\0"
-   "glTexEnviv\0"
-   "\0"
-   /* _mesa_function_pool[22751]: TexSubImage3D (offset 372) */
-   "iiiiiiiiiip\0"
-   "glTexSubImage3D\0"
-   "glTexSubImage3DEXT\0"
-   "\0"
-   /* _mesa_function_pool[22799]: Tangent3fEXT (dynamic) */
-   "fff\0"
-   "glTangent3fEXT\0"
-   "\0"
-   /* _mesa_function_pool[22819]: SecondaryColor3uivEXT (will be remapped) */
-   "p\0"
-   "glSecondaryColor3uiv\0"
-   "glSecondaryColor3uivEXT\0"
-   "\0"
-   /* _mesa_function_pool[22867]: MatrixIndexubvARB (dynamic) */
-   "ip\0"
-   "glMatrixIndexubvARB\0"
-   "\0"
-   /* _mesa_function_pool[22891]: Color4fNormal3fVertex3fSUN (dynamic) */
-   "ffffffffff\0"
-   "glColor4fNormal3fVertex3fSUN\0"
-   "\0"
-   /* _mesa_function_pool[22932]: PixelTexGenParameterfSGIS (will be remapped) */
-   "if\0"
-   "glPixelTexGenParameterfSGIS\0"
-   "\0"
-   /* _mesa_function_pool[22964]: CreateShader (will be remapped) */
-   "i\0"
-   "glCreateShader\0"
-   "\0"
-   /* _mesa_function_pool[22982]: GetColorTableParameterfv (offset 344) */
-   "iip\0"
-   "glGetColorTableParameterfv\0"
-   "glGetColorTableParameterfvSGI\0"
-   "glGetColorTableParameterfvEXT\0"
-   "\0"
-   /* _mesa_function_pool[23074]: FragmentLightModelfvSGIX (dynamic) */
-   "ip\0"
-   "glFragmentLightModelfvSGIX\0"
-   "\0"
-   /* _mesa_function_pool[23105]: Bitmap (offset 8) */
-   "iiffffp\0"
-   "glBitmap\0"
-   "\0"
-   /* _mesa_function_pool[23123]: MultiTexCoord3fARB (offset 394) */
-   "ifff\0"
-   "glMultiTexCoord3f\0"
-   "glMultiTexCoord3fARB\0"
-   "\0"
-   /* _mesa_function_pool[23168]: GetTexLevelParameterfv (offset 284) */
-   "iiip\0"
-   "glGetTexLevelParameterfv\0"
-   "\0"
-   /* _mesa_function_pool[23199]: GetPixelTexGenParameterfvSGIS (will be remapped) */
-   "ip\0"
-   "glGetPixelTexGenParameterfvSGIS\0"
-   "\0"
-   /* _mesa_function_pool[23235]: GenFramebuffersEXT (will be remapped) */
-   "ip\0"
-   "glGenFramebuffers\0"
-   "glGenFramebuffersEXT\0"
-   "\0"
-   /* _mesa_function_pool[23278]: VertexAttribDivisor (will be remapped) */
-   "ii\0"
-   "glVertexAttribDivisor\0"
-   "\0"
-   /* _mesa_function_pool[23304]: GetProgramParameterdvNV (will be remapped) */
-   "iiip\0"
-   "glGetProgramParameterdvNV\0"
-   "\0"
-   /* _mesa_function_pool[23336]: Vertex2sv (offset 133) */
-   "p\0"
-   "glVertex2sv\0"
-   "\0"
-   /* _mesa_function_pool[23351]: GetIntegerv (offset 263) */
-   "ip\0"
-   "glGetIntegerv\0"
-   "\0"
-   /* _mesa_function_pool[23369]: IsVertexArrayAPPLE (will be remapped) */
-   "i\0"
-   "glIsVertexArray\0"
-   "glIsVertexArrayAPPLE\0"
-   "\0"
-   /* _mesa_function_pool[23409]: FragmentLightfvSGIX (dynamic) */
-   "iip\0"
-   "glFragmentLightfvSGIX\0"
-   "\0"
-   /* _mesa_function_pool[23436]: VertexAttribDivisorARB (will be remapped) */
-   "ii\0"
-   "glVertexAttribDivisorARB\0"
-   "\0"
-   /* _mesa_function_pool[23465]: DetachShader (will be remapped) */
-   "ii\0"
-   "glDetachShader\0"
-   "\0"
-   /* _mesa_function_pool[23484]: VertexAttrib4NubARB (will be remapped) */
-   "iiiii\0"
-   "glVertexAttrib4Nub\0"
-   "glVertexAttrib4NubARB\0"
-   "\0"
-   /* _mesa_function_pool[23532]: GetProgramEnvParameterfvARB (will be remapped) */
-   "iip\0"
-   "glGetProgramEnvParameterfvARB\0"
-   "\0"
-   /* _mesa_function_pool[23567]: GetTrackMatrixivNV (will be remapped) */
-   "iiip\0"
-   "glGetTrackMatrixivNV\0"
-   "\0"
-   /* _mesa_function_pool[23594]: VertexAttrib3svNV (will be remapped) */
-   "ip\0"
-   "glVertexAttrib3svNV\0"
-   "\0"
-   /* _mesa_function_pool[23618]: Uniform4fvARB (will be remapped) */
-   "iip\0"
-   "glUniform4fv\0"
-   "glUniform4fvARB\0"
-   "\0"
-   /* _mesa_function_pool[23652]: MultTransposeMatrixfARB (will be remapped) */
-   "p\0"
-   "glMultTransposeMatrixf\0"
-   "glMultTransposeMatrixfARB\0"
-   "\0"
-   /* _mesa_function_pool[23704]: GetTexEnviv (offset 277) */
-   "iip\0"
-   "glGetTexEnviv\0"
-   "\0"
-   /* _mesa_function_pool[23723]: ColorFragmentOp1ATI (will be remapped) */
-   "iiiiiii\0"
-   "glColorFragmentOp1ATI\0"
-   "\0"
-   /* _mesa_function_pool[23754]: GetUniformfvARB (will be remapped) */
-   "iip\0"
-   "glGetUniformfv\0"
-   "glGetUniformfvARB\0"
-   "\0"
-   /* _mesa_function_pool[23792]: EGLImageTargetRenderbufferStorageOES (will be remapped) */
-   "ip\0"
-   "glEGLImageTargetRenderbufferStorageOES\0"
-   "\0"
-   /* _mesa_function_pool[23835]: VertexAttribI2ivEXT (will be remapped) */
-   "ip\0"
-   "glVertexAttribI2ivEXT\0"
-   "glVertexAttribI2iv\0"
-   "\0"
-   /* _mesa_function_pool[23880]: PopClientAttrib (offset 334) */
-   "\0"
-   "glPopClientAttrib\0"
-   "\0"
-   /* _mesa_function_pool[23900]: ReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (dynamic) */
-   "iffffffffffff\0"
-   "glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN\0"
-   "\0"
-   /* _mesa_function_pool[23971]: DetachObjectARB (will be remapped) */
-   "ii\0"
-   "glDetachObjectARB\0"
-   "\0"
-   /* _mesa_function_pool[23993]: VertexBlendARB (dynamic) */
-   "i\0"
-   "glVertexBlendARB\0"
-   "\0"
-   /* _mesa_function_pool[24013]: WindowPos3iMESA (will be remapped) */
-   "iii\0"
-   "glWindowPos3i\0"
-   "glWindowPos3iARB\0"
-   "glWindowPos3iMESA\0"
-   "\0"
-   /* _mesa_function_pool[24067]: SeparableFilter2D (offset 360) */
-   "iiiiiipp\0"
-   "glSeparableFilter2D\0"
-   "glSeparableFilter2DEXT\0"
-   "\0"
-   /* _mesa_function_pool[24120]: ProgramParameteriARB (will be remapped) */
-   "iii\0"
-   "glProgramParameteriARB\0"
-   "\0"
-   /* _mesa_function_pool[24148]: Map1d (offset 220) */
-   "iddiip\0"
-   "glMap1d\0"
-   "\0"
-   /* _mesa_function_pool[24164]: Map1f (offset 221) */
-   "iffiip\0"
-   "glMap1f\0"
-   "\0"
-   /* _mesa_function_pool[24180]: CompressedTexImage2DARB (will be remapped) */
-   "iiiiiiip\0"
-   "glCompressedTexImage2D\0"
-   "glCompressedTexImage2DARB\0"
-   "\0"
-   /* _mesa_function_pool[24239]: ArrayElement (offset 306) */
-   "i\0"
-   "glArrayElement\0"
-   "glArrayElementEXT\0"
-   "\0"
-   /* _mesa_function_pool[24275]: TexImage2D (offset 183) */
-   "iiiiiiiip\0"
-   "glTexImage2D\0"
-   "\0"
-   /* _mesa_function_pool[24299]: DepthBoundsEXT (will be remapped) */
-   "dd\0"
-   "glDepthBoundsEXT\0"
-   "\0"
-   /* _mesa_function_pool[24320]: ProgramParameters4fvNV (will be remapped) */
-   "iiip\0"
-   "glProgramParameters4fvNV\0"
-   "\0"
-   /* _mesa_function_pool[24351]: DeformationMap3fSGIX (dynamic) */
-   "iffiiffiiffiip\0"
-   "glDeformationMap3fSGIX\0"
-   "\0"
-   /* _mesa_function_pool[24390]: GetProgramivNV (will be remapped) */
-   "iip\0"
-   "glGetProgramivNV\0"
-   "\0"
-   /* _mesa_function_pool[24412]: GetFragDataLocationEXT (will be remapped) */
-   "ip\0"
-   "glGetFragDataLocationEXT\0"
-   "glGetFragDataLocation\0"
-   "\0"
-   /* _mesa_function_pool[24463]: GetMinmaxParameteriv (offset 366) */
-   "iip\0"
-   "glGetMinmaxParameteriv\0"
-   "glGetMinmaxParameterivEXT\0"
-   "\0"
-   /* _mesa_function_pool[24517]: PixelTransferf (offset 247) */
-   "if\0"
-   "glPixelTransferf\0"
-   "\0"
-   /* _mesa_function_pool[24538]: CopyTexImage1D (offset 323) */
-   "iiiiiii\0"
-   "glCopyTexImage1D\0"
-   "glCopyTexImage1DEXT\0"
-   "\0"
-   /* _mesa_function_pool[24584]: PushMatrix (offset 298) */
-   "\0"
-   "glPushMatrix\0"
-   "\0"
-   /* _mesa_function_pool[24599]: Fogiv (offset 156) */
-   "ip\0"
-   "glFogiv\0"
-   "\0"
-   /* _mesa_function_pool[24611]: TexCoord1dv (offset 95) */
-   "p\0"
-   "glTexCoord1dv\0"
-   "\0"
-   /* _mesa_function_pool[24628]: AlphaFragmentOp3ATI (will be remapped) */
-   "iiiiiiiiiiii\0"
-   "glAlphaFragmentOp3ATI\0"
-   "\0"
-   /* _mesa_function_pool[24664]: PixelTransferi (offset 248) */
-   "ii\0"
-   "glPixelTransferi\0"
-   "\0"
-   /* _mesa_function_pool[24685]: GetVertexAttribdvNV (will be remapped) */
-   "iip\0"
-   "glGetVertexAttribdvNV\0"
-   "\0"
-   /* _mesa_function_pool[24712]: VertexAttrib3fvNV (will be remapped) */
-   "ip\0"
-   "glVertexAttrib3fvNV\0"
-   "\0"
-   /* _mesa_function_pool[24736]: Rotatef (offset 300) */
-   "ffff\0"
-   "glRotatef\0"
-   "\0"
-   /* _mesa_function_pool[24752]: GetFinalCombinerInputParameterivNV (will be remapped) */
-   "iip\0"
-   "glGetFinalCombinerInputParameterivNV\0"
-   "\0"
-   /* _mesa_function_pool[24794]: Vertex3i (offset 138) */
-   "iii\0"
-   "glVertex3i\0"
-   "\0"
-   /* _mesa_function_pool[24810]: Vertex3f (offset 136) */
-   "fff\0"
-   "glVertex3f\0"
-   "\0"
-   /* _mesa_function_pool[24826]: Clear (offset 203) */
-   "i\0"
-   "glClear\0"
-   "\0"
-   /* _mesa_function_pool[24837]: Vertex3d (offset 134) */
-   "ddd\0"
-   "glVertex3d\0"
-   "\0"
-   /* _mesa_function_pool[24853]: GetMapParameterivNV (dynamic) */
-   "iip\0"
-   "glGetMapParameterivNV\0"
-   "\0"
-   /* _mesa_function_pool[24880]: Uniform4iARB (will be remapped) */
-   "iiiii\0"
-   "glUniform4i\0"
-   "glUniform4iARB\0"
-   "\0"
-   /* _mesa_function_pool[24914]: ReadBuffer (offset 254) */
-   "i\0"
-   "glReadBuffer\0"
-   "\0"
-   /* _mesa_function_pool[24930]: ConvolutionParameteri (offset 352) */
-   "iii\0"
-   "glConvolutionParameteri\0"
-   "glConvolutionParameteriEXT\0"
-   "\0"
-   /* _mesa_function_pool[24986]: Ortho (offset 296) */
-   "dddddd\0"
-   "glOrtho\0"
-   "\0"
-   /* _mesa_function_pool[25002]: Binormal3sEXT (dynamic) */
-   "iii\0"
-   "glBinormal3sEXT\0"
-   "\0"
-   /* _mesa_function_pool[25023]: ListBase (offset 6) */
-   "i\0"
-   "glListBase\0"
-   "\0"
-   /* _mesa_function_pool[25037]: Vertex3s (offset 140) */
-   "iii\0"
-   "glVertex3s\0"
-   "\0"
-   /* _mesa_function_pool[25053]: ConvolutionParameterf (offset 350) */
-   "iif\0"
-   "glConvolutionParameterf\0"
-   "glConvolutionParameterfEXT\0"
-   "\0"
-   /* _mesa_function_pool[25109]: GetColorTableParameteriv (offset 345) */
-   "iip\0"
-   "glGetColorTableParameteriv\0"
-   "glGetColorTableParameterivSGI\0"
-   "glGetColorTableParameterivEXT\0"
-   "\0"
-   /* _mesa_function_pool[25201]: ProgramEnvParameter4dvARB (will be remapped) */
-   "iip\0"
-   "glProgramEnvParameter4dvARB\0"
-   "glProgramParameter4dvNV\0"
-   "\0"
-   /* _mesa_function_pool[25258]: ShadeModel (offset 177) */
-   "i\0"
-   "glShadeModel\0"
-   "\0"
-   /* _mesa_function_pool[25274]: VertexAttribs2fvNV (will be remapped) */
-   "iip\0"
-   "glVertexAttribs2fvNV\0"
-   "\0"
-   /* _mesa_function_pool[25300]: Rectiv (offset 91) */
-   "pp\0"
-   "glRectiv\0"
-   "\0"
-   /* _mesa_function_pool[25313]: UseProgramObjectARB (will be remapped) */
-   "i\0"
-   "glUseProgram\0"
-   "glUseProgramObjectARB\0"
-   "\0"
-   /* _mesa_function_pool[25351]: GetMapParameterfvNV (dynamic) */
-   "iip\0"
-   "glGetMapParameterfvNV\0"
-   "\0"
-   /* _mesa_function_pool[25378]: EndConditionalRenderNV (will be remapped) */
-   "\0"
-   "glEndConditionalRenderNV\0"
-   "glEndConditionalRender\0"
-   "\0"
-   /* _mesa_function_pool[25428]: PassTexCoordATI (will be remapped) */
-   "iii\0"
-   "glPassTexCoordATI\0"
-   "\0"
-   /* _mesa_function_pool[25451]: DeleteProgram (will be remapped) */
-   "i\0"
-   "glDeleteProgram\0"
-   "\0"
-   /* _mesa_function_pool[25470]: Tangent3ivEXT (dynamic) */
-   "p\0"
-   "glTangent3ivEXT\0"
-   "\0"
-   /* _mesa_function_pool[25489]: Tangent3dEXT (dynamic) */
-   "ddd\0"
-   "glTangent3dEXT\0"
-   "\0"
-   /* _mesa_function_pool[25509]: SecondaryColor3dvEXT (will be remapped) */
-   "p\0"
-   "glSecondaryColor3dv\0"
-   "glSecondaryColor3dvEXT\0"
-   "\0"
-   /* _mesa_function_pool[25555]: AlphaFragmentOp2ATI (will be remapped) */
-   "iiiiiiiii\0"
-   "glAlphaFragmentOp2ATI\0"
-   "\0"
-   /* _mesa_function_pool[25588]: Vertex2fv (offset 129) */
-   "p\0"
-   "glVertex2fv\0"
-   "\0"
-   /* _mesa_function_pool[25603]: MultiDrawArraysEXT (will be remapped) */
-   "ippi\0"
-   "glMultiDrawArrays\0"
-   "glMultiDrawArraysEXT\0"
-   "\0"
-   /* _mesa_function_pool[25648]: BindRenderbufferEXT (will be remapped) */
-   "ii\0"
-   "glBindRenderbuffer\0"
-   "glBindRenderbufferEXT\0"
-   "\0"
-   /* _mesa_function_pool[25693]: MultiTexCoord4dARB (offset 400) */
-   "idddd\0"
-   "glMultiTexCoord4d\0"
-   "glMultiTexCoord4dARB\0"
-   "\0"
-   /* _mesa_function_pool[25739]: FramebufferTextureFaceARB (will be remapped) */
-   "iiiii\0"
-   "glFramebufferTextureFaceARB\0"
-   "\0"
-   /* _mesa_function_pool[25774]: Vertex3sv (offset 141) */
-   "p\0"
-   "glVertex3sv\0"
-   "\0"
-   /* _mesa_function_pool[25789]: SecondaryColor3usEXT (will be remapped) */
-   "iii\0"
-   "glSecondaryColor3us\0"
-   "glSecondaryColor3usEXT\0"
-   "\0"
-   /* _mesa_function_pool[25837]: ProgramLocalParameter4fvARB (will be remapped) */
-   "iip\0"
-   "glProgramLocalParameter4fvARB\0"
-   "\0"
-   /* _mesa_function_pool[25872]: DeleteProgramsNV (will be remapped) */
-   "ip\0"
-   "glDeleteProgramsARB\0"
-   "glDeleteProgramsNV\0"
-   "\0"
-   /* _mesa_function_pool[25915]: EvalMesh1 (offset 236) */
-   "iii\0"
-   "glEvalMesh1\0"
-   "\0"
-   /* _mesa_function_pool[25932]: PauseTransformFeedback (will be remapped) */
-   "\0"
-   "glPauseTransformFeedback\0"
-   "\0"
-   /* _mesa_function_pool[25959]: MultiTexCoord1sARB (offset 382) */
-   "ii\0"
-   "glMultiTexCoord1s\0"
-   "glMultiTexCoord1sARB\0"
-   "\0"
-   /* _mesa_function_pool[26002]: ReplacementCodeuiColor3fVertex3fSUN (dynamic) */
-   "iffffff\0"
-   "glReplacementCodeuiColor3fVertex3fSUN\0"
-   "\0"
-   /* _mesa_function_pool[26049]: GetVertexAttribPointervNV (will be remapped) */
-   "iip\0"
-   "glGetVertexAttribPointerv\0"
-   "glGetVertexAttribPointervARB\0"
-   "glGetVertexAttribPointervNV\0"
-   "\0"
-   /* _mesa_function_pool[26137]: VertexAttribs1fvNV (will be remapped) */
-   "iip\0"
-   "glVertexAttribs1fvNV\0"
-   "\0"
-   /* _mesa_function_pool[26163]: MultiTexCoord1dvARB (offset 377) */
-   "ip\0"
-   "glMultiTexCoord1dv\0"
-   "glMultiTexCoord1dvARB\0"
-   "\0"
-   /* _mesa_function_pool[26208]: Uniform2iARB (will be remapped) */
-   "iii\0"
-   "glUniform2i\0"
-   "glUniform2iARB\0"
-   "\0"
-   /* _mesa_function_pool[26240]: Vertex2iv (offset 131) */
-   "p\0"
-   "glVertex2iv\0"
-   "\0"
-   /* _mesa_function_pool[26255]: GetProgramStringNV (will be remapped) */
-   "iip\0"
-   "glGetProgramStringNV\0"
-   "\0"
-   /* _mesa_function_pool[26281]: ColorPointerEXT (will be remapped) */
-   "iiiip\0"
-   "glColorPointerEXT\0"
-   "\0"
-   /* _mesa_function_pool[26306]: LineWidth (offset 168) */
-   "f\0"
-   "glLineWidth\0"
-   "\0"
-   /* _mesa_function_pool[26321]: MapBufferARB (will be remapped) */
-   "ii\0"
-   "glMapBuffer\0"
-   "glMapBufferARB\0"
-   "\0"
-   /* _mesa_function_pool[26352]: MultiDrawElementsBaseVertex (will be remapped) */
-   "ipipip\0"
-   "glMultiDrawElementsBaseVertex\0"
-   "\0"
-   /* _mesa_function_pool[26390]: TexParameterIuivEXT (will be remapped) */
-   "iip\0"
-   "glTexParameterIuivEXT\0"
-   "glTexParameterIuiv\0"
-   "\0"
-   /* _mesa_function_pool[26436]: Binormal3svEXT (dynamic) */
-   "p\0"
-   "glBinormal3svEXT\0"
-   "\0"
-   /* _mesa_function_pool[26456]: ApplyTextureEXT (dynamic) */
-   "i\0"
-   "glApplyTextureEXT\0"
-   "\0"
-   /* _mesa_function_pool[26477]: GetBufferParameteri64v (will be remapped) */
-   "iip\0"
-   "glGetBufferParameteri64v\0"
-   "\0"
-   /* _mesa_function_pool[26507]: TexGendv (offset 189) */
-   "iip\0"
-   "glTexGendv\0"
-   "\0"
-   /* _mesa_function_pool[26523]: VertexAttribI3iEXT (will be remapped) */
-   "iiii\0"
-   "glVertexAttribI3iEXT\0"
-   "glVertexAttribI3i\0"
-   "\0"
-   /* _mesa_function_pool[26568]: EnableIndexedEXT (will be remapped) */
-   "ii\0"
-   "glEnableIndexedEXT\0"
-   "glEnablei\0"
-   "\0"
-   /* _mesa_function_pool[26601]: TextureMaterialEXT (dynamic) */
-   "ii\0"
-   "glTextureMaterialEXT\0"
-   "\0"
-   /* _mesa_function_pool[26626]: TextureLightEXT (dynamic) */
-   "i\0"
-   "glTextureLightEXT\0"
-   "\0"
-   /* _mesa_function_pool[26647]: ResetMinmax (offset 370) */
-   "i\0"
-   "glResetMinmax\0"
-   "glResetMinmaxEXT\0"
-   "\0"
-   /* _mesa_function_pool[26681]: SpriteParameterfSGIX (dynamic) */
-   "if\0"
-   "glSpriteParameterfSGIX\0"
-   "\0"
-   /* _mesa_function_pool[26708]: EnableClientState (offset 313) */
-   "i\0"
-   "glEnableClientState\0"
-   "\0"
-   /* _mesa_function_pool[26731]: VertexAttrib4sNV (will be remapped) */
-   "iiiii\0"
-   "glVertexAttrib4sNV\0"
-   "\0"
-   /* _mesa_function_pool[26757]: GetConvolutionParameterfv (offset 357) */
-   "iip\0"
-   "glGetConvolutionParameterfv\0"
-   "glGetConvolutionParameterfvEXT\0"
-   "\0"
-   /* _mesa_function_pool[26821]: VertexAttribs4dvNV (will be remapped) */
-   "iip\0"
-   "glVertexAttribs4dvNV\0"
-   "\0"
-   /* _mesa_function_pool[26847]: MultiModeDrawArraysIBM (will be remapped) */
-   "pppii\0"
-   "glMultiModeDrawArraysIBM\0"
-   "\0"
-   /* _mesa_function_pool[26879]: VertexAttrib4dARB (will be remapped) */
-   "idddd\0"
-   "glVertexAttrib4d\0"
-   "glVertexAttrib4dARB\0"
-   "\0"
-   /* _mesa_function_pool[26923]: GetTexBumpParameterfvATI (will be remapped) */
-   "ip\0"
-   "glGetTexBumpParameterfvATI\0"
-   "\0"
-   /* _mesa_function_pool[26954]: ProgramNamedParameter4dNV (will be remapped) */
-   "iipdddd\0"
-   "glProgramNamedParameter4dNV\0"
-   "\0"
-   /* _mesa_function_pool[26991]: GetMaterialfv (offset 269) */
-   "iip\0"
-   "glGetMaterialfv\0"
-   "\0"
-   /* _mesa_function_pool[27012]: VertexWeightfEXT (dynamic) */
-   "f\0"
-   "glVertexWeightfEXT\0"
-   "\0"
-   /* _mesa_function_pool[27034]: SetFragmentShaderConstantATI (will be remapped) */
-   "ip\0"
-   "glSetFragmentShaderConstantATI\0"
-   "\0"
-   /* _mesa_function_pool[27069]: Binormal3fEXT (dynamic) */
-   "fff\0"
-   "glBinormal3fEXT\0"
-   "\0"
-   /* _mesa_function_pool[27090]: CallList (offset 2) */
-   "i\0"
-   "glCallList\0"
-   "\0"
-   /* _mesa_function_pool[27104]: Materialfv (offset 170) */
-   "iip\0"
-   "glMaterialfv\0"
-   "\0"
-   /* _mesa_function_pool[27122]: TexCoord3fv (offset 113) */
-   "p\0"
-   "glTexCoord3fv\0"
-   "\0"
-   /* _mesa_function_pool[27139]: FogCoordfvEXT (will be remapped) */
-   "p\0"
-   "glFogCoordfv\0"
-   "glFogCoordfvEXT\0"
-   "\0"
-   /* _mesa_function_pool[27171]: MultiTexCoord1ivARB (offset 381) */
-   "ip\0"
-   "glMultiTexCoord1iv\0"
-   "glMultiTexCoord1ivARB\0"
-   "\0"
-   /* _mesa_function_pool[27216]: SecondaryColor3ubEXT (will be remapped) */
-   "iii\0"
-   "glSecondaryColor3ub\0"
-   "glSecondaryColor3ubEXT\0"
-   "\0"
-   /* _mesa_function_pool[27264]: MultiTexCoord2ivARB (offset 389) */
-   "ip\0"
-   "glMultiTexCoord2iv\0"
-   "glMultiTexCoord2ivARB\0"
-   "\0"
-   /* _mesa_function_pool[27309]: FogFuncSGIS (dynamic) */
-   "ip\0"
-   "glFogFuncSGIS\0"
-   "\0"
-   /* _mesa_function_pool[27327]: CopyTexSubImage2D (offset 326) */
-   "iiiiiiii\0"
-   "glCopyTexSubImage2D\0"
-   "glCopyTexSubImage2DEXT\0"
-   "\0"
-   /* _mesa_function_pool[27380]: GetObjectParameterivARB (will be remapped) */
-   "iip\0"
-   "glGetObjectParameterivARB\0"
-   "\0"
-   /* _mesa_function_pool[27411]: Color3iv (offset 16) */
-   "p\0"
-   "glColor3iv\0"
-   "\0"
-   /* _mesa_function_pool[27425]: TexCoord4fVertex4fSUN (dynamic) */
-   "ffffffff\0"
-   "glTexCoord4fVertex4fSUN\0"
-   "\0"
-   /* _mesa_function_pool[27459]: DrawElements (offset 311) */
-   "iiip\0"
-   "glDrawElements\0"
-   "\0"
-   /* _mesa_function_pool[27480]: BindVertexArrayAPPLE (will be remapped) */
-   "i\0"
-   "glBindVertexArrayAPPLE\0"
-   "\0"
-   /* _mesa_function_pool[27506]: GetProgramLocalParameterdvARB (will be remapped) */
-   "iip\0"
-   "glGetProgramLocalParameterdvARB\0"
-   "\0"
-   /* _mesa_function_pool[27543]: GetHistogramParameteriv (offset 363) */
-   "iip\0"
-   "glGetHistogramParameteriv\0"
-   "glGetHistogramParameterivEXT\0"
-   "\0"
-   /* _mesa_function_pool[27603]: MultiTexCoord1iARB (offset 380) */
-   "ii\0"
-   "glMultiTexCoord1i\0"
-   "glMultiTexCoord1iARB\0"
-   "\0"
-   /* _mesa_function_pool[27646]: GetConvolutionFilter (offset 356) */
-   "iiip\0"
-   "glGetConvolutionFilter\0"
-   "glGetConvolutionFilterEXT\0"
-   "\0"
-   /* _mesa_function_pool[27701]: GetProgramivARB (will be remapped) */
-   "iip\0"
-   "glGetProgramivARB\0"
-   "\0"
-   /* _mesa_function_pool[27724]: BlendFuncSeparateEXT (will be remapped) */
-   "iiii\0"
-   "glBlendFuncSeparate\0"
-   "glBlendFuncSeparateEXT\0"
-   "glBlendFuncSeparateINGR\0"
-   "\0"
-   /* _mesa_function_pool[27797]: MapBufferRange (will be remapped) */
-   "iiii\0"
-   "glMapBufferRange\0"
-   "\0"
-   /* _mesa_function_pool[27820]: ProgramParameters4dvNV (will be remapped) */
-   "iiip\0"
-   "glProgramParameters4dvNV\0"
-   "\0"
-   /* _mesa_function_pool[27851]: TexCoord2fColor3fVertex3fvSUN (dynamic) */
-   "ppp\0"
-   "glTexCoord2fColor3fVertex3fvSUN\0"
-   "\0"
-   /* _mesa_function_pool[27888]: EvalPoint2 (offset 239) */
-   "ii\0"
-   "glEvalPoint2\0"
-   "\0"
-   /* _mesa_function_pool[27905]: Uniform1uivEXT (will be remapped) */
-   "iip\0"
-   "glUniform1uivEXT\0"
-   "glUniform1uiv\0"
-   "\0"
-   /* _mesa_function_pool[27941]: EvalPoint1 (offset 237) */
-   "i\0"
-   "glEvalPoint1\0"
-   "\0"
-   /* _mesa_function_pool[27957]: Binormal3dvEXT (dynamic) */
-   "p\0"
-   "glBinormal3dvEXT\0"
-   "\0"
-   /* _mesa_function_pool[27977]: PopMatrix (offset 297) */
-   "\0"
-   "glPopMatrix\0"
-   "\0"
-   /* _mesa_function_pool[27991]: GetVertexAttribIuivEXT (will be remapped) */
-   "iip\0"
-   "glGetVertexAttribIuivEXT\0"
-   "glGetVertexAttribIuiv\0"
-   "\0"
-   /* _mesa_function_pool[28043]: FinishFenceNV (will be remapped) */
-   "i\0"
-   "glFinishFenceNV\0"
-   "\0"
-   /* _mesa_function_pool[28062]: GetFogFuncSGIS (dynamic) */
-   "p\0"
-   "glGetFogFuncSGIS\0"
-   "\0"
-   /* _mesa_function_pool[28082]: GetUniformLocationARB (will be remapped) */
-   "ip\0"
-   "glGetUniformLocation\0"
-   "glGetUniformLocationARB\0"
-   "\0"
-   /* _mesa_function_pool[28131]: SecondaryColor3fEXT (will be remapped) */
-   "fff\0"
-   "glSecondaryColor3f\0"
-   "glSecondaryColor3fEXT\0"
-   "\0"
-   /* _mesa_function_pool[28177]: GetTexGeniv (offset 280) */
-   "iip\0"
-   "glGetTexGeniv\0"
-   "\0"
-   /* _mesa_function_pool[28196]: CombinerInputNV (will be remapped) */
-   "iiiiii\0"
-   "glCombinerInputNV\0"
-   "\0"
-   /* _mesa_function_pool[28222]: VertexAttrib3sARB (will be remapped) */
-   "iiii\0"
-   "glVertexAttrib3s\0"
-   "glVertexAttrib3sARB\0"
-   "\0"
-   /* _mesa_function_pool[28265]: IsTransformFeedback (will be remapped) */
-   "i\0"
-   "glIsTransformFeedback\0"
-   "\0"
-   /* _mesa_function_pool[28290]: ReplacementCodeuiNormal3fVertex3fvSUN (dynamic) */
-   "ppp\0"
-   "glReplacementCodeuiNormal3fVertex3fvSUN\0"
-   "\0"
-   /* _mesa_function_pool[28335]: Map2d (offset 222) */
-   "iddiiddiip\0"
-   "glMap2d\0"
-   "\0"
-   /* _mesa_function_pool[28355]: Map2f (offset 223) */
-   "iffiiffiip\0"
-   "glMap2f\0"
-   "\0"
-   /* _mesa_function_pool[28375]: ProgramStringARB (will be remapped) */
-   "iiip\0"
-   "glProgramStringARB\0"
-   "\0"
-   /* _mesa_function_pool[28400]: Vertex4s (offset 148) */
-   "iiii\0"
-   "glVertex4s\0"
-   "\0"
-   /* _mesa_function_pool[28417]: TexCoord4fVertex4fvSUN (dynamic) */
-   "pp\0"
-   "glTexCoord4fVertex4fvSUN\0"
-   "\0"
-   /* _mesa_function_pool[28446]: FragmentLightModelivSGIX (dynamic) */
-   "ip\0"
-   "glFragmentLightModelivSGIX\0"
-   "\0"
-   /* _mesa_function_pool[28477]: VertexAttrib1fNV (will be remapped) */
-   "if\0"
-   "glVertexAttrib1fNV\0"
-   "\0"
-   /* _mesa_function_pool[28500]: Vertex4f (offset 144) */
-   "ffff\0"
-   "glVertex4f\0"
-   "\0"
-   /* _mesa_function_pool[28517]: EvalCoord1d (offset 228) */
-   "d\0"
-   "glEvalCoord1d\0"
-   "\0"
-   /* _mesa_function_pool[28534]: Vertex4d (offset 142) */
-   "dddd\0"
-   "glVertex4d\0"
-   "\0"
-   /* _mesa_function_pool[28551]: RasterPos4dv (offset 79) */
-   "p\0"
-   "glRasterPos4dv\0"
-   "\0"
-   /* _mesa_function_pool[28569]: UseShaderProgramEXT (will be remapped) */
-   "ii\0"
-   "glUseShaderProgramEXT\0"
-   "\0"
-   /* _mesa_function_pool[28595]: FragmentLightfSGIX (dynamic) */
-   "iif\0"
-   "glFragmentLightfSGIX\0"
-   "\0"
-   /* _mesa_function_pool[28621]: GetCompressedTexImageARB (will be remapped) */
-   "iip\0"
-   "glGetCompressedTexImage\0"
-   "glGetCompressedTexImageARB\0"
-   "\0"
-   /* _mesa_function_pool[28677]: GetTexGenfv (offset 279) */
-   "iip\0"
-   "glGetTexGenfv\0"
-   "\0"
-   /* _mesa_function_pool[28696]: Vertex4i (offset 146) */
-   "iiii\0"
-   "glVertex4i\0"
-   "\0"
-   /* _mesa_function_pool[28713]: VertexWeightPointerEXT (dynamic) */
-   "iiip\0"
-   "glVertexWeightPointerEXT\0"
-   "\0"
-   /* _mesa_function_pool[28744]: GetHistogram (offset 361) */
-   "iiiip\0"
-   "glGetHistogram\0"
-   "glGetHistogramEXT\0"
-   "\0"
-   /* _mesa_function_pool[28784]: ActiveStencilFaceEXT (will be remapped) */
-   "i\0"
-   "glActiveStencilFaceEXT\0"
-   "\0"
-   /* _mesa_function_pool[28810]: StencilFuncSeparateATI (will be remapped) */
-   "iiii\0"
-   "glStencilFuncSeparateATI\0"
-   "\0"
-   /* _mesa_function_pool[28841]: Materialf (offset 169) */
-   "iif\0"
-   "glMaterialf\0"
-   "\0"
-   /* _mesa_function_pool[28858]: GetShaderSourceARB (will be remapped) */
-   "iipp\0"
-   "glGetShaderSource\0"
-   "glGetShaderSourceARB\0"
-   "\0"
-   /* _mesa_function_pool[28903]: IglooInterfaceSGIX (dynamic) */
-   "ip\0"
-   "glIglooInterfaceSGIX\0"
-   "\0"
-   /* _mesa_function_pool[28928]: Materiali (offset 171) */
-   "iii\0"
-   "glMateriali\0"
-   "\0"
-   /* _mesa_function_pool[28945]: VertexAttrib4dNV (will be remapped) */
-   "idddd\0"
-   "glVertexAttrib4dNV\0"
-   "\0"
-   /* _mesa_function_pool[28971]: MultiModeDrawElementsIBM (will be remapped) */
-   "ppipii\0"
-   "glMultiModeDrawElementsIBM\0"
-   "\0"
-   /* _mesa_function_pool[29006]: Indexsv (offset 51) */
-   "p\0"
-   "glIndexsv\0"
-   "\0"
-   /* _mesa_function_pool[29019]: MultiTexCoord4svARB (offset 407) */
-   "ip\0"
-   "glMultiTexCoord4sv\0"
-   "glMultiTexCoord4svARB\0"
-   "\0"
-   /* _mesa_function_pool[29064]: LightModelfv (offset 164) */
-   "ip\0"
-   "glLightModelfv\0"
-   "\0"
-   /* _mesa_function_pool[29083]: TexCoord2dv (offset 103) */
-   "p\0"
-   "glTexCoord2dv\0"
-   "\0"
-   /* _mesa_function_pool[29100]: GenQueriesARB (will be remapped) */
-   "ip\0"
-   "glGenQueries\0"
-   "glGenQueriesARB\0"
-   "\0"
-   /* _mesa_function_pool[29133]: EvalCoord1dv (offset 229) */
-   "p\0"
-   "glEvalCoord1dv\0"
-   "\0"
-   /* _mesa_function_pool[29151]: ReplacementCodeuiVertex3fSUN (dynamic) */
-   "ifff\0"
-   "glReplacementCodeuiVertex3fSUN\0"
-   "\0"
-   /* _mesa_function_pool[29188]: Translated (offset 303) */
-   "ddd\0"
-   "glTranslated\0"
-   "\0"
-   /* _mesa_function_pool[29206]: Translatef (offset 304) */
-   "fff\0"
-   "glTranslatef\0"
-   "\0"
-   /* _mesa_function_pool[29224]: Uniform3uiEXT (will be remapped) */
-   "iiii\0"
-   "glUniform3uiEXT\0"
-   "glUniform3ui\0"
-   "\0"
-   /* _mesa_function_pool[29259]: StencilMask (offset 209) */
-   "i\0"
-   "glStencilMask\0"
-   "\0"
-   /* _mesa_function_pool[29276]: Tangent3iEXT (dynamic) */
-   "iii\0"
-   "glTangent3iEXT\0"
-   "\0"
-   /* _mesa_function_pool[29296]: GetLightiv (offset 265) */
-   "iip\0"
-   "glGetLightiv\0"
-   "\0"
-   /* _mesa_function_pool[29314]: DrawMeshArraysSUN (dynamic) */
-   "iiii\0"
-   "glDrawMeshArraysSUN\0"
-   "\0"
-   /* _mesa_function_pool[29340]: IsList (offset 287) */
-   "i\0"
-   "glIsList\0"
-   "\0"
-   /* _mesa_function_pool[29352]: IsSync (will be remapped) */
-   "i\0"
-   "glIsSync\0"
-   "\0"
-   /* _mesa_function_pool[29364]: RenderMode (offset 196) */
-   "i\0"
-   "glRenderMode\0"
-   "\0"
-   /* _mesa_function_pool[29380]: GetMapControlPointsNV (dynamic) */
-   "iiiiiip\0"
-   "glGetMapControlPointsNV\0"
-   "\0"
-   /* _mesa_function_pool[29413]: DrawBuffersARB (will be remapped) */
-   "ip\0"
-   "glDrawBuffers\0"
-   "glDrawBuffersARB\0"
-   "glDrawBuffersATI\0"
-   "\0"
-   /* _mesa_function_pool[29465]: ClearBufferiv (will be remapped) */
-   "iip\0"
-   "glClearBufferiv\0"
-   "\0"
-   /* _mesa_function_pool[29486]: ProgramLocalParameter4fARB (will be remapped) */
-   "iiffff\0"
-   "glProgramLocalParameter4fARB\0"
-   "\0"
-   /* _mesa_function_pool[29523]: SpriteParameterivSGIX (dynamic) */
-   "ip\0"
-   "glSpriteParameterivSGIX\0"
-   "\0"
-   /* _mesa_function_pool[29551]: ProvokingVertexEXT (will be remapped) */
-   "i\0"
-   "glProvokingVertexEXT\0"
-   "glProvokingVertex\0"
-   "\0"
-   /* _mesa_function_pool[29593]: MultiTexCoord1fARB (offset 378) */
-   "if\0"
-   "glMultiTexCoord1f\0"
-   "glMultiTexCoord1fARB\0"
-   "\0"
-   /* _mesa_function_pool[29636]: LoadName (offset 198) */
-   "i\0"
-   "glLoadName\0"
-   "\0"
-   /* _mesa_function_pool[29650]: VertexAttribs4ubvNV (will be remapped) */
-   "iip\0"
-   "glVertexAttribs4ubvNV\0"
-   "\0"
-   /* _mesa_function_pool[29677]: WeightsvARB (dynamic) */
-   "ip\0"
-   "glWeightsvARB\0"
-   "\0"
-   /* _mesa_function_pool[29695]: Uniform1fvARB (will be remapped) */
-   "iip\0"
-   "glUniform1fv\0"
-   "glUniform1fvARB\0"
-   "\0"
-   /* _mesa_function_pool[29729]: CopyTexSubImage1D (offset 325) */
-   "iiiiii\0"
-   "glCopyTexSubImage1D\0"
-   "glCopyTexSubImage1DEXT\0"
-   "\0"
-   /* _mesa_function_pool[29780]: CullFace (offset 152) */
-   "i\0"
-   "glCullFace\0"
-   "\0"
-   /* _mesa_function_pool[29794]: BindTexture (offset 307) */
-   "ii\0"
-   "glBindTexture\0"
-   "glBindTextureEXT\0"
-   "\0"
-   /* _mesa_function_pool[29829]: BeginFragmentShaderATI (will be remapped) */
-   "\0"
-   "glBeginFragmentShaderATI\0"
-   "\0"
-   /* _mesa_function_pool[29856]: MultiTexCoord4fARB (offset 402) */
-   "iffff\0"
-   "glMultiTexCoord4f\0"
-   "glMultiTexCoord4fARB\0"
-   "\0"
-   /* _mesa_function_pool[29902]: VertexAttribs3svNV (will be remapped) */
-   "iip\0"
-   "glVertexAttribs3svNV\0"
-   "\0"
-   /* _mesa_function_pool[29928]: StencilFunc (offset 243) */
-   "iii\0"
-   "glStencilFunc\0"
-   "\0"
-   /* _mesa_function_pool[29947]: CopyPixels (offset 255) */
-   "iiiii\0"
-   "glCopyPixels\0"
-   "\0"
-   /* _mesa_function_pool[29967]: Rectsv (offset 93) */
-   "pp\0"
-   "glRectsv\0"
-   "\0"
-   /* _mesa_function_pool[29980]: ReplacementCodeuivSUN (dynamic) */
-   "p\0"
-   "glReplacementCodeuivSUN\0"
-   "\0"
-   /* _mesa_function_pool[30007]: EnableVertexAttribArrayARB (will be remapped) */
-   "i\0"
-   "glEnableVertexAttribArray\0"
-   "glEnableVertexAttribArrayARB\0"
-   "\0"
-   /* _mesa_function_pool[30065]: NormalPointervINTEL (dynamic) */
-   "ip\0"
-   "glNormalPointervINTEL\0"
-   "\0"
-   /* _mesa_function_pool[30091]: CopyConvolutionFilter2D (offset 355) */
-   "iiiiii\0"
-   "glCopyConvolutionFilter2D\0"
-   "glCopyConvolutionFilter2DEXT\0"
-   "\0"
-   /* _mesa_function_pool[30154]: WindowPos3ivMESA (will be remapped) */
-   "p\0"
-   "glWindowPos3iv\0"
-   "glWindowPos3ivARB\0"
-   "glWindowPos3ivMESA\0"
-   "\0"
-   /* _mesa_function_pool[30209]: CopyBufferSubData (will be remapped) */
-   "iiiii\0"
-   "glCopyBufferSubData\0"
-   "\0"
-   /* _mesa_function_pool[30236]: NormalPointer (offset 318) */
-   "iip\0"
-   "glNormalPointer\0"
-   "\0"
-   /* _mesa_function_pool[30257]: TexParameterfv (offset 179) */
-   "iip\0"
-   "glTexParameterfv\0"
-   "\0"
-   /* _mesa_function_pool[30279]: IsBufferARB (will be remapped) */
-   "i\0"
-   "glIsBuffer\0"
-   "glIsBufferARB\0"
-   "\0"
-   /* _mesa_function_pool[30307]: WindowPos4iMESA (will be remapped) */
-   "iiii\0"
-   "glWindowPos4iMESA\0"
-   "\0"
-   /* _mesa_function_pool[30331]: VertexAttrib4uivARB (will be remapped) */
-   "ip\0"
-   "glVertexAttrib4uiv\0"
-   "glVertexAttrib4uivARB\0"
-   "\0"
-   /* _mesa_function_pool[30376]: Tangent3bvEXT (dynamic) */
-   "p\0"
-   "glTangent3bvEXT\0"
-   "\0"
-   /* _mesa_function_pool[30395]: VertexAttribI3uivEXT (will be remapped) */
-   "ip\0"
-   "glVertexAttribI3uivEXT\0"
-   "glVertexAttribI3uiv\0"
-   "\0"
-   /* _mesa_function_pool[30442]: UniformMatrix3x4fv (will be remapped) */
-   "iiip\0"
-   "glUniformMatrix3x4fv\0"
-   "\0"
-   /* _mesa_function_pool[30469]: ClipPlane (offset 150) */
-   "ip\0"
-   "glClipPlane\0"
-   "\0"
-   /* _mesa_function_pool[30485]: Recti (offset 90) */
-   "iiii\0"
-   "glRecti\0"
-   "\0"
-   /* _mesa_function_pool[30499]: VertexAttribI3ivEXT (will be remapped) */
-   "ip\0"
-   "glVertexAttribI3ivEXT\0"
-   "glVertexAttribI3iv\0"
-   "\0"
-   /* _mesa_function_pool[30544]: DrawRangeElementsBaseVertex (will be remapped) */
-   "iiiiipi\0"
-   "glDrawRangeElementsBaseVertex\0"
-   "\0"
-   /* _mesa_function_pool[30583]: TexCoordPointervINTEL (dynamic) */
-   "iip\0"
-   "glTexCoordPointervINTEL\0"
-   "\0"
-   /* _mesa_function_pool[30612]: DeleteBuffersARB (will be remapped) */
-   "ip\0"
-   "glDeleteBuffers\0"
-   "glDeleteBuffersARB\0"
-   "\0"
-   /* _mesa_function_pool[30651]: PixelTransformParameterfvEXT (dynamic) */
-   "iip\0"
-   "glPixelTransformParameterfvEXT\0"
-   "\0"
-   /* _mesa_function_pool[30687]: PrimitiveRestartNV (will be remapped) */
-   "\0"
-   "glPrimitiveRestartNV\0"
-   "\0"
-   /* _mesa_function_pool[30710]: WindowPos4fvMESA (will be remapped) */
-   "p\0"
-   "glWindowPos4fvMESA\0"
-   "\0"
-   /* _mesa_function_pool[30732]: GetPixelMapuiv (offset 272) */
-   "ip\0"
-   "glGetPixelMapuiv\0"
-   "\0"
-   /* _mesa_function_pool[30753]: Rectf (offset 88) */
-   "ffff\0"
-   "glRectf\0"
-   "\0"
-   /* _mesa_function_pool[30767]: VertexAttrib1sNV (will be remapped) */
-   "ii\0"
-   "glVertexAttrib1sNV\0"
-   "\0"
-   /* _mesa_function_pool[30790]: Indexfv (offset 47) */
-   "p\0"
-   "glIndexfv\0"
-   "\0"
-   /* _mesa_function_pool[30803]: SecondaryColor3svEXT (will be remapped) */
-   "p\0"
-   "glSecondaryColor3sv\0"
-   "glSecondaryColor3svEXT\0"
-   "\0"
-   /* _mesa_function_pool[30849]: LoadTransposeMatrixfARB (will be remapped) */
-   "p\0"
-   "glLoadTransposeMatrixf\0"
-   "glLoadTransposeMatrixfARB\0"
-   "\0"
-   /* _mesa_function_pool[30901]: GetPointerv (offset 329) */
-   "ip\0"
-   "glGetPointerv\0"
-   "glGetPointervEXT\0"
-   "\0"
-   /* _mesa_function_pool[30936]: Tangent3bEXT (dynamic) */
-   "iii\0"
-   "glTangent3bEXT\0"
-   "\0"
-   /* _mesa_function_pool[30956]: CombinerParameterfNV (will be remapped) */
-   "if\0"
-   "glCombinerParameterfNV\0"
-   "\0"
-   /* _mesa_function_pool[30983]: IndexMask (offset 212) */
-   "i\0"
-   "glIndexMask\0"
-   "\0"
-   /* _mesa_function_pool[30998]: BindProgramNV (will be remapped) */
-   "ii\0"
-   "glBindProgramARB\0"
-   "glBindProgramNV\0"
-   "\0"
-   /* _mesa_function_pool[31035]: VertexAttrib4svARB (will be remapped) */
-   "ip\0"
-   "glVertexAttrib4sv\0"
-   "glVertexAttrib4svARB\0"
-   "\0"
-   /* _mesa_function_pool[31078]: GetFloatv (offset 262) */
-   "ip\0"
-   "glGetFloatv\0"
-   "\0"
-   /* _mesa_function_pool[31094]: CreateDebugObjectMESA (dynamic) */
-   "\0"
-   "glCreateDebugObjectMESA\0"
-   "\0"
-   /* _mesa_function_pool[31120]: GetShaderiv (will be remapped) */
-   "iip\0"
-   "glGetShaderiv\0"
-   "\0"
-   /* _mesa_function_pool[31139]: ClientWaitSync (will be remapped) */
-   "iii\0"
-   "glClientWaitSync\0"
-   "\0"
-   /* _mesa_function_pool[31161]: TexCoord4s (offset 124) */
-   "iiii\0"
-   "glTexCoord4s\0"
-   "\0"
-   /* _mesa_function_pool[31180]: TexCoord3sv (offset 117) */
-   "p\0"
-   "glTexCoord3sv\0"
-   "\0"
-   /* _mesa_function_pool[31197]: BindFragmentShaderATI (will be remapped) */
-   "i\0"
-   "glBindFragmentShaderATI\0"
-   "\0"
-   /* _mesa_function_pool[31224]: PopAttrib (offset 218) */
-   "\0"
-   "glPopAttrib\0"
-   "\0"
-   /* _mesa_function_pool[31238]: Fogfv (offset 154) */
-   "ip\0"
-   "glFogfv\0"
-   "\0"
-   /* _mesa_function_pool[31250]: UnmapBufferARB (will be remapped) */
-   "i\0"
-   "glUnmapBuffer\0"
-   "glUnmapBufferARB\0"
-   "\0"
-   /* _mesa_function_pool[31284]: InitNames (offset 197) */
-   "\0"
-   "glInitNames\0"
-   "\0"
-   /* _mesa_function_pool[31298]: Normal3sv (offset 61) */
-   "p\0"
-   "glNormal3sv\0"
-   "\0"
-   /* _mesa_function_pool[31313]: Minmax (offset 368) */
-   "iii\0"
-   "glMinmax\0"
-   "glMinmaxEXT\0"
-   "\0"
-   /* _mesa_function_pool[31339]: TexCoord4d (offset 118) */
-   "dddd\0"
-   "glTexCoord4d\0"
-   "\0"
-   /* _mesa_function_pool[31358]: TexCoord4f (offset 120) */
-   "ffff\0"
-   "glTexCoord4f\0"
-   "\0"
-   /* _mesa_function_pool[31377]: FogCoorddvEXT (will be remapped) */
-   "p\0"
-   "glFogCoorddv\0"
-   "glFogCoorddvEXT\0"
-   "\0"
-   /* _mesa_function_pool[31409]: FinishTextureSUNX (dynamic) */
-   "\0"
-   "glFinishTextureSUNX\0"
-   "\0"
-   /* _mesa_function_pool[31431]: GetFragmentLightfvSGIX (dynamic) */
-   "iip\0"
-   "glGetFragmentLightfvSGIX\0"
-   "\0"
-   /* _mesa_function_pool[31461]: Binormal3fvEXT (dynamic) */
-   "p\0"
-   "glBinormal3fvEXT\0"
-   "\0"
-   /* _mesa_function_pool[31481]: GetBooleanv (offset 258) */
-   "ip\0"
-   "glGetBooleanv\0"
-   "\0"
-   /* _mesa_function_pool[31499]: ColorFragmentOp3ATI (will be remapped) */
-   "iiiiiiiiiiiii\0"
-   "glColorFragmentOp3ATI\0"
-   "\0"
-   /* _mesa_function_pool[31536]: Hint (offset 158) */
-   "ii\0"
-   "glHint\0"
-   "\0"
-   /* _mesa_function_pool[31547]: Color4dv (offset 28) */
-   "p\0"
-   "glColor4dv\0"
-   "\0"
-   /* _mesa_function_pool[31561]: VertexAttrib2svARB (will be remapped) */
-   "ip\0"
-   "glVertexAttrib2sv\0"
-   "glVertexAttrib2svARB\0"
-   "\0"
-   /* _mesa_function_pool[31604]: AreProgramsResidentNV (will be remapped) */
-   "ipp\0"
-   "glAreProgramsResidentNV\0"
-   "\0"
-   /* _mesa_function_pool[31633]: WindowPos3svMESA (will be remapped) */
-   "p\0"
-   "glWindowPos3sv\0"
-   "glWindowPos3svARB\0"
-   "glWindowPos3svMESA\0"
-   "\0"
-   /* _mesa_function_pool[31688]: CopyColorSubTable (offset 347) */
-   "iiiii\0"
-   "glCopyColorSubTable\0"
-   "glCopyColorSubTableEXT\0"
-   "\0"
-   /* _mesa_function_pool[31738]: WeightdvARB (dynamic) */
-   "ip\0"
-   "glWeightdvARB\0"
-   "\0"
-   /* _mesa_function_pool[31756]: DeleteRenderbuffersEXT (will be remapped) */
-   "ip\0"
-   "glDeleteRenderbuffers\0"
-   "glDeleteRenderbuffersEXT\0"
-   "\0"
-   /* _mesa_function_pool[31807]: VertexAttrib4NubvARB (will be remapped) */
-   "ip\0"
-   "glVertexAttrib4Nubv\0"
-   "glVertexAttrib4NubvARB\0"
-   "\0"
-   /* _mesa_function_pool[31854]: VertexAttrib3dvNV (will be remapped) */
-   "ip\0"
-   "glVertexAttrib3dvNV\0"
-   "\0"
-   /* _mesa_function_pool[31878]: GetObjectParameterfvARB (will be remapped) */
-   "iip\0"
-   "glGetObjectParameterfvARB\0"
-   "\0"
-   /* _mesa_function_pool[31909]: Vertex4iv (offset 147) */
-   "p\0"
-   "glVertex4iv\0"
-   "\0"
-   /* _mesa_function_pool[31924]: GetProgramEnvParameterdvARB (will be remapped) */
-   "iip\0"
-   "glGetProgramEnvParameterdvARB\0"
-   "\0"
-   /* _mesa_function_pool[31959]: TexCoord4dv (offset 119) */
-   "p\0"
-   "glTexCoord4dv\0"
-   "\0"
-   /* _mesa_function_pool[31976]: LockArraysEXT (will be remapped) */
-   "ii\0"
-   "glLockArraysEXT\0"
-   "\0"
-   /* _mesa_function_pool[31996]: Begin (offset 7) */
-   "i\0"
-   "glBegin\0"
-   "\0"
-   /* _mesa_function_pool[32007]: LightModeli (offset 165) */
-   "ii\0"
-   "glLightModeli\0"
-   "\0"
-   /* _mesa_function_pool[32025]: VertexAttribI4ivEXT (will be remapped) */
-   "ip\0"
-   "glVertexAttribI4ivEXT\0"
-   "glVertexAttribI4iv\0"
-   "\0"
-   /* _mesa_function_pool[32070]: Rectfv (offset 89) */
-   "pp\0"
-   "glRectfv\0"
-   "\0"
-   /* _mesa_function_pool[32083]: BlendEquationSeparateiARB (will be remapped) */
-   "iii\0"
-   "glBlendEquationSeparateiARB\0"
-   "\0"
-   /* _mesa_function_pool[32116]: LightModelf (offset 163) */
-   "if\0"
-   "glLightModelf\0"
-   "\0"
-   /* _mesa_function_pool[32134]: GetTexParameterfv (offset 282) */
-   "iip\0"
-   "glGetTexParameterfv\0"
-   "\0"
-   /* _mesa_function_pool[32159]: GetLightfv (offset 264) */
-   "iip\0"
-   "glGetLightfv\0"
-   "\0"
-   /* _mesa_function_pool[32177]: PixelTransformParameterivEXT (dynamic) */
-   "iip\0"
-   "glPixelTransformParameterivEXT\0"
-   "\0"
-   /* _mesa_function_pool[32213]: BinormalPointerEXT (dynamic) */
-   "iip\0"
-   "glBinormalPointerEXT\0"
-   "\0"
-   /* _mesa_function_pool[32239]: VertexAttrib1dNV (will be remapped) */
-   "id\0"
-   "glVertexAttrib1dNV\0"
-   "\0"
-   /* _mesa_function_pool[32262]: GetCombinerInputParameterivNV (will be remapped) */
-   "iiiip\0"
-   "glGetCombinerInputParameterivNV\0"
-   "\0"
-   /* _mesa_function_pool[32301]: Disable (offset 214) */
-   "i\0"
-   "glDisable\0"
-   "\0"
-   /* _mesa_function_pool[32314]: MultiTexCoord2fvARB (offset 387) */
-   "ip\0"
-   "glMultiTexCoord2fv\0"
-   "glMultiTexCoord2fvARB\0"
-   "\0"
-   /* _mesa_function_pool[32359]: GetRenderbufferParameterivEXT (will be remapped) */
-   "iip\0"
-   "glGetRenderbufferParameteriv\0"
-   "glGetRenderbufferParameterivEXT\0"
-   "\0"
-   /* _mesa_function_pool[32425]: CombinerParameterivNV (will be remapped) */
-   "ip\0"
-   "glCombinerParameterivNV\0"
-   "\0"
-   /* _mesa_function_pool[32453]: GenFragmentShadersATI (will be remapped) */
-   "i\0"
-   "glGenFragmentShadersATI\0"
-   "\0"
-   /* _mesa_function_pool[32480]: DrawArrays (offset 310) */
-   "iii\0"
-   "glDrawArrays\0"
-   "glDrawArraysEXT\0"
-   "\0"
-   /* _mesa_function_pool[32514]: WeightuivARB (dynamic) */
-   "ip\0"
-   "glWeightuivARB\0"
-   "\0"
-   /* _mesa_function_pool[32533]: VertexAttrib2sARB (will be remapped) */
-   "iii\0"
-   "glVertexAttrib2s\0"
-   "glVertexAttrib2sARB\0"
-   "\0"
-   /* _mesa_function_pool[32575]: ColorMask (offset 210) */
-   "iiii\0"
-   "glColorMask\0"
-   "\0"
-   /* _mesa_function_pool[32593]: GenAsyncMarkersSGIX (dynamic) */
-   "i\0"
-   "glGenAsyncMarkersSGIX\0"
-   "\0"
-   /* _mesa_function_pool[32618]: Tangent3svEXT (dynamic) */
-   "p\0"
-   "glTangent3svEXT\0"
-   "\0"
-   /* _mesa_function_pool[32637]: GetListParameterivSGIX (dynamic) */
-   "iip\0"
-   "glGetListParameterivSGIX\0"
-   "\0"
-   /* _mesa_function_pool[32667]: BindBufferARB (will be remapped) */
-   "ii\0"
-   "glBindBuffer\0"
-   "glBindBufferARB\0"
-   "\0"
-   /* _mesa_function_pool[32700]: GetInfoLogARB (will be remapped) */
-   "iipp\0"
-   "glGetInfoLogARB\0"
-   "\0"
-   /* _mesa_function_pool[32722]: RasterPos4iv (offset 83) */
-   "p\0"
-   "glRasterPos4iv\0"
-   "\0"
-   /* _mesa_function_pool[32740]: Enable (offset 215) */
-   "i\0"
-   "glEnable\0"
-   "\0"
-   /* _mesa_function_pool[32752]: LineStipple (offset 167) */
-   "ii\0"
-   "glLineStipple\0"
-   "\0"
-   /* _mesa_function_pool[32770]: VertexAttribs4svNV (will be remapped) */
-   "iip\0"
-   "glVertexAttribs4svNV\0"
-   "\0"
-   /* _mesa_function_pool[32796]: EdgeFlagPointerListIBM (dynamic) */
-   "ipi\0"
-   "glEdgeFlagPointerListIBM\0"
-   "\0"
-   /* _mesa_function_pool[32826]: UniformMatrix3x2fv (will be remapped) */
-   "iiip\0"
-   "glUniformMatrix3x2fv\0"
-   "\0"
-   /* _mesa_function_pool[32853]: GetMinmaxParameterfv (offset 365) */
-   "iip\0"
-   "glGetMinmaxParameterfv\0"
-   "glGetMinmaxParameterfvEXT\0"
-   "\0"
-   /* _mesa_function_pool[32907]: VertexAttrib1fvARB (will be remapped) */
-   "ip\0"
-   "glVertexAttrib1fv\0"
-   "glVertexAttrib1fvARB\0"
-   "\0"
-   /* _mesa_function_pool[32950]: GenBuffersARB (will be remapped) */
-   "ip\0"
-   "glGenBuffers\0"
-   "glGenBuffersARB\0"
-   "\0"
-   /* _mesa_function_pool[32983]: VertexAttribs1svNV (will be remapped) */
-   "iip\0"
-   "glVertexAttribs1svNV\0"
-   "\0"
-   /* _mesa_function_pool[33009]: Vertex3fv (offset 137) */
-   "p\0"
-   "glVertex3fv\0"
-   "\0"
-   /* _mesa_function_pool[33024]: GetTexBumpParameterivATI (will be remapped) */
-   "ip\0"
-   "glGetTexBumpParameterivATI\0"
-   "\0"
-   /* _mesa_function_pool[33055]: Binormal3bEXT (dynamic) */
-   "iii\0"
-   "glBinormal3bEXT\0"
-   "\0"
-   /* _mesa_function_pool[33076]: FragmentMaterialivSGIX (dynamic) */
-   "iip\0"
-   "glFragmentMaterialivSGIX\0"
-   "\0"
-   /* _mesa_function_pool[33106]: IsRenderbufferEXT (will be remapped) */
-   "i\0"
-   "glIsRenderbuffer\0"
-   "glIsRenderbufferEXT\0"
-   "\0"
-   /* _mesa_function_pool[33146]: GenProgramsNV (will be remapped) */
-   "ip\0"
-   "glGenProgramsARB\0"
-   "glGenProgramsNV\0"
-   "\0"
-   /* _mesa_function_pool[33183]: VertexAttrib4dvNV (will be remapped) */
-   "ip\0"
-   "glVertexAttrib4dvNV\0"
-   "\0"
-   /* _mesa_function_pool[33207]: EndFragmentShaderATI (will be remapped) */
-   "\0"
-   "glEndFragmentShaderATI\0"
-   "\0"
-   /* _mesa_function_pool[33232]: Binormal3iEXT (dynamic) */
-   "iii\0"
-   "glBinormal3iEXT\0"
-   "\0"
-   /* _mesa_function_pool[33253]: WindowPos2fMESA (will be remapped) */
-   "ff\0"
-   "glWindowPos2f\0"
-   "glWindowPos2fARB\0"
-   "glWindowPos2fMESA\0"
-   "\0"
-   ;
-
-/* these functions need to be remapped */
-static const struct gl_function_pool_remap MESA_remap_table_functions[] = {
-   {  1616, AttachShader_remap_index },
-   {  9893, CreateProgram_remap_index },
-   { 22964, CreateShader_remap_index },
-   { 25451, DeleteProgram_remap_index },
-   { 18608, DeleteShader_remap_index },
-   { 23465, DetachShader_remap_index },
-   { 17974, GetAttachedShaders_remap_index },
-   {  4856, GetProgramInfoLog_remap_index },
-   {   444, GetProgramiv_remap_index },
-   {  6529, GetShaderInfoLog_remap_index },
-   { 31120, GetShaderiv_remap_index },
-   { 13387, IsProgram_remap_index },
-   { 12308, IsShader_remap_index },
-   { 10023, StencilFuncSeparate_remap_index },
-   {  3960, StencilMaskSeparate_remap_index },
-   {  7594, StencilOpSeparate_remap_index },
-   { 22252, UniformMatrix2x3fv_remap_index },
-   {  2886, UniformMatrix2x4fv_remap_index },
-   { 32826, UniformMatrix3x2fv_remap_index },
-   { 30442, UniformMatrix3x4fv_remap_index },
-   { 16264, UniformMatrix4x2fv_remap_index },
-   {  3302, UniformMatrix4x3fv_remap_index },
-   {  5017, ClampColor_remap_index },
-   { 18028, ClearBufferfi_remap_index },
-   { 17470, ClearBufferfv_remap_index },
-   { 29465, ClearBufferiv_remap_index },
-   { 13592, ClearBufferuiv_remap_index },
-   { 19891, GetStringi_remap_index },
-   {  2827, TexBuffer_remap_index },
-   {   977, FramebufferTexture_remap_index },
-   { 26477, GetBufferParameteri64v_remap_index },
-   { 10123, GetInteger64i_v_remap_index },
-   { 23278, VertexAttribDivisor_remap_index },
-   {  9911, LoadTransposeMatrixdARB_remap_index },
-   { 30849, LoadTransposeMatrixfARB_remap_index },
-   {  5637, MultTransposeMatrixdARB_remap_index },
-   { 23652, MultTransposeMatrixfARB_remap_index },
-   {   255, SampleCoverageARB_remap_index },
-   {  5821, CompressedTexImage1DARB_remap_index },
-   { 24180, CompressedTexImage2DARB_remap_index },
-   {  4023, CompressedTexImage3DARB_remap_index },
-   { 18325, CompressedTexSubImage1DARB_remap_index },
-   {  2089, CompressedTexSubImage2DARB_remap_index },
-   { 20313, CompressedTexSubImage3DARB_remap_index },
-   { 28621, GetCompressedTexImageARB_remap_index },
-   {  3868, DisableVertexAttribArrayARB_remap_index },
-   { 30007, EnableVertexAttribArrayARB_remap_index },
-   { 31924, GetProgramEnvParameterdvARB_remap_index },
-   { 23532, GetProgramEnvParameterfvARB_remap_index },
-   { 27506, GetProgramLocalParameterdvARB_remap_index },
-   {  8036, GetProgramLocalParameterfvARB_remap_index },
-   { 18459, GetProgramStringARB_remap_index },
-   { 27701, GetProgramivARB_remap_index },
-   { 20508, GetVertexAttribdvARB_remap_index },
-   { 16072, GetVertexAttribfvARB_remap_index },
-   {  9735, GetVertexAttribivARB_remap_index },
-   { 19372, ProgramEnvParameter4dARB_remap_index },
-   { 25201, ProgramEnvParameter4dvARB_remap_index },
-   { 16792, ProgramEnvParameter4fARB_remap_index },
-   {  8935, ProgramEnvParameter4fvARB_remap_index },
-   {  3986, ProgramLocalParameter4dARB_remap_index },
-   { 13097, ProgramLocalParameter4dvARB_remap_index },
-   { 29486, ProgramLocalParameter4fARB_remap_index },
-   { 25837, ProgramLocalParameter4fvARB_remap_index },
-   { 28375, ProgramStringARB_remap_index },
-   { 19622, VertexAttrib1dARB_remap_index },
-   { 15726, VertexAttrib1dvARB_remap_index },
-   {  4161, VertexAttrib1fARB_remap_index },
-   { 32907, VertexAttrib1fvARB_remap_index },
-   {  7120, VertexAttrib1sARB_remap_index },
-   {  2263, VertexAttrib1svARB_remap_index },
-   { 15157, VertexAttrib2dARB_remap_index },
-   { 17491, VertexAttrib2dvARB_remap_index },
-   {  1635, VertexAttrib2fARB_remap_index },
-   { 17604, VertexAttrib2fvARB_remap_index },
-   { 32533, VertexAttrib2sARB_remap_index },
-   { 31561, VertexAttrib2svARB_remap_index },
-   { 11274, VertexAttrib3dARB_remap_index },
-   {  8602, VertexAttrib3dvARB_remap_index },
-   {  1722, VertexAttrib3fARB_remap_index },
-   { 22515, VertexAttrib3fvARB_remap_index },
-   { 28222, VertexAttrib3sARB_remap_index },
-   { 20250, VertexAttrib3svARB_remap_index },
-   {  4882, VertexAttrib4NbvARB_remap_index },
-   { 17851, VertexAttrib4NivARB_remap_index },
-   { 22470, VertexAttrib4NsvARB_remap_index },
-   { 23484, VertexAttrib4NubARB_remap_index },
-   { 31807, VertexAttrib4NubvARB_remap_index },
-   { 19033, VertexAttrib4NuivARB_remap_index },
-   {  3175, VertexAttrib4NusvARB_remap_index },
-   { 10863, VertexAttrib4bvARB_remap_index },
-   { 26879, VertexAttrib4dARB_remap_index },
-   { 21272, VertexAttrib4dvARB_remap_index },
-   { 11428, VertexAttrib4fARB_remap_index },
-   { 11832, VertexAttrib4fvARB_remap_index },
-   { 10239, VertexAttrib4ivARB_remap_index },
-   { 17284, VertexAttrib4sARB_remap_index },
-   { 31035, VertexAttrib4svARB_remap_index },
-   { 16597, VertexAttrib4ubvARB_remap_index },
-   { 30331, VertexAttrib4uivARB_remap_index },
-   { 20061, VertexAttrib4usvARB_remap_index },
-   { 22067, VertexAttribPointerARB_remap_index },
-   { 32667, BindBufferARB_remap_index },
-   {  6827, BufferDataARB_remap_index },
-   {  1537, BufferSubDataARB_remap_index },
-   { 30612, DeleteBuffersARB_remap_index },
-   { 32950, GenBuffersARB_remap_index },
-   { 17647, GetBufferParameterivARB_remap_index },
-   { 16744, GetBufferPointervARB_remap_index },
-   {  1490, GetBufferSubDataARB_remap_index },
-   { 30279, IsBufferARB_remap_index },
-   { 26321, MapBufferARB_remap_index },
-   { 31250, UnmapBufferARB_remap_index },
-   {   351, BeginQueryARB_remap_index },
-   { 19717, DeleteQueriesARB_remap_index },
-   { 12159, EndQueryARB_remap_index },
-   { 29100, GenQueriesARB_remap_index },
-   {  1981, GetQueryObjectivARB_remap_index },
-   { 17328, GetQueryObjectuivARB_remap_index },
-   {  1779, GetQueryivARB_remap_index },
-   { 19968, IsQueryARB_remap_index },
-   {  8212, AttachObjectARB_remap_index },
-   { 18570, CompileShaderARB_remap_index },
-   {  3244, CreateProgramObjectARB_remap_index },
-   {  6772, CreateShaderObjectARB_remap_index },
-   { 14459, DeleteObjectARB_remap_index },
-   { 23971, DetachObjectARB_remap_index },
-   { 11904, GetActiveUniformARB_remap_index },
-   {  9410, GetAttachedObjectsARB_remap_index },
-   {  9717, GetHandleARB_remap_index },
-   { 32700, GetInfoLogARB_remap_index },
-   { 31878, GetObjectParameterfvARB_remap_index },
-   { 27380, GetObjectParameterivARB_remap_index },
-   { 28858, GetShaderSourceARB_remap_index },
-   { 28082, GetUniformLocationARB_remap_index },
-   { 23754, GetUniformfvARB_remap_index },
-   { 12672, GetUniformivARB_remap_index },
-   { 20106, LinkProgramARB_remap_index },
-   { 20164, ShaderSourceARB_remap_index },
-   {  7494, Uniform1fARB_remap_index },
-   { 29695, Uniform1fvARB_remap_index },
-   { 22036, Uniform1iARB_remap_index },
-   { 20961, Uniform1ivARB_remap_index },
-   {  2212, Uniform2fARB_remap_index },
-   { 14295, Uniform2fvARB_remap_index },
-   { 26208, Uniform2iARB_remap_index },
-   {  2332, Uniform2ivARB_remap_index },
-   { 18680, Uniform3fARB_remap_index },
-   {  9440, Uniform3fvARB_remap_index },
-   {  6383, Uniform3iARB_remap_index },
-   { 16850, Uniform3ivARB_remap_index },
-   { 19178, Uniform4fARB_remap_index },
-   { 23618, Uniform4fvARB_remap_index },
-   { 24880, Uniform4iARB_remap_index },
-   { 20474, Uniform4ivARB_remap_index },
-   {  8264, UniformMatrix2fvARB_remap_index },
-   {    17, UniformMatrix3fvARB_remap_index },
-   {  2729, UniformMatrix4fvARB_remap_index },
-   { 25313, UseProgramObjectARB_remap_index },
-   { 14845, ValidateProgramARB_remap_index },
-   { 21315, BindAttribLocationARB_remap_index },
-   {  4927, GetActiveAttribARB_remap_index },
-   { 16531, GetAttribLocationARB_remap_index },
-   { 29413, DrawBuffersARB_remap_index },
-   { 17896, DrawArraysInstancedARB_remap_index },
-   {  6444, DrawElementsInstancedARB_remap_index },
-   { 13202, RenderbufferStorageMultisample_remap_index },
-   { 13673, FramebufferTextureARB_remap_index },
-   { 25739, FramebufferTextureFaceARB_remap_index },
-   { 24120, ProgramParameteriARB_remap_index },
-   { 23436, VertexAttribDivisorARB_remap_index },
-   { 19226, FlushMappedBufferRange_remap_index },
-   { 27797, MapBufferRange_remap_index },
-   { 16375, BindVertexArray_remap_index },
-   { 14668, GenVertexArrays_remap_index },
-   { 30209, CopyBufferSubData_remap_index },
-   { 31139, ClientWaitSync_remap_index },
-   {  2648, DeleteSync_remap_index },
-   {  7161, FenceSync_remap_index },
-   { 15216, GetInteger64v_remap_index },
-   { 22577, GetSynciv_remap_index },
-   { 29352, IsSync_remap_index },
-   {  9358, WaitSync_remap_index },
-   {  3836, DrawElementsBaseVertex_remap_index },
-   { 30544, DrawRangeElementsBaseVertex_remap_index },
-   { 26352, MultiDrawElementsBaseVertex_remap_index },
-   { 32083, BlendEquationSeparateiARB_remap_index },
-   { 17740, BlendEquationiARB_remap_index },
-   { 12641, BlendFuncSeparateiARB_remap_index },
-   {  9783, BlendFunciARB_remap_index },
-   {  5078, BindTransformFeedback_remap_index },
-   {  3271, DeleteTransformFeedbacks_remap_index },
-   {  6416, DrawTransformFeedback_remap_index },
-   {  9577, GenTransformFeedbacks_remap_index },
-   { 28265, IsTransformFeedback_remap_index },
-   { 25932, PauseTransformFeedback_remap_index },
-   {  5557, ResumeTransformFeedback_remap_index },
-   { 21635, ClearDepthf_remap_index },
-   {  6720, DepthRangef_remap_index },
-   { 14480, GetShaderPrecisionFormat_remap_index },
-   {  9963, ReleaseShaderCompiler_remap_index },
-   { 10906, ShaderBinary_remap_index },
-   {  5425, PolygonOffsetEXT_remap_index },
-   { 23199, GetPixelTexGenParameterfvSGIS_remap_index },
-   {  4404, GetPixelTexGenParameterivSGIS_remap_index },
-   { 22932, PixelTexGenParameterfSGIS_remap_index },
-   {   663, PixelTexGenParameterfvSGIS_remap_index },
-   { 12710, PixelTexGenParameteriSGIS_remap_index },
-   { 13815, PixelTexGenParameterivSGIS_remap_index },
-   { 18224, SampleMaskSGIS_remap_index },
-   { 19908, SamplePatternSGIS_remap_index },
-   { 26281, ColorPointerEXT_remap_index },
-   { 17534, EdgeFlagPointerEXT_remap_index },
-   {  6037, IndexPointerEXT_remap_index },
-   {  6117, NormalPointerEXT_remap_index },
-   { 15810, TexCoordPointerEXT_remap_index },
-   {  6950, VertexPointerEXT_remap_index },
-   {  3638, PointParameterfEXT_remap_index },
-   {  7801, PointParameterfvEXT_remap_index },
-   { 31976, LockArraysEXT_remap_index },
-   { 14909, UnlockArraysEXT_remap_index },
-   {  1306, SecondaryColor3bEXT_remap_index },
-   {  7960, SecondaryColor3bvEXT_remap_index },
-   { 10416, SecondaryColor3dEXT_remap_index },
-   { 25509, SecondaryColor3dvEXT_remap_index },
-   { 28131, SecondaryColor3fEXT_remap_index },
-   { 18261, SecondaryColor3fvEXT_remap_index },
-   {   509, SecondaryColor3iEXT_remap_index },
-   { 16120, SecondaryColor3ivEXT_remap_index },
-   { 10051, SecondaryColor3sEXT_remap_index },
-   { 30803, SecondaryColor3svEXT_remap_index },
-   { 27216, SecondaryColor3ubEXT_remap_index },
-   { 21206, SecondaryColor3ubvEXT_remap_index },
-   { 12952, SecondaryColor3uiEXT_remap_index },
-   { 22819, SecondaryColor3uivEXT_remap_index },
-   { 25789, SecondaryColor3usEXT_remap_index },
-   { 13025, SecondaryColor3usvEXT_remap_index },
-   { 11775, SecondaryColorPointerEXT_remap_index },
-   { 25603, MultiDrawArraysEXT_remap_index },
-   { 20896, MultiDrawElementsEXT_remap_index },
-   { 21091, FogCoordPointerEXT_remap_index },
-   {  4553, FogCoorddEXT_remap_index },
-   { 31377, FogCoorddvEXT_remap_index },
-   {  4670, FogCoordfEXT_remap_index },
-   { 27139, FogCoordfvEXT_remap_index },
-   { 19130, PixelTexGenSGIX_remap_index },
-   { 27724, BlendFuncSeparateEXT_remap_index },
-   {  6862, FlushVertexArrayRangeNV_remap_index },
-   {  5374, VertexArrayRangeNV_remap_index },
-   { 28196, CombinerInputNV_remap_index },
-   {  2155, CombinerOutputNV_remap_index },
-   { 30956, CombinerParameterfNV_remap_index },
-   {  5248, CombinerParameterfvNV_remap_index },
-   { 22301, CombinerParameteriNV_remap_index },
-   { 32425, CombinerParameterivNV_remap_index },
-   {  7238, FinalCombinerInputNV_remap_index },
-   {  9804, GetCombinerInputParameterfvNV_remap_index },
-   { 32262, GetCombinerInputParameterivNV_remap_index },
-   {   216, GetCombinerOutputParameterfvNV_remap_index },
-   { 13776, GetCombinerOutputParameterivNV_remap_index },
-   {  6624, GetFinalCombinerInputParameterfvNV_remap_index },
-   { 24752, GetFinalCombinerInputParameterivNV_remap_index },
-   { 12619, ResizeBuffersMESA_remap_index },
-   { 11101, WindowPos2dMESA_remap_index },
-   {  1099, WindowPos2dvMESA_remap_index },
-   { 33253, WindowPos2fMESA_remap_index },
-   {  7905, WindowPos2fvMESA_remap_index },
-   { 18171, WindowPos2iMESA_remap_index },
-   { 20381, WindowPos2ivMESA_remap_index },
-   { 20995, WindowPos2sMESA_remap_index },
-   {  5735, WindowPos2svMESA_remap_index },
-   {  7730, WindowPos3dMESA_remap_index },
-   { 14023, WindowPos3dvMESA_remap_index },
-   {   555, WindowPos3fMESA_remap_index },
-   { 14970, WindowPos3fvMESA_remap_index },
-   { 24013, WindowPos3iMESA_remap_index },
-   { 30154, WindowPos3ivMESA_remap_index },
-   { 18825, WindowPos3sMESA_remap_index },
-   { 31633, WindowPos3svMESA_remap_index },
-   { 11052, WindowPos4dMESA_remap_index },
-   { 16988, WindowPos4dvMESA_remap_index },
-   { 13982, WindowPos4fMESA_remap_index },
-   { 30710, WindowPos4fvMESA_remap_index },
-   { 30307, WindowPos4iMESA_remap_index },
-   { 12422, WindowPos4ivMESA_remap_index },
-   { 19009, WindowPos4sMESA_remap_index },
-   {  3222, WindowPos4svMESA_remap_index },
-   { 26847, MultiModeDrawArraysIBM_remap_index },
-   { 28971, MultiModeDrawElementsIBM_remap_index },
-   { 12187, DeleteFencesNV_remap_index },
-   { 28043, FinishFenceNV_remap_index },
-   {  3760, GenFencesNV_remap_index },
-   { 16968, GetFenceivNV_remap_index },
-   {  8197, IsFenceNV_remap_index },
-   { 13703, SetFenceNV_remap_index },
-   {  4217, TestFenceNV_remap_index },
-   { 31604, AreProgramsResidentNV_remap_index },
-   { 30998, BindProgramNV_remap_index },
-   { 25872, DeleteProgramsNV_remap_index },
-   { 21424, ExecuteProgramNV_remap_index },
-   { 33146, GenProgramsNV_remap_index },
-   { 23304, GetProgramParameterdvNV_remap_index },
-   { 10478, GetProgramParameterfvNV_remap_index },
-   { 26255, GetProgramStringNV_remap_index },
-   { 24390, GetProgramivNV_remap_index },
-   { 23567, GetTrackMatrixivNV_remap_index },
-   { 26049, GetVertexAttribPointervNV_remap_index },
-   { 24685, GetVertexAttribdvNV_remap_index },
-   {  9253, GetVertexAttribfvNV_remap_index },
-   { 18432, GetVertexAttribivNV_remap_index },
-   { 19256, IsProgramNV_remap_index },
-   {  9336, LoadProgramNV_remap_index },
-   { 27820, ProgramParameters4dvNV_remap_index },
-   { 24320, ProgramParameters4fvNV_remap_index },
-   { 20685, RequestResidentProgramsNV_remap_index },
-   { 22279, TrackMatrixNV_remap_index },
-   { 32239, VertexAttrib1dNV_remap_index },
-   { 13614, VertexAttrib1dvNV_remap_index },
-   { 28477, VertexAttrib1fNV_remap_index },
-   {  2454, VertexAttrib1fvNV_remap_index },
-   { 30767, VertexAttrib1sNV_remap_index },
-   { 15043, VertexAttrib1svNV_remap_index },
-   {  4832, VertexAttrib2dNV_remap_index },
-   { 13507, VertexAttrib2dvNV_remap_index },
-   { 20140, VertexAttrib2fNV_remap_index },
-   { 13073, VertexAttrib2fvNV_remap_index },
-   {  5947, VertexAttrib2sNV_remap_index },
-   { 18879, VertexAttrib2svNV_remap_index },
-   { 11249, VertexAttrib3dNV_remap_index },
-   { 31854, VertexAttrib3dvNV_remap_index },
-   { 10290, VertexAttrib3fNV_remap_index },
-   { 24712, VertexAttrib3fvNV_remap_index },
-   { 22122, VertexAttrib3sNV_remap_index },
-   { 23594, VertexAttrib3svNV_remap_index },
-   { 28945, VertexAttrib4dNV_remap_index },
-   { 33183, VertexAttrib4dvNV_remap_index },
-   {  4454, VertexAttrib4fNV_remap_index },
-   {  9386, VertexAttrib4fvNV_remap_index },
-   { 26731, VertexAttrib4sNV_remap_index },
-   {  1448, VertexAttrib4svNV_remap_index },
-   {  4990, VertexAttrib4ubNV_remap_index },
-   {   817, VertexAttrib4ubvNV_remap_index },
-   { 21604, VertexAttribPointerNV_remap_index },
-   {  2306, VertexAttribs1dvNV_remap_index },
-   { 26137, VertexAttribs1fvNV_remap_index },
-   { 32983, VertexAttribs1svNV_remap_index },
-   { 10315, VertexAttribs2dvNV_remap_index },
-   { 25274, VertexAttribs2fvNV_remap_index },
-   { 17560, VertexAttribs2svNV_remap_index },
-   {  5276, VertexAttribs3dvNV_remap_index },
-   {  2186, VertexAttribs3fvNV_remap_index },
-   { 29902, VertexAttribs3svNV_remap_index },
-   { 26821, VertexAttribs4dvNV_remap_index },
-   {  5348, VertexAttribs4fvNV_remap_index },
-   { 32770, VertexAttribs4svNV_remap_index },
-   { 29650, VertexAttribs4ubvNV_remap_index },
-   { 26923, GetTexBumpParameterfvATI_remap_index },
-   { 33024, GetTexBumpParameterivATI_remap_index },
-   { 18542, TexBumpParameterfvATI_remap_index },
-   { 20556, TexBumpParameterivATI_remap_index },
-   { 15589, AlphaFragmentOp1ATI_remap_index },
-   { 25555, AlphaFragmentOp2ATI_remap_index },
-   { 24628, AlphaFragmentOp3ATI_remap_index },
-   { 29829, BeginFragmentShaderATI_remap_index },
-   { 31197, BindFragmentShaderATI_remap_index },
-   { 23723, ColorFragmentOp1ATI_remap_index },
-   {  4332, ColorFragmentOp2ATI_remap_index },
-   { 31499, ColorFragmentOp3ATI_remap_index },
-   {  5514, DeleteFragmentShaderATI_remap_index },
-   { 33207, EndFragmentShaderATI_remap_index },
-   { 32453, GenFragmentShadersATI_remap_index },
-   { 25428, PassTexCoordATI_remap_index },
-   {  6930, SampleMapATI_remap_index },
-   { 27034, SetFragmentShaderConstantATI_remap_index },
-   {   402, PointParameteriNV_remap_index },
-   { 14184, PointParameterivNV_remap_index },
-   { 28784, ActiveStencilFaceEXT_remap_index },
-   { 27480, BindVertexArrayAPPLE_remap_index },
-   {  2776, DeleteVertexArraysAPPLE_remap_index },
-   { 18001, GenVertexArraysAPPLE_remap_index },
-   { 23369, IsVertexArrayAPPLE_remap_index },
-   {   858, GetProgramNamedParameterdvNV_remap_index },
-   {  3601, GetProgramNamedParameterfvNV_remap_index },
-   { 26954, ProgramNamedParameter4dNV_remap_index },
-   { 14543, ProgramNamedParameter4dvNV_remap_index },
-   {  8869, ProgramNamedParameter4fNV_remap_index },
-   { 11740, ProgramNamedParameter4fvNV_remap_index },
-   { 16899, PrimitiveRestartIndexNV_remap_index },
-   { 30687, PrimitiveRestartNV_remap_index },
-   { 24299, DepthBoundsEXT_remap_index },
-   {  1198, BlendEquationSeparateEXT_remap_index },
-   { 14744, BindFramebufferEXT_remap_index },
-   { 25648, BindRenderbufferEXT_remap_index },
-   {  9633, CheckFramebufferStatusEXT_remap_index },
-   { 22620, DeleteFramebuffersEXT_remap_index },
-   { 31756, DeleteRenderbuffersEXT_remap_index },
-   { 13531, FramebufferRenderbufferEXT_remap_index },
-   { 13720, FramebufferTexture1DEXT_remap_index },
-   { 11534, FramebufferTexture2DEXT_remap_index },
-   { 11154, FramebufferTexture3DEXT_remap_index },
-   { 23235, GenFramebuffersEXT_remap_index },
-   { 17425, GenRenderbuffersEXT_remap_index },
-   {  6666, GenerateMipmapEXT_remap_index },
-   { 21697, GetFramebufferAttachmentParameterivEXT_remap_index },
-   { 32359, GetRenderbufferParameterivEXT_remap_index },
-   { 20436, IsFramebufferEXT_remap_index },
-   { 33106, IsRenderbufferEXT_remap_index },
-   {  8144, RenderbufferStorageEXT_remap_index },
-   {   734, BlitFramebufferEXT_remap_index },
-   { 14329, BufferParameteriAPPLE_remap_index },
-   { 19288, FlushMappedBufferRangeAPPLE_remap_index },
-   {  1854, BindFragDataLocationEXT_remap_index },
-   { 24412, GetFragDataLocationEXT_remap_index },
-   { 10593, GetUniformuivEXT_remap_index },
-   {  2972, GetVertexAttribIivEXT_remap_index },
-   { 27991, GetVertexAttribIuivEXT_remap_index },
-   { 12020, Uniform1uiEXT_remap_index },
-   { 27905, Uniform1uivEXT_remap_index },
-   { 22218, Uniform2uiEXT_remap_index },
-   {  4296, Uniform2uivEXT_remap_index },
-   { 29224, Uniform3uiEXT_remap_index },
-   { 14690, Uniform3uivEXT_remap_index },
-   {  3525, Uniform4uiEXT_remap_index },
-   {  8645, Uniform4uivEXT_remap_index },
-   { 18389, VertexAttribI1iEXT_remap_index },
-   {  1004, VertexAttribI1ivEXT_remap_index },
-   {  2555, VertexAttribI1uiEXT_remap_index },
-   { 12801, VertexAttribI1uivEXT_remap_index },
-   {    81, VertexAttribI2iEXT_remap_index },
-   { 23835, VertexAttribI2ivEXT_remap_index },
-   {  5302, VertexAttribI2uiEXT_remap_index },
-   {  4715, VertexAttribI2uivEXT_remap_index },
-   { 26523, VertexAttribI3iEXT_remap_index },
-   { 30499, VertexAttribI3ivEXT_remap_index },
-   {  3379, VertexAttribI3uiEXT_remap_index },
-   { 30395, VertexAttribI3uivEXT_remap_index },
-   { 21948, VertexAttribI4bvEXT_remap_index },
-   { 14622, VertexAttribI4iEXT_remap_index },
-   { 32025, VertexAttribI4ivEXT_remap_index },
-   { 13434, VertexAttribI4svEXT_remap_index },
-   { 16484, VertexAttribI4ubvEXT_remap_index },
-   { 16183, VertexAttribI4uiEXT_remap_index },
-   {  5448, VertexAttribI4uivEXT_remap_index },
-   { 11317, VertexAttribI4usvEXT_remap_index },
-   { 18486, VertexAttribIPointerEXT_remap_index },
-   {  3066, FramebufferTextureLayerEXT_remap_index },
-   {  5172, ColorMaskIndexedEXT_remap_index },
-   { 18903, DisableIndexedEXT_remap_index },
-   { 26568, EnableIndexedEXT_remap_index },
-   { 21652, GetBooleanIndexedvEXT_remap_index },
-   { 10928, GetIntegerIndexedvEXT_remap_index },
-   { 22696, IsEnabledIndexedEXT_remap_index },
-   { 22596, ClearColorIiEXT_remap_index },
-   {  3475, ClearColorIuiEXT_remap_index },
-   {  9843, GetTexParameterIivEXT_remap_index },
-   {  5895, GetTexParameterIuivEXT_remap_index },
-   {  3022, TexParameterIivEXT_remap_index },
-   { 26390, TexParameterIuivEXT_remap_index },
-   {  4583, BeginConditionalRenderNV_remap_index },
-   { 25378, EndConditionalRenderNV_remap_index },
-   {  9280, BeginTransformFeedbackEXT_remap_index },
-   { 18938, BindBufferBaseEXT_remap_index },
-   { 18797, BindBufferOffsetEXT_remap_index },
-   { 12247, BindBufferRangeEXT_remap_index },
-   { 14244, EndTransformFeedbackEXT_remap_index },
-   { 10791, GetTransformFeedbackVaryingEXT_remap_index },
-   { 20741, TransformFeedbackVaryingsEXT_remap_index },
-   { 29551, ProvokingVertexEXT_remap_index },
-   { 10739, GetTexParameterPointervAPPLE_remap_index },
-   {  5034, TextureRangeAPPLE_remap_index },
-   { 11606, GetObjectParameterivAPPLE_remap_index },
-   { 19863, ObjectPurgeableAPPLE_remap_index },
-   {  5689, ObjectUnpurgeableAPPLE_remap_index },
-   { 17247, ActiveProgramEXT_remap_index },
-   { 17218, CreateShaderProgramEXT_remap_index },
-   { 28569, UseShaderProgramEXT_remap_index },
-   { 16463, TextureBarrierNV_remap_index },
-   { 28810, StencilFuncSeparateATI_remap_index },
-   { 18090, ProgramEnvParameters4fvEXT_remap_index },
-   { 17112, ProgramLocalParameters4fvEXT_remap_index },
-   { 14112, GetQueryObjecti64vEXT_remap_index },
-   { 10341, GetQueryObjectui64vEXT_remap_index },
-   { 23792, EGLImageTargetRenderbufferStorageOES_remap_index },
-   { 12126, EGLImageTargetTexture2DOES_remap_index },
-   {    -1, -1 }
-};
-
-/* these functions are in the ABI, but have alternative names */
-static const struct gl_function_remap MESA_alt_functions[] = {
-   /* from GL_EXT_blend_color */
-   {  2694, _gloffset_BlendColor },
-   /* from GL_EXT_blend_minmax */
-   { 11211, _gloffset_BlendEquation },
-   /* from GL_EXT_color_subtable */
-   { 17010, _gloffset_ColorSubTable },
-   { 31688, _gloffset_CopyColorSubTable },
-   /* from GL_EXT_convolution */
-   {   296, _gloffset_ConvolutionFilter1D },
-   {  2493, _gloffset_CopyConvolutionFilter1D },
-   {  4097, _gloffset_GetConvolutionParameteriv },
-   {  8493, _gloffset_ConvolutionFilter2D },
-   {  8695, _gloffset_ConvolutionParameteriv },
-   {  9155, _gloffset_ConvolutionParameterfv },
-   { 20584, _gloffset_GetSeparableFilter },
-   { 24067, _gloffset_SeparableFilter2D },
-   { 24930, _gloffset_ConvolutionParameteri },
-   { 25053, _gloffset_ConvolutionParameterf },
-   { 26757, _gloffset_GetConvolutionParameterfv },
-   { 27646, _gloffset_GetConvolutionFilter },
-   { 30091, _gloffset_CopyConvolutionFilter2D },
-   /* from GL_EXT_copy_texture */
-   { 15103, _gloffset_CopyTexSubImage3D },
-   { 16697, _gloffset_CopyTexImage2D },
-   { 24538, _gloffset_CopyTexImage1D },
-   { 27327, _gloffset_CopyTexSubImage2D },
-   { 29729, _gloffset_CopyTexSubImage1D },
-   /* from GL_EXT_draw_range_elements */
-   {  9492, _gloffset_DrawRangeElements },
-   /* from GL_EXT_histogram */
-   {   895, _gloffset_Histogram },
-   {  3561, _gloffset_ResetHistogram },
-   {  9989, _gloffset_GetMinmax },
-   { 15437, _gloffset_GetHistogramParameterfv },
-   { 24463, _gloffset_GetMinmaxParameteriv },
-   { 26647, _gloffset_ResetMinmax },
-   { 27543, _gloffset_GetHistogramParameteriv },
-   { 28744, _gloffset_GetHistogram },
-   { 31313, _gloffset_Minmax },
-   { 32853, _gloffset_GetMinmaxParameterfv },
-   /* from GL_EXT_paletted_texture */
-   {  8355, _gloffset_ColorTable },
-   { 15283, _gloffset_GetColorTable },
-   { 22982, _gloffset_GetColorTableParameterfv },
-   { 25109, _gloffset_GetColorTableParameteriv },
-   /* from GL_EXT_subtexture */
-   {  7076, _gloffset_TexSubImage1D },
-   { 10666, _gloffset_TexSubImage2D },
-   /* from GL_EXT_texture3D */
-   {  1813, _gloffset_TexImage3D },
-   { 22751, _gloffset_TexSubImage3D },
-   /* from GL_EXT_texture_object */
-   {  3329, _gloffset_PrioritizeTextures },
-   {  7525, _gloffset_AreTexturesResident },
-   { 13638, _gloffset_GenTextures },
-   { 15769, _gloffset_DeleteTextures },
-   { 19569, _gloffset_IsTexture },
-   { 29794, _gloffset_BindTexture },
-   /* from GL_EXT_vertex_array */
-   { 24239, _gloffset_ArrayElement },
-   { 30901, _gloffset_GetPointerv },
-   { 32480, _gloffset_DrawArrays },
-   /* from GL_SGI_color_table */
-   {  7643, _gloffset_ColorTableParameteriv },
-   {  8355, _gloffset_ColorTable },
-   { 15283, _gloffset_GetColorTable },
-   { 15393, _gloffset_CopyColorTable },
-   { 19430, _gloffset_ColorTableParameterfv },
-   { 22982, _gloffset_GetColorTableParameterfv },
-   { 25109, _gloffset_GetColorTableParameteriv },
-   /* from GL_VERSION_1_3 */
-   {   464, _gloffset_MultiTexCoord3sARB },
-   {   696, _gloffset_ActiveTextureARB },
-   {  4234, _gloffset_MultiTexCoord1fvARB },
-   {  6142, _gloffset_MultiTexCoord3dARB },
-   {  6187, _gloffset_MultiTexCoord2iARB },
-   {  6311, _gloffset_MultiTexCoord2svARB },
-   {  8311, _gloffset_MultiTexCoord2fARB },
-   { 10371, _gloffset_MultiTexCoord3fvARB },
-   { 10973, _gloffset_MultiTexCoord4sARB },
-   { 11654, _gloffset_MultiTexCoord2dvARB },
-   { 12069, _gloffset_MultiTexCoord1svARB },
-   { 12480, _gloffset_MultiTexCoord3svARB },
-   { 12541, _gloffset_MultiTexCoord4iARB },
-   { 13342, _gloffset_MultiTexCoord3iARB },
-   { 14141, _gloffset_MultiTexCoord1dARB },
-   { 14358, _gloffset_MultiTexCoord3dvARB },
-   { 15637, _gloffset_MultiTexCoord3ivARB },
-   { 15682, _gloffset_MultiTexCoord2sARB },
-   { 17067, _gloffset_MultiTexCoord4ivARB },
-   { 19080, _gloffset_ClientActiveTextureARB },
-   { 21380, _gloffset_MultiTexCoord2dARB },
-   { 21817, _gloffset_MultiTexCoord4dvARB },
-   { 22173, _gloffset_MultiTexCoord4fvARB },
-   { 23123, _gloffset_MultiTexCoord3fARB },
-   { 25693, _gloffset_MultiTexCoord4dARB },
-   { 25959, _gloffset_MultiTexCoord1sARB },
-   { 26163, _gloffset_MultiTexCoord1dvARB },
-   { 27171, _gloffset_MultiTexCoord1ivARB },
-   { 27264, _gloffset_MultiTexCoord2ivARB },
-   { 27603, _gloffset_MultiTexCoord1iARB },
-   { 29019, _gloffset_MultiTexCoord4svARB },
-   { 29593, _gloffset_MultiTexCoord1fARB },
-   { 29856, _gloffset_MultiTexCoord4fARB },
-   { 32314, _gloffset_MultiTexCoord2fvARB },
-   {    -1, -1 }
-};
-
-#endif /* need_MESA_remap_table */
-
-#if defined(need_GL_3DFX_tbuffer)
-static const struct gl_function_remap GL_3DFX_tbuffer_functions[] = {
-   {  9213, -1 }, /* TbufferMask3DFX */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_APPLE_flush_buffer_range)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_APPLE_flush_buffer_range_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_APPLE_object_purgeable)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_APPLE_object_purgeable_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_APPLE_texture_range)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_APPLE_texture_range_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_APPLE_vertex_array_object)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_APPLE_vertex_array_object_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ARB_ES2_compatibility)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_ARB_ES2_compatibility_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ARB_copy_buffer)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_ARB_copy_buffer_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ARB_draw_buffers)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_ARB_draw_buffers_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ARB_draw_buffers_blend)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_ARB_draw_buffers_blend_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ARB_draw_elements_base_vertex)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_ARB_draw_elements_base_vertex_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ARB_draw_instanced)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_ARB_draw_instanced_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ARB_framebuffer_object)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_ARB_framebuffer_object_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ARB_geometry_shader4)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_ARB_geometry_shader4_functions[] = {
-   { 12444, -1 }, /* FramebufferTextureLayer */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ARB_instanced_arrays)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_ARB_instanced_arrays_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ARB_map_buffer_range)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_ARB_map_buffer_range_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ARB_matrix_palette)
-static const struct gl_function_remap GL_ARB_matrix_palette_functions[] = {
-   {  3812, -1 }, /* MatrixIndexusvARB */
-   { 13163, -1 }, /* MatrixIndexuivARB */
-   { 14513, -1 }, /* MatrixIndexPointerARB */
-   { 19818, -1 }, /* CurrentPaletteMatrixARB */
-   { 22867, -1 }, /* MatrixIndexubvARB */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ARB_multisample)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_ARB_multisample_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ARB_occlusion_query)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_ARB_occlusion_query_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ARB_point_parameters)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_ARB_point_parameters_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ARB_provoking_vertex)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_ARB_provoking_vertex_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ARB_shader_objects)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_ARB_shader_objects_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ARB_sync)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_ARB_sync_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ARB_texture_compression)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_ARB_texture_compression_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ARB_transform_feedback2)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_ARB_transform_feedback2_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ARB_transpose_matrix)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_ARB_transpose_matrix_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ARB_vertex_array_object)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_ARB_vertex_array_object_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ARB_vertex_blend)
-static const struct gl_function_remap GL_ARB_vertex_blend_functions[] = {
-   {  2435, -1 }, /* WeightubvARB */
-   {  6554, -1 }, /* WeightivARB */
-   { 11076, -1 }, /* WeightPointerARB */
-   { 13898, -1 }, /* WeightfvARB */
-   { 17586, -1 }, /* WeightbvARB */
-   { 21048, -1 }, /* WeightusvARB */
-   { 23993, -1 }, /* VertexBlendARB */
-   { 29677, -1 }, /* WeightsvARB */
-   { 31738, -1 }, /* WeightdvARB */
-   { 32514, -1 }, /* WeightuivARB */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ARB_vertex_buffer_object)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_ARB_vertex_buffer_object_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ARB_vertex_program)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_ARB_vertex_program_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ARB_vertex_shader)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_ARB_vertex_shader_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ARB_window_pos)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_ARB_window_pos_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ATI_blend_equation_separate)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_ATI_blend_equation_separate_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ATI_draw_buffers)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_ATI_draw_buffers_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ATI_envmap_bumpmap)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_ATI_envmap_bumpmap_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ATI_fragment_shader)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_ATI_fragment_shader_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_ATI_separate_stencil)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_ATI_separate_stencil_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_blend_color)
-static const struct gl_function_remap GL_EXT_blend_color_functions[] = {
-   {  2694, _gloffset_BlendColor },
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_blend_equation_separate)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_EXT_blend_equation_separate_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_blend_func_separate)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_EXT_blend_func_separate_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_blend_minmax)
-static const struct gl_function_remap GL_EXT_blend_minmax_functions[] = {
-   { 11211, _gloffset_BlendEquation },
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_color_subtable)
-static const struct gl_function_remap GL_EXT_color_subtable_functions[] = {
-   { 17010, _gloffset_ColorSubTable },
-   { 31688, _gloffset_CopyColorSubTable },
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_compiled_vertex_array)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_EXT_compiled_vertex_array_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_convolution)
-static const struct gl_function_remap GL_EXT_convolution_functions[] = {
-   {   296, _gloffset_ConvolutionFilter1D },
-   {  2493, _gloffset_CopyConvolutionFilter1D },
-   {  4097, _gloffset_GetConvolutionParameteriv },
-   {  8493, _gloffset_ConvolutionFilter2D },
-   {  8695, _gloffset_ConvolutionParameteriv },
-   {  9155, _gloffset_ConvolutionParameterfv },
-   { 20584, _gloffset_GetSeparableFilter },
-   { 24067, _gloffset_SeparableFilter2D },
-   { 24930, _gloffset_ConvolutionParameteri },
-   { 25053, _gloffset_ConvolutionParameterf },
-   { 26757, _gloffset_GetConvolutionParameterfv },
-   { 27646, _gloffset_GetConvolutionFilter },
-   { 30091, _gloffset_CopyConvolutionFilter2D },
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_coordinate_frame)
-static const struct gl_function_remap GL_EXT_coordinate_frame_functions[] = {
-   { 10510, -1 }, /* TangentPointerEXT */
-   { 12599, -1 }, /* Binormal3ivEXT */
-   { 13295, -1 }, /* Tangent3sEXT */
-   { 14578, -1 }, /* Tangent3fvEXT */
-   { 18778, -1 }, /* Tangent3dvEXT */
-   { 19516, -1 }, /* Binormal3bvEXT */
-   { 20637, -1 }, /* Binormal3dEXT */
-   { 22799, -1 }, /* Tangent3fEXT */
-   { 25002, -1 }, /* Binormal3sEXT */
-   { 25470, -1 }, /* Tangent3ivEXT */
-   { 25489, -1 }, /* Tangent3dEXT */
-   { 26436, -1 }, /* Binormal3svEXT */
-   { 27069, -1 }, /* Binormal3fEXT */
-   { 27957, -1 }, /* Binormal3dvEXT */
-   { 29276, -1 }, /* Tangent3iEXT */
-   { 30376, -1 }, /* Tangent3bvEXT */
-   { 30936, -1 }, /* Tangent3bEXT */
-   { 31461, -1 }, /* Binormal3fvEXT */
-   { 32213, -1 }, /* BinormalPointerEXT */
-   { 32618, -1 }, /* Tangent3svEXT */
-   { 33055, -1 }, /* Binormal3bEXT */
-   { 33232, -1 }, /* Binormal3iEXT */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_copy_texture)
-static const struct gl_function_remap GL_EXT_copy_texture_functions[] = {
-   { 15103, _gloffset_CopyTexSubImage3D },
-   { 16697, _gloffset_CopyTexImage2D },
-   { 24538, _gloffset_CopyTexImage1D },
-   { 27327, _gloffset_CopyTexSubImage2D },
-   { 29729, _gloffset_CopyTexSubImage1D },
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_cull_vertex)
-static const struct gl_function_remap GL_EXT_cull_vertex_functions[] = {
-   {  8844, -1 }, /* CullParameterdvEXT */
-   { 11699, -1 }, /* CullParameterfvEXT */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_depth_bounds_test)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_EXT_depth_bounds_test_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_draw_buffers2)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_EXT_draw_buffers2_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_draw_instanced)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_EXT_draw_instanced_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_draw_range_elements)
-static const struct gl_function_remap GL_EXT_draw_range_elements_functions[] = {
-   {  9492, _gloffset_DrawRangeElements },
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_fog_coord)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_EXT_fog_coord_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_framebuffer_blit)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_EXT_framebuffer_blit_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_framebuffer_multisample)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_EXT_framebuffer_multisample_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_framebuffer_object)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_EXT_framebuffer_object_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_gpu_program_parameters)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_EXT_gpu_program_parameters_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_gpu_shader4)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_EXT_gpu_shader4_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_histogram)
-static const struct gl_function_remap GL_EXT_histogram_functions[] = {
-   {   895, _gloffset_Histogram },
-   {  3561, _gloffset_ResetHistogram },
-   {  9989, _gloffset_GetMinmax },
-   { 15437, _gloffset_GetHistogramParameterfv },
-   { 24463, _gloffset_GetMinmaxParameteriv },
-   { 26647, _gloffset_ResetMinmax },
-   { 27543, _gloffset_GetHistogramParameteriv },
-   { 28744, _gloffset_GetHistogram },
-   { 31313, _gloffset_Minmax },
-   { 32853, _gloffset_GetMinmaxParameterfv },
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_index_func)
-static const struct gl_function_remap GL_EXT_index_func_functions[] = {
-   { 11485, -1 }, /* IndexFuncEXT */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_index_material)
-static const struct gl_function_remap GL_EXT_index_material_functions[] = {
-   { 21135, -1 }, /* IndexMaterialEXT */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_light_texture)
-static const struct gl_function_remap GL_EXT_light_texture_functions[] = {
-   { 26456, -1 }, /* ApplyTextureEXT */
-   { 26601, -1 }, /* TextureMaterialEXT */
-   { 26626, -1 }, /* TextureLightEXT */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_multi_draw_arrays)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_EXT_multi_draw_arrays_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_multisample)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_EXT_multisample_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_paletted_texture)
-static const struct gl_function_remap GL_EXT_paletted_texture_functions[] = {
-   {  8355, _gloffset_ColorTable },
-   { 15283, _gloffset_GetColorTable },
-   { 22982, _gloffset_GetColorTableParameterfv },
-   { 25109, _gloffset_GetColorTableParameteriv },
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_pixel_transform)
-static const struct gl_function_remap GL_EXT_pixel_transform_functions[] = {
-   { 21782, -1 }, /* PixelTransformParameterfEXT */
-   { 21862, -1 }, /* PixelTransformParameteriEXT */
-   { 30651, -1 }, /* PixelTransformParameterfvEXT */
-   { 32177, -1 }, /* PixelTransformParameterivEXT */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_point_parameters)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_EXT_point_parameters_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_polygon_offset)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_EXT_polygon_offset_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_provoking_vertex)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_EXT_provoking_vertex_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_secondary_color)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_EXT_secondary_color_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_separate_shader_objects)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_EXT_separate_shader_objects_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_stencil_two_side)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_EXT_stencil_two_side_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_subtexture)
-static const struct gl_function_remap GL_EXT_subtexture_functions[] = {
-   {  7076, _gloffset_TexSubImage1D },
-   { 10666, _gloffset_TexSubImage2D },
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_texture3D)
-static const struct gl_function_remap GL_EXT_texture3D_functions[] = {
-   {  1813, _gloffset_TexImage3D },
-   { 22751, _gloffset_TexSubImage3D },
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_texture_array)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_EXT_texture_array_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_texture_integer)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_EXT_texture_integer_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_texture_object)
-static const struct gl_function_remap GL_EXT_texture_object_functions[] = {
-   {  3329, _gloffset_PrioritizeTextures },
-   {  7525, _gloffset_AreTexturesResident },
-   { 13638, _gloffset_GenTextures },
-   { 15769, _gloffset_DeleteTextures },
-   { 19569, _gloffset_IsTexture },
-   { 29794, _gloffset_BindTexture },
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_texture_perturb_normal)
-static const struct gl_function_remap GL_EXT_texture_perturb_normal_functions[] = {
-   { 13848, -1 }, /* TextureNormalEXT */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_timer_query)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_EXT_timer_query_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_transform_feedback)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_EXT_transform_feedback_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_vertex_array)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_EXT_vertex_array_functions[] = {
-   { 24239, _gloffset_ArrayElement },
-   { 30901, _gloffset_GetPointerv },
-   { 32480, _gloffset_DrawArrays },
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_EXT_vertex_weighting)
-static const struct gl_function_remap GL_EXT_vertex_weighting_functions[] = {
-   { 19599, -1 }, /* VertexWeightfvEXT */
-   { 27012, -1 }, /* VertexWeightfEXT */
-   { 28713, -1 }, /* VertexWeightPointerEXT */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_HP_image_transform)
-static const struct gl_function_remap GL_HP_image_transform_functions[] = {
-   {  2366, -1 }, /* GetImageTransformParameterfvHP */
-   {  3778, -1 }, /* ImageTransformParameterfHP */
-   { 10204, -1 }, /* ImageTransformParameterfvHP */
-   { 11954, -1 }, /* ImageTransformParameteriHP */
-   { 12334, -1 }, /* GetImageTransformParameterivHP */
-   { 19663, -1 }, /* ImageTransformParameterivHP */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_IBM_multimode_draw_arrays)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_IBM_multimode_draw_arrays_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_IBM_vertex_array_lists)
-static const struct gl_function_remap GL_IBM_vertex_array_lists_functions[] = {
-   {  4366, -1 }, /* SecondaryColorPointerListIBM */
-   {  6008, -1 }, /* NormalPointerListIBM */
-   {  7699, -1 }, /* FogCoordPointerListIBM */
-   {  8006, -1 }, /* VertexPointerListIBM */
-   { 11875, -1 }, /* ColorPointerListIBM */
-   { 13402, -1 }, /* TexCoordPointerListIBM */
-   { 13870, -1 }, /* IndexPointerListIBM */
-   { 32796, -1 }, /* EdgeFlagPointerListIBM */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_INGR_blend_func_separate)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_INGR_blend_func_separate_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_INTEL_parallel_arrays)
-static const struct gl_function_remap GL_INTEL_parallel_arrays_functions[] = {
-   { 12742, -1 }, /* VertexPointervINTEL */
-   { 15530, -1 }, /* ColorPointervINTEL */
-   { 30065, -1 }, /* NormalPointervINTEL */
-   { 30583, -1 }, /* TexCoordPointervINTEL */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_MESA_resize_buffers)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_MESA_resize_buffers_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_MESA_shader_debug)
-static const struct gl_function_remap GL_MESA_shader_debug_functions[] = {
-   {  1677, -1 }, /* GetDebugLogLengthMESA */
-   {  3500, -1 }, /* ClearDebugLogMESA */
-   {  4527, -1 }, /* GetDebugLogMESA */
-   { 31094, -1 }, /* CreateDebugObjectMESA */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_MESA_window_pos)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_MESA_window_pos_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_NV_condtitional_render)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_NV_condtitional_render_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_NV_evaluators)
-static const struct gl_function_remap GL_NV_evaluators_functions[] = {
-   {  6738, -1 }, /* GetMapAttribParameterivNV */
-   {  8461, -1 }, /* MapControlPointsNV */
-   {  8560, -1 }, /* MapParameterfvNV */
-   { 10649, -1 }, /* EvalMapsNV */
-   { 17184, -1 }, /* GetMapAttribParameterfvNV */
-   { 17401, -1 }, /* MapParameterivNV */
-   { 24853, -1 }, /* GetMapParameterivNV */
-   { 25351, -1 }, /* GetMapParameterfvNV */
-   { 29380, -1 }, /* GetMapControlPointsNV */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_NV_fence)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_NV_fence_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_NV_fragment_program)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_NV_fragment_program_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_NV_point_sprite)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_NV_point_sprite_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_NV_primitive_restart)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_NV_primitive_restart_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_NV_register_combiners)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_NV_register_combiners_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_NV_register_combiners2)
-static const struct gl_function_remap GL_NV_register_combiners2_functions[] = {
-   { 15922, -1 }, /* CombinerStageParameterfvNV */
-   { 16318, -1 }, /* GetCombinerStageParameterfvNV */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_NV_texture_barrier)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_NV_texture_barrier_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_NV_vertex_array_range)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_NV_vertex_array_range_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_NV_vertex_program)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_NV_vertex_program_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_OES_EGL_image)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_OES_EGL_image_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_PGI_misc_hints)
-static const struct gl_function_remap GL_PGI_misc_hints_functions[] = {
-   {  8681, -1 }, /* HintPGI */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_SGIS_detail_texture)
-static const struct gl_function_remap GL_SGIS_detail_texture_functions[] = {
-   { 16291, -1 }, /* GetDetailTexFuncSGIS */
-   { 16642, -1 }, /* DetailTexFuncSGIS */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_SGIS_fog_function)
-static const struct gl_function_remap GL_SGIS_fog_function_functions[] = {
-   { 27309, -1 }, /* FogFuncSGIS */
-   { 28062, -1 }, /* GetFogFuncSGIS */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_SGIS_multisample)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_SGIS_multisample_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_SGIS_pixel_texture)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_SGIS_pixel_texture_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_SGIS_point_parameters)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_SGIS_point_parameters_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_SGIS_sharpen_texture)
-static const struct gl_function_remap GL_SGIS_sharpen_texture_functions[] = {
-   {  6799, -1 }, /* GetSharpenTexFuncSGIS */
-   { 22147, -1 }, /* SharpenTexFuncSGIS */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_SGIS_texture4D)
-static const struct gl_function_remap GL_SGIS_texture4D_functions[] = {
-   {  1049, -1 }, /* TexImage4DSGIS */
-   { 15838, -1 }, /* TexSubImage4DSGIS */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_SGIS_texture_color_mask)
-static const struct gl_function_remap GL_SGIS_texture_color_mask_functions[] = {
-   { 15236, -1 }, /* TextureColorMaskSGIS */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_SGIS_texture_filter4)
-static const struct gl_function_remap GL_SGIS_texture_filter4_functions[] = {
-   {  6976, -1 }, /* GetTexFilterFuncSGIS */
-   { 16437, -1 }, /* TexFilterFuncSGIS */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_SGIX_async)
-static const struct gl_function_remap GL_SGIX_async_functions[] = {
-   {  3426, -1 }, /* AsyncMarkerSGIX */
-   {  4506, -1 }, /* FinishAsyncSGIX */
-   {  5495, -1 }, /* PollAsyncSGIX */
-   { 22328, -1 }, /* DeleteAsyncMarkersSGIX */
-   { 22383, -1 }, /* IsAsyncMarkerSGIX */
-   { 32593, -1 }, /* GenAsyncMarkersSGIX */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_SGIX_flush_raster)
-static const struct gl_function_remap GL_SGIX_flush_raster_functions[] = {
-   {  7353, -1 }, /* FlushRasterSGIX */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_SGIX_fragment_lighting)
-static const struct gl_function_remap GL_SGIX_fragment_lighting_functions[] = {
-   {  2664, -1 }, /* FragmentMaterialfvSGIX */
-   {  5399, -1 }, /* FragmentLightiSGIX */
-   {  8073, -1 }, /* FragmentMaterialfSGIX */
-   {  8234, -1 }, /* GetFragmentLightivSGIX */
-   {  9107, -1 }, /* FragmentLightModeliSGIX */
-   { 10712, -1 }, /* FragmentLightivSGIX */
-   { 11019, -1 }, /* GetFragmentMaterialivSGIX */
-   { 16231, -1 }, /* GetFragmentMaterialfvSGIX */
-   { 19486, -1 }, /* FragmentLightModelfSGIX */
-   { 19786, -1 }, /* FragmentColorMaterialSGIX */
-   { 20203, -1 }, /* FragmentMaterialiSGIX */
-   { 21463, -1 }, /* LightEnviSGIX */
-   { 23074, -1 }, /* FragmentLightModelfvSGIX */
-   { 23409, -1 }, /* FragmentLightfvSGIX */
-   { 28446, -1 }, /* FragmentLightModelivSGIX */
-   { 28595, -1 }, /* FragmentLightfSGIX */
-   { 31431, -1 }, /* GetFragmentLightfvSGIX */
-   { 33076, -1 }, /* FragmentMaterialivSGIX */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_SGIX_framezoom)
-static const struct gl_function_remap GL_SGIX_framezoom_functions[] = {
-   { 22406, -1 }, /* FrameZoomSGIX */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_SGIX_igloo_interface)
-static const struct gl_function_remap GL_SGIX_igloo_interface_functions[] = {
-   { 28903, -1 }, /* IglooInterfaceSGIX */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_SGIX_instruments)
-static const struct gl_function_remap GL_SGIX_instruments_functions[] = {
-   {  2844, -1 }, /* ReadInstrumentsSGIX */
-   {  6572, -1 }, /* PollInstrumentsSGIX */
-   { 10570, -1 }, /* GetInstrumentsSGIX */
-   { 13000, -1 }, /* StartInstrumentsSGIX */
-   { 15956, -1 }, /* StopInstrumentsSGIX */
-   { 17823, -1 }, /* InstrumentsBufferSGIX */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_SGIX_list_priority)
-static const struct gl_function_remap GL_SGIX_list_priority_functions[] = {
-   {  1280, -1 }, /* ListParameterfSGIX */
-   {  3128, -1 }, /* GetListParameterfvSGIX */
-   { 17714, -1 }, /* ListParameteriSGIX */
-   { 18728, -1 }, /* ListParameterfvSGIX */
-   { 20869, -1 }, /* ListParameterivSGIX */
-   { 32637, -1 }, /* GetListParameterivSGIX */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_SGIX_pixel_texture)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_SGIX_pixel_texture_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_SGIX_polynomial_ffd)
-static const struct gl_function_remap GL_SGIX_polynomial_ffd_functions[] = {
-   {  3724, -1 }, /* LoadIdentityDeformationMapSGIX */
-   { 12208, -1 }, /* DeformationMap3dSGIX */
-   { 16056, -1 }, /* DeformSGIX */
-   { 24351, -1 }, /* DeformationMap3fSGIX */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_SGIX_reference_plane)
-static const struct gl_function_remap GL_SGIX_reference_plane_functions[] = {
-   { 14787, -1 }, /* ReferencePlaneSGIX */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_SGIX_sprite)
-static const struct gl_function_remap GL_SGIX_sprite_functions[] = {
-   {  9605, -1 }, /* SpriteParameterfvSGIX */
-   { 20658, -1 }, /* SpriteParameteriSGIX */
-   { 26681, -1 }, /* SpriteParameterfSGIX */
-   { 29523, -1 }, /* SpriteParameterivSGIX */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_SGIX_tag_sample_buffer)
-static const struct gl_function_remap GL_SGIX_tag_sample_buffer_functions[] = {
-   { 20717, -1 }, /* TagSampleBufferSGIX */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_SGI_color_table)
-static const struct gl_function_remap GL_SGI_color_table_functions[] = {
-   {  7643, _gloffset_ColorTableParameteriv },
-   {  8355, _gloffset_ColorTable },
-   { 15283, _gloffset_GetColorTable },
-   { 15393, _gloffset_CopyColorTable },
-   { 19430, _gloffset_ColorTableParameterfv },
-   { 22982, _gloffset_GetColorTableParameterfv },
-   { 25109, _gloffset_GetColorTableParameteriv },
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_SUNX_constant_data)
-static const struct gl_function_remap GL_SUNX_constant_data_functions[] = {
-   { 31409, -1 }, /* FinishTextureSUNX */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_SUN_global_alpha)
-static const struct gl_function_remap GL_SUN_global_alpha_functions[] = {
-   {  3447, -1 }, /* GlobalAlphaFactorubSUN */
-   {  4805, -1 }, /* GlobalAlphaFactoriSUN */
-   {  6597, -1 }, /* GlobalAlphaFactordSUN */
-   {  9689, -1 }, /* GlobalAlphaFactoruiSUN */
-   { 10161, -1 }, /* GlobalAlphaFactorbSUN */
-   { 13315, -1 }, /* GlobalAlphaFactorfSUN */
-   { 13479, -1 }, /* GlobalAlphaFactorusSUN */
-   { 22669, -1 }, /* GlobalAlphaFactorsSUN */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_SUN_mesh_array)
-static const struct gl_function_remap GL_SUN_mesh_array_functions[] = {
-   { 29314, -1 }, /* DrawMeshArraysSUN */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_SUN_triangle_list)
-static const struct gl_function_remap GL_SUN_triangle_list_functions[] = {
-   {  4480, -1 }, /* ReplacementCodeubSUN */
-   {  6356, -1 }, /* ReplacementCodeubvSUN */
-   { 19151, -1 }, /* ReplacementCodeusvSUN */
-   { 19339, -1 }, /* ReplacementCodePointerSUN */
-   { 21527, -1 }, /* ReplacementCodeuiSUN */
-   { 22357, -1 }, /* ReplacementCodeusSUN */
-   { 29980, -1 }, /* ReplacementCodeuivSUN */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_SUN_vertex)
-static const struct gl_function_remap GL_SUN_vertex_functions[] = {
-   {  1154, -1 }, /* ReplacementCodeuiColor3fVertex3fvSUN */
-   {  1352, -1 }, /* TexCoord4fColor4fNormal3fVertex4fvSUN */
-   {  1578, -1 }, /* TexCoord2fColor4ubVertex3fvSUN */
-   {  1908, -1 }, /* ReplacementCodeuiVertex3fvSUN */
-   {  2042, -1 }, /* ReplacementCodeuiTexCoord2fVertex3fvSUN */
-   {  2600, -1 }, /* ReplacementCodeuiNormal3fVertex3fSUN */
-   {  2913, -1 }, /* Color4ubVertex3fvSUN */
-   {  4639, -1 }, /* Color4ubVertex3fSUN */
-   {  4762, -1 }, /* TexCoord2fVertex3fSUN */
-   {  5106, -1 }, /* TexCoord2fColor4fNormal3fVertex3fSUN */
-   {  5599, -1 }, /* TexCoord2fNormal3fVertex3fvSUN */
-   {  6251, -1 }, /* ReplacementCodeuiTexCoord2fNormal3fVertex3fSUN */
-   {  7031, -1 }, /* ReplacementCodeuiColor4ubVertex3fvSUN */
-   {  7390, -1 }, /* ReplacementCodeuiTexCoord2fVertex3fSUN */
-   {  8102, -1 }, /* TexCoord2fNormal3fVertex3fSUN */
-   {  8906, -1 }, /* Color3fVertex3fSUN */
-   { 10097, -1 }, /* Color3fVertex3fvSUN */
-   { 10535, -1 }, /* Color4fNormal3fVertex3fvSUN */
-   { 11364, -1 }, /* ReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN */
-   { 12863, -1 }, /* ReplacementCodeuiColor4fNormal3fVertex3fvSUN */
-   { 14403, -1 }, /* ReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN */
-   { 14929, -1 }, /* TexCoord2fColor3fVertex3fSUN */
-   { 15981, -1 }, /* TexCoord4fColor4fNormal3fVertex4fSUN */
-   { 16396, -1 }, /* Color4ubVertex2fvSUN */
-   { 16667, -1 }, /* Normal3fVertex3fSUN */
-   { 17764, -1 }, /* ReplacementCodeuiColor4fNormal3fVertex3fSUN */
-   { 18125, -1 }, /* TexCoord2fColor4fNormal3fVertex3fvSUN */
-   { 18980, -1 }, /* TexCoord2fVertex3fvSUN */
-   { 19756, -1 }, /* Color4ubVertex2fSUN */
-   { 19994, -1 }, /* ReplacementCodeuiColor4ubVertex3fSUN */
-   { 21993, -1 }, /* TexCoord2fColor4ubVertex3fSUN */
-   { 22425, -1 }, /* Normal3fVertex3fvSUN */
-   { 22891, -1 }, /* Color4fNormal3fVertex3fSUN */
-   { 23900, -1 }, /* ReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN */
-   { 26002, -1 }, /* ReplacementCodeuiColor3fVertex3fSUN */
-   { 27425, -1 }, /* TexCoord4fVertex4fSUN */
-   { 27851, -1 }, /* TexCoord2fColor3fVertex3fvSUN */
-   { 28290, -1 }, /* ReplacementCodeuiNormal3fVertex3fvSUN */
-   { 28417, -1 }, /* TexCoord4fVertex4fvSUN */
-   { 29151, -1 }, /* ReplacementCodeuiVertex3fSUN */
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_VERSION_1_3)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_VERSION_1_3_functions[] = {
-   {   464, _gloffset_MultiTexCoord3sARB },
-   {   696, _gloffset_ActiveTextureARB },
-   {  4234, _gloffset_MultiTexCoord1fvARB },
-   {  6142, _gloffset_MultiTexCoord3dARB },
-   {  6187, _gloffset_MultiTexCoord2iARB },
-   {  6311, _gloffset_MultiTexCoord2svARB },
-   {  8311, _gloffset_MultiTexCoord2fARB },
-   { 10371, _gloffset_MultiTexCoord3fvARB },
-   { 10973, _gloffset_MultiTexCoord4sARB },
-   { 11654, _gloffset_MultiTexCoord2dvARB },
-   { 12069, _gloffset_MultiTexCoord1svARB },
-   { 12480, _gloffset_MultiTexCoord3svARB },
-   { 12541, _gloffset_MultiTexCoord4iARB },
-   { 13342, _gloffset_MultiTexCoord3iARB },
-   { 14141, _gloffset_MultiTexCoord1dARB },
-   { 14358, _gloffset_MultiTexCoord3dvARB },
-   { 15637, _gloffset_MultiTexCoord3ivARB },
-   { 15682, _gloffset_MultiTexCoord2sARB },
-   { 17067, _gloffset_MultiTexCoord4ivARB },
-   { 19080, _gloffset_ClientActiveTextureARB },
-   { 21380, _gloffset_MultiTexCoord2dARB },
-   { 21817, _gloffset_MultiTexCoord4dvARB },
-   { 22173, _gloffset_MultiTexCoord4fvARB },
-   { 23123, _gloffset_MultiTexCoord3fARB },
-   { 25693, _gloffset_MultiTexCoord4dARB },
-   { 25959, _gloffset_MultiTexCoord1sARB },
-   { 26163, _gloffset_MultiTexCoord1dvARB },
-   { 27171, _gloffset_MultiTexCoord1ivARB },
-   { 27264, _gloffset_MultiTexCoord2ivARB },
-   { 27603, _gloffset_MultiTexCoord1iARB },
-   { 29019, _gloffset_MultiTexCoord4svARB },
-   { 29593, _gloffset_MultiTexCoord1fARB },
-   { 29856, _gloffset_MultiTexCoord4fARB },
-   { 32314, _gloffset_MultiTexCoord2fvARB },
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_VERSION_1_4)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_VERSION_1_4_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_VERSION_1_5)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_VERSION_1_5_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_VERSION_2_0)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_VERSION_2_0_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_VERSION_2_1)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_VERSION_2_1_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_VERSION_3_0)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_VERSION_3_0_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_VERSION_3_1)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_VERSION_3_1_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_VERSION_3_2)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_VERSION_3_2_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
-#if defined(need_GL_VERSION_3_3)
-/* functions defined in MESA_remap_table_functions are excluded */
-static const struct gl_function_remap GL_VERSION_3_3_functions[] = {
-   {    -1, -1 }
-};
-#endif
-
+/* DO NOT EDIT - This file generated automatically by remap_helper.py (from Mesa) script */
+
+/*
+ * Copyright (C) 2009 Chia-I Wu <olv@0xlab.org>
+ * 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"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sub license,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.  IN NO EVENT SHALL
+ * Chia-I Wu,
+ * AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF
+ * OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ */
+
+#include "main/dispatch.h"
+#include "main/remap.h"
+
+/* this is internal to remap.c */
+#ifdef need_MESA_remap_table
+
+static const char _mesa_function_pool[] =
+   /* _mesa_function_pool[0]: MapGrid1d (offset 224) */
+   "idd\0"
+   "glMapGrid1d\0"
+   "\0"
+   /* _mesa_function_pool[17]: UniformMatrix3fvARB (will be remapped) */
+   "iiip\0"
+   "glUniformMatrix3fv\0"
+   "glUniformMatrix3fvARB\0"
+   "\0"
+   /* _mesa_function_pool[64]: MapGrid1f (offset 225) */
+   "iff\0"
+   "glMapGrid1f\0"
+   "\0"
+   /* _mesa_function_pool[81]: VertexAttribI2iEXT (will be remapped) */
+   "iii\0"
+   "glVertexAttribI2iEXT\0"
+   "glVertexAttribI2i\0"
+   "\0"
+   /* _mesa_function_pool[125]: RasterPos4i (offset 82) */
+   "iiii\0"
+   "glRasterPos4i\0"
+   "\0"
+   /* _mesa_function_pool[145]: RasterPos4d (offset 78) */
+   "dddd\0"
+   "glRasterPos4d\0"
+   "\0"
+   /* _mesa_function_pool[165]: NewList (dynamic) */
+   "ii\0"
+   "glNewList\0"
+   "\0"
+   /* _mesa_function_pool[179]: RasterPos4f (offset 80) */
+   "ffff\0"
+   "glRasterPos4f\0"
+   "\0"
+   /* _mesa_function_pool[199]: LoadIdentity (offset 290) */
+   "\0"
+   "glLoadIdentity\0"
+   "\0"
+   /* _mesa_function_pool[216]: GetCombinerOutputParameterfvNV (will be remapped) */
+   "iiip\0"
+   "glGetCombinerOutputParameterfvNV\0"
+   "\0"
+   /* _mesa_function_pool[255]: SampleCoverageARB (will be remapped) */
+   "fi\0"
+   "glSampleCoverage\0"
+   "glSampleCoverageARB\0"
+   "\0"
+   /* _mesa_function_pool[296]: ConvolutionFilter1D (offset 348) */
+   "iiiiip\0"
+   "glConvolutionFilter1D\0"
+   "glConvolutionFilter1DEXT\0"
+   "\0"
+   /* _mesa_function_pool[351]: BeginQueryARB (will be remapped) */
+   "ii\0"
+   "glBeginQuery\0"
+   "glBeginQueryARB\0"
+   "\0"
+   /* _mesa_function_pool[384]: RasterPos3dv (offset 71) */
+   "p\0"
+   "glRasterPos3dv\0"
+   "\0"
+   /* _mesa_function_pool[402]: PointParameteriNV (will be remapped) */
+   "ii\0"
+   "glPointParameteri\0"
+   "glPointParameteriNV\0"
+   "\0"
+   /* _mesa_function_pool[444]: GetProgramiv (will be remapped) */
+   "iip\0"
+   "glGetProgramiv\0"
+   "\0"
+   /* _mesa_function_pool[464]: MultiTexCoord3sARB (offset 398) */
+   "iiii\0"
+   "glMultiTexCoord3s\0"
+   "glMultiTexCoord3sARB\0"
+   "\0"
+   /* _mesa_function_pool[509]: SecondaryColor3iEXT (will be remapped) */
+   "iii\0"
+   "glSecondaryColor3i\0"
+   "glSecondaryColor3iEXT\0"
+   "\0"
+   /* _mesa_function_pool[555]: WindowPos3fMESA (will be remapped) */
+   "fff\0"
+   "glWindowPos3f\0"
+   "glWindowPos3fARB\0"
+   "glWindowPos3fMESA\0"
+   "\0"
+   /* _mesa_function_pool[609]: TexCoord1iv (offset 99) */
+   "p\0"
+   "glTexCoord1iv\0"
+   "\0"
+   /* _mesa_function_pool[626]: TexCoord4sv (offset 125) */
+   "p\0"
+   "glTexCoord4sv\0"
+   "\0"
+   /* _mesa_function_pool[643]: RasterPos4s (offset 84) */
+   "iiii\0"
+   "glRasterPos4s\0"
+   "\0"
+   /* _mesa_function_pool[663]: PixelTexGenParameterfvSGIS (will be remapped) */
+   "ip\0"
+   "glPixelTexGenParameterfvSGIS\0"
+   "\0"
+   /* _mesa_function_pool[696]: ActiveTextureARB (offset 374) */
+   "i\0"
+   "glActiveTexture\0"
+   "glActiveTextureARB\0"
+   "\0"
+   /* _mesa_function_pool[734]: BlitFramebufferEXT (will be remapped) */
+   "iiiiiiiiii\0"
+   "glBlitFramebuffer\0"
+   "glBlitFramebufferEXT\0"
+   "\0"
+   /* _mesa_function_pool[785]: TexCoord1f (offset 96) */
+   "f\0"
+   "glTexCoord1f\0"
+   "\0"
+   /* _mesa_function_pool[801]: TexCoord1d (offset 94) */
+   "d\0"
+   "glTexCoord1d\0"
+   "\0"
+   /* _mesa_function_pool[817]: VertexAttrib4ubvNV (will be remapped) */
+   "ip\0"
+   "glVertexAttrib4ubvNV\0"
+   "\0"
+   /* _mesa_function_pool[842]: TexCoord1i (offset 98) */
+   "i\0"
+   "glTexCoord1i\0"
+   "\0"
+   /* _mesa_function_pool[858]: GetProgramNamedParameterdvNV (will be remapped) */
+   "iipp\0"
+   "glGetProgramNamedParameterdvNV\0"
+   "\0"
+   /* _mesa_function_pool[895]: Histogram (offset 367) */
+   "iiii\0"
+   "glHistogram\0"
+   "glHistogramEXT\0"
+   "\0"
+   /* _mesa_function_pool[928]: TexCoord1s (offset 100) */
+   "i\0"
+   "glTexCoord1s\0"
+   "\0"
+   /* _mesa_function_pool[944]: GetMapfv (offset 267) */
+   "iip\0"
+   "glGetMapfv\0"
+   "\0"
+   /* _mesa_function_pool[960]: EvalCoord1f (offset 230) */
+   "f\0"
+   "glEvalCoord1f\0"
+   "\0"
+   /* _mesa_function_pool[977]: FramebufferTexture (will be remapped) */
+   "iiii\0"
+   "glFramebufferTexture\0"
+   "\0"
+   /* _mesa_function_pool[1004]: VertexAttribI1ivEXT (will be remapped) */
+   "ip\0"
+   "glVertexAttribI1ivEXT\0"
+   "glVertexAttribI1iv\0"
+   "\0"
+   /* _mesa_function_pool[1049]: TexImage4DSGIS (dynamic) */
+   "iiiiiiiiiip\0"
+   "glTexImage4DSGIS\0"
+   "\0"
+   /* _mesa_function_pool[1079]: PolygonStipple (offset 175) */
+   "p\0"
+   "glPolygonStipple\0"
+   "\0"
+   /* _mesa_function_pool[1099]: WindowPos2dvMESA (will be remapped) */
+   "p\0"
+   "glWindowPos2dv\0"
+   "glWindowPos2dvARB\0"
+   "glWindowPos2dvMESA\0"
+   "\0"
+   /* _mesa_function_pool[1154]: ReplacementCodeuiColor3fVertex3fvSUN (dynamic) */
+   "ppp\0"
+   "glReplacementCodeuiColor3fVertex3fvSUN\0"
+   "\0"
+   /* _mesa_function_pool[1198]: BlendEquationSeparateEXT (will be remapped) */
+   "ii\0"
+   "glBlendEquationSeparate\0"
+   "glBlendEquationSeparateEXT\0"
+   "glBlendEquationSeparateATI\0"
+   "\0"
+   /* _mesa_function_pool[1280]: ListParameterfSGIX (dynamic) */
+   "iif\0"
+   "glListParameterfSGIX\0"
+   "\0"
+   /* _mesa_function_pool[1306]: SecondaryColor3bEXT (will be remapped) */
+   "iii\0"
+   "glSecondaryColor3b\0"
+   "glSecondaryColor3bEXT\0"
+   "\0"
+   /* _mesa_function_pool[1352]: TexCoord4fColor4fNormal3fVertex4fvSUN (dynamic) */
+   "pppp\0"
+   "glTexCoord4fColor4fNormal3fVertex4fvSUN\0"
+   "\0"
+   /* _mesa_function_pool[1398]: GetPixelMapfv (offset 271) */
+   "ip\0"
+   "glGetPixelMapfv\0"
+   "\0"
+   /* _mesa_function_pool[1418]: Color3uiv (offset 22) */
+   "p\0"
+   "glColor3uiv\0"
+   "\0"
+   /* _mesa_function_pool[1433]: IsEnabled (offset 286) */
+   "i\0"
+   "glIsEnabled\0"
+   "\0"
+   /* _mesa_function_pool[1448]: VertexAttrib4svNV (will be remapped) */
+   "ip\0"
+   "glVertexAttrib4svNV\0"
+   "\0"
+   /* _mesa_function_pool[1472]: EvalCoord2fv (offset 235) */
+   "p\0"
+   "glEvalCoord2fv\0"
+   "\0"
+   /* _mesa_function_pool[1490]: GetBufferSubDataARB (will be remapped) */
+   "iiip\0"
+   "glGetBufferSubData\0"
+   "glGetBufferSubDataARB\0"
+   "\0"
+   /* _mesa_function_pool[1537]: BufferSubDataARB (will be remapped) */
+   "iiip\0"
+   "glBufferSubData\0"
+   "glBufferSubDataARB\0"
+   "\0"
+   /* _mesa_function_pool[1578]: TexCoord2fColor4ubVertex3fvSUN (dynamic) */
+   "ppp\0"
+   "glTexCoord2fColor4ubVertex3fvSUN\0"
+   "\0"
+   /* _mesa_function_pool[1616]: AttachShader (will be remapped) */
+   "ii\0"
+   "glAttachShader\0"
+   "\0"
+   /* _mesa_function_pool[1635]: VertexAttrib2fARB (will be remapped) */
+   "iff\0"
+   "glVertexAttrib2f\0"
+   "glVertexAttrib2fARB\0"
+   "\0"
+   /* _mesa_function_pool[1677]: GetDebugLogLengthMESA (dynamic) */
+   "iii\0"
+   "glGetDebugLogLengthMESA\0"
+   "\0"
+   /* _mesa_function_pool[1706]: GetMapiv (offset 268) */
+   "iip\0"
+   "glGetMapiv\0"
+   "\0"
+   /* _mesa_function_pool[1722]: VertexAttrib3fARB (will be remapped) */
+   "ifff\0"
+   "glVertexAttrib3f\0"
+   "glVertexAttrib3fARB\0"
+   "\0"
+   /* _mesa_function_pool[1765]: Indexubv (offset 316) */
+   "p\0"
+   "glIndexubv\0"
+   "\0"
+   /* _mesa_function_pool[1779]: GetQueryivARB (will be remapped) */
+   "iip\0"
+   "glGetQueryiv\0"
+   "glGetQueryivARB\0"
+   "\0"
+   /* _mesa_function_pool[1813]: TexImage3D (offset 371) */
+   "iiiiiiiiip\0"
+   "glTexImage3D\0"
+   "glTexImage3DEXT\0"
+   "\0"
+   /* _mesa_function_pool[1854]: BindFragDataLocationEXT (will be remapped) */
+   "iip\0"
+   "glBindFragDataLocationEXT\0"
+   "glBindFragDataLocation\0"
+   "\0"
+   /* _mesa_function_pool[1908]: ReplacementCodeuiVertex3fvSUN (dynamic) */
+   "pp\0"
+   "glReplacementCodeuiVertex3fvSUN\0"
+   "\0"
+   /* _mesa_function_pool[1944]: EdgeFlagPointer (offset 312) */
+   "ip\0"
+   "glEdgeFlagPointer\0"
+   "\0"
+   /* _mesa_function_pool[1966]: Color3ubv (offset 20) */
+   "p\0"
+   "glColor3ubv\0"
+   "\0"
+   /* _mesa_function_pool[1981]: GetQueryObjectivARB (will be remapped) */
+   "iip\0"
+   "glGetQueryObjectiv\0"
+   "glGetQueryObjectivARB\0"
+   "\0"
+   /* _mesa_function_pool[2027]: Vertex3dv (offset 135) */
+   "p\0"
+   "glVertex3dv\0"
+   "\0"
+   /* _mesa_function_pool[2042]: ReplacementCodeuiTexCoord2fVertex3fvSUN (dynamic) */
+   "ppp\0"
+   "glReplacementCodeuiTexCoord2fVertex3fvSUN\0"
+   "\0"
+   /* _mesa_function_pool[2089]: CompressedTexSubImage2DARB (will be remapped) */
+   "iiiiiiiip\0"
+   "glCompressedTexSubImage2D\0"
+   "glCompressedTexSubImage2DARB\0"
+   "\0"
+   /* _mesa_function_pool[2155]: CombinerOutputNV (will be remapped) */
+   "iiiiiiiiii\0"
+   "glCombinerOutputNV\0"
+   "\0"
+   /* _mesa_function_pool[2186]: VertexAttribs3fvNV (will be remapped) */
+   "iip\0"
+   "glVertexAttribs3fvNV\0"
+   "\0"
+   /* _mesa_function_pool[2212]: Uniform2fARB (will be remapped) */
+   "iff\0"
+   "glUniform2f\0"
+   "glUniform2fARB\0"
+   "\0"
+   /* _mesa_function_pool[2244]: LightModeliv (offset 166) */
+   "ip\0"
+   "glLightModeliv\0"
+   "\0"
+   /* _mesa_function_pool[2263]: VertexAttrib1svARB (will be remapped) */
+   "ip\0"
+   "glVertexAttrib1sv\0"
+   "glVertexAttrib1svARB\0"
+   "\0"
+   /* _mesa_function_pool[2306]: VertexAttribs1dvNV (will be remapped) */
+   "iip\0"
+   "glVertexAttribs1dvNV\0"
+   "\0"
+   /* _mesa_function_pool[2332]: Uniform2ivARB (will be remapped) */
+   "iip\0"
+   "glUniform2iv\0"
+   "glUniform2ivARB\0"
+   "\0"
+   /* _mesa_function_pool[2366]: GetImageTransformParameterfvHP (dynamic) */
+   "iip\0"
+   "glGetImageTransformParameterfvHP\0"
+   "\0"
+   /* _mesa_function_pool[2404]: Normal3bv (offset 53) */
+   "p\0"
+   "glNormal3bv\0"
+   "\0"
+   /* _mesa_function_pool[2419]: TexGeniv (offset 193) */
+   "iip\0"
+   "glTexGeniv\0"
+   "\0"
+   /* _mesa_function_pool[2435]: WeightubvARB (dynamic) */
+   "ip\0"
+   "glWeightubvARB\0"
+   "\0"
+   /* _mesa_function_pool[2454]: VertexAttrib1fvNV (will be remapped) */
+   "ip\0"
+   "glVertexAttrib1fvNV\0"
+   "\0"
+   /* _mesa_function_pool[2478]: Vertex3iv (offset 139) */
+   "p\0"
+   "glVertex3iv\0"
+   "\0"
+   /* _mesa_function_pool[2493]: CopyConvolutionFilter1D (offset 354) */
+   "iiiii\0"
+   "glCopyConvolutionFilter1D\0"
+   "glCopyConvolutionFilter1DEXT\0"
+   "\0"
+   /* _mesa_function_pool[2555]: VertexAttribI1uiEXT (will be remapped) */
+   "ii\0"
+   "glVertexAttribI1uiEXT\0"
+   "glVertexAttribI1ui\0"
+   "\0"
+   /* _mesa_function_pool[2600]: ReplacementCodeuiNormal3fVertex3fSUN (dynamic) */
+   "iffffff\0"
+   "glReplacementCodeuiNormal3fVertex3fSUN\0"
+   "\0"
+   /* _mesa_function_pool[2648]: DeleteSync (will be remapped) */
+   "i\0"
+   "glDeleteSync\0"
+   "\0"
+   /* _mesa_function_pool[2664]: FragmentMaterialfvSGIX (dynamic) */
+   "iip\0"
+   "glFragmentMaterialfvSGIX\0"
+   "\0"
+   /* _mesa_function_pool[2694]: BlendColor (offset 336) */
+   "ffff\0"
+   "glBlendColor\0"
+   "glBlendColorEXT\0"
+   "\0"
+   /* _mesa_function_pool[2729]: UniformMatrix4fvARB (will be remapped) */
+   "iiip\0"
+   "glUniformMatrix4fv\0"
+   "glUniformMatrix4fvARB\0"
+   "\0"
+   /* _mesa_function_pool[2776]: DeleteVertexArraysAPPLE (will be remapped) */
+   "ip\0"
+   "glDeleteVertexArrays\0"
+   "glDeleteVertexArraysAPPLE\0"
+   "\0"
+   /* _mesa_function_pool[2827]: TexBuffer (will be remapped) */
+   "iii\0"
+   "glTexBuffer\0"
+   "\0"
+   /* _mesa_function_pool[2844]: ReadInstrumentsSGIX (dynamic) */
+   "i\0"
+   "glReadInstrumentsSGIX\0"
+   "\0"
+   /* _mesa_function_pool[2869]: CallLists (offset 3) */
+   "iip\0"
+   "glCallLists\0"
+   "\0"
+   /* _mesa_function_pool[2886]: UniformMatrix2x4fv (will be remapped) */
+   "iiip\0"
+   "glUniformMatrix2x4fv\0"
+   "\0"
+   /* _mesa_function_pool[2913]: Color4ubVertex3fvSUN (dynamic) */
+   "pp\0"
+   "glColor4ubVertex3fvSUN\0"
+   "\0"
+   /* _mesa_function_pool[2940]: Normal3iv (offset 59) */
+   "p\0"
+   "glNormal3iv\0"
+   "\0"
+   /* _mesa_function_pool[2955]: PassThrough (offset 199) */
+   "f\0"
+   "glPassThrough\0"
+   "\0"
+   /* _mesa_function_pool[2972]: GetVertexAttribIivEXT (will be remapped) */
+   "iip\0"
+   "glGetVertexAttribIivEXT\0"
+   "glGetVertexAttribIiv\0"
+   "\0"
+   /* _mesa_function_pool[3022]: TexParameterIivEXT (will be remapped) */
+   "iip\0"
+   "glTexParameterIivEXT\0"
+   "glTexParameterIiv\0"
+   "\0"
+   /* _mesa_function_pool[3066]: FramebufferTextureLayerEXT (will be remapped) */
+   "iiiii\0"
+   "glFramebufferTextureLayer\0"
+   "glFramebufferTextureLayerEXT\0"
+   "\0"
+   /* _mesa_function_pool[3128]: GetListParameterfvSGIX (dynamic) */
+   "iip\0"
+   "glGetListParameterfvSGIX\0"
+   "\0"
+   /* _mesa_function_pool[3158]: Viewport (offset 305) */
+   "iiii\0"
+   "glViewport\0"
+   "\0"
+   /* _mesa_function_pool[3175]: VertexAttrib4NusvARB (will be remapped) */
+   "ip\0"
+   "glVertexAttrib4Nusv\0"
+   "glVertexAttrib4NusvARB\0"
+   "\0"
+   /* _mesa_function_pool[3222]: WindowPos4svMESA (will be remapped) */
+   "p\0"
+   "glWindowPos4svMESA\0"
+   "\0"
+   /* _mesa_function_pool[3244]: CreateProgramObjectARB (will be remapped) */
+   "\0"
+   "glCreateProgramObjectARB\0"
+   "\0"
+   /* _mesa_function_pool[3271]: DeleteTransformFeedbacks (will be remapped) */
+   "ip\0"
+   "glDeleteTransformFeedbacks\0"
+   "\0"
+   /* _mesa_function_pool[3302]: UniformMatrix4x3fv (will be remapped) */
+   "iiip\0"
+   "glUniformMatrix4x3fv\0"
+   "\0"
+   /* _mesa_function_pool[3329]: PrioritizeTextures (offset 331) */
+   "ipp\0"
+   "glPrioritizeTextures\0"
+   "glPrioritizeTexturesEXT\0"
+   "\0"
+   /* _mesa_function_pool[3379]: VertexAttribI3uiEXT (will be remapped) */
+   "iiii\0"
+   "glVertexAttribI3uiEXT\0"
+   "glVertexAttribI3ui\0"
+   "\0"
+   /* _mesa_function_pool[3426]: AsyncMarkerSGIX (dynamic) */
+   "i\0"
+   "glAsyncMarkerSGIX\0"
+   "\0"
+   /* _mesa_function_pool[3447]: GlobalAlphaFactorubSUN (dynamic) */
+   "i\0"
+   "glGlobalAlphaFactorubSUN\0"
+   "\0"
+   /* _mesa_function_pool[3475]: ClearColorIuiEXT (will be remapped) */
+   "iiii\0"
+   "glClearColorIuiEXT\0"
+   "\0"
+   /* _mesa_function_pool[3500]: ClearDebugLogMESA (dynamic) */
+   "iii\0"
+   "glClearDebugLogMESA\0"
+   "\0"
+   /* _mesa_function_pool[3525]: Uniform4uiEXT (will be remapped) */
+   "iiiii\0"
+   "glUniform4uiEXT\0"
+   "glUniform4ui\0"
+   "\0"
+   /* _mesa_function_pool[3561]: ResetHistogram (offset 369) */
+   "i\0"
+   "glResetHistogram\0"
+   "glResetHistogramEXT\0"
+   "\0"
+   /* _mesa_function_pool[3601]: GetProgramNamedParameterfvNV (will be remapped) */
+   "iipp\0"
+   "glGetProgramNamedParameterfvNV\0"
+   "\0"
+   /* _mesa_function_pool[3638]: PointParameterfEXT (will be remapped) */
+   "if\0"
+   "glPointParameterf\0"
+   "glPointParameterfARB\0"
+   "glPointParameterfEXT\0"
+   "glPointParameterfSGIS\0"
+   "\0"
+   /* _mesa_function_pool[3724]: LoadIdentityDeformationMapSGIX (dynamic) */
+   "i\0"
+   "glLoadIdentityDeformationMapSGIX\0"
+   "\0"
+   /* _mesa_function_pool[3760]: GenFencesNV (will be remapped) */
+   "ip\0"
+   "glGenFencesNV\0"
+   "\0"
+   /* _mesa_function_pool[3778]: ImageTransformParameterfHP (dynamic) */
+   "iif\0"
+   "glImageTransformParameterfHP\0"
+   "\0"
+   /* _mesa_function_pool[3812]: MatrixIndexusvARB (dynamic) */
+   "ip\0"
+   "glMatrixIndexusvARB\0"
+   "\0"
+   /* _mesa_function_pool[3836]: DrawElementsBaseVertex (will be remapped) */
+   "iiipi\0"
+   "glDrawElementsBaseVertex\0"
+   "\0"
+   /* _mesa_function_pool[3868]: DisableVertexAttribArrayARB (will be remapped) */
+   "i\0"
+   "glDisableVertexAttribArray\0"
+   "glDisableVertexAttribArrayARB\0"
+   "\0"
+   /* _mesa_function_pool[3928]: TexCoord2sv (offset 109) */
+   "p\0"
+   "glTexCoord2sv\0"
+   "\0"
+   /* _mesa_function_pool[3945]: Vertex4dv (offset 143) */
+   "p\0"
+   "glVertex4dv\0"
+   "\0"
+   /* _mesa_function_pool[3960]: StencilMaskSeparate (will be remapped) */
+   "ii\0"
+   "glStencilMaskSeparate\0"
+   "\0"
+   /* _mesa_function_pool[3986]: ProgramLocalParameter4dARB (will be remapped) */
+   "iidddd\0"
+   "glProgramLocalParameter4dARB\0"
+   "\0"
+   /* _mesa_function_pool[4023]: CompressedTexImage3DARB (will be remapped) */
+   "iiiiiiiip\0"
+   "glCompressedTexImage3D\0"
+   "glCompressedTexImage3DARB\0"
+   "\0"
+   /* _mesa_function_pool[4083]: Color3sv (offset 18) */
+   "p\0"
+   "glColor3sv\0"
+   "\0"
+   /* _mesa_function_pool[4097]: GetConvolutionParameteriv (offset 358) */
+   "iip\0"
+   "glGetConvolutionParameteriv\0"
+   "glGetConvolutionParameterivEXT\0"
+   "\0"
+   /* _mesa_function_pool[4161]: VertexAttrib1fARB (will be remapped) */
+   "if\0"
+   "glVertexAttrib1f\0"
+   "glVertexAttrib1fARB\0"
+   "\0"
+   /* _mesa_function_pool[4202]: Vertex2dv (offset 127) */
+   "p\0"
+   "glVertex2dv\0"
+   "\0"
+   /* _mesa_function_pool[4217]: TestFenceNV (will be remapped) */
+   "i\0"
+   "glTestFenceNV\0"
+   "\0"
+   /* _mesa_function_pool[4234]: MultiTexCoord1fvARB (offset 379) */
+   "ip\0"
+   "glMultiTexCoord1fv\0"
+   "glMultiTexCoord1fvARB\0"
+   "\0"
+   /* _mesa_function_pool[4279]: TexCoord3iv (offset 115) */
+   "p\0"
+   "glTexCoord3iv\0"
+   "\0"
+   /* _mesa_function_pool[4296]: Uniform2uivEXT (will be remapped) */
+   "iip\0"
+   "glUniform2uivEXT\0"
+   "glUniform2uiv\0"
+   "\0"
+   /* _mesa_function_pool[4332]: ColorFragmentOp2ATI (will be remapped) */
+   "iiiiiiiiii\0"
+   "glColorFragmentOp2ATI\0"
+   "\0"
+   /* _mesa_function_pool[4366]: SecondaryColorPointerListIBM (dynamic) */
+   "iiipi\0"
+   "glSecondaryColorPointerListIBM\0"
+   "\0"
+   /* _mesa_function_pool[4404]: GetPixelTexGenParameterivSGIS (will be remapped) */
+   "ip\0"
+   "glGetPixelTexGenParameterivSGIS\0"
+   "\0"
+   /* _mesa_function_pool[4440]: Color3fv (offset 14) */
+   "p\0"
+   "glColor3fv\0"
+   "\0"
+   /* _mesa_function_pool[4454]: VertexAttrib4fNV (will be remapped) */
+   "iffff\0"
+   "glVertexAttrib4fNV\0"
+   "\0"
+   /* _mesa_function_pool[4480]: ReplacementCodeubSUN (dynamic) */
+   "i\0"
+   "glReplacementCodeubSUN\0"
+   "\0"
+   /* _mesa_function_pool[4506]: FinishAsyncSGIX (dynamic) */
+   "p\0"
+   "glFinishAsyncSGIX\0"
+   "\0"
+   /* _mesa_function_pool[4527]: GetDebugLogMESA (dynamic) */
+   "iiiipp\0"
+   "glGetDebugLogMESA\0"
+   "\0"
+   /* _mesa_function_pool[4553]: FogCoorddEXT (will be remapped) */
+   "d\0"
+   "glFogCoordd\0"
+   "glFogCoorddEXT\0"
+   "\0"
+   /* _mesa_function_pool[4583]: BeginConditionalRenderNV (will be remapped) */
+   "ii\0"
+   "glBeginConditionalRenderNV\0"
+   "glBeginConditionalRender\0"
+   "\0"
+   /* _mesa_function_pool[4639]: Color4ubVertex3fSUN (dynamic) */
+   "iiiifff\0"
+   "glColor4ubVertex3fSUN\0"
+   "\0"
+   /* _mesa_function_pool[4670]: FogCoordfEXT (will be remapped) */
+   "f\0"
+   "glFogCoordf\0"
+   "glFogCoordfEXT\0"
+   "\0"
+   /* _mesa_function_pool[4700]: PointSize (offset 173) */
+   "f\0"
+   "glPointSize\0"
+   "\0"
+   /* _mesa_function_pool[4715]: VertexAttribI2uivEXT (will be remapped) */
+   "ip\0"
+   "glVertexAttribI2uivEXT\0"
+   "glVertexAttribI2uiv\0"
+   "\0"
+   /* _mesa_function_pool[4762]: TexCoord2fVertex3fSUN (dynamic) */
+   "fffff\0"
+   "glTexCoord2fVertex3fSUN\0"
+   "\0"
+   /* _mesa_function_pool[4793]: PopName (offset 200) */
+   "\0"
+   "glPopName\0"
+   "\0"
+   /* _mesa_function_pool[4805]: GlobalAlphaFactoriSUN (dynamic) */
+   "i\0"
+   "glGlobalAlphaFactoriSUN\0"
+   "\0"
+   /* _mesa_function_pool[4832]: VertexAttrib2dNV (will be remapped) */
+   "idd\0"
+   "glVertexAttrib2dNV\0"
+   "\0"
+   /* _mesa_function_pool[4856]: GetProgramInfoLog (will be remapped) */
+   "iipp\0"
+   "glGetProgramInfoLog\0"
+   "\0"
+   /* _mesa_function_pool[4882]: VertexAttrib4NbvARB (will be remapped) */
+   "ip\0"
+   "glVertexAttrib4Nbv\0"
+   "glVertexAttrib4NbvARB\0"
+   "\0"
+   /* _mesa_function_pool[4927]: GetActiveAttribARB (will be remapped) */
+   "iiipppp\0"
+   "glGetActiveAttrib\0"
+   "glGetActiveAttribARB\0"
+   "\0"
+   /* _mesa_function_pool[4975]: Vertex4sv (offset 149) */
+   "p\0"
+   "glVertex4sv\0"
+   "\0"
+   /* _mesa_function_pool[4990]: VertexAttrib4ubNV (will be remapped) */
+   "iiiii\0"
+   "glVertexAttrib4ubNV\0"
+   "\0"
+   /* _mesa_function_pool[5017]: ClampColor (will be remapped) */
+   "ii\0"
+   "glClampColor\0"
+   "\0"
+   /* _mesa_function_pool[5034]: TextureRangeAPPLE (will be remapped) */
+   "iip\0"
+   "glTextureRangeAPPLE\0"
+   "\0"
+   /* _mesa_function_pool[5059]: GetTexEnvfv (offset 276) */
+   "iip\0"
+   "glGetTexEnvfv\0"
+   "\0"
+   /* _mesa_function_pool[5078]: BindTransformFeedback (will be remapped) */
+   "ii\0"
+   "glBindTransformFeedback\0"
+   "\0"
+   /* _mesa_function_pool[5106]: TexCoord2fColor4fNormal3fVertex3fSUN (dynamic) */
+   "ffffffffffff\0"
+   "glTexCoord2fColor4fNormal3fVertex3fSUN\0"
+   "\0"
+   /* _mesa_function_pool[5159]: Indexub (offset 315) */
+   "i\0"
+   "glIndexub\0"
+   "\0"
+   /* _mesa_function_pool[5172]: ColorMaskIndexedEXT (will be remapped) */
+   "iiiii\0"
+   "glColorMaskIndexedEXT\0"
+   "glColorMaski\0"
+   "\0"
+   /* _mesa_function_pool[5214]: TexEnvi (offset 186) */
+   "iii\0"
+   "glTexEnvi\0"
+   "\0"
+   /* _mesa_function_pool[5229]: GetClipPlane (offset 259) */
+   "ip\0"
+   "glGetClipPlane\0"
+   "\0"
+   /* _mesa_function_pool[5248]: CombinerParameterfvNV (will be remapped) */
+   "ip\0"
+   "glCombinerParameterfvNV\0"
+   "\0"
+   /* _mesa_function_pool[5276]: VertexAttribs3dvNV (will be remapped) */
+   "iip\0"
+   "glVertexAttribs3dvNV\0"
+   "\0"
+   /* _mesa_function_pool[5302]: VertexAttribI2uiEXT (will be remapped) */
+   "iii\0"
+   "glVertexAttribI2uiEXT\0"
+   "glVertexAttribI2ui\0"
+   "\0"
+   /* _mesa_function_pool[5348]: VertexAttribs4fvNV (will be remapped) */
+   "iip\0"
+   "glVertexAttribs4fvNV\0"
+   "\0"
+   /* _mesa_function_pool[5374]: VertexArrayRangeNV (will be remapped) */
+   "ip\0"
+   "glVertexArrayRangeNV\0"
+   "\0"
+   /* _mesa_function_pool[5399]: FragmentLightiSGIX (dynamic) */
+   "iii\0"
+   "glFragmentLightiSGIX\0"
+   "\0"
+   /* _mesa_function_pool[5425]: PolygonOffsetEXT (will be remapped) */
+   "ff\0"
+   "glPolygonOffsetEXT\0"
+   "\0"
+   /* _mesa_function_pool[5448]: VertexAttribI4uivEXT (will be remapped) */
+   "ip\0"
+   "glVertexAttribI4uivEXT\0"
+   "glVertexAttribI4uiv\0"
+   "\0"
+   /* _mesa_function_pool[5495]: PollAsyncSGIX (dynamic) */
+   "p\0"
+   "glPollAsyncSGIX\0"
+   "\0"
+   /* _mesa_function_pool[5514]: DeleteFragmentShaderATI (will be remapped) */
+   "i\0"
+   "glDeleteFragmentShaderATI\0"
+   "\0"
+   /* _mesa_function_pool[5543]: Scaled (offset 301) */
+   "ddd\0"
+   "glScaled\0"
+   "\0"
+   /* _mesa_function_pool[5557]: ResumeTransformFeedback (will be remapped) */
+   "\0"
+   "glResumeTransformFeedback\0"
+   "\0"
+   /* _mesa_function_pool[5585]: Scalef (offset 302) */
+   "fff\0"
+   "glScalef\0"
+   "\0"
+   /* _mesa_function_pool[5599]: TexCoord2fNormal3fVertex3fvSUN (dynamic) */
+   "ppp\0"
+   "glTexCoord2fNormal3fVertex3fvSUN\0"
+   "\0"
+   /* _mesa_function_pool[5637]: MultTransposeMatrixdARB (will be remapped) */
+   "p\0"
+   "glMultTransposeMatrixd\0"
+   "glMultTransposeMatrixdARB\0"
+   "\0"
+   /* _mesa_function_pool[5689]: ObjectUnpurgeableAPPLE (will be remapped) */
+   "iii\0"
+   "glObjectUnpurgeableAPPLE\0"
+   "\0"
+   /* _mesa_function_pool[5719]: AlphaFunc (offset 240) */
+   "if\0"
+   "glAlphaFunc\0"
+   "\0"
+   /* _mesa_function_pool[5735]: WindowPos2svMESA (will be remapped) */
+   "p\0"
+   "glWindowPos2sv\0"
+   "glWindowPos2svARB\0"
+   "glWindowPos2svMESA\0"
+   "\0"
+   /* _mesa_function_pool[5790]: EdgeFlag (offset 41) */
+   "i\0"
+   "glEdgeFlag\0"
+   "\0"
+   /* _mesa_function_pool[5804]: TexCoord2iv (offset 107) */
+   "p\0"
+   "glTexCoord2iv\0"
+   "\0"
+   /* _mesa_function_pool[5821]: CompressedTexImage1DARB (will be remapped) */
+   "iiiiiip\0"
+   "glCompressedTexImage1D\0"
+   "glCompressedTexImage1DARB\0"
+   "\0"
+   /* _mesa_function_pool[5879]: Rotated (offset 299) */
+   "dddd\0"
+   "glRotated\0"
+   "\0"
+   /* _mesa_function_pool[5895]: GetTexParameterIuivEXT (will be remapped) */
+   "iip\0"
+   "glGetTexParameterIuivEXT\0"
+   "glGetTexParameterIuiv\0"
+   "\0"
+   /* _mesa_function_pool[5947]: VertexAttrib2sNV (will be remapped) */
+   "iii\0"
+   "glVertexAttrib2sNV\0"
+   "\0"
+   /* _mesa_function_pool[5971]: ReadPixels (offset 256) */
+   "iiiiiip\0"
+   "glReadPixels\0"
+   "\0"
+   /* _mesa_function_pool[5993]: EdgeFlagv (offset 42) */
+   "p\0"
+   "glEdgeFlagv\0"
+   "\0"
+   /* _mesa_function_pool[6008]: NormalPointerListIBM (dynamic) */
+   "iipi\0"
+   "glNormalPointerListIBM\0"
+   "\0"
+   /* _mesa_function_pool[6037]: IndexPointerEXT (will be remapped) */
+   "iiip\0"
+   "glIndexPointerEXT\0"
+   "\0"
+   /* _mesa_function_pool[6061]: Color4iv (offset 32) */
+   "p\0"
+   "glColor4iv\0"
+   "\0"
+   /* _mesa_function_pool[6075]: TexParameterf (offset 178) */
+   "iif\0"
+   "glTexParameterf\0"
+   "\0"
+   /* _mesa_function_pool[6096]: TexParameteri (offset 180) */
+   "iii\0"
+   "glTexParameteri\0"
+   "\0"
+   /* _mesa_function_pool[6117]: NormalPointerEXT (will be remapped) */
+   "iiip\0"
+   "glNormalPointerEXT\0"
+   "\0"
+   /* _mesa_function_pool[6142]: MultiTexCoord3dARB (offset 392) */
+   "iddd\0"
+   "glMultiTexCoord3d\0"
+   "glMultiTexCoord3dARB\0"
+   "\0"
+   /* _mesa_function_pool[6187]: MultiTexCoord2iARB (offset 388) */
+   "iii\0"
+   "glMultiTexCoord2i\0"
+   "glMultiTexCoord2iARB\0"
+   "\0"
+   /* _mesa_function_pool[6231]: DrawPixels (offset 257) */
+   "iiiip\0"
+   "glDrawPixels\0"
+   "\0"
+   /* _mesa_function_pool[6251]: ReplacementCodeuiTexCoord2fNormal3fVertex3fSUN (dynamic) */
+   "iffffffff\0"
+   "glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN\0"
+   "\0"
+   /* _mesa_function_pool[6311]: MultiTexCoord2svARB (offset 391) */
+   "ip\0"
+   "glMultiTexCoord2sv\0"
+   "glMultiTexCoord2svARB\0"
+   "\0"
+   /* _mesa_function_pool[6356]: ReplacementCodeubvSUN (dynamic) */
+   "p\0"
+   "glReplacementCodeubvSUN\0"
+   "\0"
+   /* _mesa_function_pool[6383]: Uniform3iARB (will be remapped) */
+   "iiii\0"
+   "glUniform3i\0"
+   "glUniform3iARB\0"
+   "\0"
+   /* _mesa_function_pool[6416]: DrawTransformFeedback (will be remapped) */
+   "ii\0"
+   "glDrawTransformFeedback\0"
+   "\0"
+   /* _mesa_function_pool[6444]: DrawElementsInstancedARB (will be remapped) */
+   "iiipi\0"
+   "glDrawElementsInstancedARB\0"
+   "glDrawElementsInstancedEXT\0"
+   "glDrawElementsInstanced\0"
+   "\0"
+   /* _mesa_function_pool[6529]: GetShaderInfoLog (will be remapped) */
+   "iipp\0"
+   "glGetShaderInfoLog\0"
+   "\0"
+   /* _mesa_function_pool[6554]: WeightivARB (dynamic) */
+   "ip\0"
+   "glWeightivARB\0"
+   "\0"
+   /* _mesa_function_pool[6572]: PollInstrumentsSGIX (dynamic) */
+   "p\0"
+   "glPollInstrumentsSGIX\0"
+   "\0"
+   /* _mesa_function_pool[6597]: GlobalAlphaFactordSUN (dynamic) */
+   "d\0"
+   "glGlobalAlphaFactordSUN\0"
+   "\0"
+   /* _mesa_function_pool[6624]: GetFinalCombinerInputParameterfvNV (will be remapped) */
+   "iip\0"
+   "glGetFinalCombinerInputParameterfvNV\0"
+   "\0"
+   /* _mesa_function_pool[6666]: GenerateMipmapEXT (will be remapped) */
+   "i\0"
+   "glGenerateMipmap\0"
+   "glGenerateMipmapEXT\0"
+   "\0"
+   /* _mesa_function_pool[6706]: GenLists (offset 5) */
+   "i\0"
+   "glGenLists\0"
+   "\0"
+   /* _mesa_function_pool[6720]: DepthRangef (will be remapped) */
+   "ff\0"
+   "glDepthRangef\0"
+   "\0"
+   /* _mesa_function_pool[6738]: GetMapAttribParameterivNV (dynamic) */
+   "iiip\0"
+   "glGetMapAttribParameterivNV\0"
+   "\0"
+   /* _mesa_function_pool[6772]: CreateShaderObjectARB (will be remapped) */
+   "i\0"
+   "glCreateShaderObjectARB\0"
+   "\0"
+   /* _mesa_function_pool[6799]: GetSharpenTexFuncSGIS (dynamic) */
+   "ip\0"
+   "glGetSharpenTexFuncSGIS\0"
+   "\0"
+   /* _mesa_function_pool[6827]: BufferDataARB (will be remapped) */
+   "iipi\0"
+   "glBufferData\0"
+   "glBufferDataARB\0"
+   "\0"
+   /* _mesa_function_pool[6862]: FlushVertexArrayRangeNV (will be remapped) */
+   "\0"
+   "glFlushVertexArrayRangeNV\0"
+   "\0"
+   /* _mesa_function_pool[6890]: MapGrid2d (offset 226) */
+   "iddidd\0"
+   "glMapGrid2d\0"
+   "\0"
+   /* _mesa_function_pool[6910]: MapGrid2f (offset 227) */
+   "iffiff\0"
+   "glMapGrid2f\0"
+   "\0"
+   /* _mesa_function_pool[6930]: SampleMapATI (will be remapped) */
+   "iii\0"
+   "glSampleMapATI\0"
+   "\0"
+   /* _mesa_function_pool[6950]: VertexPointerEXT (will be remapped) */
+   "iiiip\0"
+   "glVertexPointerEXT\0"
+   "\0"
+   /* _mesa_function_pool[6976]: GetTexFilterFuncSGIS (dynamic) */
+   "iip\0"
+   "glGetTexFilterFuncSGIS\0"
+   "\0"
+   /* _mesa_function_pool[7004]: Scissor (offset 176) */
+   "iiii\0"
+   "glScissor\0"
+   "\0"
+   /* _mesa_function_pool[7020]: Fogf (offset 153) */
+   "if\0"
+   "glFogf\0"
+   "\0"
+   /* _mesa_function_pool[7031]: ReplacementCodeuiColor4ubVertex3fvSUN (dynamic) */
+   "ppp\0"
+   "glReplacementCodeuiColor4ubVertex3fvSUN\0"
+   "\0"
+   /* _mesa_function_pool[7076]: TexSubImage1D (offset 332) */
+   "iiiiiip\0"
+   "glTexSubImage1D\0"
+   "glTexSubImage1DEXT\0"
+   "\0"
+   /* _mesa_function_pool[7120]: VertexAttrib1sARB (will be remapped) */
+   "ii\0"
+   "glVertexAttrib1s\0"
+   "glVertexAttrib1sARB\0"
+   "\0"
+   /* _mesa_function_pool[7161]: FenceSync (will be remapped) */
+   "ii\0"
+   "glFenceSync\0"
+   "\0"
+   /* _mesa_function_pool[7177]: Color4usv (offset 40) */
+   "p\0"
+   "glColor4usv\0"
+   "\0"
+   /* _mesa_function_pool[7192]: Fogi (offset 155) */
+   "ii\0"
+   "glFogi\0"
+   "\0"
+   /* _mesa_function_pool[7203]: DepthRange (offset 288) */
+   "dd\0"
+   "glDepthRange\0"
+   "\0"
+   /* _mesa_function_pool[7220]: RasterPos3iv (offset 75) */
+   "p\0"
+   "glRasterPos3iv\0"
+   "\0"
+   /* _mesa_function_pool[7238]: FinalCombinerInputNV (will be remapped) */
+   "iiii\0"
+   "glFinalCombinerInputNV\0"
+   "\0"
+   /* _mesa_function_pool[7267]: TexCoord2i (offset 106) */
+   "ii\0"
+   "glTexCoord2i\0"
+   "\0"
+   /* _mesa_function_pool[7284]: PixelMapfv (offset 251) */
+   "iip\0"
+   "glPixelMapfv\0"
+   "\0"
+   /* _mesa_function_pool[7302]: Color4ui (offset 37) */
+   "iiii\0"
+   "glColor4ui\0"
+   "\0"
+   /* _mesa_function_pool[7319]: RasterPos3s (offset 76) */
+   "iii\0"
+   "glRasterPos3s\0"
+   "\0"
+   /* _mesa_function_pool[7338]: Color3usv (offset 24) */
+   "p\0"
+   "glColor3usv\0"
+   "\0"
+   /* _mesa_function_pool[7353]: FlushRasterSGIX (dynamic) */
+   "\0"
+   "glFlushRasterSGIX\0"
+   "\0"
+   /* _mesa_function_pool[7373]: TexCoord2f (offset 104) */
+   "ff\0"
+   "glTexCoord2f\0"
+   "\0"
+   /* _mesa_function_pool[7390]: ReplacementCodeuiTexCoord2fVertex3fSUN (dynamic) */
+   "ifffff\0"
+   "glReplacementCodeuiTexCoord2fVertex3fSUN\0"
+   "\0"
+   /* _mesa_function_pool[7439]: TexCoord2d (offset 102) */
+   "dd\0"
+   "glTexCoord2d\0"
+   "\0"
+   /* _mesa_function_pool[7456]: RasterPos3d (offset 70) */
+   "ddd\0"
+   "glRasterPos3d\0"
+   "\0"
+   /* _mesa_function_pool[7475]: RasterPos3f (offset 72) */
+   "fff\0"
+   "glRasterPos3f\0"
+   "\0"
+   /* _mesa_function_pool[7494]: Uniform1fARB (will be remapped) */
+   "if\0"
+   "glUniform1f\0"
+   "glUniform1fARB\0"
+   "\0"
+   /* _mesa_function_pool[7525]: AreTexturesResident (offset 322) */
+   "ipp\0"
+   "glAreTexturesResident\0"
+   "glAreTexturesResidentEXT\0"
+   "\0"
+   /* _mesa_function_pool[7577]: TexCoord2s (offset 108) */
+   "ii\0"
+   "glTexCoord2s\0"
+   "\0"
+   /* _mesa_function_pool[7594]: StencilOpSeparate (will be remapped) */
+   "iiii\0"
+   "glStencilOpSeparate\0"
+   "glStencilOpSeparateATI\0"
+   "\0"
+   /* _mesa_function_pool[7643]: ColorTableParameteriv (offset 341) */
+   "iip\0"
+   "glColorTableParameteriv\0"
+   "glColorTableParameterivSGI\0"
+   "\0"
+   /* _mesa_function_pool[7699]: FogCoordPointerListIBM (dynamic) */
+   "iipi\0"
+   "glFogCoordPointerListIBM\0"
+   "\0"
+   /* _mesa_function_pool[7730]: WindowPos3dMESA (will be remapped) */
+   "ddd\0"
+   "glWindowPos3d\0"
+   "glWindowPos3dARB\0"
+   "glWindowPos3dMESA\0"
+   "\0"
+   /* _mesa_function_pool[7784]: Color4us (offset 39) */
+   "iiii\0"
+   "glColor4us\0"
+   "\0"
+   /* _mesa_function_pool[7801]: PointParameterfvEXT (will be remapped) */
+   "ip\0"
+   "glPointParameterfv\0"
+   "glPointParameterfvARB\0"
+   "glPointParameterfvEXT\0"
+   "glPointParameterfvSGIS\0"
+   "\0"
+   /* _mesa_function_pool[7891]: Color3bv (offset 10) */
+   "p\0"
+   "glColor3bv\0"
+   "\0"
+   /* _mesa_function_pool[7905]: WindowPos2fvMESA (will be remapped) */
+   "p\0"
+   "glWindowPos2fv\0"
+   "glWindowPos2fvARB\0"
+   "glWindowPos2fvMESA\0"
+   "\0"
+   /* _mesa_function_pool[7960]: SecondaryColor3bvEXT (will be remapped) */
+   "p\0"
+   "glSecondaryColor3bv\0"
+   "glSecondaryColor3bvEXT\0"
+   "\0"
+   /* _mesa_function_pool[8006]: VertexPointerListIBM (dynamic) */
+   "iiipi\0"
+   "glVertexPointerListIBM\0"
+   "\0"
+   /* _mesa_function_pool[8036]: GetProgramLocalParameterfvARB (will be remapped) */
+   "iip\0"
+   "glGetProgramLocalParameterfvARB\0"
+   "\0"
+   /* _mesa_function_pool[8073]: FragmentMaterialfSGIX (dynamic) */
+   "iif\0"
+   "glFragmentMaterialfSGIX\0"
+   "\0"
+   /* _mesa_function_pool[8102]: TexCoord2fNormal3fVertex3fSUN (dynamic) */
+   "ffffffff\0"
+   "glTexCoord2fNormal3fVertex3fSUN\0"
+   "\0"
+   /* _mesa_function_pool[8144]: RenderbufferStorageEXT (will be remapped) */
+   "iiii\0"
+   "glRenderbufferStorage\0"
+   "glRenderbufferStorageEXT\0"
+   "\0"
+   /* _mesa_function_pool[8197]: IsFenceNV (will be remapped) */
+   "i\0"
+   "glIsFenceNV\0"
+   "\0"
+   /* _mesa_function_pool[8212]: AttachObjectARB (will be remapped) */
+   "ii\0"
+   "glAttachObjectARB\0"
+   "\0"
+   /* _mesa_function_pool[8234]: GetFragmentLightivSGIX (dynamic) */
+   "iip\0"
+   "glGetFragmentLightivSGIX\0"
+   "\0"
+   /* _mesa_function_pool[8264]: UniformMatrix2fvARB (will be remapped) */
+   "iiip\0"
+   "glUniformMatrix2fv\0"
+   "glUniformMatrix2fvARB\0"
+   "\0"
+   /* _mesa_function_pool[8311]: MultiTexCoord2fARB (offset 386) */
+   "iff\0"
+   "glMultiTexCoord2f\0"
+   "glMultiTexCoord2fARB\0"
+   "\0"
+   /* _mesa_function_pool[8355]: ColorTable (offset 339) */
+   "iiiiip\0"
+   "glColorTable\0"
+   "glColorTableSGI\0"
+   "glColorTableEXT\0"
+   "\0"
+   /* _mesa_function_pool[8408]: IndexPointer (offset 314) */
+   "iip\0"
+   "glIndexPointer\0"
+   "\0"
+   /* _mesa_function_pool[8428]: Accum (offset 213) */
+   "if\0"
+   "glAccum\0"
+   "\0"
+   /* _mesa_function_pool[8440]: GetTexImage (offset 281) */
+   "iiiip\0"
+   "glGetTexImage\0"
+   "\0"
+   /* _mesa_function_pool[8461]: MapControlPointsNV (dynamic) */
+   "iiiiiiiip\0"
+   "glMapControlPointsNV\0"
+   "\0"
+   /* _mesa_function_pool[8493]: ConvolutionFilter2D (offset 349) */
+   "iiiiiip\0"
+   "glConvolutionFilter2D\0"
+   "glConvolutionFilter2DEXT\0"
+   "\0"
+   /* _mesa_function_pool[8549]: Finish (offset 216) */
+   "\0"
+   "glFinish\0"
+   "\0"
+   /* _mesa_function_pool[8560]: MapParameterfvNV (dynamic) */
+   "iip\0"
+   "glMapParameterfvNV\0"
+   "\0"
+   /* _mesa_function_pool[8584]: ClearStencil (offset 207) */
+   "i\0"
+   "glClearStencil\0"
+   "\0"
+   /* _mesa_function_pool[8602]: VertexAttrib3dvARB (will be remapped) */
+   "ip\0"
+   "glVertexAttrib3dv\0"
+   "glVertexAttrib3dvARB\0"
+   "\0"
+   /* _mesa_function_pool[8645]: Uniform4uivEXT (will be remapped) */
+   "iip\0"
+   "glUniform4uivEXT\0"
+   "glUniform4uiv\0"
+   "\0"
+   /* _mesa_function_pool[8681]: HintPGI (dynamic) */
+   "ii\0"
+   "glHintPGI\0"
+   "\0"
+   /* _mesa_function_pool[8695]: ConvolutionParameteriv (offset 353) */
+   "iip\0"
+   "glConvolutionParameteriv\0"
+   "glConvolutionParameterivEXT\0"
+   "\0"
+   /* _mesa_function_pool[8753]: Color4s (offset 33) */
+   "iiii\0"
+   "glColor4s\0"
+   "\0"
+   /* _mesa_function_pool[8769]: InterleavedArrays (offset 317) */
+   "iip\0"
+   "glInterleavedArrays\0"
+   "\0"
+   /* _mesa_function_pool[8794]: RasterPos2fv (offset 65) */
+   "p\0"
+   "glRasterPos2fv\0"
+   "\0"
+   /* _mesa_function_pool[8812]: TexCoord1fv (offset 97) */
+   "p\0"
+   "glTexCoord1fv\0"
+   "\0"
+   /* _mesa_function_pool[8829]: Vertex2d (offset 126) */
+   "dd\0"
+   "glVertex2d\0"
+   "\0"
+   /* _mesa_function_pool[8844]: CullParameterdvEXT (dynamic) */
+   "ip\0"
+   "glCullParameterdvEXT\0"
+   "\0"
+   /* _mesa_function_pool[8869]: ProgramNamedParameter4fNV (will be remapped) */
+   "iipffff\0"
+   "glProgramNamedParameter4fNV\0"
+   "\0"
+   /* _mesa_function_pool[8906]: Color3fVertex3fSUN (dynamic) */
+   "ffffff\0"
+   "glColor3fVertex3fSUN\0"
+   "\0"
+   /* _mesa_function_pool[8935]: ProgramEnvParameter4fvARB (will be remapped) */
+   "iip\0"
+   "glProgramEnvParameter4fvARB\0"
+   "glProgramParameter4fvNV\0"
+   "\0"
+   /* _mesa_function_pool[8992]: Color4i (offset 31) */
+   "iiii\0"
+   "glColor4i\0"
+   "\0"
+   /* _mesa_function_pool[9008]: Color4f (offset 29) */
+   "ffff\0"
+   "glColor4f\0"
+   "\0"
+   /* _mesa_function_pool[9024]: RasterPos4fv (offset 81) */
+   "p\0"
+   "glRasterPos4fv\0"
+   "\0"
+   /* _mesa_function_pool[9042]: Color4d (offset 27) */
+   "dddd\0"
+   "glColor4d\0"
+   "\0"
+   /* _mesa_function_pool[9058]: ClearIndex (offset 205) */
+   "f\0"
+   "glClearIndex\0"
+   "\0"
+   /* _mesa_function_pool[9074]: Color4b (offset 25) */
+   "iiii\0"
+   "glColor4b\0"
+   "\0"
+   /* _mesa_function_pool[9090]: LoadMatrixd (offset 292) */
+   "p\0"
+   "glLoadMatrixd\0"
+   "\0"
+   /* _mesa_function_pool[9107]: FragmentLightModeliSGIX (dynamic) */
+   "ii\0"
+   "glFragmentLightModeliSGIX\0"
+   "\0"
+   /* _mesa_function_pool[9137]: RasterPos2dv (offset 63) */
+   "p\0"
+   "glRasterPos2dv\0"
+   "\0"
+   /* _mesa_function_pool[9155]: ConvolutionParameterfv (offset 351) */
+   "iip\0"
+   "glConvolutionParameterfv\0"
+   "glConvolutionParameterfvEXT\0"
+   "\0"
+   /* _mesa_function_pool[9213]: TbufferMask3DFX (dynamic) */
+   "i\0"
+   "glTbufferMask3DFX\0"
+   "\0"
+   /* _mesa_function_pool[9234]: GetTexGendv (offset 278) */
+   "iip\0"
+   "glGetTexGendv\0"
+   "\0"
+   /* _mesa_function_pool[9253]: GetVertexAttribfvNV (will be remapped) */
+   "iip\0"
+   "glGetVertexAttribfvNV\0"
+   "\0"
+   /* _mesa_function_pool[9280]: BeginTransformFeedbackEXT (will be remapped) */
+   "i\0"
+   "glBeginTransformFeedbackEXT\0"
+   "glBeginTransformFeedback\0"
+   "\0"
+   /* _mesa_function_pool[9336]: LoadProgramNV (will be remapped) */
+   "iiip\0"
+   "glLoadProgramNV\0"
+   "\0"
+   /* _mesa_function_pool[9358]: WaitSync (will be remapped) */
+   "iii\0"
+   "glWaitSync\0"
+   "\0"
+   /* _mesa_function_pool[9374]: EndList (offset 1) */
+   "\0"
+   "glEndList\0"
+   "\0"
+   /* _mesa_function_pool[9386]: VertexAttrib4fvNV (will be remapped) */
+   "ip\0"
+   "glVertexAttrib4fvNV\0"
+   "\0"
+   /* _mesa_function_pool[9410]: GetAttachedObjectsARB (will be remapped) */
+   "iipp\0"
+   "glGetAttachedObjectsARB\0"
+   "\0"
+   /* _mesa_function_pool[9440]: Uniform3fvARB (will be remapped) */
+   "iip\0"
+   "glUniform3fv\0"
+   "glUniform3fvARB\0"
+   "\0"
+   /* _mesa_function_pool[9474]: EvalCoord1fv (offset 231) */
+   "p\0"
+   "glEvalCoord1fv\0"
+   "\0"
+   /* _mesa_function_pool[9492]: DrawRangeElements (offset 338) */
+   "iiiiip\0"
+   "glDrawRangeElements\0"
+   "glDrawRangeElementsEXT\0"
+   "\0"
+   /* _mesa_function_pool[9543]: EvalMesh2 (offset 238) */
+   "iiiii\0"
+   "glEvalMesh2\0"
+   "\0"
+   /* _mesa_function_pool[9562]: Vertex4fv (offset 145) */
+   "p\0"
+   "glVertex4fv\0"
+   "\0"
+   /* _mesa_function_pool[9577]: GenTransformFeedbacks (will be remapped) */
+   "ip\0"
+   "glGenTransformFeedbacks\0"
+   "\0"
+   /* _mesa_function_pool[9605]: SpriteParameterfvSGIX (dynamic) */
+   "ip\0"
+   "glSpriteParameterfvSGIX\0"
+   "\0"
+   /* _mesa_function_pool[9633]: CheckFramebufferStatusEXT (will be remapped) */
+   "i\0"
+   "glCheckFramebufferStatus\0"
+   "glCheckFramebufferStatusEXT\0"
+   "\0"
+   /* _mesa_function_pool[9689]: GlobalAlphaFactoruiSUN (dynamic) */
+   "i\0"
+   "glGlobalAlphaFactoruiSUN\0"
+   "\0"
+   /* _mesa_function_pool[9717]: GetHandleARB (will be remapped) */
+   "i\0"
+   "glGetHandleARB\0"
+   "\0"
+   /* _mesa_function_pool[9735]: GetVertexAttribivARB (will be remapped) */
+   "iip\0"
+   "glGetVertexAttribiv\0"
+   "glGetVertexAttribivARB\0"
+   "\0"
+   /* _mesa_function_pool[9783]: BlendFunciARB (will be remapped) */
+   "iii\0"
+   "glBlendFunciARB\0"
+   "\0"
+   /* _mesa_function_pool[9804]: GetCombinerInputParameterfvNV (will be remapped) */
+   "iiiip\0"
+   "glGetCombinerInputParameterfvNV\0"
+   "\0"
+   /* _mesa_function_pool[9843]: GetTexParameterIivEXT (will be remapped) */
+   "iip\0"
+   "glGetTexParameterIivEXT\0"
+   "glGetTexParameterIiv\0"
+   "\0"
+   /* _mesa_function_pool[9893]: CreateProgram (will be remapped) */
+   "\0"
+   "glCreateProgram\0"
+   "\0"
+   /* _mesa_function_pool[9911]: LoadTransposeMatrixdARB (will be remapped) */
+   "p\0"
+   "glLoadTransposeMatrixd\0"
+   "glLoadTransposeMatrixdARB\0"
+   "\0"
+   /* _mesa_function_pool[9963]: ReleaseShaderCompiler (will be remapped) */
+   "\0"
+   "glReleaseShaderCompiler\0"
+   "\0"
+   /* _mesa_function_pool[9989]: GetMinmax (offset 364) */
+   "iiiip\0"
+   "glGetMinmax\0"
+   "glGetMinmaxEXT\0"
+   "\0"
+   /* _mesa_function_pool[10023]: StencilFuncSeparate (will be remapped) */
+   "iiii\0"
+   "glStencilFuncSeparate\0"
+   "\0"
+   /* _mesa_function_pool[10051]: SecondaryColor3sEXT (will be remapped) */
+   "iii\0"
+   "glSecondaryColor3s\0"
+   "glSecondaryColor3sEXT\0"
+   "\0"
+   /* _mesa_function_pool[10097]: Color3fVertex3fvSUN (dynamic) */
+   "pp\0"
+   "glColor3fVertex3fvSUN\0"
+   "\0"
+   /* _mesa_function_pool[10123]: GetInteger64i_v (will be remapped) */
+   "iip\0"
+   "glGetInteger64i_v\0"
+   "\0"
+   /* _mesa_function_pool[10146]: Normal3fv (offset 57) */
+   "p\0"
+   "glNormal3fv\0"
+   "\0"
+   /* _mesa_function_pool[10161]: GlobalAlphaFactorbSUN (dynamic) */
+   "i\0"
+   "glGlobalAlphaFactorbSUN\0"
+   "\0"
+   /* _mesa_function_pool[10188]: Color3us (offset 23) */
+   "iii\0"
+   "glColor3us\0"
+   "\0"
+   /* _mesa_function_pool[10204]: ImageTransformParameterfvHP (dynamic) */
+   "iip\0"
+   "glImageTransformParameterfvHP\0"
+   "\0"
+   /* _mesa_function_pool[10239]: VertexAttrib4ivARB (will be remapped) */
+   "ip\0"
+   "glVertexAttrib4iv\0"
+   "glVertexAttrib4ivARB\0"
+   "\0"
+   /* _mesa_function_pool[10282]: End (offset 43) */
+   "\0"
+   "glEnd\0"
+   "\0"
+   /* _mesa_function_pool[10290]: VertexAttrib3fNV (will be remapped) */
+   "ifff\0"
+   "glVertexAttrib3fNV\0"
+   "\0"
+   /* _mesa_function_pool[10315]: VertexAttribs2dvNV (will be remapped) */
+   "iip\0"
+   "glVertexAttribs2dvNV\0"
+   "\0"
+   /* _mesa_function_pool[10341]: GetQueryObjectui64vEXT (will be remapped) */
+   "iip\0"
+   "glGetQueryObjectui64vEXT\0"
+   "\0"
+   /* _mesa_function_pool[10371]: MultiTexCoord3fvARB (offset 395) */
+   "ip\0"
+   "glMultiTexCoord3fv\0"
+   "glMultiTexCoord3fvARB\0"
+   "\0"
+   /* _mesa_function_pool[10416]: SecondaryColor3dEXT (will be remapped) */
+   "ddd\0"
+   "glSecondaryColor3d\0"
+   "glSecondaryColor3dEXT\0"
+   "\0"
+   /* _mesa_function_pool[10462]: Color3ub (offset 19) */
+   "iii\0"
+   "glColor3ub\0"
+   "\0"
+   /* _mesa_function_pool[10478]: GetProgramParameterfvNV (will be remapped) */
+   "iiip\0"
+   "glGetProgramParameterfvNV\0"
+   "\0"
+   /* _mesa_function_pool[10510]: TangentPointerEXT (dynamic) */
+   "iip\0"
+   "glTangentPointerEXT\0"
+   "\0"
+   /* _mesa_function_pool[10535]: Color4fNormal3fVertex3fvSUN (dynamic) */
+   "ppp\0"
+   "glColor4fNormal3fVertex3fvSUN\0"
+   "\0"
+   /* _mesa_function_pool[10570]: GetInstrumentsSGIX (dynamic) */
+   "\0"
+   "glGetInstrumentsSGIX\0"
+   "\0"
+   /* _mesa_function_pool[10593]: GetUniformuivEXT (will be remapped) */
+   "iip\0"
+   "glGetUniformuivEXT\0"
+   "glGetUniformuiv\0"
+   "\0"
+   /* _mesa_function_pool[10633]: Color3ui (offset 21) */
+   "iii\0"
+   "glColor3ui\0"
+   "\0"
+   /* _mesa_function_pool[10649]: EvalMapsNV (dynamic) */
+   "ii\0"
+   "glEvalMapsNV\0"
+   "\0"
+   /* _mesa_function_pool[10666]: TexSubImage2D (offset 333) */
+   "iiiiiiiip\0"
+   "glTexSubImage2D\0"
+   "glTexSubImage2DEXT\0"
+   "\0"
+   /* _mesa_function_pool[10712]: FragmentLightivSGIX (dynamic) */
+   "iip\0"
+   "glFragmentLightivSGIX\0"
+   "\0"
+   /* _mesa_function_pool[10739]: GetTexParameterPointervAPPLE (will be remapped) */
+   "iip\0"
+   "glGetTexParameterPointervAPPLE\0"
+   "\0"
+   /* _mesa_function_pool[10775]: TexGenfv (offset 191) */
+   "iip\0"
+   "glTexGenfv\0"
+   "\0"
+   /* _mesa_function_pool[10791]: GetTransformFeedbackVaryingEXT (will be remapped) */
+   "iiipppp\0"
+   "glGetTransformFeedbackVaryingEXT\0"
+   "glGetTransformFeedbackVarying\0"
+   "\0"
+   /* _mesa_function_pool[10863]: VertexAttrib4bvARB (will be remapped) */
+   "ip\0"
+   "glVertexAttrib4bv\0"
+   "glVertexAttrib4bvARB\0"
+   "\0"
+   /* _mesa_function_pool[10906]: ShaderBinary (will be remapped) */
+   "ipipi\0"
+   "glShaderBinary\0"
+   "\0"
+   /* _mesa_function_pool[10928]: GetIntegerIndexedvEXT (will be remapped) */
+   "iip\0"
+   "glGetIntegerIndexedvEXT\0"
+   "glGetIntegeri_v\0"
+   "\0"
+   /* _mesa_function_pool[10973]: MultiTexCoord4sARB (offset 406) */
+   "iiiii\0"
+   "glMultiTexCoord4s\0"
+   "glMultiTexCoord4sARB\0"
+   "\0"
+   /* _mesa_function_pool[11019]: GetFragmentMaterialivSGIX (dynamic) */
+   "iip\0"
+   "glGetFragmentMaterialivSGIX\0"
+   "\0"
+   /* _mesa_function_pool[11052]: WindowPos4dMESA (will be remapped) */
+   "dddd\0"
+   "glWindowPos4dMESA\0"
+   "\0"
+   /* _mesa_function_pool[11076]: WeightPointerARB (dynamic) */
+   "iiip\0"
+   "glWeightPointerARB\0"
+   "\0"
+   /* _mesa_function_pool[11101]: WindowPos2dMESA (will be remapped) */
+   "dd\0"
+   "glWindowPos2d\0"
+   "glWindowPos2dARB\0"
+   "glWindowPos2dMESA\0"
+   "\0"
+   /* _mesa_function_pool[11154]: FramebufferTexture3DEXT (will be remapped) */
+   "iiiiii\0"
+   "glFramebufferTexture3D\0"
+   "glFramebufferTexture3DEXT\0"
+   "\0"
+   /* _mesa_function_pool[11211]: BlendEquation (offset 337) */
+   "i\0"
+   "glBlendEquation\0"
+   "glBlendEquationEXT\0"
+   "\0"
+   /* _mesa_function_pool[11249]: VertexAttrib3dNV (will be remapped) */
+   "iddd\0"
+   "glVertexAttrib3dNV\0"
+   "\0"
+   /* _mesa_function_pool[11274]: VertexAttrib3dARB (will be remapped) */
+   "iddd\0"
+   "glVertexAttrib3d\0"
+   "glVertexAttrib3dARB\0"
+   "\0"
+   /* _mesa_function_pool[11317]: VertexAttribI4usvEXT (will be remapped) */
+   "ip\0"
+   "glVertexAttribI4usvEXT\0"
+   "glVertexAttribI4usv\0"
+   "\0"
+   /* _mesa_function_pool[11364]: ReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN (dynamic) */
+   "ppppp\0"
+   "glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN\0"
+   "\0"
+   /* _mesa_function_pool[11428]: VertexAttrib4fARB (will be remapped) */
+   "iffff\0"
+   "glVertexAttrib4f\0"
+   "glVertexAttrib4fARB\0"
+   "\0"
+   /* _mesa_function_pool[11472]: GetError (offset 261) */
+   "\0"
+   "glGetError\0"
+   "\0"
+   /* _mesa_function_pool[11485]: IndexFuncEXT (dynamic) */
+   "if\0"
+   "glIndexFuncEXT\0"
+   "\0"
+   /* _mesa_function_pool[11504]: TexCoord3dv (offset 111) */
+   "p\0"
+   "glTexCoord3dv\0"
+   "\0"
+   /* _mesa_function_pool[11521]: Indexdv (offset 45) */
+   "p\0"
+   "glIndexdv\0"
+   "\0"
+   /* _mesa_function_pool[11534]: FramebufferTexture2DEXT (will be remapped) */
+   "iiiii\0"
+   "glFramebufferTexture2D\0"
+   "glFramebufferTexture2DEXT\0"
+   "\0"
+   /* _mesa_function_pool[11590]: Normal3s (offset 60) */
+   "iii\0"
+   "glNormal3s\0"
+   "\0"
+   /* _mesa_function_pool[11606]: GetObjectParameterivAPPLE (will be remapped) */
+   "iiip\0"
+   "glGetObjectParameterivAPPLE\0"
+   "\0"
+   /* _mesa_function_pool[11640]: PushName (offset 201) */
+   "i\0"
+   "glPushName\0"
+   "\0"
+   /* _mesa_function_pool[11654]: MultiTexCoord2dvARB (offset 385) */
+   "ip\0"
+   "glMultiTexCoord2dv\0"
+   "glMultiTexCoord2dvARB\0"
+   "\0"
+   /* _mesa_function_pool[11699]: CullParameterfvEXT (dynamic) */
+   "ip\0"
+   "glCullParameterfvEXT\0"
+   "\0"
+   /* _mesa_function_pool[11724]: Normal3i (offset 58) */
+   "iii\0"
+   "glNormal3i\0"
+   "\0"
+   /* _mesa_function_pool[11740]: ProgramNamedParameter4fvNV (will be remapped) */
+   "iipp\0"
+   "glProgramNamedParameter4fvNV\0"
+   "\0"
+   /* _mesa_function_pool[11775]: SecondaryColorPointerEXT (will be remapped) */
+   "iiip\0"
+   "glSecondaryColorPointer\0"
+   "glSecondaryColorPointerEXT\0"
+   "\0"
+   /* _mesa_function_pool[11832]: VertexAttrib4fvARB (will be remapped) */
+   "ip\0"
+   "glVertexAttrib4fv\0"
+   "glVertexAttrib4fvARB\0"
+   "\0"
+   /* _mesa_function_pool[11875]: ColorPointerListIBM (dynamic) */
+   "iiipi\0"
+   "glColorPointerListIBM\0"
+   "\0"
+   /* _mesa_function_pool[11904]: GetActiveUniformARB (will be remapped) */
+   "iiipppp\0"
+   "glGetActiveUniform\0"
+   "glGetActiveUniformARB\0"
+   "\0"
+   /* _mesa_function_pool[11954]: ImageTransformParameteriHP (dynamic) */
+   "iii\0"
+   "glImageTransformParameteriHP\0"
+   "\0"
+   /* _mesa_function_pool[11988]: Normal3b (offset 52) */
+   "iii\0"
+   "glNormal3b\0"
+   "\0"
+   /* _mesa_function_pool[12004]: Normal3d (offset 54) */
+   "ddd\0"
+   "glNormal3d\0"
+   "\0"
+   /* _mesa_function_pool[12020]: Uniform1uiEXT (will be remapped) */
+   "ii\0"
+   "glUniform1uiEXT\0"
+   "glUniform1ui\0"
+   "\0"
+   /* _mesa_function_pool[12053]: Normal3f (offset 56) */
+   "fff\0"
+   "glNormal3f\0"
+   "\0"
+   /* _mesa_function_pool[12069]: MultiTexCoord1svARB (offset 383) */
+   "ip\0"
+   "glMultiTexCoord1sv\0"
+   "glMultiTexCoord1svARB\0"
+   "\0"
+   /* _mesa_function_pool[12114]: Indexi (offset 48) */
+   "i\0"
+   "glIndexi\0"
+   "\0"
+   /* _mesa_function_pool[12126]: EGLImageTargetTexture2DOES (will be remapped) */
+   "ip\0"
+   "glEGLImageTargetTexture2DOES\0"
+   "\0"
+   /* _mesa_function_pool[12159]: EndQueryARB (will be remapped) */
+   "i\0"
+   "glEndQuery\0"
+   "glEndQueryARB\0"
+   "\0"
+   /* _mesa_function_pool[12187]: DeleteFencesNV (will be remapped) */
+   "ip\0"
+   "glDeleteFencesNV\0"
+   "\0"
+   /* _mesa_function_pool[12208]: DeformationMap3dSGIX (dynamic) */
+   "iddiiddiiddiip\0"
+   "glDeformationMap3dSGIX\0"
+   "\0"
+   /* _mesa_function_pool[12247]: BindBufferRangeEXT (will be remapped) */
+   "iiiii\0"
+   "glBindBufferRangeEXT\0"
+   "glBindBufferRange\0"
+   "\0"
+   /* _mesa_function_pool[12293]: DepthMask (offset 211) */
+   "i\0"
+   "glDepthMask\0"
+   "\0"
+   /* _mesa_function_pool[12308]: IsShader (will be remapped) */
+   "i\0"
+   "glIsShader\0"
+   "\0"
+   /* _mesa_function_pool[12322]: Indexf (offset 46) */
+   "f\0"
+   "glIndexf\0"
+   "\0"
+   /* _mesa_function_pool[12334]: GetImageTransformParameterivHP (dynamic) */
+   "iip\0"
+   "glGetImageTransformParameterivHP\0"
+   "\0"
+   /* _mesa_function_pool[12372]: Indexd (offset 44) */
+   "d\0"
+   "glIndexd\0"
+   "\0"
+   /* _mesa_function_pool[12384]: GetMaterialiv (offset 270) */
+   "iip\0"
+   "glGetMaterialiv\0"
+   "\0"
+   /* _mesa_function_pool[12405]: StencilOp (offset 244) */
+   "iii\0"
+   "glStencilOp\0"
+   "\0"
+   /* _mesa_function_pool[12422]: WindowPos4ivMESA (will be remapped) */
+   "p\0"
+   "glWindowPos4ivMESA\0"
+   "\0"
+   /* _mesa_function_pool[12444]: FramebufferTextureLayer (dynamic) */
+   "iiiii\0"
+   "glFramebufferTextureLayerARB\0"
+   "\0"
+   /* _mesa_function_pool[12480]: MultiTexCoord3svARB (offset 399) */
+   "ip\0"
+   "glMultiTexCoord3sv\0"
+   "glMultiTexCoord3svARB\0"
+   "\0"
+   /* _mesa_function_pool[12525]: TexEnvfv (offset 185) */
+   "iip\0"
+   "glTexEnvfv\0"
+   "\0"
+   /* _mesa_function_pool[12541]: MultiTexCoord4iARB (offset 404) */
+   "iiiii\0"
+   "glMultiTexCoord4i\0"
+   "glMultiTexCoord4iARB\0"
+   "\0"
+   /* _mesa_function_pool[12587]: Indexs (offset 50) */
+   "i\0"
+   "glIndexs\0"
+   "\0"
+   /* _mesa_function_pool[12599]: Binormal3ivEXT (dynamic) */
+   "p\0"
+   "glBinormal3ivEXT\0"
+   "\0"
+   /* _mesa_function_pool[12619]: ResizeBuffersMESA (will be remapped) */
+   "\0"
+   "glResizeBuffersMESA\0"
+   "\0"
+   /* _mesa_function_pool[12641]: BlendFuncSeparateiARB (will be remapped) */
+   "iiiii\0"
+   "glBlendFuncSeparateiARB\0"
+   "\0"
+   /* _mesa_function_pool[12672]: GetUniformivARB (will be remapped) */
+   "iip\0"
+   "glGetUniformiv\0"
+   "glGetUniformivARB\0"
+   "\0"
+   /* _mesa_function_pool[12710]: PixelTexGenParameteriSGIS (will be remapped) */
+   "ii\0"
+   "glPixelTexGenParameteriSGIS\0"
+   "\0"
+   /* _mesa_function_pool[12742]: VertexPointervINTEL (dynamic) */
+   "iip\0"
+   "glVertexPointervINTEL\0"
+   "\0"
+   /* _mesa_function_pool[12769]: Vertex2i (offset 130) */
+   "ii\0"
+   "glVertex2i\0"
+   "\0"
+   /* _mesa_function_pool[12784]: LoadMatrixf (offset 291) */
+   "p\0"
+   "glLoadMatrixf\0"
+   "\0"
+   /* _mesa_function_pool[12801]: VertexAttribI1uivEXT (will be remapped) */
+   "ip\0"
+   "glVertexAttribI1uivEXT\0"
+   "glVertexAttribI1uiv\0"
+   "\0"
+   /* _mesa_function_pool[12848]: Vertex2f (offset 128) */
+   "ff\0"
+   "glVertex2f\0"
+   "\0"
+   /* _mesa_function_pool[12863]: ReplacementCodeuiColor4fNormal3fVertex3fvSUN (dynamic) */
+   "pppp\0"
+   "glReplacementCodeuiColor4fNormal3fVertex3fvSUN\0"
+   "\0"
+   /* _mesa_function_pool[12916]: Color4bv (offset 26) */
+   "p\0"
+   "glColor4bv\0"
+   "\0"
+   /* _mesa_function_pool[12930]: VertexPointer (offset 321) */
+   "iiip\0"
+   "glVertexPointer\0"
+   "\0"
+   /* _mesa_function_pool[12952]: SecondaryColor3uiEXT (will be remapped) */
+   "iii\0"
+   "glSecondaryColor3ui\0"
+   "glSecondaryColor3uiEXT\0"
+   "\0"
+   /* _mesa_function_pool[13000]: StartInstrumentsSGIX (dynamic) */
+   "\0"
+   "glStartInstrumentsSGIX\0"
+   "\0"
+   /* _mesa_function_pool[13025]: SecondaryColor3usvEXT (will be remapped) */
+   "p\0"
+   "glSecondaryColor3usv\0"
+   "glSecondaryColor3usvEXT\0"
+   "\0"
+   /* _mesa_function_pool[13073]: VertexAttrib2fvNV (will be remapped) */
+   "ip\0"
+   "glVertexAttrib2fvNV\0"
+   "\0"
+   /* _mesa_function_pool[13097]: ProgramLocalParameter4dvARB (will be remapped) */
+   "iip\0"
+   "glProgramLocalParameter4dvARB\0"
+   "\0"
+   /* _mesa_function_pool[13132]: DeleteLists (offset 4) */
+   "ii\0"
+   "glDeleteLists\0"
+   "\0"
+   /* _mesa_function_pool[13150]: LogicOp (offset 242) */
+   "i\0"
+   "glLogicOp\0"
+   "\0"
+   /* _mesa_function_pool[13163]: MatrixIndexuivARB (dynamic) */
+   "ip\0"
+   "glMatrixIndexuivARB\0"
+   "\0"
+   /* _mesa_function_pool[13187]: Vertex2s (offset 132) */
+   "ii\0"
+   "glVertex2s\0"
+   "\0"
+   /* _mesa_function_pool[13202]: RenderbufferStorageMultisample (will be remapped) */
+   "iiiii\0"
+   "glRenderbufferStorageMultisample\0"
+   "glRenderbufferStorageMultisampleEXT\0"
+   "\0"
+   /* _mesa_function_pool[13278]: TexCoord4fv (offset 121) */
+   "p\0"
+   "glTexCoord4fv\0"
+   "\0"
+   /* _mesa_function_pool[13295]: Tangent3sEXT (dynamic) */
+   "iii\0"
+   "glTangent3sEXT\0"
+   "\0"
+   /* _mesa_function_pool[13315]: GlobalAlphaFactorfSUN (dynamic) */
+   "f\0"
+   "glGlobalAlphaFactorfSUN\0"
+   "\0"
+   /* _mesa_function_pool[13342]: MultiTexCoord3iARB (offset 396) */
+   "iiii\0"
+   "glMultiTexCoord3i\0"
+   "glMultiTexCoord3iARB\0"
+   "\0"
+   /* _mesa_function_pool[13387]: IsProgram (will be remapped) */
+   "i\0"
+   "glIsProgram\0"
+   "\0"
+   /* _mesa_function_pool[13402]: TexCoordPointerListIBM (dynamic) */
+   "iiipi\0"
+   "glTexCoordPointerListIBM\0"
+   "\0"
+   /* _mesa_function_pool[13434]: VertexAttribI4svEXT (will be remapped) */
+   "ip\0"
+   "glVertexAttribI4svEXT\0"
+   "glVertexAttribI4sv\0"
+   "\0"
+   /* _mesa_function_pool[13479]: GlobalAlphaFactorusSUN (dynamic) */
+   "i\0"
+   "glGlobalAlphaFactorusSUN\0"
+   "\0"
+   /* _mesa_function_pool[13507]: VertexAttrib2dvNV (will be remapped) */
+   "ip\0"
+   "glVertexAttrib2dvNV\0"
+   "\0"
+   /* _mesa_function_pool[13531]: FramebufferRenderbufferEXT (will be remapped) */
+   "iiii\0"
+   "glFramebufferRenderbuffer\0"
+   "glFramebufferRenderbufferEXT\0"
+   "\0"
+   /* _mesa_function_pool[13592]: ClearBufferuiv (will be remapped) */
+   "iip\0"
+   "glClearBufferuiv\0"
+   "\0"
+   /* _mesa_function_pool[13614]: VertexAttrib1dvNV (will be remapped) */
+   "ip\0"
+   "glVertexAttrib1dvNV\0"
+   "\0"
+   /* _mesa_function_pool[13638]: GenTextures (offset 328) */
+   "ip\0"
+   "glGenTextures\0"
+   "glGenTexturesEXT\0"
+   "\0"
+   /* _mesa_function_pool[13673]: FramebufferTextureARB (will be remapped) */
+   "iiii\0"
+   "glFramebufferTextureARB\0"
+   "\0"
+   /* _mesa_function_pool[13703]: SetFenceNV (will be remapped) */
+   "ii\0"
+   "glSetFenceNV\0"
+   "\0"
+   /* _mesa_function_pool[13720]: FramebufferTexture1DEXT (will be remapped) */
+   "iiiii\0"
+   "glFramebufferTexture1D\0"
+   "glFramebufferTexture1DEXT\0"
+   "\0"
+   /* _mesa_function_pool[13776]: GetCombinerOutputParameterivNV (will be remapped) */
+   "iiip\0"
+   "glGetCombinerOutputParameterivNV\0"
+   "\0"
+   /* _mesa_function_pool[13815]: PixelTexGenParameterivSGIS (will be remapped) */
+   "ip\0"
+   "glPixelTexGenParameterivSGIS\0"
+   "\0"
+   /* _mesa_function_pool[13848]: TextureNormalEXT (dynamic) */
+   "i\0"
+   "glTextureNormalEXT\0"
+   "\0"
+   /* _mesa_function_pool[13870]: IndexPointerListIBM (dynamic) */
+   "iipi\0"
+   "glIndexPointerListIBM\0"
+   "\0"
+   /* _mesa_function_pool[13898]: WeightfvARB (dynamic) */
+   "ip\0"
+   "glWeightfvARB\0"
+   "\0"
+   /* _mesa_function_pool[13916]: RasterPos2sv (offset 69) */
+   "p\0"
+   "glRasterPos2sv\0"
+   "\0"
+   /* _mesa_function_pool[13934]: Color4ubv (offset 36) */
+   "p\0"
+   "glColor4ubv\0"
+   "\0"
+   /* _mesa_function_pool[13949]: DrawBuffer (offset 202) */
+   "i\0"
+   "glDrawBuffer\0"
+   "\0"
+   /* _mesa_function_pool[13965]: TexCoord2fv (offset 105) */
+   "p\0"
+   "glTexCoord2fv\0"
+   "\0"
+   /* _mesa_function_pool[13982]: WindowPos4fMESA (will be remapped) */
+   "ffff\0"
+   "glWindowPos4fMESA\0"
+   "\0"
+   /* _mesa_function_pool[14006]: TexCoord1sv (offset 101) */
+   "p\0"
+   "glTexCoord1sv\0"
+   "\0"
+   /* _mesa_function_pool[14023]: WindowPos3dvMESA (will be remapped) */
+   "p\0"
+   "glWindowPos3dv\0"
+   "glWindowPos3dvARB\0"
+   "glWindowPos3dvMESA\0"
+   "\0"
+   /* _mesa_function_pool[14078]: DepthFunc (offset 245) */
+   "i\0"
+   "glDepthFunc\0"
+   "\0"
+   /* _mesa_function_pool[14093]: PixelMapusv (offset 253) */
+   "iip\0"
+   "glPixelMapusv\0"
+   "\0"
+   /* _mesa_function_pool[14112]: GetQueryObjecti64vEXT (will be remapped) */
+   "iip\0"
+   "glGetQueryObjecti64vEXT\0"
+   "\0"
+   /* _mesa_function_pool[14141]: MultiTexCoord1dARB (offset 376) */
+   "id\0"
+   "glMultiTexCoord1d\0"
+   "glMultiTexCoord1dARB\0"
+   "\0"
+   /* _mesa_function_pool[14184]: PointParameterivNV (will be remapped) */
+   "ip\0"
+   "glPointParameteriv\0"
+   "glPointParameterivNV\0"
+   "\0"
+   /* _mesa_function_pool[14228]: BlendFunc (offset 241) */
+   "ii\0"
+   "glBlendFunc\0"
+   "\0"
+   /* _mesa_function_pool[14244]: EndTransformFeedbackEXT (will be remapped) */
+   "\0"
+   "glEndTransformFeedbackEXT\0"
+   "glEndTransformFeedback\0"
+   "\0"
+   /* _mesa_function_pool[14295]: Uniform2fvARB (will be remapped) */
+   "iip\0"
+   "glUniform2fv\0"
+   "glUniform2fvARB\0"
+   "\0"
+   /* _mesa_function_pool[14329]: BufferParameteriAPPLE (will be remapped) */
+   "iii\0"
+   "glBufferParameteriAPPLE\0"
+   "\0"
+   /* _mesa_function_pool[14358]: MultiTexCoord3dvARB (offset 393) */
+   "ip\0"
+   "glMultiTexCoord3dv\0"
+   "glMultiTexCoord3dvARB\0"
+   "\0"
+   /* _mesa_function_pool[14403]: ReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN (dynamic) */
+   "pppp\0"
+   "glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN\0"
+   "\0"
+   /* _mesa_function_pool[14459]: DeleteObjectARB (will be remapped) */
+   "i\0"
+   "glDeleteObjectARB\0"
+   "\0"
+   /* _mesa_function_pool[14480]: GetShaderPrecisionFormat (will be remapped) */
+   "iipp\0"
+   "glGetShaderPrecisionFormat\0"
+   "\0"
+   /* _mesa_function_pool[14513]: MatrixIndexPointerARB (dynamic) */
+   "iiip\0"
+   "glMatrixIndexPointerARB\0"
+   "\0"
+   /* _mesa_function_pool[14543]: ProgramNamedParameter4dvNV (will be remapped) */
+   "iipp\0"
+   "glProgramNamedParameter4dvNV\0"
+   "\0"
+   /* _mesa_function_pool[14578]: Tangent3fvEXT (dynamic) */
+   "p\0"
+   "glTangent3fvEXT\0"
+   "\0"
+   /* _mesa_function_pool[14597]: Flush (offset 217) */
+   "\0"
+   "glFlush\0"
+   "\0"
+   /* _mesa_function_pool[14607]: Color4uiv (offset 38) */
+   "p\0"
+   "glColor4uiv\0"
+   "\0"
+   /* _mesa_function_pool[14622]: VertexAttribI4iEXT (will be remapped) */
+   "iiiii\0"
+   "glVertexAttribI4iEXT\0"
+   "glVertexAttribI4i\0"
+   "\0"
+   /* _mesa_function_pool[14668]: GenVertexArrays (will be remapped) */
+   "ip\0"
+   "glGenVertexArrays\0"
+   "\0"
+   /* _mesa_function_pool[14690]: Uniform3uivEXT (will be remapped) */
+   "iip\0"
+   "glUniform3uivEXT\0"
+   "glUniform3uiv\0"
+   "\0"
+   /* _mesa_function_pool[14726]: RasterPos3sv (offset 77) */
+   "p\0"
+   "glRasterPos3sv\0"
+   "\0"
+   /* _mesa_function_pool[14744]: BindFramebufferEXT (will be remapped) */
+   "ii\0"
+   "glBindFramebuffer\0"
+   "glBindFramebufferEXT\0"
+   "\0"
+   /* _mesa_function_pool[14787]: ReferencePlaneSGIX (dynamic) */
+   "p\0"
+   "glReferencePlaneSGIX\0"
+   "\0"
+   /* _mesa_function_pool[14811]: PushAttrib (offset 219) */
+   "i\0"
+   "glPushAttrib\0"
+   "\0"
+   /* _mesa_function_pool[14827]: RasterPos2i (offset 66) */
+   "ii\0"
+   "glRasterPos2i\0"
+   "\0"
+   /* _mesa_function_pool[14845]: ValidateProgramARB (will be remapped) */
+   "i\0"
+   "glValidateProgram\0"
+   "glValidateProgramARB\0"
+   "\0"
+   /* _mesa_function_pool[14887]: TexParameteriv (offset 181) */
+   "iip\0"
+   "glTexParameteriv\0"
+   "\0"
+   /* _mesa_function_pool[14909]: UnlockArraysEXT (will be remapped) */
+   "\0"
+   "glUnlockArraysEXT\0"
+   "\0"
+   /* _mesa_function_pool[14929]: TexCoord2fColor3fVertex3fSUN (dynamic) */
+   "ffffffff\0"
+   "glTexCoord2fColor3fVertex3fSUN\0"
+   "\0"
+   /* _mesa_function_pool[14970]: WindowPos3fvMESA (will be remapped) */
+   "p\0"
+   "glWindowPos3fv\0"
+   "glWindowPos3fvARB\0"
+   "glWindowPos3fvMESA\0"
+   "\0"
+   /* _mesa_function_pool[15025]: RasterPos2f (offset 64) */
+   "ff\0"
+   "glRasterPos2f\0"
+   "\0"
+   /* _mesa_function_pool[15043]: VertexAttrib1svNV (will be remapped) */
+   "ip\0"
+   "glVertexAttrib1svNV\0"
+   "\0"
+   /* _mesa_function_pool[15067]: RasterPos2d (offset 62) */
+   "dd\0"
+   "glRasterPos2d\0"
+   "\0"
+   /* _mesa_function_pool[15085]: RasterPos3fv (offset 73) */
+   "p\0"
+   "glRasterPos3fv\0"
+   "\0"
+   /* _mesa_function_pool[15103]: CopyTexSubImage3D (offset 373) */
+   "iiiiiiiii\0"
+   "glCopyTexSubImage3D\0"
+   "glCopyTexSubImage3DEXT\0"
+   "\0"
+   /* _mesa_function_pool[15157]: VertexAttrib2dARB (will be remapped) */
+   "idd\0"
+   "glVertexAttrib2d\0"
+   "glVertexAttrib2dARB\0"
+   "\0"
+   /* _mesa_function_pool[15199]: Color4ub (offset 35) */
+   "iiii\0"
+   "glColor4ub\0"
+   "\0"
+   /* _mesa_function_pool[15216]: GetInteger64v (will be remapped) */
+   "ip\0"
+   "glGetInteger64v\0"
+   "\0"
+   /* _mesa_function_pool[15236]: TextureColorMaskSGIS (dynamic) */
+   "iiii\0"
+   "glTextureColorMaskSGIS\0"
+   "\0"
+   /* _mesa_function_pool[15265]: RasterPos2s (offset 68) */
+   "ii\0"
+   "glRasterPos2s\0"
+   "\0"
+   /* _mesa_function_pool[15283]: GetColorTable (offset 343) */
+   "iiip\0"
+   "glGetColorTable\0"
+   "glGetColorTableSGI\0"
+   "glGetColorTableEXT\0"
+   "\0"
+   /* _mesa_function_pool[15343]: SelectBuffer (offset 195) */
+   "ip\0"
+   "glSelectBuffer\0"
+   "\0"
+   /* _mesa_function_pool[15362]: Indexiv (offset 49) */
+   "p\0"
+   "glIndexiv\0"
+   "\0"
+   /* _mesa_function_pool[15375]: TexCoord3i (offset 114) */
+   "iii\0"
+   "glTexCoord3i\0"
+   "\0"
+   /* _mesa_function_pool[15393]: CopyColorTable (offset 342) */
+   "iiiii\0"
+   "glCopyColorTable\0"
+   "glCopyColorTableSGI\0"
+   "\0"
+   /* _mesa_function_pool[15437]: GetHistogramParameterfv (offset 362) */
+   "iip\0"
+   "glGetHistogramParameterfv\0"
+   "glGetHistogramParameterfvEXT\0"
+   "\0"
+   /* _mesa_function_pool[15497]: Frustum (offset 289) */
+   "dddddd\0"
+   "glFrustum\0"
+   "\0"
+   /* _mesa_function_pool[15515]: GetString (offset 275) */
+   "i\0"
+   "glGetString\0"
+   "\0"
+   /* _mesa_function_pool[15530]: ColorPointervINTEL (dynamic) */
+   "iip\0"
+   "glColorPointervINTEL\0"
+   "\0"
+   /* _mesa_function_pool[15556]: TexEnvf (offset 184) */
+   "iif\0"
+   "glTexEnvf\0"
+   "\0"
+   /* _mesa_function_pool[15571]: TexCoord3d (offset 110) */
+   "ddd\0"
+   "glTexCoord3d\0"
+   "\0"
+   /* _mesa_function_pool[15589]: AlphaFragmentOp1ATI (will be remapped) */
+   "iiiiii\0"
+   "glAlphaFragmentOp1ATI\0"
+   "\0"
+   /* _mesa_function_pool[15619]: TexCoord3f (offset 112) */
+   "fff\0"
+   "glTexCoord3f\0"
+   "\0"
+   /* _mesa_function_pool[15637]: MultiTexCoord3ivARB (offset 397) */
+   "ip\0"
+   "glMultiTexCoord3iv\0"
+   "glMultiTexCoord3ivARB\0"
+   "\0"
+   /* _mesa_function_pool[15682]: MultiTexCoord2sARB (offset 390) */
+   "iii\0"
+   "glMultiTexCoord2s\0"
+   "glMultiTexCoord2sARB\0"
+   "\0"
+   /* _mesa_function_pool[15726]: VertexAttrib1dvARB (will be remapped) */
+   "ip\0"
+   "glVertexAttrib1dv\0"
+   "glVertexAttrib1dvARB\0"
+   "\0"
+   /* _mesa_function_pool[15769]: DeleteTextures (offset 327) */
+   "ip\0"
+   "glDeleteTextures\0"
+   "glDeleteTexturesEXT\0"
+   "\0"
+   /* _mesa_function_pool[15810]: TexCoordPointerEXT (will be remapped) */
+   "iiiip\0"
+   "glTexCoordPointerEXT\0"
+   "\0"
+   /* _mesa_function_pool[15838]: TexSubImage4DSGIS (dynamic) */
+   "iiiiiiiiiiiip\0"
+   "glTexSubImage4DSGIS\0"
+   "\0"
+   /* _mesa_function_pool[15873]: TexCoord3s (offset 116) */
+   "iii\0"
+   "glTexCoord3s\0"
+   "\0"
+   /* _mesa_function_pool[15891]: GetTexLevelParameteriv (offset 285) */
+   "iiip\0"
+   "glGetTexLevelParameteriv\0"
+   "\0"
+   /* _mesa_function_pool[15922]: CombinerStageParameterfvNV (dynamic) */
+   "iip\0"
+   "glCombinerStageParameterfvNV\0"
+   "\0"
+   /* _mesa_function_pool[15956]: StopInstrumentsSGIX (dynamic) */
+   "i\0"
+   "glStopInstrumentsSGIX\0"
+   "\0"
+   /* _mesa_function_pool[15981]: TexCoord4fColor4fNormal3fVertex4fSUN (dynamic) */
+   "fffffffffffffff\0"
+   "glTexCoord4fColor4fNormal3fVertex4fSUN\0"
+   "\0"
+   /* _mesa_function_pool[16037]: ClearAccum (offset 204) */
+   "ffff\0"
+   "glClearAccum\0"
+   "\0"
+   /* _mesa_function_pool[16056]: DeformSGIX (dynamic) */
+   "i\0"
+   "glDeformSGIX\0"
+   "\0"
+   /* _mesa_function_pool[16072]: GetVertexAttribfvARB (will be remapped) */
+   "iip\0"
+   "glGetVertexAttribfv\0"
+   "glGetVertexAttribfvARB\0"
+   "\0"
+   /* _mesa_function_pool[16120]: SecondaryColor3ivEXT (will be remapped) */
+   "p\0"
+   "glSecondaryColor3iv\0"
+   "glSecondaryColor3ivEXT\0"
+   "\0"
+   /* _mesa_function_pool[16166]: TexCoord4iv (offset 123) */
+   "p\0"
+   "glTexCoord4iv\0"
+   "\0"
+   /* _mesa_function_pool[16183]: VertexAttribI4uiEXT (will be remapped) */
+   "iiiii\0"
+   "glVertexAttribI4uiEXT\0"
+   "glVertexAttribI4ui\0"
+   "\0"
+   /* _mesa_function_pool[16231]: GetFragmentMaterialfvSGIX (dynamic) */
+   "iip\0"
+   "glGetFragmentMaterialfvSGIX\0"
+   "\0"
+   /* _mesa_function_pool[16264]: UniformMatrix4x2fv (will be remapped) */
+   "iiip\0"
+   "glUniformMatrix4x2fv\0"
+   "\0"
+   /* _mesa_function_pool[16291]: GetDetailTexFuncSGIS (dynamic) */
+   "ip\0"
+   "glGetDetailTexFuncSGIS\0"
+   "\0"
+   /* _mesa_function_pool[16318]: GetCombinerStageParameterfvNV (dynamic) */
+   "iip\0"
+   "glGetCombinerStageParameterfvNV\0"
+   "\0"
+   /* _mesa_function_pool[16355]: PolygonOffset (offset 319) */
+   "ff\0"
+   "glPolygonOffset\0"
+   "\0"
+   /* _mesa_function_pool[16375]: BindVertexArray (will be remapped) */
+   "i\0"
+   "glBindVertexArray\0"
+   "\0"
+   /* _mesa_function_pool[16396]: Color4ubVertex2fvSUN (dynamic) */
+   "pp\0"
+   "glColor4ubVertex2fvSUN\0"
+   "\0"
+   /* _mesa_function_pool[16423]: Rectd (offset 86) */
+   "dddd\0"
+   "glRectd\0"
+   "\0"
+   /* _mesa_function_pool[16437]: TexFilterFuncSGIS (dynamic) */
+   "iiip\0"
+   "glTexFilterFuncSGIS\0"
+   "\0"
+   /* _mesa_function_pool[16463]: TextureBarrierNV (will be remapped) */
+   "\0"
+   "glTextureBarrierNV\0"
+   "\0"
+   /* _mesa_function_pool[16484]: VertexAttribI4ubvEXT (will be remapped) */
+   "ip\0"
+   "glVertexAttribI4ubvEXT\0"
+   "glVertexAttribI4ubv\0"
+   "\0"
+   /* _mesa_function_pool[16531]: GetAttribLocationARB (will be remapped) */
+   "ip\0"
+   "glGetAttribLocation\0"
+   "glGetAttribLocationARB\0"
+   "\0"
+   /* _mesa_function_pool[16578]: RasterPos3i (offset 74) */
+   "iii\0"
+   "glRasterPos3i\0"
+   "\0"
+   /* _mesa_function_pool[16597]: VertexAttrib4ubvARB (will be remapped) */
+   "ip\0"
+   "glVertexAttrib4ubv\0"
+   "glVertexAttrib4ubvARB\0"
+   "\0"
+   /* _mesa_function_pool[16642]: DetailTexFuncSGIS (dynamic) */
+   "iip\0"
+   "glDetailTexFuncSGIS\0"
+   "\0"
+   /* _mesa_function_pool[16667]: Normal3fVertex3fSUN (dynamic) */
+   "ffffff\0"
+   "glNormal3fVertex3fSUN\0"
+   "\0"
+   /* _mesa_function_pool[16697]: CopyTexImage2D (offset 324) */
+   "iiiiiiii\0"
+   "glCopyTexImage2D\0"
+   "glCopyTexImage2DEXT\0"
+   "\0"
+   /* _mesa_function_pool[16744]: GetBufferPointervARB (will be remapped) */
+   "iip\0"
+   "glGetBufferPointerv\0"
+   "glGetBufferPointervARB\0"
+   "\0"
+   /* _mesa_function_pool[16792]: ProgramEnvParameter4fARB (will be remapped) */
+   "iiffff\0"
+   "glProgramEnvParameter4fARB\0"
+   "glProgramParameter4fNV\0"
+   "\0"
+   /* _mesa_function_pool[16850]: Uniform3ivARB (will be remapped) */
+   "iip\0"
+   "glUniform3iv\0"
+   "glUniform3ivARB\0"
+   "\0"
+   /* _mesa_function_pool[16884]: Lightfv (offset 160) */
+   "iip\0"
+   "glLightfv\0"
+   "\0"
+   /* _mesa_function_pool[16899]: PrimitiveRestartIndexNV (will be remapped) */
+   "i\0"
+   "glPrimitiveRestartIndexNV\0"
+   "glPrimitiveRestartIndex\0"
+   "\0"
+   /* _mesa_function_pool[16952]: ClearDepth (offset 208) */
+   "d\0"
+   "glClearDepth\0"
+   "\0"
+   /* _mesa_function_pool[16968]: GetFenceivNV (will be remapped) */
+   "iip\0"
+   "glGetFenceivNV\0"
+   "\0"
+   /* _mesa_function_pool[16988]: WindowPos4dvMESA (will be remapped) */
+   "p\0"
+   "glWindowPos4dvMESA\0"
+   "\0"
+   /* _mesa_function_pool[17010]: ColorSubTable (offset 346) */
+   "iiiiip\0"
+   "glColorSubTable\0"
+   "glColorSubTableEXT\0"
+   "\0"
+   /* _mesa_function_pool[17053]: Color4fv (offset 30) */
+   "p\0"
+   "glColor4fv\0"
+   "\0"
+   /* _mesa_function_pool[17067]: MultiTexCoord4ivARB (offset 405) */
+   "ip\0"
+   "glMultiTexCoord4iv\0"
+   "glMultiTexCoord4ivARB\0"
+   "\0"
+   /* _mesa_function_pool[17112]: ProgramLocalParameters4fvEXT (will be remapped) */
+   "iiip\0"
+   "glProgramLocalParameters4fvEXT\0"
+   "\0"
+   /* _mesa_function_pool[17149]: ColorPointer (offset 308) */
+   "iiip\0"
+   "glColorPointer\0"
+   "\0"
+   /* _mesa_function_pool[17170]: Rects (offset 92) */
+   "iiii\0"
+   "glRects\0"
+   "\0"
+   /* _mesa_function_pool[17184]: GetMapAttribParameterfvNV (dynamic) */
+   "iiip\0"
+   "glGetMapAttribParameterfvNV\0"
+   "\0"
+   /* _mesa_function_pool[17218]: CreateShaderProgramEXT (will be remapped) */
+   "ip\0"
+   "glCreateShaderProgramEXT\0"
+   "\0"
+   /* _mesa_function_pool[17247]: ActiveProgramEXT (will be remapped) */
+   "i\0"
+   "glActiveProgramEXT\0"
+   "\0"
+   /* _mesa_function_pool[17269]: Lightiv (offset 162) */
+   "iip\0"
+   "glLightiv\0"
+   "\0"
+   /* _mesa_function_pool[17284]: VertexAttrib4sARB (will be remapped) */
+   "iiiii\0"
+   "glVertexAttrib4s\0"
+   "glVertexAttrib4sARB\0"
+   "\0"
+   /* _mesa_function_pool[17328]: GetQueryObjectuivARB (will be remapped) */
+   "iip\0"
+   "glGetQueryObjectuiv\0"
+   "glGetQueryObjectuivARB\0"
+   "\0"
+   /* _mesa_function_pool[17376]: GetTexParameteriv (offset 283) */
+   "iip\0"
+   "glGetTexParameteriv\0"
+   "\0"
+   /* _mesa_function_pool[17401]: MapParameterivNV (dynamic) */
+   "iip\0"
+   "glMapParameterivNV\0"
+   "\0"
+   /* _mesa_function_pool[17425]: GenRenderbuffersEXT (will be remapped) */
+   "ip\0"
+   "glGenRenderbuffers\0"
+   "glGenRenderbuffersEXT\0"
+   "\0"
+   /* _mesa_function_pool[17470]: ClearBufferfv (will be remapped) */
+   "iip\0"
+   "glClearBufferfv\0"
+   "\0"
+   /* _mesa_function_pool[17491]: VertexAttrib2dvARB (will be remapped) */
+   "ip\0"
+   "glVertexAttrib2dv\0"
+   "glVertexAttrib2dvARB\0"
+   "\0"
+   /* _mesa_function_pool[17534]: EdgeFlagPointerEXT (will be remapped) */
+   "iip\0"
+   "glEdgeFlagPointerEXT\0"
+   "\0"
+   /* _mesa_function_pool[17560]: VertexAttribs2svNV (will be remapped) */
+   "iip\0"
+   "glVertexAttribs2svNV\0"
+   "\0"
+   /* _mesa_function_pool[17586]: WeightbvARB (dynamic) */
+   "ip\0"
+   "glWeightbvARB\0"
+   "\0"
+   /* _mesa_function_pool[17604]: VertexAttrib2fvARB (will be remapped) */
+   "ip\0"
+   "glVertexAttrib2fv\0"
+   "glVertexAttrib2fvARB\0"
+   "\0"
+   /* _mesa_function_pool[17647]: GetBufferParameterivARB (will be remapped) */
+   "iip\0"
+   "glGetBufferParameteriv\0"
+   "glGetBufferParameterivARB\0"
+   "\0"
+   /* _mesa_function_pool[17701]: Rectdv (offset 87) */
+   "pp\0"
+   "glRectdv\0"
+   "\0"
+   /* _mesa_function_pool[17714]: ListParameteriSGIX (dynamic) */
+   "iii\0"
+   "glListParameteriSGIX\0"
+   "\0"
+   /* _mesa_function_pool[17740]: BlendEquationiARB (will be remapped) */
+   "ii\0"
+   "glBlendEquationiARB\0"
+   "\0"
+   /* _mesa_function_pool[17764]: ReplacementCodeuiColor4fNormal3fVertex3fSUN (dynamic) */
+   "iffffffffff\0"
+   "glReplacementCodeuiColor4fNormal3fVertex3fSUN\0"
+   "\0"
+   /* _mesa_function_pool[17823]: InstrumentsBufferSGIX (dynamic) */
+   "ip\0"
+   "glInstrumentsBufferSGIX\0"
+   "\0"
+   /* _mesa_function_pool[17851]: VertexAttrib4NivARB (will be remapped) */
+   "ip\0"
+   "glVertexAttrib4Niv\0"
+   "glVertexAttrib4NivARB\0"
+   "\0"
+   /* _mesa_function_pool[17896]: DrawArraysInstancedARB (will be remapped) */
+   "iiii\0"
+   "glDrawArraysInstancedARB\0"
+   "glDrawArraysInstancedEXT\0"
+   "glDrawArraysInstanced\0"
+   "\0"
+   /* _mesa_function_pool[17974]: GetAttachedShaders (will be remapped) */
+   "iipp\0"
+   "glGetAttachedShaders\0"
+   "\0"
+   /* _mesa_function_pool[18001]: GenVertexArraysAPPLE (will be remapped) */
+   "ip\0"
+   "glGenVertexArraysAPPLE\0"
+   "\0"
+   /* _mesa_function_pool[18028]: ClearBufferfi (will be remapped) */
+   "iifi\0"
+   "glClearBufferfi\0"
+   "\0"
+   /* _mesa_function_pool[18050]: Materialiv (offset 172) */
+   "iip\0"
+   "glMaterialiv\0"
+   "\0"
+   /* _mesa_function_pool[18068]: PushClientAttrib (offset 335) */
+   "i\0"
+   "glPushClientAttrib\0"
+   "\0"
+   /* _mesa_function_pool[18090]: ProgramEnvParameters4fvEXT (will be remapped) */
+   "iiip\0"
+   "glProgramEnvParameters4fvEXT\0"
+   "\0"
+   /* _mesa_function_pool[18125]: TexCoord2fColor4fNormal3fVertex3fvSUN (dynamic) */
+   "pppp\0"
+   "glTexCoord2fColor4fNormal3fVertex3fvSUN\0"
+   "\0"
+   /* _mesa_function_pool[18171]: WindowPos2iMESA (will be remapped) */
+   "ii\0"
+   "glWindowPos2i\0"
+   "glWindowPos2iARB\0"
+   "glWindowPos2iMESA\0"
+   "\0"
+   /* _mesa_function_pool[18224]: SampleMaskSGIS (will be remapped) */
+   "fi\0"
+   "glSampleMaskSGIS\0"
+   "glSampleMaskEXT\0"
+   "\0"
+   /* _mesa_function_pool[18261]: SecondaryColor3fvEXT (will be remapped) */
+   "p\0"
+   "glSecondaryColor3fv\0"
+   "glSecondaryColor3fvEXT\0"
+   "\0"
+   /* _mesa_function_pool[18307]: PolygonMode (offset 174) */
+   "ii\0"
+   "glPolygonMode\0"
+   "\0"
+   /* _mesa_function_pool[18325]: CompressedTexSubImage1DARB (will be remapped) */
+   "iiiiiip\0"
+   "glCompressedTexSubImage1D\0"
+   "glCompressedTexSubImage1DARB\0"
+   "\0"
+   /* _mesa_function_pool[18389]: VertexAttribI1iEXT (will be remapped) */
+   "ii\0"
+   "glVertexAttribI1iEXT\0"
+   "glVertexAttribI1i\0"
+   "\0"
+   /* _mesa_function_pool[18432]: GetVertexAttribivNV (will be remapped) */
+   "iip\0"
+   "glGetVertexAttribivNV\0"
+   "\0"
+   /* _mesa_function_pool[18459]: GetProgramStringARB (will be remapped) */
+   "iip\0"
+   "glGetProgramStringARB\0"
+   "\0"
+   /* _mesa_function_pool[18486]: VertexAttribIPointerEXT (will be remapped) */
+   "iiiip\0"
+   "glVertexAttribIPointerEXT\0"
+   "glVertexAttribIPointer\0"
+   "\0"
+   /* _mesa_function_pool[18542]: TexBumpParameterfvATI (will be remapped) */
+   "ip\0"
+   "glTexBumpParameterfvATI\0"
+   "\0"
+   /* _mesa_function_pool[18570]: CompileShaderARB (will be remapped) */
+   "i\0"
+   "glCompileShader\0"
+   "glCompileShaderARB\0"
+   "\0"
+   /* _mesa_function_pool[18608]: DeleteShader (will be remapped) */
+   "i\0"
+   "glDeleteShader\0"
+   "\0"
+   /* _mesa_function_pool[18626]: DisableClientState (offset 309) */
+   "i\0"
+   "glDisableClientState\0"
+   "\0"
+   /* _mesa_function_pool[18650]: TexGeni (offset 192) */
+   "iii\0"
+   "glTexGeni\0"
+   "\0"
+   /* _mesa_function_pool[18665]: TexGenf (offset 190) */
+   "iif\0"
+   "glTexGenf\0"
+   "\0"
+   /* _mesa_function_pool[18680]: Uniform3fARB (will be remapped) */
+   "ifff\0"
+   "glUniform3f\0"
+   "glUniform3fARB\0"
+   "\0"
+   /* _mesa_function_pool[18713]: TexGend (offset 188) */
+   "iid\0"
+   "glTexGend\0"
+   "\0"
+   /* _mesa_function_pool[18728]: ListParameterfvSGIX (dynamic) */
+   "iip\0"
+   "glListParameterfvSGIX\0"
+   "\0"
+   /* _mesa_function_pool[18755]: GetPolygonStipple (offset 274) */
+   "p\0"
+   "glGetPolygonStipple\0"
+   "\0"
+   /* _mesa_function_pool[18778]: Tangent3dvEXT (dynamic) */
+   "p\0"
+   "glTangent3dvEXT\0"
+   "\0"
+   /* _mesa_function_pool[18797]: BindBufferOffsetEXT (will be remapped) */
+   "iiii\0"
+   "glBindBufferOffsetEXT\0"
+   "\0"
+   /* _mesa_function_pool[18825]: WindowPos3sMESA (will be remapped) */
+   "iii\0"
+   "glWindowPos3s\0"
+   "glWindowPos3sARB\0"
+   "glWindowPos3sMESA\0"
+   "\0"
+   /* _mesa_function_pool[18879]: VertexAttrib2svNV (will be remapped) */
+   "ip\0"
+   "glVertexAttrib2svNV\0"
+   "\0"
+   /* _mesa_function_pool[18903]: DisableIndexedEXT (will be remapped) */
+   "ii\0"
+   "glDisableIndexedEXT\0"
+   "glDisablei\0"
+   "\0"
+   /* _mesa_function_pool[18938]: BindBufferBaseEXT (will be remapped) */
+   "iii\0"
+   "glBindBufferBaseEXT\0"
+   "glBindBufferBase\0"
+   "\0"
+   /* _mesa_function_pool[18980]: TexCoord2fVertex3fvSUN (dynamic) */
+   "pp\0"
+   "glTexCoord2fVertex3fvSUN\0"
+   "\0"
+   /* _mesa_function_pool[19009]: WindowPos4sMESA (will be remapped) */
+   "iiii\0"
+   "glWindowPos4sMESA\0"
+   "\0"
+   /* _mesa_function_pool[19033]: VertexAttrib4NuivARB (will be remapped) */
+   "ip\0"
+   "glVertexAttrib4Nuiv\0"
+   "glVertexAttrib4NuivARB\0"
+   "\0"
+   /* _mesa_function_pool[19080]: ClientActiveTextureARB (offset 375) */
+   "i\0"
+   "glClientActiveTexture\0"
+   "glClientActiveTextureARB\0"
+   "\0"
+   /* _mesa_function_pool[19130]: PixelTexGenSGIX (will be remapped) */
+   "i\0"
+   "glPixelTexGenSGIX\0"
+   "\0"
+   /* _mesa_function_pool[19151]: ReplacementCodeusvSUN (dynamic) */
+   "p\0"
+   "glReplacementCodeusvSUN\0"
+   "\0"
+   /* _mesa_function_pool[19178]: Uniform4fARB (will be remapped) */
+   "iffff\0"
+   "glUniform4f\0"
+   "glUniform4fARB\0"
+   "\0"
+   /* _mesa_function_pool[19212]: Color4sv (offset 34) */
+   "p\0"
+   "glColor4sv\0"
+   "\0"
+   /* _mesa_function_pool[19226]: FlushMappedBufferRange (will be remapped) */
+   "iii\0"
+   "glFlushMappedBufferRange\0"
+   "\0"
+   /* _mesa_function_pool[19256]: IsProgramNV (will be remapped) */
+   "i\0"
+   "glIsProgramARB\0"
+   "glIsProgramNV\0"
+   "\0"
+   /* _mesa_function_pool[19288]: FlushMappedBufferRangeAPPLE (will be remapped) */
+   "iii\0"
+   "glFlushMappedBufferRangeAPPLE\0"
+   "\0"
+   /* _mesa_function_pool[19323]: PixelZoom (offset 246) */
+   "ff\0"
+   "glPixelZoom\0"
+   "\0"
+   /* _mesa_function_pool[19339]: ReplacementCodePointerSUN (dynamic) */
+   "iip\0"
+   "glReplacementCodePointerSUN\0"
+   "\0"
+   /* _mesa_function_pool[19372]: ProgramEnvParameter4dARB (will be remapped) */
+   "iidddd\0"
+   "glProgramEnvParameter4dARB\0"
+   "glProgramParameter4dNV\0"
+   "\0"
+   /* _mesa_function_pool[19430]: ColorTableParameterfv (offset 340) */
+   "iip\0"
+   "glColorTableParameterfv\0"
+   "glColorTableParameterfvSGI\0"
+   "\0"
+   /* _mesa_function_pool[19486]: FragmentLightModelfSGIX (dynamic) */
+   "if\0"
+   "glFragmentLightModelfSGIX\0"
+   "\0"
+   /* _mesa_function_pool[19516]: Binormal3bvEXT (dynamic) */
+   "p\0"
+   "glBinormal3bvEXT\0"
+   "\0"
+   /* _mesa_function_pool[19536]: PixelMapuiv (offset 252) */
+   "iip\0"
+   "glPixelMapuiv\0"
+   "\0"
+   /* _mesa_function_pool[19555]: Color3dv (offset 12) */
+   "p\0"
+   "glColor3dv\0"
+   "\0"
+   /* _mesa_function_pool[19569]: IsTexture (offset 330) */
+   "i\0"
+   "glIsTexture\0"
+   "glIsTextureEXT\0"
+   "\0"
+   /* _mesa_function_pool[19599]: VertexWeightfvEXT (dynamic) */
+   "p\0"
+   "glVertexWeightfvEXT\0"
+   "\0"
+   /* _mesa_function_pool[19622]: VertexAttrib1dARB (will be remapped) */
+   "id\0"
+   "glVertexAttrib1d\0"
+   "glVertexAttrib1dARB\0"
+   "\0"
+   /* _mesa_function_pool[19663]: ImageTransformParameterivHP (dynamic) */
+   "iip\0"
+   "glImageTransformParameterivHP\0"
+   "\0"
+   /* _mesa_function_pool[19698]: TexCoord4i (offset 122) */
+   "iiii\0"
+   "glTexCoord4i\0"
+   "\0"
+   /* _mesa_function_pool[19717]: DeleteQueriesARB (will be remapped) */
+   "ip\0"
+   "glDeleteQueries\0"
+   "glDeleteQueriesARB\0"
+   "\0"
+   /* _mesa_function_pool[19756]: Color4ubVertex2fSUN (dynamic) */
+   "iiiiff\0"
+   "glColor4ubVertex2fSUN\0"
+   "\0"
+   /* _mesa_function_pool[19786]: FragmentColorMaterialSGIX (dynamic) */
+   "ii\0"
+   "glFragmentColorMaterialSGIX\0"
+   "\0"
+   /* _mesa_function_pool[19818]: CurrentPaletteMatrixARB (dynamic) */
+   "i\0"
+   "glCurrentPaletteMatrixARB\0"
+   "\0"
+   /* _mesa_function_pool[19847]: GetMapdv (offset 266) */
+   "iip\0"
+   "glGetMapdv\0"
+   "\0"
+   /* _mesa_function_pool[19863]: ObjectPurgeableAPPLE (will be remapped) */
+   "iii\0"
+   "glObjectPurgeableAPPLE\0"
+   "\0"
+   /* _mesa_function_pool[19891]: GetStringi (will be remapped) */
+   "ii\0"
+   "glGetStringi\0"
+   "\0"
+   /* _mesa_function_pool[19908]: SamplePatternSGIS (will be remapped) */
+   "i\0"
+   "glSamplePatternSGIS\0"
+   "glSamplePatternEXT\0"
+   "\0"
+   /* _mesa_function_pool[19950]: PixelStoref (offset 249) */
+   "if\0"
+   "glPixelStoref\0"
+   "\0"
+   /* _mesa_function_pool[19968]: IsQueryARB (will be remapped) */
+   "i\0"
+   "glIsQuery\0"
+   "glIsQueryARB\0"
+   "\0"
+   /* _mesa_function_pool[19994]: ReplacementCodeuiColor4ubVertex3fSUN (dynamic) */
+   "iiiiifff\0"
+   "glReplacementCodeuiColor4ubVertex3fSUN\0"
+   "\0"
+   /* _mesa_function_pool[20043]: PixelStorei (offset 250) */
+   "ii\0"
+   "glPixelStorei\0"
+   "\0"
+   /* _mesa_function_pool[20061]: VertexAttrib4usvARB (will be remapped) */
+   "ip\0"
+   "glVertexAttrib4usv\0"
+   "glVertexAttrib4usvARB\0"
+   "\0"
+   /* _mesa_function_pool[20106]: LinkProgramARB (will be remapped) */
+   "i\0"
+   "glLinkProgram\0"
+   "glLinkProgramARB\0"
+   "\0"
+   /* _mesa_function_pool[20140]: VertexAttrib2fNV (will be remapped) */
+   "iff\0"
+   "glVertexAttrib2fNV\0"
+   "\0"
+   /* _mesa_function_pool[20164]: ShaderSourceARB (will be remapped) */
+   "iipp\0"
+   "glShaderSource\0"
+   "glShaderSourceARB\0"
+   "\0"
+   /* _mesa_function_pool[20203]: FragmentMaterialiSGIX (dynamic) */
+   "iii\0"
+   "glFragmentMaterialiSGIX\0"
+   "\0"
+   /* _mesa_function_pool[20232]: EvalCoord2dv (offset 233) */
+   "p\0"
+   "glEvalCoord2dv\0"
+   "\0"
+   /* _mesa_function_pool[20250]: VertexAttrib3svARB (will be remapped) */
+   "ip\0"
+   "glVertexAttrib3sv\0"
+   "glVertexAttrib3svARB\0"
+   "\0"
+   /* _mesa_function_pool[20293]: ColorMaterial (offset 151) */
+   "ii\0"
+   "glColorMaterial\0"
+   "\0"
+   /* _mesa_function_pool[20313]: CompressedTexSubImage3DARB (will be remapped) */
+   "iiiiiiiiiip\0"
+   "glCompressedTexSubImage3D\0"
+   "glCompressedTexSubImage3DARB\0"
+   "\0"
+   /* _mesa_function_pool[20381]: WindowPos2ivMESA (will be remapped) */
+   "p\0"
+   "glWindowPos2iv\0"
+   "glWindowPos2ivARB\0"
+   "glWindowPos2ivMESA\0"
+   "\0"
+   /* _mesa_function_pool[20436]: IsFramebufferEXT (will be remapped) */
+   "i\0"
+   "glIsFramebuffer\0"
+   "glIsFramebufferEXT\0"
+   "\0"
+   /* _mesa_function_pool[20474]: Uniform4ivARB (will be remapped) */
+   "iip\0"
+   "glUniform4iv\0"
+   "glUniform4ivARB\0"
+   "\0"
+   /* _mesa_function_pool[20508]: GetVertexAttribdvARB (will be remapped) */
+   "iip\0"
+   "glGetVertexAttribdv\0"
+   "glGetVertexAttribdvARB\0"
+   "\0"
+   /* _mesa_function_pool[20556]: TexBumpParameterivATI (will be remapped) */
+   "ip\0"
+   "glTexBumpParameterivATI\0"
+   "\0"
+   /* _mesa_function_pool[20584]: GetSeparableFilter (offset 359) */
+   "iiippp\0"
+   "glGetSeparableFilter\0"
+   "glGetSeparableFilterEXT\0"
+   "\0"
+   /* _mesa_function_pool[20637]: Binormal3dEXT (dynamic) */
+   "ddd\0"
+   "glBinormal3dEXT\0"
+   "\0"
+   /* _mesa_function_pool[20658]: SpriteParameteriSGIX (dynamic) */
+   "ii\0"
+   "glSpriteParameteriSGIX\0"
+   "\0"
+   /* _mesa_function_pool[20685]: RequestResidentProgramsNV (will be remapped) */
+   "ip\0"
+   "glRequestResidentProgramsNV\0"
+   "\0"
+   /* _mesa_function_pool[20717]: TagSampleBufferSGIX (dynamic) */
+   "\0"
+   "glTagSampleBufferSGIX\0"
+   "\0"
+   /* _mesa_function_pool[20741]: TransformFeedbackVaryingsEXT (will be remapped) */
+   "iipi\0"
+   "glTransformFeedbackVaryingsEXT\0"
+   "glTransformFeedbackVaryings\0"
+   "\0"
+   /* _mesa_function_pool[20806]: FeedbackBuffer (offset 194) */
+   "iip\0"
+   "glFeedbackBuffer\0"
+   "\0"
+   /* _mesa_function_pool[20828]: RasterPos2iv (offset 67) */
+   "p\0"
+   "glRasterPos2iv\0"
+   "\0"
+   /* _mesa_function_pool[20846]: TexImage1D (offset 182) */
+   "iiiiiiip\0"
+   "glTexImage1D\0"
+   "\0"
+   /* _mesa_function_pool[20869]: ListParameterivSGIX (dynamic) */
+   "iip\0"
+   "glListParameterivSGIX\0"
+   "\0"
+   /* _mesa_function_pool[20896]: MultiDrawElementsEXT (will be remapped) */
+   "ipipi\0"
+   "glMultiDrawElements\0"
+   "glMultiDrawElementsEXT\0"
+   "\0"
+   /* _mesa_function_pool[20946]: Color3s (offset 17) */
+   "iii\0"
+   "glColor3s\0"
+   "\0"
+   /* _mesa_function_pool[20961]: Uniform1ivARB (will be remapped) */
+   "iip\0"
+   "glUniform1iv\0"
+   "glUniform1ivARB\0"
+   "\0"
+   /* _mesa_function_pool[20995]: WindowPos2sMESA (will be remapped) */
+   "ii\0"
+   "glWindowPos2s\0"
+   "glWindowPos2sARB\0"
+   "glWindowPos2sMESA\0"
+   "\0"
+   /* _mesa_function_pool[21048]: WeightusvARB (dynamic) */
+   "ip\0"
+   "glWeightusvARB\0"
+   "\0"
+   /* _mesa_function_pool[21067]: TexCoordPointer (offset 320) */
+   "iiip\0"
+   "glTexCoordPointer\0"
+   "\0"
+   /* _mesa_function_pool[21091]: FogCoordPointerEXT (will be remapped) */
+   "iip\0"
+   "glFogCoordPointer\0"
+   "glFogCoordPointerEXT\0"
+   "\0"
+   /* _mesa_function_pool[21135]: IndexMaterialEXT (dynamic) */
+   "ii\0"
+   "glIndexMaterialEXT\0"
+   "\0"
+   /* _mesa_function_pool[21158]: Color3i (offset 15) */
+   "iii\0"
+   "glColor3i\0"
+   "\0"
+   /* _mesa_function_pool[21173]: FrontFace (offset 157) */
+   "i\0"
+   "glFrontFace\0"
+   "\0"
+   /* _mesa_function_pool[21188]: EvalCoord2d (offset 232) */
+   "dd\0"
+   "glEvalCoord2d\0"
+   "\0"
+   /* _mesa_function_pool[21206]: SecondaryColor3ubvEXT (will be remapped) */
+   "p\0"
+   "glSecondaryColor3ubv\0"
+   "glSecondaryColor3ubvEXT\0"
+   "\0"
+   /* _mesa_function_pool[21254]: EvalCoord2f (offset 234) */
+   "ff\0"
+   "glEvalCoord2f\0"
+   "\0"
+   /* _mesa_function_pool[21272]: VertexAttrib4dvARB (will be remapped) */
+   "ip\0"
+   "glVertexAttrib4dv\0"
+   "glVertexAttrib4dvARB\0"
+   "\0"
+   /* _mesa_function_pool[21315]: BindAttribLocationARB (will be remapped) */
+   "iip\0"
+   "glBindAttribLocation\0"
+   "glBindAttribLocationARB\0"
+   "\0"
+   /* _mesa_function_pool[21365]: Color3b (offset 9) */
+   "iii\0"
+   "glColor3b\0"
+   "\0"
+   /* _mesa_function_pool[21380]: MultiTexCoord2dARB (offset 384) */
+   "idd\0"
+   "glMultiTexCoord2d\0"
+   "glMultiTexCoord2dARB\0"
+   "\0"
+   /* _mesa_function_pool[21424]: ExecuteProgramNV (will be remapped) */
+   "iip\0"
+   "glExecuteProgramNV\0"
+   "\0"
+   /* _mesa_function_pool[21448]: Color3f (offset 13) */
+   "fff\0"
+   "glColor3f\0"
+   "\0"
+   /* _mesa_function_pool[21463]: LightEnviSGIX (dynamic) */
+   "ii\0"
+   "glLightEnviSGIX\0"
+   "\0"
+   /* _mesa_function_pool[21483]: Color3d (offset 11) */
+   "ddd\0"
+   "glColor3d\0"
+   "\0"
+   /* _mesa_function_pool[21498]: Normal3dv (offset 55) */
+   "p\0"
+   "glNormal3dv\0"
+   "\0"
+   /* _mesa_function_pool[21513]: Lightf (offset 159) */
+   "iif\0"
+   "glLightf\0"
+   "\0"
+   /* _mesa_function_pool[21527]: ReplacementCodeuiSUN (dynamic) */
+   "i\0"
+   "glReplacementCodeuiSUN\0"
+   "\0"
+   /* _mesa_function_pool[21553]: MatrixMode (offset 293) */
+   "i\0"
+   "glMatrixMode\0"
+   "\0"
+   /* _mesa_function_pool[21569]: GetPixelMapusv (offset 273) */
+   "ip\0"
+   "glGetPixelMapusv\0"
+   "\0"
+   /* _mesa_function_pool[21590]: Lighti (offset 161) */
+   "iii\0"
+   "glLighti\0"
+   "\0"
+   /* _mesa_function_pool[21604]: VertexAttribPointerNV (will be remapped) */
+   "iiiip\0"
+   "glVertexAttribPointerNV\0"
+   "\0"
+   /* _mesa_function_pool[21635]: ClearDepthf (will be remapped) */
+   "f\0"
+   "glClearDepthf\0"
+   "\0"
+   /* _mesa_function_pool[21652]: GetBooleanIndexedvEXT (will be remapped) */
+   "iip\0"
+   "glGetBooleanIndexedvEXT\0"
+   "glGetBooleani_v\0"
+   "\0"
+   /* _mesa_function_pool[21697]: GetFramebufferAttachmentParameterivEXT (will be remapped) */
+   "iiip\0"
+   "glGetFramebufferAttachmentParameteriv\0"
+   "glGetFramebufferAttachmentParameterivEXT\0"
+   "\0"
+   /* _mesa_function_pool[21782]: PixelTransformParameterfEXT (dynamic) */
+   "iif\0"
+   "glPixelTransformParameterfEXT\0"
+   "\0"
+   /* _mesa_function_pool[21817]: MultiTexCoord4dvARB (offset 401) */
+   "ip\0"
+   "glMultiTexCoord4dv\0"
+   "glMultiTexCoord4dvARB\0"
+   "\0"
+   /* _mesa_function_pool[21862]: PixelTransformParameteriEXT (dynamic) */
+   "iii\0"
+   "glPixelTransformParameteriEXT\0"
+   "\0"
+   /* _mesa_function_pool[21897]: GetDoublev (offset 260) */
+   "ip\0"
+   "glGetDoublev\0"
+   "\0"
+   /* _mesa_function_pool[21914]: MultMatrixd (offset 295) */
+   "p\0"
+   "glMultMatrixd\0"
+   "\0"
+   /* _mesa_function_pool[21931]: MultMatrixf (offset 294) */
+   "p\0"
+   "glMultMatrixf\0"
+   "\0"
+   /* _mesa_function_pool[21948]: VertexAttribI4bvEXT (will be remapped) */
+   "ip\0"
+   "glVertexAttribI4bvEXT\0"
+   "glVertexAttribI4bv\0"
+   "\0"
+   /* _mesa_function_pool[21993]: TexCoord2fColor4ubVertex3fSUN (dynamic) */
+   "ffiiiifff\0"
+   "glTexCoord2fColor4ubVertex3fSUN\0"
+   "\0"
+   /* _mesa_function_pool[22036]: Uniform1iARB (will be remapped) */
+   "ii\0"
+   "glUniform1i\0"
+   "glUniform1iARB\0"
+   "\0"
+   /* _mesa_function_pool[22067]: VertexAttribPointerARB (will be remapped) */
+   "iiiiip\0"
+   "glVertexAttribPointer\0"
+   "glVertexAttribPointerARB\0"
+   "\0"
+   /* _mesa_function_pool[22122]: VertexAttrib3sNV (will be remapped) */
+   "iiii\0"
+   "glVertexAttrib3sNV\0"
+   "\0"
+   /* _mesa_function_pool[22147]: SharpenTexFuncSGIS (dynamic) */
+   "iip\0"
+   "glSharpenTexFuncSGIS\0"
+   "\0"
+   /* _mesa_function_pool[22173]: MultiTexCoord4fvARB (offset 403) */
+   "ip\0"
+   "glMultiTexCoord4fv\0"
+   "glMultiTexCoord4fvARB\0"
+   "\0"
+   /* _mesa_function_pool[22218]: Uniform2uiEXT (will be remapped) */
+   "iii\0"
+   "glUniform2uiEXT\0"
+   "glUniform2ui\0"
+   "\0"
+   /* _mesa_function_pool[22252]: UniformMatrix2x3fv (will be remapped) */
+   "iiip\0"
+   "glUniformMatrix2x3fv\0"
+   "\0"
+   /* _mesa_function_pool[22279]: TrackMatrixNV (will be remapped) */
+   "iiii\0"
+   "glTrackMatrixNV\0"
+   "\0"
+   /* _mesa_function_pool[22301]: CombinerParameteriNV (will be remapped) */
+   "ii\0"
+   "glCombinerParameteriNV\0"
+   "\0"
+   /* _mesa_function_pool[22328]: DeleteAsyncMarkersSGIX (dynamic) */
+   "ii\0"
+   "glDeleteAsyncMarkersSGIX\0"
+   "\0"
+   /* _mesa_function_pool[22357]: ReplacementCodeusSUN (dynamic) */
+   "i\0"
+   "glReplacementCodeusSUN\0"
+   "\0"
+   /* _mesa_function_pool[22383]: IsAsyncMarkerSGIX (dynamic) */
+   "i\0"
+   "glIsAsyncMarkerSGIX\0"
+   "\0"
+   /* _mesa_function_pool[22406]: FrameZoomSGIX (dynamic) */
+   "i\0"
+   "glFrameZoomSGIX\0"
+   "\0"
+   /* _mesa_function_pool[22425]: Normal3fVertex3fvSUN (dynamic) */
+   "pp\0"
+   "glNormal3fVertex3fvSUN\0"
+   "\0"
+   /* _mesa_function_pool[22452]: RasterPos4sv (offset 85) */
+   "p\0"
+   "glRasterPos4sv\0"
+   "\0"
+   /* _mesa_function_pool[22470]: VertexAttrib4NsvARB (will be remapped) */
+   "ip\0"
+   "glVertexAttrib4Nsv\0"
+   "glVertexAttrib4NsvARB\0"
+   "\0"
+   /* _mesa_function_pool[22515]: VertexAttrib3fvARB (will be remapped) */
+   "ip\0"
+   "glVertexAttrib3fv\0"
+   "glVertexAttrib3fvARB\0"
+   "\0"
+   /* _mesa_function_pool[22558]: ClearColor (offset 206) */
+   "ffff\0"
+   "glClearColor\0"
+   "\0"
+   /* _mesa_function_pool[22577]: GetSynciv (will be remapped) */
+   "iiipp\0"
+   "glGetSynciv\0"
+   "\0"
+   /* _mesa_function_pool[22596]: ClearColorIiEXT (will be remapped) */
+   "iiii\0"
+   "glClearColorIiEXT\0"
+   "\0"
+   /* _mesa_function_pool[22620]: DeleteFramebuffersEXT (will be remapped) */
+   "ip\0"
+   "glDeleteFramebuffers\0"
+   "glDeleteFramebuffersEXT\0"
+   "\0"
+   /* _mesa_function_pool[22669]: GlobalAlphaFactorsSUN (dynamic) */
+   "i\0"
+   "glGlobalAlphaFactorsSUN\0"
+   "\0"
+   /* _mesa_function_pool[22696]: IsEnabledIndexedEXT (will be remapped) */
+   "ii\0"
+   "glIsEnabledIndexedEXT\0"
+   "glIsEnabledi\0"
+   "\0"
+   /* _mesa_function_pool[22735]: TexEnviv (offset 187) */
+   "iip\0"
+   "glTexEnviv\0"
+   "\0"
+   /* _mesa_function_pool[22751]: TexSubImage3D (offset 372) */
+   "iiiiiiiiiip\0"
+   "glTexSubImage3D\0"
+   "glTexSubImage3DEXT\0"
+   "\0"
+   /* _mesa_function_pool[22799]: Tangent3fEXT (dynamic) */
+   "fff\0"
+   "glTangent3fEXT\0"
+   "\0"
+   /* _mesa_function_pool[22819]: SecondaryColor3uivEXT (will be remapped) */
+   "p\0"
+   "glSecondaryColor3uiv\0"
+   "glSecondaryColor3uivEXT\0"
+   "\0"
+   /* _mesa_function_pool[22867]: MatrixIndexubvARB (dynamic) */
+   "ip\0"
+   "glMatrixIndexubvARB\0"
+   "\0"
+   /* _mesa_function_pool[22891]: Color4fNormal3fVertex3fSUN (dynamic) */
+   "ffffffffff\0"
+   "glColor4fNormal3fVertex3fSUN\0"
+   "\0"
+   /* _mesa_function_pool[22932]: PixelTexGenParameterfSGIS (will be remapped) */
+   "if\0"
+   "glPixelTexGenParameterfSGIS\0"
+   "\0"
+   /* _mesa_function_pool[22964]: CreateShader (will be remapped) */
+   "i\0"
+   "glCreateShader\0"
+   "\0"
+   /* _mesa_function_pool[22982]: GetColorTableParameterfv (offset 344) */
+   "iip\0"
+   "glGetColorTableParameterfv\0"
+   "glGetColorTableParameterfvSGI\0"
+   "glGetColorTableParameterfvEXT\0"
+   "\0"
+   /* _mesa_function_pool[23074]: FragmentLightModelfvSGIX (dynamic) */
+   "ip\0"
+   "glFragmentLightModelfvSGIX\0"
+   "\0"
+   /* _mesa_function_pool[23105]: Bitmap (offset 8) */
+   "iiffffp\0"
+   "glBitmap\0"
+   "\0"
+   /* _mesa_function_pool[23123]: MultiTexCoord3fARB (offset 394) */
+   "ifff\0"
+   "glMultiTexCoord3f\0"
+   "glMultiTexCoord3fARB\0"
+   "\0"
+   /* _mesa_function_pool[23168]: GetTexLevelParameterfv (offset 284) */
+   "iiip\0"
+   "glGetTexLevelParameterfv\0"
+   "\0"
+   /* _mesa_function_pool[23199]: GetPixelTexGenParameterfvSGIS (will be remapped) */
+   "ip\0"
+   "glGetPixelTexGenParameterfvSGIS\0"
+   "\0"
+   /* _mesa_function_pool[23235]: GenFramebuffersEXT (will be remapped) */
+   "ip\0"
+   "glGenFramebuffers\0"
+   "glGenFramebuffersEXT\0"
+   "\0"
+   /* _mesa_function_pool[23278]: VertexAttribDivisor (will be remapped) */
+   "ii\0"
+   "glVertexAttribDivisor\0"
+   "\0"
+   /* _mesa_function_pool[23304]: GetProgramParameterdvNV (will be remapped) */
+   "iiip\0"
+   "glGetProgramParameterdvNV\0"
+   "\0"
+   /* _mesa_function_pool[23336]: Vertex2sv (offset 133) */
+   "p\0"
+   "glVertex2sv\0"
+   "\0"
+   /* _mesa_function_pool[23351]: GetIntegerv (offset 263) */
+   "ip\0"
+   "glGetIntegerv\0"
+   "\0"
+   /* _mesa_function_pool[23369]: IsVertexArrayAPPLE (will be remapped) */
+   "i\0"
+   "glIsVertexArray\0"
+   "glIsVertexArrayAPPLE\0"
+   "\0"
+   /* _mesa_function_pool[23409]: FragmentLightfvSGIX (dynamic) */
+   "iip\0"
+   "glFragmentLightfvSGIX\0"
+   "\0"
+   /* _mesa_function_pool[23436]: VertexAttribDivisorARB (will be remapped) */
+   "ii\0"
+   "glVertexAttribDivisorARB\0"
+   "\0"
+   /* _mesa_function_pool[23465]: DetachShader (will be remapped) */
+   "ii\0"
+   "glDetachShader\0"
+   "\0"
+   /* _mesa_function_pool[23484]: VertexAttrib4NubARB (will be remapped) */
+   "iiiii\0"
+   "glVertexAttrib4Nub\0"
+   "glVertexAttrib4NubARB\0"
+   "\0"
+   /* _mesa_function_pool[23532]: GetProgramEnvParameterfvARB (will be remapped) */
+   "iip\0"
+   "glGetProgramEnvParameterfvARB\0"
+   "\0"
+   /* _mesa_function_pool[23567]: GetTrackMatrixivNV (will be remapped) */
+   "iiip\0"
+   "glGetTrackMatrixivNV\0"
+   "\0"
+   /* _mesa_function_pool[23594]: VertexAttrib3svNV (will be remapped) */
+   "ip\0"
+   "glVertexAttrib3svNV\0"
+   "\0"
+   /* _mesa_function_pool[23618]: Uniform4fvARB (will be remapped) */
+   "iip\0"
+   "glUniform4fv\0"
+   "glUniform4fvARB\0"
+   "\0"
+   /* _mesa_function_pool[23652]: MultTransposeMatrixfARB (will be remapped) */
+   "p\0"
+   "glMultTransposeMatrixf\0"
+   "glMultTransposeMatrixfARB\0"
+   "\0"
+   /* _mesa_function_pool[23704]: GetTexEnviv (offset 277) */
+   "iip\0"
+   "glGetTexEnviv\0"
+   "\0"
+   /* _mesa_function_pool[23723]: ColorFragmentOp1ATI (will be remapped) */
+   "iiiiiii\0"
+   "glColorFragmentOp1ATI\0"
+   "\0"
+   /* _mesa_function_pool[23754]: GetUniformfvARB (will be remapped) */
+   "iip\0"
+   "glGetUniformfv\0"
+   "glGetUniformfvARB\0"
+   "\0"
+   /* _mesa_function_pool[23792]: EGLImageTargetRenderbufferStorageOES (will be remapped) */
+   "ip\0"
+   "glEGLImageTargetRenderbufferStorageOES\0"
+   "\0"
+   /* _mesa_function_pool[23835]: VertexAttribI2ivEXT (will be remapped) */
+   "ip\0"
+   "glVertexAttribI2ivEXT\0"
+   "glVertexAttribI2iv\0"
+   "\0"
+   /* _mesa_function_pool[23880]: PopClientAttrib (offset 334) */
+   "\0"
+   "glPopClientAttrib\0"
+   "\0"
+   /* _mesa_function_pool[23900]: ReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN (dynamic) */
+   "iffffffffffff\0"
+   "glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN\0"
+   "\0"
+   /* _mesa_function_pool[23971]: DetachObjectARB (will be remapped) */
+   "ii\0"
+   "glDetachObjectARB\0"
+   "\0"
+   /* _mesa_function_pool[23993]: VertexBlendARB (dynamic) */
+   "i\0"
+   "glVertexBlendARB\0"
+   "\0"
+   /* _mesa_function_pool[24013]: WindowPos3iMESA (will be remapped) */
+   "iii\0"
+   "glWindowPos3i\0"
+   "glWindowPos3iARB\0"
+   "glWindowPos3iMESA\0"
+   "\0"
+   /* _mesa_function_pool[24067]: SeparableFilter2D (offset 360) */
+   "iiiiiipp\0"
+   "glSeparableFilter2D\0"
+   "glSeparableFilter2DEXT\0"
+   "\0"
+   /* _mesa_function_pool[24120]: ProgramParameteriARB (will be remapped) */
+   "iii\0"
+   "glProgramParameteriARB\0"
+   "\0"
+   /* _mesa_function_pool[24148]: Map1d (offset 220) */
+   "iddiip\0"
+   "glMap1d\0"
+   "\0"
+   /* _mesa_function_pool[24164]: Map1f (offset 221) */
+   "iffiip\0"
+   "glMap1f\0"
+   "\0"
+   /* _mesa_function_pool[24180]: CompressedTexImage2DARB (will be remapped) */
+   "iiiiiiip\0"
+   "glCompressedTexImage2D\0"
+   "glCompressedTexImage2DARB\0"
+   "\0"
+   /* _mesa_function_pool[24239]: ArrayElement (offset 306) */
+   "i\0"
+   "glArrayElement\0"
+   "glArrayElementEXT\0"
+   "\0"
+   /* _mesa_function_pool[24275]: TexImage2D (offset 183) */
+   "iiiiiiiip\0"
+   "glTexImage2D\0"
+   "\0"
+   /* _mesa_function_pool[24299]: DepthBoundsEXT (will be remapped) */
+   "dd\0"
+   "glDepthBoundsEXT\0"
+   "\0"
+   /* _mesa_function_pool[24320]: ProgramParameters4fvNV (will be remapped) */
+   "iiip\0"
+   "glProgramParameters4fvNV\0"
+   "\0"
+   /* _mesa_function_pool[24351]: DeformationMap3fSGIX (dynamic) */
+   "iffiiffiiffiip\0"
+   "glDeformationMap3fSGIX\0"
+   "\0"
+   /* _mesa_function_pool[24390]: GetProgramivNV (will be remapped) */
+   "iip\0"
+   "glGetProgramivNV\0"
+   "\0"
+   /* _mesa_function_pool[24412]: GetFragDataLocationEXT (will be remapped) */
+   "ip\0"
+   "glGetFragDataLocationEXT\0"
+   "glGetFragDataLocation\0"
+   "\0"
+   /* _mesa_function_pool[24463]: GetMinmaxParameteriv (offset 366) */
+   "iip\0"
+   "glGetMinmaxParameteriv\0"
+   "glGetMinmaxParameterivEXT\0"
+   "\0"
+   /* _mesa_function_pool[24517]: PixelTransferf (offset 247) */
+   "if\0"
+   "glPixelTransferf\0"
+   "\0"
+   /* _mesa_function_pool[24538]: CopyTexImage1D (offset 323) */
+   "iiiiiii\0"
+   "glCopyTexImage1D\0"
+   "glCopyTexImage1DEXT\0"
+   "\0"
+   /* _mesa_function_pool[24584]: PushMatrix (offset 298) */
+   "\0"
+   "glPushMatrix\0"
+   "\0"
+   /* _mesa_function_pool[24599]: Fogiv (offset 156) */
+   "ip\0"
+   "glFogiv\0"
+   "\0"
+   /* _mesa_function_pool[24611]: TexCoord1dv (offset 95) */
+   "p\0"
+   "glTexCoord1dv\0"
+   "\0"
+   /* _mesa_function_pool[24628]: AlphaFragmentOp3ATI (will be remapped) */
+   "iiiiiiiiiiii\0"
+   "glAlphaFragmentOp3ATI\0"
+   "\0"
+   /* _mesa_function_pool[24664]: PixelTransferi (offset 248) */
+   "ii\0"
+   "glPixelTransferi\0"
+   "\0"
+   /* _mesa_function_pool[24685]: GetVertexAttribdvNV (will be remapped) */
+   "iip\0"
+   "glGetVertexAttribdvNV\0"
+   "\0"
+   /* _mesa_function_pool[24712]: VertexAttrib3fvNV (will be remapped) */
+   "ip\0"
+   "glVertexAttrib3fvNV\0"
+   "\0"
+   /* _mesa_function_pool[24736]: Rotatef (offset 300) */
+   "ffff\0"
+   "glRotatef\0"
+   "\0"
+   /* _mesa_function_pool[24752]: GetFinalCombinerInputParameterivNV (will be remapped) */
+   "iip\0"
+   "glGetFinalCombinerInputParameterivNV\0"
+   "\0"
+   /* _mesa_function_pool[24794]: Vertex3i (offset 138) */
+   "iii\0"
+   "glVertex3i\0"
+   "\0"
+   /* _mesa_function_pool[24810]: Vertex3f (offset 136) */
+   "fff\0"
+   "glVertex3f\0"
+   "\0"
+   /* _mesa_function_pool[24826]: Clear (offset 203) */
+   "i\0"
+   "glClear\0"
+   "\0"
+   /* _mesa_function_pool[24837]: Vertex3d (offset 134) */
+   "ddd\0"
+   "glVertex3d\0"
+   "\0"
+   /* _mesa_function_pool[24853]: GetMapParameterivNV (dynamic) */
+   "iip\0"
+   "glGetMapParameterivNV\0"
+   "\0"
+   /* _mesa_function_pool[24880]: Uniform4iARB (will be remapped) */
+   "iiiii\0"
+   "glUniform4i\0"
+   "glUniform4iARB\0"
+   "\0"
+   /* _mesa_function_pool[24914]: ReadBuffer (offset 254) */
+   "i\0"
+   "glReadBuffer\0"
+   "\0"
+   /* _mesa_function_pool[24930]: ConvolutionParameteri (offset 352) */
+   "iii\0"
+   "glConvolutionParameteri\0"
+   "glConvolutionParameteriEXT\0"
+   "\0"
+   /* _mesa_function_pool[24986]: Ortho (offset 296) */
+   "dddddd\0"
+   "glOrtho\0"
+   "\0"
+   /* _mesa_function_pool[25002]: Binormal3sEXT (dynamic) */
+   "iii\0"
+   "glBinormal3sEXT\0"
+   "\0"
+   /* _mesa_function_pool[25023]: ListBase (offset 6) */
+   "i\0"
+   "glListBase\0"
+   "\0"
+   /* _mesa_function_pool[25037]: Vertex3s (offset 140) */
+   "iii\0"
+   "glVertex3s\0"
+   "\0"
+   /* _mesa_function_pool[25053]: ConvolutionParameterf (offset 350) */
+   "iif\0"
+   "glConvolutionParameterf\0"
+   "glConvolutionParameterfEXT\0"
+   "\0"
+   /* _mesa_function_pool[25109]: GetColorTableParameteriv (offset 345) */
+   "iip\0"
+   "glGetColorTableParameteriv\0"
+   "glGetColorTableParameterivSGI\0"
+   "glGetColorTableParameterivEXT\0"
+   "\0"
+   /* _mesa_function_pool[25201]: ProgramEnvParameter4dvARB (will be remapped) */
+   "iip\0"
+   "glProgramEnvParameter4dvARB\0"
+   "glProgramParameter4dvNV\0"
+   "\0"
+   /* _mesa_function_pool[25258]: ShadeModel (offset 177) */
+   "i\0"
+   "glShadeModel\0"
+   "\0"
+   /* _mesa_function_pool[25274]: VertexAttribs2fvNV (will be remapped) */
+   "iip\0"
+   "glVertexAttribs2fvNV\0"
+   "\0"
+   /* _mesa_function_pool[25300]: Rectiv (offset 91) */
+   "pp\0"
+   "glRectiv\0"
+   "\0"
+   /* _mesa_function_pool[25313]: UseProgramObjectARB (will be remapped) */
+   "i\0"
+   "glUseProgram\0"
+   "glUseProgramObjectARB\0"
+   "\0"
+   /* _mesa_function_pool[25351]: GetMapParameterfvNV (dynamic) */
+   "iip\0"
+   "glGetMapParameterfvNV\0"
+   "\0"
+   /* _mesa_function_pool[25378]: EndConditionalRenderNV (will be remapped) */
+   "\0"
+   "glEndConditionalRenderNV\0"
+   "glEndConditionalRender\0"
+   "\0"
+   /* _mesa_function_pool[25428]: PassTexCoordATI (will be remapped) */
+   "iii\0"
+   "glPassTexCoordATI\0"
+   "\0"
+   /* _mesa_function_pool[25451]: DeleteProgram (will be remapped) */
+   "i\0"
+   "glDeleteProgram\0"
+   "\0"
+   /* _mesa_function_pool[25470]: Tangent3ivEXT (dynamic) */
+   "p\0"
+   "glTangent3ivEXT\0"
+   "\0"
+   /* _mesa_function_pool[25489]: Tangent3dEXT (dynamic) */
+   "ddd\0"
+   "glTangent3dEXT\0"
+   "\0"
+   /* _mesa_function_pool[25509]: SecondaryColor3dvEXT (will be remapped) */
+   "p\0"
+   "glSecondaryColor3dv\0"
+   "glSecondaryColor3dvEXT\0"
+   "\0"
+   /* _mesa_function_pool[25555]: AlphaFragmentOp2ATI (will be remapped) */
+   "iiiiiiiii\0"
+   "glAlphaFragmentOp2ATI\0"
+   "\0"
+   /* _mesa_function_pool[25588]: Vertex2fv (offset 129) */
+   "p\0"
+   "glVertex2fv\0"
+   "\0"
+   /* _mesa_function_pool[25603]: MultiDrawArraysEXT (will be remapped) */
+   "ippi\0"
+   "glMultiDrawArrays\0"
+   "glMultiDrawArraysEXT\0"
+   "\0"
+   /* _mesa_function_pool[25648]: BindRenderbufferEXT (will be remapped) */
+   "ii\0"
+   "glBindRenderbuffer\0"
+   "glBindRenderbufferEXT\0"
+   "\0"
+   /* _mesa_function_pool[25693]: MultiTexCoord4dARB (offset 400) */
+   "idddd\0"
+   "glMultiTexCoord4d\0"
+   "glMultiTexCoord4dARB\0"
+   "\0"
+   /* _mesa_function_pool[25739]: FramebufferTextureFaceARB (will be remapped) */
+   "iiiii\0"
+   "glFramebufferTextureFaceARB\0"
+   "\0"
+   /* _mesa_function_pool[25774]: Vertex3sv (offset 141) */
+   "p\0"
+   "glVertex3sv\0"
+   "\0"
+   /* _mesa_function_pool[25789]: SecondaryColor3usEXT (will be remapped) */
+   "iii\0"
+   "glSecondaryColor3us\0"
+   "glSecondaryColor3usEXT\0"
+   "\0"
+   /* _mesa_function_pool[25837]: ProgramLocalParameter4fvARB (will be remapped) */
+   "iip\0"
+   "glProgramLocalParameter4fvARB\0"
+   "\0"
+   /* _mesa_function_pool[25872]: DeleteProgramsNV (will be remapped) */
+   "ip\0"
+   "glDeleteProgramsARB\0"
+   "glDeleteProgramsNV\0"
+   "\0"
+   /* _mesa_function_pool[25915]: EvalMesh1 (offset 236) */
+   "iii\0"
+   "glEvalMesh1\0"
+   "\0"
+   /* _mesa_function_pool[25932]: PauseTransformFeedback (will be remapped) */
+   "\0"
+   "glPauseTransformFeedback\0"
+   "\0"
+   /* _mesa_function_pool[25959]: MultiTexCoord1sARB (offset 382) */
+   "ii\0"
+   "glMultiTexCoord1s\0"
+   "glMultiTexCoord1sARB\0"
+   "\0"
+   /* _mesa_function_pool[26002]: ReplacementCodeuiColor3fVertex3fSUN (dynamic) */
+   "iffffff\0"
+   "glReplacementCodeuiColor3fVertex3fSUN\0"
+   "\0"
+   /* _mesa_function_pool[26049]: GetVertexAttribPointervNV (will be remapped) */
+   "iip\0"
+   "glGetVertexAttribPointerv\0"
+   "glGetVertexAttribPointervARB\0"
+   "glGetVertexAttribPointervNV\0"
+   "\0"
+   /* _mesa_function_pool[26137]: VertexAttribs1fvNV (will be remapped) */
+   "iip\0"
+   "glVertexAttribs1fvNV\0"
+   "\0"
+   /* _mesa_function_pool[26163]: MultiTexCoord1dvARB (offset 377) */
+   "ip\0"
+   "glMultiTexCoord1dv\0"
+   "glMultiTexCoord1dvARB\0"
+   "\0"
+   /* _mesa_function_pool[26208]: Uniform2iARB (will be remapped) */
+   "iii\0"
+   "glUniform2i\0"
+   "glUniform2iARB\0"
+   "\0"
+   /* _mesa_function_pool[26240]: Vertex2iv (offset 131) */
+   "p\0"
+   "glVertex2iv\0"
+   "\0"
+   /* _mesa_function_pool[26255]: GetProgramStringNV (will be remapped) */
+   "iip\0"
+   "glGetProgramStringNV\0"
+   "\0"
+   /* _mesa_function_pool[26281]: ColorPointerEXT (will be remapped) */
+   "iiiip\0"
+   "glColorPointerEXT\0"
+   "\0"
+   /* _mesa_function_pool[26306]: LineWidth (offset 168) */
+   "f\0"
+   "glLineWidth\0"
+   "\0"
+   /* _mesa_function_pool[26321]: MapBufferARB (will be remapped) */
+   "ii\0"
+   "glMapBuffer\0"
+   "glMapBufferARB\0"
+   "\0"
+   /* _mesa_function_pool[26352]: MultiDrawElementsBaseVertex (will be remapped) */
+   "ipipip\0"
+   "glMultiDrawElementsBaseVertex\0"
+   "\0"
+   /* _mesa_function_pool[26390]: TexParameterIuivEXT (will be remapped) */
+   "iip\0"
+   "glTexParameterIuivEXT\0"
+   "glTexParameterIuiv\0"
+   "\0"
+   /* _mesa_function_pool[26436]: Binormal3svEXT (dynamic) */
+   "p\0"
+   "glBinormal3svEXT\0"
+   "\0"
+   /* _mesa_function_pool[26456]: ApplyTextureEXT (dynamic) */
+   "i\0"
+   "glApplyTextureEXT\0"
+   "\0"
+   /* _mesa_function_pool[26477]: GetBufferParameteri64v (will be remapped) */
+   "iip\0"
+   "glGetBufferParameteri64v\0"
+   "\0"
+   /* _mesa_function_pool[26507]: TexGendv (offset 189) */
+   "iip\0"
+   "glTexGendv\0"
+   "\0"
+   /* _mesa_function_pool[26523]: VertexAttribI3iEXT (will be remapped) */
+   "iiii\0"
+   "glVertexAttribI3iEXT\0"
+   "glVertexAttribI3i\0"
+   "\0"
+   /* _mesa_function_pool[26568]: EnableIndexedEXT (will be remapped) */
+   "ii\0"
+   "glEnableIndexedEXT\0"
+   "glEnablei\0"
+   "\0"
+   /* _mesa_function_pool[26601]: TextureMaterialEXT (dynamic) */
+   "ii\0"
+   "glTextureMaterialEXT\0"
+   "\0"
+   /* _mesa_function_pool[26626]: TextureLightEXT (dynamic) */
+   "i\0"
+   "glTextureLightEXT\0"
+   "\0"
+   /* _mesa_function_pool[26647]: ResetMinmax (offset 370) */
+   "i\0"
+   "glResetMinmax\0"
+   "glResetMinmaxEXT\0"
+   "\0"
+   /* _mesa_function_pool[26681]: SpriteParameterfSGIX (dynamic) */
+   "if\0"
+   "glSpriteParameterfSGIX\0"
+   "\0"
+   /* _mesa_function_pool[26708]: EnableClientState (offset 313) */
+   "i\0"
+   "glEnableClientState\0"
+   "\0"
+   /* _mesa_function_pool[26731]: VertexAttrib4sNV (will be remapped) */
+   "iiiii\0"
+   "glVertexAttrib4sNV\0"
+   "\0"
+   /* _mesa_function_pool[26757]: GetConvolutionParameterfv (offset 357) */
+   "iip\0"
+   "glGetConvolutionParameterfv\0"
+   "glGetConvolutionParameterfvEXT\0"
+   "\0"
+   /* _mesa_function_pool[26821]: VertexAttribs4dvNV (will be remapped) */
+   "iip\0"
+   "glVertexAttribs4dvNV\0"
+   "\0"
+   /* _mesa_function_pool[26847]: MultiModeDrawArraysIBM (will be remapped) */
+   "pppii\0"
+   "glMultiModeDrawArraysIBM\0"
+   "\0"
+   /* _mesa_function_pool[26879]: VertexAttrib4dARB (will be remapped) */
+   "idddd\0"
+   "glVertexAttrib4d\0"
+   "glVertexAttrib4dARB\0"
+   "\0"
+   /* _mesa_function_pool[26923]: GetTexBumpParameterfvATI (will be remapped) */
+   "ip\0"
+   "glGetTexBumpParameterfvATI\0"
+   "\0"
+   /* _mesa_function_pool[26954]: ProgramNamedParameter4dNV (will be remapped) */
+   "iipdddd\0"
+   "glProgramNamedParameter4dNV\0"
+   "\0"
+   /* _mesa_function_pool[26991]: GetMaterialfv (offset 269) */
+   "iip\0"
+   "glGetMaterialfv\0"
+   "\0"
+   /* _mesa_function_pool[27012]: VertexWeightfEXT (dynamic) */
+   "f\0"
+   "glVertexWeightfEXT\0"
+   "\0"
+   /* _mesa_function_pool[27034]: SetFragmentShaderConstantATI (will be remapped) */
+   "ip\0"
+   "glSetFragmentShaderConstantATI\0"
+   "\0"
+   /* _mesa_function_pool[27069]: Binormal3fEXT (dynamic) */
+   "fff\0"
+   "glBinormal3fEXT\0"
+   "\0"
+   /* _mesa_function_pool[27090]: CallList (offset 2) */
+   "i\0"
+   "glCallList\0"
+   "\0"
+   /* _mesa_function_pool[27104]: Materialfv (offset 170) */
+   "iip\0"
+   "glMaterialfv\0"
+   "\0"
+   /* _mesa_function_pool[27122]: TexCoord3fv (offset 113) */
+   "p\0"
+   "glTexCoord3fv\0"
+   "\0"
+   /* _mesa_function_pool[27139]: FogCoordfvEXT (will be remapped) */
+   "p\0"
+   "glFogCoordfv\0"
+   "glFogCoordfvEXT\0"
+   "\0"
+   /* _mesa_function_pool[27171]: MultiTexCoord1ivARB (offset 381) */
+   "ip\0"
+   "glMultiTexCoord1iv\0"
+   "glMultiTexCoord1ivARB\0"
+   "\0"
+   /* _mesa_function_pool[27216]: SecondaryColor3ubEXT (will be remapped) */
+   "iii\0"
+   "glSecondaryColor3ub\0"
+   "glSecondaryColor3ubEXT\0"
+   "\0"
+   /* _mesa_function_pool[27264]: MultiTexCoord2ivARB (offset 389) */
+   "ip\0"
+   "glMultiTexCoord2iv\0"
+   "glMultiTexCoord2ivARB\0"
+   "\0"
+   /* _mesa_function_pool[27309]: FogFuncSGIS (dynamic) */
+   "ip\0"
+   "glFogFuncSGIS\0"
+   "\0"
+   /* _mesa_function_pool[27327]: CopyTexSubImage2D (offset 326) */
+   "iiiiiiii\0"
+   "glCopyTexSubImage2D\0"
+   "glCopyTexSubImage2DEXT\0"
+   "\0"
+   /* _mesa_function_pool[27380]: GetObjectParameterivARB (will be remapped) */
+   "iip\0"
+   "glGetObjectParameterivARB\0"
+   "\0"
+   /* _mesa_function_pool[27411]: Color3iv (offset 16) */
+   "p\0"
+   "glColor3iv\0"
+   "\0"
+   /* _mesa_function_pool[27425]: TexCoord4fVertex4fSUN (dynamic) */
+   "ffffffff\0"
+   "glTexCoord4fVertex4fSUN\0"
+   "\0"
+   /* _mesa_function_pool[27459]: DrawElements (offset 311) */
+   "iiip\0"
+   "glDrawElements\0"
+   "\0"
+   /* _mesa_function_pool[27480]: BindVertexArrayAPPLE (will be remapped) */
+   "i\0"
+   "glBindVertexArrayAPPLE\0"
+   "\0"
+   /* _mesa_function_pool[27506]: GetProgramLocalParameterdvARB (will be remapped) */
+   "iip\0"
+   "glGetProgramLocalParameterdvARB\0"
+   "\0"
+   /* _mesa_function_pool[27543]: GetHistogramParameteriv (offset 363) */
+   "iip\0"
+   "glGetHistogramParameteriv\0"
+   "glGetHistogramParameterivEXT\0"
+   "\0"
+   /* _mesa_function_pool[27603]: MultiTexCoord1iARB (offset 380) */
+   "ii\0"
+   "glMultiTexCoord1i\0"
+   "glMultiTexCoord1iARB\0"
+   "\0"
+   /* _mesa_function_pool[27646]: GetConvolutionFilter (offset 356) */
+   "iiip\0"
+   "glGetConvolutionFilter\0"
+   "glGetConvolutionFilterEXT\0"
+   "\0"
+   /* _mesa_function_pool[27701]: GetProgramivARB (will be remapped) */
+   "iip\0"
+   "glGetProgramivARB\0"
+   "\0"
+   /* _mesa_function_pool[27724]: BlendFuncSeparateEXT (will be remapped) */
+   "iiii\0"
+   "glBlendFuncSeparate\0"
+   "glBlendFuncSeparateEXT\0"
+   "glBlendFuncSeparateINGR\0"
+   "\0"
+   /* _mesa_function_pool[27797]: MapBufferRange (will be remapped) */
+   "iiii\0"
+   "glMapBufferRange\0"
+   "\0"
+   /* _mesa_function_pool[27820]: ProgramParameters4dvNV (will be remapped) */
+   "iiip\0"
+   "glProgramParameters4dvNV\0"
+   "\0"
+   /* _mesa_function_pool[27851]: TexCoord2fColor3fVertex3fvSUN (dynamic) */
+   "ppp\0"
+   "glTexCoord2fColor3fVertex3fvSUN\0"
+   "\0"
+   /* _mesa_function_pool[27888]: EvalPoint2 (offset 239) */
+   "ii\0"
+   "glEvalPoint2\0"
+   "\0"
+   /* _mesa_function_pool[27905]: Uniform1uivEXT (will be remapped) */
+   "iip\0"
+   "glUniform1uivEXT\0"
+   "glUniform1uiv\0"
+   "\0"
+   /* _mesa_function_pool[27941]: EvalPoint1 (offset 237) */
+   "i\0"
+   "glEvalPoint1\0"
+   "\0"
+   /* _mesa_function_pool[27957]: Binormal3dvEXT (dynamic) */
+   "p\0"
+   "glBinormal3dvEXT\0"
+   "\0"
+   /* _mesa_function_pool[27977]: PopMatrix (offset 297) */
+   "\0"
+   "glPopMatrix\0"
+   "\0"
+   /* _mesa_function_pool[27991]: GetVertexAttribIuivEXT (will be remapped) */
+   "iip\0"
+   "glGetVertexAttribIuivEXT\0"
+   "glGetVertexAttribIuiv\0"
+   "\0"
+   /* _mesa_function_pool[28043]: FinishFenceNV (will be remapped) */
+   "i\0"
+   "glFinishFenceNV\0"
+   "\0"
+   /* _mesa_function_pool[28062]: GetFogFuncSGIS (dynamic) */
+   "p\0"
+   "glGetFogFuncSGIS\0"
+   "\0"
+   /* _mesa_function_pool[28082]: GetUniformLocationARB (will be remapped) */
+   "ip\0"
+   "glGetUniformLocation\0"
+   "glGetUniformLocationARB\0"
+   "\0"
+   /* _mesa_function_pool[28131]: SecondaryColor3fEXT (will be remapped) */
+   "fff\0"
+   "glSecondaryColor3f\0"
+   "glSecondaryColor3fEXT\0"
+   "\0"
+   /* _mesa_function_pool[28177]: GetTexGeniv (offset 280) */
+   "iip\0"
+   "glGetTexGeniv\0"
+   "\0"
+   /* _mesa_function_pool[28196]: CombinerInputNV (will be remapped) */
+   "iiiiii\0"
+   "glCombinerInputNV\0"
+   "\0"
+   /* _mesa_function_pool[28222]: VertexAttrib3sARB (will be remapped) */
+   "iiii\0"
+   "glVertexAttrib3s\0"
+   "glVertexAttrib3sARB\0"
+   "\0"
+   /* _mesa_function_pool[28265]: IsTransformFeedback (will be remapped) */
+   "i\0"
+   "glIsTransformFeedback\0"
+   "\0"
+   /* _mesa_function_pool[28290]: ReplacementCodeuiNormal3fVertex3fvSUN (dynamic) */
+   "ppp\0"
+   "glReplacementCodeuiNormal3fVertex3fvSUN\0"
+   "\0"
+   /* _mesa_function_pool[28335]: Map2d (offset 222) */
+   "iddiiddiip\0"
+   "glMap2d\0"
+   "\0"
+   /* _mesa_function_pool[28355]: Map2f (offset 223) */
+   "iffiiffiip\0"
+   "glMap2f\0"
+   "\0"
+   /* _mesa_function_pool[28375]: ProgramStringARB (will be remapped) */
+   "iiip\0"
+   "glProgramStringARB\0"
+   "\0"
+   /* _mesa_function_pool[28400]: Vertex4s (offset 148) */
+   "iiii\0"
+   "glVertex4s\0"
+   "\0"
+   /* _mesa_function_pool[28417]: TexCoord4fVertex4fvSUN (dynamic) */
+   "pp\0"
+   "glTexCoord4fVertex4fvSUN\0"
+   "\0"
+   /* _mesa_function_pool[28446]: FragmentLightModelivSGIX (dynamic) */
+   "ip\0"
+   "glFragmentLightModelivSGIX\0"
+   "\0"
+   /* _mesa_function_pool[28477]: VertexAttrib1fNV (will be remapped) */
+   "if\0"
+   "glVertexAttrib1fNV\0"
+   "\0"
+   /* _mesa_function_pool[28500]: Vertex4f (offset 144) */
+   "ffff\0"
+   "glVertex4f\0"
+   "\0"
+   /* _mesa_function_pool[28517]: EvalCoord1d (offset 228) */
+   "d\0"
+   "glEvalCoord1d\0"
+   "\0"
+   /* _mesa_function_pool[28534]: Vertex4d (offset 142) */
+   "dddd\0"
+   "glVertex4d\0"
+   "\0"
+   /* _mesa_function_pool[28551]: RasterPos4dv (offset 79) */
+   "p\0"
+   "glRasterPos4dv\0"
+   "\0"
+   /* _mesa_function_pool[28569]: UseShaderProgramEXT (will be remapped) */
+   "ii\0"
+   "glUseShaderProgramEXT\0"
+   "\0"
+   /* _mesa_function_pool[28595]: FragmentLightfSGIX (dynamic) */
+   "iif\0"
+   "glFragmentLightfSGIX\0"
+   "\0"
+   /* _mesa_function_pool[28621]: GetCompressedTexImageARB (will be remapped) */
+   "iip\0"
+   "glGetCompressedTexImage\0"
+   "glGetCompressedTexImageARB\0"
+   "\0"
+   /* _mesa_function_pool[28677]: GetTexGenfv (offset 279) */
+   "iip\0"
+   "glGetTexGenfv\0"
+   "\0"
+   /* _mesa_function_pool[28696]: Vertex4i (offset 146) */
+   "iiii\0"
+   "glVertex4i\0"
+   "\0"
+   /* _mesa_function_pool[28713]: VertexWeightPointerEXT (dynamic) */
+   "iiip\0"
+   "glVertexWeightPointerEXT\0"
+   "\0"
+   /* _mesa_function_pool[28744]: GetHistogram (offset 361) */
+   "iiiip\0"
+   "glGetHistogram\0"
+   "glGetHistogramEXT\0"
+   "\0"
+   /* _mesa_function_pool[28784]: ActiveStencilFaceEXT (will be remapped) */
+   "i\0"
+   "glActiveStencilFaceEXT\0"
+   "\0"
+   /* _mesa_function_pool[28810]: StencilFuncSeparateATI (will be remapped) */
+   "iiii\0"
+   "glStencilFuncSeparateATI\0"
+   "\0"
+   /* _mesa_function_pool[28841]: Materialf (offset 169) */
+   "iif\0"
+   "glMaterialf\0"
+   "\0"
+   /* _mesa_function_pool[28858]: GetShaderSourceARB (will be remapped) */
+   "iipp\0"
+   "glGetShaderSource\0"
+   "glGetShaderSourceARB\0"
+   "\0"
+   /* _mesa_function_pool[28903]: IglooInterfaceSGIX (dynamic) */
+   "ip\0"
+   "glIglooInterfaceSGIX\0"
+   "\0"
+   /* _mesa_function_pool[28928]: Materiali (offset 171) */
+   "iii\0"
+   "glMateriali\0"
+   "\0"
+   /* _mesa_function_pool[28945]: VertexAttrib4dNV (will be remapped) */
+   "idddd\0"
+   "glVertexAttrib4dNV\0"
+   "\0"
+   /* _mesa_function_pool[28971]: MultiModeDrawElementsIBM (will be remapped) */
+   "ppipii\0"
+   "glMultiModeDrawElementsIBM\0"
+   "\0"
+   /* _mesa_function_pool[29006]: Indexsv (offset 51) */
+   "p\0"
+   "glIndexsv\0"
+   "\0"
+   /* _mesa_function_pool[29019]: MultiTexCoord4svARB (offset 407) */
+   "ip\0"
+   "glMultiTexCoord4sv\0"
+   "glMultiTexCoord4svARB\0"
+   "\0"
+   /* _mesa_function_pool[29064]: LightModelfv (offset 164) */
+   "ip\0"
+   "glLightModelfv\0"
+   "\0"
+   /* _mesa_function_pool[29083]: TexCoord2dv (offset 103) */
+   "p\0"
+   "glTexCoord2dv\0"
+   "\0"
+   /* _mesa_function_pool[29100]: GenQueriesARB (will be remapped) */
+   "ip\0"
+   "glGenQueries\0"
+   "glGenQueriesARB\0"
+   "\0"
+   /* _mesa_function_pool[29133]: EvalCoord1dv (offset 229) */
+   "p\0"
+   "glEvalCoord1dv\0"
+   "\0"
+   /* _mesa_function_pool[29151]: ReplacementCodeuiVertex3fSUN (dynamic) */
+   "ifff\0"
+   "glReplacementCodeuiVertex3fSUN\0"
+   "\0"
+   /* _mesa_function_pool[29188]: Translated (offset 303) */
+   "ddd\0"
+   "glTranslated\0"
+   "\0"
+   /* _mesa_function_pool[29206]: Translatef (offset 304) */
+   "fff\0"
+   "glTranslatef\0"
+   "\0"
+   /* _mesa_function_pool[29224]: Uniform3uiEXT (will be remapped) */
+   "iiii\0"
+   "glUniform3uiEXT\0"
+   "glUniform3ui\0"
+   "\0"
+   /* _mesa_function_pool[29259]: StencilMask (offset 209) */
+   "i\0"
+   "glStencilMask\0"
+   "\0"
+   /* _mesa_function_pool[29276]: Tangent3iEXT (dynamic) */
+   "iii\0"
+   "glTangent3iEXT\0"
+   "\0"
+   /* _mesa_function_pool[29296]: ClampColorARB (will be remapped) */
+   "ii\0"
+   "glClampColorARB\0"
+   "\0"
+   /* _mesa_function_pool[29316]: GetLightiv (offset 265) */
+   "iip\0"
+   "glGetLightiv\0"
+   "\0"
+   /* _mesa_function_pool[29334]: DrawMeshArraysSUN (dynamic) */
+   "iiii\0"
+   "glDrawMeshArraysSUN\0"
+   "\0"
+   /* _mesa_function_pool[29360]: IsList (offset 287) */
+   "i\0"
+   "glIsList\0"
+   "\0"
+   /* _mesa_function_pool[29372]: IsSync (will be remapped) */
+   "i\0"
+   "glIsSync\0"
+   "\0"
+   /* _mesa_function_pool[29384]: RenderMode (offset 196) */
+   "i\0"
+   "glRenderMode\0"
+   "\0"
+   /* _mesa_function_pool[29400]: GetMapControlPointsNV (dynamic) */
+   "iiiiiip\0"
+   "glGetMapControlPointsNV\0"
+   "\0"
+   /* _mesa_function_pool[29433]: DrawBuffersARB (will be remapped) */
+   "ip\0"
+   "glDrawBuffers\0"
+   "glDrawBuffersARB\0"
+   "glDrawBuffersATI\0"
+   "\0"
+   /* _mesa_function_pool[29485]: ClearBufferiv (will be remapped) */
+   "iip\0"
+   "glClearBufferiv\0"
+   "\0"
+   /* _mesa_function_pool[29506]: ProgramLocalParameter4fARB (will be remapped) */
+   "iiffff\0"
+   "glProgramLocalParameter4fARB\0"
+   "\0"
+   /* _mesa_function_pool[29543]: SpriteParameterivSGIX (dynamic) */
+   "ip\0"
+   "glSpriteParameterivSGIX\0"
+   "\0"
+   /* _mesa_function_pool[29571]: ProvokingVertexEXT (will be remapped) */
+   "i\0"
+   "glProvokingVertexEXT\0"
+   "glProvokingVertex\0"
+   "\0"
+   /* _mesa_function_pool[29613]: MultiTexCoord1fARB (offset 378) */
+   "if\0"
+   "glMultiTexCoord1f\0"
+   "glMultiTexCoord1fARB\0"
+   "\0"
+   /* _mesa_function_pool[29656]: LoadName (offset 198) */
+   "i\0"
+   "glLoadName\0"
+   "\0"
+   /* _mesa_function_pool[29670]: VertexAttribs4ubvNV (will be remapped) */
+   "iip\0"
+   "glVertexAttribs4ubvNV\0"
+   "\0"
+   /* _mesa_function_pool[29697]: WeightsvARB (dynamic) */
+   "ip\0"
+   "glWeightsvARB\0"
+   "\0"
+   /* _mesa_function_pool[29715]: Uniform1fvARB (will be remapped) */
+   "iip\0"
+   "glUniform1fv\0"
+   "glUniform1fvARB\0"
+   "\0"
+   /* _mesa_function_pool[29749]: CopyTexSubImage1D (offset 325) */
+   "iiiiii\0"
+   "glCopyTexSubImage1D\0"
+   "glCopyTexSubImage1DEXT\0"
+   "\0"
+   /* _mesa_function_pool[29800]: CullFace (offset 152) */
+   "i\0"
+   "glCullFace\0"
+   "\0"
+   /* _mesa_function_pool[29814]: BindTexture (offset 307) */
+   "ii\0"
+   "glBindTexture\0"
+   "glBindTextureEXT\0"
+   "\0"
+   /* _mesa_function_pool[29849]: BeginFragmentShaderATI (will be remapped) */
+   "\0"
+   "glBeginFragmentShaderATI\0"
+   "\0"
+   /* _mesa_function_pool[29876]: MultiTexCoord4fARB (offset 402) */
+   "iffff\0"
+   "glMultiTexCoord4f\0"
+   "glMultiTexCoord4fARB\0"
+   "\0"
+   /* _mesa_function_pool[29922]: VertexAttribs3svNV (will be remapped) */
+   "iip\0"
+   "glVertexAttribs3svNV\0"
+   "\0"
+   /* _mesa_function_pool[29948]: StencilFunc (offset 243) */
+   "iii\0"
+   "glStencilFunc\0"
+   "\0"
+   /* _mesa_function_pool[29967]: CopyPixels (offset 255) */
+   "iiiii\0"
+   "glCopyPixels\0"
+   "\0"
+   /* _mesa_function_pool[29987]: Rectsv (offset 93) */
+   "pp\0"
+   "glRectsv\0"
+   "\0"
+   /* _mesa_function_pool[30000]: ReplacementCodeuivSUN (dynamic) */
+   "p\0"
+   "glReplacementCodeuivSUN\0"
+   "\0"
+   /* _mesa_function_pool[30027]: EnableVertexAttribArrayARB (will be remapped) */
+   "i\0"
+   "glEnableVertexAttribArray\0"
+   "glEnableVertexAttribArrayARB\0"
+   "\0"
+   /* _mesa_function_pool[30085]: NormalPointervINTEL (dynamic) */
+   "ip\0"
+   "glNormalPointervINTEL\0"
+   "\0"
+   /* _mesa_function_pool[30111]: CopyConvolutionFilter2D (offset 355) */
+   "iiiiii\0"
+   "glCopyConvolutionFilter2D\0"
+   "glCopyConvolutionFilter2DEXT\0"
+   "\0"
+   /* _mesa_function_pool[30174]: WindowPos3ivMESA (will be remapped) */
+   "p\0"
+   "glWindowPos3iv\0"
+   "glWindowPos3ivARB\0"
+   "glWindowPos3ivMESA\0"
+   "\0"
+   /* _mesa_function_pool[30229]: CopyBufferSubData (will be remapped) */
+   "iiiii\0"
+   "glCopyBufferSubData\0"
+   "\0"
+   /* _mesa_function_pool[30256]: NormalPointer (offset 318) */
+   "iip\0"
+   "glNormalPointer\0"
+   "\0"
+   /* _mesa_function_pool[30277]: TexParameterfv (offset 179) */
+   "iip\0"
+   "glTexParameterfv\0"
+   "\0"
+   /* _mesa_function_pool[30299]: IsBufferARB (will be remapped) */
+   "i\0"
+   "glIsBuffer\0"
+   "glIsBufferARB\0"
+   "\0"
+   /* _mesa_function_pool[30327]: WindowPos4iMESA (will be remapped) */
+   "iiii\0"
+   "glWindowPos4iMESA\0"
+   "\0"
+   /* _mesa_function_pool[30351]: VertexAttrib4uivARB (will be remapped) */
+   "ip\0"
+   "glVertexAttrib4uiv\0"
+   "glVertexAttrib4uivARB\0"
+   "\0"
+   /* _mesa_function_pool[30396]: Tangent3bvEXT (dynamic) */
+   "p\0"
+   "glTangent3bvEXT\0"
+   "\0"
+   /* _mesa_function_pool[30415]: VertexAttribI3uivEXT (will be remapped) */
+   "ip\0"
+   "glVertexAttribI3uivEXT\0"
+   "glVertexAttribI3uiv\0"
+   "\0"
+   /* _mesa_function_pool[30462]: UniformMatrix3x4fv (will be remapped) */
+   "iiip\0"
+   "glUniformMatrix3x4fv\0"
+   "\0"
+   /* _mesa_function_pool[30489]: ClipPlane (offset 150) */
+   "ip\0"
+   "glClipPlane\0"
+   "\0"
+   /* _mesa_function_pool[30505]: Recti (offset 90) */
+   "iiii\0"
+   "glRecti\0"
+   "\0"
+   /* _mesa_function_pool[30519]: VertexAttribI3ivEXT (will be remapped) */
+   "ip\0"
+   "glVertexAttribI3ivEXT\0"
+   "glVertexAttribI3iv\0"
+   "\0"
+   /* _mesa_function_pool[30564]: DrawRangeElementsBaseVertex (will be remapped) */
+   "iiiiipi\0"
+   "glDrawRangeElementsBaseVertex\0"
+   "\0"
+   /* _mesa_function_pool[30603]: TexCoordPointervINTEL (dynamic) */
+   "iip\0"
+   "glTexCoordPointervINTEL\0"
+   "\0"
+   /* _mesa_function_pool[30632]: DeleteBuffersARB (will be remapped) */
+   "ip\0"
+   "glDeleteBuffers\0"
+   "glDeleteBuffersARB\0"
+   "\0"
+   /* _mesa_function_pool[30671]: PixelTransformParameterfvEXT (dynamic) */
+   "iip\0"
+   "glPixelTransformParameterfvEXT\0"
+   "\0"
+   /* _mesa_function_pool[30707]: PrimitiveRestartNV (will be remapped) */
+   "\0"
+   "glPrimitiveRestartNV\0"
+   "\0"
+   /* _mesa_function_pool[30730]: WindowPos4fvMESA (will be remapped) */
+   "p\0"
+   "glWindowPos4fvMESA\0"
+   "\0"
+   /* _mesa_function_pool[30752]: GetPixelMapuiv (offset 272) */
+   "ip\0"
+   "glGetPixelMapuiv\0"
+   "\0"
+   /* _mesa_function_pool[30773]: Rectf (offset 88) */
+   "ffff\0"
+   "glRectf\0"
+   "\0"
+   /* _mesa_function_pool[30787]: VertexAttrib1sNV (will be remapped) */
+   "ii\0"
+   "glVertexAttrib1sNV\0"
+   "\0"
+   /* _mesa_function_pool[30810]: Indexfv (offset 47) */
+   "p\0"
+   "glIndexfv\0"
+   "\0"
+   /* _mesa_function_pool[30823]: SecondaryColor3svEXT (will be remapped) */
+   "p\0"
+   "glSecondaryColor3sv\0"
+   "glSecondaryColor3svEXT\0"
+   "\0"
+   /* _mesa_function_pool[30869]: LoadTransposeMatrixfARB (will be remapped) */
+   "p\0"
+   "glLoadTransposeMatrixf\0"
+   "glLoadTransposeMatrixfARB\0"
+   "\0"
+   /* _mesa_function_pool[30921]: GetPointerv (offset 329) */
+   "ip\0"
+   "glGetPointerv\0"
+   "glGetPointervEXT\0"
+   "\0"
+   /* _mesa_function_pool[30956]: Tangent3bEXT (dynamic) */
+   "iii\0"
+   "glTangent3bEXT\0"
+   "\0"
+   /* _mesa_function_pool[30976]: CombinerParameterfNV (will be remapped) */
+   "if\0"
+   "glCombinerParameterfNV\0"
+   "\0"
+   /* _mesa_function_pool[31003]: IndexMask (offset 212) */
+   "i\0"
+   "glIndexMask\0"
+   "\0"
+   /* _mesa_function_pool[31018]: BindProgramNV (will be remapped) */
+   "ii\0"
+   "glBindProgramARB\0"
+   "glBindProgramNV\0"
+   "\0"
+   /* _mesa_function_pool[31055]: VertexAttrib4svARB (will be remapped) */
+   "ip\0"
+   "glVertexAttrib4sv\0"
+   "glVertexAttrib4svARB\0"
+   "\0"
+   /* _mesa_function_pool[31098]: GetFloatv (offset 262) */
+   "ip\0"
+   "glGetFloatv\0"
+   "\0"
+   /* _mesa_function_pool[31114]: CreateDebugObjectMESA (dynamic) */
+   "\0"
+   "glCreateDebugObjectMESA\0"
+   "\0"
+   /* _mesa_function_pool[31140]: GetShaderiv (will be remapped) */
+   "iip\0"
+   "glGetShaderiv\0"
+   "\0"
+   /* _mesa_function_pool[31159]: ClientWaitSync (will be remapped) */
+   "iii\0"
+   "glClientWaitSync\0"
+   "\0"
+   /* _mesa_function_pool[31181]: TexCoord4s (offset 124) */
+   "iiii\0"
+   "glTexCoord4s\0"
+   "\0"
+   /* _mesa_function_pool[31200]: TexCoord3sv (offset 117) */
+   "p\0"
+   "glTexCoord3sv\0"
+   "\0"
+   /* _mesa_function_pool[31217]: BindFragmentShaderATI (will be remapped) */
+   "i\0"
+   "glBindFragmentShaderATI\0"
+   "\0"
+   /* _mesa_function_pool[31244]: PopAttrib (offset 218) */
+   "\0"
+   "glPopAttrib\0"
+   "\0"
+   /* _mesa_function_pool[31258]: Fogfv (offset 154) */
+   "ip\0"
+   "glFogfv\0"
+   "\0"
+   /* _mesa_function_pool[31270]: UnmapBufferARB (will be remapped) */
+   "i\0"
+   "glUnmapBuffer\0"
+   "glUnmapBufferARB\0"
+   "\0"
+   /* _mesa_function_pool[31304]: InitNames (offset 197) */
+   "\0"
+   "glInitNames\0"
+   "\0"
+   /* _mesa_function_pool[31318]: Normal3sv (offset 61) */
+   "p\0"
+   "glNormal3sv\0"
+   "\0"
+   /* _mesa_function_pool[31333]: Minmax (offset 368) */
+   "iii\0"
+   "glMinmax\0"
+   "glMinmaxEXT\0"
+   "\0"
+   /* _mesa_function_pool[31359]: TexCoord4d (offset 118) */
+   "dddd\0"
+   "glTexCoord4d\0"
+   "\0"
+   /* _mesa_function_pool[31378]: TexCoord4f (offset 120) */
+   "ffff\0"
+   "glTexCoord4f\0"
+   "\0"
+   /* _mesa_function_pool[31397]: FogCoorddvEXT (will be remapped) */
+   "p\0"
+   "glFogCoorddv\0"
+   "glFogCoorddvEXT\0"
+   "\0"
+   /* _mesa_function_pool[31429]: FinishTextureSUNX (dynamic) */
+   "\0"
+   "glFinishTextureSUNX\0"
+   "\0"
+   /* _mesa_function_pool[31451]: GetFragmentLightfvSGIX (dynamic) */
+   "iip\0"
+   "glGetFragmentLightfvSGIX\0"
+   "\0"
+   /* _mesa_function_pool[31481]: Binormal3fvEXT (dynamic) */
+   "p\0"
+   "glBinormal3fvEXT\0"
+   "\0"
+   /* _mesa_function_pool[31501]: GetBooleanv (offset 258) */
+   "ip\0"
+   "glGetBooleanv\0"
+   "\0"
+   /* _mesa_function_pool[31519]: ColorFragmentOp3ATI (will be remapped) */
+   "iiiiiiiiiiiii\0"
+   "glColorFragmentOp3ATI\0"
+   "\0"
+   /* _mesa_function_pool[31556]: Hint (offset 158) */
+   "ii\0"
+   "glHint\0"
+   "\0"
+   /* _mesa_function_pool[31567]: Color4dv (offset 28) */
+   "p\0"
+   "glColor4dv\0"
+   "\0"
+   /* _mesa_function_pool[31581]: VertexAttrib2svARB (will be remapped) */
+   "ip\0"
+   "glVertexAttrib2sv\0"
+   "glVertexAttrib2svARB\0"
+   "\0"
+   /* _mesa_function_pool[31624]: AreProgramsResidentNV (will be remapped) */
+   "ipp\0"
+   "glAreProgramsResidentNV\0"
+   "\0"
+   /* _mesa_function_pool[31653]: WindowPos3svMESA (will be remapped) */
+   "p\0"
+   "glWindowPos3sv\0"
+   "glWindowPos3svARB\0"
+   "glWindowPos3svMESA\0"
+   "\0"
+   /* _mesa_function_pool[31708]: CopyColorSubTable (offset 347) */
+   "iiiii\0"
+   "glCopyColorSubTable\0"
+   "glCopyColorSubTableEXT\0"
+   "\0"
+   /* _mesa_function_pool[31758]: WeightdvARB (dynamic) */
+   "ip\0"
+   "glWeightdvARB\0"
+   "\0"
+   /* _mesa_function_pool[31776]: DeleteRenderbuffersEXT (will be remapped) */
+   "ip\0"
+   "glDeleteRenderbuffers\0"
+   "glDeleteRenderbuffersEXT\0"
+   "\0"
+   /* _mesa_function_pool[31827]: VertexAttrib4NubvARB (will be remapped) */
+   "ip\0"
+   "glVertexAttrib4Nubv\0"
+   "glVertexAttrib4NubvARB\0"
+   "\0"
+   /* _mesa_function_pool[31874]: VertexAttrib3dvNV (will be remapped) */
+   "ip\0"
+   "glVertexAttrib3dvNV\0"
+   "\0"
+   /* _mesa_function_pool[31898]: GetObjectParameterfvARB (will be remapped) */
+   "iip\0"
+   "glGetObjectParameterfvARB\0"
+   "\0"
+   /* _mesa_function_pool[31929]: Vertex4iv (offset 147) */
+   "p\0"
+   "glVertex4iv\0"
+   "\0"
+   /* _mesa_function_pool[31944]: GetProgramEnvParameterdvARB (will be remapped) */
+   "iip\0"
+   "glGetProgramEnvParameterdvARB\0"
+   "\0"
+   /* _mesa_function_pool[31979]: TexCoord4dv (offset 119) */
+   "p\0"
+   "glTexCoord4dv\0"
+   "\0"
+   /* _mesa_function_pool[31996]: LockArraysEXT (will be remapped) */
+   "ii\0"
+   "glLockArraysEXT\0"
+   "\0"
+   /* _mesa_function_pool[32016]: Begin (offset 7) */
+   "i\0"
+   "glBegin\0"
+   "\0"
+   /* _mesa_function_pool[32027]: LightModeli (offset 165) */
+   "ii\0"
+   "glLightModeli\0"
+   "\0"
+   /* _mesa_function_pool[32045]: VertexAttribI4ivEXT (will be remapped) */
+   "ip\0"
+   "glVertexAttribI4ivEXT\0"
+   "glVertexAttribI4iv\0"
+   "\0"
+   /* _mesa_function_pool[32090]: Rectfv (offset 89) */
+   "pp\0"
+   "glRectfv\0"
+   "\0"
+   /* _mesa_function_pool[32103]: BlendEquationSeparateiARB (will be remapped) */
+   "iii\0"
+   "glBlendEquationSeparateiARB\0"
+   "\0"
+   /* _mesa_function_pool[32136]: LightModelf (offset 163) */
+   "if\0"
+   "glLightModelf\0"
+   "\0"
+   /* _mesa_function_pool[32154]: GetTexParameterfv (offset 282) */
+   "iip\0"
+   "glGetTexParameterfv\0"
+   "\0"
+   /* _mesa_function_pool[32179]: GetLightfv (offset 264) */
+   "iip\0"
+   "glGetLightfv\0"
+   "\0"
+   /* _mesa_function_pool[32197]: PixelTransformParameterivEXT (dynamic) */
+   "iip\0"
+   "glPixelTransformParameterivEXT\0"
+   "\0"
+   /* _mesa_function_pool[32233]: BinormalPointerEXT (dynamic) */
+   "iip\0"
+   "glBinormalPointerEXT\0"
+   "\0"
+   /* _mesa_function_pool[32259]: VertexAttrib1dNV (will be remapped) */
+   "id\0"
+   "glVertexAttrib1dNV\0"
+   "\0"
+   /* _mesa_function_pool[32282]: GetCombinerInputParameterivNV (will be remapped) */
+   "iiiip\0"
+   "glGetCombinerInputParameterivNV\0"
+   "\0"
+   /* _mesa_function_pool[32321]: Disable (offset 214) */
+   "i\0"
+   "glDisable\0"
+   "\0"
+   /* _mesa_function_pool[32334]: MultiTexCoord2fvARB (offset 387) */
+   "ip\0"
+   "glMultiTexCoord2fv\0"
+   "glMultiTexCoord2fvARB\0"
+   "\0"
+   /* _mesa_function_pool[32379]: GetRenderbufferParameterivEXT (will be remapped) */
+   "iip\0"
+   "glGetRenderbufferParameteriv\0"
+   "glGetRenderbufferParameterivEXT\0"
+   "\0"
+   /* _mesa_function_pool[32445]: CombinerParameterivNV (will be remapped) */
+   "ip\0"
+   "glCombinerParameterivNV\0"
+   "\0"
+   /* _mesa_function_pool[32473]: GenFragmentShadersATI (will be remapped) */
+   "i\0"
+   "glGenFragmentShadersATI\0"
+   "\0"
+   /* _mesa_function_pool[32500]: DrawArrays (offset 310) */
+   "iii\0"
+   "glDrawArrays\0"
+   "glDrawArraysEXT\0"
+   "\0"
+   /* _mesa_function_pool[32534]: WeightuivARB (dynamic) */
+   "ip\0"
+   "glWeightuivARB\0"
+   "\0"
+   /* _mesa_function_pool[32553]: VertexAttrib2sARB (will be remapped) */
+   "iii\0"
+   "glVertexAttrib2s\0"
+   "glVertexAttrib2sARB\0"
+   "\0"
+   /* _mesa_function_pool[32595]: ColorMask (offset 210) */
+   "iiii\0"
+   "glColorMask\0"
+   "\0"
+   /* _mesa_function_pool[32613]: GenAsyncMarkersSGIX (dynamic) */
+   "i\0"
+   "glGenAsyncMarkersSGIX\0"
+   "\0"
+   /* _mesa_function_pool[32638]: Tangent3svEXT (dynamic) */
+   "p\0"
+   "glTangent3svEXT\0"
+   "\0"
+   /* _mesa_function_pool[32657]: GetListParameterivSGIX (dynamic) */
+   "iip\0"
+   "glGetListParameterivSGIX\0"
+   "\0"
+   /* _mesa_function_pool[32687]: BindBufferARB (will be remapped) */
+   "ii\0"
+   "glBindBuffer\0"
+   "glBindBufferARB\0"
+   "\0"
+   /* _mesa_function_pool[32720]: GetInfoLogARB (will be remapped) */
+   "iipp\0"
+   "glGetInfoLogARB\0"
+   "\0"
+   /* _mesa_function_pool[32742]: RasterPos4iv (offset 83) */
+   "p\0"
+   "glRasterPos4iv\0"
+   "\0"
+   /* _mesa_function_pool[32760]: Enable (offset 215) */
+   "i\0"
+   "glEnable\0"
+   "\0"
+   /* _mesa_function_pool[32772]: LineStipple (offset 167) */
+   "ii\0"
+   "glLineStipple\0"
+   "\0"
+   /* _mesa_function_pool[32790]: VertexAttribs4svNV (will be remapped) */
+   "iip\0"
+   "glVertexAttribs4svNV\0"
+   "\0"
+   /* _mesa_function_pool[32816]: EdgeFlagPointerListIBM (dynamic) */
+   "ipi\0"
+   "glEdgeFlagPointerListIBM\0"
+   "\0"
+   /* _mesa_function_pool[32846]: UniformMatrix3x2fv (will be remapped) */
+   "iiip\0"
+   "glUniformMatrix3x2fv\0"
+   "\0"
+   /* _mesa_function_pool[32873]: GetMinmaxParameterfv (offset 365) */
+   "iip\0"
+   "glGetMinmaxParameterfv\0"
+   "glGetMinmaxParameterfvEXT\0"
+   "\0"
+   /* _mesa_function_pool[32927]: VertexAttrib1fvARB (will be remapped) */
+   "ip\0"
+   "glVertexAttrib1fv\0"
+   "glVertexAttrib1fvARB\0"
+   "\0"
+   /* _mesa_function_pool[32970]: GenBuffersARB (will be remapped) */
+   "ip\0"
+   "glGenBuffers\0"
+   "glGenBuffersARB\0"
+   "\0"
+   /* _mesa_function_pool[33003]: VertexAttribs1svNV (will be remapped) */
+   "iip\0"
+   "glVertexAttribs1svNV\0"
+   "\0"
+   /* _mesa_function_pool[33029]: Vertex3fv (offset 137) */
+   "p\0"
+   "glVertex3fv\0"
+   "\0"
+   /* _mesa_function_pool[33044]: GetTexBumpParameterivATI (will be remapped) */
+   "ip\0"
+   "glGetTexBumpParameterivATI\0"
+   "\0"
+   /* _mesa_function_pool[33075]: Binormal3bEXT (dynamic) */
+   "iii\0"
+   "glBinormal3bEXT\0"
+   "\0"
+   /* _mesa_function_pool[33096]: FragmentMaterialivSGIX (dynamic) */
+   "iip\0"
+   "glFragmentMaterialivSGIX\0"
+   "\0"
+   /* _mesa_function_pool[33126]: IsRenderbufferEXT (will be remapped) */
+   "i\0"
+   "glIsRenderbuffer\0"
+   "glIsRenderbufferEXT\0"
+   "\0"
+   /* _mesa_function_pool[33166]: GenProgramsNV (will be remapped) */
+   "ip\0"
+   "glGenProgramsARB\0"
+   "glGenProgramsNV\0"
+   "\0"
+   /* _mesa_function_pool[33203]: VertexAttrib4dvNV (will be remapped) */
+   "ip\0"
+   "glVertexAttrib4dvNV\0"
+   "\0"
+   /* _mesa_function_pool[33227]: EndFragmentShaderATI (will be remapped) */
+   "\0"
+   "glEndFragmentShaderATI\0"
+   "\0"
+   /* _mesa_function_pool[33252]: Binormal3iEXT (dynamic) */
+   "iii\0"
+   "glBinormal3iEXT\0"
+   "\0"
+   /* _mesa_function_pool[33273]: WindowPos2fMESA (will be remapped) */
+   "ff\0"
+   "glWindowPos2f\0"
+   "glWindowPos2fARB\0"
+   "glWindowPos2fMESA\0"
+   "\0"
+   ;
+
+/* these functions need to be remapped */
+static const struct gl_function_pool_remap MESA_remap_table_functions[] = {
+   {  1616, AttachShader_remap_index },
+   {  9893, CreateProgram_remap_index },
+   { 22964, CreateShader_remap_index },
+   { 25451, DeleteProgram_remap_index },
+   { 18608, DeleteShader_remap_index },
+   { 23465, DetachShader_remap_index },
+   { 17974, GetAttachedShaders_remap_index },
+   {  4856, GetProgramInfoLog_remap_index },
+   {   444, GetProgramiv_remap_index },
+   {  6529, GetShaderInfoLog_remap_index },
+   { 31140, GetShaderiv_remap_index },
+   { 13387, IsProgram_remap_index },
+   { 12308, IsShader_remap_index },
+   { 10023, StencilFuncSeparate_remap_index },
+   {  3960, StencilMaskSeparate_remap_index },
+   {  7594, StencilOpSeparate_remap_index },
+   { 22252, UniformMatrix2x3fv_remap_index },
+   {  2886, UniformMatrix2x4fv_remap_index },
+   { 32846, UniformMatrix3x2fv_remap_index },
+   { 30462, UniformMatrix3x4fv_remap_index },
+   { 16264, UniformMatrix4x2fv_remap_index },
+   {  3302, UniformMatrix4x3fv_remap_index },
+   {  5017, ClampColor_remap_index },
+   { 18028, ClearBufferfi_remap_index },
+   { 17470, ClearBufferfv_remap_index },
+   { 29485, ClearBufferiv_remap_index },
+   { 13592, ClearBufferuiv_remap_index },
+   { 19891, GetStringi_remap_index },
+   {  2827, TexBuffer_remap_index },
+   {   977, FramebufferTexture_remap_index },
+   { 26477, GetBufferParameteri64v_remap_index },
+   { 10123, GetInteger64i_v_remap_index },
+   { 23278, VertexAttribDivisor_remap_index },
+   {  9911, LoadTransposeMatrixdARB_remap_index },
+   { 30869, LoadTransposeMatrixfARB_remap_index },
+   {  5637, MultTransposeMatrixdARB_remap_index },
+   { 23652, MultTransposeMatrixfARB_remap_index },
+   {   255, SampleCoverageARB_remap_index },
+   {  5821, CompressedTexImage1DARB_remap_index },
+   { 24180, CompressedTexImage2DARB_remap_index },
+   {  4023, CompressedTexImage3DARB_remap_index },
+   { 18325, CompressedTexSubImage1DARB_remap_index },
+   {  2089, CompressedTexSubImage2DARB_remap_index },
+   { 20313, CompressedTexSubImage3DARB_remap_index },
+   { 28621, GetCompressedTexImageARB_remap_index },
+   {  3868, DisableVertexAttribArrayARB_remap_index },
+   { 30027, EnableVertexAttribArrayARB_remap_index },
+   { 31944, GetProgramEnvParameterdvARB_remap_index },
+   { 23532, GetProgramEnvParameterfvARB_remap_index },
+   { 27506, GetProgramLocalParameterdvARB_remap_index },
+   {  8036, GetProgramLocalParameterfvARB_remap_index },
+   { 18459, GetProgramStringARB_remap_index },
+   { 27701, GetProgramivARB_remap_index },
+   { 20508, GetVertexAttribdvARB_remap_index },
+   { 16072, GetVertexAttribfvARB_remap_index },
+   {  9735, GetVertexAttribivARB_remap_index },
+   { 19372, ProgramEnvParameter4dARB_remap_index },
+   { 25201, ProgramEnvParameter4dvARB_remap_index },
+   { 16792, ProgramEnvParameter4fARB_remap_index },
+   {  8935, ProgramEnvParameter4fvARB_remap_index },
+   {  3986, ProgramLocalParameter4dARB_remap_index },
+   { 13097, ProgramLocalParameter4dvARB_remap_index },
+   { 29506, ProgramLocalParameter4fARB_remap_index },
+   { 25837, ProgramLocalParameter4fvARB_remap_index },
+   { 28375, ProgramStringARB_remap_index },
+   { 19622, VertexAttrib1dARB_remap_index },
+   { 15726, VertexAttrib1dvARB_remap_index },
+   {  4161, VertexAttrib1fARB_remap_index },
+   { 32927, VertexAttrib1fvARB_remap_index },
+   {  7120, VertexAttrib1sARB_remap_index },
+   {  2263, VertexAttrib1svARB_remap_index },
+   { 15157, VertexAttrib2dARB_remap_index },
+   { 17491, VertexAttrib2dvARB_remap_index },
+   {  1635, VertexAttrib2fARB_remap_index },
+   { 17604, VertexAttrib2fvARB_remap_index },
+   { 32553, VertexAttrib2sARB_remap_index },
+   { 31581, VertexAttrib2svARB_remap_index },
+   { 11274, VertexAttrib3dARB_remap_index },
+   {  8602, VertexAttrib3dvARB_remap_index },
+   {  1722, VertexAttrib3fARB_remap_index },
+   { 22515, VertexAttrib3fvARB_remap_index },
+   { 28222, VertexAttrib3sARB_remap_index },
+   { 20250, VertexAttrib3svARB_remap_index },
+   {  4882, VertexAttrib4NbvARB_remap_index },
+   { 17851, VertexAttrib4NivARB_remap_index },
+   { 22470, VertexAttrib4NsvARB_remap_index },
+   { 23484, VertexAttrib4NubARB_remap_index },
+   { 31827, VertexAttrib4NubvARB_remap_index },
+   { 19033, VertexAttrib4NuivARB_remap_index },
+   {  3175, VertexAttrib4NusvARB_remap_index },
+   { 10863, VertexAttrib4bvARB_remap_index },
+   { 26879, VertexAttrib4dARB_remap_index },
+   { 21272, VertexAttrib4dvARB_remap_index },
+   { 11428, VertexAttrib4fARB_remap_index },
+   { 11832, VertexAttrib4fvARB_remap_index },
+   { 10239, VertexAttrib4ivARB_remap_index },
+   { 17284, VertexAttrib4sARB_remap_index },
+   { 31055, VertexAttrib4svARB_remap_index },
+   { 16597, VertexAttrib4ubvARB_remap_index },
+   { 30351, VertexAttrib4uivARB_remap_index },
+   { 20061, VertexAttrib4usvARB_remap_index },
+   { 22067, VertexAttribPointerARB_remap_index },
+   { 32687, BindBufferARB_remap_index },
+   {  6827, BufferDataARB_remap_index },
+   {  1537, BufferSubDataARB_remap_index },
+   { 30632, DeleteBuffersARB_remap_index },
+   { 32970, GenBuffersARB_remap_index },
+   { 17647, GetBufferParameterivARB_remap_index },
+   { 16744, GetBufferPointervARB_remap_index },
+   {  1490, GetBufferSubDataARB_remap_index },
+   { 30299, IsBufferARB_remap_index },
+   { 26321, MapBufferARB_remap_index },
+   { 31270, UnmapBufferARB_remap_index },
+   {   351, BeginQueryARB_remap_index },
+   { 19717, DeleteQueriesARB_remap_index },
+   { 12159, EndQueryARB_remap_index },
+   { 29100, GenQueriesARB_remap_index },
+   {  1981, GetQueryObjectivARB_remap_index },
+   { 17328, GetQueryObjectuivARB_remap_index },
+   {  1779, GetQueryivARB_remap_index },
+   { 19968, IsQueryARB_remap_index },
+   {  8212, AttachObjectARB_remap_index },
+   { 18570, CompileShaderARB_remap_index },
+   {  3244, CreateProgramObjectARB_remap_index },
+   {  6772, CreateShaderObjectARB_remap_index },
+   { 14459, DeleteObjectARB_remap_index },
+   { 23971, DetachObjectARB_remap_index },
+   { 11904, GetActiveUniformARB_remap_index },
+   {  9410, GetAttachedObjectsARB_remap_index },
+   {  9717, GetHandleARB_remap_index },
+   { 32720, GetInfoLogARB_remap_index },
+   { 31898, GetObjectParameterfvARB_remap_index },
+   { 27380, GetObjectParameterivARB_remap_index },
+   { 28858, GetShaderSourceARB_remap_index },
+   { 28082, GetUniformLocationARB_remap_index },
+   { 23754, GetUniformfvARB_remap_index },
+   { 12672, GetUniformivARB_remap_index },
+   { 20106, LinkProgramARB_remap_index },
+   { 20164, ShaderSourceARB_remap_index },
+   {  7494, Uniform1fARB_remap_index },
+   { 29715, Uniform1fvARB_remap_index },
+   { 22036, Uniform1iARB_remap_index },
+   { 20961, Uniform1ivARB_remap_index },
+   {  2212, Uniform2fARB_remap_index },
+   { 14295, Uniform2fvARB_remap_index },
+   { 26208, Uniform2iARB_remap_index },
+   {  2332, Uniform2ivARB_remap_index },
+   { 18680, Uniform3fARB_remap_index },
+   {  9440, Uniform3fvARB_remap_index },
+   {  6383, Uniform3iARB_remap_index },
+   { 16850, Uniform3ivARB_remap_index },
+   { 19178, Uniform4fARB_remap_index },
+   { 23618, Uniform4fvARB_remap_index },
+   { 24880, Uniform4iARB_remap_index },
+   { 20474, Uniform4ivARB_remap_index },
+   {  8264, UniformMatrix2fvARB_remap_index },
+   {    17, UniformMatrix3fvARB_remap_index },
+   {  2729, UniformMatrix4fvARB_remap_index },
+   { 25313, UseProgramObjectARB_remap_index },
+   { 14845, ValidateProgramARB_remap_index },
+   { 21315, BindAttribLocationARB_remap_index },
+   {  4927, GetActiveAttribARB_remap_index },
+   { 16531, GetAttribLocationARB_remap_index },
+   { 29433, DrawBuffersARB_remap_index },
+   { 29296, ClampColorARB_remap_index },
+   { 17896, DrawArraysInstancedARB_remap_index },
+   {  6444, DrawElementsInstancedARB_remap_index },
+   { 13202, RenderbufferStorageMultisample_remap_index },
+   { 13673, FramebufferTextureARB_remap_index },
+   { 25739, FramebufferTextureFaceARB_remap_index },
+   { 24120, ProgramParameteriARB_remap_index },
+   { 23436, VertexAttribDivisorARB_remap_index },
+   { 19226, FlushMappedBufferRange_remap_index },
+   { 27797, MapBufferRange_remap_index },
+   { 16375, BindVertexArray_remap_index },
+   { 14668, GenVertexArrays_remap_index },
+   { 30229, CopyBufferSubData_remap_index },
+   { 31159, ClientWaitSync_remap_index },
+   {  2648, DeleteSync_remap_index },
+   {  7161, FenceSync_remap_index },
+   { 15216, GetInteger64v_remap_index },
+   { 22577, GetSynciv_remap_index },
+   { 29372, IsSync_remap_index },
+   {  9358, WaitSync_remap_index },
+   {  3836, DrawElementsBaseVertex_remap_index },
+   { 30564, DrawRangeElementsBaseVertex_remap_index },
+   { 26352, MultiDrawElementsBaseVertex_remap_index },
+   { 32103, BlendEquationSeparateiARB_remap_index },
+   { 17740, BlendEquationiARB_remap_index },
+   { 12641, BlendFuncSeparateiARB_remap_index },
+   {  9783, BlendFunciARB_remap_index },
+   {  5078, BindTransformFeedback_remap_index },
+   {  3271, DeleteTransformFeedbacks_remap_index },
+   {  6416, DrawTransformFeedback_remap_index },
+   {  9577, GenTransformFeedbacks_remap_index },
+   { 28265, IsTransformFeedback_remap_index },
+   { 25932, PauseTransformFeedback_remap_index },
+   {  5557, ResumeTransformFeedback_remap_index },
+   { 21635, ClearDepthf_remap_index },
+   {  6720, DepthRangef_remap_index },
+   { 14480, GetShaderPrecisionFormat_remap_index },
+   {  9963, ReleaseShaderCompiler_remap_index },
+   { 10906, ShaderBinary_remap_index },
+   {  5425, PolygonOffsetEXT_remap_index },
+   { 23199, GetPixelTexGenParameterfvSGIS_remap_index },
+   {  4404, GetPixelTexGenParameterivSGIS_remap_index },
+   { 22932, PixelTexGenParameterfSGIS_remap_index },
+   {   663, PixelTexGenParameterfvSGIS_remap_index },
+   { 12710, PixelTexGenParameteriSGIS_remap_index },
+   { 13815, PixelTexGenParameterivSGIS_remap_index },
+   { 18224, SampleMaskSGIS_remap_index },
+   { 19908, SamplePatternSGIS_remap_index },
+   { 26281, ColorPointerEXT_remap_index },
+   { 17534, EdgeFlagPointerEXT_remap_index },
+   {  6037, IndexPointerEXT_remap_index },
+   {  6117, NormalPointerEXT_remap_index },
+   { 15810, TexCoordPointerEXT_remap_index },
+   {  6950, VertexPointerEXT_remap_index },
+   {  3638, PointParameterfEXT_remap_index },
+   {  7801, PointParameterfvEXT_remap_index },
+   { 31996, LockArraysEXT_remap_index },
+   { 14909, UnlockArraysEXT_remap_index },
+   {  1306, SecondaryColor3bEXT_remap_index },
+   {  7960, SecondaryColor3bvEXT_remap_index },
+   { 10416, SecondaryColor3dEXT_remap_index },
+   { 25509, SecondaryColor3dvEXT_remap_index },
+   { 28131, SecondaryColor3fEXT_remap_index },
+   { 18261, SecondaryColor3fvEXT_remap_index },
+   {   509, SecondaryColor3iEXT_remap_index },
+   { 16120, SecondaryColor3ivEXT_remap_index },
+   { 10051, SecondaryColor3sEXT_remap_index },
+   { 30823, SecondaryColor3svEXT_remap_index },
+   { 27216, SecondaryColor3ubEXT_remap_index },
+   { 21206, SecondaryColor3ubvEXT_remap_index },
+   { 12952, SecondaryColor3uiEXT_remap_index },
+   { 22819, SecondaryColor3uivEXT_remap_index },
+   { 25789, SecondaryColor3usEXT_remap_index },
+   { 13025, SecondaryColor3usvEXT_remap_index },
+   { 11775, SecondaryColorPointerEXT_remap_index },
+   { 25603, MultiDrawArraysEXT_remap_index },
+   { 20896, MultiDrawElementsEXT_remap_index },
+   { 21091, FogCoordPointerEXT_remap_index },
+   {  4553, FogCoorddEXT_remap_index },
+   { 31397, FogCoorddvEXT_remap_index },
+   {  4670, FogCoordfEXT_remap_index },
+   { 27139, FogCoordfvEXT_remap_index },
+   { 19130, PixelTexGenSGIX_remap_index },
+   { 27724, BlendFuncSeparateEXT_remap_index },
+   {  6862, FlushVertexArrayRangeNV_remap_index },
+   {  5374, VertexArrayRangeNV_remap_index },
+   { 28196, CombinerInputNV_remap_index },
+   {  2155, CombinerOutputNV_remap_index },
+   { 30976, CombinerParameterfNV_remap_index },
+   {  5248, CombinerParameterfvNV_remap_index },
+   { 22301, CombinerParameteriNV_remap_index },
+   { 32445, CombinerParameterivNV_remap_index },
+   {  7238, FinalCombinerInputNV_remap_index },
+   {  9804, GetCombinerInputParameterfvNV_remap_index },
+   { 32282, GetCombinerInputParameterivNV_remap_index },
+   {   216, GetCombinerOutputParameterfvNV_remap_index },
+   { 13776, GetCombinerOutputParameterivNV_remap_index },
+   {  6624, GetFinalCombinerInputParameterfvNV_remap_index },
+   { 24752, GetFinalCombinerInputParameterivNV_remap_index },
+   { 12619, ResizeBuffersMESA_remap_index },
+   { 11101, WindowPos2dMESA_remap_index },
+   {  1099, WindowPos2dvMESA_remap_index },
+   { 33273, WindowPos2fMESA_remap_index },
+   {  7905, WindowPos2fvMESA_remap_index },
+   { 18171, WindowPos2iMESA_remap_index },
+   { 20381, WindowPos2ivMESA_remap_index },
+   { 20995, WindowPos2sMESA_remap_index },
+   {  5735, WindowPos2svMESA_remap_index },
+   {  7730, WindowPos3dMESA_remap_index },
+   { 14023, WindowPos3dvMESA_remap_index },
+   {   555, WindowPos3fMESA_remap_index },
+   { 14970, WindowPos3fvMESA_remap_index },
+   { 24013, WindowPos3iMESA_remap_index },
+   { 30174, WindowPos3ivMESA_remap_index },
+   { 18825, WindowPos3sMESA_remap_index },
+   { 31653, WindowPos3svMESA_remap_index },
+   { 11052, WindowPos4dMESA_remap_index },
+   { 16988, WindowPos4dvMESA_remap_index },
+   { 13982, WindowPos4fMESA_remap_index },
+   { 30730, WindowPos4fvMESA_remap_index },
+   { 30327, WindowPos4iMESA_remap_index },
+   { 12422, WindowPos4ivMESA_remap_index },
+   { 19009, WindowPos4sMESA_remap_index },
+   {  3222, WindowPos4svMESA_remap_index },
+   { 26847, MultiModeDrawArraysIBM_remap_index },
+   { 28971, MultiModeDrawElementsIBM_remap_index },
+   { 12187, DeleteFencesNV_remap_index },
+   { 28043, FinishFenceNV_remap_index },
+   {  3760, GenFencesNV_remap_index },
+   { 16968, GetFenceivNV_remap_index },
+   {  8197, IsFenceNV_remap_index },
+   { 13703, SetFenceNV_remap_index },
+   {  4217, TestFenceNV_remap_index },
+   { 31624, AreProgramsResidentNV_remap_index },
+   { 31018, BindProgramNV_remap_index },
+   { 25872, DeleteProgramsNV_remap_index },
+   { 21424, ExecuteProgramNV_remap_index },
+   { 33166, GenProgramsNV_remap_index },
+   { 23304, GetProgramParameterdvNV_remap_index },
+   { 10478, GetProgramParameterfvNV_remap_index },
+   { 26255, GetProgramStringNV_remap_index },
+   { 24390, GetProgramivNV_remap_index },
+   { 23567, GetTrackMatrixivNV_remap_index },
+   { 26049, GetVertexAttribPointervNV_remap_index },
+   { 24685, GetVertexAttribdvNV_remap_index },
+   {  9253, GetVertexAttribfvNV_remap_index },
+   { 18432, GetVertexAttribivNV_remap_index },
+   { 19256, IsProgramNV_remap_index },
+   {  9336, LoadProgramNV_remap_index },
+   { 27820, ProgramParameters4dvNV_remap_index },
+   { 24320, ProgramParameters4fvNV_remap_index },
+   { 20685, RequestResidentProgramsNV_remap_index },
+   { 22279, TrackMatrixNV_remap_index },
+   { 32259, VertexAttrib1dNV_remap_index },
+   { 13614, VertexAttrib1dvNV_remap_index },
+   { 28477, VertexAttrib1fNV_remap_index },
+   {  2454, VertexAttrib1fvNV_remap_index },
+   { 30787, VertexAttrib1sNV_remap_index },
+   { 15043, VertexAttrib1svNV_remap_index },
+   {  4832, VertexAttrib2dNV_remap_index },
+   { 13507, VertexAttrib2dvNV_remap_index },
+   { 20140, VertexAttrib2fNV_remap_index },
+   { 13073, VertexAttrib2fvNV_remap_index },
+   {  5947, VertexAttrib2sNV_remap_index },
+   { 18879, VertexAttrib2svNV_remap_index },
+   { 11249, VertexAttrib3dNV_remap_index },
+   { 31874, VertexAttrib3dvNV_remap_index },
+   { 10290, VertexAttrib3fNV_remap_index },
+   { 24712, VertexAttrib3fvNV_remap_index },
+   { 22122, VertexAttrib3sNV_remap_index },
+   { 23594, VertexAttrib3svNV_remap_index },
+   { 28945, VertexAttrib4dNV_remap_index },
+   { 33203, VertexAttrib4dvNV_remap_index },
+   {  4454, VertexAttrib4fNV_remap_index },
+   {  9386, VertexAttrib4fvNV_remap_index },
+   { 26731, VertexAttrib4sNV_remap_index },
+   {  1448, VertexAttrib4svNV_remap_index },
+   {  4990, VertexAttrib4ubNV_remap_index },
+   {   817, VertexAttrib4ubvNV_remap_index },
+   { 21604, VertexAttribPointerNV_remap_index },
+   {  2306, VertexAttribs1dvNV_remap_index },
+   { 26137, VertexAttribs1fvNV_remap_index },
+   { 33003, VertexAttribs1svNV_remap_index },
+   { 10315, VertexAttribs2dvNV_remap_index },
+   { 25274, VertexAttribs2fvNV_remap_index },
+   { 17560, VertexAttribs2svNV_remap_index },
+   {  5276, VertexAttribs3dvNV_remap_index },
+   {  2186, VertexAttribs3fvNV_remap_index },
+   { 29922, VertexAttribs3svNV_remap_index },
+   { 26821, VertexAttribs4dvNV_remap_index },
+   {  5348, VertexAttribs4fvNV_remap_index },
+   { 32790, VertexAttribs4svNV_remap_index },
+   { 29670, VertexAttribs4ubvNV_remap_index },
+   { 26923, GetTexBumpParameterfvATI_remap_index },
+   { 33044, GetTexBumpParameterivATI_remap_index },
+   { 18542, TexBumpParameterfvATI_remap_index },
+   { 20556, TexBumpParameterivATI_remap_index },
+   { 15589, AlphaFragmentOp1ATI_remap_index },
+   { 25555, AlphaFragmentOp2ATI_remap_index },
+   { 24628, AlphaFragmentOp3ATI_remap_index },
+   { 29849, BeginFragmentShaderATI_remap_index },
+   { 31217, BindFragmentShaderATI_remap_index },
+   { 23723, ColorFragmentOp1ATI_remap_index },
+   {  4332, ColorFragmentOp2ATI_remap_index },
+   { 31519, ColorFragmentOp3ATI_remap_index },
+   {  5514, DeleteFragmentShaderATI_remap_index },
+   { 33227, EndFragmentShaderATI_remap_index },
+   { 32473, GenFragmentShadersATI_remap_index },
+   { 25428, PassTexCoordATI_remap_index },
+   {  6930, SampleMapATI_remap_index },
+   { 27034, SetFragmentShaderConstantATI_remap_index },
+   {   402, PointParameteriNV_remap_index },
+   { 14184, PointParameterivNV_remap_index },
+   { 28784, ActiveStencilFaceEXT_remap_index },
+   { 27480, BindVertexArrayAPPLE_remap_index },
+   {  2776, DeleteVertexArraysAPPLE_remap_index },
+   { 18001, GenVertexArraysAPPLE_remap_index },
+   { 23369, IsVertexArrayAPPLE_remap_index },
+   {   858, GetProgramNamedParameterdvNV_remap_index },
+   {  3601, GetProgramNamedParameterfvNV_remap_index },
+   { 26954, ProgramNamedParameter4dNV_remap_index },
+   { 14543, ProgramNamedParameter4dvNV_remap_index },
+   {  8869, ProgramNamedParameter4fNV_remap_index },
+   { 11740, ProgramNamedParameter4fvNV_remap_index },
+   { 16899, PrimitiveRestartIndexNV_remap_index },
+   { 30707, PrimitiveRestartNV_remap_index },
+   { 24299, DepthBoundsEXT_remap_index },
+   {  1198, BlendEquationSeparateEXT_remap_index },
+   { 14744, BindFramebufferEXT_remap_index },
+   { 25648, BindRenderbufferEXT_remap_index },
+   {  9633, CheckFramebufferStatusEXT_remap_index },
+   { 22620, DeleteFramebuffersEXT_remap_index },
+   { 31776, DeleteRenderbuffersEXT_remap_index },
+   { 13531, FramebufferRenderbufferEXT_remap_index },
+   { 13720, FramebufferTexture1DEXT_remap_index },
+   { 11534, FramebufferTexture2DEXT_remap_index },
+   { 11154, FramebufferTexture3DEXT_remap_index },
+   { 23235, GenFramebuffersEXT_remap_index },
+   { 17425, GenRenderbuffersEXT_remap_index },
+   {  6666, GenerateMipmapEXT_remap_index },
+   { 21697, GetFramebufferAttachmentParameterivEXT_remap_index },
+   { 32379, GetRenderbufferParameterivEXT_remap_index },
+   { 20436, IsFramebufferEXT_remap_index },
+   { 33126, IsRenderbufferEXT_remap_index },
+   {  8144, RenderbufferStorageEXT_remap_index },
+   {   734, BlitFramebufferEXT_remap_index },
+   { 14329, BufferParameteriAPPLE_remap_index },
+   { 19288, FlushMappedBufferRangeAPPLE_remap_index },
+   {  1854, BindFragDataLocationEXT_remap_index },
+   { 24412, GetFragDataLocationEXT_remap_index },
+   { 10593, GetUniformuivEXT_remap_index },
+   {  2972, GetVertexAttribIivEXT_remap_index },
+   { 27991, GetVertexAttribIuivEXT_remap_index },
+   { 12020, Uniform1uiEXT_remap_index },
+   { 27905, Uniform1uivEXT_remap_index },
+   { 22218, Uniform2uiEXT_remap_index },
+   {  4296, Uniform2uivEXT_remap_index },
+   { 29224, Uniform3uiEXT_remap_index },
+   { 14690, Uniform3uivEXT_remap_index },
+   {  3525, Uniform4uiEXT_remap_index },
+   {  8645, Uniform4uivEXT_remap_index },
+   { 18389, VertexAttribI1iEXT_remap_index },
+   {  1004, VertexAttribI1ivEXT_remap_index },
+   {  2555, VertexAttribI1uiEXT_remap_index },
+   { 12801, VertexAttribI1uivEXT_remap_index },
+   {    81, VertexAttribI2iEXT_remap_index },
+   { 23835, VertexAttribI2ivEXT_remap_index },
+   {  5302, VertexAttribI2uiEXT_remap_index },
+   {  4715, VertexAttribI2uivEXT_remap_index },
+   { 26523, VertexAttribI3iEXT_remap_index },
+   { 30519, VertexAttribI3ivEXT_remap_index },
+   {  3379, VertexAttribI3uiEXT_remap_index },
+   { 30415, VertexAttribI3uivEXT_remap_index },
+   { 21948, VertexAttribI4bvEXT_remap_index },
+   { 14622, VertexAttribI4iEXT_remap_index },
+   { 32045, VertexAttribI4ivEXT_remap_index },
+   { 13434, VertexAttribI4svEXT_remap_index },
+   { 16484, VertexAttribI4ubvEXT_remap_index },
+   { 16183, VertexAttribI4uiEXT_remap_index },
+   {  5448, VertexAttribI4uivEXT_remap_index },
+   { 11317, VertexAttribI4usvEXT_remap_index },
+   { 18486, VertexAttribIPointerEXT_remap_index },
+   {  3066, FramebufferTextureLayerEXT_remap_index },
+   {  5172, ColorMaskIndexedEXT_remap_index },
+   { 18903, DisableIndexedEXT_remap_index },
+   { 26568, EnableIndexedEXT_remap_index },
+   { 21652, GetBooleanIndexedvEXT_remap_index },
+   { 10928, GetIntegerIndexedvEXT_remap_index },
+   { 22696, IsEnabledIndexedEXT_remap_index },
+   { 22596, ClearColorIiEXT_remap_index },
+   {  3475, ClearColorIuiEXT_remap_index },
+   {  9843, GetTexParameterIivEXT_remap_index },
+   {  5895, GetTexParameterIuivEXT_remap_index },
+   {  3022, TexParameterIivEXT_remap_index },
+   { 26390, TexParameterIuivEXT_remap_index },
+   {  4583, BeginConditionalRenderNV_remap_index },
+   { 25378, EndConditionalRenderNV_remap_index },
+   {  9280, BeginTransformFeedbackEXT_remap_index },
+   { 18938, BindBufferBaseEXT_remap_index },
+   { 18797, BindBufferOffsetEXT_remap_index },
+   { 12247, BindBufferRangeEXT_remap_index },
+   { 14244, EndTransformFeedbackEXT_remap_index },
+   { 10791, GetTransformFeedbackVaryingEXT_remap_index },
+   { 20741, TransformFeedbackVaryingsEXT_remap_index },
+   { 29571, ProvokingVertexEXT_remap_index },
+   { 10739, GetTexParameterPointervAPPLE_remap_index },
+   {  5034, TextureRangeAPPLE_remap_index },
+   { 11606, GetObjectParameterivAPPLE_remap_index },
+   { 19863, ObjectPurgeableAPPLE_remap_index },
+   {  5689, ObjectUnpurgeableAPPLE_remap_index },
+   { 17247, ActiveProgramEXT_remap_index },
+   { 17218, CreateShaderProgramEXT_remap_index },
+   { 28569, UseShaderProgramEXT_remap_index },
+   { 16463, TextureBarrierNV_remap_index },
+   { 28810, StencilFuncSeparateATI_remap_index },
+   { 18090, ProgramEnvParameters4fvEXT_remap_index },
+   { 17112, ProgramLocalParameters4fvEXT_remap_index },
+   { 14112, GetQueryObjecti64vEXT_remap_index },
+   { 10341, GetQueryObjectui64vEXT_remap_index },
+   { 23792, EGLImageTargetRenderbufferStorageOES_remap_index },
+   { 12126, EGLImageTargetTexture2DOES_remap_index },
+   {    -1, -1 }
+};
+
+/* these functions are in the ABI, but have alternative names */
+static const struct gl_function_remap MESA_alt_functions[] = {
+   /* from GL_EXT_blend_color */
+   {  2694, _gloffset_BlendColor },
+   /* from GL_EXT_blend_minmax */
+   { 11211, _gloffset_BlendEquation },
+   /* from GL_EXT_color_subtable */
+   { 17010, _gloffset_ColorSubTable },
+   { 31708, _gloffset_CopyColorSubTable },
+   /* from GL_EXT_convolution */
+   {   296, _gloffset_ConvolutionFilter1D },
+   {  2493, _gloffset_CopyConvolutionFilter1D },
+   {  4097, _gloffset_GetConvolutionParameteriv },
+   {  8493, _gloffset_ConvolutionFilter2D },
+   {  8695, _gloffset_ConvolutionParameteriv },
+   {  9155, _gloffset_ConvolutionParameterfv },
+   { 20584, _gloffset_GetSeparableFilter },
+   { 24067, _gloffset_SeparableFilter2D },
+   { 24930, _gloffset_ConvolutionParameteri },
+   { 25053, _gloffset_ConvolutionParameterf },
+   { 26757, _gloffset_GetConvolutionParameterfv },
+   { 27646, _gloffset_GetConvolutionFilter },
+   { 30111, _gloffset_CopyConvolutionFilter2D },
+   /* from GL_EXT_copy_texture */
+   { 15103, _gloffset_CopyTexSubImage3D },
+   { 16697, _gloffset_CopyTexImage2D },
+   { 24538, _gloffset_CopyTexImage1D },
+   { 27327, _gloffset_CopyTexSubImage2D },
+   { 29749, _gloffset_CopyTexSubImage1D },
+   /* from GL_EXT_draw_range_elements */
+   {  9492, _gloffset_DrawRangeElements },
+   /* from GL_EXT_histogram */
+   {   895, _gloffset_Histogram },
+   {  3561, _gloffset_ResetHistogram },
+   {  9989, _gloffset_GetMinmax },
+   { 15437, _gloffset_GetHistogramParameterfv },
+   { 24463, _gloffset_GetMinmaxParameteriv },
+   { 26647, _gloffset_ResetMinmax },
+   { 27543, _gloffset_GetHistogramParameteriv },
+   { 28744, _gloffset_GetHistogram },
+   { 31333, _gloffset_Minmax },
+   { 32873, _gloffset_GetMinmaxParameterfv },
+   /* from GL_EXT_paletted_texture */
+   {  8355, _gloffset_ColorTable },
+   { 15283, _gloffset_GetColorTable },
+   { 22982, _gloffset_GetColorTableParameterfv },
+   { 25109, _gloffset_GetColorTableParameteriv },
+   /* from GL_EXT_subtexture */
+   {  7076, _gloffset_TexSubImage1D },
+   { 10666, _gloffset_TexSubImage2D },
+   /* from GL_EXT_texture3D */
+   {  1813, _gloffset_TexImage3D },
+   { 22751, _gloffset_TexSubImage3D },
+   /* from GL_EXT_texture_object */
+   {  3329, _gloffset_PrioritizeTextures },
+   {  7525, _gloffset_AreTexturesResident },
+   { 13638, _gloffset_GenTextures },
+   { 15769, _gloffset_DeleteTextures },
+   { 19569, _gloffset_IsTexture },
+   { 29814, _gloffset_BindTexture },
+   /* from GL_EXT_vertex_array */
+   { 24239, _gloffset_ArrayElement },
+   { 30921, _gloffset_GetPointerv },
+   { 32500, _gloffset_DrawArrays },
+   /* from GL_SGI_color_table */
+   {  7643, _gloffset_ColorTableParameteriv },
+   {  8355, _gloffset_ColorTable },
+   { 15283, _gloffset_GetColorTable },
+   { 15393, _gloffset_CopyColorTable },
+   { 19430, _gloffset_ColorTableParameterfv },
+   { 22982, _gloffset_GetColorTableParameterfv },
+   { 25109, _gloffset_GetColorTableParameteriv },
+   /* from GL_VERSION_1_3 */
+   {   464, _gloffset_MultiTexCoord3sARB },
+   {   696, _gloffset_ActiveTextureARB },
+   {  4234, _gloffset_MultiTexCoord1fvARB },
+   {  6142, _gloffset_MultiTexCoord3dARB },
+   {  6187, _gloffset_MultiTexCoord2iARB },
+   {  6311, _gloffset_MultiTexCoord2svARB },
+   {  8311, _gloffset_MultiTexCoord2fARB },
+   { 10371, _gloffset_MultiTexCoord3fvARB },
+   { 10973, _gloffset_MultiTexCoord4sARB },
+   { 11654, _gloffset_MultiTexCoord2dvARB },
+   { 12069, _gloffset_MultiTexCoord1svARB },
+   { 12480, _gloffset_MultiTexCoord3svARB },
+   { 12541, _gloffset_MultiTexCoord4iARB },
+   { 13342, _gloffset_MultiTexCoord3iARB },
+   { 14141, _gloffset_MultiTexCoord1dARB },
+   { 14358, _gloffset_MultiTexCoord3dvARB },
+   { 15637, _gloffset_MultiTexCoord3ivARB },
+   { 15682, _gloffset_MultiTexCoord2sARB },
+   { 17067, _gloffset_MultiTexCoord4ivARB },
+   { 19080, _gloffset_ClientActiveTextureARB },
+   { 21380, _gloffset_MultiTexCoord2dARB },
+   { 21817, _gloffset_MultiTexCoord4dvARB },
+   { 22173, _gloffset_MultiTexCoord4fvARB },
+   { 23123, _gloffset_MultiTexCoord3fARB },
+   { 25693, _gloffset_MultiTexCoord4dARB },
+   { 25959, _gloffset_MultiTexCoord1sARB },
+   { 26163, _gloffset_MultiTexCoord1dvARB },
+   { 27171, _gloffset_MultiTexCoord1ivARB },
+   { 27264, _gloffset_MultiTexCoord2ivARB },
+   { 27603, _gloffset_MultiTexCoord1iARB },
+   { 29019, _gloffset_MultiTexCoord4svARB },
+   { 29613, _gloffset_MultiTexCoord1fARB },
+   { 29876, _gloffset_MultiTexCoord4fARB },
+   { 32334, _gloffset_MultiTexCoord2fvARB },
+   {    -1, -1 }
+};
+
+#endif /* need_MESA_remap_table */
+
+#if defined(need_GL_3DFX_tbuffer)
+static const struct gl_function_remap GL_3DFX_tbuffer_functions[] = {
+   {  9213, -1 }, /* TbufferMask3DFX */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_APPLE_flush_buffer_range)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_APPLE_flush_buffer_range_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_APPLE_object_purgeable)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_APPLE_object_purgeable_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_APPLE_texture_range)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_APPLE_texture_range_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_APPLE_vertex_array_object)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_APPLE_vertex_array_object_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ARB_ES2_compatibility)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ARB_ES2_compatibility_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ARB_color_buffer_float)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ARB_color_buffer_float_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ARB_copy_buffer)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ARB_copy_buffer_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ARB_draw_buffers)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ARB_draw_buffers_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ARB_draw_buffers_blend)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ARB_draw_buffers_blend_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ARB_draw_elements_base_vertex)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ARB_draw_elements_base_vertex_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ARB_draw_instanced)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ARB_draw_instanced_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ARB_framebuffer_object)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ARB_framebuffer_object_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ARB_geometry_shader4)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ARB_geometry_shader4_functions[] = {
+   { 12444, -1 }, /* FramebufferTextureLayer */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ARB_instanced_arrays)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ARB_instanced_arrays_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ARB_map_buffer_range)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ARB_map_buffer_range_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ARB_matrix_palette)
+static const struct gl_function_remap GL_ARB_matrix_palette_functions[] = {
+   {  3812, -1 }, /* MatrixIndexusvARB */
+   { 13163, -1 }, /* MatrixIndexuivARB */
+   { 14513, -1 }, /* MatrixIndexPointerARB */
+   { 19818, -1 }, /* CurrentPaletteMatrixARB */
+   { 22867, -1 }, /* MatrixIndexubvARB */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ARB_multisample)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ARB_multisample_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ARB_occlusion_query)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ARB_occlusion_query_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ARB_point_parameters)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ARB_point_parameters_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ARB_provoking_vertex)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ARB_provoking_vertex_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ARB_shader_objects)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ARB_shader_objects_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ARB_sync)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ARB_sync_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ARB_texture_compression)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ARB_texture_compression_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ARB_transform_feedback2)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ARB_transform_feedback2_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ARB_transpose_matrix)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ARB_transpose_matrix_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ARB_vertex_array_object)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ARB_vertex_array_object_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ARB_vertex_blend)
+static const struct gl_function_remap GL_ARB_vertex_blend_functions[] = {
+   {  2435, -1 }, /* WeightubvARB */
+   {  6554, -1 }, /* WeightivARB */
+   { 11076, -1 }, /* WeightPointerARB */
+   { 13898, -1 }, /* WeightfvARB */
+   { 17586, -1 }, /* WeightbvARB */
+   { 21048, -1 }, /* WeightusvARB */
+   { 23993, -1 }, /* VertexBlendARB */
+   { 29697, -1 }, /* WeightsvARB */
+   { 31758, -1 }, /* WeightdvARB */
+   { 32534, -1 }, /* WeightuivARB */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ARB_vertex_buffer_object)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ARB_vertex_buffer_object_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ARB_vertex_program)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ARB_vertex_program_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ARB_vertex_shader)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ARB_vertex_shader_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ARB_window_pos)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ARB_window_pos_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ATI_blend_equation_separate)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ATI_blend_equation_separate_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ATI_draw_buffers)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ATI_draw_buffers_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ATI_envmap_bumpmap)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ATI_envmap_bumpmap_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ATI_fragment_shader)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ATI_fragment_shader_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_ATI_separate_stencil)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_ATI_separate_stencil_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_blend_color)
+static const struct gl_function_remap GL_EXT_blend_color_functions[] = {
+   {  2694, _gloffset_BlendColor },
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_blend_equation_separate)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_EXT_blend_equation_separate_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_blend_func_separate)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_EXT_blend_func_separate_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_blend_minmax)
+static const struct gl_function_remap GL_EXT_blend_minmax_functions[] = {
+   { 11211, _gloffset_BlendEquation },
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_color_subtable)
+static const struct gl_function_remap GL_EXT_color_subtable_functions[] = {
+   { 17010, _gloffset_ColorSubTable },
+   { 31708, _gloffset_CopyColorSubTable },
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_compiled_vertex_array)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_EXT_compiled_vertex_array_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_convolution)
+static const struct gl_function_remap GL_EXT_convolution_functions[] = {
+   {   296, _gloffset_ConvolutionFilter1D },
+   {  2493, _gloffset_CopyConvolutionFilter1D },
+   {  4097, _gloffset_GetConvolutionParameteriv },
+   {  8493, _gloffset_ConvolutionFilter2D },
+   {  8695, _gloffset_ConvolutionParameteriv },
+   {  9155, _gloffset_ConvolutionParameterfv },
+   { 20584, _gloffset_GetSeparableFilter },
+   { 24067, _gloffset_SeparableFilter2D },
+   { 24930, _gloffset_ConvolutionParameteri },
+   { 25053, _gloffset_ConvolutionParameterf },
+   { 26757, _gloffset_GetConvolutionParameterfv },
+   { 27646, _gloffset_GetConvolutionFilter },
+   { 30111, _gloffset_CopyConvolutionFilter2D },
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_coordinate_frame)
+static const struct gl_function_remap GL_EXT_coordinate_frame_functions[] = {
+   { 10510, -1 }, /* TangentPointerEXT */
+   { 12599, -1 }, /* Binormal3ivEXT */
+   { 13295, -1 }, /* Tangent3sEXT */
+   { 14578, -1 }, /* Tangent3fvEXT */
+   { 18778, -1 }, /* Tangent3dvEXT */
+   { 19516, -1 }, /* Binormal3bvEXT */
+   { 20637, -1 }, /* Binormal3dEXT */
+   { 22799, -1 }, /* Tangent3fEXT */
+   { 25002, -1 }, /* Binormal3sEXT */
+   { 25470, -1 }, /* Tangent3ivEXT */
+   { 25489, -1 }, /* Tangent3dEXT */
+   { 26436, -1 }, /* Binormal3svEXT */
+   { 27069, -1 }, /* Binormal3fEXT */
+   { 27957, -1 }, /* Binormal3dvEXT */
+   { 29276, -1 }, /* Tangent3iEXT */
+   { 30396, -1 }, /* Tangent3bvEXT */
+   { 30956, -1 }, /* Tangent3bEXT */
+   { 31481, -1 }, /* Binormal3fvEXT */
+   { 32233, -1 }, /* BinormalPointerEXT */
+   { 32638, -1 }, /* Tangent3svEXT */
+   { 33075, -1 }, /* Binormal3bEXT */
+   { 33252, -1 }, /* Binormal3iEXT */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_copy_texture)
+static const struct gl_function_remap GL_EXT_copy_texture_functions[] = {
+   { 15103, _gloffset_CopyTexSubImage3D },
+   { 16697, _gloffset_CopyTexImage2D },
+   { 24538, _gloffset_CopyTexImage1D },
+   { 27327, _gloffset_CopyTexSubImage2D },
+   { 29749, _gloffset_CopyTexSubImage1D },
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_cull_vertex)
+static const struct gl_function_remap GL_EXT_cull_vertex_functions[] = {
+   {  8844, -1 }, /* CullParameterdvEXT */
+   { 11699, -1 }, /* CullParameterfvEXT */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_depth_bounds_test)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_EXT_depth_bounds_test_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_draw_buffers2)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_EXT_draw_buffers2_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_draw_instanced)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_EXT_draw_instanced_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_draw_range_elements)
+static const struct gl_function_remap GL_EXT_draw_range_elements_functions[] = {
+   {  9492, _gloffset_DrawRangeElements },
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_fog_coord)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_EXT_fog_coord_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_framebuffer_blit)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_EXT_framebuffer_blit_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_framebuffer_multisample)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_EXT_framebuffer_multisample_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_framebuffer_object)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_EXT_framebuffer_object_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_gpu_program_parameters)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_EXT_gpu_program_parameters_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_gpu_shader4)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_EXT_gpu_shader4_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_histogram)
+static const struct gl_function_remap GL_EXT_histogram_functions[] = {
+   {   895, _gloffset_Histogram },
+   {  3561, _gloffset_ResetHistogram },
+   {  9989, _gloffset_GetMinmax },
+   { 15437, _gloffset_GetHistogramParameterfv },
+   { 24463, _gloffset_GetMinmaxParameteriv },
+   { 26647, _gloffset_ResetMinmax },
+   { 27543, _gloffset_GetHistogramParameteriv },
+   { 28744, _gloffset_GetHistogram },
+   { 31333, _gloffset_Minmax },
+   { 32873, _gloffset_GetMinmaxParameterfv },
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_index_func)
+static const struct gl_function_remap GL_EXT_index_func_functions[] = {
+   { 11485, -1 }, /* IndexFuncEXT */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_index_material)
+static const struct gl_function_remap GL_EXT_index_material_functions[] = {
+   { 21135, -1 }, /* IndexMaterialEXT */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_light_texture)
+static const struct gl_function_remap GL_EXT_light_texture_functions[] = {
+   { 26456, -1 }, /* ApplyTextureEXT */
+   { 26601, -1 }, /* TextureMaterialEXT */
+   { 26626, -1 }, /* TextureLightEXT */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_multi_draw_arrays)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_EXT_multi_draw_arrays_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_multisample)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_EXT_multisample_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_paletted_texture)
+static const struct gl_function_remap GL_EXT_paletted_texture_functions[] = {
+   {  8355, _gloffset_ColorTable },
+   { 15283, _gloffset_GetColorTable },
+   { 22982, _gloffset_GetColorTableParameterfv },
+   { 25109, _gloffset_GetColorTableParameteriv },
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_pixel_transform)
+static const struct gl_function_remap GL_EXT_pixel_transform_functions[] = {
+   { 21782, -1 }, /* PixelTransformParameterfEXT */
+   { 21862, -1 }, /* PixelTransformParameteriEXT */
+   { 30671, -1 }, /* PixelTransformParameterfvEXT */
+   { 32197, -1 }, /* PixelTransformParameterivEXT */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_point_parameters)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_EXT_point_parameters_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_polygon_offset)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_EXT_polygon_offset_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_provoking_vertex)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_EXT_provoking_vertex_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_secondary_color)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_EXT_secondary_color_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_separate_shader_objects)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_EXT_separate_shader_objects_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_stencil_two_side)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_EXT_stencil_two_side_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_subtexture)
+static const struct gl_function_remap GL_EXT_subtexture_functions[] = {
+   {  7076, _gloffset_TexSubImage1D },
+   { 10666, _gloffset_TexSubImage2D },
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_texture3D)
+static const struct gl_function_remap GL_EXT_texture3D_functions[] = {
+   {  1813, _gloffset_TexImage3D },
+   { 22751, _gloffset_TexSubImage3D },
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_texture_array)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_EXT_texture_array_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_texture_integer)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_EXT_texture_integer_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_texture_object)
+static const struct gl_function_remap GL_EXT_texture_object_functions[] = {
+   {  3329, _gloffset_PrioritizeTextures },
+   {  7525, _gloffset_AreTexturesResident },
+   { 13638, _gloffset_GenTextures },
+   { 15769, _gloffset_DeleteTextures },
+   { 19569, _gloffset_IsTexture },
+   { 29814, _gloffset_BindTexture },
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_texture_perturb_normal)
+static const struct gl_function_remap GL_EXT_texture_perturb_normal_functions[] = {
+   { 13848, -1 }, /* TextureNormalEXT */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_timer_query)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_EXT_timer_query_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_transform_feedback)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_EXT_transform_feedback_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_vertex_array)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_EXT_vertex_array_functions[] = {
+   { 24239, _gloffset_ArrayElement },
+   { 30921, _gloffset_GetPointerv },
+   { 32500, _gloffset_DrawArrays },
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_EXT_vertex_weighting)
+static const struct gl_function_remap GL_EXT_vertex_weighting_functions[] = {
+   { 19599, -1 }, /* VertexWeightfvEXT */
+   { 27012, -1 }, /* VertexWeightfEXT */
+   { 28713, -1 }, /* VertexWeightPointerEXT */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_HP_image_transform)
+static const struct gl_function_remap GL_HP_image_transform_functions[] = {
+   {  2366, -1 }, /* GetImageTransformParameterfvHP */
+   {  3778, -1 }, /* ImageTransformParameterfHP */
+   { 10204, -1 }, /* ImageTransformParameterfvHP */
+   { 11954, -1 }, /* ImageTransformParameteriHP */
+   { 12334, -1 }, /* GetImageTransformParameterivHP */
+   { 19663, -1 }, /* ImageTransformParameterivHP */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_IBM_multimode_draw_arrays)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_IBM_multimode_draw_arrays_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_IBM_vertex_array_lists)
+static const struct gl_function_remap GL_IBM_vertex_array_lists_functions[] = {
+   {  4366, -1 }, /* SecondaryColorPointerListIBM */
+   {  6008, -1 }, /* NormalPointerListIBM */
+   {  7699, -1 }, /* FogCoordPointerListIBM */
+   {  8006, -1 }, /* VertexPointerListIBM */
+   { 11875, -1 }, /* ColorPointerListIBM */
+   { 13402, -1 }, /* TexCoordPointerListIBM */
+   { 13870, -1 }, /* IndexPointerListIBM */
+   { 32816, -1 }, /* EdgeFlagPointerListIBM */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_INGR_blend_func_separate)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_INGR_blend_func_separate_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_INTEL_parallel_arrays)
+static const struct gl_function_remap GL_INTEL_parallel_arrays_functions[] = {
+   { 12742, -1 }, /* VertexPointervINTEL */
+   { 15530, -1 }, /* ColorPointervINTEL */
+   { 30085, -1 }, /* NormalPointervINTEL */
+   { 30603, -1 }, /* TexCoordPointervINTEL */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_MESA_resize_buffers)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_MESA_resize_buffers_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_MESA_shader_debug)
+static const struct gl_function_remap GL_MESA_shader_debug_functions[] = {
+   {  1677, -1 }, /* GetDebugLogLengthMESA */
+   {  3500, -1 }, /* ClearDebugLogMESA */
+   {  4527, -1 }, /* GetDebugLogMESA */
+   { 31114, -1 }, /* CreateDebugObjectMESA */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_MESA_window_pos)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_MESA_window_pos_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_NV_condtitional_render)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_NV_condtitional_render_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_NV_evaluators)
+static const struct gl_function_remap GL_NV_evaluators_functions[] = {
+   {  6738, -1 }, /* GetMapAttribParameterivNV */
+   {  8461, -1 }, /* MapControlPointsNV */
+   {  8560, -1 }, /* MapParameterfvNV */
+   { 10649, -1 }, /* EvalMapsNV */
+   { 17184, -1 }, /* GetMapAttribParameterfvNV */
+   { 17401, -1 }, /* MapParameterivNV */
+   { 24853, -1 }, /* GetMapParameterivNV */
+   { 25351, -1 }, /* GetMapParameterfvNV */
+   { 29400, -1 }, /* GetMapControlPointsNV */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_NV_fence)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_NV_fence_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_NV_fragment_program)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_NV_fragment_program_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_NV_point_sprite)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_NV_point_sprite_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_NV_primitive_restart)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_NV_primitive_restart_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_NV_register_combiners)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_NV_register_combiners_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_NV_register_combiners2)
+static const struct gl_function_remap GL_NV_register_combiners2_functions[] = {
+   { 15922, -1 }, /* CombinerStageParameterfvNV */
+   { 16318, -1 }, /* GetCombinerStageParameterfvNV */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_NV_texture_barrier)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_NV_texture_barrier_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_NV_vertex_array_range)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_NV_vertex_array_range_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_NV_vertex_program)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_NV_vertex_program_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_OES_EGL_image)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_OES_EGL_image_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_PGI_misc_hints)
+static const struct gl_function_remap GL_PGI_misc_hints_functions[] = {
+   {  8681, -1 }, /* HintPGI */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_SGIS_detail_texture)
+static const struct gl_function_remap GL_SGIS_detail_texture_functions[] = {
+   { 16291, -1 }, /* GetDetailTexFuncSGIS */
+   { 16642, -1 }, /* DetailTexFuncSGIS */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_SGIS_fog_function)
+static const struct gl_function_remap GL_SGIS_fog_function_functions[] = {
+   { 27309, -1 }, /* FogFuncSGIS */
+   { 28062, -1 }, /* GetFogFuncSGIS */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_SGIS_multisample)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_SGIS_multisample_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_SGIS_pixel_texture)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_SGIS_pixel_texture_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_SGIS_point_parameters)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_SGIS_point_parameters_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_SGIS_sharpen_texture)
+static const struct gl_function_remap GL_SGIS_sharpen_texture_functions[] = {
+   {  6799, -1 }, /* GetSharpenTexFuncSGIS */
+   { 22147, -1 }, /* SharpenTexFuncSGIS */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_SGIS_texture4D)
+static const struct gl_function_remap GL_SGIS_texture4D_functions[] = {
+   {  1049, -1 }, /* TexImage4DSGIS */
+   { 15838, -1 }, /* TexSubImage4DSGIS */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_SGIS_texture_color_mask)
+static const struct gl_function_remap GL_SGIS_texture_color_mask_functions[] = {
+   { 15236, -1 }, /* TextureColorMaskSGIS */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_SGIS_texture_filter4)
+static const struct gl_function_remap GL_SGIS_texture_filter4_functions[] = {
+   {  6976, -1 }, /* GetTexFilterFuncSGIS */
+   { 16437, -1 }, /* TexFilterFuncSGIS */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_SGIX_async)
+static const struct gl_function_remap GL_SGIX_async_functions[] = {
+   {  3426, -1 }, /* AsyncMarkerSGIX */
+   {  4506, -1 }, /* FinishAsyncSGIX */
+   {  5495, -1 }, /* PollAsyncSGIX */
+   { 22328, -1 }, /* DeleteAsyncMarkersSGIX */
+   { 22383, -1 }, /* IsAsyncMarkerSGIX */
+   { 32613, -1 }, /* GenAsyncMarkersSGIX */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_SGIX_flush_raster)
+static const struct gl_function_remap GL_SGIX_flush_raster_functions[] = {
+   {  7353, -1 }, /* FlushRasterSGIX */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_SGIX_fragment_lighting)
+static const struct gl_function_remap GL_SGIX_fragment_lighting_functions[] = {
+   {  2664, -1 }, /* FragmentMaterialfvSGIX */
+   {  5399, -1 }, /* FragmentLightiSGIX */
+   {  8073, -1 }, /* FragmentMaterialfSGIX */
+   {  8234, -1 }, /* GetFragmentLightivSGIX */
+   {  9107, -1 }, /* FragmentLightModeliSGIX */
+   { 10712, -1 }, /* FragmentLightivSGIX */
+   { 11019, -1 }, /* GetFragmentMaterialivSGIX */
+   { 16231, -1 }, /* GetFragmentMaterialfvSGIX */
+   { 19486, -1 }, /* FragmentLightModelfSGIX */
+   { 19786, -1 }, /* FragmentColorMaterialSGIX */
+   { 20203, -1 }, /* FragmentMaterialiSGIX */
+   { 21463, -1 }, /* LightEnviSGIX */
+   { 23074, -1 }, /* FragmentLightModelfvSGIX */
+   { 23409, -1 }, /* FragmentLightfvSGIX */
+   { 28446, -1 }, /* FragmentLightModelivSGIX */
+   { 28595, -1 }, /* FragmentLightfSGIX */
+   { 31451, -1 }, /* GetFragmentLightfvSGIX */
+   { 33096, -1 }, /* FragmentMaterialivSGIX */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_SGIX_framezoom)
+static const struct gl_function_remap GL_SGIX_framezoom_functions[] = {
+   { 22406, -1 }, /* FrameZoomSGIX */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_SGIX_igloo_interface)
+static const struct gl_function_remap GL_SGIX_igloo_interface_functions[] = {
+   { 28903, -1 }, /* IglooInterfaceSGIX */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_SGIX_instruments)
+static const struct gl_function_remap GL_SGIX_instruments_functions[] = {
+   {  2844, -1 }, /* ReadInstrumentsSGIX */
+   {  6572, -1 }, /* PollInstrumentsSGIX */
+   { 10570, -1 }, /* GetInstrumentsSGIX */
+   { 13000, -1 }, /* StartInstrumentsSGIX */
+   { 15956, -1 }, /* StopInstrumentsSGIX */
+   { 17823, -1 }, /* InstrumentsBufferSGIX */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_SGIX_list_priority)
+static const struct gl_function_remap GL_SGIX_list_priority_functions[] = {
+   {  1280, -1 }, /* ListParameterfSGIX */
+   {  3128, -1 }, /* GetListParameterfvSGIX */
+   { 17714, -1 }, /* ListParameteriSGIX */
+   { 18728, -1 }, /* ListParameterfvSGIX */
+   { 20869, -1 }, /* ListParameterivSGIX */
+   { 32657, -1 }, /* GetListParameterivSGIX */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_SGIX_pixel_texture)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_SGIX_pixel_texture_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_SGIX_polynomial_ffd)
+static const struct gl_function_remap GL_SGIX_polynomial_ffd_functions[] = {
+   {  3724, -1 }, /* LoadIdentityDeformationMapSGIX */
+   { 12208, -1 }, /* DeformationMap3dSGIX */
+   { 16056, -1 }, /* DeformSGIX */
+   { 24351, -1 }, /* DeformationMap3fSGIX */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_SGIX_reference_plane)
+static const struct gl_function_remap GL_SGIX_reference_plane_functions[] = {
+   { 14787, -1 }, /* ReferencePlaneSGIX */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_SGIX_sprite)
+static const struct gl_function_remap GL_SGIX_sprite_functions[] = {
+   {  9605, -1 }, /* SpriteParameterfvSGIX */
+   { 20658, -1 }, /* SpriteParameteriSGIX */
+   { 26681, -1 }, /* SpriteParameterfSGIX */
+   { 29543, -1 }, /* SpriteParameterivSGIX */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_SGIX_tag_sample_buffer)
+static const struct gl_function_remap GL_SGIX_tag_sample_buffer_functions[] = {
+   { 20717, -1 }, /* TagSampleBufferSGIX */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_SGI_color_table)
+static const struct gl_function_remap GL_SGI_color_table_functions[] = {
+   {  7643, _gloffset_ColorTableParameteriv },
+   {  8355, _gloffset_ColorTable },
+   { 15283, _gloffset_GetColorTable },
+   { 15393, _gloffset_CopyColorTable },
+   { 19430, _gloffset_ColorTableParameterfv },
+   { 22982, _gloffset_GetColorTableParameterfv },
+   { 25109, _gloffset_GetColorTableParameteriv },
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_SUNX_constant_data)
+static const struct gl_function_remap GL_SUNX_constant_data_functions[] = {
+   { 31429, -1 }, /* FinishTextureSUNX */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_SUN_global_alpha)
+static const struct gl_function_remap GL_SUN_global_alpha_functions[] = {
+   {  3447, -1 }, /* GlobalAlphaFactorubSUN */
+   {  4805, -1 }, /* GlobalAlphaFactoriSUN */
+   {  6597, -1 }, /* GlobalAlphaFactordSUN */
+   {  9689, -1 }, /* GlobalAlphaFactoruiSUN */
+   { 10161, -1 }, /* GlobalAlphaFactorbSUN */
+   { 13315, -1 }, /* GlobalAlphaFactorfSUN */
+   { 13479, -1 }, /* GlobalAlphaFactorusSUN */
+   { 22669, -1 }, /* GlobalAlphaFactorsSUN */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_SUN_mesh_array)
+static const struct gl_function_remap GL_SUN_mesh_array_functions[] = {
+   { 29334, -1 }, /* DrawMeshArraysSUN */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_SUN_triangle_list)
+static const struct gl_function_remap GL_SUN_triangle_list_functions[] = {
+   {  4480, -1 }, /* ReplacementCodeubSUN */
+   {  6356, -1 }, /* ReplacementCodeubvSUN */
+   { 19151, -1 }, /* ReplacementCodeusvSUN */
+   { 19339, -1 }, /* ReplacementCodePointerSUN */
+   { 21527, -1 }, /* ReplacementCodeuiSUN */
+   { 22357, -1 }, /* ReplacementCodeusSUN */
+   { 30000, -1 }, /* ReplacementCodeuivSUN */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_SUN_vertex)
+static const struct gl_function_remap GL_SUN_vertex_functions[] = {
+   {  1154, -1 }, /* ReplacementCodeuiColor3fVertex3fvSUN */
+   {  1352, -1 }, /* TexCoord4fColor4fNormal3fVertex4fvSUN */
+   {  1578, -1 }, /* TexCoord2fColor4ubVertex3fvSUN */
+   {  1908, -1 }, /* ReplacementCodeuiVertex3fvSUN */
+   {  2042, -1 }, /* ReplacementCodeuiTexCoord2fVertex3fvSUN */
+   {  2600, -1 }, /* ReplacementCodeuiNormal3fVertex3fSUN */
+   {  2913, -1 }, /* Color4ubVertex3fvSUN */
+   {  4639, -1 }, /* Color4ubVertex3fSUN */
+   {  4762, -1 }, /* TexCoord2fVertex3fSUN */
+   {  5106, -1 }, /* TexCoord2fColor4fNormal3fVertex3fSUN */
+   {  5599, -1 }, /* TexCoord2fNormal3fVertex3fvSUN */
+   {  6251, -1 }, /* ReplacementCodeuiTexCoord2fNormal3fVertex3fSUN */
+   {  7031, -1 }, /* ReplacementCodeuiColor4ubVertex3fvSUN */
+   {  7390, -1 }, /* ReplacementCodeuiTexCoord2fVertex3fSUN */
+   {  8102, -1 }, /* TexCoord2fNormal3fVertex3fSUN */
+   {  8906, -1 }, /* Color3fVertex3fSUN */
+   { 10097, -1 }, /* Color3fVertex3fvSUN */
+   { 10535, -1 }, /* Color4fNormal3fVertex3fvSUN */
+   { 11364, -1 }, /* ReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN */
+   { 12863, -1 }, /* ReplacementCodeuiColor4fNormal3fVertex3fvSUN */
+   { 14403, -1 }, /* ReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN */
+   { 14929, -1 }, /* TexCoord2fColor3fVertex3fSUN */
+   { 15981, -1 }, /* TexCoord4fColor4fNormal3fVertex4fSUN */
+   { 16396, -1 }, /* Color4ubVertex2fvSUN */
+   { 16667, -1 }, /* Normal3fVertex3fSUN */
+   { 17764, -1 }, /* ReplacementCodeuiColor4fNormal3fVertex3fSUN */
+   { 18125, -1 }, /* TexCoord2fColor4fNormal3fVertex3fvSUN */
+   { 18980, -1 }, /* TexCoord2fVertex3fvSUN */
+   { 19756, -1 }, /* Color4ubVertex2fSUN */
+   { 19994, -1 }, /* ReplacementCodeuiColor4ubVertex3fSUN */
+   { 21993, -1 }, /* TexCoord2fColor4ubVertex3fSUN */
+   { 22425, -1 }, /* Normal3fVertex3fvSUN */
+   { 22891, -1 }, /* Color4fNormal3fVertex3fSUN */
+   { 23900, -1 }, /* ReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN */
+   { 26002, -1 }, /* ReplacementCodeuiColor3fVertex3fSUN */
+   { 27425, -1 }, /* TexCoord4fVertex4fSUN */
+   { 27851, -1 }, /* TexCoord2fColor3fVertex3fvSUN */
+   { 28290, -1 }, /* ReplacementCodeuiNormal3fVertex3fvSUN */
+   { 28417, -1 }, /* TexCoord4fVertex4fvSUN */
+   { 29151, -1 }, /* ReplacementCodeuiVertex3fSUN */
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_VERSION_1_3)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_VERSION_1_3_functions[] = {
+   {   464, _gloffset_MultiTexCoord3sARB },
+   {   696, _gloffset_ActiveTextureARB },
+   {  4234, _gloffset_MultiTexCoord1fvARB },
+   {  6142, _gloffset_MultiTexCoord3dARB },
+   {  6187, _gloffset_MultiTexCoord2iARB },
+   {  6311, _gloffset_MultiTexCoord2svARB },
+   {  8311, _gloffset_MultiTexCoord2fARB },
+   { 10371, _gloffset_MultiTexCoord3fvARB },
+   { 10973, _gloffset_MultiTexCoord4sARB },
+   { 11654, _gloffset_MultiTexCoord2dvARB },
+   { 12069, _gloffset_MultiTexCoord1svARB },
+   { 12480, _gloffset_MultiTexCoord3svARB },
+   { 12541, _gloffset_MultiTexCoord4iARB },
+   { 13342, _gloffset_MultiTexCoord3iARB },
+   { 14141, _gloffset_MultiTexCoord1dARB },
+   { 14358, _gloffset_MultiTexCoord3dvARB },
+   { 15637, _gloffset_MultiTexCoord3ivARB },
+   { 15682, _gloffset_MultiTexCoord2sARB },
+   { 17067, _gloffset_MultiTexCoord4ivARB },
+   { 19080, _gloffset_ClientActiveTextureARB },
+   { 21380, _gloffset_MultiTexCoord2dARB },
+   { 21817, _gloffset_MultiTexCoord4dvARB },
+   { 22173, _gloffset_MultiTexCoord4fvARB },
+   { 23123, _gloffset_MultiTexCoord3fARB },
+   { 25693, _gloffset_MultiTexCoord4dARB },
+   { 25959, _gloffset_MultiTexCoord1sARB },
+   { 26163, _gloffset_MultiTexCoord1dvARB },
+   { 27171, _gloffset_MultiTexCoord1ivARB },
+   { 27264, _gloffset_MultiTexCoord2ivARB },
+   { 27603, _gloffset_MultiTexCoord1iARB },
+   { 29019, _gloffset_MultiTexCoord4svARB },
+   { 29613, _gloffset_MultiTexCoord1fARB },
+   { 29876, _gloffset_MultiTexCoord4fARB },
+   { 32334, _gloffset_MultiTexCoord2fvARB },
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_VERSION_1_4)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_VERSION_1_4_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_VERSION_1_5)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_VERSION_1_5_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_VERSION_2_0)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_VERSION_2_0_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_VERSION_2_1)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_VERSION_2_1_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_VERSION_3_0)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_VERSION_3_0_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_VERSION_3_1)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_VERSION_3_1_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_VERSION_3_2)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_VERSION_3_2_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
+#if defined(need_GL_VERSION_3_3)
+/* functions defined in MESA_remap_table_functions are excluded */
+static const struct gl_function_remap GL_VERSION_3_3_functions[] = {
+   {    -1, -1 }
+};
+#endif
+
diff --git a/mesalib/src/mesa/main/state.c b/mesalib/src/mesa/main/state.c
index 118ed1d28..1d1ae4737 100644
--- a/mesalib/src/mesa/main/state.c
+++ b/mesalib/src/mesa/main/state.c
@@ -445,6 +445,35 @@ update_color(struct gl_context *ctx)
    ctx->Color._LogicOpEnabled = _mesa_rgba_logicop_enabled(ctx);
 }
 
+static void
+update_clamp_fragment_color(struct gl_context *ctx)
+{
+   if(ctx->Color.ClampFragmentColor == GL_FIXED_ONLY_ARB)
+      ctx->Color._ClampFragmentColor = !ctx->DrawBuffer || !ctx->DrawBuffer->Visual.floatMode;
+   else
+      ctx->Color._ClampFragmentColor = ctx->Color.ClampFragmentColor;
+}
+
+static void
+update_clamp_vertex_color(struct gl_context *ctx)
+{
+   if(ctx->Light.ClampVertexColor == GL_FIXED_ONLY_ARB)
+      ctx->Light._ClampVertexColor = !ctx->DrawBuffer || !ctx->DrawBuffer->Visual.floatMode;
+   else
+      ctx->Light._ClampVertexColor = ctx->Light.ClampVertexColor;
+}
+
+static void
+update_clamp_read_color(struct gl_context *ctx)
+{
+   if(ctx->Color.ClampReadColor == GL_FIXED_ONLY_ARB)
+      ctx->Color._ClampReadColor = !ctx->ReadBuffer || !ctx->ReadBuffer->Visual.floatMode;
+   else
+      ctx->Color._ClampReadColor = ctx->Color.ClampReadColor;
+}
+
+
+
 
 /*
  * Check polygon state and set DD_TRI_CULL_FRONT_BACK and/or DD_TRI_OFFSET
@@ -565,7 +594,7 @@ _mesa_update_state_locked( struct gl_context *ctx )
    if (ctx->FragmentProgram._MaintainTexEnvProgram) {
       prog_flags |= (_NEW_BUFFERS | _NEW_TEXTURE | _NEW_FOG |
 		     _NEW_ARRAY | _NEW_LIGHT | _NEW_POINT | _NEW_RENDERMODE |
-		     _NEW_PROGRAM);
+		     _NEW_PROGRAM | _NEW_FRAG_CLAMP);
    }
    if (ctx->VertexProgram._MaintainTnlProgram) {
       prog_flags |= (_NEW_ARRAY | _NEW_TEXTURE | _NEW_TEXTURE_MATRIX |
@@ -599,6 +628,9 @@ _mesa_update_state_locked( struct gl_context *ctx )
    if (new_state & _NEW_LIGHT)
       _mesa_update_lighting( ctx );
 
+   if (new_state & (_NEW_LIGHT | _NEW_BUFFERS))
+      update_clamp_vertex_color(ctx);
+
    if (new_state & (_NEW_STENCIL | _NEW_BUFFERS))
       _mesa_update_stencil( ctx );
 
@@ -617,6 +649,12 @@ _mesa_update_state_locked( struct gl_context *ctx )
    if (new_state & _NEW_COLOR)
       update_color( ctx );
 
+   if (new_state & (_NEW_COLOR | _NEW_BUFFERS))
+      update_clamp_read_color(ctx);
+
+   if(new_state & (_NEW_FRAG_CLAMP | _NEW_BUFFERS))
+      update_clamp_fragment_color(ctx);
+
 #if 0
    if (new_state & (_NEW_POINT | _NEW_LINE | _NEW_POLYGON | _NEW_LIGHT
                     | _NEW_STENCIL | _DD_NEW_SEPARATE_SPECULAR))
diff --git a/mesalib/src/mesa/main/texenv.c b/mesalib/src/mesa/main/texenv.c
index 9caca7c11..9228e354a 100644
--- a/mesalib/src/mesa/main/texenv.c
+++ b/mesalib/src/mesa/main/texenv.c
@@ -1,1038 +1,1043 @@
-/*
- * Mesa 3-D graphics library
- * Version:  7.5
- *
- * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
- * Copyright (C) 2009  VMware, Inc.  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"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/** 
- * \file texenv.c
- *
- * glTexEnv-related functions
- */
-
-
-#include "main/glheader.h"
-#include "main/context.h"
-#include "main/enums.h"
-#include "main/macros.h"
-#include "main/mtypes.h"
-#include "main/texenv.h"
-#include "main/texstate.h"
-
-
-#define TE_ERROR(errCode, msg, value)				\
-   _mesa_error(ctx, errCode, msg, _mesa_lookup_enum_by_nr(value));
-
-
-/** Set texture env mode */
-static void
-set_env_mode(struct gl_context *ctx,
-             struct gl_texture_unit *texUnit,
-             GLenum mode)
-{
-   GLboolean legal;
-
-   if (texUnit->EnvMode == mode)
-      return;
-
-   switch (mode) {
-   case GL_MODULATE:
-   case GL_BLEND:
-   case GL_DECAL:
-   case GL_REPLACE:
-      legal = GL_TRUE;
-      break;
-   case GL_REPLACE_EXT:
-      mode = GL_REPLACE; /* GL_REPLACE_EXT != GL_REPLACE */
-      legal = GL_TRUE;
-      break;
-   case GL_ADD:
-      legal = ctx->Extensions.EXT_texture_env_add;
-      break;
-   case GL_COMBINE:
-      legal = (ctx->Extensions.EXT_texture_env_combine ||
-               ctx->Extensions.ARB_texture_env_combine);
-      break;
-   case GL_COMBINE4_NV:
-      legal = ctx->Extensions.NV_texture_env_combine4;
-      break;
-   default:
-      legal = GL_FALSE;
-   }
-
-   if (legal) {
-      FLUSH_VERTICES(ctx, _NEW_TEXTURE);
-      texUnit->EnvMode = mode;
-   }
-   else {
-      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);
-   }
-}
-
-
-static void
-set_env_color(struct gl_context *ctx,
-              struct gl_texture_unit *texUnit,
-              const GLfloat *color)
-{
-   GLfloat tmp[4];
-   tmp[0] = CLAMP(color[0], 0.0F, 1.0F);
-   tmp[1] = CLAMP(color[1], 0.0F, 1.0F);
-   tmp[2] = CLAMP(color[2], 0.0F, 1.0F);
-   tmp[3] = CLAMP(color[3], 0.0F, 1.0F);
-   if (TEST_EQ_4V(tmp, texUnit->EnvColor))
-      return;
-   FLUSH_VERTICES(ctx, _NEW_TEXTURE);
-   COPY_4FV(texUnit->EnvColor, tmp);
-}
-
-
-/** Set an RGB or A combiner mode/function */
-static void
-set_combiner_mode(struct gl_context *ctx,
-                  struct gl_texture_unit *texUnit,
-                  GLenum pname, GLenum mode)
-{
-   GLboolean legal;
-
-   if (!ctx->Extensions.EXT_texture_env_combine &&
-       !ctx->Extensions.ARB_texture_env_combine) {
-      _mesa_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)");
-      return;
-   }
-
-   switch (mode) {
-   case GL_REPLACE:
-   case GL_MODULATE:
-   case GL_ADD:
-   case GL_ADD_SIGNED:
-   case GL_INTERPOLATE:
-      legal = GL_TRUE;
-      break;
-   case GL_SUBTRACT:
-      legal = ctx->Extensions.ARB_texture_env_combine;
-      break;
-   case GL_DOT3_RGB_EXT:
-   case GL_DOT3_RGBA_EXT:
-      legal = (ctx->Extensions.EXT_texture_env_dot3 &&
-               pname == GL_COMBINE_RGB);
-      break;
-   case GL_DOT3_RGB:
-   case GL_DOT3_RGBA:
-      legal = (ctx->Extensions.ARB_texture_env_dot3 &&
-               pname == GL_COMBINE_RGB);
-      break;
-   case GL_MODULATE_ADD_ATI:
-   case GL_MODULATE_SIGNED_ADD_ATI:
-   case GL_MODULATE_SUBTRACT_ATI:
-      legal = ctx->Extensions.ATI_texture_env_combine3;
-      break;
-   case GL_BUMP_ENVMAP_ATI:
-      legal = (ctx->Extensions.ATI_envmap_bumpmap &&
-               pname == GL_COMBINE_RGB);
-      break;
-   default:
-      legal = GL_FALSE;
-   }
-
-   if (!legal) {
-      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);
-      return;
-   }
-
-   switch (pname) {
-   case GL_COMBINE_RGB:
-      if (texUnit->Combine.ModeRGB == mode)
-         return;
-      FLUSH_VERTICES(ctx, _NEW_TEXTURE);
-      texUnit->Combine.ModeRGB = mode;
-      break;
-
-   case GL_COMBINE_ALPHA:
-      if (texUnit->Combine.ModeA == mode)
-         return;
-      FLUSH_VERTICES(ctx, _NEW_TEXTURE);
-      texUnit->Combine.ModeA = mode;
-      break;
-   default:
-      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
-   }
-}
-
-
-
-/** Set an RGB or A combiner source term */
-static void
-set_combiner_source(struct gl_context *ctx,
-                    struct gl_texture_unit *texUnit,
-                    GLenum pname, GLenum param)
-{
-   GLuint term;
-   GLboolean alpha, legal;
-
-   if (!ctx->Extensions.EXT_texture_env_combine &&
-       !ctx->Extensions.ARB_texture_env_combine) {
-      _mesa_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)");
-      return;
-   }
-
-   /*
-    * Translate pname to (term, alpha).
-    *
-    * The enums were given sequential values for a reason.
-    */
-   switch (pname) {
-   case GL_SOURCE0_RGB:
-   case GL_SOURCE1_RGB:
-   case GL_SOURCE2_RGB:
-   case GL_SOURCE3_RGB_NV:
-      term = pname - GL_SOURCE0_RGB;
-      alpha = GL_FALSE;
-      break;
-   case GL_SOURCE0_ALPHA:
-   case GL_SOURCE1_ALPHA:
-   case GL_SOURCE2_ALPHA:
-   case GL_SOURCE3_ALPHA_NV:
-      term = pname - GL_SOURCE0_ALPHA;
-      alpha = GL_TRUE;
-      break;
-   default:
-      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
-      return;
-   }
-
-   if ((term == 3) && !ctx->Extensions.NV_texture_env_combine4) {
-      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
-      return;
-   }
-
-   assert(term < MAX_COMBINER_TERMS);
-
-   /*
-    * Error-check param (the source term)
-    */
-   switch (param) {
-   case GL_TEXTURE:
-   case GL_CONSTANT:
-   case GL_PRIMARY_COLOR:
-   case GL_PREVIOUS:
-      legal = GL_TRUE;
-      break;
-   case GL_TEXTURE0:
-   case GL_TEXTURE1:
-   case GL_TEXTURE2:
-   case GL_TEXTURE3:
-   case GL_TEXTURE4:
-   case GL_TEXTURE5:
-   case GL_TEXTURE6:
-   case GL_TEXTURE7:
-      legal = (ctx->Extensions.ARB_texture_env_crossbar &&
-               param - GL_TEXTURE0 < ctx->Const.MaxTextureUnits);
-      break;
-   case GL_ZERO:
-      legal = (ctx->Extensions.ATI_texture_env_combine3 ||
-               ctx->Extensions.NV_texture_env_combine4);
-      break;
-   case GL_ONE:
-      legal = ctx->Extensions.ATI_texture_env_combine3;
-      break;
-   default:
-      legal = GL_FALSE;
-   }
-
-   if (!legal) {
-      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", param);
-      return;
-   }
-
-   FLUSH_VERTICES(ctx, _NEW_TEXTURE);
-
-   if (alpha)
-      texUnit->Combine.SourceA[term] = param;
-   else
-      texUnit->Combine.SourceRGB[term] = param;
-}
-
-
-/** Set an RGB or A combiner operand term */
-static void
-set_combiner_operand(struct gl_context *ctx,
-                     struct gl_texture_unit *texUnit,
-                     GLenum pname, GLenum param)
-{
-   GLuint term;
-   GLboolean alpha, legal;
-
-   if (!ctx->Extensions.EXT_texture_env_combine &&
-       !ctx->Extensions.ARB_texture_env_combine) {
-      _mesa_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)");
-      return;
-   }
-
-   /* The enums were given sequential values for a reason.
-    */
-   switch (pname) {
-   case GL_OPERAND0_RGB:
-   case GL_OPERAND1_RGB:
-   case GL_OPERAND2_RGB:
-   case GL_OPERAND3_RGB_NV:
-      term = pname - GL_OPERAND0_RGB;
-      alpha = GL_FALSE;
-      break;
-   case GL_OPERAND0_ALPHA:
-   case GL_OPERAND1_ALPHA:
-   case GL_OPERAND2_ALPHA:
-   case GL_OPERAND3_ALPHA_NV:
-      term = pname - GL_OPERAND0_ALPHA;
-      alpha = GL_TRUE;
-      break;
-   default:
-      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
-      return;
-   }
-
-   if ((term == 3) && !ctx->Extensions.NV_texture_env_combine4) {
-      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
-      return;
-   }
-
-   assert(term < MAX_COMBINER_TERMS);
-
-   /*
-    * Error-check param (the source operand)
-    */
-   switch (param) {
-   case GL_SRC_COLOR:
-   case GL_ONE_MINUS_SRC_COLOR:
-      /* The color input can only be used with GL_OPERAND[01]_RGB in the EXT
-       * version.  In the ARB and NV versions they can be used for any RGB
-       * operand.
-       */
-      legal = !alpha
-	 && ((term < 2) || ctx->Extensions.ARB_texture_env_combine
-	     || ctx->Extensions.NV_texture_env_combine4);
-      break;
-   case GL_ONE_MINUS_SRC_ALPHA:
-      /* GL_ONE_MINUS_SRC_ALPHA can only be used with
-       * GL_OPERAND[01]_(RGB|ALPHA) in the EXT version.  In the ARB and NV
-       * versions it can be used for any operand.
-       */
-      legal = (term < 2) || ctx->Extensions.ARB_texture_env_combine
-	 || ctx->Extensions.NV_texture_env_combine4;
-      break;
-   case GL_SRC_ALPHA:
-      legal = GL_TRUE;
-      break;
-   default:
-      legal = GL_FALSE;
-   }
-
-   if (!legal) {
-      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", param);
-      return;
-   }
-
-   FLUSH_VERTICES(ctx, _NEW_TEXTURE);
-
-   if (alpha)
-      texUnit->Combine.OperandA[term] = param;
-   else
-      texUnit->Combine.OperandRGB[term] = param;
-}
-
-
-static void
-set_combiner_scale(struct gl_context *ctx,
-                   struct gl_texture_unit *texUnit,
-                   GLenum pname, GLfloat scale)
-{
-   GLuint shift;
-
-   if (!ctx->Extensions.EXT_texture_env_combine &&
-       !ctx->Extensions.ARB_texture_env_combine) {
-      _mesa_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)");
-      return;
-   }
-
-   if (scale == 1.0F) {
-      shift = 0;
-   }
-   else if (scale == 2.0F) {
-      shift = 1;
-   }
-   else if (scale == 4.0F) {
-      shift = 2;
-   }
-   else {
-      _mesa_error( ctx, GL_INVALID_VALUE,
-                   "glTexEnv(GL_RGB_SCALE not 1, 2 or 4)" );
-      return;
-   }
-
-   switch (pname) {
-   case GL_RGB_SCALE:
-      if (texUnit->Combine.ScaleShiftRGB == shift)
-         return;
-      FLUSH_VERTICES(ctx, _NEW_TEXTURE);
-      texUnit->Combine.ScaleShiftRGB = shift;
-      break;
-   case GL_ALPHA_SCALE:
-      if (texUnit->Combine.ScaleShiftA == shift)
-         return;
-      FLUSH_VERTICES(ctx, _NEW_TEXTURE);
-      texUnit->Combine.ScaleShiftA = shift;
-      break;
-   default:
-      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
-   }
-}
-
-
-
-void GLAPIENTRY
-_mesa_TexEnvfv( GLenum target, GLenum pname, const GLfloat *param )
-{
-   const GLint iparam0 = (GLint) param[0];
-   struct gl_texture_unit *texUnit;
-   GLuint maxUnit;
-
-   GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END(ctx);
-
-   maxUnit = (target == GL_POINT_SPRITE_NV && pname == GL_COORD_REPLACE_NV)
-      ? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxTextureImageUnits;
-   if (ctx->Texture.CurrentUnit >= maxUnit) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glTexEnvfv(current unit)");
-      return;
-   }
-
-   texUnit = _mesa_get_current_tex_unit(ctx);
-
-   if (target == GL_TEXTURE_ENV) {
-      switch (pname) {
-      case GL_TEXTURE_ENV_MODE:
-         set_env_mode(ctx, texUnit, (GLenum) iparam0);
-         break;
-      case GL_TEXTURE_ENV_COLOR:
-         set_env_color(ctx, texUnit, param);
-         break;
-      case GL_COMBINE_RGB:
-      case GL_COMBINE_ALPHA:
-         set_combiner_mode(ctx, texUnit, pname, (GLenum) iparam0);
-	 break;
-      case GL_SOURCE0_RGB:
-      case GL_SOURCE1_RGB:
-      case GL_SOURCE2_RGB:
-      case GL_SOURCE3_RGB_NV:
-      case GL_SOURCE0_ALPHA:
-      case GL_SOURCE1_ALPHA:
-      case GL_SOURCE2_ALPHA:
-      case GL_SOURCE3_ALPHA_NV:
-         set_combiner_source(ctx, texUnit, pname, (GLenum) iparam0);
-	 break;
-      case GL_OPERAND0_RGB:
-      case GL_OPERAND1_RGB:
-      case GL_OPERAND2_RGB:
-      case GL_OPERAND3_RGB_NV:
-      case GL_OPERAND0_ALPHA:
-      case GL_OPERAND1_ALPHA:
-      case GL_OPERAND2_ALPHA:
-      case GL_OPERAND3_ALPHA_NV:
-         set_combiner_operand(ctx, texUnit, pname, (GLenum) iparam0);
-	 break;
-      case GL_RGB_SCALE:
-      case GL_ALPHA_SCALE:
-         set_combiner_scale(ctx, texUnit, pname, param[0]);
-	 break;
-      case GL_BUMP_TARGET_ATI:
-         if (!ctx->Extensions.ATI_envmap_bumpmap) {
-	    _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname=0x%x)", pname );
-	    return;
-	 }
-	 if ((iparam0 < GL_TEXTURE0) ||
-             (iparam0 > GL_TEXTURE31)) {
-	    /* spec doesn't say this but it seems logical */
-	    _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(param=0x%x)", iparam0);
-	    return;
-	 }
-	 if (!((1 << (iparam0 - GL_TEXTURE0)) & ctx->Const.SupportedBumpUnits)) {
-	    _mesa_error( ctx, GL_INVALID_VALUE, "glTexEnv(param=0x%x)", iparam0);
-	    return;
-	 }
-	 else {
-	    FLUSH_VERTICES(ctx, _NEW_TEXTURE);
-	    texUnit->BumpTarget = iparam0;
-	 }
-	 break;
-      default:
-	 _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname)" );
-	 return;
-      }
-   }
-   else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) {
-      /* GL_EXT_texture_lod_bias */
-      if (!ctx->Extensions.EXT_texture_lod_bias) {
-	 _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)", target );
-	 return;
-      }
-      if (pname == GL_TEXTURE_LOD_BIAS_EXT) {
-	 if (texUnit->LodBias == param[0])
-	    return;
-	 FLUSH_VERTICES(ctx, _NEW_TEXTURE);
-         texUnit->LodBias = param[0];
-      }
-      else {
-         TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
-	 return;
-      }
-   }
-   else if (target == GL_POINT_SPRITE_NV) {
-      /* GL_ARB_point_sprite / GL_NV_point_sprite */
-      if (!ctx->Extensions.NV_point_sprite
-	  && !ctx->Extensions.ARB_point_sprite) {
-	 _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)", target );
-	 return;
-      }
-      if (pname == GL_COORD_REPLACE_NV) {
-         if (iparam0 == GL_TRUE || iparam0 == GL_FALSE) {
-            /* It's kind of weird to set point state via glTexEnv,
-             * but that's what the spec calls for.
-             */
-            const GLboolean state = (GLboolean) iparam0;
-            if (ctx->Point.CoordReplace[ctx->Texture.CurrentUnit] == state)
-               return;
-            FLUSH_VERTICES(ctx, _NEW_POINT);
-            ctx->Point.CoordReplace[ctx->Texture.CurrentUnit] = state;
-         }
-         else {
-            _mesa_error( ctx, GL_INVALID_VALUE, "glTexEnv(param=0x%x)", iparam0);
-            return;
-         }
-      }
-      else {
-         _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname=0x%x)", pname );
-         return;
-      }
-   }
-   else {
-      _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)",target );
-      return;
-   }
-
-   if (MESA_VERBOSE&(VERBOSE_API|VERBOSE_TEXTURE))
-      _mesa_debug(ctx, "glTexEnv %s %s %.1f(%s) ...\n",
-                  _mesa_lookup_enum_by_nr(target),
-                  _mesa_lookup_enum_by_nr(pname),
-                  *param,
-                  _mesa_lookup_enum_by_nr((GLenum) iparam0));
-
-   /* Tell device driver about the new texture environment */
-   if (ctx->Driver.TexEnv) {
-      (*ctx->Driver.TexEnv)( ctx, target, pname, param );
-   }
-}
-
-
-void GLAPIENTRY
-_mesa_TexEnvf( GLenum target, GLenum pname, GLfloat param )
-{
-   GLfloat p[4];
-   p[0] = param;
-   p[1] = p[2] = p[3] = 0.0;
-   _mesa_TexEnvfv( target, pname, p );
-}
-
-
-
-void GLAPIENTRY
-_mesa_TexEnvi( GLenum target, GLenum pname, GLint param )
-{
-   GLfloat p[4];
-   p[0] = (GLfloat) param;
-   p[1] = p[2] = p[3] = 0.0;
-   _mesa_TexEnvfv( target, pname, p );
-}
-
-
-void GLAPIENTRY
-_mesa_TexEnviv( GLenum target, GLenum pname, const GLint *param )
-{
-   GLfloat p[4];
-   if (pname == GL_TEXTURE_ENV_COLOR) {
-      p[0] = INT_TO_FLOAT( param[0] );
-      p[1] = INT_TO_FLOAT( param[1] );
-      p[2] = INT_TO_FLOAT( param[2] );
-      p[3] = INT_TO_FLOAT( param[3] );
-   }
-   else {
-      p[0] = (GLfloat) param[0];
-      p[1] = p[2] = p[3] = 0;  /* init to zero, just to be safe */
-   }
-   _mesa_TexEnvfv( target, pname, p );
-}
-
-
-
-/**
- * Helper for glGetTexEnvi/f()
- * \return  value of queried pname or -1 if error.
- */
-static GLint
-get_texenvi(struct gl_context *ctx, const struct gl_texture_unit *texUnit,
-            GLenum pname)
-{
-   switch (pname) {
-   case GL_TEXTURE_ENV_MODE:
-      return texUnit->EnvMode;
-      break;
-   case GL_COMBINE_RGB:
-      if (ctx->Extensions.EXT_texture_env_combine ||
-          ctx->Extensions.ARB_texture_env_combine) {
-         return texUnit->Combine.ModeRGB;
-      }
-      else {
-         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
-      }
-      break;
-   case GL_COMBINE_ALPHA:
-      if (ctx->Extensions.EXT_texture_env_combine ||
-          ctx->Extensions.ARB_texture_env_combine) {
-         return texUnit->Combine.ModeA;
-      }
-      else {
-         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
-      }
-      break;
-   case GL_SOURCE0_RGB:
-   case GL_SOURCE1_RGB:
-   case GL_SOURCE2_RGB:
-      if (ctx->Extensions.EXT_texture_env_combine ||
-          ctx->Extensions.ARB_texture_env_combine) {
-         const unsigned rgb_idx = pname - GL_SOURCE0_RGB;
-         return texUnit->Combine.SourceRGB[rgb_idx];
-      }
-      else {
-         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
-      }
-      break;
-   case GL_SOURCE3_RGB_NV:
-      if (ctx->Extensions.NV_texture_env_combine4) {
-         return texUnit->Combine.SourceRGB[3];
-      }
-      else {
-         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
-      }
-      break;
-   case GL_SOURCE0_ALPHA:
-   case GL_SOURCE1_ALPHA:
-   case GL_SOURCE2_ALPHA:
-      if (ctx->Extensions.EXT_texture_env_combine ||
-          ctx->Extensions.ARB_texture_env_combine) {
-         const unsigned alpha_idx = pname - GL_SOURCE0_ALPHA;
-         return texUnit->Combine.SourceA[alpha_idx];
-      }
-      else {
-         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
-      }
-      break;
-   case GL_SOURCE3_ALPHA_NV:
-      if (ctx->Extensions.NV_texture_env_combine4) {
-         return texUnit->Combine.SourceA[3];
-      }
-      else {
-         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
-      }
-      break;
-   case GL_OPERAND0_RGB:
-   case GL_OPERAND1_RGB:
-   case GL_OPERAND2_RGB:
-      if (ctx->Extensions.EXT_texture_env_combine ||
-          ctx->Extensions.ARB_texture_env_combine) {
-         const unsigned op_rgb = pname - GL_OPERAND0_RGB;
-         return texUnit->Combine.OperandRGB[op_rgb];
-      }
-      else {
-         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
-      }
-      break;
-   case GL_OPERAND3_RGB_NV:
-      if (ctx->Extensions.NV_texture_env_combine4) {
-         return texUnit->Combine.OperandRGB[3];
-      }
-      else {
-         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
-      }
-      break;
-   case GL_OPERAND0_ALPHA:
-   case GL_OPERAND1_ALPHA:
-   case GL_OPERAND2_ALPHA:
-      if (ctx->Extensions.EXT_texture_env_combine ||
-          ctx->Extensions.ARB_texture_env_combine) {
-         const unsigned op_alpha = pname - GL_OPERAND0_ALPHA;
-         return texUnit->Combine.OperandA[op_alpha];
-      }
-      else {
-         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
-      }
-      break;
-   case GL_OPERAND3_ALPHA_NV:
-      if (ctx->Extensions.NV_texture_env_combine4) {
-         return texUnit->Combine.OperandA[3];
-      }
-      else {
-         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
-      }
-      break;
-   case GL_RGB_SCALE:
-      if (ctx->Extensions.EXT_texture_env_combine ||
-          ctx->Extensions.ARB_texture_env_combine) {
-         return 1 << texUnit->Combine.ScaleShiftRGB;
-      }
-      else {
-         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
-      }
-      break;
-   case GL_ALPHA_SCALE:
-      if (ctx->Extensions.EXT_texture_env_combine ||
-          ctx->Extensions.ARB_texture_env_combine) {
-         return 1 << texUnit->Combine.ScaleShiftA;
-      }
-      else {
-         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
-      }
-      break;
-   case GL_BUMP_TARGET_ATI:
-      /* spec doesn't say so, but I think this should be queryable */
-      if (ctx->Extensions.ATI_envmap_bumpmap) {
-         return texUnit->BumpTarget;
-      }
-      else {
-         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
-      }
-      break;
-
-   default:
-      ;
-   }
-
-   return -1; /* error */
-}
-
-
-
-void GLAPIENTRY
-_mesa_GetTexEnvfv( GLenum target, GLenum pname, GLfloat *params )
-{
-   GLuint maxUnit;
-   const struct gl_texture_unit *texUnit;
-   GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END(ctx);
-
-   maxUnit = (target == GL_POINT_SPRITE_NV && pname == GL_COORD_REPLACE_NV)
-      ? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxTextureImageUnits;
-   if (ctx->Texture.CurrentUnit >= maxUnit) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexEnvfv(current unit)");
-      return;
-   }
-
-   texUnit = _mesa_get_current_tex_unit(ctx);
-
-   if (target == GL_TEXTURE_ENV) {
-      if (pname == GL_TEXTURE_ENV_COLOR) {
-         COPY_4FV( params, texUnit->EnvColor );
-      }
-      else {
-         GLint val = get_texenvi(ctx, texUnit, pname);
-         if (val >= 0) {
-            *params = (GLfloat) val;
-         }
-      }
-   }
-   else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) {
-      /* GL_EXT_texture_lod_bias */
-      if (!ctx->Extensions.EXT_texture_lod_bias) {
-	 _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" );
-	 return;
-      }
-      if (pname == GL_TEXTURE_LOD_BIAS_EXT) {
-         *params = texUnit->LodBias;
-      }
-      else {
-         _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" );
-	 return;
-      }
-   }
-   else if (target == GL_POINT_SPRITE_NV) {
-      /* GL_ARB_point_sprite / GL_NV_point_sprite */
-      if (!ctx->Extensions.NV_point_sprite
-	  && !ctx->Extensions.ARB_point_sprite) {
-         _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" );
-         return;
-      }
-      if (pname == GL_COORD_REPLACE_NV) {
-         *params = (GLfloat) ctx->Point.CoordReplace[ctx->Texture.CurrentUnit];
-      }
-      else {
-         _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" );
-         return;
-      }
-   }
-   else {
-      _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" );
-      return;
-   }
-}
-
-
-void GLAPIENTRY
-_mesa_GetTexEnviv( GLenum target, GLenum pname, GLint *params )
-{
-   GLuint maxUnit;
-   const struct gl_texture_unit *texUnit;
-   GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END(ctx);
-
-   maxUnit = (target == GL_POINT_SPRITE_NV && pname == GL_COORD_REPLACE_NV)
-      ? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxTextureImageUnits;
-   if (ctx->Texture.CurrentUnit >= maxUnit) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexEnviv(current unit)");
-      return;
-   }
-
-   texUnit = _mesa_get_current_tex_unit(ctx);
-
-   if (target == GL_TEXTURE_ENV) {
-      if (pname == GL_TEXTURE_ENV_COLOR) {
-         params[0] = FLOAT_TO_INT( texUnit->EnvColor[0] );
-         params[1] = FLOAT_TO_INT( texUnit->EnvColor[1] );
-         params[2] = FLOAT_TO_INT( texUnit->EnvColor[2] );
-         params[3] = FLOAT_TO_INT( texUnit->EnvColor[3] );
-      }
-      else {
-         GLint val = get_texenvi(ctx, texUnit, pname);
-         if (val >= 0) {
-            *params = val;
-         }
-      }
-   }
-   else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) {
-      /* GL_EXT_texture_lod_bias */
-      if (!ctx->Extensions.EXT_texture_lod_bias) {
-	 _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" );
-	 return;
-      }
-      if (pname == GL_TEXTURE_LOD_BIAS_EXT) {
-         *params = (GLint) texUnit->LodBias;
-      }
-      else {
-         _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)" );
-	 return;
-      }
-   }
-   else if (target == GL_POINT_SPRITE_NV) {
-      /* GL_ARB_point_sprite / GL_NV_point_sprite */
-      if (!ctx->Extensions.NV_point_sprite
-	  && !ctx->Extensions.ARB_point_sprite) {
-         _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" );
-         return;
-      }
-      if (pname == GL_COORD_REPLACE_NV) {
-         *params = (GLint) ctx->Point.CoordReplace[ctx->Texture.CurrentUnit];
-      }
-      else {
-         _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)" );
-         return;
-      }
-   }
-   else {
-      _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" );
-      return;
-   }
-}
-
-
-/**
- * Why does ATI_envmap_bumpmap require new entrypoints? Should just
- * reuse TexEnv ones...
- */
-void GLAPIENTRY
-_mesa_TexBumpParameterivATI( GLenum pname, const GLint *param )
-{
-   GLfloat p[4];
-   GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END(ctx);
-
-   if (!ctx->Extensions.ATI_envmap_bumpmap) {
-      /* This isn't an "official" error case, but let's tell the user
-       * that something's wrong.
-       */
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glTexBumpParameterivATI");
-      return;
-   }
-
-   if (pname == GL_BUMP_ROT_MATRIX_ATI) {
-      /* hope that conversion is correct here */
-      p[0] = INT_TO_FLOAT( param[0] );
-      p[1] = INT_TO_FLOAT( param[1] );
-      p[2] = INT_TO_FLOAT( param[2] );
-      p[3] = INT_TO_FLOAT( param[3] );
-   }
-   else {
-      p[0] = (GLfloat) param[0];
-      p[1] = p[2] = p[3] = 0.0F;  /* init to zero, just to be safe */
-   }
-   _mesa_TexBumpParameterfvATI( pname, p );
-}
-
-
-void GLAPIENTRY
-_mesa_TexBumpParameterfvATI( GLenum pname, const GLfloat *param )
-{
-   struct gl_texture_unit *texUnit;
-   GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END(ctx);
-
-   if (!ctx->Extensions.ATI_envmap_bumpmap) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glTexBumpParameterfvATI");
-      return;
-   }
-
-   texUnit = _mesa_get_current_tex_unit(ctx);
-
-   if (pname == GL_BUMP_ROT_MATRIX_ATI) {
-      if (TEST_EQ_4V(param, texUnit->RotMatrix))
-         return;
-      FLUSH_VERTICES(ctx, _NEW_TEXTURE);
-      COPY_4FV(texUnit->RotMatrix, param);
-   }
-   else {
-      _mesa_error( ctx, GL_INVALID_ENUM, "glTexBumpParameter(pname)" );
-      return;
-   }
-   /* Drivers might want to know about this, instead of dedicated function
-      just shove it into TexEnv where it really belongs anyway */
-   if (ctx->Driver.TexEnv) {
-      (*ctx->Driver.TexEnv)( ctx, 0, pname, param );
-   }
-}
-
-
-void GLAPIENTRY
-_mesa_GetTexBumpParameterivATI( GLenum pname, GLint *param )
-{
-   const struct gl_texture_unit *texUnit;
-   GLuint i;
-   GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END(ctx);
-
-   if (!ctx->Extensions.ATI_envmap_bumpmap) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexBumpParameterivATI");
-      return;
-   }
-
-   texUnit = _mesa_get_current_tex_unit(ctx);
-
-   if (pname == GL_BUMP_ROT_MATRIX_SIZE_ATI) {
-      /* spec leaves open to support larger matrices.
-         Don't think anyone would ever want to use it
-         (and apps almost certainly would not understand it and
-         thus fail to submit matrices correctly) so hardcode this. */
-      *param = 4;
-   }
-   else if (pname == GL_BUMP_ROT_MATRIX_ATI) {
-      /* hope that conversion is correct here */
-      param[0] = FLOAT_TO_INT(texUnit->RotMatrix[0]);
-      param[1] = FLOAT_TO_INT(texUnit->RotMatrix[1]);
-      param[2] = FLOAT_TO_INT(texUnit->RotMatrix[2]);
-      param[3] = FLOAT_TO_INT(texUnit->RotMatrix[3]);
-   }
-   else if (pname == GL_BUMP_NUM_TEX_UNITS_ATI) {
-      GLint count = 0;
-      for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) {
-         if (ctx->Const.SupportedBumpUnits & (1 << i)) {
-            count++;
-         }
-      }
-      *param = count;
-   }
-   else if (pname == GL_BUMP_TEX_UNITS_ATI) {
-      for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) {
-         if (ctx->Const.SupportedBumpUnits & (1 << i)) {
-            *param++ = i + GL_TEXTURE0;
-         }
-      }
-   }
-   else {
-      _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexBumpParameter(pname)" );
-      return;
-   }
-}
-
-
-void GLAPIENTRY
-_mesa_GetTexBumpParameterfvATI( GLenum pname, GLfloat *param )
-{
-   const struct gl_texture_unit *texUnit;
-   GLuint i;
-   GET_CURRENT_CONTEXT(ctx);
-   ASSERT_OUTSIDE_BEGIN_END(ctx);
-
-   if (!ctx->Extensions.ATI_envmap_bumpmap) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexBumpParameterfvATI");
-      return;
-   }
-
-   texUnit = _mesa_get_current_tex_unit(ctx);
-
-   if (pname == GL_BUMP_ROT_MATRIX_SIZE_ATI) {
-      /* spec leaves open to support larger matrices.
-         Don't think anyone would ever want to use it
-         (and apps might not understand it) so hardcode this. */
-      *param = 4.0F;
-   }
-   else if (pname == GL_BUMP_ROT_MATRIX_ATI) {
-      param[0] = texUnit->RotMatrix[0];
-      param[1] = texUnit->RotMatrix[1];
-      param[2] = texUnit->RotMatrix[2];
-      param[3] = texUnit->RotMatrix[3];
-   }
-   else if (pname == GL_BUMP_NUM_TEX_UNITS_ATI) {
-      GLint count = 0;
-      for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) {
-         if (ctx->Const.SupportedBumpUnits & (1 << i)) {
-            count++;
-         }
-      }
-      *param = (GLfloat) count;
-   }
-   else if (pname == GL_BUMP_TEX_UNITS_ATI) {
-      for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) {
-         if (ctx->Const.SupportedBumpUnits & (1 << i)) {
-            *param++ = (GLfloat) (i + GL_TEXTURE0);
-         }
-      }
-   }
-   else {
-      _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexBumpParameter(pname)" );
-      return;
-   }
-}
+/*
+ * Mesa 3-D graphics library
+ * Version:  7.5
+ *
+ * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
+ * Copyright (C) 2009  VMware, Inc.  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"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/** 
+ * \file texenv.c
+ *
+ * glTexEnv-related functions
+ */
+
+
+#include "main/glheader.h"
+#include "main/context.h"
+#include "main/enums.h"
+#include "main/macros.h"
+#include "main/mtypes.h"
+#include "main/state.h"
+#include "main/texenv.h"
+#include "main/texstate.h"
+
+
+#define TE_ERROR(errCode, msg, value)				\
+   _mesa_error(ctx, errCode, msg, _mesa_lookup_enum_by_nr(value));
+
+
+/** Set texture env mode */
+static void
+set_env_mode(struct gl_context *ctx,
+             struct gl_texture_unit *texUnit,
+             GLenum mode)
+{
+   GLboolean legal;
+
+   if (texUnit->EnvMode == mode)
+      return;
+
+   switch (mode) {
+   case GL_MODULATE:
+   case GL_BLEND:
+   case GL_DECAL:
+   case GL_REPLACE:
+      legal = GL_TRUE;
+      break;
+   case GL_REPLACE_EXT:
+      mode = GL_REPLACE; /* GL_REPLACE_EXT != GL_REPLACE */
+      legal = GL_TRUE;
+      break;
+   case GL_ADD:
+      legal = ctx->Extensions.EXT_texture_env_add;
+      break;
+   case GL_COMBINE:
+      legal = (ctx->Extensions.EXT_texture_env_combine ||
+               ctx->Extensions.ARB_texture_env_combine);
+      break;
+   case GL_COMBINE4_NV:
+      legal = ctx->Extensions.NV_texture_env_combine4;
+      break;
+   default:
+      legal = GL_FALSE;
+   }
+
+   if (legal) {
+      FLUSH_VERTICES(ctx, _NEW_TEXTURE);
+      texUnit->EnvMode = mode;
+   }
+   else {
+      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);
+   }
+}
+
+
+static void
+set_env_color(struct gl_context *ctx,
+              struct gl_texture_unit *texUnit,
+              const GLfloat *color)
+{
+   if (TEST_EQ_4V(color, texUnit->EnvColorUnclamped))
+      return;
+   FLUSH_VERTICES(ctx, _NEW_TEXTURE);
+   COPY_4FV(texUnit->EnvColorUnclamped, color);
+   texUnit->EnvColor[0] = CLAMP(color[0], 0.0F, 1.0F);
+   texUnit->EnvColor[1] = CLAMP(color[1], 0.0F, 1.0F);
+   texUnit->EnvColor[2] = CLAMP(color[2], 0.0F, 1.0F);
+   texUnit->EnvColor[3] = CLAMP(color[3], 0.0F, 1.0F);
+}
+
+
+/** Set an RGB or A combiner mode/function */
+static void
+set_combiner_mode(struct gl_context *ctx,
+                  struct gl_texture_unit *texUnit,
+                  GLenum pname, GLenum mode)
+{
+   GLboolean legal;
+
+   if (!ctx->Extensions.EXT_texture_env_combine &&
+       !ctx->Extensions.ARB_texture_env_combine) {
+      _mesa_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)");
+      return;
+   }
+
+   switch (mode) {
+   case GL_REPLACE:
+   case GL_MODULATE:
+   case GL_ADD:
+   case GL_ADD_SIGNED:
+   case GL_INTERPOLATE:
+      legal = GL_TRUE;
+      break;
+   case GL_SUBTRACT:
+      legal = ctx->Extensions.ARB_texture_env_combine;
+      break;
+   case GL_DOT3_RGB_EXT:
+   case GL_DOT3_RGBA_EXT:
+      legal = (ctx->Extensions.EXT_texture_env_dot3 &&
+               pname == GL_COMBINE_RGB);
+      break;
+   case GL_DOT3_RGB:
+   case GL_DOT3_RGBA:
+      legal = (ctx->Extensions.ARB_texture_env_dot3 &&
+               pname == GL_COMBINE_RGB);
+      break;
+   case GL_MODULATE_ADD_ATI:
+   case GL_MODULATE_SIGNED_ADD_ATI:
+   case GL_MODULATE_SUBTRACT_ATI:
+      legal = ctx->Extensions.ATI_texture_env_combine3;
+      break;
+   case GL_BUMP_ENVMAP_ATI:
+      legal = (ctx->Extensions.ATI_envmap_bumpmap &&
+               pname == GL_COMBINE_RGB);
+      break;
+   default:
+      legal = GL_FALSE;
+   }
+
+   if (!legal) {
+      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", mode);
+      return;
+   }
+
+   switch (pname) {
+   case GL_COMBINE_RGB:
+      if (texUnit->Combine.ModeRGB == mode)
+         return;
+      FLUSH_VERTICES(ctx, _NEW_TEXTURE);
+      texUnit->Combine.ModeRGB = mode;
+      break;
+
+   case GL_COMBINE_ALPHA:
+      if (texUnit->Combine.ModeA == mode)
+         return;
+      FLUSH_VERTICES(ctx, _NEW_TEXTURE);
+      texUnit->Combine.ModeA = mode;
+      break;
+   default:
+      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
+   }
+}
+
+
+
+/** Set an RGB or A combiner source term */
+static void
+set_combiner_source(struct gl_context *ctx,
+                    struct gl_texture_unit *texUnit,
+                    GLenum pname, GLenum param)
+{
+   GLuint term;
+   GLboolean alpha, legal;
+
+   if (!ctx->Extensions.EXT_texture_env_combine &&
+       !ctx->Extensions.ARB_texture_env_combine) {
+      _mesa_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)");
+      return;
+   }
+
+   /*
+    * Translate pname to (term, alpha).
+    *
+    * The enums were given sequential values for a reason.
+    */
+   switch (pname) {
+   case GL_SOURCE0_RGB:
+   case GL_SOURCE1_RGB:
+   case GL_SOURCE2_RGB:
+   case GL_SOURCE3_RGB_NV:
+      term = pname - GL_SOURCE0_RGB;
+      alpha = GL_FALSE;
+      break;
+   case GL_SOURCE0_ALPHA:
+   case GL_SOURCE1_ALPHA:
+   case GL_SOURCE2_ALPHA:
+   case GL_SOURCE3_ALPHA_NV:
+      term = pname - GL_SOURCE0_ALPHA;
+      alpha = GL_TRUE;
+      break;
+   default:
+      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
+      return;
+   }
+
+   if ((term == 3) && !ctx->Extensions.NV_texture_env_combine4) {
+      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
+      return;
+   }
+
+   assert(term < MAX_COMBINER_TERMS);
+
+   /*
+    * Error-check param (the source term)
+    */
+   switch (param) {
+   case GL_TEXTURE:
+   case GL_CONSTANT:
+   case GL_PRIMARY_COLOR:
+   case GL_PREVIOUS:
+      legal = GL_TRUE;
+      break;
+   case GL_TEXTURE0:
+   case GL_TEXTURE1:
+   case GL_TEXTURE2:
+   case GL_TEXTURE3:
+   case GL_TEXTURE4:
+   case GL_TEXTURE5:
+   case GL_TEXTURE6:
+   case GL_TEXTURE7:
+      legal = (ctx->Extensions.ARB_texture_env_crossbar &&
+               param - GL_TEXTURE0 < ctx->Const.MaxTextureUnits);
+      break;
+   case GL_ZERO:
+      legal = (ctx->Extensions.ATI_texture_env_combine3 ||
+               ctx->Extensions.NV_texture_env_combine4);
+      break;
+   case GL_ONE:
+      legal = ctx->Extensions.ATI_texture_env_combine3;
+      break;
+   default:
+      legal = GL_FALSE;
+   }
+
+   if (!legal) {
+      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", param);
+      return;
+   }
+
+   FLUSH_VERTICES(ctx, _NEW_TEXTURE);
+
+   if (alpha)
+      texUnit->Combine.SourceA[term] = param;
+   else
+      texUnit->Combine.SourceRGB[term] = param;
+}
+
+
+/** Set an RGB or A combiner operand term */
+static void
+set_combiner_operand(struct gl_context *ctx,
+                     struct gl_texture_unit *texUnit,
+                     GLenum pname, GLenum param)
+{
+   GLuint term;
+   GLboolean alpha, legal;
+
+   if (!ctx->Extensions.EXT_texture_env_combine &&
+       !ctx->Extensions.ARB_texture_env_combine) {
+      _mesa_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)");
+      return;
+   }
+
+   /* The enums were given sequential values for a reason.
+    */
+   switch (pname) {
+   case GL_OPERAND0_RGB:
+   case GL_OPERAND1_RGB:
+   case GL_OPERAND2_RGB:
+   case GL_OPERAND3_RGB_NV:
+      term = pname - GL_OPERAND0_RGB;
+      alpha = GL_FALSE;
+      break;
+   case GL_OPERAND0_ALPHA:
+   case GL_OPERAND1_ALPHA:
+   case GL_OPERAND2_ALPHA:
+   case GL_OPERAND3_ALPHA_NV:
+      term = pname - GL_OPERAND0_ALPHA;
+      alpha = GL_TRUE;
+      break;
+   default:
+      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
+      return;
+   }
+
+   if ((term == 3) && !ctx->Extensions.NV_texture_env_combine4) {
+      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
+      return;
+   }
+
+   assert(term < MAX_COMBINER_TERMS);
+
+   /*
+    * Error-check param (the source operand)
+    */
+   switch (param) {
+   case GL_SRC_COLOR:
+   case GL_ONE_MINUS_SRC_COLOR:
+      /* The color input can only be used with GL_OPERAND[01]_RGB in the EXT
+       * version.  In the ARB and NV versions they can be used for any RGB
+       * operand.
+       */
+      legal = !alpha
+	 && ((term < 2) || ctx->Extensions.ARB_texture_env_combine
+	     || ctx->Extensions.NV_texture_env_combine4);
+      break;
+   case GL_ONE_MINUS_SRC_ALPHA:
+      /* GL_ONE_MINUS_SRC_ALPHA can only be used with
+       * GL_OPERAND[01]_(RGB|ALPHA) in the EXT version.  In the ARB and NV
+       * versions it can be used for any operand.
+       */
+      legal = (term < 2) || ctx->Extensions.ARB_texture_env_combine
+	 || ctx->Extensions.NV_texture_env_combine4;
+      break;
+   case GL_SRC_ALPHA:
+      legal = GL_TRUE;
+      break;
+   default:
+      legal = GL_FALSE;
+   }
+
+   if (!legal) {
+      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(param=%s)", param);
+      return;
+   }
+
+   FLUSH_VERTICES(ctx, _NEW_TEXTURE);
+
+   if (alpha)
+      texUnit->Combine.OperandA[term] = param;
+   else
+      texUnit->Combine.OperandRGB[term] = param;
+}
+
+
+static void
+set_combiner_scale(struct gl_context *ctx,
+                   struct gl_texture_unit *texUnit,
+                   GLenum pname, GLfloat scale)
+{
+   GLuint shift;
+
+   if (!ctx->Extensions.EXT_texture_env_combine &&
+       !ctx->Extensions.ARB_texture_env_combine) {
+      _mesa_error(ctx, GL_INVALID_ENUM, "glTexEnv(pname)");
+      return;
+   }
+
+   if (scale == 1.0F) {
+      shift = 0;
+   }
+   else if (scale == 2.0F) {
+      shift = 1;
+   }
+   else if (scale == 4.0F) {
+      shift = 2;
+   }
+   else {
+      _mesa_error( ctx, GL_INVALID_VALUE,
+                   "glTexEnv(GL_RGB_SCALE not 1, 2 or 4)" );
+      return;
+   }
+
+   switch (pname) {
+   case GL_RGB_SCALE:
+      if (texUnit->Combine.ScaleShiftRGB == shift)
+         return;
+      FLUSH_VERTICES(ctx, _NEW_TEXTURE);
+      texUnit->Combine.ScaleShiftRGB = shift;
+      break;
+   case GL_ALPHA_SCALE:
+      if (texUnit->Combine.ScaleShiftA == shift)
+         return;
+      FLUSH_VERTICES(ctx, _NEW_TEXTURE);
+      texUnit->Combine.ScaleShiftA = shift;
+      break;
+   default:
+      TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
+   }
+}
+
+
+
+void GLAPIENTRY
+_mesa_TexEnvfv( GLenum target, GLenum pname, const GLfloat *param )
+{
+   const GLint iparam0 = (GLint) param[0];
+   struct gl_texture_unit *texUnit;
+   GLuint maxUnit;
+
+   GET_CURRENT_CONTEXT(ctx);
+   ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+   maxUnit = (target == GL_POINT_SPRITE_NV && pname == GL_COORD_REPLACE_NV)
+      ? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxTextureImageUnits;
+   if (ctx->Texture.CurrentUnit >= maxUnit) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glTexEnvfv(current unit)");
+      return;
+   }
+
+   texUnit = _mesa_get_current_tex_unit(ctx);
+
+   if (target == GL_TEXTURE_ENV) {
+      switch (pname) {
+      case GL_TEXTURE_ENV_MODE:
+         set_env_mode(ctx, texUnit, (GLenum) iparam0);
+         break;
+      case GL_TEXTURE_ENV_COLOR:
+         set_env_color(ctx, texUnit, param);
+         break;
+      case GL_COMBINE_RGB:
+      case GL_COMBINE_ALPHA:
+         set_combiner_mode(ctx, texUnit, pname, (GLenum) iparam0);
+	 break;
+      case GL_SOURCE0_RGB:
+      case GL_SOURCE1_RGB:
+      case GL_SOURCE2_RGB:
+      case GL_SOURCE3_RGB_NV:
+      case GL_SOURCE0_ALPHA:
+      case GL_SOURCE1_ALPHA:
+      case GL_SOURCE2_ALPHA:
+      case GL_SOURCE3_ALPHA_NV:
+         set_combiner_source(ctx, texUnit, pname, (GLenum) iparam0);
+	 break;
+      case GL_OPERAND0_RGB:
+      case GL_OPERAND1_RGB:
+      case GL_OPERAND2_RGB:
+      case GL_OPERAND3_RGB_NV:
+      case GL_OPERAND0_ALPHA:
+      case GL_OPERAND1_ALPHA:
+      case GL_OPERAND2_ALPHA:
+      case GL_OPERAND3_ALPHA_NV:
+         set_combiner_operand(ctx, texUnit, pname, (GLenum) iparam0);
+	 break;
+      case GL_RGB_SCALE:
+      case GL_ALPHA_SCALE:
+         set_combiner_scale(ctx, texUnit, pname, param[0]);
+	 break;
+      case GL_BUMP_TARGET_ATI:
+         if (!ctx->Extensions.ATI_envmap_bumpmap) {
+	    _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname=0x%x)", pname );
+	    return;
+	 }
+	 if ((iparam0 < GL_TEXTURE0) ||
+             (iparam0 > GL_TEXTURE31)) {
+	    /* spec doesn't say this but it seems logical */
+	    _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(param=0x%x)", iparam0);
+	    return;
+	 }
+	 if (!((1 << (iparam0 - GL_TEXTURE0)) & ctx->Const.SupportedBumpUnits)) {
+	    _mesa_error( ctx, GL_INVALID_VALUE, "glTexEnv(param=0x%x)", iparam0);
+	    return;
+	 }
+	 else {
+	    FLUSH_VERTICES(ctx, _NEW_TEXTURE);
+	    texUnit->BumpTarget = iparam0;
+	 }
+	 break;
+      default:
+	 _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname)" );
+	 return;
+      }
+   }
+   else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) {
+      /* GL_EXT_texture_lod_bias */
+      if (!ctx->Extensions.EXT_texture_lod_bias) {
+	 _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)", target );
+	 return;
+      }
+      if (pname == GL_TEXTURE_LOD_BIAS_EXT) {
+	 if (texUnit->LodBias == param[0])
+	    return;
+	 FLUSH_VERTICES(ctx, _NEW_TEXTURE);
+         texUnit->LodBias = param[0];
+      }
+      else {
+         TE_ERROR(GL_INVALID_ENUM, "glTexEnv(pname=%s)", pname);
+	 return;
+      }
+   }
+   else if (target == GL_POINT_SPRITE_NV) {
+      /* GL_ARB_point_sprite / GL_NV_point_sprite */
+      if (!ctx->Extensions.NV_point_sprite
+	  && !ctx->Extensions.ARB_point_sprite) {
+	 _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)", target );
+	 return;
+      }
+      if (pname == GL_COORD_REPLACE_NV) {
+         if (iparam0 == GL_TRUE || iparam0 == GL_FALSE) {
+            /* It's kind of weird to set point state via glTexEnv,
+             * but that's what the spec calls for.
+             */
+            const GLboolean state = (GLboolean) iparam0;
+            if (ctx->Point.CoordReplace[ctx->Texture.CurrentUnit] == state)
+               return;
+            FLUSH_VERTICES(ctx, _NEW_POINT);
+            ctx->Point.CoordReplace[ctx->Texture.CurrentUnit] = state;
+         }
+         else {
+            _mesa_error( ctx, GL_INVALID_VALUE, "glTexEnv(param=0x%x)", iparam0);
+            return;
+         }
+      }
+      else {
+         _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(pname=0x%x)", pname );
+         return;
+      }
+   }
+   else {
+      _mesa_error( ctx, GL_INVALID_ENUM, "glTexEnv(target=0x%x)",target );
+      return;
+   }
+
+   if (MESA_VERBOSE&(VERBOSE_API|VERBOSE_TEXTURE))
+      _mesa_debug(ctx, "glTexEnv %s %s %.1f(%s) ...\n",
+                  _mesa_lookup_enum_by_nr(target),
+                  _mesa_lookup_enum_by_nr(pname),
+                  *param,
+                  _mesa_lookup_enum_by_nr((GLenum) iparam0));
+
+   /* Tell device driver about the new texture environment */
+   if (ctx->Driver.TexEnv) {
+      (*ctx->Driver.TexEnv)( ctx, target, pname, param );
+   }
+}
+
+
+void GLAPIENTRY
+_mesa_TexEnvf( GLenum target, GLenum pname, GLfloat param )
+{
+   GLfloat p[4];
+   p[0] = param;
+   p[1] = p[2] = p[3] = 0.0;
+   _mesa_TexEnvfv( target, pname, p );
+}
+
+
+
+void GLAPIENTRY
+_mesa_TexEnvi( GLenum target, GLenum pname, GLint param )
+{
+   GLfloat p[4];
+   p[0] = (GLfloat) param;
+   p[1] = p[2] = p[3] = 0.0;
+   _mesa_TexEnvfv( target, pname, p );
+}
+
+
+void GLAPIENTRY
+_mesa_TexEnviv( GLenum target, GLenum pname, const GLint *param )
+{
+   GLfloat p[4];
+   if (pname == GL_TEXTURE_ENV_COLOR) {
+      p[0] = INT_TO_FLOAT( param[0] );
+      p[1] = INT_TO_FLOAT( param[1] );
+      p[2] = INT_TO_FLOAT( param[2] );
+      p[3] = INT_TO_FLOAT( param[3] );
+   }
+   else {
+      p[0] = (GLfloat) param[0];
+      p[1] = p[2] = p[3] = 0;  /* init to zero, just to be safe */
+   }
+   _mesa_TexEnvfv( target, pname, p );
+}
+
+
+
+/**
+ * Helper for glGetTexEnvi/f()
+ * \return  value of queried pname or -1 if error.
+ */
+static GLint
+get_texenvi(struct gl_context *ctx, const struct gl_texture_unit *texUnit,
+            GLenum pname)
+{
+   switch (pname) {
+   case GL_TEXTURE_ENV_MODE:
+      return texUnit->EnvMode;
+      break;
+   case GL_COMBINE_RGB:
+      if (ctx->Extensions.EXT_texture_env_combine ||
+          ctx->Extensions.ARB_texture_env_combine) {
+         return texUnit->Combine.ModeRGB;
+      }
+      else {
+         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
+      }
+      break;
+   case GL_COMBINE_ALPHA:
+      if (ctx->Extensions.EXT_texture_env_combine ||
+          ctx->Extensions.ARB_texture_env_combine) {
+         return texUnit->Combine.ModeA;
+      }
+      else {
+         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
+      }
+      break;
+   case GL_SOURCE0_RGB:
+   case GL_SOURCE1_RGB:
+   case GL_SOURCE2_RGB:
+      if (ctx->Extensions.EXT_texture_env_combine ||
+          ctx->Extensions.ARB_texture_env_combine) {
+         const unsigned rgb_idx = pname - GL_SOURCE0_RGB;
+         return texUnit->Combine.SourceRGB[rgb_idx];
+      }
+      else {
+         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
+      }
+      break;
+   case GL_SOURCE3_RGB_NV:
+      if (ctx->Extensions.NV_texture_env_combine4) {
+         return texUnit->Combine.SourceRGB[3];
+      }
+      else {
+         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
+      }
+      break;
+   case GL_SOURCE0_ALPHA:
+   case GL_SOURCE1_ALPHA:
+   case GL_SOURCE2_ALPHA:
+      if (ctx->Extensions.EXT_texture_env_combine ||
+          ctx->Extensions.ARB_texture_env_combine) {
+         const unsigned alpha_idx = pname - GL_SOURCE0_ALPHA;
+         return texUnit->Combine.SourceA[alpha_idx];
+      }
+      else {
+         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
+      }
+      break;
+   case GL_SOURCE3_ALPHA_NV:
+      if (ctx->Extensions.NV_texture_env_combine4) {
+         return texUnit->Combine.SourceA[3];
+      }
+      else {
+         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
+      }
+      break;
+   case GL_OPERAND0_RGB:
+   case GL_OPERAND1_RGB:
+   case GL_OPERAND2_RGB:
+      if (ctx->Extensions.EXT_texture_env_combine ||
+          ctx->Extensions.ARB_texture_env_combine) {
+         const unsigned op_rgb = pname - GL_OPERAND0_RGB;
+         return texUnit->Combine.OperandRGB[op_rgb];
+      }
+      else {
+         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
+      }
+      break;
+   case GL_OPERAND3_RGB_NV:
+      if (ctx->Extensions.NV_texture_env_combine4) {
+         return texUnit->Combine.OperandRGB[3];
+      }
+      else {
+         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
+      }
+      break;
+   case GL_OPERAND0_ALPHA:
+   case GL_OPERAND1_ALPHA:
+   case GL_OPERAND2_ALPHA:
+      if (ctx->Extensions.EXT_texture_env_combine ||
+          ctx->Extensions.ARB_texture_env_combine) {
+         const unsigned op_alpha = pname - GL_OPERAND0_ALPHA;
+         return texUnit->Combine.OperandA[op_alpha];
+      }
+      else {
+         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
+      }
+      break;
+   case GL_OPERAND3_ALPHA_NV:
+      if (ctx->Extensions.NV_texture_env_combine4) {
+         return texUnit->Combine.OperandA[3];
+      }
+      else {
+         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
+      }
+      break;
+   case GL_RGB_SCALE:
+      if (ctx->Extensions.EXT_texture_env_combine ||
+          ctx->Extensions.ARB_texture_env_combine) {
+         return 1 << texUnit->Combine.ScaleShiftRGB;
+      }
+      else {
+         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
+      }
+      break;
+   case GL_ALPHA_SCALE:
+      if (ctx->Extensions.EXT_texture_env_combine ||
+          ctx->Extensions.ARB_texture_env_combine) {
+         return 1 << texUnit->Combine.ScaleShiftA;
+      }
+      else {
+         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
+      }
+      break;
+   case GL_BUMP_TARGET_ATI:
+      /* spec doesn't say so, but I think this should be queryable */
+      if (ctx->Extensions.ATI_envmap_bumpmap) {
+         return texUnit->BumpTarget;
+      }
+      else {
+         _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)");
+      }
+      break;
+
+   default:
+      ;
+   }
+
+   return -1; /* error */
+}
+
+
+
+void GLAPIENTRY
+_mesa_GetTexEnvfv( GLenum target, GLenum pname, GLfloat *params )
+{
+   GLuint maxUnit;
+   const struct gl_texture_unit *texUnit;
+   GET_CURRENT_CONTEXT(ctx);
+   ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+   maxUnit = (target == GL_POINT_SPRITE_NV && pname == GL_COORD_REPLACE_NV)
+      ? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxTextureImageUnits;
+   if (ctx->Texture.CurrentUnit >= maxUnit) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexEnvfv(current unit)");
+      return;
+   }
+
+   texUnit = _mesa_get_current_tex_unit(ctx);
+
+   if (target == GL_TEXTURE_ENV) {
+      if (pname == GL_TEXTURE_ENV_COLOR) {
+         if(ctx->NewState & (_NEW_BUFFERS | _NEW_FRAG_CLAMP))
+            _mesa_update_state(ctx);
+         if(ctx->Color._ClampFragmentColor)
+            COPY_4FV( params, texUnit->EnvColor );
+         else
+            COPY_4FV( params, texUnit->EnvColorUnclamped );
+      }
+      else {
+         GLint val = get_texenvi(ctx, texUnit, pname);
+         if (val >= 0) {
+            *params = (GLfloat) val;
+         }
+      }
+   }
+   else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) {
+      /* GL_EXT_texture_lod_bias */
+      if (!ctx->Extensions.EXT_texture_lod_bias) {
+	 _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" );
+	 return;
+      }
+      if (pname == GL_TEXTURE_LOD_BIAS_EXT) {
+         *params = texUnit->LodBias;
+      }
+      else {
+         _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" );
+	 return;
+      }
+   }
+   else if (target == GL_POINT_SPRITE_NV) {
+      /* GL_ARB_point_sprite / GL_NV_point_sprite */
+      if (!ctx->Extensions.NV_point_sprite
+	  && !ctx->Extensions.ARB_point_sprite) {
+         _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" );
+         return;
+      }
+      if (pname == GL_COORD_REPLACE_NV) {
+         *params = (GLfloat) ctx->Point.CoordReplace[ctx->Texture.CurrentUnit];
+      }
+      else {
+         _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(pname)" );
+         return;
+      }
+   }
+   else {
+      _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnvfv(target)" );
+      return;
+   }
+}
+
+
+void GLAPIENTRY
+_mesa_GetTexEnviv( GLenum target, GLenum pname, GLint *params )
+{
+   GLuint maxUnit;
+   const struct gl_texture_unit *texUnit;
+   GET_CURRENT_CONTEXT(ctx);
+   ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+   maxUnit = (target == GL_POINT_SPRITE_NV && pname == GL_COORD_REPLACE_NV)
+      ? ctx->Const.MaxTextureCoordUnits : ctx->Const.MaxTextureImageUnits;
+   if (ctx->Texture.CurrentUnit >= maxUnit) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexEnviv(current unit)");
+      return;
+   }
+
+   texUnit = _mesa_get_current_tex_unit(ctx);
+
+   if (target == GL_TEXTURE_ENV) {
+      if (pname == GL_TEXTURE_ENV_COLOR) {
+         params[0] = FLOAT_TO_INT( texUnit->EnvColor[0] );
+         params[1] = FLOAT_TO_INT( texUnit->EnvColor[1] );
+         params[2] = FLOAT_TO_INT( texUnit->EnvColor[2] );
+         params[3] = FLOAT_TO_INT( texUnit->EnvColor[3] );
+      }
+      else {
+         GLint val = get_texenvi(ctx, texUnit, pname);
+         if (val >= 0) {
+            *params = val;
+         }
+      }
+   }
+   else if (target == GL_TEXTURE_FILTER_CONTROL_EXT) {
+      /* GL_EXT_texture_lod_bias */
+      if (!ctx->Extensions.EXT_texture_lod_bias) {
+	 _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" );
+	 return;
+      }
+      if (pname == GL_TEXTURE_LOD_BIAS_EXT) {
+         *params = (GLint) texUnit->LodBias;
+      }
+      else {
+         _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)" );
+	 return;
+      }
+   }
+   else if (target == GL_POINT_SPRITE_NV) {
+      /* GL_ARB_point_sprite / GL_NV_point_sprite */
+      if (!ctx->Extensions.NV_point_sprite
+	  && !ctx->Extensions.ARB_point_sprite) {
+         _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" );
+         return;
+      }
+      if (pname == GL_COORD_REPLACE_NV) {
+         *params = (GLint) ctx->Point.CoordReplace[ctx->Texture.CurrentUnit];
+      }
+      else {
+         _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(pname)" );
+         return;
+      }
+   }
+   else {
+      _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexEnviv(target)" );
+      return;
+   }
+}
+
+
+/**
+ * Why does ATI_envmap_bumpmap require new entrypoints? Should just
+ * reuse TexEnv ones...
+ */
+void GLAPIENTRY
+_mesa_TexBumpParameterivATI( GLenum pname, const GLint *param )
+{
+   GLfloat p[4];
+   GET_CURRENT_CONTEXT(ctx);
+   ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+   if (!ctx->Extensions.ATI_envmap_bumpmap) {
+      /* This isn't an "official" error case, but let's tell the user
+       * that something's wrong.
+       */
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glTexBumpParameterivATI");
+      return;
+   }
+
+   if (pname == GL_BUMP_ROT_MATRIX_ATI) {
+      /* hope that conversion is correct here */
+      p[0] = INT_TO_FLOAT( param[0] );
+      p[1] = INT_TO_FLOAT( param[1] );
+      p[2] = INT_TO_FLOAT( param[2] );
+      p[3] = INT_TO_FLOAT( param[3] );
+   }
+   else {
+      p[0] = (GLfloat) param[0];
+      p[1] = p[2] = p[3] = 0.0F;  /* init to zero, just to be safe */
+   }
+   _mesa_TexBumpParameterfvATI( pname, p );
+}
+
+
+void GLAPIENTRY
+_mesa_TexBumpParameterfvATI( GLenum pname, const GLfloat *param )
+{
+   struct gl_texture_unit *texUnit;
+   GET_CURRENT_CONTEXT(ctx);
+   ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+   if (!ctx->Extensions.ATI_envmap_bumpmap) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glTexBumpParameterfvATI");
+      return;
+   }
+
+   texUnit = _mesa_get_current_tex_unit(ctx);
+
+   if (pname == GL_BUMP_ROT_MATRIX_ATI) {
+      if (TEST_EQ_4V(param, texUnit->RotMatrix))
+         return;
+      FLUSH_VERTICES(ctx, _NEW_TEXTURE);
+      COPY_4FV(texUnit->RotMatrix, param);
+   }
+   else {
+      _mesa_error( ctx, GL_INVALID_ENUM, "glTexBumpParameter(pname)" );
+      return;
+   }
+   /* Drivers might want to know about this, instead of dedicated function
+      just shove it into TexEnv where it really belongs anyway */
+   if (ctx->Driver.TexEnv) {
+      (*ctx->Driver.TexEnv)( ctx, 0, pname, param );
+   }
+}
+
+
+void GLAPIENTRY
+_mesa_GetTexBumpParameterivATI( GLenum pname, GLint *param )
+{
+   const struct gl_texture_unit *texUnit;
+   GLuint i;
+   GET_CURRENT_CONTEXT(ctx);
+   ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+   if (!ctx->Extensions.ATI_envmap_bumpmap) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexBumpParameterivATI");
+      return;
+   }
+
+   texUnit = _mesa_get_current_tex_unit(ctx);
+
+   if (pname == GL_BUMP_ROT_MATRIX_SIZE_ATI) {
+      /* spec leaves open to support larger matrices.
+         Don't think anyone would ever want to use it
+         (and apps almost certainly would not understand it and
+         thus fail to submit matrices correctly) so hardcode this. */
+      *param = 4;
+   }
+   else if (pname == GL_BUMP_ROT_MATRIX_ATI) {
+      /* hope that conversion is correct here */
+      param[0] = FLOAT_TO_INT(texUnit->RotMatrix[0]);
+      param[1] = FLOAT_TO_INT(texUnit->RotMatrix[1]);
+      param[2] = FLOAT_TO_INT(texUnit->RotMatrix[2]);
+      param[3] = FLOAT_TO_INT(texUnit->RotMatrix[3]);
+   }
+   else if (pname == GL_BUMP_NUM_TEX_UNITS_ATI) {
+      GLint count = 0;
+      for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) {
+         if (ctx->Const.SupportedBumpUnits & (1 << i)) {
+            count++;
+         }
+      }
+      *param = count;
+   }
+   else if (pname == GL_BUMP_TEX_UNITS_ATI) {
+      for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) {
+         if (ctx->Const.SupportedBumpUnits & (1 << i)) {
+            *param++ = i + GL_TEXTURE0;
+         }
+      }
+   }
+   else {
+      _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexBumpParameter(pname)" );
+      return;
+   }
+}
+
+
+void GLAPIENTRY
+_mesa_GetTexBumpParameterfvATI( GLenum pname, GLfloat *param )
+{
+   const struct gl_texture_unit *texUnit;
+   GLuint i;
+   GET_CURRENT_CONTEXT(ctx);
+   ASSERT_OUTSIDE_BEGIN_END(ctx);
+
+   if (!ctx->Extensions.ATI_envmap_bumpmap) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexBumpParameterfvATI");
+      return;
+   }
+
+   texUnit = _mesa_get_current_tex_unit(ctx);
+
+   if (pname == GL_BUMP_ROT_MATRIX_SIZE_ATI) {
+      /* spec leaves open to support larger matrices.
+         Don't think anyone would ever want to use it
+         (and apps might not understand it) so hardcode this. */
+      *param = 4.0F;
+   }
+   else if (pname == GL_BUMP_ROT_MATRIX_ATI) {
+      param[0] = texUnit->RotMatrix[0];
+      param[1] = texUnit->RotMatrix[1];
+      param[2] = texUnit->RotMatrix[2];
+      param[3] = texUnit->RotMatrix[3];
+   }
+   else if (pname == GL_BUMP_NUM_TEX_UNITS_ATI) {
+      GLint count = 0;
+      for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) {
+         if (ctx->Const.SupportedBumpUnits & (1 << i)) {
+            count++;
+         }
+      }
+      *param = (GLfloat) count;
+   }
+   else if (pname == GL_BUMP_TEX_UNITS_ATI) {
+      for (i = 0; i < ctx->Const.MaxTextureImageUnits; i++) {
+         if (ctx->Const.SupportedBumpUnits & (1 << i)) {
+            *param++ = (GLfloat) (i + GL_TEXTURE0);
+         }
+      }
+   }
+   else {
+      _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexBumpParameter(pname)" );
+      return;
+   }
+}
diff --git a/mesalib/src/mesa/main/texfetch.c b/mesalib/src/mesa/main/texfetch.c
index 988a7e054..b2181af29 100644
--- a/mesalib/src/mesa/main/texfetch.c
+++ b/mesalib/src/mesa/main/texfetch.c
@@ -696,11 +696,11 @@ texfetch_funcs[MESA_FORMAT_COUNT] =
       store_texel_signed_r8
    },
    {
-      MESA_FORMAT_SIGNED_RG88,
-      fetch_texel_1d_signed_rg88,
-      fetch_texel_2d_signed_rg88,
-      fetch_texel_3d_signed_rg88,
-      store_texel_signed_rg88
+      MESA_FORMAT_SIGNED_RG88_REV,
+      fetch_texel_1d_signed_rg88_rev,
+      fetch_texel_2d_signed_rg88_rev,
+      fetch_texel_3d_signed_rg88_rev,
+      store_texel_signed_rg88_rev
    },
    {
       MESA_FORMAT_SIGNED_RGBX8888,
@@ -724,18 +724,18 @@ texfetch_funcs[MESA_FORMAT_COUNT] =
       store_texel_signed_rgba8888_rev
    },
    {
-      MESA_FORMAT_SIGNED_R_16,
-      fetch_texel_1d_signed_r_16,
-      fetch_texel_2d_signed_r_16,
-      fetch_texel_3d_signed_r_16,
-      store_texel_signed_r_16
+      MESA_FORMAT_SIGNED_R16,
+      fetch_texel_1d_signed_r16,
+      fetch_texel_2d_signed_r16,
+      fetch_texel_3d_signed_r16,
+      store_texel_signed_r16
    },
    {
-      MESA_FORMAT_SIGNED_RG_16,
-      fetch_texel_1d_signed_rg_16,
-      fetch_texel_2d_signed_rg_16,
-      fetch_texel_3d_signed_rg_16,
-      store_texel_signed_rg_16
+      MESA_FORMAT_SIGNED_GR1616,
+      fetch_texel_1d_signed_rg1616,
+      fetch_texel_2d_signed_rg1616,
+      fetch_texel_3d_signed_rg1616,
+      store_texel_signed_rg1616
    },
    {
       MESA_FORMAT_SIGNED_RGB_16,
@@ -814,6 +814,62 @@ texfetch_funcs[MESA_FORMAT_COUNT] =
       NULL,
       NULL
    },
+   {
+      MESA_FORMAT_SIGNED_A8,
+      fetch_texel_1d_signed_a8,
+      fetch_texel_2d_signed_a8,
+      fetch_texel_3d_signed_a8,
+      store_texel_signed_a8
+   },
+   {
+      MESA_FORMAT_SIGNED_L8,
+      fetch_texel_1d_signed_l8,
+      fetch_texel_2d_signed_l8,
+      fetch_texel_3d_signed_l8,
+      store_texel_signed_l8
+   },
+   {
+      MESA_FORMAT_SIGNED_AL88,
+      fetch_texel_1d_signed_al88,
+      fetch_texel_2d_signed_al88,
+      fetch_texel_3d_signed_al88,
+      store_texel_signed_al88
+   },
+   {
+      MESA_FORMAT_SIGNED_I8,
+      fetch_texel_1d_signed_i8,
+      fetch_texel_2d_signed_i8,
+      fetch_texel_3d_signed_i8,
+      store_texel_signed_i8
+   },
+   {
+      MESA_FORMAT_SIGNED_A16,
+      fetch_texel_1d_signed_a16,
+      fetch_texel_2d_signed_a16,
+      fetch_texel_3d_signed_a16,
+      store_texel_signed_a16
+   },
+   {
+      MESA_FORMAT_SIGNED_L16,
+      fetch_texel_1d_signed_l16,
+      fetch_texel_2d_signed_l16,
+      fetch_texel_3d_signed_l16,
+      store_texel_signed_l16
+   },
+   {
+      MESA_FORMAT_SIGNED_AL1616,
+      fetch_texel_1d_signed_al1616,
+      fetch_texel_2d_signed_al1616,
+      fetch_texel_3d_signed_al1616,
+      store_texel_signed_al1616
+   },
+   {
+      MESA_FORMAT_SIGNED_I16,
+      fetch_texel_1d_signed_i16,
+      fetch_texel_2d_signed_i16,
+      fetch_texel_3d_signed_i16,
+      store_texel_signed_i16
+   },
 };
 
 
diff --git a/mesalib/src/mesa/main/texfetch_tmp.h b/mesalib/src/mesa/main/texfetch_tmp.h
index 9c2b36a02..f1f6a01a4 100644
--- a/mesalib/src/mesa/main/texfetch_tmp.h
+++ b/mesalib/src/mesa/main/texfetch_tmp.h
@@ -1,2040 +1,2233 @@
-/*
- * Mesa 3-D graphics library
- * Version:  7.7
- *
- * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
- * Copyright (c) 2008-2009  VMware, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-
-/**
- * \file texfetch_tmp.h
- * Texel fetch functions template.
- * 
- * This template file is used by texfetch.c to generate texel fetch functions
- * for 1-D, 2-D and 3-D texture images. 
- *
- * It should be expanded by defining \p DIM as the number texture dimensions
- * (1, 2 or 3).  According to the value of \p DIM a series of macros is defined
- * for the texel lookup in the gl_texture_image::Data.
- * 
- * \author Gareth Hughes
- * \author Brian Paul
- */
-
-
-#if DIM == 1
-
-#define TEXEL_ADDR( type, image, i, j, k, size ) \
-	((void) (j), (void) (k), ((type *)(image)->Data + (i) * (size)))
-
-#define FETCH(x) fetch_texel_1d_##x
-
-#elif DIM == 2
-
-#define TEXEL_ADDR( type, image, i, j, k, size )			\
-	((void) (k),							\
-	 ((type *)(image)->Data + ((image)->RowStride * (j) + (i)) * (size)))
-
-#define FETCH(x) fetch_texel_2d_##x
-
-#elif DIM == 3
-
-#define TEXEL_ADDR( type, image, i, j, k, size )			\
-	((type *)(image)->Data + ((image)->ImageOffsets[k]		\
-             + (image)->RowStride * (j) + (i)) * (size))
-
-#define FETCH(x) fetch_texel_3d_##x
-
-#else
-#error	illegal number of texture dimensions
-#endif
-
-
-/* MESA_FORMAT_Z32 ***********************************************************/
-
-/* Fetch depth texel from 1D, 2D or 3D 32-bit depth texture,
- * returning 1 GLfloat.
- * Note: no GLchan version of this function.
- */
-static void FETCH(f_z32)( const struct gl_texture_image *texImage,
-                          GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLuint *src = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   texel[0] = src[0] * (1.0F / 0xffffffff);
-}
-
-#if DIM == 3
-static void store_texel_z32(struct gl_texture_image *texImage,
-                            GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLuint *depth = (const GLuint *) texel;
-   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   dst[0] = *depth;
-}
-#endif
-
-
-/* MESA_FORMAT_Z16 ***********************************************************/
-
-/* Fetch depth texel from 1D, 2D or 3D 16-bit depth texture,
- * returning 1 GLfloat.
- * Note: no GLchan version of this function.
- */
-static void FETCH(f_z16)(const struct gl_texture_image *texImage,
-                         GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   texel[0] = src[0] * (1.0F / 65535.0F);
-}
-
-#if DIM == 3
-static void store_texel_z16(struct gl_texture_image *texImage,
-                            GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLushort *depth = (const GLushort *) texel;
-   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   dst[0] = *depth;
-}
-#endif
-
-
-/* MESA_FORMAT_RGBA_F32 ******************************************************/
-
-/* Fetch texel from 1D, 2D or 3D RGBA_FLOAT32 texture, returning 4 GLfloats.
- */
-static void FETCH(f_rgba_f32)( const struct gl_texture_image *texImage,
-                               GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 4);
-   texel[RCOMP] = src[0];
-   texel[GCOMP] = src[1];
-   texel[BCOMP] = src[2];
-   texel[ACOMP] = src[3];
-}
-
-#if DIM == 3
-static void store_texel_rgba_f32(struct gl_texture_image *texImage,
-                                 GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLfloat *depth = (const GLfloat *) texel;
-   GLfloat *dst = TEXEL_ADDR(GLfloat, texImage, i, j, k, 4);
-   dst[0] = depth[RCOMP];
-   dst[1] = depth[GCOMP];
-   dst[2] = depth[BCOMP];
-   dst[3] = depth[ACOMP];
-}
-#endif
-
-
-/* MESA_FORMAT_RGBA_F16 ******************************************************/
-
-/* Fetch texel from 1D, 2D or 3D RGBA_FLOAT16 texture,
- * returning 4 GLfloats.
- */
-static void FETCH(f_rgba_f16)( const struct gl_texture_image *texImage,
-                               GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 4);
-   texel[RCOMP] = _mesa_half_to_float(src[0]);
-   texel[GCOMP] = _mesa_half_to_float(src[1]);
-   texel[BCOMP] = _mesa_half_to_float(src[2]);
-   texel[ACOMP] = _mesa_half_to_float(src[3]);
-}
-
-#if DIM == 3
-static void store_texel_rgba_f16(struct gl_texture_image *texImage,
-                                 GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLfloat *src = (const GLfloat *) texel;
-   GLhalfARB *dst = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 4);
-   dst[0] = _mesa_float_to_half(src[RCOMP]);
-   dst[1] = _mesa_float_to_half(src[GCOMP]);
-   dst[2] = _mesa_float_to_half(src[BCOMP]);
-   dst[3] = _mesa_float_to_half(src[ACOMP]);
-}
-#endif
-
-/* MESA_FORMAT_RGB_F32 *******************************************************/
-
-/* Fetch texel from 1D, 2D or 3D RGB_FLOAT32 texture,
- * returning 4 GLfloats.
- */
-static void FETCH(f_rgb_f32)( const struct gl_texture_image *texImage,
-                              GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 3);
-   texel[RCOMP] = src[0];
-   texel[GCOMP] = src[1];
-   texel[BCOMP] = src[2];
-   texel[ACOMP] = 1.0F;
-}
-
-#if DIM == 3
-static void store_texel_rgb_f32(struct gl_texture_image *texImage,
-                                 GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLfloat *src = (const GLfloat *) texel;
-   GLfloat *dst = TEXEL_ADDR(GLfloat, texImage, i, j, k, 3);
-   dst[0] = src[RCOMP];
-   dst[1] = src[GCOMP];
-   dst[2] = src[BCOMP];
-}
-#endif
-
-
-/* MESA_FORMAT_RGB_F16 *******************************************************/
-
-/* Fetch texel from 1D, 2D or 3D RGB_FLOAT16 texture,
- * returning 4 GLfloats.
- */
-static void FETCH(f_rgb_f16)( const struct gl_texture_image *texImage,
-                              GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 3);
-   texel[RCOMP] = _mesa_half_to_float(src[0]);
-   texel[GCOMP] = _mesa_half_to_float(src[1]);
-   texel[BCOMP] = _mesa_half_to_float(src[2]);
-   texel[ACOMP] = 1.0F;
-}
-
-#if DIM == 3
-static void store_texel_rgb_f16(struct gl_texture_image *texImage,
-                                GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLfloat *src = (const GLfloat *) texel;
-   GLhalfARB *dst = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 3);
-   dst[0] = _mesa_float_to_half(src[RCOMP]);
-   dst[1] = _mesa_float_to_half(src[GCOMP]);
-   dst[2] = _mesa_float_to_half(src[BCOMP]);
-}
-#endif
-
-
-/* MESA_FORMAT_ALPHA_F32 *****************************************************/
-
-/* Fetch texel from 1D, 2D or 3D ALPHA_FLOAT32 texture,
- * returning 4 GLfloats.
- */
-static void FETCH(f_alpha_f32)( const struct gl_texture_image *texImage,
-                              GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 1);
-   texel[RCOMP] =
-   texel[GCOMP] =
-   texel[BCOMP] = 0.0F;
-   texel[ACOMP] = src[0];
-}
-
-#if DIM == 3
-static void store_texel_alpha_f32(struct gl_texture_image *texImage,
-                                  GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLfloat *rgba = (const GLfloat *) texel;
-   GLfloat *dst = TEXEL_ADDR(GLfloat, texImage, i, j, k, 1);
-   dst[0] = rgba[ACOMP];
-}
-#endif
-
-
-/* MESA_FORMAT_ALPHA_F32 *****************************************************/
-
-/* Fetch texel from 1D, 2D or 3D ALPHA_FLOAT16 texture,
- * returning 4 GLfloats.
- */
-static void FETCH(f_alpha_f16)( const struct gl_texture_image *texImage,
-                              GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 1);
-   texel[RCOMP] =
-   texel[GCOMP] =
-   texel[BCOMP] = 0.0F;
-   texel[ACOMP] = _mesa_half_to_float(src[0]);
-}
-
-#if DIM == 3
-static void store_texel_alpha_f16(struct gl_texture_image *texImage,
-                                  GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLfloat *rgba = (const GLfloat *) texel;
-   GLhalfARB *dst = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 1);
-   dst[0] = _mesa_float_to_half(rgba[ACOMP]);
-}
-#endif
-
-
-/* MESA_FORMAT_LUMINANCE_F32 *************************************************/
-
-/* Fetch texel from 1D, 2D or 3D LUMINANCE_FLOAT32 texture,
- * returning 4 GLfloats.
- */
-static void FETCH(f_luminance_f32)( const struct gl_texture_image *texImage,
-                                    GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 1);
-   texel[RCOMP] =
-   texel[GCOMP] =
-   texel[BCOMP] = src[0];
-   texel[ACOMP] = 1.0F;
-}
-
-#if DIM == 3
-static void store_texel_luminance_f32(struct gl_texture_image *texImage,
-                                  GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLfloat *rgba = (const GLfloat *) texel;
-   GLfloat *dst = TEXEL_ADDR(GLfloat, texImage, i, j, k, 1);
-   dst[0] = rgba[RCOMP];
-}
-#endif
-
-
-/* MESA_FORMAT_LUMINANCE_F16 *************************************************/
-
-/* Fetch texel from 1D, 2D or 3D LUMINANCE_FLOAT16 texture,
- * returning 4 GLfloats.
- */
-static void FETCH(f_luminance_f16)( const struct gl_texture_image *texImage,
-                                    GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 1);
-   texel[RCOMP] =
-   texel[GCOMP] =
-   texel[BCOMP] = _mesa_half_to_float(src[0]);
-   texel[ACOMP] = 1.0F;
-}
-
-#if DIM == 3
-static void store_texel_luminance_f16(struct gl_texture_image *texImage,
-                                  GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLfloat *rgba = (const GLfloat *) texel;
-   GLhalfARB *dst = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 1);
-   dst[0] = _mesa_float_to_half(rgba[RCOMP]);
-}
-#endif
-
-
-/* MESA_FORMAT_LUMINANCE_ALPHA_F32 *******************************************/
-
-/* Fetch texel from 1D, 2D or 3D LUMINANCE_ALPHA_FLOAT32 texture,
- * returning 4 GLfloats.
- */
-static void FETCH(f_luminance_alpha_f32)( const struct gl_texture_image *texImage,
-                                    GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 2);
-   texel[RCOMP] =
-   texel[GCOMP] =
-   texel[BCOMP] = src[0];
-   texel[ACOMP] = src[1];
-}
-
-#if DIM == 3
-static void store_texel_luminance_alpha_f32(struct gl_texture_image *texImage,
-                                  GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLfloat *rgba = (const GLfloat *) texel;
-   GLfloat *dst = TEXEL_ADDR(GLfloat, texImage, i, j, k, 2);
-   dst[0] = rgba[RCOMP];
-   dst[1] = rgba[ACOMP];
-}
-#endif
-
-
-/* MESA_FORMAT_LUMINANCE_ALPHA_F16 *******************************************/
-
-/* Fetch texel from 1D, 2D or 3D LUMINANCE_ALPHA_FLOAT16 texture,
- * returning 4 GLfloats.
- */
-static void FETCH(f_luminance_alpha_f16)( const struct gl_texture_image *texImage,
-                                    GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 2);
-   texel[RCOMP] =
-   texel[GCOMP] =
-   texel[BCOMP] = _mesa_half_to_float(src[0]);
-   texel[ACOMP] = _mesa_half_to_float(src[1]);
-}
-
-#if DIM == 3
-static void store_texel_luminance_alpha_f16(struct gl_texture_image *texImage,
-                                  GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLfloat *rgba = (const GLfloat *) texel;
-   GLhalfARB *dst = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 2);
-   dst[0] = _mesa_float_to_half(rgba[RCOMP]);
-   dst[1] = _mesa_float_to_half(rgba[ACOMP]);
-}
-#endif
-
-
-/* MESA_FORMAT_INTENSITY_F32 *************************************************/
-
-/* Fetch texel from 1D, 2D or 3D INTENSITY_FLOAT32 texture,
- * returning 4 GLfloats.
- */
-static void FETCH(f_intensity_f32)( const struct gl_texture_image *texImage,
-                                    GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 1);
-   texel[RCOMP] =
-   texel[GCOMP] =
-   texel[BCOMP] =
-   texel[ACOMP] = src[0];
-}
-
-#if DIM == 3
-static void store_texel_intensity_f32(struct gl_texture_image *texImage,
-                                  GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLfloat *rgba = (const GLfloat *) texel;
-   GLfloat *dst = TEXEL_ADDR(GLfloat, texImage, i, j, k, 1);
-   dst[0] = rgba[RCOMP];
-}
-#endif
-
-
-/* MESA_FORMAT_INTENSITY_F16 *************************************************/
-
-/* Fetch texel from 1D, 2D or 3D INTENSITY_FLOAT16 texture,
- * returning 4 GLfloats.
- */
-static void FETCH(f_intensity_f16)( const struct gl_texture_image *texImage,
-                                    GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 1);
-   texel[RCOMP] =
-   texel[GCOMP] =
-   texel[BCOMP] =
-   texel[ACOMP] = _mesa_half_to_float(src[0]);
-}
-
-#if DIM == 3
-static void store_texel_intensity_f16(struct gl_texture_image *texImage,
-                                  GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLfloat *rgba = (const GLfloat *) texel;
-   GLhalfARB *dst = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 1);
-   dst[0] = _mesa_float_to_half(rgba[RCOMP]);
-}
-#endif
-
-
-
-
-/*
- * Begin Hardware formats
- */
-
-/* MESA_FORMAT_RGBA8888 ******************************************************/
-
-/* Fetch texel from 1D, 2D or 3D rgba8888 texture, return 4 GLfloats */
-static void FETCH(f_rgba8888)( const struct gl_texture_image *texImage,
-                               GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   texel[RCOMP] = UBYTE_TO_FLOAT( (s >> 24)        );
-   texel[GCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff );
-   texel[BCOMP] = UBYTE_TO_FLOAT( (s >>  8) & 0xff );
-   texel[ACOMP] = UBYTE_TO_FLOAT( (s      ) & 0xff );
-}
-
-
-
-#if DIM == 3
-static void store_texel_rgba8888(struct gl_texture_image *texImage,
-                                 GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   *dst = PACK_COLOR_8888(rgba[RCOMP], rgba[GCOMP], rgba[BCOMP], rgba[ACOMP]);
-}
-#endif
-
-
-/* MESA_FORMAT_RGBA888_REV ***************************************************/
-
-/* Fetch texel from 1D, 2D or 3D abgr8888 texture, return 4 GLchans */
-static void FETCH(f_rgba8888_rev)( const struct gl_texture_image *texImage,
-                                   GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   texel[RCOMP] = UBYTE_TO_FLOAT( (s      ) & 0xff );
-   texel[GCOMP] = UBYTE_TO_FLOAT( (s >>  8) & 0xff );
-   texel[BCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff );
-   texel[ACOMP] = UBYTE_TO_FLOAT( (s >> 24)        );
-}
-
-#if DIM == 3
-static void store_texel_rgba8888_rev(struct gl_texture_image *texImage,
-                                  GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   *dst = PACK_COLOR_8888_REV(rgba[RCOMP], rgba[GCOMP], rgba[BCOMP], rgba[ACOMP]);
-}
-#endif
-
-
-/* MESA_FORMAT_ARGB8888 ******************************************************/
-
-/* Fetch texel from 1D, 2D or 3D argb8888 texture, return 4 GLchans */
-static void FETCH(f_argb8888)( const struct gl_texture_image *texImage,
-                               GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   texel[RCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff );
-   texel[GCOMP] = UBYTE_TO_FLOAT( (s >>  8) & 0xff );
-   texel[BCOMP] = UBYTE_TO_FLOAT( (s      ) & 0xff );
-   texel[ACOMP] = UBYTE_TO_FLOAT( (s >> 24)        );
-}
-
-#if DIM == 3
-static void store_texel_argb8888(struct gl_texture_image *texImage,
-                                 GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   *dst = PACK_COLOR_8888(rgba[ACOMP], rgba[RCOMP], rgba[GCOMP], rgba[BCOMP]);
-}
-#endif
-
-
-/* MESA_FORMAT_ARGB8888_REV **************************************************/
-
-/* Fetch texel from 1D, 2D or 3D argb8888_rev texture, return 4 GLfloats */
-static void FETCH(f_argb8888_rev)( const struct gl_texture_image *texImage,
-                                   GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   texel[RCOMP] = UBYTE_TO_FLOAT( (s >>  8) & 0xff );
-   texel[GCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff );
-   texel[BCOMP] = UBYTE_TO_FLOAT( (s >> 24)        );
-   texel[ACOMP] = UBYTE_TO_FLOAT( (s      ) & 0xff );
-}
-
-#if DIM == 3
-static void store_texel_argb8888_rev(struct gl_texture_image *texImage,
-                                  GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   *dst = PACK_COLOR_8888(rgba[BCOMP], rgba[GCOMP], rgba[RCOMP], rgba[ACOMP]);
-}
-#endif
-
-
-/* MESA_FORMAT_XRGB8888 ******************************************************/
-
-/* Fetch texel from 1D, 2D or 3D xrgb8888 texture, return 4 GLchans */
-static void FETCH(f_xrgb8888)( const struct gl_texture_image *texImage,
-                               GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   texel[RCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff );
-   texel[GCOMP] = UBYTE_TO_FLOAT( (s >>  8) & 0xff );
-   texel[BCOMP] = UBYTE_TO_FLOAT( (s      ) & 0xff );
-   texel[ACOMP] = 1.0f;
-}
-
-#if DIM == 3
-static void store_texel_xrgb8888(struct gl_texture_image *texImage,
-                                 GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   *dst = PACK_COLOR_8888(0xff, rgba[RCOMP], rgba[GCOMP], rgba[BCOMP]);
-}
-#endif
-
-
-/* MESA_FORMAT_XRGB8888_REV **************************************************/
-
-/* Fetch texel from 1D, 2D or 3D xrgb8888_rev texture, return 4 GLfloats */
-static void FETCH(f_xrgb8888_rev)( const struct gl_texture_image *texImage,
-                                   GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   texel[RCOMP] = UBYTE_TO_FLOAT( (s >>  8) & 0xff );
-   texel[GCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff );
-   texel[BCOMP] = UBYTE_TO_FLOAT( (s >> 24)        );
-   texel[ACOMP] = 1.0f;
-}
-
-#if DIM == 3
-static void store_texel_xrgb8888_rev(struct gl_texture_image *texImage,
-                                     GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   *dst = PACK_COLOR_8888(rgba[BCOMP], rgba[GCOMP], rgba[RCOMP], 0xff);
-}
-#endif
-
-
-/* MESA_FORMAT_RGB888 ********************************************************/
-
-/* Fetch texel from 1D, 2D or 3D rgb888 texture, return 4 GLchans */
-static void FETCH(f_rgb888)( const struct gl_texture_image *texImage,
-                             GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 3);
-   texel[RCOMP] = UBYTE_TO_FLOAT( src[2] );
-   texel[GCOMP] = UBYTE_TO_FLOAT( src[1] );
-   texel[BCOMP] = UBYTE_TO_FLOAT( src[0] );
-   texel[ACOMP] = 1.0F;
-}
-
-#if DIM == 3
-static void store_texel_rgb888(struct gl_texture_image *texImage,
-                               GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLubyte *dst = TEXEL_ADDR(GLubyte, texImage, i, j, k, 3);
-   dst[0] = rgba[BCOMP];
-   dst[1] = rgba[GCOMP];
-   dst[2] = rgba[RCOMP];
-}
-#endif
-
-
-/* MESA_FORMAT_BGR888 ********************************************************/
-
-/* Fetch texel from 1D, 2D or 3D bgr888 texture, return 4 GLchans */
-static void FETCH(f_bgr888)( const struct gl_texture_image *texImage,
-                             GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 3);
-   texel[RCOMP] = UBYTE_TO_FLOAT( src[0] );
-   texel[GCOMP] = UBYTE_TO_FLOAT( src[1] );
-   texel[BCOMP] = UBYTE_TO_FLOAT( src[2] );
-   texel[ACOMP] = 1.0F;
-}
-
-#if DIM == 3
-static void store_texel_bgr888(struct gl_texture_image *texImage,
-                               GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLubyte *dst = TEXEL_ADDR(GLubyte, texImage, i, j, k, 3);
-   dst[0] = rgba[RCOMP];
-   dst[1] = rgba[GCOMP];
-   dst[2] = rgba[BCOMP];
-}
-#endif
-
-
-/* use color expansion like (g << 2) | (g >> 4) (does somewhat random rounding)
-   instead of slow (g << 2) * 255 / 252 (always rounds down) */
-
-/* MESA_FORMAT_RGB565 ********************************************************/
-
-/* Fetch texel from 1D, 2D or 3D rgb565 texture, return 4 GLchans */
-static void FETCH(f_rgb565)( const struct gl_texture_image *texImage,
-                             GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   const GLushort s = *src;
-   texel[RCOMP] = ((s >> 11) & 0x1f) * (1.0F / 31.0F);
-   texel[GCOMP] = ((s >> 5 ) & 0x3f) * (1.0F / 63.0F);
-   texel[BCOMP] = ((s      ) & 0x1f) * (1.0F / 31.0F);
-   texel[ACOMP] = 1.0F;
-}
-
-#if DIM == 3
-static void store_texel_rgb565(struct gl_texture_image *texImage,
-                               GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   *dst = PACK_COLOR_565(rgba[RCOMP], rgba[GCOMP], rgba[BCOMP]);
-}
-#endif
-
-
-/* MESA_FORMAT_RGB565_REV ****************************************************/
-
-/* Fetch texel from 1D, 2D or 3D rgb565_rev texture, return 4 GLchans */
-static void FETCH(f_rgb565_rev)( const struct gl_texture_image *texImage,
-                                 GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   const GLushort s = (*src >> 8) | (*src << 8); /* byte swap */
-   texel[RCOMP] = UBYTE_TO_FLOAT( ((s >> 8) & 0xf8) | ((s >> 13) & 0x7) );
-   texel[GCOMP] = UBYTE_TO_FLOAT( ((s >> 3) & 0xfc) | ((s >>  9) & 0x3) );
-   texel[BCOMP] = UBYTE_TO_FLOAT( ((s << 3) & 0xf8) | ((s >>  2) & 0x7) );
-   texel[ACOMP] = 1.0F;
-}
-
-#if DIM == 3
-static void store_texel_rgb565_rev(struct gl_texture_image *texImage,
-                                  GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   *dst = PACK_COLOR_565(rgba[BCOMP], rgba[GCOMP], rgba[RCOMP]);
-}
-#endif
-
-
-/* MESA_FORMAT_ARGB4444 ******************************************************/
-
-/* Fetch texel from 1D, 2D or 3D argb444 texture, return 4 GLchans */
-static void FETCH(f_argb4444)( const struct gl_texture_image *texImage,
-                               GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   const GLushort s = *src;
-   texel[RCOMP] = ((s >>  8) & 0xf) * (1.0F / 15.0F);
-   texel[GCOMP] = ((s >>  4) & 0xf) * (1.0F / 15.0F);
-   texel[BCOMP] = ((s      ) & 0xf) * (1.0F / 15.0F);
-   texel[ACOMP] = ((s >> 12) & 0xf) * (1.0F / 15.0F);
-}
-
-#if DIM == 3
-static void store_texel_argb4444(struct gl_texture_image *texImage,
-                                 GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   *dst = PACK_COLOR_4444(rgba[ACOMP], rgba[RCOMP], rgba[GCOMP], rgba[BCOMP]);
-}
-#endif
-
-
-/* MESA_FORMAT_ARGB4444_REV **************************************************/
-
-/* Fetch texel from 1D, 2D or 3D argb4444_rev texture, return 4 GLchans */
-static void FETCH(f_argb4444_rev)( const struct gl_texture_image *texImage,
-                                   GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLushort s = *TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   texel[RCOMP] = ((s      ) & 0xf) * (1.0F / 15.0F);
-   texel[GCOMP] = ((s >> 12) & 0xf) * (1.0F / 15.0F);
-   texel[BCOMP] = ((s >>  8) & 0xf) * (1.0F / 15.0F);
-   texel[ACOMP] = ((s >>  4) & 0xf) * (1.0F / 15.0F);
-}
-
-#if DIM == 3
-static void store_texel_argb4444_rev(struct gl_texture_image *texImage,
-                                 GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   *dst = PACK_COLOR_4444(rgba[ACOMP], rgba[BCOMP], rgba[GCOMP], rgba[RCOMP]);
-}
-#endif
-
-/* MESA_FORMAT_RGBA5551 ******************************************************/
-
-/* Fetch texel from 1D, 2D or 3D argb1555 texture, return 4 GLchans */
-static void FETCH(f_rgba5551)( const struct gl_texture_image *texImage,
-                               GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   const GLushort s = *src;
-   texel[RCOMP] = ((s >> 11) & 0x1f) * (1.0F / 31.0F);
-   texel[GCOMP] = ((s >>  6) & 0x1f) * (1.0F / 31.0F);
-   texel[BCOMP] = ((s >>  1) & 0x1f) * (1.0F / 31.0F);
-   texel[ACOMP] = ((s      ) & 0x01) * 1.0F;
-}
-
-#if DIM == 3
-static void store_texel_rgba5551(struct gl_texture_image *texImage,
-                                 GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   *dst = PACK_COLOR_5551(rgba[RCOMP], rgba[GCOMP], rgba[BCOMP], rgba[ACOMP]);
-}
-#endif
-
-/* MESA_FORMAT_ARGB1555 ******************************************************/
-
-/* Fetch texel from 1D, 2D or 3D argb1555 texture, return 4 GLchans */
-static void FETCH(f_argb1555)( const struct gl_texture_image *texImage,
-			     GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   const GLushort s = *src;
-   texel[RCOMP] = ((s >> 10) & 0x1f) * (1.0F / 31.0F);
-   texel[GCOMP] = ((s >>  5) & 0x1f) * (1.0F / 31.0F);
-   texel[BCOMP] = ((s >>  0) & 0x1f) * (1.0F / 31.0F);
-   texel[ACOMP] = ((s >> 15) & 0x01) * 1.0F;
-}
-
-#if DIM == 3
-static void store_texel_argb1555(struct gl_texture_image *texImage,
-                                 GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   *dst = PACK_COLOR_1555(rgba[ACOMP], rgba[RCOMP], rgba[GCOMP], rgba[BCOMP]);
-}
-#endif
-
-
-/* MESA_FORMAT_ARGB1555_REV **************************************************/
-
-/* Fetch texel from 1D, 2D or 3D argb1555_rev texture, return 4 GLchans */
-static void FETCH(f_argb1555_rev)( const struct gl_texture_image *texImage,
-                                   GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   const GLushort s = (*src << 8) | (*src >> 8); /* byteswap */
-   texel[RCOMP] = UBYTE_TO_FLOAT( ((s >>  7) & 0xf8) | ((s >> 12) & 0x7) );
-   texel[GCOMP] = UBYTE_TO_FLOAT( ((s >>  2) & 0xf8) | ((s >>  7) & 0x7) );
-   texel[BCOMP] = UBYTE_TO_FLOAT( ((s <<  3) & 0xf8) | ((s >>  2) & 0x7) );
-   texel[ACOMP] = UBYTE_TO_FLOAT( ((s >> 15) & 0x01) * 255 );
-}
-
-#if DIM == 3
-static void store_texel_argb1555_rev(struct gl_texture_image *texImage,
-                                 GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   *dst = PACK_COLOR_1555_REV(rgba[ACOMP], rgba[RCOMP], rgba[GCOMP], rgba[BCOMP]);
-}
-#endif
-
-
-/* MESA_FORMAT_ARGB2101010 ***************************************************/
-
-/* Fetch texel from 1D, 2D or 3D argb2101010 texture, return 4 GLchans */
-static void FETCH(f_argb2101010)( const struct gl_texture_image *texImage,
-                                  GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLuint *src = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   const GLuint s = *src;
-   texel[RCOMP] = ((s >> 20) & 0x3ff) * (1.0F / 1023.0F);
-   texel[GCOMP] = ((s >> 10) & 0x3ff) * (1.0F / 1023.0F);
-   texel[BCOMP] = ((s >>  0) & 0x3ff) * (1.0F / 1023.0F);
-   texel[ACOMP] = ((s >> 30) & 0x03) * (1.0F / 3.0F);
-}
-
-#if DIM == 3
-static void store_texel_argb2101010(struct gl_texture_image *texImage,
-                                    GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   *dst = PACK_COLOR_2101010_UB(rgba[ACOMP], rgba[RCOMP], rgba[GCOMP], rgba[BCOMP]);
-}
-#endif
-
-
-/* MESA_FORMAT_RG88 **********************************************************/
-
-/* Fetch texel from 1D, 2D or 3D rg88 texture, return 4 GLchans */
-static void FETCH(f_rg88)( const struct gl_texture_image *texImage,
-                           GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLushort s = *TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   texel[RCOMP] = UBYTE_TO_FLOAT( s & 0xff );
-   texel[GCOMP] = UBYTE_TO_FLOAT( s >> 8 );
-   texel[BCOMP] = 0.0;
-   texel[ACOMP] = 1.0;
-}
-
-#if DIM == 3
-static void store_texel_rg88(struct gl_texture_image *texImage,
-                             GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   *dst = PACK_COLOR_88(rgba[RCOMP], rgba[GCOMP]);
-}
-#endif
-
-
-/* MESA_FORMAT_RG88_REV ******************************************************/
-
-/* Fetch texel from 1D, 2D or 3D rg88_rev texture, return 4 GLchans */
-static void FETCH(f_rg88_rev)( const struct gl_texture_image *texImage,
-                           GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLushort s = *TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   texel[RCOMP] = UBYTE_TO_FLOAT( s & 0xff );
-   texel[GCOMP] = UBYTE_TO_FLOAT( s >> 8 );
-   texel[BCOMP] = 0.0;
-   texel[ACOMP] = 1.0;
-}
-
-#if DIM == 3
-static void store_texel_rg88_rev(struct gl_texture_image *texImage,
-                             GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   *dst = PACK_COLOR_88(rgba[GCOMP], rgba[RCOMP]);
-}
-#endif
-
-
-/* MESA_FORMAT_AL44 **********************************************************/
-
-/* Fetch texel from 1D, 2D or 3D al44 texture, return 4 GLchans */
-static void FETCH(f_al44)( const struct gl_texture_image *texImage,
-                           GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLubyte s = *TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
-   texel[RCOMP] =
-   texel[GCOMP] =
-   texel[BCOMP] = (s & 0xf) * (1.0F / 15.0F);
-   texel[ACOMP] = ((s >> 4) & 0xf) * (1.0F / 15.0F);
-}
-
-#if DIM == 3
-static void store_texel_al44(struct gl_texture_image *texImage,
-                             GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLubyte *dst = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
-   *dst = PACK_COLOR_44(rgba[ACOMP], rgba[RCOMP]);
-}
-#endif
-
-
-/* MESA_FORMAT_AL88 **********************************************************/
-
-/* Fetch texel from 1D, 2D or 3D al88 texture, return 4 GLchans */
-static void FETCH(f_al88)( const struct gl_texture_image *texImage,
-                           GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLushort s = *TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   texel[RCOMP] = 
-   texel[GCOMP] = 
-   texel[BCOMP] = UBYTE_TO_FLOAT( s & 0xff );
-   texel[ACOMP] = UBYTE_TO_FLOAT( s >> 8 );
-}
-
-#if DIM == 3
-static void store_texel_al88(struct gl_texture_image *texImage,
-                             GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   *dst = PACK_COLOR_88(rgba[ACOMP], rgba[RCOMP]);
-}
-#endif
-
-
-/* MESA_FORMAT_R8 ************************************************************/
-
-/* Fetch texel from 1D, 2D or 3D rg88 texture, return 4 GLchans */
-static void FETCH(f_r8)(const struct gl_texture_image *texImage,
-			GLint i, GLint j, GLint k, GLfloat *texel)
-{
-   const GLubyte s = *TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
-   texel[RCOMP] = UBYTE_TO_FLOAT(s);
-   texel[GCOMP] = 0.0;
-   texel[BCOMP] = 0.0;
-   texel[ACOMP] = 1.0;
-}
-
-#if DIM == 3
-static void store_texel_r8(struct gl_texture_image *texImage,
-			   GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLubyte *dst = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
-   *dst = rgba[RCOMP];
-}
-#endif
-
-
-/* MESA_FORMAT_R16 ***********************************************************/
-
-/* Fetch texel from 1D, 2D or 3D r16 texture, return 4 GLchans */
-static void FETCH(f_r16)(const struct gl_texture_image *texImage,
-			GLint i, GLint j, GLint k, GLfloat *texel)
-{
-   const GLushort s = *TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   texel[RCOMP] = USHORT_TO_FLOAT(s);
-   texel[GCOMP] = 0.0;
-   texel[BCOMP] = 0.0;
-   texel[ACOMP] = 1.0;
-}
-
-#if DIM == 3
-static void store_texel_r16(struct gl_texture_image *texImage,
-			    GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLushort *rgba = (const GLushort *) texel;
-   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   *dst = rgba[RCOMP];
-}
-#endif
-
-
-/* MESA_FORMAT_AL88_REV ******************************************************/
-
-/* Fetch texel from 1D, 2D or 3D al88_rev texture, return 4 GLchans */
-static void FETCH(f_al88_rev)( const struct gl_texture_image *texImage,
-                               GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLushort s = *TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   texel[RCOMP] = 
-   texel[GCOMP] = 
-   texel[BCOMP] = UBYTE_TO_FLOAT( s >> 8 );
-   texel[ACOMP] = UBYTE_TO_FLOAT( s & 0xff );
-}
-
-#if DIM == 3
-static void store_texel_al88_rev(struct gl_texture_image *texImage,
-                                 GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   *dst = PACK_COLOR_88(rgba[RCOMP], rgba[ACOMP]);
-}
-#endif
-
-
-/* MESA_FORMAT_RG1616 ********************************************************/
-
-/* Fetch texel from 1D, 2D or 3D rg1616 texture, return 4 GLchans */
-static void FETCH(f_rg1616)( const struct gl_texture_image *texImage,
-                           GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   texel[RCOMP] = USHORT_TO_FLOAT( s & 0xffff );
-   texel[GCOMP] = USHORT_TO_FLOAT( s >> 16 );
-   texel[BCOMP] = 0.0;
-   texel[ACOMP] = 1.0;
-}
-
-#if DIM == 3
-static void store_texel_rg1616(struct gl_texture_image *texImage,
-                             GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   *dst = PACK_COLOR_1616(rgba[RCOMP], rgba[GCOMP]);
-}
-#endif
-
-
-/* MESA_FORMAT_RG1616_REV ****************************************************/
-
-/* Fetch texel from 1D, 2D or 3D rg1616_rev texture, return 4 GLchans */
-static void FETCH(f_rg1616_rev)( const struct gl_texture_image *texImage,
-                           GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   texel[RCOMP] = USHORT_TO_FLOAT( s >> 16 );
-   texel[GCOMP] = USHORT_TO_FLOAT( s & 0xffff );
-   texel[BCOMP] = 0.0;
-   texel[ACOMP] = 1.0;
-}
-
-#if DIM == 3
-static void store_texel_rg1616_rev(struct gl_texture_image *texImage,
-                             GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   *dst = PACK_COLOR_1616(rgba[GCOMP], rgba[RCOMP]);
-}
-#endif
-
-
-/* MESA_FORMAT_AL1616 ********************************************************/
-
-/* Fetch texel from 1D, 2D or 3D al1616 texture, return 4 GLchans */
-static void FETCH(f_al1616)( const struct gl_texture_image *texImage,
-			     GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   texel[RCOMP] =
-   texel[GCOMP] =
-   texel[BCOMP] = USHORT_TO_FLOAT( s & 0xffff );
-   texel[ACOMP] = USHORT_TO_FLOAT( s >> 16 );
-}
-
-#if DIM == 3
-static void store_texel_al1616(struct gl_texture_image *texImage,
-                             GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLushort *rgba = (const GLushort *) texel;
-   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   *dst = PACK_COLOR_1616(rgba[ACOMP], rgba[RCOMP]);
-}
-#endif
-
-
-/* MESA_FORMAT_AL1616_REV ****************************************************/
-
-/* Fetch texel from 1D, 2D or 3D al1616_rev texture, return 4 GLchans */
-static void FETCH(f_al1616_rev)( const struct gl_texture_image *texImage,
-				 GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   texel[RCOMP] =
-   texel[GCOMP] =
-   texel[BCOMP] = USHORT_TO_FLOAT( s >> 16 );
-   texel[ACOMP] = USHORT_TO_FLOAT( s & 0xffff );
-}
-
-#if DIM == 3
-static void store_texel_al1616_rev(struct gl_texture_image *texImage,
-				   GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLushort *rgba = (const GLushort *) texel;
-   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   *dst = PACK_COLOR_1616(rgba[RCOMP], rgba[ACOMP]);
-}
-#endif
-
-
-/* MESA_FORMAT_RGB332 ********************************************************/
-
-/* Fetch texel from 1D, 2D or 3D rgb332 texture, return 4 GLchans */
-static void FETCH(f_rgb332)( const struct gl_texture_image *texImage,
-                             GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
-   const GLubyte s = *src;
-   texel[RCOMP] = ((s >> 5) & 0x7) * (1.0F / 7.0F);
-   texel[GCOMP] = ((s >> 2) & 0x7) * (1.0F / 7.0F);
-   texel[BCOMP] = ((s     ) & 0x3) * (1.0F / 3.0F);
-   texel[ACOMP] = 1.0F;
-}
-
-#if DIM == 3
-static void store_texel_rgb332(struct gl_texture_image *texImage,
-                               GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLubyte *dst = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
-   *dst = PACK_COLOR_332(rgba[RCOMP], rgba[GCOMP], rgba[BCOMP]);
-}
-#endif
-
-
-/* MESA_FORMAT_A8 ************************************************************/
-
-/* Fetch texel from 1D, 2D or 3D a8 texture, return 4 GLchans */
-static void FETCH(f_a8)( const struct gl_texture_image *texImage,
-                         GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
-   texel[RCOMP] =
-   texel[GCOMP] =
-   texel[BCOMP] = 0.0F;
-   texel[ACOMP] = UBYTE_TO_FLOAT( src[0] );
-}
-
-#if DIM == 3
-static void store_texel_a8(struct gl_texture_image *texImage,
-                           GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLubyte *dst = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
-   *dst = rgba[ACOMP];
-}
-#endif
-
-
-/* MESA_FORMAT_A16 ************************************************************/
-
-/* Fetch texel from 1D, 2D or 3D a8 texture, return 4 GLchans */
-static void FETCH(f_a16)( const struct gl_texture_image *texImage,
-                          GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   texel[RCOMP] =
-   texel[GCOMP] =
-   texel[BCOMP] = 0.0F;
-   texel[ACOMP] = USHORT_TO_FLOAT( src[0] );
-}
-
-#if DIM == 3
-static void store_texel_a16(struct gl_texture_image *texImage,
-                            GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLushort *rgba = (const GLushort *) texel;
-   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   *dst = rgba[ACOMP];
-}
-#endif
-
-
-/* MESA_FORMAT_L8 ************************************************************/
-
-/* Fetch texel from 1D, 2D or 3D l8 texture, return 4 GLchans */
-static void FETCH(f_l8)( const struct gl_texture_image *texImage,
-                         GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
-   texel[RCOMP] =
-   texel[GCOMP] =
-   texel[BCOMP] = UBYTE_TO_FLOAT( src[0] );
-   texel[ACOMP] = 1.0F;
-}
-
-#if DIM == 3
-static void store_texel_l8(struct gl_texture_image *texImage,
-                           GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLubyte *dst = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
-   *dst = rgba[RCOMP];
-}
-#endif
-
-
-/* MESA_FORMAT_L16 ***********************************************************/
-
-/* Fetch texel from 1D, 2D or 3D l16 texture, return 4 GLchans */
-static void FETCH(f_l16)( const struct gl_texture_image *texImage,
-                          GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   texel[RCOMP] =
-   texel[GCOMP] =
-   texel[BCOMP] = USHORT_TO_FLOAT( src[0] );
-   texel[ACOMP] = 1.0F;
-}
-
-#if DIM == 3
-static void store_texel_l16(struct gl_texture_image *texImage,
-                            GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLushort *rgba = (const GLushort *) texel;
-   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   *dst = rgba[RCOMP];
-}
-#endif
-
-
-/* MESA_FORMAT_I8 ************************************************************/
-
-/* Fetch texel from 1D, 2D or 3D i8 texture, return 4 GLchans */
-static void FETCH(f_i8)( const struct gl_texture_image *texImage,
-                         GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
-   texel[RCOMP] =
-   texel[GCOMP] =
-   texel[BCOMP] =
-   texel[ACOMP] = UBYTE_TO_FLOAT( src[0] );
-}
-
-#if DIM == 3
-static void store_texel_i8(struct gl_texture_image *texImage,
-                           GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLubyte *dst = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
-   *dst = rgba[RCOMP];
-}
-#endif
-
-
-/* MESA_FORMAT_I16 ***********************************************************/
-
-/* Fetch texel from 1D, 2D or 3D i16 texture, return 4 GLchans */
-static void FETCH(f_i16)( const struct gl_texture_image *texImage,
-                          GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   texel[RCOMP] =
-   texel[GCOMP] =
-   texel[BCOMP] =
-   texel[ACOMP] = USHORT_TO_FLOAT( src[0] );
-}
-
-#if DIM == 3
-static void store_texel_i16(struct gl_texture_image *texImage,
-                            GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLushort *rgba = (const GLushort *) texel;
-   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
-   *dst = rgba[RCOMP];
-}
-#endif
-
-
-/* MESA_FORMAT_CI8 ***********************************************************/
-
-/* Fetch CI texel from 1D, 2D or 3D ci8 texture, lookup the index in a
- * color table, and return 4 GLchans.
- */
-static void FETCH(f_ci8)( const struct gl_texture_image *texImage,
-                          GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
-   const struct gl_color_table *palette;
-   GLuint index;
-   GET_CURRENT_CONTEXT(ctx);
-
-   if (ctx->Texture.SharedPalette) {
-      palette = &ctx->Texture.Palette;
-   }
-   else {
-      palette = &texImage->TexObject->Palette;
-   }
-   if (palette->Size == 0)
-      return; /* undefined results */
-
-   /* Mask the index against size of palette to avoid going out of bounds */
-   index = (*src) & (palette->Size - 1);
-
-   {
-      const GLfloat *table = palette->TableF;
-      switch (palette->_BaseFormat) {
-      case GL_ALPHA:
-         texel[RCOMP] =
-         texel[GCOMP] =
-         texel[BCOMP] = 0.0F;
-         texel[ACOMP] = table[index];
-         break;
-      case GL_LUMINANCE:
-         texel[RCOMP] =
-         texel[GCOMP] =
-         texel[BCOMP] = table[index];
-         texel[ACOMP] = 1.0F;
-         break;
-      case GL_INTENSITY:
-         texel[RCOMP] =
-         texel[GCOMP] =
-         texel[BCOMP] =
-         texel[ACOMP] = table[index];
-         break;
-      case GL_LUMINANCE_ALPHA:
-         texel[RCOMP] =
-         texel[GCOMP] =
-         texel[BCOMP] = table[index * 2 + 0];
-         texel[ACOMP] = table[index * 2 + 1];
-         break;
-      case GL_RGB:
-         texel[RCOMP] = table[index * 3 + 0];
-         texel[GCOMP] = table[index * 3 + 1];
-         texel[BCOMP] = table[index * 3 + 2];
-         texel[ACOMP] = 1.0F;
-         break;
-      case GL_RGBA:
-         texel[RCOMP] = table[index * 4 + 0];
-         texel[GCOMP] = table[index * 4 + 1];
-         texel[BCOMP] = table[index * 4 + 2];
-         texel[ACOMP] = table[index * 4 + 3];
-         break;
-      default:
-         _mesa_problem(ctx, "Bad palette format in fetch_texel_ci8");
-         return;
-      }
-   }
-}
-
-#if DIM == 3
-static void store_texel_ci8(struct gl_texture_image *texImage,
-                            GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *index = (const GLubyte *) texel;
-   GLubyte *dst = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
-   *dst = *index;
-}
-#endif
-
-
-/* Fetch texel from 1D, 2D or 3D srgb8 texture, return 4 GLfloats */
-/* Note: component order is same as for MESA_FORMAT_RGB888 */
-static void FETCH(srgb8)(const struct gl_texture_image *texImage,
-                         GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 3);
-   texel[RCOMP] = nonlinear_to_linear(src[2]);
-   texel[GCOMP] = nonlinear_to_linear(src[1]);
-   texel[BCOMP] = nonlinear_to_linear(src[0]);
-   texel[ACOMP] = 1.0F;
-}
-
-#if DIM == 3
-static void store_texel_srgb8(struct gl_texture_image *texImage,
-                              GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLubyte *dst = TEXEL_ADDR(GLubyte, texImage, i, j, k, 3);
-   dst[0] = rgba[BCOMP]; /* no conversion */
-   dst[1] = rgba[GCOMP];
-   dst[2] = rgba[RCOMP];
-}
-#endif
-
-/* Fetch texel from 1D, 2D or 3D srgba8 texture, return 4 GLfloats */
-static void FETCH(srgba8)(const struct gl_texture_image *texImage,
-                          GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   texel[RCOMP] = nonlinear_to_linear( (s >> 24) );
-   texel[GCOMP] = nonlinear_to_linear( (s >> 16) & 0xff );
-   texel[BCOMP] = nonlinear_to_linear( (s >>  8) & 0xff );
-   texel[ACOMP] = UBYTE_TO_FLOAT( (s      ) & 0xff ); /* linear! */
-}
-
-#if DIM == 3
-static void store_texel_srgba8(struct gl_texture_image *texImage,
-                               GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   *dst = PACK_COLOR_8888(rgba[RCOMP], rgba[GCOMP], rgba[BCOMP], rgba[ACOMP]);
-}
-#endif
-
-/* Fetch texel from 1D, 2D or 3D sargb8 texture, return 4 GLfloats */
-static void FETCH(sargb8)(const struct gl_texture_image *texImage,
-                          GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   texel[RCOMP] = nonlinear_to_linear( (s >> 16) & 0xff );
-   texel[GCOMP] = nonlinear_to_linear( (s >>  8) & 0xff );
-   texel[BCOMP] = nonlinear_to_linear( (s      ) & 0xff );
-   texel[ACOMP] = UBYTE_TO_FLOAT( (s >> 24) ); /* linear! */
-}
-
-#if DIM == 3
-static void store_texel_sargb8(struct gl_texture_image *texImage,
-                               GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   *dst = PACK_COLOR_8888(rgba[ACOMP], rgba[RCOMP], rgba[GCOMP], rgba[BCOMP]);
-}
-#endif
-
-/* Fetch texel from 1D, 2D or 3D sl8 texture, return 4 GLfloats */
-static void FETCH(sl8)(const struct gl_texture_image *texImage,
-                       GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
-   texel[RCOMP] = 
-   texel[GCOMP] = 
-   texel[BCOMP] = nonlinear_to_linear(src[0]);
-   texel[ACOMP] = 1.0F;
-}
-
-#if DIM == 3
-static void store_texel_sl8(struct gl_texture_image *texImage,
-                            GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLubyte *dst = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
-   dst[0] = rgba[RCOMP];
-}
-#endif
-
-/* Fetch texel from 1D, 2D or 3D sla8 texture, return 4 GLfloats */
-static void FETCH(sla8)(const struct gl_texture_image *texImage,
-                       GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 2);
-   texel[RCOMP] =
-   texel[GCOMP] =
-   texel[BCOMP] = nonlinear_to_linear(src[0]);
-   texel[ACOMP] = UBYTE_TO_FLOAT(src[1]); /* linear */
-}
-
-#if DIM == 3
-static void store_texel_sla8(struct gl_texture_image *texImage,
-                            GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLubyte *dst = TEXEL_ADDR(GLubyte, texImage, i, j, k, 2);
-   dst[0] = rgba[RCOMP];
-   dst[1] = rgba[ACOMP];
-}
-#endif
-
-
-/* MESA_FORMAT_RGBA_INT8 **************************************************/
-
-static void
-FETCH(rgba_int8)(const struct gl_texture_image *texImage,
-                 GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLbyte *src = TEXEL_ADDR(GLbyte, texImage, i, j, k, 4);
-   texel[RCOMP] = (GLfloat) src[0];
-   texel[GCOMP] = (GLfloat) src[1];
-   texel[BCOMP] = (GLfloat) src[2];
-   texel[ACOMP] = (GLfloat) src[3];
-}
-
-#if DIM == 3
-static void
-store_texel_rgba_int8(struct gl_texture_image *texImage,
-                      GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLbyte *rgba = (const GLbyte *) texel;
-   GLbyte *dst = TEXEL_ADDR(GLbyte, texImage, i, j, k, 4);
-   dst[0] = rgba[RCOMP];
-   dst[1] = rgba[GCOMP];
-   dst[2] = rgba[BCOMP];
-   dst[3] = rgba[ACOMP];
-}
-#endif
-
-
-/* MESA_FORMAT_RGBA_INT16 **************************************************/
-
-static void
-FETCH(rgba_int16)(const struct gl_texture_image *texImage,
-                  GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLshort *src = TEXEL_ADDR(GLshort, texImage, i, j, k, 4);
-   texel[RCOMP] = (GLfloat) src[0];
-   texel[GCOMP] = (GLfloat) src[1];
-   texel[BCOMP] = (GLfloat) src[2];
-   texel[ACOMP] = (GLfloat) src[3];
-}
-
-#if DIM == 3
-static void
-store_texel_rgba_int16(struct gl_texture_image *texImage,
-                       GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLshort *rgba = (const GLshort *) texel;
-   GLshort *dst = TEXEL_ADDR(GLshort, texImage, i, j, k, 4);
-   dst[0] = rgba[RCOMP];
-   dst[1] = rgba[GCOMP];
-   dst[2] = rgba[BCOMP];
-   dst[3] = rgba[ACOMP];
-}
-#endif
-
-
-/* MESA_FORMAT_RGBA_INT32 **************************************************/
-
-static void
-FETCH(rgba_int32)(const struct gl_texture_image *texImage,
-                  GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLint *src = TEXEL_ADDR(GLint, texImage, i, j, k, 4);
-   texel[RCOMP] = (GLfloat) src[0];
-   texel[GCOMP] = (GLfloat) src[1];
-   texel[BCOMP] = (GLfloat) src[2];
-   texel[ACOMP] = (GLfloat) src[3];
-}
-
-#if DIM == 3
-static void
-store_texel_rgba_int32(struct gl_texture_image *texImage,
-                       GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLint *rgba = (const GLint *) texel;
-   GLint *dst = TEXEL_ADDR(GLint, texImage, i, j, k, 4);
-   dst[0] = rgba[RCOMP];
-   dst[1] = rgba[GCOMP];
-   dst[2] = rgba[BCOMP];
-   dst[3] = rgba[ACOMP];
-}
-#endif
-
-
-/* MESA_FORMAT_RGBA_UINT8 **************************************************/
-
-static void
-FETCH(rgba_uint8)(const struct gl_texture_image *texImage,
-                 GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 4);
-   texel[RCOMP] = (GLfloat) src[0];
-   texel[GCOMP] = (GLfloat) src[1];
-   texel[BCOMP] = (GLfloat) src[2];
-   texel[ACOMP] = (GLfloat) src[3];
-}
-
-#if DIM == 3
-static void
-store_texel_rgba_uint8(struct gl_texture_image *texImage,
-                      GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLubyte *dst = TEXEL_ADDR(GLubyte, texImage, i, j, k, 4);
-   dst[0] = rgba[RCOMP];
-   dst[1] = rgba[GCOMP];
-   dst[2] = rgba[BCOMP];
-   dst[3] = rgba[ACOMP];
-}
-#endif
-
-
-/* MESA_FORMAT_RGBA_UINT16 **************************************************/
-
-static void
-FETCH(rgba_uint16)(const struct gl_texture_image *texImage,
-                  GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 4);
-   texel[RCOMP] = (GLfloat) src[0];
-   texel[GCOMP] = (GLfloat) src[1];
-   texel[BCOMP] = (GLfloat) src[2];
-   texel[ACOMP] = (GLfloat) src[3];
-}
-
-#if DIM == 3
-static void
-store_texel_rgba_uint16(struct gl_texture_image *texImage,
-                       GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLushort *rgba = (const GLushort *) texel;
-   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 4);
-   dst[0] = rgba[RCOMP];
-   dst[1] = rgba[GCOMP];
-   dst[2] = rgba[BCOMP];
-   dst[3] = rgba[ACOMP];
-}
-#endif
-
-
-/* MESA_FORMAT_RGBA_UINT32 **************************************************/
-
-static void
-FETCH(rgba_uint32)(const struct gl_texture_image *texImage,
-                  GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLuint *src = TEXEL_ADDR(GLuint, texImage, i, j, k, 4);
-   texel[RCOMP] = (GLfloat) src[0];
-   texel[GCOMP] = (GLfloat) src[1];
-   texel[BCOMP] = (GLfloat) src[2];
-   texel[ACOMP] = (GLfloat) src[3];
-}
-
-#if DIM == 3
-static void
-store_texel_rgba_uint32(struct gl_texture_image *texImage,
-                       GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLuint *rgba = (const GLuint *) texel;
-   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 4);
-   dst[0] = rgba[RCOMP];
-   dst[1] = rgba[GCOMP];
-   dst[2] = rgba[BCOMP];
-   dst[3] = rgba[ACOMP];
-}
-#endif
-
-
-/* MESA_FORMAT_DUDV8 ********************************************************/
-
-/* this format by definition produces 0,0,0,1 as rgba values,
-   however we'll return the dudv values as rg and fix up elsewhere */
-static void FETCH(dudv8)(const struct gl_texture_image *texImage,
-                         GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLbyte *src = TEXEL_ADDR(GLbyte, texImage, i, j, k, 2);
-   texel[RCOMP] = BYTE_TO_FLOAT(src[0]);
-   texel[GCOMP] = BYTE_TO_FLOAT(src[1]);
-   texel[BCOMP] = 0;
-   texel[ACOMP] = 0;
-}
-
-
-/* MESA_FORMAT_SIGNED_R8 ***********************************************/
-
-static void FETCH(signed_r8)( const struct gl_texture_image *texImage,
-                              GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLbyte s = *TEXEL_ADDR(GLbyte, texImage, i, j, k, 1);
-   texel[RCOMP] = BYTE_TO_FLOAT_TEX( s );
-   texel[GCOMP] = 0.0F;
-   texel[BCOMP] = 0.0F;
-   texel[ACOMP] = 1.0F;
-}
-
-#if DIM == 3
-static void store_texel_signed_r8(struct gl_texture_image *texImage,
-                                  GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLbyte *rgba = (const GLbyte *) texel;
-   GLbyte *dst = TEXEL_ADDR(GLbyte, texImage, i, j, k, 1);
-   *dst = rgba[RCOMP];
-}
-#endif
-
-
-/* MESA_FORMAT_SIGNED_RG88 ***********************************************/
-
-static void FETCH(signed_rg88)( const struct gl_texture_image *texImage,
-                                GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLushort s = *TEXEL_ADDR(GLshort, texImage, i, j, k, 1);
-   texel[RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 8) );
-   texel[GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s & 0xff) );
-   texel[BCOMP] = 0.0F;
-   texel[ACOMP] = 1.0F;
-}
-
-#if DIM == 3
-static void store_texel_signed_rg88(struct gl_texture_image *texImage,
-                                    GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLbyte *rg = (const GLbyte *) texel;
-   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 2);
-   *dst = PACK_COLOR_88(rg[RCOMP], rg[GCOMP]);
-}
-#endif
-
-
-/* MESA_FORMAT_SIGNED_RGBX8888 ***********************************************/
-
-static void FETCH(signed_rgbx8888)( const struct gl_texture_image *texImage,
-			            GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   texel[RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 24) );
-   texel[GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 16) );
-   texel[BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >>  8) );
-   texel[ACOMP] = 1.0f;
-}
-
-#if DIM == 3
-static void store_texel_signed_rgbx8888(struct gl_texture_image *texImage,
-                                        GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLbyte *rgba = (const GLbyte *) texel;
-   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   *dst = PACK_COLOR_8888(rgba[RCOMP], rgba[GCOMP], rgba[BCOMP], 255);
-}
-#endif
-
-
-/* MESA_FORMAT_SIGNED_RGBA8888 ***********************************************/
-
-static void FETCH(signed_rgba8888)( const struct gl_texture_image *texImage,
-			            GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   texel[RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 24) );
-   texel[GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 16) );
-   texel[BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >>  8) );
-   texel[ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s      ) );
-}
-
-#if DIM == 3
-static void store_texel_signed_rgba8888(struct gl_texture_image *texImage,
-                                        GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLbyte *rgba = (const GLbyte *) texel;
-   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   *dst = PACK_COLOR_8888(rgba[RCOMP], rgba[GCOMP], rgba[BCOMP], rgba[ACOMP]);
-}
-#endif
-
-static void FETCH(signed_rgba8888_rev)( const struct gl_texture_image *texImage,
-                                        GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   texel[RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s      ) );
-   texel[GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >>  8) );
-   texel[BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 16) );
-   texel[ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 24) );
-}
-
-#if DIM == 3
-static void store_texel_signed_rgba8888_rev(struct gl_texture_image *texImage,
-                                            GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLubyte *rgba = (const GLubyte *) texel;
-   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   *dst = PACK_COLOR_8888_REV(rgba[RCOMP], rgba[GCOMP], rgba[BCOMP], rgba[ACOMP]);
-}
-#endif
-
-
-
-/* MESA_FORMAT_SIGNED_R_16 ***********************************************/
-
-static void
-FETCH(signed_r_16)(const struct gl_texture_image *texImage,
-                   GLint i, GLint j, GLint k, GLfloat *texel)
-{
-   const GLshort s = *TEXEL_ADDR(GLshort, texImage, i, j, k, 1);
-   texel[RCOMP] = SHORT_TO_FLOAT_TEX( s );
-   texel[GCOMP] = 0.0F;
-   texel[BCOMP] = 0.0F;
-   texel[ACOMP] = 1.0F;
-}
-
-#if DIM == 3
-static void
-store_texel_signed_r_16(struct gl_texture_image *texImage,
-                        GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLshort *rgba = (const GLshort *) texel;
-   GLshort *dst = TEXEL_ADDR(GLshort, texImage, i, j, k, 1);
-   *dst = rgba[0];
-}
-#endif
-
-
-/* MESA_FORMAT_SIGNED_RG_16 ***********************************************/
-
-static void
-FETCH(signed_rg_16)(const struct gl_texture_image *texImage,
-                    GLint i, GLint j, GLint k, GLfloat *texel)
-{
-   const GLshort *s = TEXEL_ADDR(GLshort, texImage, i, j, k, 2);
-   texel[RCOMP] = SHORT_TO_FLOAT_TEX( s[0] );
-   texel[GCOMP] = SHORT_TO_FLOAT_TEX( s[1] );
-   texel[BCOMP] = 0.0F;
-   texel[ACOMP] = 1.0F;
-}
-
-#if DIM == 3
-static void
-store_texel_signed_rg_16(struct gl_texture_image *texImage,
-                         GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLshort *rgba = (const GLshort *) texel;
-   GLshort *dst = TEXEL_ADDR(GLshort, texImage, i, j, k, 2);
-   dst[0] = rgba[RCOMP];
-   dst[1] = rgba[GCOMP];
-}
-#endif
-
-
-/* MESA_FORMAT_SIGNED_RGBA_16 ***********************************************/
-
-static void 
-FETCH(signed_rgb_16)(const struct gl_texture_image *texImage,
-                     GLint i, GLint j, GLint k, GLfloat *texel)
-{
-   const GLshort *s = TEXEL_ADDR(GLshort, texImage, i, j, k, 3);
-   texel[RCOMP] = SHORT_TO_FLOAT_TEX( s[0] );
-   texel[GCOMP] = SHORT_TO_FLOAT_TEX( s[1] );
-   texel[BCOMP] = SHORT_TO_FLOAT_TEX( s[2] );
-   texel[ACOMP] = 1.0F;
-}
-
-#if DIM == 3
-static void
-store_texel_signed_rgb_16(struct gl_texture_image *texImage,
-                          GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLshort *rgba = (const GLshort *) texel;
-   GLshort *dst = TEXEL_ADDR(GLshort, texImage, i, j, k, 3);
-   dst[0] = rgba[RCOMP];
-   dst[1] = rgba[GCOMP];
-   dst[2] = rgba[BCOMP];
-}
-#endif
-
-
-/* MESA_FORMAT_SIGNED_RGBA_16 ***********************************************/
-
-static void
-FETCH(signed_rgba_16)(const struct gl_texture_image *texImage,
-                      GLint i, GLint j, GLint k, GLfloat *texel)
-{
-   const GLshort *s = TEXEL_ADDR(GLshort, texImage, i, j, k, 4);
-   texel[RCOMP] = SHORT_TO_FLOAT_TEX( s[0] );
-   texel[GCOMP] = SHORT_TO_FLOAT_TEX( s[1] );
-   texel[BCOMP] = SHORT_TO_FLOAT_TEX( s[2] );
-   texel[ACOMP] = SHORT_TO_FLOAT_TEX( s[3] );
-}
-
-#if DIM == 3
-static void
-store_texel_signed_rgba_16(struct gl_texture_image *texImage,
-                           GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLshort *rgba = (const GLshort *) texel;
-   GLshort *dst = TEXEL_ADDR(GLshort, texImage, i, j, k, 4);
-   dst[0] = rgba[RCOMP];
-   dst[1] = rgba[GCOMP];
-   dst[2] = rgba[BCOMP];
-   dst[3] = rgba[ACOMP];
-}
-#endif
-
-
-
-/* MESA_FORMAT_RGBA_16 ***********************************************/
-
-static void
-FETCH(rgba_16)(const struct gl_texture_image *texImage,
-               GLint i, GLint j, GLint k, GLfloat *texel)
-{
-   const GLushort *s = TEXEL_ADDR(GLushort, texImage, i, j, k, 4);
-   texel[RCOMP] = USHORT_TO_FLOAT( s[0] );
-   texel[GCOMP] = USHORT_TO_FLOAT( s[1] );
-   texel[BCOMP] = USHORT_TO_FLOAT( s[2] );
-   texel[ACOMP] = USHORT_TO_FLOAT( s[3] );
-}
-
-#if DIM == 3
-static void
-store_texel_rgba_16(struct gl_texture_image *texImage,
-                    GLint i, GLint j, GLint k, const void *texel)
-{
-   const GLushort *rgba = (const GLushort *) texel;
-   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 4);
-   dst[0] = rgba[RCOMP];
-   dst[1] = rgba[GCOMP];
-   dst[2] = rgba[BCOMP];
-   dst[3] = rgba[ACOMP];
-}
-#endif
-
-
-
-/* MESA_FORMAT_YCBCR *********************************************************/
-
-/* Fetch texel from 1D, 2D or 3D ycbcr texture, return 4 GLfloats.
- * We convert YCbCr to RGB here.
- */
-static void FETCH(f_ycbcr)( const struct gl_texture_image *texImage,
-                            GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLushort *src0 = TEXEL_ADDR(GLushort, texImage, (i & ~1), j, k, 1); /* even */
-   const GLushort *src1 = src0 + 1;                               /* odd */
-   const GLubyte y0 = (*src0 >> 8) & 0xff;  /* luminance */
-   const GLubyte cb = *src0 & 0xff;         /* chroma U */
-   const GLubyte y1 = (*src1 >> 8) & 0xff;  /* luminance */
-   const GLubyte cr = *src1 & 0xff;         /* chroma V */
-   const GLubyte y = (i & 1) ? y1 : y0;     /* choose even/odd luminance */
-   GLfloat r = 1.164F * (y - 16) + 1.596F * (cr - 128);
-   GLfloat g = 1.164F * (y - 16) - 0.813F * (cr - 128) - 0.391F * (cb - 128);
-   GLfloat b = 1.164F * (y - 16) + 2.018F * (cb - 128);
-   r *= (1.0F / 255.0F);
-   g *= (1.0F / 255.0F);
-   b *= (1.0F / 255.0F);
-   texel[RCOMP] = CLAMP(r, 0.0F, 1.0F);
-   texel[GCOMP] = CLAMP(g, 0.0F, 1.0F);
-   texel[BCOMP] = CLAMP(b, 0.0F, 1.0F);
-   texel[ACOMP] = 1.0F;
-}
-
-#if DIM == 3
-static void store_texel_ycbcr(struct gl_texture_image *texImage,
-                              GLint i, GLint j, GLint k, const void *texel)
-{
-   (void) texImage;
-   (void) i;
-   (void) j;
-   (void) k;
-   (void) texel;
-   /* XXX to do */
-}
-#endif
-
-
-/* MESA_FORMAT_YCBCR_REV *****************************************************/
-
-/* Fetch texel from 1D, 2D or 3D ycbcr_rev texture, return 4 GLfloats.
- * We convert YCbCr to RGB here.
- */
-static void FETCH(f_ycbcr_rev)( const struct gl_texture_image *texImage,
-                                GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   const GLushort *src0 = TEXEL_ADDR(GLushort, texImage, (i & ~1), j, k, 1); /* even */
-   const GLushort *src1 = src0 + 1;                               /* odd */
-   const GLubyte y0 = *src0 & 0xff;         /* luminance */
-   const GLubyte cr = (*src0 >> 8) & 0xff;  /* chroma V */
-   const GLubyte y1 = *src1 & 0xff;         /* luminance */
-   const GLubyte cb = (*src1 >> 8) & 0xff;  /* chroma U */
-   const GLubyte y = (i & 1) ? y1 : y0;     /* choose even/odd luminance */
-   GLfloat r = 1.164F * (y - 16) + 1.596F * (cr - 128);
-   GLfloat g = 1.164F * (y - 16) - 0.813F * (cr - 128) - 0.391F * (cb - 128);
-   GLfloat b = 1.164F * (y - 16) + 2.018F * (cb - 128);
-   r *= (1.0F / 255.0F);
-   g *= (1.0F / 255.0F);
-   b *= (1.0F / 255.0F);
-   texel[RCOMP] = CLAMP(r, 0.0F, 1.0F);
-   texel[GCOMP] = CLAMP(g, 0.0F, 1.0F);
-   texel[BCOMP] = CLAMP(b, 0.0F, 1.0F);
-   texel[ACOMP] = 1.0F;
-}
-
-#if DIM == 3
-static void store_texel_ycbcr_rev(struct gl_texture_image *texImage,
-                                  GLint i, GLint j, GLint k, const void *texel)
-{
-   (void) texImage;
-   (void) i;
-   (void) j;
-   (void) k;
-   (void) texel;
-   /* XXX to do */
-}
-#endif
-
-
-/* MESA_TEXFORMAT_Z24_S8 ***************************************************/
-
-static void FETCH(f_z24_s8)( const struct gl_texture_image *texImage,
-                             GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   /* only return Z, not stencil data */
-   const GLuint *src = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   const GLfloat scale = 1.0F / (GLfloat) 0xffffff;
-   texel[0] = ((*src) >> 8) * scale;
-   ASSERT(texImage->TexFormat == MESA_FORMAT_Z24_S8);
-   ASSERT(texel[0] >= 0.0F);
-   ASSERT(texel[0] <= 1.0F);
-}
-
-#if DIM == 3
-static void store_texel_z24_s8(struct gl_texture_image *texImage,
-                               GLint i, GLint j, GLint k, const void *texel)
-{
-   /* only store Z, not stencil */
-   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   GLfloat depth = *((GLfloat *) texel);
-   GLuint zi = ((GLuint) (depth * 0xffffff)) << 8;
-   *dst = zi | (*dst & 0xff);
-}
-#endif
-
-
-/* MESA_TEXFORMAT_S8_Z24 ***************************************************/
-
-static void FETCH(f_s8_z24)( const struct gl_texture_image *texImage,
-                             GLint i, GLint j, GLint k, GLfloat *texel )
-{
-   /* only return Z, not stencil data */
-   const GLuint *src = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   const GLfloat scale = 1.0F / (GLfloat) 0xffffff;
-   texel[0] = ((*src) & 0x00ffffff) * scale;
-   ASSERT(texImage->TexFormat == MESA_FORMAT_S8_Z24);
-   ASSERT(texel[0] >= 0.0F);
-   ASSERT(texel[0] <= 1.0F);
-}
-
-#if DIM == 3
-static void store_texel_s8_z24(struct gl_texture_image *texImage,
-                               GLint i, GLint j, GLint k, const void *texel)
-{
-   /* only store Z, not stencil */
-   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
-   GLfloat depth = *((GLfloat *) texel);
-   GLuint zi = (GLuint) (depth * 0xffffff);
-   *dst = zi | (*dst & 0xff000000);
-}
-#endif
-
-
-#undef TEXEL_ADDR
-#undef DIM
-#undef FETCH
+/*
+ * Mesa 3-D graphics library
+ * Version:  7.7
+ *
+ * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
+ * Copyright (c) 2008-2009  VMware, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+
+/**
+ * \file texfetch_tmp.h
+ * Texel fetch functions template.
+ * 
+ * This template file is used by texfetch.c to generate texel fetch functions
+ * for 1-D, 2-D and 3-D texture images. 
+ *
+ * It should be expanded by defining \p DIM as the number texture dimensions
+ * (1, 2 or 3).  According to the value of \p DIM a series of macros is defined
+ * for the texel lookup in the gl_texture_image::Data.
+ * 
+ * \author Gareth Hughes
+ * \author Brian Paul
+ */
+
+
+#if DIM == 1
+
+#define TEXEL_ADDR( type, image, i, j, k, size ) \
+	((void) (j), (void) (k), ((type *)(image)->Data + (i) * (size)))
+
+#define FETCH(x) fetch_texel_1d_##x
+
+#elif DIM == 2
+
+#define TEXEL_ADDR( type, image, i, j, k, size )			\
+	((void) (k),							\
+	 ((type *)(image)->Data + ((image)->RowStride * (j) + (i)) * (size)))
+
+#define FETCH(x) fetch_texel_2d_##x
+
+#elif DIM == 3
+
+#define TEXEL_ADDR( type, image, i, j, k, size )			\
+	((type *)(image)->Data + ((image)->ImageOffsets[k]		\
+             + (image)->RowStride * (j) + (i)) * (size))
+
+#define FETCH(x) fetch_texel_3d_##x
+
+#else
+#error	illegal number of texture dimensions
+#endif
+
+
+/* MESA_FORMAT_Z32 ***********************************************************/
+
+/* Fetch depth texel from 1D, 2D or 3D 32-bit depth texture,
+ * returning 1 GLfloat.
+ * Note: no GLchan version of this function.
+ */
+static void FETCH(f_z32)( const struct gl_texture_image *texImage,
+                          GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLuint *src = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   texel[0] = src[0] * (1.0F / 0xffffffff);
+}
+
+#if DIM == 3
+static void store_texel_z32(struct gl_texture_image *texImage,
+                            GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLuint *depth = (const GLuint *) texel;
+   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   dst[0] = *depth;
+}
+#endif
+
+
+/* MESA_FORMAT_Z16 ***********************************************************/
+
+/* Fetch depth texel from 1D, 2D or 3D 16-bit depth texture,
+ * returning 1 GLfloat.
+ * Note: no GLchan version of this function.
+ */
+static void FETCH(f_z16)(const struct gl_texture_image *texImage,
+                         GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   texel[0] = src[0] * (1.0F / 65535.0F);
+}
+
+#if DIM == 3
+static void store_texel_z16(struct gl_texture_image *texImage,
+                            GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLushort *depth = (const GLushort *) texel;
+   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   dst[0] = *depth;
+}
+#endif
+
+
+/* MESA_FORMAT_RGBA_F32 ******************************************************/
+
+/* Fetch texel from 1D, 2D or 3D RGBA_FLOAT32 texture, returning 4 GLfloats.
+ */
+static void FETCH(f_rgba_f32)( const struct gl_texture_image *texImage,
+                               GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 4);
+   texel[RCOMP] = src[0];
+   texel[GCOMP] = src[1];
+   texel[BCOMP] = src[2];
+   texel[ACOMP] = src[3];
+}
+
+#if DIM == 3
+static void store_texel_rgba_f32(struct gl_texture_image *texImage,
+                                 GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLfloat *depth = (const GLfloat *) texel;
+   GLfloat *dst = TEXEL_ADDR(GLfloat, texImage, i, j, k, 4);
+   dst[0] = depth[RCOMP];
+   dst[1] = depth[GCOMP];
+   dst[2] = depth[BCOMP];
+   dst[3] = depth[ACOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_RGBA_F16 ******************************************************/
+
+/* Fetch texel from 1D, 2D or 3D RGBA_FLOAT16 texture,
+ * returning 4 GLfloats.
+ */
+static void FETCH(f_rgba_f16)( const struct gl_texture_image *texImage,
+                               GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 4);
+   texel[RCOMP] = _mesa_half_to_float(src[0]);
+   texel[GCOMP] = _mesa_half_to_float(src[1]);
+   texel[BCOMP] = _mesa_half_to_float(src[2]);
+   texel[ACOMP] = _mesa_half_to_float(src[3]);
+}
+
+#if DIM == 3
+static void store_texel_rgba_f16(struct gl_texture_image *texImage,
+                                 GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLfloat *src = (const GLfloat *) texel;
+   GLhalfARB *dst = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 4);
+   dst[0] = _mesa_float_to_half(src[RCOMP]);
+   dst[1] = _mesa_float_to_half(src[GCOMP]);
+   dst[2] = _mesa_float_to_half(src[BCOMP]);
+   dst[3] = _mesa_float_to_half(src[ACOMP]);
+}
+#endif
+
+/* MESA_FORMAT_RGB_F32 *******************************************************/
+
+/* Fetch texel from 1D, 2D or 3D RGB_FLOAT32 texture,
+ * returning 4 GLfloats.
+ */
+static void FETCH(f_rgb_f32)( const struct gl_texture_image *texImage,
+                              GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 3);
+   texel[RCOMP] = src[0];
+   texel[GCOMP] = src[1];
+   texel[BCOMP] = src[2];
+   texel[ACOMP] = 1.0F;
+}
+
+#if DIM == 3
+static void store_texel_rgb_f32(struct gl_texture_image *texImage,
+                                 GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLfloat *src = (const GLfloat *) texel;
+   GLfloat *dst = TEXEL_ADDR(GLfloat, texImage, i, j, k, 3);
+   dst[0] = src[RCOMP];
+   dst[1] = src[GCOMP];
+   dst[2] = src[BCOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_RGB_F16 *******************************************************/
+
+/* Fetch texel from 1D, 2D or 3D RGB_FLOAT16 texture,
+ * returning 4 GLfloats.
+ */
+static void FETCH(f_rgb_f16)( const struct gl_texture_image *texImage,
+                              GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 3);
+   texel[RCOMP] = _mesa_half_to_float(src[0]);
+   texel[GCOMP] = _mesa_half_to_float(src[1]);
+   texel[BCOMP] = _mesa_half_to_float(src[2]);
+   texel[ACOMP] = 1.0F;
+}
+
+#if DIM == 3
+static void store_texel_rgb_f16(struct gl_texture_image *texImage,
+                                GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLfloat *src = (const GLfloat *) texel;
+   GLhalfARB *dst = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 3);
+   dst[0] = _mesa_float_to_half(src[RCOMP]);
+   dst[1] = _mesa_float_to_half(src[GCOMP]);
+   dst[2] = _mesa_float_to_half(src[BCOMP]);
+}
+#endif
+
+
+/* MESA_FORMAT_ALPHA_F32 *****************************************************/
+
+/* Fetch texel from 1D, 2D or 3D ALPHA_FLOAT32 texture,
+ * returning 4 GLfloats.
+ */
+static void FETCH(f_alpha_f32)( const struct gl_texture_image *texImage,
+                              GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 1);
+   texel[RCOMP] =
+   texel[GCOMP] =
+   texel[BCOMP] = 0.0F;
+   texel[ACOMP] = src[0];
+}
+
+#if DIM == 3
+static void store_texel_alpha_f32(struct gl_texture_image *texImage,
+                                  GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLfloat *rgba = (const GLfloat *) texel;
+   GLfloat *dst = TEXEL_ADDR(GLfloat, texImage, i, j, k, 1);
+   dst[0] = rgba[ACOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_ALPHA_F32 *****************************************************/
+
+/* Fetch texel from 1D, 2D or 3D ALPHA_FLOAT16 texture,
+ * returning 4 GLfloats.
+ */
+static void FETCH(f_alpha_f16)( const struct gl_texture_image *texImage,
+                              GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 1);
+   texel[RCOMP] =
+   texel[GCOMP] =
+   texel[BCOMP] = 0.0F;
+   texel[ACOMP] = _mesa_half_to_float(src[0]);
+}
+
+#if DIM == 3
+static void store_texel_alpha_f16(struct gl_texture_image *texImage,
+                                  GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLfloat *rgba = (const GLfloat *) texel;
+   GLhalfARB *dst = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 1);
+   dst[0] = _mesa_float_to_half(rgba[ACOMP]);
+}
+#endif
+
+
+/* MESA_FORMAT_LUMINANCE_F32 *************************************************/
+
+/* Fetch texel from 1D, 2D or 3D LUMINANCE_FLOAT32 texture,
+ * returning 4 GLfloats.
+ */
+static void FETCH(f_luminance_f32)( const struct gl_texture_image *texImage,
+                                    GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 1);
+   texel[RCOMP] =
+   texel[GCOMP] =
+   texel[BCOMP] = src[0];
+   texel[ACOMP] = 1.0F;
+}
+
+#if DIM == 3
+static void store_texel_luminance_f32(struct gl_texture_image *texImage,
+                                  GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLfloat *rgba = (const GLfloat *) texel;
+   GLfloat *dst = TEXEL_ADDR(GLfloat, texImage, i, j, k, 1);
+   dst[0] = rgba[RCOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_LUMINANCE_F16 *************************************************/
+
+/* Fetch texel from 1D, 2D or 3D LUMINANCE_FLOAT16 texture,
+ * returning 4 GLfloats.
+ */
+static void FETCH(f_luminance_f16)( const struct gl_texture_image *texImage,
+                                    GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 1);
+   texel[RCOMP] =
+   texel[GCOMP] =
+   texel[BCOMP] = _mesa_half_to_float(src[0]);
+   texel[ACOMP] = 1.0F;
+}
+
+#if DIM == 3
+static void store_texel_luminance_f16(struct gl_texture_image *texImage,
+                                  GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLfloat *rgba = (const GLfloat *) texel;
+   GLhalfARB *dst = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 1);
+   dst[0] = _mesa_float_to_half(rgba[RCOMP]);
+}
+#endif
+
+
+/* MESA_FORMAT_LUMINANCE_ALPHA_F32 *******************************************/
+
+/* Fetch texel from 1D, 2D or 3D LUMINANCE_ALPHA_FLOAT32 texture,
+ * returning 4 GLfloats.
+ */
+static void FETCH(f_luminance_alpha_f32)( const struct gl_texture_image *texImage,
+                                    GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 2);
+   texel[RCOMP] =
+   texel[GCOMP] =
+   texel[BCOMP] = src[0];
+   texel[ACOMP] = src[1];
+}
+
+#if DIM == 3
+static void store_texel_luminance_alpha_f32(struct gl_texture_image *texImage,
+                                  GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLfloat *rgba = (const GLfloat *) texel;
+   GLfloat *dst = TEXEL_ADDR(GLfloat, texImage, i, j, k, 2);
+   dst[0] = rgba[RCOMP];
+   dst[1] = rgba[ACOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_LUMINANCE_ALPHA_F16 *******************************************/
+
+/* Fetch texel from 1D, 2D or 3D LUMINANCE_ALPHA_FLOAT16 texture,
+ * returning 4 GLfloats.
+ */
+static void FETCH(f_luminance_alpha_f16)( const struct gl_texture_image *texImage,
+                                    GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 2);
+   texel[RCOMP] =
+   texel[GCOMP] =
+   texel[BCOMP] = _mesa_half_to_float(src[0]);
+   texel[ACOMP] = _mesa_half_to_float(src[1]);
+}
+
+#if DIM == 3
+static void store_texel_luminance_alpha_f16(struct gl_texture_image *texImage,
+                                  GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLfloat *rgba = (const GLfloat *) texel;
+   GLhalfARB *dst = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 2);
+   dst[0] = _mesa_float_to_half(rgba[RCOMP]);
+   dst[1] = _mesa_float_to_half(rgba[ACOMP]);
+}
+#endif
+
+
+/* MESA_FORMAT_INTENSITY_F32 *************************************************/
+
+/* Fetch texel from 1D, 2D or 3D INTENSITY_FLOAT32 texture,
+ * returning 4 GLfloats.
+ */
+static void FETCH(f_intensity_f32)( const struct gl_texture_image *texImage,
+                                    GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLfloat *src = TEXEL_ADDR(GLfloat, texImage, i, j, k, 1);
+   texel[RCOMP] =
+   texel[GCOMP] =
+   texel[BCOMP] =
+   texel[ACOMP] = src[0];
+}
+
+#if DIM == 3
+static void store_texel_intensity_f32(struct gl_texture_image *texImage,
+                                  GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLfloat *rgba = (const GLfloat *) texel;
+   GLfloat *dst = TEXEL_ADDR(GLfloat, texImage, i, j, k, 1);
+   dst[0] = rgba[RCOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_INTENSITY_F16 *************************************************/
+
+/* Fetch texel from 1D, 2D or 3D INTENSITY_FLOAT16 texture,
+ * returning 4 GLfloats.
+ */
+static void FETCH(f_intensity_f16)( const struct gl_texture_image *texImage,
+                                    GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLhalfARB *src = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 1);
+   texel[RCOMP] =
+   texel[GCOMP] =
+   texel[BCOMP] =
+   texel[ACOMP] = _mesa_half_to_float(src[0]);
+}
+
+#if DIM == 3
+static void store_texel_intensity_f16(struct gl_texture_image *texImage,
+                                  GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLfloat *rgba = (const GLfloat *) texel;
+   GLhalfARB *dst = TEXEL_ADDR(GLhalfARB, texImage, i, j, k, 1);
+   dst[0] = _mesa_float_to_half(rgba[RCOMP]);
+}
+#endif
+
+
+
+
+/*
+ * Begin Hardware formats
+ */
+
+/* MESA_FORMAT_RGBA8888 ******************************************************/
+
+/* Fetch texel from 1D, 2D or 3D rgba8888 texture, return 4 GLfloats */
+static void FETCH(f_rgba8888)( const struct gl_texture_image *texImage,
+                               GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   texel[RCOMP] = UBYTE_TO_FLOAT( (s >> 24)        );
+   texel[GCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff );
+   texel[BCOMP] = UBYTE_TO_FLOAT( (s >>  8) & 0xff );
+   texel[ACOMP] = UBYTE_TO_FLOAT( (s      ) & 0xff );
+}
+
+
+
+#if DIM == 3
+static void store_texel_rgba8888(struct gl_texture_image *texImage,
+                                 GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_8888(rgba[RCOMP], rgba[GCOMP], rgba[BCOMP], rgba[ACOMP]);
+}
+#endif
+
+
+/* MESA_FORMAT_RGBA888_REV ***************************************************/
+
+/* Fetch texel from 1D, 2D or 3D abgr8888 texture, return 4 GLchans */
+static void FETCH(f_rgba8888_rev)( const struct gl_texture_image *texImage,
+                                   GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   texel[RCOMP] = UBYTE_TO_FLOAT( (s      ) & 0xff );
+   texel[GCOMP] = UBYTE_TO_FLOAT( (s >>  8) & 0xff );
+   texel[BCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff );
+   texel[ACOMP] = UBYTE_TO_FLOAT( (s >> 24)        );
+}
+
+#if DIM == 3
+static void store_texel_rgba8888_rev(struct gl_texture_image *texImage,
+                                  GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_8888_REV(rgba[RCOMP], rgba[GCOMP], rgba[BCOMP], rgba[ACOMP]);
+}
+#endif
+
+
+/* MESA_FORMAT_ARGB8888 ******************************************************/
+
+/* Fetch texel from 1D, 2D or 3D argb8888 texture, return 4 GLchans */
+static void FETCH(f_argb8888)( const struct gl_texture_image *texImage,
+                               GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   texel[RCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff );
+   texel[GCOMP] = UBYTE_TO_FLOAT( (s >>  8) & 0xff );
+   texel[BCOMP] = UBYTE_TO_FLOAT( (s      ) & 0xff );
+   texel[ACOMP] = UBYTE_TO_FLOAT( (s >> 24)        );
+}
+
+#if DIM == 3
+static void store_texel_argb8888(struct gl_texture_image *texImage,
+                                 GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_8888(rgba[ACOMP], rgba[RCOMP], rgba[GCOMP], rgba[BCOMP]);
+}
+#endif
+
+
+/* MESA_FORMAT_ARGB8888_REV **************************************************/
+
+/* Fetch texel from 1D, 2D or 3D argb8888_rev texture, return 4 GLfloats */
+static void FETCH(f_argb8888_rev)( const struct gl_texture_image *texImage,
+                                   GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   texel[RCOMP] = UBYTE_TO_FLOAT( (s >>  8) & 0xff );
+   texel[GCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff );
+   texel[BCOMP] = UBYTE_TO_FLOAT( (s >> 24)        );
+   texel[ACOMP] = UBYTE_TO_FLOAT( (s      ) & 0xff );
+}
+
+#if DIM == 3
+static void store_texel_argb8888_rev(struct gl_texture_image *texImage,
+                                  GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_8888(rgba[BCOMP], rgba[GCOMP], rgba[RCOMP], rgba[ACOMP]);
+}
+#endif
+
+
+/* MESA_FORMAT_XRGB8888 ******************************************************/
+
+/* Fetch texel from 1D, 2D or 3D xrgb8888 texture, return 4 GLchans */
+static void FETCH(f_xrgb8888)( const struct gl_texture_image *texImage,
+                               GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   texel[RCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff );
+   texel[GCOMP] = UBYTE_TO_FLOAT( (s >>  8) & 0xff );
+   texel[BCOMP] = UBYTE_TO_FLOAT( (s      ) & 0xff );
+   texel[ACOMP] = 1.0f;
+}
+
+#if DIM == 3
+static void store_texel_xrgb8888(struct gl_texture_image *texImage,
+                                 GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_8888(0xff, rgba[RCOMP], rgba[GCOMP], rgba[BCOMP]);
+}
+#endif
+
+
+/* MESA_FORMAT_XRGB8888_REV **************************************************/
+
+/* Fetch texel from 1D, 2D or 3D xrgb8888_rev texture, return 4 GLfloats */
+static void FETCH(f_xrgb8888_rev)( const struct gl_texture_image *texImage,
+                                   GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   texel[RCOMP] = UBYTE_TO_FLOAT( (s >>  8) & 0xff );
+   texel[GCOMP] = UBYTE_TO_FLOAT( (s >> 16) & 0xff );
+   texel[BCOMP] = UBYTE_TO_FLOAT( (s >> 24)        );
+   texel[ACOMP] = 1.0f;
+}
+
+#if DIM == 3
+static void store_texel_xrgb8888_rev(struct gl_texture_image *texImage,
+                                     GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_8888(rgba[BCOMP], rgba[GCOMP], rgba[RCOMP], 0xff);
+}
+#endif
+
+
+/* MESA_FORMAT_RGB888 ********************************************************/
+
+/* Fetch texel from 1D, 2D or 3D rgb888 texture, return 4 GLchans */
+static void FETCH(f_rgb888)( const struct gl_texture_image *texImage,
+                             GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 3);
+   texel[RCOMP] = UBYTE_TO_FLOAT( src[2] );
+   texel[GCOMP] = UBYTE_TO_FLOAT( src[1] );
+   texel[BCOMP] = UBYTE_TO_FLOAT( src[0] );
+   texel[ACOMP] = 1.0F;
+}
+
+#if DIM == 3
+static void store_texel_rgb888(struct gl_texture_image *texImage,
+                               GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLubyte *dst = TEXEL_ADDR(GLubyte, texImage, i, j, k, 3);
+   dst[0] = rgba[BCOMP];
+   dst[1] = rgba[GCOMP];
+   dst[2] = rgba[RCOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_BGR888 ********************************************************/
+
+/* Fetch texel from 1D, 2D or 3D bgr888 texture, return 4 GLchans */
+static void FETCH(f_bgr888)( const struct gl_texture_image *texImage,
+                             GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 3);
+   texel[RCOMP] = UBYTE_TO_FLOAT( src[0] );
+   texel[GCOMP] = UBYTE_TO_FLOAT( src[1] );
+   texel[BCOMP] = UBYTE_TO_FLOAT( src[2] );
+   texel[ACOMP] = 1.0F;
+}
+
+#if DIM == 3
+static void store_texel_bgr888(struct gl_texture_image *texImage,
+                               GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLubyte *dst = TEXEL_ADDR(GLubyte, texImage, i, j, k, 3);
+   dst[0] = rgba[RCOMP];
+   dst[1] = rgba[GCOMP];
+   dst[2] = rgba[BCOMP];
+}
+#endif
+
+
+/* use color expansion like (g << 2) | (g >> 4) (does somewhat random rounding)
+   instead of slow (g << 2) * 255 / 252 (always rounds down) */
+
+/* MESA_FORMAT_RGB565 ********************************************************/
+
+/* Fetch texel from 1D, 2D or 3D rgb565 texture, return 4 GLchans */
+static void FETCH(f_rgb565)( const struct gl_texture_image *texImage,
+                             GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   const GLushort s = *src;
+   texel[RCOMP] = ((s >> 11) & 0x1f) * (1.0F / 31.0F);
+   texel[GCOMP] = ((s >> 5 ) & 0x3f) * (1.0F / 63.0F);
+   texel[BCOMP] = ((s      ) & 0x1f) * (1.0F / 31.0F);
+   texel[ACOMP] = 1.0F;
+}
+
+#if DIM == 3
+static void store_texel_rgb565(struct gl_texture_image *texImage,
+                               GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_565(rgba[RCOMP], rgba[GCOMP], rgba[BCOMP]);
+}
+#endif
+
+
+/* MESA_FORMAT_RGB565_REV ****************************************************/
+
+/* Fetch texel from 1D, 2D or 3D rgb565_rev texture, return 4 GLchans */
+static void FETCH(f_rgb565_rev)( const struct gl_texture_image *texImage,
+                                 GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   const GLushort s = (*src >> 8) | (*src << 8); /* byte swap */
+   texel[RCOMP] = UBYTE_TO_FLOAT( ((s >> 8) & 0xf8) | ((s >> 13) & 0x7) );
+   texel[GCOMP] = UBYTE_TO_FLOAT( ((s >> 3) & 0xfc) | ((s >>  9) & 0x3) );
+   texel[BCOMP] = UBYTE_TO_FLOAT( ((s << 3) & 0xf8) | ((s >>  2) & 0x7) );
+   texel[ACOMP] = 1.0F;
+}
+
+#if DIM == 3
+static void store_texel_rgb565_rev(struct gl_texture_image *texImage,
+                                  GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_565(rgba[BCOMP], rgba[GCOMP], rgba[RCOMP]);
+}
+#endif
+
+
+/* MESA_FORMAT_ARGB4444 ******************************************************/
+
+/* Fetch texel from 1D, 2D or 3D argb444 texture, return 4 GLchans */
+static void FETCH(f_argb4444)( const struct gl_texture_image *texImage,
+                               GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   const GLushort s = *src;
+   texel[RCOMP] = ((s >>  8) & 0xf) * (1.0F / 15.0F);
+   texel[GCOMP] = ((s >>  4) & 0xf) * (1.0F / 15.0F);
+   texel[BCOMP] = ((s      ) & 0xf) * (1.0F / 15.0F);
+   texel[ACOMP] = ((s >> 12) & 0xf) * (1.0F / 15.0F);
+}
+
+#if DIM == 3
+static void store_texel_argb4444(struct gl_texture_image *texImage,
+                                 GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_4444(rgba[ACOMP], rgba[RCOMP], rgba[GCOMP], rgba[BCOMP]);
+}
+#endif
+
+
+/* MESA_FORMAT_ARGB4444_REV **************************************************/
+
+/* Fetch texel from 1D, 2D or 3D argb4444_rev texture, return 4 GLchans */
+static void FETCH(f_argb4444_rev)( const struct gl_texture_image *texImage,
+                                   GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLushort s = *TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   texel[RCOMP] = ((s      ) & 0xf) * (1.0F / 15.0F);
+   texel[GCOMP] = ((s >> 12) & 0xf) * (1.0F / 15.0F);
+   texel[BCOMP] = ((s >>  8) & 0xf) * (1.0F / 15.0F);
+   texel[ACOMP] = ((s >>  4) & 0xf) * (1.0F / 15.0F);
+}
+
+#if DIM == 3
+static void store_texel_argb4444_rev(struct gl_texture_image *texImage,
+                                 GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_4444(rgba[ACOMP], rgba[BCOMP], rgba[GCOMP], rgba[RCOMP]);
+}
+#endif
+
+/* MESA_FORMAT_RGBA5551 ******************************************************/
+
+/* Fetch texel from 1D, 2D or 3D argb1555 texture, return 4 GLchans */
+static void FETCH(f_rgba5551)( const struct gl_texture_image *texImage,
+                               GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   const GLushort s = *src;
+   texel[RCOMP] = ((s >> 11) & 0x1f) * (1.0F / 31.0F);
+   texel[GCOMP] = ((s >>  6) & 0x1f) * (1.0F / 31.0F);
+   texel[BCOMP] = ((s >>  1) & 0x1f) * (1.0F / 31.0F);
+   texel[ACOMP] = ((s      ) & 0x01) * 1.0F;
+}
+
+#if DIM == 3
+static void store_texel_rgba5551(struct gl_texture_image *texImage,
+                                 GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_5551(rgba[RCOMP], rgba[GCOMP], rgba[BCOMP], rgba[ACOMP]);
+}
+#endif
+
+/* MESA_FORMAT_ARGB1555 ******************************************************/
+
+/* Fetch texel from 1D, 2D or 3D argb1555 texture, return 4 GLchans */
+static void FETCH(f_argb1555)( const struct gl_texture_image *texImage,
+			     GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   const GLushort s = *src;
+   texel[RCOMP] = ((s >> 10) & 0x1f) * (1.0F / 31.0F);
+   texel[GCOMP] = ((s >>  5) & 0x1f) * (1.0F / 31.0F);
+   texel[BCOMP] = ((s >>  0) & 0x1f) * (1.0F / 31.0F);
+   texel[ACOMP] = ((s >> 15) & 0x01) * 1.0F;
+}
+
+#if DIM == 3
+static void store_texel_argb1555(struct gl_texture_image *texImage,
+                                 GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_1555(rgba[ACOMP], rgba[RCOMP], rgba[GCOMP], rgba[BCOMP]);
+}
+#endif
+
+
+/* MESA_FORMAT_ARGB1555_REV **************************************************/
+
+/* Fetch texel from 1D, 2D or 3D argb1555_rev texture, return 4 GLchans */
+static void FETCH(f_argb1555_rev)( const struct gl_texture_image *texImage,
+                                   GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   const GLushort s = (*src << 8) | (*src >> 8); /* byteswap */
+   texel[RCOMP] = UBYTE_TO_FLOAT( ((s >>  7) & 0xf8) | ((s >> 12) & 0x7) );
+   texel[GCOMP] = UBYTE_TO_FLOAT( ((s >>  2) & 0xf8) | ((s >>  7) & 0x7) );
+   texel[BCOMP] = UBYTE_TO_FLOAT( ((s <<  3) & 0xf8) | ((s >>  2) & 0x7) );
+   texel[ACOMP] = UBYTE_TO_FLOAT( ((s >> 15) & 0x01) * 255 );
+}
+
+#if DIM == 3
+static void store_texel_argb1555_rev(struct gl_texture_image *texImage,
+                                 GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_1555_REV(rgba[ACOMP], rgba[RCOMP], rgba[GCOMP], rgba[BCOMP]);
+}
+#endif
+
+
+/* MESA_FORMAT_ARGB2101010 ***************************************************/
+
+/* Fetch texel from 1D, 2D or 3D argb2101010 texture, return 4 GLchans */
+static void FETCH(f_argb2101010)( const struct gl_texture_image *texImage,
+                                  GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLuint *src = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   const GLuint s = *src;
+   texel[RCOMP] = ((s >> 20) & 0x3ff) * (1.0F / 1023.0F);
+   texel[GCOMP] = ((s >> 10) & 0x3ff) * (1.0F / 1023.0F);
+   texel[BCOMP] = ((s >>  0) & 0x3ff) * (1.0F / 1023.0F);
+   texel[ACOMP] = ((s >> 30) & 0x03) * (1.0F / 3.0F);
+}
+
+#if DIM == 3
+static void store_texel_argb2101010(struct gl_texture_image *texImage,
+                                    GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_2101010_UB(rgba[ACOMP], rgba[RCOMP], rgba[GCOMP], rgba[BCOMP]);
+}
+#endif
+
+
+/* MESA_FORMAT_RG88 **********************************************************/
+
+/* Fetch texel from 1D, 2D or 3D rg88 texture, return 4 GLchans */
+static void FETCH(f_rg88)( const struct gl_texture_image *texImage,
+                           GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLushort s = *TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   texel[RCOMP] = UBYTE_TO_FLOAT( s & 0xff );
+   texel[GCOMP] = UBYTE_TO_FLOAT( s >> 8 );
+   texel[BCOMP] = 0.0;
+   texel[ACOMP] = 1.0;
+}
+
+#if DIM == 3
+static void store_texel_rg88(struct gl_texture_image *texImage,
+                             GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_88(rgba[RCOMP], rgba[GCOMP]);
+}
+#endif
+
+
+/* MESA_FORMAT_RG88_REV ******************************************************/
+
+/* Fetch texel from 1D, 2D or 3D rg88_rev texture, return 4 GLchans */
+static void FETCH(f_rg88_rev)( const struct gl_texture_image *texImage,
+                           GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLushort s = *TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   texel[RCOMP] = UBYTE_TO_FLOAT( s & 0xff );
+   texel[GCOMP] = UBYTE_TO_FLOAT( s >> 8 );
+   texel[BCOMP] = 0.0;
+   texel[ACOMP] = 1.0;
+}
+
+#if DIM == 3
+static void store_texel_rg88_rev(struct gl_texture_image *texImage,
+                             GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_88(rgba[GCOMP], rgba[RCOMP]);
+}
+#endif
+
+
+/* MESA_FORMAT_AL44 **********************************************************/
+
+/* Fetch texel from 1D, 2D or 3D al44 texture, return 4 GLchans */
+static void FETCH(f_al44)( const struct gl_texture_image *texImage,
+                           GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLubyte s = *TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
+   texel[RCOMP] =
+   texel[GCOMP] =
+   texel[BCOMP] = (s & 0xf) * (1.0F / 15.0F);
+   texel[ACOMP] = ((s >> 4) & 0xf) * (1.0F / 15.0F);
+}
+
+#if DIM == 3
+static void store_texel_al44(struct gl_texture_image *texImage,
+                             GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLubyte *dst = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_44(rgba[ACOMP], rgba[RCOMP]);
+}
+#endif
+
+
+/* MESA_FORMAT_AL88 **********************************************************/
+
+/* Fetch texel from 1D, 2D or 3D al88 texture, return 4 GLchans */
+static void FETCH(f_al88)( const struct gl_texture_image *texImage,
+                           GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLushort s = *TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   texel[RCOMP] = 
+   texel[GCOMP] = 
+   texel[BCOMP] = UBYTE_TO_FLOAT( s & 0xff );
+   texel[ACOMP] = UBYTE_TO_FLOAT( s >> 8 );
+}
+
+#if DIM == 3
+static void store_texel_al88(struct gl_texture_image *texImage,
+                             GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_88(rgba[ACOMP], rgba[RCOMP]);
+}
+#endif
+
+
+/* MESA_FORMAT_R8 ************************************************************/
+
+/* Fetch texel from 1D, 2D or 3D rg88 texture, return 4 GLchans */
+static void FETCH(f_r8)(const struct gl_texture_image *texImage,
+			GLint i, GLint j, GLint k, GLfloat *texel)
+{
+   const GLubyte s = *TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
+   texel[RCOMP] = UBYTE_TO_FLOAT(s);
+   texel[GCOMP] = 0.0;
+   texel[BCOMP] = 0.0;
+   texel[ACOMP] = 1.0;
+}
+
+#if DIM == 3
+static void store_texel_r8(struct gl_texture_image *texImage,
+			   GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLubyte *dst = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
+   *dst = rgba[RCOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_R16 ***********************************************************/
+
+/* Fetch texel from 1D, 2D or 3D r16 texture, return 4 GLchans */
+static void FETCH(f_r16)(const struct gl_texture_image *texImage,
+			GLint i, GLint j, GLint k, GLfloat *texel)
+{
+   const GLushort s = *TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   texel[RCOMP] = USHORT_TO_FLOAT(s);
+   texel[GCOMP] = 0.0;
+   texel[BCOMP] = 0.0;
+   texel[ACOMP] = 1.0;
+}
+
+#if DIM == 3
+static void store_texel_r16(struct gl_texture_image *texImage,
+			    GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLushort *rgba = (const GLushort *) texel;
+   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   *dst = rgba[RCOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_AL88_REV ******************************************************/
+
+/* Fetch texel from 1D, 2D or 3D al88_rev texture, return 4 GLchans */
+static void FETCH(f_al88_rev)( const struct gl_texture_image *texImage,
+                               GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLushort s = *TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   texel[RCOMP] = 
+   texel[GCOMP] = 
+   texel[BCOMP] = UBYTE_TO_FLOAT( s >> 8 );
+   texel[ACOMP] = UBYTE_TO_FLOAT( s & 0xff );
+}
+
+#if DIM == 3
+static void store_texel_al88_rev(struct gl_texture_image *texImage,
+                                 GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_88(rgba[RCOMP], rgba[ACOMP]);
+}
+#endif
+
+
+/* MESA_FORMAT_RG1616 ********************************************************/
+
+/* Fetch texel from 1D, 2D or 3D rg1616 texture, return 4 GLchans */
+static void FETCH(f_rg1616)( const struct gl_texture_image *texImage,
+                           GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   texel[RCOMP] = USHORT_TO_FLOAT( s & 0xffff );
+   texel[GCOMP] = USHORT_TO_FLOAT( s >> 16 );
+   texel[BCOMP] = 0.0;
+   texel[ACOMP] = 1.0;
+}
+
+#if DIM == 3
+static void store_texel_rg1616(struct gl_texture_image *texImage,
+                             GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_1616(rgba[RCOMP], rgba[GCOMP]);
+}
+#endif
+
+
+/* MESA_FORMAT_RG1616_REV ****************************************************/
+
+/* Fetch texel from 1D, 2D or 3D rg1616_rev texture, return 4 GLchans */
+static void FETCH(f_rg1616_rev)( const struct gl_texture_image *texImage,
+                           GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   texel[RCOMP] = USHORT_TO_FLOAT( s >> 16 );
+   texel[GCOMP] = USHORT_TO_FLOAT( s & 0xffff );
+   texel[BCOMP] = 0.0;
+   texel[ACOMP] = 1.0;
+}
+
+#if DIM == 3
+static void store_texel_rg1616_rev(struct gl_texture_image *texImage,
+                             GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_1616(rgba[GCOMP], rgba[RCOMP]);
+}
+#endif
+
+
+/* MESA_FORMAT_AL1616 ********************************************************/
+
+/* Fetch texel from 1D, 2D or 3D al1616 texture, return 4 GLchans */
+static void FETCH(f_al1616)( const struct gl_texture_image *texImage,
+			     GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   texel[RCOMP] =
+   texel[GCOMP] =
+   texel[BCOMP] = USHORT_TO_FLOAT( s & 0xffff );
+   texel[ACOMP] = USHORT_TO_FLOAT( s >> 16 );
+}
+
+#if DIM == 3
+static void store_texel_al1616(struct gl_texture_image *texImage,
+                             GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLushort *rgba = (const GLushort *) texel;
+   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_1616(rgba[ACOMP], rgba[RCOMP]);
+}
+#endif
+
+
+/* MESA_FORMAT_AL1616_REV ****************************************************/
+
+/* Fetch texel from 1D, 2D or 3D al1616_rev texture, return 4 GLchans */
+static void FETCH(f_al1616_rev)( const struct gl_texture_image *texImage,
+				 GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   texel[RCOMP] =
+   texel[GCOMP] =
+   texel[BCOMP] = USHORT_TO_FLOAT( s >> 16 );
+   texel[ACOMP] = USHORT_TO_FLOAT( s & 0xffff );
+}
+
+#if DIM == 3
+static void store_texel_al1616_rev(struct gl_texture_image *texImage,
+				   GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLushort *rgba = (const GLushort *) texel;
+   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_1616(rgba[RCOMP], rgba[ACOMP]);
+}
+#endif
+
+
+/* MESA_FORMAT_RGB332 ********************************************************/
+
+/* Fetch texel from 1D, 2D or 3D rgb332 texture, return 4 GLchans */
+static void FETCH(f_rgb332)( const struct gl_texture_image *texImage,
+                             GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
+   const GLubyte s = *src;
+   texel[RCOMP] = ((s >> 5) & 0x7) * (1.0F / 7.0F);
+   texel[GCOMP] = ((s >> 2) & 0x7) * (1.0F / 7.0F);
+   texel[BCOMP] = ((s     ) & 0x3) * (1.0F / 3.0F);
+   texel[ACOMP] = 1.0F;
+}
+
+#if DIM == 3
+static void store_texel_rgb332(struct gl_texture_image *texImage,
+                               GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLubyte *dst = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_332(rgba[RCOMP], rgba[GCOMP], rgba[BCOMP]);
+}
+#endif
+
+
+/* MESA_FORMAT_A8 ************************************************************/
+
+/* Fetch texel from 1D, 2D or 3D a8 texture, return 4 GLchans */
+static void FETCH(f_a8)( const struct gl_texture_image *texImage,
+                         GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
+   texel[RCOMP] =
+   texel[GCOMP] =
+   texel[BCOMP] = 0.0F;
+   texel[ACOMP] = UBYTE_TO_FLOAT( src[0] );
+}
+
+#if DIM == 3
+static void store_texel_a8(struct gl_texture_image *texImage,
+                           GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLubyte *dst = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
+   *dst = rgba[ACOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_A16 ************************************************************/
+
+/* Fetch texel from 1D, 2D or 3D a8 texture, return 4 GLchans */
+static void FETCH(f_a16)( const struct gl_texture_image *texImage,
+                          GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   texel[RCOMP] =
+   texel[GCOMP] =
+   texel[BCOMP] = 0.0F;
+   texel[ACOMP] = USHORT_TO_FLOAT( src[0] );
+}
+
+#if DIM == 3
+static void store_texel_a16(struct gl_texture_image *texImage,
+                            GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLushort *rgba = (const GLushort *) texel;
+   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   *dst = rgba[ACOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_L8 ************************************************************/
+
+/* Fetch texel from 1D, 2D or 3D l8 texture, return 4 GLchans */
+static void FETCH(f_l8)( const struct gl_texture_image *texImage,
+                         GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
+   texel[RCOMP] =
+   texel[GCOMP] =
+   texel[BCOMP] = UBYTE_TO_FLOAT( src[0] );
+   texel[ACOMP] = 1.0F;
+}
+
+#if DIM == 3
+static void store_texel_l8(struct gl_texture_image *texImage,
+                           GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLubyte *dst = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
+   *dst = rgba[RCOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_L16 ***********************************************************/
+
+/* Fetch texel from 1D, 2D or 3D l16 texture, return 4 GLchans */
+static void FETCH(f_l16)( const struct gl_texture_image *texImage,
+                          GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   texel[RCOMP] =
+   texel[GCOMP] =
+   texel[BCOMP] = USHORT_TO_FLOAT( src[0] );
+   texel[ACOMP] = 1.0F;
+}
+
+#if DIM == 3
+static void store_texel_l16(struct gl_texture_image *texImage,
+                            GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLushort *rgba = (const GLushort *) texel;
+   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   *dst = rgba[RCOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_I8 ************************************************************/
+
+/* Fetch texel from 1D, 2D or 3D i8 texture, return 4 GLchans */
+static void FETCH(f_i8)( const struct gl_texture_image *texImage,
+                         GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
+   texel[RCOMP] =
+   texel[GCOMP] =
+   texel[BCOMP] =
+   texel[ACOMP] = UBYTE_TO_FLOAT( src[0] );
+}
+
+#if DIM == 3
+static void store_texel_i8(struct gl_texture_image *texImage,
+                           GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLubyte *dst = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
+   *dst = rgba[RCOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_I16 ***********************************************************/
+
+/* Fetch texel from 1D, 2D or 3D i16 texture, return 4 GLchans */
+static void FETCH(f_i16)( const struct gl_texture_image *texImage,
+                          GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   texel[RCOMP] =
+   texel[GCOMP] =
+   texel[BCOMP] =
+   texel[ACOMP] = USHORT_TO_FLOAT( src[0] );
+}
+
+#if DIM == 3
+static void store_texel_i16(struct gl_texture_image *texImage,
+                            GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLushort *rgba = (const GLushort *) texel;
+   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   *dst = rgba[RCOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_CI8 ***********************************************************/
+
+/* Fetch CI texel from 1D, 2D or 3D ci8 texture, lookup the index in a
+ * color table, and return 4 GLchans.
+ */
+static void FETCH(f_ci8)( const struct gl_texture_image *texImage,
+                          GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
+   const struct gl_color_table *palette;
+   GLuint index;
+   GET_CURRENT_CONTEXT(ctx);
+
+   if (ctx->Texture.SharedPalette) {
+      palette = &ctx->Texture.Palette;
+   }
+   else {
+      palette = &texImage->TexObject->Palette;
+   }
+   if (palette->Size == 0)
+      return; /* undefined results */
+
+   /* Mask the index against size of palette to avoid going out of bounds */
+   index = (*src) & (palette->Size - 1);
+
+   {
+      const GLfloat *table = palette->TableF;
+      switch (palette->_BaseFormat) {
+      case GL_ALPHA:
+         texel[RCOMP] =
+         texel[GCOMP] =
+         texel[BCOMP] = 0.0F;
+         texel[ACOMP] = table[index];
+         break;
+      case GL_LUMINANCE:
+         texel[RCOMP] =
+         texel[GCOMP] =
+         texel[BCOMP] = table[index];
+         texel[ACOMP] = 1.0F;
+         break;
+      case GL_INTENSITY:
+         texel[RCOMP] =
+         texel[GCOMP] =
+         texel[BCOMP] =
+         texel[ACOMP] = table[index];
+         break;
+      case GL_LUMINANCE_ALPHA:
+         texel[RCOMP] =
+         texel[GCOMP] =
+         texel[BCOMP] = table[index * 2 + 0];
+         texel[ACOMP] = table[index * 2 + 1];
+         break;
+      case GL_RGB:
+         texel[RCOMP] = table[index * 3 + 0];
+         texel[GCOMP] = table[index * 3 + 1];
+         texel[BCOMP] = table[index * 3 + 2];
+         texel[ACOMP] = 1.0F;
+         break;
+      case GL_RGBA:
+         texel[RCOMP] = table[index * 4 + 0];
+         texel[GCOMP] = table[index * 4 + 1];
+         texel[BCOMP] = table[index * 4 + 2];
+         texel[ACOMP] = table[index * 4 + 3];
+         break;
+      default:
+         _mesa_problem(ctx, "Bad palette format in fetch_texel_ci8");
+         return;
+      }
+   }
+}
+
+#if DIM == 3
+static void store_texel_ci8(struct gl_texture_image *texImage,
+                            GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *index = (const GLubyte *) texel;
+   GLubyte *dst = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
+   *dst = *index;
+}
+#endif
+
+
+/* Fetch texel from 1D, 2D or 3D srgb8 texture, return 4 GLfloats */
+/* Note: component order is same as for MESA_FORMAT_RGB888 */
+static void FETCH(srgb8)(const struct gl_texture_image *texImage,
+                         GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 3);
+   texel[RCOMP] = nonlinear_to_linear(src[2]);
+   texel[GCOMP] = nonlinear_to_linear(src[1]);
+   texel[BCOMP] = nonlinear_to_linear(src[0]);
+   texel[ACOMP] = 1.0F;
+}
+
+#if DIM == 3
+static void store_texel_srgb8(struct gl_texture_image *texImage,
+                              GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLubyte *dst = TEXEL_ADDR(GLubyte, texImage, i, j, k, 3);
+   dst[0] = rgba[BCOMP]; /* no conversion */
+   dst[1] = rgba[GCOMP];
+   dst[2] = rgba[RCOMP];
+}
+#endif
+
+/* Fetch texel from 1D, 2D or 3D srgba8 texture, return 4 GLfloats */
+static void FETCH(srgba8)(const struct gl_texture_image *texImage,
+                          GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   texel[RCOMP] = nonlinear_to_linear( (s >> 24) );
+   texel[GCOMP] = nonlinear_to_linear( (s >> 16) & 0xff );
+   texel[BCOMP] = nonlinear_to_linear( (s >>  8) & 0xff );
+   texel[ACOMP] = UBYTE_TO_FLOAT( (s      ) & 0xff ); /* linear! */
+}
+
+#if DIM == 3
+static void store_texel_srgba8(struct gl_texture_image *texImage,
+                               GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_8888(rgba[RCOMP], rgba[GCOMP], rgba[BCOMP], rgba[ACOMP]);
+}
+#endif
+
+/* Fetch texel from 1D, 2D or 3D sargb8 texture, return 4 GLfloats */
+static void FETCH(sargb8)(const struct gl_texture_image *texImage,
+                          GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   texel[RCOMP] = nonlinear_to_linear( (s >> 16) & 0xff );
+   texel[GCOMP] = nonlinear_to_linear( (s >>  8) & 0xff );
+   texel[BCOMP] = nonlinear_to_linear( (s      ) & 0xff );
+   texel[ACOMP] = UBYTE_TO_FLOAT( (s >> 24) ); /* linear! */
+}
+
+#if DIM == 3
+static void store_texel_sargb8(struct gl_texture_image *texImage,
+                               GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_8888(rgba[ACOMP], rgba[RCOMP], rgba[GCOMP], rgba[BCOMP]);
+}
+#endif
+
+/* Fetch texel from 1D, 2D or 3D sl8 texture, return 4 GLfloats */
+static void FETCH(sl8)(const struct gl_texture_image *texImage,
+                       GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
+   texel[RCOMP] = 
+   texel[GCOMP] = 
+   texel[BCOMP] = nonlinear_to_linear(src[0]);
+   texel[ACOMP] = 1.0F;
+}
+
+#if DIM == 3
+static void store_texel_sl8(struct gl_texture_image *texImage,
+                            GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLubyte *dst = TEXEL_ADDR(GLubyte, texImage, i, j, k, 1);
+   dst[0] = rgba[RCOMP];
+}
+#endif
+
+/* Fetch texel from 1D, 2D or 3D sla8 texture, return 4 GLfloats */
+static void FETCH(sla8)(const struct gl_texture_image *texImage,
+                       GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 2);
+   texel[RCOMP] =
+   texel[GCOMP] =
+   texel[BCOMP] = nonlinear_to_linear(src[0]);
+   texel[ACOMP] = UBYTE_TO_FLOAT(src[1]); /* linear */
+}
+
+#if DIM == 3
+static void store_texel_sla8(struct gl_texture_image *texImage,
+                            GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLubyte *dst = TEXEL_ADDR(GLubyte, texImage, i, j, k, 2);
+   dst[0] = rgba[RCOMP];
+   dst[1] = rgba[ACOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_RGBA_INT8 **************************************************/
+
+static void
+FETCH(rgba_int8)(const struct gl_texture_image *texImage,
+                 GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLbyte *src = TEXEL_ADDR(GLbyte, texImage, i, j, k, 4);
+   texel[RCOMP] = (GLfloat) src[0];
+   texel[GCOMP] = (GLfloat) src[1];
+   texel[BCOMP] = (GLfloat) src[2];
+   texel[ACOMP] = (GLfloat) src[3];
+}
+
+#if DIM == 3
+static void
+store_texel_rgba_int8(struct gl_texture_image *texImage,
+                      GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLbyte *rgba = (const GLbyte *) texel;
+   GLbyte *dst = TEXEL_ADDR(GLbyte, texImage, i, j, k, 4);
+   dst[0] = rgba[RCOMP];
+   dst[1] = rgba[GCOMP];
+   dst[2] = rgba[BCOMP];
+   dst[3] = rgba[ACOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_RGBA_INT16 **************************************************/
+
+static void
+FETCH(rgba_int16)(const struct gl_texture_image *texImage,
+                  GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLshort *src = TEXEL_ADDR(GLshort, texImage, i, j, k, 4);
+   texel[RCOMP] = (GLfloat) src[0];
+   texel[GCOMP] = (GLfloat) src[1];
+   texel[BCOMP] = (GLfloat) src[2];
+   texel[ACOMP] = (GLfloat) src[3];
+}
+
+#if DIM == 3
+static void
+store_texel_rgba_int16(struct gl_texture_image *texImage,
+                       GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLshort *rgba = (const GLshort *) texel;
+   GLshort *dst = TEXEL_ADDR(GLshort, texImage, i, j, k, 4);
+   dst[0] = rgba[RCOMP];
+   dst[1] = rgba[GCOMP];
+   dst[2] = rgba[BCOMP];
+   dst[3] = rgba[ACOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_RGBA_INT32 **************************************************/
+
+static void
+FETCH(rgba_int32)(const struct gl_texture_image *texImage,
+                  GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLint *src = TEXEL_ADDR(GLint, texImage, i, j, k, 4);
+   texel[RCOMP] = (GLfloat) src[0];
+   texel[GCOMP] = (GLfloat) src[1];
+   texel[BCOMP] = (GLfloat) src[2];
+   texel[ACOMP] = (GLfloat) src[3];
+}
+
+#if DIM == 3
+static void
+store_texel_rgba_int32(struct gl_texture_image *texImage,
+                       GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLint *rgba = (const GLint *) texel;
+   GLint *dst = TEXEL_ADDR(GLint, texImage, i, j, k, 4);
+   dst[0] = rgba[RCOMP];
+   dst[1] = rgba[GCOMP];
+   dst[2] = rgba[BCOMP];
+   dst[3] = rgba[ACOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_RGBA_UINT8 **************************************************/
+
+static void
+FETCH(rgba_uint8)(const struct gl_texture_image *texImage,
+                 GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLubyte *src = TEXEL_ADDR(GLubyte, texImage, i, j, k, 4);
+   texel[RCOMP] = (GLfloat) src[0];
+   texel[GCOMP] = (GLfloat) src[1];
+   texel[BCOMP] = (GLfloat) src[2];
+   texel[ACOMP] = (GLfloat) src[3];
+}
+
+#if DIM == 3
+static void
+store_texel_rgba_uint8(struct gl_texture_image *texImage,
+                      GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLubyte *dst = TEXEL_ADDR(GLubyte, texImage, i, j, k, 4);
+   dst[0] = rgba[RCOMP];
+   dst[1] = rgba[GCOMP];
+   dst[2] = rgba[BCOMP];
+   dst[3] = rgba[ACOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_RGBA_UINT16 **************************************************/
+
+static void
+FETCH(rgba_uint16)(const struct gl_texture_image *texImage,
+                  GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLushort *src = TEXEL_ADDR(GLushort, texImage, i, j, k, 4);
+   texel[RCOMP] = (GLfloat) src[0];
+   texel[GCOMP] = (GLfloat) src[1];
+   texel[BCOMP] = (GLfloat) src[2];
+   texel[ACOMP] = (GLfloat) src[3];
+}
+
+#if DIM == 3
+static void
+store_texel_rgba_uint16(struct gl_texture_image *texImage,
+                       GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLushort *rgba = (const GLushort *) texel;
+   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 4);
+   dst[0] = rgba[RCOMP];
+   dst[1] = rgba[GCOMP];
+   dst[2] = rgba[BCOMP];
+   dst[3] = rgba[ACOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_RGBA_UINT32 **************************************************/
+
+static void
+FETCH(rgba_uint32)(const struct gl_texture_image *texImage,
+                  GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLuint *src = TEXEL_ADDR(GLuint, texImage, i, j, k, 4);
+   texel[RCOMP] = (GLfloat) src[0];
+   texel[GCOMP] = (GLfloat) src[1];
+   texel[BCOMP] = (GLfloat) src[2];
+   texel[ACOMP] = (GLfloat) src[3];
+}
+
+#if DIM == 3
+static void
+store_texel_rgba_uint32(struct gl_texture_image *texImage,
+                       GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLuint *rgba = (const GLuint *) texel;
+   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 4);
+   dst[0] = rgba[RCOMP];
+   dst[1] = rgba[GCOMP];
+   dst[2] = rgba[BCOMP];
+   dst[3] = rgba[ACOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_DUDV8 ********************************************************/
+
+/* this format by definition produces 0,0,0,1 as rgba values,
+   however we'll return the dudv values as rg and fix up elsewhere */
+static void FETCH(dudv8)(const struct gl_texture_image *texImage,
+                         GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLbyte *src = TEXEL_ADDR(GLbyte, texImage, i, j, k, 2);
+   texel[RCOMP] = BYTE_TO_FLOAT(src[0]);
+   texel[GCOMP] = BYTE_TO_FLOAT(src[1]);
+   texel[BCOMP] = 0;
+   texel[ACOMP] = 0;
+}
+
+
+/* MESA_FORMAT_SIGNED_R8 ***********************************************/
+
+static void FETCH(signed_r8)( const struct gl_texture_image *texImage,
+                              GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLbyte s = *TEXEL_ADDR(GLbyte, texImage, i, j, k, 1);
+   texel[RCOMP] = BYTE_TO_FLOAT_TEX( s );
+   texel[GCOMP] = 0.0F;
+   texel[BCOMP] = 0.0F;
+   texel[ACOMP] = 1.0F;
+}
+
+#if DIM == 3
+static void store_texel_signed_r8(struct gl_texture_image *texImage,
+                                  GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLbyte *rgba = (const GLbyte *) texel;
+   GLbyte *dst = TEXEL_ADDR(GLbyte, texImage, i, j, k, 1);
+   *dst = rgba[RCOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_SIGNED_A8 ***********************************************/
+
+static void FETCH(signed_a8)( const struct gl_texture_image *texImage,
+                              GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLbyte s = *TEXEL_ADDR(GLbyte, texImage, i, j, k, 1);
+   texel[RCOMP] = 0.0F;
+   texel[GCOMP] = 0.0F;
+   texel[BCOMP] = 0.0F;
+   texel[ACOMP] = BYTE_TO_FLOAT_TEX( s );
+}
+
+#if DIM == 3
+static void store_texel_signed_a8(struct gl_texture_image *texImage,
+                                  GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLbyte *rgba = (const GLbyte *) texel;
+   GLbyte *dst = TEXEL_ADDR(GLbyte, texImage, i, j, k, 1);
+   *dst = rgba[ACOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_SIGNED_L8 ***********************************************/
+
+static void FETCH(signed_l8)( const struct gl_texture_image *texImage,
+                              GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLbyte s = *TEXEL_ADDR(GLbyte, texImage, i, j, k, 1);
+   texel[RCOMP] =
+   texel[GCOMP] =
+   texel[BCOMP] = BYTE_TO_FLOAT_TEX( s );
+   texel[ACOMP] = 1.0F;
+}
+
+#if DIM == 3
+static void store_texel_signed_l8(struct gl_texture_image *texImage,
+                                  GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLbyte *rgba = (const GLbyte *) texel;
+   GLbyte *dst = TEXEL_ADDR(GLbyte, texImage, i, j, k, 1);
+   *dst = rgba[RCOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_SIGNED_I8 ***********************************************/
+
+static void FETCH(signed_i8)( const struct gl_texture_image *texImage,
+                              GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLbyte s = *TEXEL_ADDR(GLbyte, texImage, i, j, k, 1);
+   texel[RCOMP] =
+   texel[GCOMP] =
+   texel[BCOMP] =
+   texel[ACOMP] = BYTE_TO_FLOAT_TEX( s );
+}
+
+#if DIM == 3
+static void store_texel_signed_i8(struct gl_texture_image *texImage,
+                                  GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLbyte *rgba = (const GLbyte *) texel;
+   GLbyte *dst = TEXEL_ADDR(GLbyte, texImage, i, j, k, 1);
+   *dst = rgba[RCOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_SIGNED_RG88_REV ***********************************************/
+
+static void FETCH(signed_rg88_rev)( const struct gl_texture_image *texImage,
+                                    GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLushort s = *TEXEL_ADDR(GLshort, texImage, i, j, k, 1);
+   texel[RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s & 0xff) );
+   texel[GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 8) );
+   texel[BCOMP] = 0.0F;
+   texel[ACOMP] = 1.0F;
+}
+
+#if DIM == 3
+static void store_texel_signed_rg88_rev(struct gl_texture_image *texImage,
+                                        GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLbyte *rg = (const GLbyte *) texel;
+   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   dst[0] = PACK_COLOR_88(rg[GCOMP], rg[RCOMP]);
+}
+#endif
+
+
+/* MESA_FORMAT_SIGNED_AL88 ***********************************************/
+
+static void FETCH(signed_al88)( const struct gl_texture_image *texImage,
+                                GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLushort s = *TEXEL_ADDR(GLshort, texImage, i, j, k, 1);
+   texel[RCOMP] =
+   texel[GCOMP] =
+   texel[BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s & 0xff) );
+   texel[ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 8) );
+}
+
+#if DIM == 3
+static void store_texel_signed_al88(struct gl_texture_image *texImage,
+                                    GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLbyte *rg = (const GLbyte *) texel;
+   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 1);
+   dst[0] = PACK_COLOR_88(rg[ACOMP], rg[RCOMP]);
+}
+#endif
+
+
+/* MESA_FORMAT_SIGNED_RGBX8888 ***********************************************/
+
+static void FETCH(signed_rgbx8888)( const struct gl_texture_image *texImage,
+			            GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   texel[RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 24) );
+   texel[GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 16) );
+   texel[BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >>  8) );
+   texel[ACOMP] = 1.0f;
+}
+
+#if DIM == 3
+static void store_texel_signed_rgbx8888(struct gl_texture_image *texImage,
+                                        GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLbyte *rgba = (const GLbyte *) texel;
+   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_8888(rgba[RCOMP], rgba[GCOMP], rgba[BCOMP], 255);
+}
+#endif
+
+
+/* MESA_FORMAT_SIGNED_RGBA8888 ***********************************************/
+
+static void FETCH(signed_rgba8888)( const struct gl_texture_image *texImage,
+			            GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   texel[RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 24) );
+   texel[GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 16) );
+   texel[BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >>  8) );
+   texel[ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s      ) );
+}
+
+#if DIM == 3
+static void store_texel_signed_rgba8888(struct gl_texture_image *texImage,
+                                        GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLbyte *rgba = (const GLbyte *) texel;
+   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_8888(rgba[RCOMP], rgba[GCOMP], rgba[BCOMP], rgba[ACOMP]);
+}
+#endif
+
+static void FETCH(signed_rgba8888_rev)( const struct gl_texture_image *texImage,
+                                        GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLuint s = *TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   texel[RCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s      ) );
+   texel[GCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >>  8) );
+   texel[BCOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 16) );
+   texel[ACOMP] = BYTE_TO_FLOAT_TEX( (GLbyte) (s >> 24) );
+}
+
+#if DIM == 3
+static void store_texel_signed_rgba8888_rev(struct gl_texture_image *texImage,
+                                            GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLubyte *rgba = (const GLubyte *) texel;
+   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   *dst = PACK_COLOR_8888_REV(rgba[RCOMP], rgba[GCOMP], rgba[BCOMP], rgba[ACOMP]);
+}
+#endif
+
+
+
+/* MESA_FORMAT_SIGNED_R16 ***********************************************/
+
+static void
+FETCH(signed_r16)(const struct gl_texture_image *texImage,
+                  GLint i, GLint j, GLint k, GLfloat *texel)
+{
+   const GLshort s = *TEXEL_ADDR(GLshort, texImage, i, j, k, 1);
+   texel[RCOMP] = SHORT_TO_FLOAT_TEX( s );
+   texel[GCOMP] = 0.0F;
+   texel[BCOMP] = 0.0F;
+   texel[ACOMP] = 1.0F;
+}
+
+#if DIM == 3
+static void
+store_texel_signed_r16(struct gl_texture_image *texImage,
+                       GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLshort *rgba = (const GLshort *) texel;
+   GLshort *dst = TEXEL_ADDR(GLshort, texImage, i, j, k, 1);
+   *dst = rgba[0];
+}
+#endif
+
+
+/* MESA_FORMAT_SIGNED_A16 ***********************************************/
+
+static void
+FETCH(signed_a16)(const struct gl_texture_image *texImage,
+                  GLint i, GLint j, GLint k, GLfloat *texel)
+{
+   const GLshort s = *TEXEL_ADDR(GLshort, texImage, i, j, k, 1);
+   texel[RCOMP] = 0.0F;
+   texel[GCOMP] = 0.0F;
+   texel[BCOMP] = 0.0F;
+   texel[ACOMP] = SHORT_TO_FLOAT_TEX( s );
+}
+
+#if DIM == 3
+static void
+store_texel_signed_a16(struct gl_texture_image *texImage,
+                       GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLshort *rgba = (const GLshort *) texel;
+   GLshort *dst = TEXEL_ADDR(GLshort, texImage, i, j, k, 1);
+   *dst = rgba[ACOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_SIGNED_L16 ***********************************************/
+
+static void
+FETCH(signed_l16)(const struct gl_texture_image *texImage,
+                  GLint i, GLint j, GLint k, GLfloat *texel)
+{
+   const GLshort s = *TEXEL_ADDR(GLshort, texImage, i, j, k, 1);
+   texel[RCOMP] =
+   texel[GCOMP] =
+   texel[BCOMP] = SHORT_TO_FLOAT_TEX( s );
+   texel[ACOMP] = 1.0F;
+}
+
+#if DIM == 3
+static void
+store_texel_signed_l16(struct gl_texture_image *texImage,
+                       GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLshort *rgba = (const GLshort *) texel;
+   GLshort *dst = TEXEL_ADDR(GLshort, texImage, i, j, k, 1);
+   *dst = rgba[RCOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_SIGNED_I16 ***********************************************/
+
+static void
+FETCH(signed_i16)(const struct gl_texture_image *texImage,
+                  GLint i, GLint j, GLint k, GLfloat *texel)
+{
+   const GLshort s = *TEXEL_ADDR(GLshort, texImage, i, j, k, 1);
+   texel[RCOMP] =
+   texel[GCOMP] =
+   texel[BCOMP] =
+   texel[ACOMP] = SHORT_TO_FLOAT_TEX( s );
+}
+
+#if DIM == 3
+static void
+store_texel_signed_i16(struct gl_texture_image *texImage,
+                       GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLshort *rgba = (const GLshort *) texel;
+   GLshort *dst = TEXEL_ADDR(GLshort, texImage, i, j, k, 1);
+   *dst = rgba[RCOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_SIGNED_RG1616 ***********************************************/
+
+static void
+FETCH(signed_rg1616)(const struct gl_texture_image *texImage,
+                    GLint i, GLint j, GLint k, GLfloat *texel)
+{
+   const GLshort *s = TEXEL_ADDR(GLshort, texImage, i, j, k, 2);
+   texel[RCOMP] = SHORT_TO_FLOAT_TEX( s[0] );
+   texel[GCOMP] = SHORT_TO_FLOAT_TEX( s[1] );
+   texel[BCOMP] = 0.0F;
+   texel[ACOMP] = 1.0F;
+}
+
+#if DIM == 3
+static void
+store_texel_signed_rg1616(struct gl_texture_image *texImage,
+                         GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLshort *rgba = (const GLshort *) texel;
+   GLshort *dst = TEXEL_ADDR(GLshort, texImage, i, j, k, 2);
+   dst[0] = rgba[RCOMP];
+   dst[1] = rgba[GCOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_SIGNED_AL1616 ***********************************************/
+
+static void
+FETCH(signed_al1616)(const struct gl_texture_image *texImage,
+                    GLint i, GLint j, GLint k, GLfloat *texel)
+{
+   const GLshort *s = TEXEL_ADDR(GLshort, texImage, i, j, k, 2);
+   texel[RCOMP] =
+   texel[GCOMP] =
+   texel[BCOMP] = SHORT_TO_FLOAT_TEX( s[0] );
+   texel[ACOMP] = SHORT_TO_FLOAT_TEX( s[1] );
+}
+
+#if DIM == 3
+static void
+store_texel_signed_al1616(struct gl_texture_image *texImage,
+                         GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLshort *rgba = (const GLshort *) texel;
+   GLshort *dst = TEXEL_ADDR(GLshort, texImage, i, j, k, 2);
+   dst[0] = rgba[RCOMP];
+   dst[1] = rgba[ACOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_SIGNED_RGB_16 ***********************************************/
+
+static void 
+FETCH(signed_rgb_16)(const struct gl_texture_image *texImage,
+                     GLint i, GLint j, GLint k, GLfloat *texel)
+{
+   const GLshort *s = TEXEL_ADDR(GLshort, texImage, i, j, k, 3);
+   texel[RCOMP] = SHORT_TO_FLOAT_TEX( s[0] );
+   texel[GCOMP] = SHORT_TO_FLOAT_TEX( s[1] );
+   texel[BCOMP] = SHORT_TO_FLOAT_TEX( s[2] );
+   texel[ACOMP] = 1.0F;
+}
+
+#if DIM == 3
+static void
+store_texel_signed_rgb_16(struct gl_texture_image *texImage,
+                          GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLshort *rgba = (const GLshort *) texel;
+   GLshort *dst = TEXEL_ADDR(GLshort, texImage, i, j, k, 3);
+   dst[0] = rgba[RCOMP];
+   dst[1] = rgba[GCOMP];
+   dst[2] = rgba[BCOMP];
+}
+#endif
+
+
+/* MESA_FORMAT_SIGNED_RGBA_16 ***********************************************/
+
+static void
+FETCH(signed_rgba_16)(const struct gl_texture_image *texImage,
+                      GLint i, GLint j, GLint k, GLfloat *texel)
+{
+   const GLshort *s = TEXEL_ADDR(GLshort, texImage, i, j, k, 4);
+   texel[RCOMP] = SHORT_TO_FLOAT_TEX( s[0] );
+   texel[GCOMP] = SHORT_TO_FLOAT_TEX( s[1] );
+   texel[BCOMP] = SHORT_TO_FLOAT_TEX( s[2] );
+   texel[ACOMP] = SHORT_TO_FLOAT_TEX( s[3] );
+}
+
+#if DIM == 3
+static void
+store_texel_signed_rgba_16(struct gl_texture_image *texImage,
+                           GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLshort *rgba = (const GLshort *) texel;
+   GLshort *dst = TEXEL_ADDR(GLshort, texImage, i, j, k, 4);
+   dst[0] = rgba[RCOMP];
+   dst[1] = rgba[GCOMP];
+   dst[2] = rgba[BCOMP];
+   dst[3] = rgba[ACOMP];
+}
+#endif
+
+
+
+/* MESA_FORMAT_RGBA_16 ***********************************************/
+
+static void
+FETCH(rgba_16)(const struct gl_texture_image *texImage,
+               GLint i, GLint j, GLint k, GLfloat *texel)
+{
+   const GLushort *s = TEXEL_ADDR(GLushort, texImage, i, j, k, 4);
+   texel[RCOMP] = USHORT_TO_FLOAT( s[0] );
+   texel[GCOMP] = USHORT_TO_FLOAT( s[1] );
+   texel[BCOMP] = USHORT_TO_FLOAT( s[2] );
+   texel[ACOMP] = USHORT_TO_FLOAT( s[3] );
+}
+
+#if DIM == 3
+static void
+store_texel_rgba_16(struct gl_texture_image *texImage,
+                    GLint i, GLint j, GLint k, const void *texel)
+{
+   const GLushort *rgba = (const GLushort *) texel;
+   GLushort *dst = TEXEL_ADDR(GLushort, texImage, i, j, k, 4);
+   dst[0] = rgba[RCOMP];
+   dst[1] = rgba[GCOMP];
+   dst[2] = rgba[BCOMP];
+   dst[3] = rgba[ACOMP];
+}
+#endif
+
+
+
+/* MESA_FORMAT_YCBCR *********************************************************/
+
+/* Fetch texel from 1D, 2D or 3D ycbcr texture, return 4 GLfloats.
+ * We convert YCbCr to RGB here.
+ */
+static void FETCH(f_ycbcr)( const struct gl_texture_image *texImage,
+                            GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLushort *src0 = TEXEL_ADDR(GLushort, texImage, (i & ~1), j, k, 1); /* even */
+   const GLushort *src1 = src0 + 1;                               /* odd */
+   const GLubyte y0 = (*src0 >> 8) & 0xff;  /* luminance */
+   const GLubyte cb = *src0 & 0xff;         /* chroma U */
+   const GLubyte y1 = (*src1 >> 8) & 0xff;  /* luminance */
+   const GLubyte cr = *src1 & 0xff;         /* chroma V */
+   const GLubyte y = (i & 1) ? y1 : y0;     /* choose even/odd luminance */
+   GLfloat r = 1.164F * (y - 16) + 1.596F * (cr - 128);
+   GLfloat g = 1.164F * (y - 16) - 0.813F * (cr - 128) - 0.391F * (cb - 128);
+   GLfloat b = 1.164F * (y - 16) + 2.018F * (cb - 128);
+   r *= (1.0F / 255.0F);
+   g *= (1.0F / 255.0F);
+   b *= (1.0F / 255.0F);
+   texel[RCOMP] = CLAMP(r, 0.0F, 1.0F);
+   texel[GCOMP] = CLAMP(g, 0.0F, 1.0F);
+   texel[BCOMP] = CLAMP(b, 0.0F, 1.0F);
+   texel[ACOMP] = 1.0F;
+}
+
+#if DIM == 3
+static void store_texel_ycbcr(struct gl_texture_image *texImage,
+                              GLint i, GLint j, GLint k, const void *texel)
+{
+   (void) texImage;
+   (void) i;
+   (void) j;
+   (void) k;
+   (void) texel;
+   /* XXX to do */
+}
+#endif
+
+
+/* MESA_FORMAT_YCBCR_REV *****************************************************/
+
+/* Fetch texel from 1D, 2D or 3D ycbcr_rev texture, return 4 GLfloats.
+ * We convert YCbCr to RGB here.
+ */
+static void FETCH(f_ycbcr_rev)( const struct gl_texture_image *texImage,
+                                GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   const GLushort *src0 = TEXEL_ADDR(GLushort, texImage, (i & ~1), j, k, 1); /* even */
+   const GLushort *src1 = src0 + 1;                               /* odd */
+   const GLubyte y0 = *src0 & 0xff;         /* luminance */
+   const GLubyte cr = (*src0 >> 8) & 0xff;  /* chroma V */
+   const GLubyte y1 = *src1 & 0xff;         /* luminance */
+   const GLubyte cb = (*src1 >> 8) & 0xff;  /* chroma U */
+   const GLubyte y = (i & 1) ? y1 : y0;     /* choose even/odd luminance */
+   GLfloat r = 1.164F * (y - 16) + 1.596F * (cr - 128);
+   GLfloat g = 1.164F * (y - 16) - 0.813F * (cr - 128) - 0.391F * (cb - 128);
+   GLfloat b = 1.164F * (y - 16) + 2.018F * (cb - 128);
+   r *= (1.0F / 255.0F);
+   g *= (1.0F / 255.0F);
+   b *= (1.0F / 255.0F);
+   texel[RCOMP] = CLAMP(r, 0.0F, 1.0F);
+   texel[GCOMP] = CLAMP(g, 0.0F, 1.0F);
+   texel[BCOMP] = CLAMP(b, 0.0F, 1.0F);
+   texel[ACOMP] = 1.0F;
+}
+
+#if DIM == 3
+static void store_texel_ycbcr_rev(struct gl_texture_image *texImage,
+                                  GLint i, GLint j, GLint k, const void *texel)
+{
+   (void) texImage;
+   (void) i;
+   (void) j;
+   (void) k;
+   (void) texel;
+   /* XXX to do */
+}
+#endif
+
+
+/* MESA_TEXFORMAT_Z24_S8 ***************************************************/
+
+static void FETCH(f_z24_s8)( const struct gl_texture_image *texImage,
+                             GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   /* only return Z, not stencil data */
+   const GLuint *src = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   const GLfloat scale = 1.0F / (GLfloat) 0xffffff;
+   texel[0] = ((*src) >> 8) * scale;
+   ASSERT(texImage->TexFormat == MESA_FORMAT_Z24_S8);
+   ASSERT(texel[0] >= 0.0F);
+   ASSERT(texel[0] <= 1.0F);
+}
+
+#if DIM == 3
+static void store_texel_z24_s8(struct gl_texture_image *texImage,
+                               GLint i, GLint j, GLint k, const void *texel)
+{
+   /* only store Z, not stencil */
+   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   GLfloat depth = *((GLfloat *) texel);
+   GLuint zi = ((GLuint) (depth * 0xffffff)) << 8;
+   *dst = zi | (*dst & 0xff);
+}
+#endif
+
+
+/* MESA_TEXFORMAT_S8_Z24 ***************************************************/
+
+static void FETCH(f_s8_z24)( const struct gl_texture_image *texImage,
+                             GLint i, GLint j, GLint k, GLfloat *texel )
+{
+   /* only return Z, not stencil data */
+   const GLuint *src = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   const GLfloat scale = 1.0F / (GLfloat) 0xffffff;
+   texel[0] = ((*src) & 0x00ffffff) * scale;
+   ASSERT(texImage->TexFormat == MESA_FORMAT_S8_Z24);
+   ASSERT(texel[0] >= 0.0F);
+   ASSERT(texel[0] <= 1.0F);
+}
+
+#if DIM == 3
+static void store_texel_s8_z24(struct gl_texture_image *texImage,
+                               GLint i, GLint j, GLint k, const void *texel)
+{
+   /* only store Z, not stencil */
+   GLuint *dst = TEXEL_ADDR(GLuint, texImage, i, j, k, 1);
+   GLfloat depth = *((GLfloat *) texel);
+   GLuint zi = (GLuint) (depth * 0xffffff);
+   *dst = zi | (*dst & 0xff000000);
+}
+#endif
+
+
+#undef TEXEL_ADDR
+#undef DIM
+#undef FETCH
diff --git a/mesalib/src/mesa/main/texformat.c b/mesalib/src/mesa/main/texformat.c
index 5eabf2aa5..8b7b4ff47 100644
--- a/mesalib/src/mesa/main/texformat.c
+++ b/mesalib/src/mesa/main/texformat.c
@@ -389,19 +389,7 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
       }
    }
 
-   if (ctx->Extensions.MESA_texture_signed_rgba) {
-      switch (internalFormat) {
-         case GL_RGBA_SNORM:
-         case GL_RGBA8_SNORM:
-	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
-	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
-	    break;
-         default:
-            ; /* fallthrough */
-      }
-   }
-
-   if (ctx->VersionMajor * 10 + ctx->VersionMinor >= 31) {
+   if (ctx->Extensions.EXT_texture_snorm) {
       switch (internalFormat) {
          case GL_RED_SNORM:
          case GL_R8_SNORM:
@@ -409,7 +397,7 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
 	    break;
          case GL_RG_SNORM:
          case GL_RG8_SNORM:
-	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG88);
+	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG88_REV);
 	    break;
          case GL_RGB_SNORM:
          case GL_RGB8_SNORM:
@@ -418,12 +406,29 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
          case GL_RGBA_SNORM:
          case GL_RGBA8_SNORM:
 	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888);
+	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA8888_REV);
 	    break;
+         case GL_ALPHA_SNORM:
+         case GL_ALPHA8_SNORM:
+            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A8);
+            break;
+         case GL_LUMINANCE_SNORM:
+         case GL_LUMINANCE8_SNORM:
+            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L8);
+            break;
+         case GL_LUMINANCE_ALPHA_SNORM:
+         case GL_LUMINANCE8_ALPHA8_SNORM:
+            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL88);
+            break;
+         case GL_INTENSITY_SNORM:
+         case GL_INTENSITY8_SNORM:
+            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I8);
+            break;
          case GL_R16_SNORM:
-	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R_16);
+	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_R16);
 	    break;
          case GL_RG16_SNORM:
-	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RG_16);
+	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_GR1616);
 	    break;
          case GL_RGB16_SNORM:
 	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGB_16);
@@ -431,6 +436,18 @@ _mesa_choose_tex_format( struct gl_context *ctx, GLint internalFormat,
          case GL_RGBA16_SNORM:
 	    RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_RGBA_16);
 	    break;
+         case GL_ALPHA16_SNORM:
+            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_A16);
+            break;
+         case GL_LUMINANCE16_SNORM:
+            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_L16);
+            break;
+         case GL_LUMINANCE16_ALPHA16_SNORM:
+            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_AL1616);
+            break;
+         case GL_INTENSITY16_SNORM:
+            RETURN_IF_SUPPORTED(MESA_FORMAT_SIGNED_I16);
+            break;
          default:
             ; /* fall-through */
       }
diff --git a/mesalib/src/mesa/main/teximage.c b/mesalib/src/mesa/main/teximage.c
index c6b8c05b1..86927d3b6 100644
--- a/mesalib/src/mesa/main/teximage.c
+++ b/mesalib/src/mesa/main/teximage.c
@@ -311,11 +311,40 @@ _mesa_base_tex_format( struct gl_context *ctx, GLint internalFormat )
       }
    }
 
-   if (ctx->Extensions.MESA_texture_signed_rgba) {
+   if (ctx->Extensions.EXT_texture_snorm) {
       switch (internalFormat) {
+         case GL_RED_SNORM:
+         case GL_R8_SNORM:
+         case GL_R16_SNORM:
+            return GL_RED;
+         case GL_RG_SNORM:
+         case GL_RG8_SNORM:
+         case GL_RG16_SNORM:
+            return GL_RG;
+         case GL_RGB_SNORM:
+         case GL_RGB8_SNORM:
+         case GL_RGB16_SNORM:
+            return GL_RGB;
          case GL_RGBA_SNORM:
          case GL_RGBA8_SNORM:
+         case GL_RGBA16_SNORM:
             return GL_RGBA;
+         case GL_ALPHA_SNORM:
+         case GL_ALPHA8_SNORM:
+         case GL_ALPHA16_SNORM:
+            return GL_ALPHA;
+         case GL_LUMINANCE_SNORM:
+         case GL_LUMINANCE8_SNORM:
+         case GL_LUMINANCE16_SNORM:
+            return GL_LUMINANCE;
+         case GL_LUMINANCE_ALPHA_SNORM:
+         case GL_LUMINANCE8_ALPHA8_SNORM:
+         case GL_LUMINANCE16_ALPHA16_SNORM:
+            return GL_LUMINANCE_ALPHA;
+         case GL_INTENSITY_SNORM:
+         case GL_INTENSITY8_SNORM:
+         case GL_INTENSITY16_SNORM:
+            return GL_INTENSITY;
          default:
             ; /* fallthrough */
       }
diff --git a/mesalib/src/mesa/main/texparam.c b/mesalib/src/mesa/main/texparam.c
index 6e14face4..34b6addb9 100644
--- a/mesalib/src/mesa/main/texparam.c
+++ b/mesalib/src/mesa/main/texparam.c
@@ -38,6 +38,7 @@
 #include "main/macros.h"
 #include "main/mfeatures.h"
 #include "main/mtypes.h"
+#include "main/state.h"
 #include "main/texcompress.h"
 #include "main/texparam.h"
 #include "main/teximage.h"
@@ -533,10 +534,18 @@ set_tex_parameterf(struct gl_context *ctx,
 
    case GL_TEXTURE_BORDER_COLOR:
       flush(ctx);
-      texObj->BorderColor.f[RCOMP] = params[0];
-      texObj->BorderColor.f[GCOMP] = params[1];
-      texObj->BorderColor.f[BCOMP] = params[2];
-      texObj->BorderColor.f[ACOMP] = params[3];
+      /* ARB_texture_float disables clamping */
+      if (ctx->Extensions.ARB_texture_float) {
+         texObj->BorderColor.f[RCOMP] = params[0];
+         texObj->BorderColor.f[GCOMP] = params[1];
+         texObj->BorderColor.f[BCOMP] = params[2];
+         texObj->BorderColor.f[ACOMP] = params[3];
+      } else {
+         texObj->BorderColor.f[RCOMP] = CLAMP(params[0], 0.0F, 1.0F);
+         texObj->BorderColor.f[GCOMP] = CLAMP(params[1], 0.0F, 1.0F);
+         texObj->BorderColor.f[BCOMP] = CLAMP(params[2], 0.0F, 1.0F);
+         texObj->BorderColor.f[ACOMP] = CLAMP(params[3], 0.0F, 1.0F);
+      }
       return GL_TRUE;
 
    default:
@@ -1107,10 +1116,22 @@ _mesa_GetTexParameterfv( GLenum target, GLenum pname, GLfloat *params )
          *params = ENUM_TO_FLOAT(obj->WrapR);
          break;
       case GL_TEXTURE_BORDER_COLOR:
-         params[0] = CLAMP(obj->BorderColor.f[0], 0.0F, 1.0F);
-         params[1] = CLAMP(obj->BorderColor.f[1], 0.0F, 1.0F);
-         params[2] = CLAMP(obj->BorderColor.f[2], 0.0F, 1.0F);
-         params[3] = CLAMP(obj->BorderColor.f[3], 0.0F, 1.0F);
+         if(ctx->NewState & (_NEW_BUFFERS | _NEW_FRAG_CLAMP))
+            _mesa_update_state_locked(ctx);
+         if(ctx->Color._ClampFragmentColor)
+         {
+            params[0] = CLAMP(obj->BorderColor.f[0], 0.0F, 1.0F);
+            params[1] = CLAMP(obj->BorderColor.f[1], 0.0F, 1.0F);
+            params[2] = CLAMP(obj->BorderColor.f[2], 0.0F, 1.0F);
+            params[3] = CLAMP(obj->BorderColor.f[3], 0.0F, 1.0F);
+         }
+         else
+         {
+            params[0] = obj->BorderColor.f[0];
+            params[1] = obj->BorderColor.f[1];
+            params[2] = obj->BorderColor.f[2];
+            params[3] = obj->BorderColor.f[3];
+         }
          break;
       case GL_TEXTURE_RESIDENT:
          {
diff --git a/mesalib/src/mesa/main/texstore.c b/mesalib/src/mesa/main/texstore.c
index f909abfa2..eb37490e1 100644
--- a/mesalib/src/mesa/main/texstore.c
+++ b/mesalib/src/mesa/main/texstore.c
@@ -1,4709 +1,4856 @@
-/*
- * Mesa 3-D graphics library
- * Version:  7.5
- *
- * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
- * Copyright (c) 2008-2009  VMware, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/*
- * Authors:
- *   Brian Paul
- */
-
-/**
- * The GL texture image functions in teximage.c basically just do
- * error checking and data structure allocation.  They in turn call
- * device driver functions which actually copy/convert/store the user's
- * texture image data.
- *
- * However, most device drivers will be able to use the fallback functions
- * in this file.  That is, most drivers will have the following bit of
- * code:
- *   ctx->Driver.TexImage1D = _mesa_store_teximage1d;
- *   ctx->Driver.TexImage2D = _mesa_store_teximage2d;
- *   ctx->Driver.TexImage3D = _mesa_store_teximage3d;
- *   etc...
- *
- * Texture image processing is actually kind of complicated.  We have to do:
- *    Format/type conversions
- *    pixel unpacking
- *    pixel transfer (scale, bais, lookup, etc)
- *
- * These functions can handle most everything, including processing full
- * images and sub-images.
- */
-
-
-#include "glheader.h"
-#include "bufferobj.h"
-#include "colormac.h"
-#include "image.h"
-#include "macros.h"
-#include "mipmap.h"
-#include "mfeatures.h"
-#include "mtypes.h"
-#include "pack.h"
-#include "pbo.h"
-#include "imports.h"
-#include "pack.h"
-#include "texcompress.h"
-#include "texcompress_fxt1.h"
-#include "texcompress_rgtc.h"
-#include "texcompress_s3tc.h"
-#include "teximage.h"
-#include "texstore.h"
-#include "enums.h"
-
-
-enum {
-   ZERO = 4, 
-   ONE = 5
-};
-
-
-/**
- * Texture image storage function.
- */
-typedef GLboolean (*StoreTexImageFunc)(TEXSTORE_PARAMS);
-
-
-/**
- * Return GL_TRUE if the given image format is one that be converted
- * to another format by swizzling.
- */
-static GLboolean
-can_swizzle(GLenum logicalBaseFormat)
-{
-   switch (logicalBaseFormat) {
-   case GL_RGBA:
-   case GL_RGB:
-   case GL_LUMINANCE_ALPHA:
-   case GL_INTENSITY:
-   case GL_ALPHA:
-   case GL_LUMINANCE:
-   case GL_RED:
-   case GL_GREEN:
-   case GL_BLUE:
-   case GL_BGR:
-   case GL_BGRA:
-   case GL_ABGR_EXT:
-   case GL_RG:
-      return GL_TRUE;
-   default:
-      return GL_FALSE;
-   }
-}
-
-
-
-enum {
-   IDX_LUMINANCE = 0,
-   IDX_ALPHA,
-   IDX_INTENSITY,
-   IDX_LUMINANCE_ALPHA,
-   IDX_RGB,
-   IDX_RGBA,
-   IDX_RED,
-   IDX_GREEN,
-   IDX_BLUE,
-   IDX_BGR,
-   IDX_BGRA,
-   IDX_ABGR,
-   IDX_RG,
-   MAX_IDX
-};
-
-#define MAP1(x)       MAP4(x, ZERO, ZERO, ZERO)
-#define MAP2(x,y)     MAP4(x, y, ZERO, ZERO)
-#define MAP3(x,y,z)   MAP4(x, y, z, ZERO)
-#define MAP4(x,y,z,w) { x, y, z, w, ZERO, ONE }
-
-
-static const struct {
-   GLubyte format_idx;
-   GLubyte to_rgba[6];
-   GLubyte from_rgba[6];
-} mappings[MAX_IDX] = 
-{
-   {
-      IDX_LUMINANCE,
-      MAP4(0,0,0,ONE),
-      MAP1(0)
-   },
-
-   {
-      IDX_ALPHA,
-      MAP4(ZERO, ZERO, ZERO, 0),
-      MAP1(3)
-   },
-
-   {
-      IDX_INTENSITY,
-      MAP4(0, 0, 0, 0),
-      MAP1(0),
-   },
-
-   {
-      IDX_LUMINANCE_ALPHA,
-      MAP4(0,0,0,1),
-      MAP2(0,3)
-   },
-
-   {
-      IDX_RGB,
-      MAP4(0,1,2,ONE),
-      MAP3(0,1,2)
-   },
-
-   {
-      IDX_RGBA,
-      MAP4(0,1,2,3),
-      MAP4(0,1,2,3),
-   },
-
-   {
-      IDX_RED,
-      MAP4(0, ZERO, ZERO, ONE),
-      MAP1(0),
-   },
-
-   {
-      IDX_GREEN,
-      MAP4(ZERO, 0, ZERO, ONE),
-      MAP1(1),
-   },
-
-   {
-      IDX_BLUE,
-      MAP4(ZERO, ZERO, 0, ONE),
-      MAP1(2),
-   },
-
-   {
-      IDX_BGR,
-      MAP4(2,1,0,ONE),
-      MAP3(2,1,0)
-   },
-
-   {
-      IDX_BGRA,
-      MAP4(2,1,0,3),
-      MAP4(2,1,0,3)
-   },
-
-   {
-      IDX_ABGR,
-      MAP4(3,2,1,0),
-      MAP4(3,2,1,0)
-   },
-
-   {
-      IDX_RG,
-      MAP4(0, 1, ZERO, ONE),
-      MAP2(0, 1)
-   },
-};
-
-
-
-/**
- * Convert a GL image format enum to an IDX_* value (see above).
- */
-static int
-get_map_idx(GLenum value)
-{
-   switch (value) {
-   case GL_LUMINANCE: return IDX_LUMINANCE;
-   case GL_ALPHA: return IDX_ALPHA;
-   case GL_INTENSITY: return IDX_INTENSITY;
-   case GL_LUMINANCE_ALPHA: return IDX_LUMINANCE_ALPHA;
-   case GL_RGB: return IDX_RGB;
-   case GL_RGBA: return IDX_RGBA;
-   case GL_RED: return IDX_RED;
-   case GL_GREEN: return IDX_GREEN;
-   case GL_BLUE: return IDX_BLUE;
-   case GL_BGR: return IDX_BGR;
-   case GL_BGRA: return IDX_BGRA;
-   case GL_ABGR_EXT: return IDX_ABGR;
-   case GL_RG: return IDX_RG;
-   default:
-      _mesa_problem(NULL, "Unexpected inFormat");
-      return 0;
-   }
-}   
-
-
-/**
- * When promoting texture formats (see below) we need to compute the
- * mapping of dest components back to source components.
- * This function does that.
- * \param inFormat  the incoming format of the texture
- * \param outFormat  the final texture format
- * \return map[6]  a full 6-component map
- */
-static void
-compute_component_mapping(GLenum inFormat, GLenum outFormat, 
-			  GLubyte *map)
-{
-   const int inFmt = get_map_idx(inFormat);
-   const int outFmt = get_map_idx(outFormat);
-   const GLubyte *in2rgba = mappings[inFmt].to_rgba;
-   const GLubyte *rgba2out = mappings[outFmt].from_rgba;
-   int i;
-   
-   for (i = 0; i < 4; i++)
-      map[i] = in2rgba[rgba2out[i]];
-
-   map[ZERO] = ZERO;
-   map[ONE] = ONE;   
-
-#if 0
-   printf("from %x/%s to %x/%s map %d %d %d %d %d %d\n",
-	  inFormat, _mesa_lookup_enum_by_nr(inFormat),
-	  outFormat, _mesa_lookup_enum_by_nr(outFormat),
-	  map[0], 
-	  map[1], 
-	  map[2], 
-	  map[3], 
-	  map[4], 
-	  map[5]); 
-#endif
-}
-
-
-/**
- * Make a temporary (color) texture image with GLfloat components.
- * Apply all needed pixel unpacking and pixel transfer operations.
- * Note that there are both logicalBaseFormat and textureBaseFormat parameters.
- * Suppose the user specifies GL_LUMINANCE as the internal texture format
- * but the graphics hardware doesn't support luminance textures.  So, we might
- * use an RGB hardware format instead.
- * If logicalBaseFormat != textureBaseFormat we have some extra work to do.
- *
- * \param ctx  the rendering context
- * \param dims  image dimensions: 1, 2 or 3
- * \param logicalBaseFormat  basic texture derived from the user's
- *    internal texture format value
- * \param textureBaseFormat  the actual basic format of the texture
- * \param srcWidth  source image width
- * \param srcHeight  source image height
- * \param srcDepth  source image depth
- * \param srcFormat  source image format
- * \param srcType  source image type
- * \param srcAddr  source image address
- * \param srcPacking  source image pixel packing
- * \return resulting image with format = textureBaseFormat and type = GLfloat.
- */
-GLfloat *
-_mesa_make_temp_float_image(struct gl_context *ctx, GLuint dims,
-			    GLenum logicalBaseFormat,
-			    GLenum textureBaseFormat,
-			    GLint srcWidth, GLint srcHeight, GLint srcDepth,
-			    GLenum srcFormat, GLenum srcType,
-			    const GLvoid *srcAddr,
-			    const struct gl_pixelstore_attrib *srcPacking,
-			    GLbitfield transferOps)
-{
-   GLfloat *tempImage;
-   const GLint components = _mesa_components_in_format(logicalBaseFormat);
-   const GLint srcStride =
-      _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
-   GLfloat *dst;
-   GLint img, row;
-
-   ASSERT(dims >= 1 && dims <= 3);
-
-   ASSERT(logicalBaseFormat == GL_RGBA ||
-          logicalBaseFormat == GL_RGB ||
-          logicalBaseFormat == GL_RG ||
-          logicalBaseFormat == GL_RED ||
-          logicalBaseFormat == GL_LUMINANCE_ALPHA ||
-          logicalBaseFormat == GL_LUMINANCE ||
-          logicalBaseFormat == GL_ALPHA ||
-          logicalBaseFormat == GL_INTENSITY ||
-          logicalBaseFormat == GL_COLOR_INDEX ||
-          logicalBaseFormat == GL_DEPTH_COMPONENT);
-
-   ASSERT(textureBaseFormat == GL_RGBA ||
-          textureBaseFormat == GL_RGB ||
-          textureBaseFormat == GL_RG ||
-          textureBaseFormat == GL_RED ||
-          textureBaseFormat == GL_LUMINANCE_ALPHA ||
-          textureBaseFormat == GL_LUMINANCE ||
-          textureBaseFormat == GL_ALPHA ||
-          textureBaseFormat == GL_INTENSITY ||
-          textureBaseFormat == GL_COLOR_INDEX ||
-          textureBaseFormat == GL_DEPTH_COMPONENT);
-
-   tempImage = (GLfloat *) malloc(srcWidth * srcHeight * srcDepth
-				  * components * sizeof(GLfloat));
-   if (!tempImage)
-      return NULL;
-
-   dst = tempImage;
-   for (img = 0; img < srcDepth; img++) {
-      const GLubyte *src
-	 = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
-						 srcWidth, srcHeight,
-						 srcFormat, srcType,
-						 img, 0, 0);
-      for (row = 0; row < srcHeight; row++) {
-	 _mesa_unpack_color_span_float(ctx, srcWidth, logicalBaseFormat,
-				       dst, srcFormat, srcType, src,
-				       srcPacking, transferOps);
-	 dst += srcWidth * components;
-	 src += srcStride;
-      }
-   }
-
-   if (logicalBaseFormat != textureBaseFormat) {
-      /* more work */
-      GLint texComponents = _mesa_components_in_format(textureBaseFormat);
-      GLint logComponents = _mesa_components_in_format(logicalBaseFormat);
-      GLfloat *newImage;
-      GLint i, n;
-      GLubyte map[6];
-
-      /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */
-      ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA ||
-             textureBaseFormat == GL_LUMINANCE_ALPHA);
-
-      /* The actual texture format should have at least as many components
-       * as the logical texture format.
-       */
-      ASSERT(texComponents >= logComponents);
-
-      newImage = (GLfloat *) malloc(srcWidth * srcHeight * srcDepth
-                                          * texComponents * sizeof(GLfloat));
-      if (!newImage) {
-         free(tempImage);
-         return NULL;
-      }
-
-      compute_component_mapping(logicalBaseFormat, textureBaseFormat, map);
-
-      n = srcWidth * srcHeight * srcDepth;
-      for (i = 0; i < n; i++) {
-         GLint k;
-         for (k = 0; k < texComponents; k++) {
-            GLint j = map[k];
-            if (j == ZERO)
-               newImage[i * texComponents + k] = 0.0F;
-            else if (j == ONE)
-               newImage[i * texComponents + k] = 1.0F;
-            else
-               newImage[i * texComponents + k] = tempImage[i * logComponents + j];
-         }
-      }
-
-      free(tempImage);
-      tempImage = newImage;
-   }
-
-   return tempImage;
-}
-
-
-/**
- * Make temporary image with uint pixel values.  Used for unsigned
- * integer-valued textures.
- */
-static GLuint *
-make_temp_uint_image(struct gl_context *ctx, GLuint dims,
-                     GLenum logicalBaseFormat,
-                     GLenum textureBaseFormat,
-                     GLint srcWidth, GLint srcHeight, GLint srcDepth,
-                     GLenum srcFormat, GLenum srcType,
-                     const GLvoid *srcAddr,
-                     const struct gl_pixelstore_attrib *srcPacking)
-{
-   GLuint *tempImage;
-   const GLint components = _mesa_components_in_format(logicalBaseFormat);
-   const GLint srcStride =
-      _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
-   GLuint *dst;
-   GLint img, row;
-
-   ASSERT(dims >= 1 && dims <= 3);
-
-   ASSERT(logicalBaseFormat == GL_RGBA ||
-          logicalBaseFormat == GL_RGB ||
-          logicalBaseFormat == GL_RG ||
-          logicalBaseFormat == GL_RED ||
-          logicalBaseFormat == GL_LUMINANCE_ALPHA ||
-          logicalBaseFormat == GL_LUMINANCE ||
-          logicalBaseFormat == GL_INTENSITY ||
-          logicalBaseFormat == GL_ALPHA);
-
-   ASSERT(textureBaseFormat == GL_RGBA ||
-          textureBaseFormat == GL_RGB ||
-          textureBaseFormat == GL_RG ||
-          textureBaseFormat == GL_RED ||
-          textureBaseFormat == GL_LUMINANCE_ALPHA ||
-          textureBaseFormat == GL_LUMINANCE ||
-          textureBaseFormat == GL_ALPHA);
-
-   tempImage = (GLuint *) malloc(srcWidth * srcHeight * srcDepth
-                                 * components * sizeof(GLuint));
-   if (!tempImage)
-      return NULL;
-
-   dst = tempImage;
-   for (img = 0; img < srcDepth; img++) {
-      const GLubyte *src
-	 = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
-						 srcWidth, srcHeight,
-						 srcFormat, srcType,
-						 img, 0, 0);
-      for (row = 0; row < srcHeight; row++) {
-	 _mesa_unpack_color_span_uint(ctx, srcWidth, logicalBaseFormat,
-                                      dst, srcFormat, srcType, src,
-                                      srcPacking);
-	 dst += srcWidth * components;
-	 src += srcStride;
-      }
-   }
-
-   if (logicalBaseFormat != textureBaseFormat) {
-      /* more work */
-      GLint texComponents = _mesa_components_in_format(textureBaseFormat);
-      GLint logComponents = _mesa_components_in_format(logicalBaseFormat);
-      GLuint *newImage;
-      GLint i, n;
-      GLubyte map[6];
-
-      /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */
-      ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA ||
-             textureBaseFormat == GL_LUMINANCE_ALPHA);
-
-      /* The actual texture format should have at least as many components
-       * as the logical texture format.
-       */
-      ASSERT(texComponents >= logComponents);
-
-      newImage = (GLuint *) malloc(srcWidth * srcHeight * srcDepth
-                                   * texComponents * sizeof(GLuint));
-      if (!newImage) {
-         free(tempImage);
-         return NULL;
-      }
-
-      compute_component_mapping(logicalBaseFormat, textureBaseFormat, map);
-
-      n = srcWidth * srcHeight * srcDepth;
-      for (i = 0; i < n; i++) {
-         GLint k;
-         for (k = 0; k < texComponents; k++) {
-            GLint j = map[k];
-            if (j == ZERO)
-               newImage[i * texComponents + k] = 0.0F;
-            else if (j == ONE)
-               newImage[i * texComponents + k] = 1.0F;
-            else
-               newImage[i * texComponents + k] = tempImage[i * logComponents + j];
-         }
-      }
-
-      free(tempImage);
-      tempImage = newImage;
-   }
-
-   return tempImage;
-}
-
-
-
-/**
- * Make a temporary (color) texture image with GLchan components.
- * Apply all needed pixel unpacking and pixel transfer operations.
- * Note that there are both logicalBaseFormat and textureBaseFormat parameters.
- * Suppose the user specifies GL_LUMINANCE as the internal texture format
- * but the graphics hardware doesn't support luminance textures.  So, we might
- * use an RGB hardware format instead.
- * If logicalBaseFormat != textureBaseFormat we have some extra work to do.
- *
- * \param ctx  the rendering context
- * \param dims  image dimensions: 1, 2 or 3
- * \param logicalBaseFormat  basic texture derived from the user's
- *    internal texture format value
- * \param textureBaseFormat  the actual basic format of the texture
- * \param srcWidth  source image width
- * \param srcHeight  source image height
- * \param srcDepth  source image depth
- * \param srcFormat  source image format
- * \param srcType  source image type
- * \param srcAddr  source image address
- * \param srcPacking  source image pixel packing
- * \return resulting image with format = textureBaseFormat and type = GLchan.
- */
-GLchan *
-_mesa_make_temp_chan_image(struct gl_context *ctx, GLuint dims,
-                           GLenum logicalBaseFormat,
-                           GLenum textureBaseFormat,
-                           GLint srcWidth, GLint srcHeight, GLint srcDepth,
-                           GLenum srcFormat, GLenum srcType,
-                           const GLvoid *srcAddr,
-                           const struct gl_pixelstore_attrib *srcPacking)
-{
-   GLuint transferOps = ctx->_ImageTransferState;
-   const GLint components = _mesa_components_in_format(logicalBaseFormat);
-   GLint img, row;
-   GLchan *tempImage, *dst;
-
-   ASSERT(dims >= 1 && dims <= 3);
-
-   ASSERT(logicalBaseFormat == GL_RGBA ||
-          logicalBaseFormat == GL_RGB ||
-          logicalBaseFormat == GL_RG ||
-          logicalBaseFormat == GL_RED ||
-          logicalBaseFormat == GL_LUMINANCE_ALPHA ||
-          logicalBaseFormat == GL_LUMINANCE ||
-          logicalBaseFormat == GL_ALPHA ||
-          logicalBaseFormat == GL_INTENSITY);
-
-   ASSERT(textureBaseFormat == GL_RGBA ||
-          textureBaseFormat == GL_RGB ||
-          textureBaseFormat == GL_RG ||
-          textureBaseFormat == GL_RED ||
-          textureBaseFormat == GL_LUMINANCE_ALPHA ||
-          textureBaseFormat == GL_LUMINANCE ||
-          textureBaseFormat == GL_ALPHA ||
-          textureBaseFormat == GL_INTENSITY);
-
-   /* unpack and transfer the source image */
-   tempImage = (GLchan *) malloc(srcWidth * srcHeight * srcDepth
-                                       * components * sizeof(GLchan));
-   if (!tempImage) {
-      return NULL;
-   }
-
-   dst = tempImage;
-   for (img = 0; img < srcDepth; img++) {
-      const GLint srcStride =
-         _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
-      const GLubyte *src =
-         (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
-                                               srcWidth, srcHeight,
-                                               srcFormat, srcType,
-                                               img, 0, 0);
-      for (row = 0; row < srcHeight; row++) {
-         _mesa_unpack_color_span_chan(ctx, srcWidth, logicalBaseFormat, dst,
-                                      srcFormat, srcType, src, srcPacking,
-                                      transferOps);
-         dst += srcWidth * components;
-         src += srcStride;
-      }
-   }
-
-   if (logicalBaseFormat != textureBaseFormat) {
-      /* one more conversion step */
-      GLint texComponents = _mesa_components_in_format(textureBaseFormat);
-      GLint logComponents = _mesa_components_in_format(logicalBaseFormat);
-      GLchan *newImage;
-      GLint i, n;
-      GLubyte map[6];
-
-      /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */
-      ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA ||
-             textureBaseFormat == GL_LUMINANCE_ALPHA);
-
-      /* The actual texture format should have at least as many components
-       * as the logical texture format.
-       */
-      ASSERT(texComponents >= logComponents);
-
-      newImage = (GLchan *) malloc(srcWidth * srcHeight * srcDepth
-                                         * texComponents * sizeof(GLchan));
-      if (!newImage) {
-         free(tempImage);
-         return NULL;
-      }
-
-      compute_component_mapping(logicalBaseFormat, textureBaseFormat, map);
-
-      n = srcWidth * srcHeight * srcDepth;
-      for (i = 0; i < n; i++) {
-         GLint k;
-         for (k = 0; k < texComponents; k++) {
-            GLint j = map[k];
-            if (j == ZERO)
-               newImage[i * texComponents + k] = 0;
-            else if (j == ONE)
-               newImage[i * texComponents + k] = CHAN_MAX;
-            else
-               newImage[i * texComponents + k] = tempImage[i * logComponents + j];
-         }
-      }
-
-      free(tempImage);
-      tempImage = newImage;
-   }
-
-   return tempImage;
-}
-
-
-/**
- * Copy GLubyte pixels from <src> to <dst> with swizzling.
- * \param dst  destination pixels
- * \param dstComponents  number of color components in destination pixels
- * \param src  source pixels
- * \param srcComponents  number of color components in source pixels
- * \param map  the swizzle mapping.  map[X] says where to find the X component
- *             in the source image's pixels.  For example, if the source image
- *             is GL_BGRA and X = red, map[0] yields 2.
- * \param count  number of pixels to copy/swizzle.
- */
-static void
-swizzle_copy(GLubyte *dst, GLuint dstComponents, const GLubyte *src, 
-             GLuint srcComponents, const GLubyte *map, GLuint count)
-{
-#define SWZ_CPY(dst, src, count, dstComps, srcComps) \
-   do {                                              \
-      GLuint i;                                      \
-      for (i = 0; i < count; i++) {                  \
-         GLuint j;                                   \
-         if (srcComps == 4) {                        \
-            COPY_4UBV(tmp, src);                     \
-         }                                           \
-         else {                                      \
-            for (j = 0; j < srcComps; j++) {         \
-               tmp[j] = src[j];                      \
-            }                                        \
-         }                                           \
-         src += srcComps;                            \
-         for (j = 0; j < dstComps; j++) {            \
-            dst[j] = tmp[map[j]];                    \
-         }                                           \
-         dst += dstComps;                            \
-      }                                              \
-   } while (0)
-
-   GLubyte tmp[6];
-
-   tmp[ZERO] = 0x0;
-   tmp[ONE] = 0xff;
-
-   ASSERT(srcComponents <= 4);
-   ASSERT(dstComponents <= 4);
-
-   switch (dstComponents) {
-   case 4:
-      switch (srcComponents) {
-      case 4:
-         SWZ_CPY(dst, src, count, 4, 4);
-         break;
-      case 3:
-         SWZ_CPY(dst, src, count, 4, 3);
-         break;
-      case 2:
-         SWZ_CPY(dst, src, count, 4, 2);
-         break;
-      case 1:
-         SWZ_CPY(dst, src, count, 4, 1);
-         break;
-      default:
-         ;
-      }
-      break;
-   case 3:
-      switch (srcComponents) {
-      case 4:
-         SWZ_CPY(dst, src, count, 3, 4);
-         break;
-      case 3:
-         SWZ_CPY(dst, src, count, 3, 3);
-         break;
-      case 2:
-         SWZ_CPY(dst, src, count, 3, 2);
-         break;
-      case 1:
-         SWZ_CPY(dst, src, count, 3, 1);
-         break;
-      default:
-         ;
-      }
-      break;
-   case 2:
-      switch (srcComponents) {
-      case 4:
-         SWZ_CPY(dst, src, count, 2, 4);
-         break;
-      case 3:
-         SWZ_CPY(dst, src, count, 2, 3);
-         break;
-      case 2:
-         SWZ_CPY(dst, src, count, 2, 2);
-         break;
-      case 1:
-         SWZ_CPY(dst, src, count, 2, 1);
-         break;
-      default:
-         ;
-      }
-      break;
-   case 1:
-      switch (srcComponents) {
-      case 4:
-         SWZ_CPY(dst, src, count, 1, 4);
-         break;
-      case 3:
-         SWZ_CPY(dst, src, count, 1, 3);
-         break;
-      case 2:
-         SWZ_CPY(dst, src, count, 1, 2);
-         break;
-      case 1:
-         SWZ_CPY(dst, src, count, 1, 1);
-         break;
-      default:
-         ;
-      }
-      break;
-   default:
-      ;
-   }
-#undef SWZ_CPY
-}
-
-
-
-static const GLubyte map_identity[6] = { 0, 1, 2, 3, ZERO, ONE };
-static const GLubyte map_3210[6] = { 3, 2, 1, 0, ZERO, ONE };
-
-
-/**
- * For 1-byte/pixel formats (or 8_8_8_8 packed formats), return a
- * mapping array depending on endianness.
- */
-static const GLubyte *
-type_mapping( GLenum srcType )
-{
-   switch (srcType) {
-   case GL_BYTE:
-   case GL_UNSIGNED_BYTE:
-      return map_identity;
-   case GL_UNSIGNED_INT_8_8_8_8:
-      return _mesa_little_endian() ? map_3210 : map_identity;
-   case GL_UNSIGNED_INT_8_8_8_8_REV:
-      return _mesa_little_endian() ? map_identity : map_3210;
-   default:
-      return NULL;
-   }
-}
-
-
-/**
- * For 1-byte/pixel formats (or 8_8_8_8 packed formats), return a
- * mapping array depending on pixelstore byte swapping state.
- */
-static const GLubyte *
-byteswap_mapping( GLboolean swapBytes,
-		  GLenum srcType )
-{
-   if (!swapBytes) 
-      return map_identity;
-
-   switch (srcType) {
-   case GL_BYTE:
-   case GL_UNSIGNED_BYTE:
-      return map_identity;
-   case GL_UNSIGNED_INT_8_8_8_8:
-   case GL_UNSIGNED_INT_8_8_8_8_REV:
-      return map_3210;
-   default:
-      return NULL;
-   }
-}
-
-
-
-/**
- * Transfer a GLubyte texture image with component swizzling.
- */
-static void
-_mesa_swizzle_ubyte_image(struct gl_context *ctx, 
-			  GLuint dimensions,
-			  GLenum srcFormat,
-			  GLenum srcType,
-
-			  GLenum baseInternalFormat,
-
-			  const GLubyte *rgba2dst,
-			  GLuint dstComponents,
-
-			  GLvoid *dstAddr,
-			  GLint dstXoffset, GLint dstYoffset, GLint dstZoffset,
-			  GLint dstRowStride,
-                          const GLuint *dstImageOffsets,
-
-			  GLint srcWidth, GLint srcHeight, GLint srcDepth,
-			  const GLvoid *srcAddr,
-			  const struct gl_pixelstore_attrib *srcPacking )
-{
-   GLint srcComponents = _mesa_components_in_format(srcFormat);
-   const GLubyte *srctype2ubyte, *swap;
-   GLubyte map[4], src2base[6], base2rgba[6];
-   GLint i;
-   const GLint srcRowStride =
-      _mesa_image_row_stride(srcPacking, srcWidth,
-                             srcFormat, GL_UNSIGNED_BYTE);
-   const GLint srcImageStride
-      = _mesa_image_image_stride(srcPacking, srcWidth, srcHeight, srcFormat,
-                                 GL_UNSIGNED_BYTE);
-   const GLubyte *srcImage
-      = (const GLubyte *) _mesa_image_address(dimensions, srcPacking, srcAddr,
-                                              srcWidth, srcHeight, srcFormat,
-                                              GL_UNSIGNED_BYTE, 0, 0, 0);
-
-   (void) ctx;
-
-   /* Translate from src->baseInternal->GL_RGBA->dst.  This will
-    * correctly deal with RGBA->RGB->RGBA conversions where the final
-    * A value must be 0xff regardless of the incoming alpha values.
-    */
-   compute_component_mapping(srcFormat, baseInternalFormat, src2base);
-   compute_component_mapping(baseInternalFormat, GL_RGBA, base2rgba);
-   swap = byteswap_mapping(srcPacking->SwapBytes, srcType);
-   srctype2ubyte = type_mapping(srcType);
-
-
-   for (i = 0; i < 4; i++)
-      map[i] = srctype2ubyte[swap[src2base[base2rgba[rgba2dst[i]]]]];
-
-/*    printf("map %d %d %d %d\n", map[0], map[1], map[2], map[3]);  */
-
-   if (srcComponents == dstComponents &&
-       srcRowStride == dstRowStride &&
-       srcRowStride == srcWidth * srcComponents &&
-       dimensions < 3) {
-      /* 1 and 2D images only */
-      GLubyte *dstImage = (GLubyte *) dstAddr
-         + dstYoffset * dstRowStride
-         + dstXoffset * dstComponents;
-      swizzle_copy(dstImage, dstComponents, srcImage, srcComponents, map, 
-		   srcWidth * srcHeight);
-   }
-   else {
-      GLint img, row;
-      for (img = 0; img < srcDepth; img++) {
-         const GLubyte *srcRow = srcImage;
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * dstComponents
-            + dstYoffset * dstRowStride
-            + dstXoffset * dstComponents;
-         for (row = 0; row < srcHeight; row++) {
-	    swizzle_copy(dstRow, dstComponents, srcRow, srcComponents, map, srcWidth);
-            dstRow += dstRowStride;
-            srcRow += srcRowStride;
-         }
-         srcImage += srcImageStride;
-      }
-   }
-}
-
-
-/**
- * Teximage storage routine for when a simple memcpy will do.
- * No pixel transfer operations or special texel encodings allowed.
- * 1D, 2D and 3D images supported.
- */
-static void
-memcpy_texture(struct gl_context *ctx,
-	       GLuint dimensions,
-               gl_format dstFormat,
-               GLvoid *dstAddr,
-               GLint dstXoffset, GLint dstYoffset, GLint dstZoffset,
-               GLint dstRowStride,
-               const GLuint *dstImageOffsets,
-               GLint srcWidth, GLint srcHeight, GLint srcDepth,
-               GLenum srcFormat, GLenum srcType,
-               const GLvoid *srcAddr,
-               const struct gl_pixelstore_attrib *srcPacking)
-{
-   const GLint srcRowStride = _mesa_image_row_stride(srcPacking, srcWidth,
-                                                     srcFormat, srcType);
-   const GLint srcImageStride = _mesa_image_image_stride(srcPacking,
-                                      srcWidth, srcHeight, srcFormat, srcType);
-   const GLubyte *srcImage = (const GLubyte *) _mesa_image_address(dimensions,
-        srcPacking, srcAddr, srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0);
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLint bytesPerRow = srcWidth * texelBytes;
-
-#if 0
-   /* XXX update/re-enable for dstImageOffsets array */
-   const GLint bytesPerImage = srcHeight * bytesPerRow;
-   const GLint bytesPerTexture = srcDepth * bytesPerImage;
-   GLubyte *dstImage = (GLubyte *) dstAddr
-                     + dstZoffset * dstImageStride
-                     + dstYoffset * dstRowStride
-                     + dstXoffset * texelBytes;
-
-   if (dstRowStride == srcRowStride &&
-       dstRowStride == bytesPerRow &&
-       ((dstImageStride == srcImageStride &&
-         dstImageStride == bytesPerImage) ||
-        (srcDepth == 1))) {
-      /* one big memcpy */
-      ctx->Driver.TextureMemCpy(dstImage, srcImage, bytesPerTexture);
-   }
-   else
-   {
-      GLint img, row;
-      for (img = 0; img < srcDepth; img++) {
-         const GLubyte *srcRow = srcImage;
-         GLubyte *dstRow = dstImage;
-         for (row = 0; row < srcHeight; row++) {
-            ctx->Driver.TextureMemCpy(dstRow, srcRow, bytesPerRow);
-            dstRow += dstRowStride;
-            srcRow += srcRowStride;
-         }
-         srcImage += srcImageStride;
-         dstImage += dstImageStride;
-      }
-   }
-#endif
-
-   GLint img, row;
-   for (img = 0; img < srcDepth; img++) {
-      const GLubyte *srcRow = srcImage;
-      GLubyte *dstRow = (GLubyte *) dstAddr
-         + dstImageOffsets[dstZoffset + img] * texelBytes
-         + dstYoffset * dstRowStride
-         + dstXoffset * texelBytes;
-      for (row = 0; row < srcHeight; row++) {
-         ctx->Driver.TextureMemCpy(dstRow, srcRow, bytesPerRow);
-         dstRow += dstRowStride;
-         srcRow += srcRowStride;
-      }
-      srcImage += srcImageStride;
-   }
-}
-
-
-
-/**
- * Store a 32-bit integer depth component texture image.
- */
-static GLboolean
-_mesa_texstore_z32(TEXSTORE_PARAMS)
-{
-   const GLuint depthScale = 0xffffffff;
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   (void) dims;
-   ASSERT(dstFormat == MESA_FORMAT_Z32);
-   ASSERT(texelBytes == sizeof(GLuint));
-
-   if (ctx->Pixel.DepthScale == 1.0f &&
-       ctx->Pixel.DepthBias == 0.0f &&
-       !srcPacking->SwapBytes &&
-       baseInternalFormat == GL_DEPTH_COMPONENT &&
-       srcFormat == GL_DEPTH_COMPONENT &&
-       srcType == GL_UNSIGNED_INT) {
-      /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else {
-      /* general path */
-      GLint img, row;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            const GLvoid *src = _mesa_image_address(dims, srcPacking,
-                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
-            _mesa_unpack_depth_span(ctx, srcWidth,
-                                    GL_UNSIGNED_INT, (GLuint *) dstRow,
-                                    depthScale, srcType, src, srcPacking);
-            dstRow += dstRowStride;
-         }
-      }
-   }
-   return GL_TRUE;
-}
-
-
-/**
- * Store a 24-bit integer depth component texture image.
- */
-static GLboolean
-_mesa_texstore_x8_z24(TEXSTORE_PARAMS)
-{
-   const GLuint depthScale = 0xffffff;
-   const GLuint texelBytes = 4;
-
-   (void) dims;
-   ASSERT(dstFormat == MESA_FORMAT_X8_Z24);
-
-   {
-      /* general path */
-      GLint img, row;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            const GLvoid *src = _mesa_image_address(dims, srcPacking,
-                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
-            _mesa_unpack_depth_span(ctx, srcWidth,
-                                    GL_UNSIGNED_INT, (GLuint *) dstRow,
-                                    depthScale, srcType, src, srcPacking);
-            dstRow += dstRowStride;
-         }
-      }
-   }
-   return GL_TRUE;
-}
-
-
-/**
- * Store a 24-bit integer depth component texture image.
- */
-static GLboolean
-_mesa_texstore_z24_x8(TEXSTORE_PARAMS)
-{
-   const GLuint depthScale = 0xffffff;
-   const GLuint texelBytes = 4;
-
-   (void) dims;
-   ASSERT(dstFormat == MESA_FORMAT_Z24_X8);
-
-   {
-      /* general path */
-      GLint img, row;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            const GLvoid *src = _mesa_image_address(dims, srcPacking,
-                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
-            GLuint *dst = (GLuint *) dstRow;
-            GLint i;
-            _mesa_unpack_depth_span(ctx, srcWidth,
-                                    GL_UNSIGNED_INT, dst,
-                                    depthScale, srcType, src, srcPacking);
-            for (i = 0; i < srcWidth; i++)
-               dst[i] <<= 8;
-            dstRow += dstRowStride;
-         }
-      }
-   }
-   return GL_TRUE;
-}
-
-
-/**
- * Store a 16-bit integer depth component texture image.
- */
-static GLboolean
-_mesa_texstore_z16(TEXSTORE_PARAMS)
-{
-   const GLuint depthScale = 0xffff;
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   (void) dims;
-   ASSERT(dstFormat == MESA_FORMAT_Z16);
-   ASSERT(texelBytes == sizeof(GLushort));
-
-   if (ctx->Pixel.DepthScale == 1.0f &&
-       ctx->Pixel.DepthBias == 0.0f &&
-       !srcPacking->SwapBytes &&
-       baseInternalFormat == GL_DEPTH_COMPONENT &&
-       srcFormat == GL_DEPTH_COMPONENT &&
-       srcType == GL_UNSIGNED_SHORT) {
-      /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else {
-      /* general path */
-      GLint img, row;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            const GLvoid *src = _mesa_image_address(dims, srcPacking,
-                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
-            GLushort *dst16 = (GLushort *) dstRow;
-            _mesa_unpack_depth_span(ctx, srcWidth,
-                                    GL_UNSIGNED_SHORT, dst16, depthScale,
-                                    srcType, src, srcPacking);
-            dstRow += dstRowStride;
-         }
-      }
-   }
-   return GL_TRUE;
-}
-
-
-/**
- * Store an rgb565 or rgb565_rev texture image.
- */
-static GLboolean
-_mesa_texstore_rgb565(TEXSTORE_PARAMS)
-{
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_RGB565 ||
-          dstFormat == MESA_FORMAT_RGB565_REV);
-   ASSERT(texelBytes == 2);
-
-   if (!ctx->_ImageTransferState &&
-       !srcPacking->SwapBytes &&
-       dstFormat == MESA_FORMAT_RGB565 &&
-       baseInternalFormat == GL_RGB &&
-       srcFormat == GL_RGB &&
-       srcType == GL_UNSIGNED_SHORT_5_6_5) {
-      /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else if (!ctx->_ImageTransferState &&
-            !srcPacking->SwapBytes &&
-            baseInternalFormat == GL_RGB &&
-            srcFormat == GL_RGB &&
-            srcType == GL_UNSIGNED_BYTE &&
-            dims == 2) {
-      /* do optimized tex store */
-      const GLint srcRowStride =
-         _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
-      const GLubyte *src = (const GLubyte *)
-         _mesa_image_address(dims, srcPacking, srcAddr, srcWidth, srcHeight,
-                             srcFormat, srcType, 0, 0, 0);
-      GLubyte *dst = (GLubyte *) dstAddr
-                   + dstYoffset * dstRowStride
-                   + dstXoffset * texelBytes;
-      GLint row, col;
-      for (row = 0; row < srcHeight; row++) {
-         const GLubyte *srcUB = (const GLubyte *) src;
-         GLushort *dstUS = (GLushort *) dst;
-         /* check for byteswapped format */
-         if (dstFormat == MESA_FORMAT_RGB565) {
-            for (col = 0; col < srcWidth; col++) {
-               dstUS[col] = PACK_COLOR_565( srcUB[0], srcUB[1], srcUB[2] );
-               srcUB += 3;
-            }
-         }
-         else {
-            for (col = 0; col < srcWidth; col++) {
-               dstUS[col] = PACK_COLOR_565_REV( srcUB[0], srcUB[1], srcUB[2] );
-               srcUB += 3;
-            }
-         }
-         dst += dstRowStride;
-         src += srcRowStride;
-      }
-   }
-   else {
-      /* general path */
-      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
-                                                 baseInternalFormat,
-                                                 baseFormat,
-                                                 srcWidth, srcHeight, srcDepth,
-                                                 srcFormat, srcType, srcAddr,
-                                                 srcPacking);
-      const GLchan *src = tempImage;
-      GLint img, row, col;
-      if (!tempImage)
-         return GL_FALSE;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            GLushort *dstUS = (GLushort *) dstRow;
-            /* check for byteswapped format */
-            if (dstFormat == MESA_FORMAT_RGB565) {
-               for (col = 0; col < srcWidth; col++) {
-                  dstUS[col] = PACK_COLOR_565( CHAN_TO_UBYTE(src[RCOMP]),
-                                               CHAN_TO_UBYTE(src[GCOMP]),
-                                               CHAN_TO_UBYTE(src[BCOMP]) );
-                  src += 3;
-               }
-            }
-            else {
-               for (col = 0; col < srcWidth; col++) {
-                  dstUS[col] = PACK_COLOR_565_REV( CHAN_TO_UBYTE(src[RCOMP]),
-                                                   CHAN_TO_UBYTE(src[GCOMP]),
-                                                   CHAN_TO_UBYTE(src[BCOMP]) );
-                  src += 3;
-               }
-            }
-            dstRow += dstRowStride;
-         }
-      }
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-
-/**
- * Store a texture in MESA_FORMAT_RGBA8888 or MESA_FORMAT_RGBA8888_REV.
- */
-static GLboolean
-_mesa_texstore_rgba8888(TEXSTORE_PARAMS)
-{
-   const GLboolean littleEndian = _mesa_little_endian();
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_RGBA8888 ||
-          dstFormat == MESA_FORMAT_RGBA8888_REV);
-   ASSERT(texelBytes == 4);
-
-   if (!ctx->_ImageTransferState &&
-       !srcPacking->SwapBytes &&
-       dstFormat == MESA_FORMAT_RGBA8888 &&
-       baseInternalFormat == GL_RGBA &&
-      ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8) ||
-       (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && !littleEndian) ||
-       (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) ||
-       (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_BYTE && littleEndian))) {
-       /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else if (!ctx->_ImageTransferState &&
-       !srcPacking->SwapBytes &&
-       dstFormat == MESA_FORMAT_RGBA8888_REV &&
-       baseInternalFormat == GL_RGBA &&
-      ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) ||
-       (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && littleEndian) ||
-       (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_INT_8_8_8_8) ||
-       (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_BYTE && !littleEndian))) {
-      /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else if (!ctx->_ImageTransferState &&
-	    (srcType == GL_UNSIGNED_BYTE ||
-	     srcType == GL_UNSIGNED_INT_8_8_8_8 ||
-	     srcType == GL_UNSIGNED_INT_8_8_8_8_REV) &&
-	    can_swizzle(baseInternalFormat) &&
-	    can_swizzle(srcFormat)) {
-
-      GLubyte dstmap[4];
-
-      /* dstmap - how to swizzle from RGBA to dst format:
-       */
-      if ((littleEndian && dstFormat == MESA_FORMAT_RGBA8888) ||
-	  (!littleEndian && dstFormat == MESA_FORMAT_RGBA8888_REV)) {
-	 dstmap[3] = 0;
-	 dstmap[2] = 1;
-	 dstmap[1] = 2;
-	 dstmap[0] = 3;
-      }
-      else {
-	 dstmap[3] = 3;
-	 dstmap[2] = 2;
-	 dstmap[1] = 1;
-	 dstmap[0] = 0;
-      }
-      
-      _mesa_swizzle_ubyte_image(ctx, dims,
-				srcFormat,
-				srcType,
-				baseInternalFormat,
-				dstmap, 4,
-				dstAddr, dstXoffset, dstYoffset, dstZoffset,
-				dstRowStride, dstImageOffsets,
-				srcWidth, srcHeight, srcDepth, srcAddr,
-				srcPacking);      
-   }
-   else {
-      /* general path */
-      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
-                                                 baseInternalFormat,
-                                                 baseFormat,
-                                                 srcWidth, srcHeight, srcDepth,
-                                                 srcFormat, srcType, srcAddr,
-                                                 srcPacking);
-      const GLchan *src = tempImage;
-      GLint img, row, col;
-      if (!tempImage)
-         return GL_FALSE;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            GLuint *dstUI = (GLuint *) dstRow;
-            if (dstFormat == MESA_FORMAT_RGBA8888) {
-               for (col = 0; col < srcWidth; col++) {
-                  dstUI[col] = PACK_COLOR_8888( CHAN_TO_UBYTE(src[RCOMP]),
-                                                CHAN_TO_UBYTE(src[GCOMP]),
-                                                CHAN_TO_UBYTE(src[BCOMP]),
-                                                CHAN_TO_UBYTE(src[ACOMP]) );
-                  src += 4;
-               }
-            }
-            else {
-               for (col = 0; col < srcWidth; col++) {
-                  dstUI[col] = PACK_COLOR_8888_REV( CHAN_TO_UBYTE(src[RCOMP]),
-                                                    CHAN_TO_UBYTE(src[GCOMP]),
-                                                    CHAN_TO_UBYTE(src[BCOMP]),
-                                                    CHAN_TO_UBYTE(src[ACOMP]) );
-                  src += 4;
-               }
-            }
-            dstRow += dstRowStride;
-         }
-      }
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-
-static GLboolean
-_mesa_texstore_argb8888(TEXSTORE_PARAMS)
-{
-   const GLboolean littleEndian = _mesa_little_endian();
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLenum baseFormat = GL_RGBA;
-
-   ASSERT(dstFormat == MESA_FORMAT_ARGB8888 ||
-          dstFormat == MESA_FORMAT_ARGB8888_REV ||
-          dstFormat == MESA_FORMAT_XRGB8888 ||
-          dstFormat == MESA_FORMAT_XRGB8888_REV );
-   ASSERT(texelBytes == 4);
-
-   if (!ctx->_ImageTransferState &&
-       !srcPacking->SwapBytes &&
-       (dstFormat == MESA_FORMAT_ARGB8888 ||
-        dstFormat == MESA_FORMAT_XRGB8888) &&
-       baseInternalFormat == GL_RGBA &&
-       srcFormat == GL_BGRA &&
-       ((srcType == GL_UNSIGNED_BYTE && littleEndian) ||
-        srcType == GL_UNSIGNED_INT_8_8_8_8_REV)) {
-      /* simple memcpy path (little endian) */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else if (!ctx->_ImageTransferState &&
-       !srcPacking->SwapBytes &&
-       (dstFormat == MESA_FORMAT_ARGB8888_REV ||
-        dstFormat == MESA_FORMAT_XRGB8888_REV) &&
-       baseInternalFormat == GL_RGBA &&
-       srcFormat == GL_BGRA &&
-       ((srcType == GL_UNSIGNED_BYTE && !littleEndian) ||
-        srcType == GL_UNSIGNED_INT_8_8_8_8)) {
-      /* simple memcpy path (big endian) */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else if (!ctx->_ImageTransferState &&
-            !srcPacking->SwapBytes &&
-	    (dstFormat == MESA_FORMAT_ARGB8888 ||
-             dstFormat == MESA_FORMAT_XRGB8888) &&
-            srcFormat == GL_RGB &&
-	    (baseInternalFormat == GL_RGBA ||
-	     baseInternalFormat == GL_RGB) &&
-            srcType == GL_UNSIGNED_BYTE) {
-      int img, row, col;
-      for (img = 0; img < srcDepth; img++) {
-         const GLint srcRowStride =
-            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
-         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
-                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            GLuint *d4 = (GLuint *) dstRow;
-            for (col = 0; col < srcWidth; col++) {
-               d4[col] = PACK_COLOR_8888(0xff,
-                                         srcRow[col * 3 + RCOMP],
-                                         srcRow[col * 3 + GCOMP],
-                                         srcRow[col * 3 + BCOMP]);
-            }
-            dstRow += dstRowStride;
-            srcRow += srcRowStride;
-         }
-      }
-   }
-   else if (!ctx->_ImageTransferState &&
-            !srcPacking->SwapBytes &&
-	    dstFormat == MESA_FORMAT_ARGB8888 &&
-            srcFormat == GL_RGBA &&
-	    baseInternalFormat == GL_RGBA &&
-            srcType == GL_UNSIGNED_BYTE) {
-      /* same as above case, but src data has alpha too */
-      GLint img, row, col;
-      /* For some reason, streaming copies to write-combined regions
-       * are extremely sensitive to the characteristics of how the
-       * source data is retrieved.  By reordering the source reads to
-       * be in-order, the speed of this operation increases by half.
-       * Strangely the same isn't required for the RGB path, above.
-       */
-      for (img = 0; img < srcDepth; img++) {
-         const GLint srcRowStride =
-            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
-         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
-                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            GLuint *d4 = (GLuint *) dstRow;
-            for (col = 0; col < srcWidth; col++) {
-               d4[col] = PACK_COLOR_8888(srcRow[col * 4 + ACOMP],
-                                         srcRow[col * 4 + RCOMP],
-                                         srcRow[col * 4 + GCOMP],
-                                         srcRow[col * 4 + BCOMP]);
-            }
-            dstRow += dstRowStride;
-            srcRow += srcRowStride;
-         }
-      }
-   }
-   else if (!ctx->_ImageTransferState &&
-	    (srcType == GL_UNSIGNED_BYTE ||
-	     srcType == GL_UNSIGNED_INT_8_8_8_8 ||
-	     srcType == GL_UNSIGNED_INT_8_8_8_8_REV) &&
-	    can_swizzle(baseInternalFormat) &&	   
-	    can_swizzle(srcFormat)) {
-
-      GLubyte dstmap[4];
-
-      /* dstmap - how to swizzle from RGBA to dst format:
-       */
-      if ((littleEndian && dstFormat == MESA_FORMAT_ARGB8888) ||
-          (littleEndian && dstFormat == MESA_FORMAT_XRGB8888) ||
-	  (!littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) ||
-	  (!littleEndian && dstFormat == MESA_FORMAT_XRGB8888_REV)) {
-	 dstmap[3] = 3;		/* alpha */
-	 dstmap[2] = 0;		/* red */
-	 dstmap[1] = 1;		/* green */
-	 dstmap[0] = 2;		/* blue */
-      }
-      else {
-	 assert((littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) ||
-		(!littleEndian && dstFormat == MESA_FORMAT_ARGB8888) ||
-		(littleEndian && dstFormat == MESA_FORMAT_XRGB8888_REV) ||
-		(!littleEndian && dstFormat == MESA_FORMAT_XRGB8888));
-	 dstmap[3] = 2;
-	 dstmap[2] = 1;
-	 dstmap[1] = 0;
-	 dstmap[0] = 3;
-      }
- 
-      _mesa_swizzle_ubyte_image(ctx, dims,
-				srcFormat,
-				srcType,
-				baseInternalFormat,
-				dstmap, 4,
-				dstAddr, dstXoffset, dstYoffset, dstZoffset,
-				dstRowStride,
-                                dstImageOffsets,
-				srcWidth, srcHeight, srcDepth, srcAddr,
-				srcPacking);      
-   }
-   else {
-      /* general path */
-      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
-                                                 baseInternalFormat,
-                                                 baseFormat,
-                                                 srcWidth, srcHeight, srcDepth,
-                                                 srcFormat, srcType, srcAddr,
-                                                 srcPacking);
-      const GLchan *src = tempImage;
-      GLint img, row, col;
-      if (!tempImage)
-         return GL_FALSE;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            GLuint *dstUI = (GLuint *) dstRow;
-            if (dstFormat == MESA_FORMAT_ARGB8888) {
-               for (col = 0; col < srcWidth; col++) {
-                  dstUI[col] = PACK_COLOR_8888( CHAN_TO_UBYTE(src[ACOMP]),
-                                                CHAN_TO_UBYTE(src[RCOMP]),
-                                                CHAN_TO_UBYTE(src[GCOMP]),
-                                                CHAN_TO_UBYTE(src[BCOMP]) );
-                  src += 4;
-               }
-            }
-            else if (dstFormat == MESA_FORMAT_XRGB8888) {
-               for (col = 0; col < srcWidth; col++) {
-                  dstUI[col] = PACK_COLOR_8888( 0xff,
-                                                CHAN_TO_UBYTE(src[RCOMP]),
-                                                CHAN_TO_UBYTE(src[GCOMP]),
-                                                CHAN_TO_UBYTE(src[BCOMP]) );
-                  src += 4;
-               }
-            }
-            else {
-               for (col = 0; col < srcWidth; col++) {
-                  dstUI[col] = PACK_COLOR_8888_REV( CHAN_TO_UBYTE(src[ACOMP]),
-                                                    CHAN_TO_UBYTE(src[RCOMP]),
-                                                    CHAN_TO_UBYTE(src[GCOMP]),
-                                                    CHAN_TO_UBYTE(src[BCOMP]) );
-                  src += 4;
-               }
-            }
-            dstRow += dstRowStride;
-         }
-      }
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-
-static GLboolean
-_mesa_texstore_rgb888(TEXSTORE_PARAMS)
-{
-   const GLboolean littleEndian = _mesa_little_endian();
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_RGB888);
-   ASSERT(texelBytes == 3);
-
-   if (!ctx->_ImageTransferState &&
-       !srcPacking->SwapBytes &&
-       baseInternalFormat == GL_RGB &&
-       srcFormat == GL_BGR &&
-       srcType == GL_UNSIGNED_BYTE &&
-       littleEndian) {
-      /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else if (!ctx->_ImageTransferState &&
-            !srcPacking->SwapBytes &&
-            srcFormat == GL_RGBA &&
-            srcType == GL_UNSIGNED_BYTE) {
-      /* extract RGB from RGBA */
-      GLint img, row, col;
-      for (img = 0; img < srcDepth; img++) {
-         const GLint srcRowStride =
-            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
-         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
-                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            for (col = 0; col < srcWidth; col++) {
-               dstRow[col * 3 + 0] = srcRow[col * 4 + BCOMP];
-               dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP];
-               dstRow[col * 3 + 2] = srcRow[col * 4 + RCOMP];
-            }
-            dstRow += dstRowStride;
-            srcRow += srcRowStride;
-         }
-      }
-   }
-   else if (!ctx->_ImageTransferState &&
-	    srcType == GL_UNSIGNED_BYTE &&
-	    can_swizzle(baseInternalFormat) &&
-	    can_swizzle(srcFormat)) {
-
-      GLubyte dstmap[4];
-
-      /* dstmap - how to swizzle from RGBA to dst format:
-       */
-      dstmap[0] = 2;
-      dstmap[1] = 1;
-      dstmap[2] = 0;
-      dstmap[3] = ONE;		/* ? */
-      
-      _mesa_swizzle_ubyte_image(ctx, dims,
-				srcFormat,
-				srcType,
-				baseInternalFormat,
-				dstmap, 3,
-				dstAddr, dstXoffset, dstYoffset, dstZoffset,
-				dstRowStride, dstImageOffsets,
-				srcWidth, srcHeight, srcDepth, srcAddr,
-				srcPacking);      
-   }
-   else {
-      /* general path */
-      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
-                                                 baseInternalFormat,
-                                                 baseFormat,
-                                                 srcWidth, srcHeight, srcDepth,
-                                                 srcFormat, srcType, srcAddr,
-                                                 srcPacking);
-      const GLchan *src = (const GLchan *) tempImage;
-      GLint img, row, col;
-      if (!tempImage)
-         return GL_FALSE;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-#if 0
-            if (littleEndian) {
-               for (col = 0; col < srcWidth; col++) {
-                  dstRow[col * 3 + 0] = CHAN_TO_UBYTE(src[RCOMP]);
-                  dstRow[col * 3 + 1] = CHAN_TO_UBYTE(src[GCOMP]);
-                  dstRow[col * 3 + 2] = CHAN_TO_UBYTE(src[BCOMP]);
-                  srcUB += 3;
-               }
-            }
-            else {
-               for (col = 0; col < srcWidth; col++) {
-                  dstRow[col * 3 + 0] = srcUB[BCOMP];
-                  dstRow[col * 3 + 1] = srcUB[GCOMP];
-                  dstRow[col * 3 + 2] = srcUB[RCOMP];
-                  srcUB += 3;
-               }
-            }
-#else
-            for (col = 0; col < srcWidth; col++) {
-               dstRow[col * 3 + 0] = CHAN_TO_UBYTE(src[BCOMP]);
-               dstRow[col * 3 + 1] = CHAN_TO_UBYTE(src[GCOMP]);
-               dstRow[col * 3 + 2] = CHAN_TO_UBYTE(src[RCOMP]);
-               src += 3;
-            }
-#endif
-            dstRow += dstRowStride;
-         }
-      }
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-
-static GLboolean
-_mesa_texstore_bgr888(TEXSTORE_PARAMS)
-{
-   const GLboolean littleEndian = _mesa_little_endian();
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_BGR888);
-   ASSERT(texelBytes == 3);
-
-   if (!ctx->_ImageTransferState &&
-       !srcPacking->SwapBytes &&
-       baseInternalFormat == GL_RGB &&
-       srcFormat == GL_RGB &&
-       srcType == GL_UNSIGNED_BYTE &&
-       littleEndian) {
-      /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else if (!ctx->_ImageTransferState &&
-            !srcPacking->SwapBytes &&
-            srcFormat == GL_RGBA &&
-            srcType == GL_UNSIGNED_BYTE) {
-      /* extract BGR from RGBA */
-      int img, row, col;
-      for (img = 0; img < srcDepth; img++) {
-         const GLint srcRowStride =
-            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
-         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
-                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            for (col = 0; col < srcWidth; col++) {
-               dstRow[col * 3 + 0] = srcRow[col * 4 + RCOMP];
-               dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP];
-               dstRow[col * 3 + 2] = srcRow[col * 4 + BCOMP];
-            }
-            dstRow += dstRowStride;
-            srcRow += srcRowStride;
-         }
-      }
-   }
-   else if (!ctx->_ImageTransferState &&
-	    srcType == GL_UNSIGNED_BYTE &&
-	    can_swizzle(baseInternalFormat) &&
-	    can_swizzle(srcFormat)) {
-
-      GLubyte dstmap[4];
-
-      /* dstmap - how to swizzle from RGBA to dst format:
-       */
-      dstmap[0] = 0;
-      dstmap[1] = 1;
-      dstmap[2] = 2;
-      dstmap[3] = ONE;		/* ? */
-      
-      _mesa_swizzle_ubyte_image(ctx, dims,
-				srcFormat,
-				srcType,
-				baseInternalFormat,
-				dstmap, 3,
-				dstAddr, dstXoffset, dstYoffset, dstZoffset,
-				dstRowStride, dstImageOffsets,
-				srcWidth, srcHeight, srcDepth, srcAddr,
-				srcPacking);      
-   }   
-   else {
-      /* general path */
-      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
-                                                 baseInternalFormat,
-                                                 baseFormat,
-                                                 srcWidth, srcHeight, srcDepth,
-                                                 srcFormat, srcType, srcAddr,
-                                                 srcPacking);
-      const GLchan *src = (const GLchan *) tempImage;
-      GLint img, row, col;
-      if (!tempImage)
-         return GL_FALSE;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            for (col = 0; col < srcWidth; col++) {
-               dstRow[col * 3 + 0] = CHAN_TO_UBYTE(src[RCOMP]);
-               dstRow[col * 3 + 1] = CHAN_TO_UBYTE(src[GCOMP]);
-               dstRow[col * 3 + 2] = CHAN_TO_UBYTE(src[BCOMP]);
-               src += 3;
-            }
-            dstRow += dstRowStride;
-         }
-      }
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-
-static GLboolean
-_mesa_texstore_argb4444(TEXSTORE_PARAMS)
-{
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_ARGB4444 ||
-          dstFormat == MESA_FORMAT_ARGB4444_REV);
-   ASSERT(texelBytes == 2);
-
-   if (!ctx->_ImageTransferState &&
-       !srcPacking->SwapBytes &&
-       dstFormat == MESA_FORMAT_ARGB4444 &&
-       baseInternalFormat == GL_RGBA &&
-       srcFormat == GL_BGRA &&
-       srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV) {
-      /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else {
-      /* general path */
-      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
-                                                 baseInternalFormat,
-                                                 baseFormat,
-                                                 srcWidth, srcHeight, srcDepth,
-                                                 srcFormat, srcType, srcAddr,
-                                                 srcPacking);
-      const GLchan *src = tempImage;
-      GLint img, row, col;
-      if (!tempImage)
-         return GL_FALSE;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            GLushort *dstUS = (GLushort *) dstRow;
-            if (dstFormat == MESA_FORMAT_ARGB4444) {
-               for (col = 0; col < srcWidth; col++) {
-                  dstUS[col] = PACK_COLOR_4444( CHAN_TO_UBYTE(src[ACOMP]),
-                                                CHAN_TO_UBYTE(src[RCOMP]),
-                                                CHAN_TO_UBYTE(src[GCOMP]),
-                                                CHAN_TO_UBYTE(src[BCOMP]) );
-                  src += 4;
-               }
-            }
-            else {
-               for (col = 0; col < srcWidth; col++) {
-                  dstUS[col] = PACK_COLOR_4444_REV( CHAN_TO_UBYTE(src[ACOMP]),
-                                                    CHAN_TO_UBYTE(src[RCOMP]),
-                                                    CHAN_TO_UBYTE(src[GCOMP]),
-                                                    CHAN_TO_UBYTE(src[BCOMP]) );
-                  src += 4;
-               }
-            }
-            dstRow += dstRowStride;
-         }
-      }
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-static GLboolean
-_mesa_texstore_rgba5551(TEXSTORE_PARAMS)
-{
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_RGBA5551);
-   ASSERT(texelBytes == 2);
-
-   if (!ctx->_ImageTransferState &&
-       !srcPacking->SwapBytes &&
-       dstFormat == MESA_FORMAT_RGBA5551 &&
-       baseInternalFormat == GL_RGBA &&
-       srcFormat == GL_RGBA &&
-       srcType == GL_UNSIGNED_SHORT_5_5_5_1) {
-      /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else {
-      /* general path */
-      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
-                                                 baseInternalFormat,
-                                                 baseFormat,
-                                                 srcWidth, srcHeight, srcDepth,
-                                                 srcFormat, srcType, srcAddr,
-                                                 srcPacking);
-      const GLchan *src =tempImage;
-      GLint img, row, col;
-      if (!tempImage)
-         return GL_FALSE;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            GLushort *dstUS = (GLushort *) dstRow;
-	    for (col = 0; col < srcWidth; col++) {
-	       dstUS[col] = PACK_COLOR_5551( CHAN_TO_UBYTE(src[RCOMP]),
-					     CHAN_TO_UBYTE(src[GCOMP]),
-					     CHAN_TO_UBYTE(src[BCOMP]),
-					     CHAN_TO_UBYTE(src[ACOMP]) );
-	      src += 4;
-	    }
-            dstRow += dstRowStride;
-         }
-      }
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-static GLboolean
-_mesa_texstore_argb1555(TEXSTORE_PARAMS)
-{
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_ARGB1555 ||
-          dstFormat == MESA_FORMAT_ARGB1555_REV);
-   ASSERT(texelBytes == 2);
-
-   if (!ctx->_ImageTransferState &&
-       !srcPacking->SwapBytes &&
-       dstFormat == MESA_FORMAT_ARGB1555 &&
-       baseInternalFormat == GL_RGBA &&
-       srcFormat == GL_BGRA &&
-       srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV) {
-      /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else {
-      /* general path */
-      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
-                                                 baseInternalFormat,
-                                                 baseFormat,
-                                                 srcWidth, srcHeight, srcDepth,
-                                                 srcFormat, srcType, srcAddr,
-                                                 srcPacking);
-      const GLchan *src =tempImage;
-      GLint img, row, col;
-      if (!tempImage)
-         return GL_FALSE;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            GLushort *dstUS = (GLushort *) dstRow;
-            if (dstFormat == MESA_FORMAT_ARGB1555) {
-               for (col = 0; col < srcWidth; col++) {
-                  dstUS[col] = PACK_COLOR_1555( CHAN_TO_UBYTE(src[ACOMP]),
-                                                CHAN_TO_UBYTE(src[RCOMP]),
-                                                CHAN_TO_UBYTE(src[GCOMP]),
-                                                CHAN_TO_UBYTE(src[BCOMP]) );
-                  src += 4;
-               }
-            }
-            else {
-               for (col = 0; col < srcWidth; col++) {
-                  dstUS[col] = PACK_COLOR_1555_REV( CHAN_TO_UBYTE(src[ACOMP]),
-                                                    CHAN_TO_UBYTE(src[RCOMP]),
-                                                    CHAN_TO_UBYTE(src[GCOMP]),
-                                                    CHAN_TO_UBYTE(src[BCOMP]) );
-                  src += 4;
-               }
-            }
-            dstRow += dstRowStride;
-         }
-      }
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-
-static GLboolean
-_mesa_texstore_argb2101010(TEXSTORE_PARAMS)
-{
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_ARGB2101010);
-   ASSERT(texelBytes == 4);
-
-   if (!ctx->_ImageTransferState &&
-       !srcPacking->SwapBytes &&
-       dstFormat == MESA_FORMAT_ARGB2101010 &&
-       srcFormat == GL_BGRA &&
-       srcType == GL_UNSIGNED_INT_2_10_10_10_REV &&
-       baseInternalFormat == GL_RGBA) {
-      /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else {
-      /* general path */
-      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
-                                                 baseInternalFormat,
-                                                 baseFormat,
-                                                 srcWidth, srcHeight, srcDepth,
-                                                 srcFormat, srcType, srcAddr,
-                                                 srcPacking,
-                                                 ctx->_ImageTransferState);
-      const GLfloat *src = tempImage;
-      GLint img, row, col;
-      if (!tempImage)
-         return GL_FALSE;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         if (baseInternalFormat == GL_RGBA) {
-            for (row = 0; row < srcHeight; row++) {
-               GLuint *dstUI = (GLuint *) dstRow;
-               for (col = 0; col < srcWidth; col++) {
-                  GLushort a,r,g,b;
-
-                  UNCLAMPED_FLOAT_TO_USHORT(a, src[ACOMP]);
-                  UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]);
-                  UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]);
-                  UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]);
-                  dstUI[col] = PACK_COLOR_2101010_US(a, r, g, b);
-                  src += 4;
-               }
-               dstRow += dstRowStride;
-            }
-         } else if (baseInternalFormat == GL_RGB) {
-            for (row = 0; row < srcHeight; row++) {
-               GLuint *dstUI = (GLuint *) dstRow;
-               for (col = 0; col < srcWidth; col++) {
-                  GLushort r,g,b;
-
-                  UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]);
-                  UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]);
-                  UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]);
-                  dstUI[col] = PACK_COLOR_2101010_US(0xffff, r, g, b);
-                  src += 4;
-               }
-               dstRow += dstRowStride;
-            }
-         } else {
-            ASSERT(0);
-         }
-      }
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-
-/**
- * Do texstore for 2-channel, 4-bit/channel, unsigned normalized formats.
- */
-static GLboolean
-_mesa_texstore_unorm44(TEXSTORE_PARAMS)
-{
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_AL44);
-   ASSERT(texelBytes == 1);
-
-   {
-      /* general path */
-      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
-                                                 baseInternalFormat,
-                                                 baseFormat,
-                                                 srcWidth, srcHeight, srcDepth,
-                                                 srcFormat, srcType, srcAddr,
-                                                 srcPacking);
-      const GLchan *src = tempImage;
-      GLint img, row, col;
-      if (!tempImage)
-         return GL_FALSE;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            GLubyte *dstUS = (GLubyte *) dstRow;
-            for (col = 0; col < srcWidth; col++) {
-               /* src[0] is luminance, src[1] is alpha */
-               dstUS[col] = PACK_COLOR_44( CHAN_TO_UBYTE(src[1]),
-                                           CHAN_TO_UBYTE(src[0]) );
-               src += 2;
-            }
-            dstRow += dstRowStride;
-         }
-      }
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-
-/**
- * Do texstore for 2-channel, 8-bit/channel, unsigned normalized formats.
- */
-static GLboolean
-_mesa_texstore_unorm88(TEXSTORE_PARAMS)
-{
-   const GLboolean littleEndian = _mesa_little_endian();
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_AL88 ||
-          dstFormat == MESA_FORMAT_AL88_REV ||
-          dstFormat == MESA_FORMAT_RG88 ||
-          dstFormat == MESA_FORMAT_RG88_REV);
-   ASSERT(texelBytes == 2);
-
-   if (!ctx->_ImageTransferState &&
-       !srcPacking->SwapBytes &&
-       (dstFormat == MESA_FORMAT_AL88 || dstFormat == MESA_FORMAT_RG88) &&
-       baseInternalFormat == srcFormat &&
-       srcType == GL_UNSIGNED_BYTE &&
-       littleEndian) {
-      /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else if (!ctx->_ImageTransferState &&
-	    littleEndian &&
-	    srcType == GL_UNSIGNED_BYTE &&
-	    can_swizzle(baseInternalFormat) &&
-	    can_swizzle(srcFormat)) {
-      GLubyte dstmap[4];
-
-      /* dstmap - how to swizzle from RGBA to dst format:
-       */
-      if (dstFormat == MESA_FORMAT_AL88 || dstFormat == MESA_FORMAT_AL88_REV) {
-	 if ((littleEndian && dstFormat == MESA_FORMAT_AL88) ||
-	     (!littleEndian && dstFormat == MESA_FORMAT_AL88_REV)) {
-	    dstmap[0] = 0;
-	    dstmap[1] = 3;
-	 }
-	 else {
-	    dstmap[0] = 3;
-	    dstmap[1] = 0;
-	 }
-      }
-      else {
-	 if ((littleEndian && dstFormat == MESA_FORMAT_RG88) ||
-	     (!littleEndian && dstFormat == MESA_FORMAT_RG88_REV)) {
-	    dstmap[0] = 0;
-	    dstmap[1] = 1;
-	 }
-	 else {
-	    dstmap[0] = 1;
-	    dstmap[1] = 0;
-	 }
-      }
-      dstmap[2] = ZERO;		/* ? */
-      dstmap[3] = ONE;		/* ? */
-      
-      _mesa_swizzle_ubyte_image(ctx, dims,
-				srcFormat,
-				srcType,
-				baseInternalFormat,
-				dstmap, 2,
-				dstAddr, dstXoffset, dstYoffset, dstZoffset,
-				dstRowStride, dstImageOffsets,
-				srcWidth, srcHeight, srcDepth, srcAddr,
-				srcPacking);      
-   }   
-   else {
-      /* general path */
-      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
-                                                 baseInternalFormat,
-                                                 baseFormat,
-                                                 srcWidth, srcHeight, srcDepth,
-                                                 srcFormat, srcType, srcAddr,
-                                                 srcPacking);
-      const GLchan *src = tempImage;
-      GLint img, row, col;
-      if (!tempImage)
-         return GL_FALSE;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            GLushort *dstUS = (GLushort *) dstRow;
-            if (dstFormat == MESA_FORMAT_AL88 ||
-		dstFormat == MESA_FORMAT_RG88) {
-               for (col = 0; col < srcWidth; col++) {
-                  /* src[0] is luminance, src[1] is alpha */
-                 dstUS[col] = PACK_COLOR_88( CHAN_TO_UBYTE(src[1]),
-                                             CHAN_TO_UBYTE(src[0]) );
-                 src += 2;
-               }
-            }
-            else {
-               for (col = 0; col < srcWidth; col++) {
-                  /* src[0] is luminance, src[1] is alpha */
-                 dstUS[col] = PACK_COLOR_88_REV( CHAN_TO_UBYTE(src[1]),
-                                                 CHAN_TO_UBYTE(src[0]) );
-                 src += 2;
-               }
-            }
-            dstRow += dstRowStride;
-         }
-      }
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-
-/**
- * Do texstore for 2-channel, 16-bit/channel, unsigned normalized formats.
- */
-static GLboolean
-_mesa_texstore_unorm1616(TEXSTORE_PARAMS)
-{
-   const GLboolean littleEndian = _mesa_little_endian();
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_AL1616 ||
-          dstFormat == MESA_FORMAT_AL1616_REV ||
-	  dstFormat == MESA_FORMAT_RG1616 ||
-          dstFormat == MESA_FORMAT_RG1616_REV);
-   ASSERT(texelBytes == 4);
-
-   if (!ctx->_ImageTransferState &&
-       !srcPacking->SwapBytes &&
-       (dstFormat == MESA_FORMAT_AL1616 || dstFormat == MESA_FORMAT_RG1616) &&
-       baseInternalFormat == srcFormat &&
-       srcType == GL_UNSIGNED_SHORT &&
-       littleEndian) {
-      /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else {
-      /* general path */
-      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
-                                                 baseInternalFormat,
-                                                 baseFormat,
-                                                 srcWidth, srcHeight, srcDepth,
-                                                 srcFormat, srcType, srcAddr,
-                                                 srcPacking,
-                                                 ctx->_ImageTransferState);
-      const GLfloat *src = tempImage;
-      GLint img, row, col;
-      if (!tempImage)
-         return GL_FALSE;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            GLuint *dstUI = (GLuint *) dstRow;
-            if (dstFormat == MESA_FORMAT_AL1616 ||
-		dstFormat == MESA_FORMAT_RG1616) {
-               for (col = 0; col < srcWidth; col++) {
-		  GLushort l, a;
-
-		  UNCLAMPED_FLOAT_TO_USHORT(l, src[0]);
-		  UNCLAMPED_FLOAT_TO_USHORT(a, src[1]);
-		  dstUI[col] = PACK_COLOR_1616(a, l);
-		  src += 2;
-               }
-            }
-            else {
-               for (col = 0; col < srcWidth; col++) {
-		  GLushort l, a;
-
-		  UNCLAMPED_FLOAT_TO_USHORT(l, src[0]);
-		  UNCLAMPED_FLOAT_TO_USHORT(a, src[1]);
-		  dstUI[col] = PACK_COLOR_1616_REV(a, l);
-		  src += 2;
-               }
-            }
-            dstRow += dstRowStride;
-         }
-      }
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-
-/* Texstore for R16, A16, L16, I16. */
-static GLboolean
-_mesa_texstore_unorm16(TEXSTORE_PARAMS)
-{
-   const GLboolean littleEndian = _mesa_little_endian();
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_R16 ||
-          dstFormat == MESA_FORMAT_A16 ||
-          dstFormat == MESA_FORMAT_L16 ||
-          dstFormat == MESA_FORMAT_I16);
-   ASSERT(texelBytes == 2);
-
-   if (!ctx->_ImageTransferState &&
-       !srcPacking->SwapBytes &&
-       baseInternalFormat == srcFormat &&
-       srcType == GL_UNSIGNED_SHORT &&
-       littleEndian) {
-      /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else {
-      /* general path */
-      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
-                                                 baseInternalFormat,
-                                                 baseFormat,
-                                                 srcWidth, srcHeight, srcDepth,
-                                                 srcFormat, srcType, srcAddr,
-                                                 srcPacking,
-                                                 ctx->_ImageTransferState);
-      const GLfloat *src = tempImage;
-      GLint img, row, col;
-      if (!tempImage)
-         return GL_FALSE;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            GLushort *dstUS = (GLushort *) dstRow;
-	    for (col = 0; col < srcWidth; col++) {
-	       GLushort r;
-
-	       UNCLAMPED_FLOAT_TO_USHORT(r, src[0]);
-	       dstUS[col] = r;
-	       src += 1;
-	    }
-            dstRow += dstRowStride;
-         }
-      }
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-
-static GLboolean
-_mesa_texstore_rgba_16(TEXSTORE_PARAMS)
-{
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_RGBA_16);
-   ASSERT(texelBytes == 8);
-
-   if (!ctx->_ImageTransferState &&
-       !srcPacking->SwapBytes &&
-       baseInternalFormat == GL_RGBA &&
-       srcFormat == GL_RGBA &&
-       srcType == GL_UNSIGNED_SHORT) {
-      /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else {
-      /* general path */
-      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
-                                                 baseInternalFormat,
-                                                 baseFormat,
-                                                 srcWidth, srcHeight, srcDepth,
-                                                 srcFormat, srcType, srcAddr,
-                                                 srcPacking,
-                                                 ctx->_ImageTransferState);
-      const GLfloat *src = tempImage;
-      GLint img, row, col;
-      if (!tempImage)
-         return GL_FALSE;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            GLushort *dstUS = (GLushort *) dstRow;
-            for (col = 0; col < srcWidth; col++) {
-               GLushort r, g, b, a;
-
-               UNCLAMPED_FLOAT_TO_USHORT(r, src[0]);
-               UNCLAMPED_FLOAT_TO_USHORT(g, src[1]);
-               UNCLAMPED_FLOAT_TO_USHORT(b, src[2]);
-               UNCLAMPED_FLOAT_TO_USHORT(a, src[3]);
-               dstUS[col*4+0] = r;
-               dstUS[col*4+1] = g;
-               dstUS[col*4+2] = b;
-               dstUS[col*4+3] = a;
-               src += 4;
-            }
-            dstRow += dstRowStride;
-         }
-      }
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-
-static GLboolean
-_mesa_texstore_signed_rgba_16(TEXSTORE_PARAMS)
-{
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_SIGNED_R_16 ||
-          dstFormat == MESA_FORMAT_SIGNED_RG_16 ||
-          dstFormat == MESA_FORMAT_SIGNED_RGB_16 ||
-          dstFormat == MESA_FORMAT_SIGNED_RGBA_16);
-
-   if (!ctx->_ImageTransferState &&
-       !srcPacking->SwapBytes &&
-       baseInternalFormat == GL_RGBA &&
-       dstFormat == MESA_FORMAT_SIGNED_RGBA_16 &&
-       srcFormat == GL_RGBA &&
-       srcType == GL_SHORT) {
-      /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else {
-      /* general path */
-      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
-                                                 baseInternalFormat,
-                                                 baseFormat,
-                                                 srcWidth, srcHeight, srcDepth,
-                                                 srcFormat, srcType, srcAddr,
-                                                 srcPacking,
-                                                 ctx->_ImageTransferState);
-      const GLfloat *src = tempImage;
-      const GLuint comps = _mesa_get_format_bytes(dstFormat) / 2;
-      GLint img, row, col;
-
-      if (!tempImage)
-         return GL_FALSE;
-
-      /* Note: tempImage is always float[4] / RGBA.  We convert to 1, 2,
-       * 3 or 4 components/pixel here.
-       */
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            GLshort *dstRowS = (GLshort *) dstRow;
-            for (col = 0; col < srcWidth; col++) {
-               GLuint c;
-               for (c = 0; c < comps; c++) {
-                  GLshort p;
-                  UNCLAMPED_FLOAT_TO_SHORT(p, src[col * 4 + c]);
-                  dstRowS[col * comps + c] = p;
-               }
-            }
-            dstRow += dstRowStride;
-            src += 4 * srcWidth;
-         }
-      }
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-
-static GLboolean
-_mesa_texstore_rgb332(TEXSTORE_PARAMS)
-{
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_RGB332);
-   ASSERT(texelBytes == 1);
-
-   if (!ctx->_ImageTransferState &&
-       !srcPacking->SwapBytes &&
-       baseInternalFormat == GL_RGB &&
-       srcFormat == GL_RGB && srcType == GL_UNSIGNED_BYTE_3_3_2) {
-      /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else {
-      /* general path */
-      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
-                                                 baseInternalFormat,
-                                                 baseFormat,
-                                                 srcWidth, srcHeight, srcDepth,
-                                                 srcFormat, srcType, srcAddr,
-                                                 srcPacking);
-      const GLchan *src = tempImage;
-      GLint img, row, col;
-      if (!tempImage)
-         return GL_FALSE;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            for (col = 0; col < srcWidth; col++) {
-               dstRow[col] = PACK_COLOR_332( CHAN_TO_UBYTE(src[RCOMP]),
-                                             CHAN_TO_UBYTE(src[GCOMP]),
-                                             CHAN_TO_UBYTE(src[BCOMP]) );
-               src += 3;
-            }
-            dstRow += dstRowStride;
-         }
-      }
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-
-/**
- * Texstore for _mesa_texformat_a8, _mesa_texformat_l8, _mesa_texformat_i8.
- */
-static GLboolean
-_mesa_texstore_unorm8(TEXSTORE_PARAMS)
-{
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_A8 ||
-          dstFormat == MESA_FORMAT_L8 ||
-          dstFormat == MESA_FORMAT_I8 ||
-          dstFormat == MESA_FORMAT_R8);
-   ASSERT(texelBytes == 1);
-
-   if (!ctx->_ImageTransferState &&
-       !srcPacking->SwapBytes &&
-       baseInternalFormat == srcFormat &&
-       srcType == GL_UNSIGNED_BYTE) {
-      /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else if (!ctx->_ImageTransferState &&
-	    srcType == GL_UNSIGNED_BYTE &&
-	    can_swizzle(baseInternalFormat) &&
-	    can_swizzle(srcFormat)) {
-      GLubyte dstmap[4];
-
-      /* dstmap - how to swizzle from RGBA to dst format:
-       */
-      if (dstFormat == MESA_FORMAT_A8) {
-	 dstmap[0] = 3;
-      }
-      else {
-	 dstmap[0] = 0;
-      }
-      dstmap[1] = ZERO;		/* ? */
-      dstmap[2] = ZERO;		/* ? */
-      dstmap[3] = ONE;		/* ? */
-      
-      _mesa_swizzle_ubyte_image(ctx, dims,
-				srcFormat,
-				srcType,
-				baseInternalFormat,
-				dstmap, 1,
-				dstAddr, dstXoffset, dstYoffset, dstZoffset,
-				dstRowStride, dstImageOffsets,
-				srcWidth, srcHeight, srcDepth, srcAddr,
-				srcPacking);      
-   }   
-   else {
-      /* general path */
-      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
-                                                 baseInternalFormat,
-                                                 baseFormat,
-                                                 srcWidth, srcHeight, srcDepth,
-                                                 srcFormat, srcType, srcAddr,
-                                                 srcPacking);
-      const GLchan *src = tempImage;
-      GLint img, row, col;
-      if (!tempImage)
-         return GL_FALSE;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            for (col = 0; col < srcWidth; col++) {
-               dstRow[col] = CHAN_TO_UBYTE(src[col]);
-            }
-            dstRow += dstRowStride;
-            src += srcWidth;
-         }
-      }
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-
-
-static GLboolean
-_mesa_texstore_ci8(TEXSTORE_PARAMS)
-{
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-
-   (void) dims; (void) baseInternalFormat;
-   ASSERT(dstFormat == MESA_FORMAT_CI8);
-   ASSERT(texelBytes == 1);
-   ASSERT(baseInternalFormat == GL_COLOR_INDEX);
-
-   if (!ctx->_ImageTransferState &&
-       !srcPacking->SwapBytes &&
-       srcFormat == GL_COLOR_INDEX &&
-       srcType == GL_UNSIGNED_BYTE) {
-      /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else {
-      /* general path */
-      GLint img, row;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            const GLvoid *src = _mesa_image_address(dims, srcPacking,
-                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
-            _mesa_unpack_index_span(ctx, srcWidth, GL_UNSIGNED_BYTE, dstRow,
-                                    srcType, src, srcPacking,
-                                    ctx->_ImageTransferState);
-            dstRow += dstRowStride;
-         }
-      }
-   }
-   return GL_TRUE;
-}
-
-
-/**
- * Texstore for _mesa_texformat_ycbcr or _mesa_texformat_ycbcr_REV.
- */
-static GLboolean
-_mesa_texstore_ycbcr(TEXSTORE_PARAMS)
-{
-   const GLboolean littleEndian = _mesa_little_endian();
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-
-   (void) ctx; (void) dims; (void) baseInternalFormat;
-
-   ASSERT((dstFormat == MESA_FORMAT_YCBCR) ||
-          (dstFormat == MESA_FORMAT_YCBCR_REV));
-   ASSERT(texelBytes == 2);
-   ASSERT(ctx->Extensions.MESA_ycbcr_texture);
-   ASSERT(srcFormat == GL_YCBCR_MESA);
-   ASSERT((srcType == GL_UNSIGNED_SHORT_8_8_MESA) ||
-          (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA));
-   ASSERT(baseInternalFormat == GL_YCBCR_MESA);
-
-   /* always just memcpy since no pixel transfer ops apply */
-   memcpy_texture(ctx, dims,
-                  dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                  dstRowStride,
-                  dstImageOffsets,
-                  srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                  srcAddr, srcPacking);
-
-   /* Check if we need byte swapping */
-   /* XXX the logic here _might_ be wrong */
-   if (srcPacking->SwapBytes ^
-       (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA) ^
-       (dstFormat == MESA_FORMAT_YCBCR_REV) ^
-       !littleEndian) {
-      GLint img, row;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            _mesa_swap2((GLushort *) dstRow, srcWidth);
-            dstRow += dstRowStride;
-         }
-      }
-   }
-   return GL_TRUE;
-}
-
-static GLboolean
-_mesa_texstore_dudv8(TEXSTORE_PARAMS)
-{
-   const GLboolean littleEndian = _mesa_little_endian();
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_DUDV8);
-   ASSERT(texelBytes == 2);
-   ASSERT(ctx->Extensions.ATI_envmap_bumpmap);
-   ASSERT((srcFormat == GL_DU8DV8_ATI) ||
-	  (srcFormat == GL_DUDV_ATI));
-   ASSERT(baseInternalFormat == GL_DUDV_ATI);
-
-   if (!srcPacking->SwapBytes && srcType == GL_BYTE &&
-       littleEndian) {
-      /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else if (srcType == GL_BYTE) {
-      GLubyte dstmap[4];
-
-      /* dstmap - how to swizzle from RGBA to dst format:
-       */
-      if (littleEndian) {
-	 dstmap[0] = 0;
-	 dstmap[1] = 3;
-      }
-      else {
-	 dstmap[0] = 3;
-	 dstmap[1] = 0;
-      }
-      dstmap[2] = ZERO;		/* ? */
-      dstmap[3] = ONE;		/* ? */
-      
-      _mesa_swizzle_ubyte_image(ctx, dims,
-				GL_LUMINANCE_ALPHA, /* hack */
-				GL_UNSIGNED_BYTE, /* hack */
-				GL_LUMINANCE_ALPHA, /* hack */
-				dstmap, 2,
-				dstAddr, dstXoffset, dstYoffset, dstZoffset,
-				dstRowStride, dstImageOffsets,
-				srcWidth, srcHeight, srcDepth, srcAddr,
-				srcPacking);      
-   }   
-   else {
-      /* general path - note this is defined for 2d textures only */
-      const GLint components = _mesa_components_in_format(baseInternalFormat);
-      const GLint srcStride = _mesa_image_row_stride(srcPacking, srcWidth,
-                                                     srcFormat, srcType);
-      GLbyte *tempImage, *dst, *src;
-      GLint row;
-
-      tempImage = (GLbyte *) malloc(srcWidth * srcHeight * srcDepth
-                                          * components * sizeof(GLbyte));
-      if (!tempImage)
-         return GL_FALSE;
-
-      src = (GLbyte *) _mesa_image_address(dims, srcPacking, srcAddr,
-                                           srcWidth, srcHeight,
-                                           srcFormat, srcType,
-                                           0, 0, 0);
-
-      dst = tempImage;
-      for (row = 0; row < srcHeight; row++) {
-         _mesa_unpack_dudv_span_byte(ctx, srcWidth, baseInternalFormat,
-                                     dst, srcFormat, srcType, src,
-                                     srcPacking, 0);
-         dst += srcWidth * components;
-         src += srcStride;
-      }
- 
-      src = tempImage;
-      dst = (GLbyte *) dstAddr
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-      for (row = 0; row < srcHeight; row++) {
-         memcpy(dst, src, srcWidth * texelBytes);
-         dst += dstRowStride;
-         src += srcWidth * texelBytes;
-      }
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-
-/**
- * Store a texture in MESA_FORMAT_SIGNED_R8 format.
- */
-static GLboolean
-_mesa_texstore_signed_r8(TEXSTORE_PARAMS)
-{
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_SIGNED_R8);
-   ASSERT(texelBytes == 1);
-
-   /* XXX look at adding optimized paths */
-   {
-      /* general path */
-      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
-                                                 baseInternalFormat,
-                                                 baseFormat,
-                                                 srcWidth, srcHeight, srcDepth,
-                                                 srcFormat, srcType, srcAddr,
-                                                 srcPacking,
-                                                 ctx->_ImageTransferState);
-      const GLfloat *srcRow = tempImage;
-      GLint img, row, col;
-      if (!tempImage)
-         return GL_FALSE;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            GLubyte *dstB = (GLubyte *) dstRow;
-            for (col = 0; col < srcWidth; col++) {
-               dstB[col] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]);
-            }
-            dstRow += dstRowStride;
-         }
-      }
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-
-/**
- * Store a texture in MESA_FORMAT_SIGNED_RG88 format.
- */
-static GLboolean
-_mesa_texstore_signed_rg88(TEXSTORE_PARAMS)
-{
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RG88);
-   ASSERT(texelBytes == 1);
-
-   /* XXX look at adding optimized paths */
-   {
-      /* general path */
-      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
-                                                 baseInternalFormat,
-                                                 baseFormat,
-                                                 srcWidth, srcHeight, srcDepth,
-                                                 srcFormat, srcType, srcAddr,
-                                                 srcPacking,
-                                                 ctx->_ImageTransferState);
-      const GLfloat *srcRow = tempImage;
-      GLint img, row, col;
-      if (!tempImage)
-         return GL_FALSE;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            GLushort *dstUS = (GLushort *) dstRow;
-            for (col = 0; col < srcWidth; col++) {
-               dstUS[col] = PACK_COLOR_88(FLOAT_TO_BYTE_TEX(srcRow[RCOMP]),
-                                          FLOAT_TO_BYTE_TEX(srcRow[GCOMP]));
-            }
-            dstRow += dstRowStride;
-         }
-      }
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-
-/**
- * Store a texture in MESA_FORMAT_SIGNED_RGBX8888.
- */
-static GLboolean
-_mesa_texstore_signed_rgbx8888(TEXSTORE_PARAMS)
-{
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBX8888);
-   ASSERT(texelBytes == 4);
-
-   {
-      /* general path */
-      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
-                                                 baseInternalFormat,
-                                                 baseFormat,
-                                                 srcWidth, srcHeight, srcDepth,
-                                                 srcFormat, srcType, srcAddr,
-                                                 srcPacking,
-                                                 ctx->_ImageTransferState);
-      const GLfloat *srcRow = tempImage;
-      GLint img, row, col;
-      if (!tempImage)
-         return GL_FALSE;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            GLuint *dstUI = (GLuint *) dstRow;
-            for (col = 0; col < srcWidth; col++) {
-               dstUI[col] = PACK_COLOR_8888( FLOAT_TO_BYTE_TEX(srcRow[RCOMP]),
-                                             FLOAT_TO_BYTE_TEX(srcRow[GCOMP]),
-                                             FLOAT_TO_BYTE_TEX(srcRow[BCOMP]),
-                                             0xff );
-               srcRow += 4;
-            }
-            dstRow += dstRowStride;
-         }
-      }
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-
-
-/**
- * Store a texture in MESA_FORMAT_SIGNED_RGBA8888 or
- * MESA_FORMAT_SIGNED_RGBA8888_REV
- */
-static GLboolean
-_mesa_texstore_signed_rgba8888(TEXSTORE_PARAMS)
-{
-   const GLboolean littleEndian = _mesa_little_endian();
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBA8888 ||
-          dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV);
-   ASSERT(texelBytes == 4);
-
-   if (!ctx->_ImageTransferState &&
-       !srcPacking->SwapBytes &&
-       dstFormat == MESA_FORMAT_SIGNED_RGBA8888 &&
-       baseInternalFormat == GL_RGBA &&
-      ((srcFormat == GL_RGBA && srcType == GL_BYTE && !littleEndian) ||
-       (srcFormat == GL_ABGR_EXT && srcType == GL_BYTE && littleEndian))) {
-       /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else if (!ctx->_ImageTransferState &&
-       !srcPacking->SwapBytes &&
-       dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV &&
-       baseInternalFormat == GL_RGBA &&
-      ((srcFormat == GL_RGBA && srcType == GL_BYTE && littleEndian) ||
-       (srcFormat == GL_ABGR_EXT && srcType == GL_BYTE && !littleEndian))) {
-      /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else if (!ctx->_ImageTransferState &&
-	    (srcType == GL_BYTE) &&
-	    can_swizzle(baseInternalFormat) &&
-	    can_swizzle(srcFormat)) {
-
-      GLubyte dstmap[4];
-
-      /* dstmap - how to swizzle from RGBA to dst format:
-       */
-      if ((littleEndian && dstFormat == MESA_FORMAT_SIGNED_RGBA8888) ||
-	  (!littleEndian && dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV)) {
-	 dstmap[3] = 0;
-	 dstmap[2] = 1;
-	 dstmap[1] = 2;
-	 dstmap[0] = 3;
-      }
-      else {
-	 dstmap[3] = 3;
-	 dstmap[2] = 2;
-	 dstmap[1] = 1;
-	 dstmap[0] = 0;
-      }
-      
-      _mesa_swizzle_ubyte_image(ctx, dims,
-				srcFormat,
-				srcType,
-				baseInternalFormat,
-				dstmap, 4,
-				dstAddr, dstXoffset, dstYoffset, dstZoffset,
-				dstRowStride, dstImageOffsets,
-				srcWidth, srcHeight, srcDepth, srcAddr,
-				srcPacking);      
-   }
-   else {
-      /* general path */
-      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
-                                                 baseInternalFormat,
-                                                 baseFormat,
-                                                 srcWidth, srcHeight, srcDepth,
-                                                 srcFormat, srcType, srcAddr,
-                                                 srcPacking,
-                                                 ctx->_ImageTransferState);
-      const GLfloat *srcRow = tempImage;
-      GLint img, row, col;
-      if (!tempImage)
-         return GL_FALSE;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            GLuint *dstUI = (GLuint *) dstRow;
-            if (dstFormat == MESA_FORMAT_SIGNED_RGBA8888) {
-               for (col = 0; col < srcWidth; col++) {
-                  dstUI[col] = PACK_COLOR_8888( FLOAT_TO_BYTE_TEX(srcRow[RCOMP]),
-                                                FLOAT_TO_BYTE_TEX(srcRow[GCOMP]),
-                                                FLOAT_TO_BYTE_TEX(srcRow[BCOMP]),
-                                                FLOAT_TO_BYTE_TEX(srcRow[ACOMP]) );
-                  srcRow += 4;
-               }
-            }
-            else {
-               for (col = 0; col < srcWidth; col++) {
-                  dstUI[col] = PACK_COLOR_8888_REV( FLOAT_TO_BYTE_TEX(srcRow[RCOMP]),
-                                                    FLOAT_TO_BYTE_TEX(srcRow[GCOMP]),
-                                                    FLOAT_TO_BYTE_TEX(srcRow[BCOMP]),
-                                                    FLOAT_TO_BYTE_TEX(srcRow[ACOMP]) );
-                  srcRow += 4;
-               }
-            }
-            dstRow += dstRowStride;
-         }
-      }
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-
-/**
- * Store a combined depth/stencil texture image.
- */
-static GLboolean
-_mesa_texstore_z24_s8(TEXSTORE_PARAMS)
-{
-   const GLuint depthScale = 0xffffff;
-   const GLint srcRowStride
-      = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType)
-      / sizeof(GLuint);
-   GLint img, row;
-
-   ASSERT(dstFormat == MESA_FORMAT_Z24_S8);
-   ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT || srcFormat == GL_DEPTH_COMPONENT);
-   ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT || srcType == GL_UNSIGNED_INT_24_8_EXT);
-
-   if (srcFormat != GL_DEPTH_COMPONENT && ctx->Pixel.DepthScale == 1.0f &&
-       ctx->Pixel.DepthBias == 0.0f &&
-       !srcPacking->SwapBytes) {
-      /* simple path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else if (srcFormat == GL_DEPTH_COMPONENT) {
-      /* In case we only upload depth we need to preserve the stencil */
-      for (img = 0; img < srcDepth; img++) {
-	 GLuint *dstRow = (GLuint *) dstAddr
-            + dstImageOffsets[dstZoffset + img]
-            + dstYoffset * dstRowStride / sizeof(GLuint)
-            + dstXoffset;
-         const GLuint *src
-            = (const GLuint *) _mesa_image_address(dims, srcPacking, srcAddr,
-                  srcWidth, srcHeight,
-                  srcFormat, srcType,
-                  img, 0, 0);
-         for (row = 0; row < srcHeight; row++) {
-            GLuint depth[MAX_WIDTH];
-	    GLubyte stencil[MAX_WIDTH];
-            GLint i;
-	    GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE;
-
-	    if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */
-	       keepstencil = GL_TRUE;
-	    }
-            else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */
-	       keepdepth = GL_TRUE;
-	    }
-
-	    if (keepdepth == GL_FALSE)
-	       /* the 24 depth bits will be in the low position: */
-	       _mesa_unpack_depth_span(ctx, srcWidth,
-				       GL_UNSIGNED_INT, /* dst type */
-				       keepstencil ? depth : dstRow, /* dst addr */
-				       depthScale,
-				       srcType, src, srcPacking);
-
-	    if (keepstencil == GL_FALSE)
-	       /* get the 8-bit stencil values */
-	       _mesa_unpack_stencil_span(ctx, srcWidth,
-					 GL_UNSIGNED_BYTE, /* dst type */
-					 stencil, /* dst addr */
-					 srcType, src, srcPacking,
-					 ctx->_ImageTransferState);
-
-	    for (i = 0; i < srcWidth; i++) {
-	       if (keepstencil)
-		  dstRow[i] = depth[i] << 8 | (dstRow[i] & 0x000000FF);
-	       else
-		  dstRow[i] = (dstRow[i] & 0xFFFFFF00) | (stencil[i] & 0xFF);
-	    }
-
-            src += srcRowStride;
-            dstRow += dstRowStride / sizeof(GLuint);
-         }
-      }
-   }
-   return GL_TRUE;
-}
-
-
-/**
- * Store a combined depth/stencil texture image.
- */
-static GLboolean
-_mesa_texstore_s8_z24(TEXSTORE_PARAMS)
-{
-   const GLuint depthScale = 0xffffff;
-   const GLint srcRowStride
-      = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType)
-      / sizeof(GLuint);
-   GLint img, row;
-
-   ASSERT(dstFormat == MESA_FORMAT_S8_Z24);
-   ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT ||
-          srcFormat == GL_DEPTH_COMPONENT ||
-          srcFormat == GL_STENCIL_INDEX);
-   ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT ||
-          srcType == GL_UNSIGNED_INT_24_8_EXT);
-
-   for (img = 0; img < srcDepth; img++) {
-      GLuint *dstRow = (GLuint *) dstAddr
-	 + dstImageOffsets[dstZoffset + img]
-	 + dstYoffset * dstRowStride / sizeof(GLuint)
-	 + dstXoffset;
-      const GLuint *src
-	 = (const GLuint *) _mesa_image_address(dims, srcPacking, srcAddr,
-						srcWidth, srcHeight,
-						srcFormat, srcType,
-						img, 0, 0);
-      for (row = 0; row < srcHeight; row++) {
-	 GLuint depth[MAX_WIDTH];
-	 GLubyte stencil[MAX_WIDTH];
-	 GLint i;
-	 GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE;
-	 
-	 if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */
-	    keepstencil = GL_TRUE;
-	 }
-         else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */
-	    keepdepth = GL_TRUE;
-	 }
-
-	 if (keepdepth == GL_FALSE)
-	    /* the 24 depth bits will be in the low position: */
-	    _mesa_unpack_depth_span(ctx, srcWidth,
-				    GL_UNSIGNED_INT, /* dst type */
-				    keepstencil ? depth : dstRow, /* dst addr */
-				    depthScale,
-				    srcType, src, srcPacking);	 
-
-	 if (keepstencil == GL_FALSE)
-	    /* get the 8-bit stencil values */
-	    _mesa_unpack_stencil_span(ctx, srcWidth,
-				      GL_UNSIGNED_BYTE, /* dst type */
-				      stencil, /* dst addr */
-				      srcType, src, srcPacking,
-				      ctx->_ImageTransferState);
-
-	 /* merge stencil values into depth values */
-	 for (i = 0; i < srcWidth; i++) {
-	    if (keepstencil)
-	       dstRow[i] = depth[i] | (dstRow[i] & 0xFF000000);
-	    else
-	       dstRow[i] = (dstRow[i] & 0xFFFFFF) | (stencil[i] << 24);
-
-	 }
-	 src += srcRowStride;
-	 dstRow += dstRowStride / sizeof(GLuint);
-      }
-   }
-   return GL_TRUE;
-}
-
-
-/**
- * Store simple 8-bit/value stencil texture data.
- */
-static GLboolean
-_mesa_texstore_s8(TEXSTORE_PARAMS)
-{
-   ASSERT(dstFormat == MESA_FORMAT_S8);
-   ASSERT(srcFormat == GL_STENCIL_INDEX);
-
-   if (!ctx->_ImageTransferState &&
-       !srcPacking->SwapBytes &&
-       baseInternalFormat == srcFormat &&
-       srcType == GL_UNSIGNED_BYTE) {
-      /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else {
-      const GLint srcRowStride
-	 = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType)
-	 / sizeof(GLuint);
-      GLint img, row;
-      
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img]
-            + dstYoffset * dstRowStride / sizeof(GLuint)
-            + dstXoffset;
-         const GLuint *src
-            = (const GLuint *) _mesa_image_address(dims, srcPacking, srcAddr,
-                                                   srcWidth, srcHeight,
-                                                   srcFormat, srcType,
-                                                   img, 0, 0);
-         for (row = 0; row < srcHeight; row++) {
-            GLubyte stencil[MAX_WIDTH];
-            GLint i;
-
-            /* get the 8-bit stencil values */
-            _mesa_unpack_stencil_span(ctx, srcWidth,
-                                      GL_UNSIGNED_BYTE, /* dst type */
-                                      stencil, /* dst addr */
-                                      srcType, src, srcPacking,
-                                      ctx->_ImageTransferState);
-            /* merge stencil values into depth values */
-            for (i = 0; i < srcWidth; i++)
-               dstRow[i] = stencil[i];
-
-            src += srcRowStride;
-            dstRow += dstRowStride / sizeof(GLubyte);
-         }
-      }
-
-   }
-
-   return GL_TRUE;
-}
-
-
-/**
- * Store an image in any of the formats:
- *   _mesa_texformat_rgba_float32
- *   _mesa_texformat_rgb_float32
- *   _mesa_texformat_alpha_float32
- *   _mesa_texformat_luminance_float32
- *   _mesa_texformat_luminance_alpha_float32
- *   _mesa_texformat_intensity_float32
- */
-static GLboolean
-_mesa_texstore_rgba_float32(TEXSTORE_PARAMS)
-{
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
-   const GLint components = _mesa_components_in_format(baseFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT32 ||
-          dstFormat == MESA_FORMAT_RGB_FLOAT32 ||
-          dstFormat == MESA_FORMAT_ALPHA_FLOAT32 ||
-          dstFormat == MESA_FORMAT_LUMINANCE_FLOAT32 ||
-          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32 ||
-          dstFormat == MESA_FORMAT_INTENSITY_FLOAT32);
-   ASSERT(baseInternalFormat == GL_RGBA ||
-          baseInternalFormat == GL_RGB ||
-          baseInternalFormat == GL_ALPHA ||
-          baseInternalFormat == GL_LUMINANCE ||
-          baseInternalFormat == GL_LUMINANCE_ALPHA ||
-          baseInternalFormat == GL_INTENSITY);
-   ASSERT(texelBytes == components * sizeof(GLfloat));
-
-   if (!ctx->_ImageTransferState &&
-       !srcPacking->SwapBytes &&
-       baseInternalFormat == srcFormat &&
-       srcType == GL_FLOAT) {
-      /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else {
-      /* general path */
-      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
-                                                 baseInternalFormat,
-                                                 baseFormat,
-                                                 srcWidth, srcHeight, srcDepth,
-                                                 srcFormat, srcType, srcAddr,
-                                                 srcPacking,
-                                                 ctx->_ImageTransferState);
-      const GLfloat *srcRow = tempImage;
-      GLint bytesPerRow;
-      GLint img, row;
-      if (!tempImage)
-         return GL_FALSE;
-      bytesPerRow = srcWidth * components * sizeof(GLfloat);
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            memcpy(dstRow, srcRow, bytesPerRow);
-            dstRow += dstRowStride;
-            srcRow += srcWidth * components;
-         }
-      }
-
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-
-
-/**
- * As above, but store 16-bit floats.
- */
-static GLboolean
-_mesa_texstore_rgba_float16(TEXSTORE_PARAMS)
-{
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
-   const GLint components = _mesa_components_in_format(baseFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT16 ||
-          dstFormat == MESA_FORMAT_RGB_FLOAT16 ||
-          dstFormat == MESA_FORMAT_ALPHA_FLOAT16 ||
-          dstFormat == MESA_FORMAT_LUMINANCE_FLOAT16 ||
-          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16 ||
-          dstFormat == MESA_FORMAT_INTENSITY_FLOAT16);
-   ASSERT(baseInternalFormat == GL_RGBA ||
-          baseInternalFormat == GL_RGB ||
-          baseInternalFormat == GL_ALPHA ||
-          baseInternalFormat == GL_LUMINANCE ||
-          baseInternalFormat == GL_LUMINANCE_ALPHA ||
-          baseInternalFormat == GL_INTENSITY);
-   ASSERT(texelBytes == components * sizeof(GLhalfARB));
-
-   if (!ctx->_ImageTransferState &&
-       !srcPacking->SwapBytes &&
-       baseInternalFormat == srcFormat &&
-       srcType == GL_HALF_FLOAT_ARB) {
-      /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else {
-      /* general path */
-      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
-                                                 baseInternalFormat,
-                                                 baseFormat,
-                                                 srcWidth, srcHeight, srcDepth,
-                                                 srcFormat, srcType, srcAddr,
-                                                 srcPacking,
-                                                 ctx->_ImageTransferState);
-      const GLfloat *src = tempImage;
-      GLint img, row;
-      if (!tempImage)
-         return GL_FALSE;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            GLhalfARB *dstTexel = (GLhalfARB *) dstRow;
-            GLint i;
-            for (i = 0; i < srcWidth * components; i++) {
-               dstTexel[i] = _mesa_float_to_half(src[i]);
-            }
-            dstRow += dstRowStride;
-            src += srcWidth * components;
-         }
-      }
-
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-
-/* non-normalized, signed int8 */
-static GLboolean
-_mesa_texstore_rgba_int8(TEXSTORE_PARAMS)
-{
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
-   const GLint components = _mesa_components_in_format(baseFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_RGBA_INT8);
-   ASSERT(baseInternalFormat == GL_RGBA ||
-          baseInternalFormat == GL_RGB ||
-          baseInternalFormat == GL_ALPHA ||
-          baseInternalFormat == GL_LUMINANCE ||
-          baseInternalFormat == GL_LUMINANCE_ALPHA ||
-          baseInternalFormat == GL_INTENSITY);
-   ASSERT(texelBytes == components * sizeof(GLbyte));
-
-   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
-    * to integer formats.
-    */
-   if (!srcPacking->SwapBytes &&
-       baseInternalFormat == srcFormat &&
-       srcType == GL_BYTE) {
-      /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else {
-      /* general path */
-      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
-                                                 baseInternalFormat,
-                                                 baseFormat,
-                                                 srcWidth, srcHeight, srcDepth,
-                                                 srcFormat, srcType, srcAddr,
-                                                 srcPacking, 0x0);
-      const GLfloat *src = tempImage;
-      GLint img, row;
-      if (!tempImage)
-         return GL_FALSE;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            GLbyte *dstTexel = (GLbyte *) dstRow;
-            GLint i;
-            for (i = 0; i < srcWidth * components; i++) {
-               dstTexel[i] = (GLbyte) src[i];
-            }
-            dstRow += dstRowStride;
-            src += srcWidth * components;
-         }
-      }
-
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-
-/* non-normalized, signed int16 */
-static GLboolean
-_mesa_texstore_rgba_int16(TEXSTORE_PARAMS)
-{
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
-   const GLint components = _mesa_components_in_format(baseFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_RGBA_INT16);
-   ASSERT(baseInternalFormat == GL_RGBA ||
-          baseInternalFormat == GL_RGB ||
-          baseInternalFormat == GL_ALPHA ||
-          baseInternalFormat == GL_LUMINANCE ||
-          baseInternalFormat == GL_LUMINANCE_ALPHA ||
-          baseInternalFormat == GL_INTENSITY);
-   ASSERT(texelBytes == components * sizeof(GLshort));
-
-   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
-    * to integer formats.
-    */
-   if (!srcPacking->SwapBytes &&
-       baseInternalFormat == srcFormat &&
-       srcType == GL_SHORT) {
-      /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else {
-      /* general path */
-      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
-                                                 baseInternalFormat,
-                                                 baseFormat,
-                                                 srcWidth, srcHeight, srcDepth,
-                                                 srcFormat, srcType, srcAddr,
-                                                 srcPacking, 0x0);
-      const GLfloat *src = tempImage;
-      GLint img, row;
-      if (!tempImage)
-         return GL_FALSE;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            GLshort *dstTexel = (GLshort *) dstRow;
-            GLint i;
-            for (i = 0; i < srcWidth * components; i++) {
-               dstTexel[i] = (GLint) src[i];
-            }
-            dstRow += dstRowStride;
-            src += srcWidth * components;
-         }
-      }
-
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-
-/* non-normalized, signed int32 */
-static GLboolean
-_mesa_texstore_rgba_int32(TEXSTORE_PARAMS)
-{
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
-   const GLint components = _mesa_components_in_format(baseFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_RGBA_INT32);
-   ASSERT(baseInternalFormat == GL_RGBA ||
-          baseInternalFormat == GL_RGB ||
-          baseInternalFormat == GL_ALPHA ||
-          baseInternalFormat == GL_LUMINANCE ||
-          baseInternalFormat == GL_LUMINANCE_ALPHA ||
-          baseInternalFormat == GL_INTENSITY);
-   ASSERT(texelBytes == components * sizeof(GLint));
-
-   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
-    * to integer formats.
-    */
-   if (!srcPacking->SwapBytes &&
-       baseInternalFormat == srcFormat &&
-       srcType == GL_INT) {
-      /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else {
-      /* general path */
-      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
-                                                 baseInternalFormat,
-                                                 baseFormat,
-                                                 srcWidth, srcHeight, srcDepth,
-                                                 srcFormat, srcType, srcAddr,
-                                                 srcPacking, 0x0);
-      const GLfloat *src = tempImage;
-      GLint img, row;
-      if (!tempImage)
-         return GL_FALSE;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            GLint *dstTexel = (GLint *) dstRow;
-            GLint i;
-            for (i = 0; i < srcWidth * components; i++) {
-               dstTexel[i] = (GLint) src[i];
-            }
-            dstRow += dstRowStride;
-            src += srcWidth * components;
-         }
-      }
-
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-
-/* non-normalized, unsigned int8 */
-static GLboolean
-_mesa_texstore_rgba_uint8(TEXSTORE_PARAMS)
-{
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
-   const GLint components = _mesa_components_in_format(baseFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_RGBA_UINT8);
-   ASSERT(baseInternalFormat == GL_RGBA ||
-          baseInternalFormat == GL_RGB ||
-          baseInternalFormat == GL_ALPHA ||
-          baseInternalFormat == GL_LUMINANCE ||
-          baseInternalFormat == GL_LUMINANCE_ALPHA ||
-          baseInternalFormat == GL_INTENSITY);
-   ASSERT(texelBytes == components * sizeof(GLubyte));
-
-   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
-    * to integer formats.
-    */
-   if (!srcPacking->SwapBytes &&
-       baseInternalFormat == srcFormat &&
-       srcType == GL_UNSIGNED_BYTE) {
-      /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else {
-      /* general path */
-      const GLuint *tempImage =
-         make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat,
-                              srcWidth, srcHeight, srcDepth,
-                              srcFormat, srcType, srcAddr, srcPacking);
-      const GLuint *src = tempImage;
-      GLint img, row;
-      if (!tempImage)
-         return GL_FALSE;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            GLubyte *dstTexel = (GLubyte *) dstRow;
-            GLint i;
-            for (i = 0; i < srcWidth * components; i++) {
-               dstTexel[i] = (GLubyte) CLAMP(src[i], 0, 0xff);
-            }
-            dstRow += dstRowStride;
-            src += srcWidth * components;
-         }
-      }
-
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-
-/* non-normalized, unsigned int16 */
-static GLboolean
-_mesa_texstore_rgba_uint16(TEXSTORE_PARAMS)
-{
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
-   const GLint components = _mesa_components_in_format(baseFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_RGBA_UINT16);
-   ASSERT(baseInternalFormat == GL_RGBA ||
-          baseInternalFormat == GL_RGB ||
-          baseInternalFormat == GL_ALPHA ||
-          baseInternalFormat == GL_LUMINANCE ||
-          baseInternalFormat == GL_LUMINANCE_ALPHA ||
-          baseInternalFormat == GL_INTENSITY);
-   ASSERT(texelBytes == components * sizeof(GLushort));
-
-   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
-    * to integer formats.
-    */
-   if (!srcPacking->SwapBytes &&
-       baseInternalFormat == srcFormat &&
-       srcType == GL_UNSIGNED_SHORT) {
-      /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else {
-      /* general path */
-      const GLuint *tempImage =
-         make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat,
-                              srcWidth, srcHeight, srcDepth,
-                              srcFormat, srcType, srcAddr, srcPacking);
-      const GLuint *src = tempImage;
-      GLint img, row;
-      if (!tempImage)
-         return GL_FALSE;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            GLushort *dstTexel = (GLushort *) dstRow;
-            GLint i;
-            for (i = 0; i < srcWidth * components; i++) {
-               dstTexel[i] = (GLushort) CLAMP(src[i], 0, 0xffff);
-            }
-            dstRow += dstRowStride;
-            src += srcWidth * components;
-         }
-      }
-
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-
-/* non-normalized, unsigned int32 */
-static GLboolean
-_mesa_texstore_rgba_uint32(TEXSTORE_PARAMS)
-{
-   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
-   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
-   const GLint components = _mesa_components_in_format(baseFormat);
-
-   ASSERT(dstFormat == MESA_FORMAT_RGBA_UINT32);
-   ASSERT(baseInternalFormat == GL_RGBA ||
-          baseInternalFormat == GL_RGB ||
-          baseInternalFormat == GL_ALPHA ||
-          baseInternalFormat == GL_LUMINANCE ||
-          baseInternalFormat == GL_LUMINANCE_ALPHA ||
-          baseInternalFormat == GL_INTENSITY);
-   ASSERT(texelBytes == components * sizeof(GLuint));
-
-   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
-    * to integer formats.
-    */
-   if (!srcPacking->SwapBytes &&
-       baseInternalFormat == srcFormat &&
-       srcType == GL_UNSIGNED_INT) {
-      /* simple memcpy path */
-      memcpy_texture(ctx, dims,
-                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                     dstRowStride,
-                     dstImageOffsets,
-                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
-                     srcAddr, srcPacking);
-   }
-   else {
-      /* general path */
-      const GLuint *tempImage =
-         make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat,
-                              srcWidth, srcHeight, srcDepth,
-                              srcFormat, srcType, srcAddr, srcPacking);
-      const GLuint *src = tempImage;
-      GLint img, row;
-      if (!tempImage)
-         return GL_FALSE;
-      for (img = 0; img < srcDepth; img++) {
-         GLubyte *dstRow = (GLubyte *) dstAddr
-            + dstImageOffsets[dstZoffset + img] * texelBytes
-            + dstYoffset * dstRowStride
-            + dstXoffset * texelBytes;
-         for (row = 0; row < srcHeight; row++) {
-            GLuint *dstTexel = (GLuint *) dstRow;
-            GLint i;
-            for (i = 0; i < srcWidth * components; i++) {
-               dstTexel[i] = src[i];
-            }
-            dstRow += dstRowStride;
-            src += srcWidth * components;
-         }
-      }
-
-      free((void *) tempImage);
-   }
-   return GL_TRUE;
-}
-
-
-
-
-#if FEATURE_EXT_texture_sRGB
-static GLboolean
-_mesa_texstore_srgb8(TEXSTORE_PARAMS)
-{
-   gl_format newDstFormat;
-   GLboolean k;
-
-   ASSERT(dstFormat == MESA_FORMAT_SRGB8);
-
-   /* reuse normal rgb texstore code */
-   newDstFormat = MESA_FORMAT_RGB888;
-
-   k = _mesa_texstore_rgb888(ctx, dims, baseInternalFormat,
-                             newDstFormat, dstAddr,
-                             dstXoffset, dstYoffset, dstZoffset,
-                             dstRowStride, dstImageOffsets,
-                             srcWidth, srcHeight, srcDepth,
-                             srcFormat, srcType,
-                             srcAddr, srcPacking);
-   return k;
-}
-
-
-static GLboolean
-_mesa_texstore_srgba8(TEXSTORE_PARAMS)
-{
-   gl_format newDstFormat;
-   GLboolean k;
-
-   ASSERT(dstFormat == MESA_FORMAT_SRGBA8);
-
-   /* reuse normal rgba texstore code */
-   newDstFormat = MESA_FORMAT_RGBA8888;
-   k = _mesa_texstore_rgba8888(ctx, dims, baseInternalFormat,
-                               newDstFormat, dstAddr,
-                               dstXoffset, dstYoffset, dstZoffset,
-                               dstRowStride, dstImageOffsets,
-                               srcWidth, srcHeight, srcDepth,
-                               srcFormat, srcType,
-                               srcAddr, srcPacking);
-   return k;
-}
-
-
-static GLboolean
-_mesa_texstore_sargb8(TEXSTORE_PARAMS)
-{
-   gl_format newDstFormat;
-   GLboolean k;
-
-   ASSERT(dstFormat == MESA_FORMAT_SARGB8);
-
-   /* reuse normal rgba texstore code */
-   newDstFormat = MESA_FORMAT_ARGB8888;
-
-   k = _mesa_texstore_argb8888(ctx, dims, baseInternalFormat,
-                               newDstFormat, dstAddr,
-                               dstXoffset, dstYoffset, dstZoffset,
-                               dstRowStride, dstImageOffsets,
-                               srcWidth, srcHeight, srcDepth,
-                               srcFormat, srcType,
-                               srcAddr, srcPacking);
-   return k;
-}
-
-
-static GLboolean
-_mesa_texstore_sl8(TEXSTORE_PARAMS)
-{
-   gl_format newDstFormat;
-   GLboolean k;
-
-   ASSERT(dstFormat == MESA_FORMAT_SL8);
-
-   newDstFormat = MESA_FORMAT_L8;
-
-   /* _mesa_textore_a8 handles luminance8 too */
-   k = _mesa_texstore_unorm8(ctx, dims, baseInternalFormat,
-                         newDstFormat, dstAddr,
-                         dstXoffset, dstYoffset, dstZoffset,
-                         dstRowStride, dstImageOffsets,
-                         srcWidth, srcHeight, srcDepth,
-                         srcFormat, srcType,
-                         srcAddr, srcPacking);
-   return k;
-}
-
-
-static GLboolean
-_mesa_texstore_sla8(TEXSTORE_PARAMS)
-{
-   gl_format newDstFormat;
-   GLboolean k;
-
-   ASSERT(dstFormat == MESA_FORMAT_SLA8);
-
-   /* reuse normal luminance/alpha texstore code */
-   newDstFormat = MESA_FORMAT_AL88;
-
-   k = _mesa_texstore_unorm88(ctx, dims, baseInternalFormat,
-			      newDstFormat, dstAddr,
-			      dstXoffset, dstYoffset, dstZoffset,
-			      dstRowStride, dstImageOffsets,
-			      srcWidth, srcHeight, srcDepth,
-			      srcFormat, srcType,
-			      srcAddr, srcPacking);
-   return k;
-}
-
-#else
-
-/* these are used only in texstore_funcs[] below */
-#define _mesa_texstore_srgb8 NULL
-#define _mesa_texstore_srgba8 NULL
-#define _mesa_texstore_sargb8 NULL
-#define _mesa_texstore_sl8 NULL
-#define _mesa_texstore_sla8 NULL
-
-#endif /* FEATURE_EXT_texture_sRGB */
-
-
-
-
-/**
- * Table mapping MESA_FORMAT_* to _mesa_texstore_*()
- * XXX this is somewhat temporary.
- */
-static const struct {
-   gl_format Name;
-   StoreTexImageFunc Store;
-}
-texstore_funcs[MESA_FORMAT_COUNT] =
-{
-   { MESA_FORMAT_NONE, NULL },
-   { MESA_FORMAT_RGBA8888, _mesa_texstore_rgba8888 },
-   { MESA_FORMAT_RGBA8888_REV, _mesa_texstore_rgba8888 },
-   { MESA_FORMAT_ARGB8888, _mesa_texstore_argb8888 },
-   { MESA_FORMAT_ARGB8888_REV, _mesa_texstore_argb8888 },
-   { MESA_FORMAT_XRGB8888, _mesa_texstore_argb8888 },
-   { MESA_FORMAT_XRGB8888_REV, _mesa_texstore_argb8888 },
-   { MESA_FORMAT_RGB888, _mesa_texstore_rgb888 },
-   { MESA_FORMAT_BGR888, _mesa_texstore_bgr888 },
-   { MESA_FORMAT_RGB565, _mesa_texstore_rgb565 },
-   { MESA_FORMAT_RGB565_REV, _mesa_texstore_rgb565 },
-   { MESA_FORMAT_ARGB4444, _mesa_texstore_argb4444 },
-   { MESA_FORMAT_ARGB4444_REV, _mesa_texstore_argb4444 },
-   { MESA_FORMAT_RGBA5551, _mesa_texstore_rgba5551 },
-   { MESA_FORMAT_ARGB1555, _mesa_texstore_argb1555 },
-   { MESA_FORMAT_ARGB1555_REV, _mesa_texstore_argb1555 },
-   { MESA_FORMAT_AL44, _mesa_texstore_unorm44 },
-   { MESA_FORMAT_AL88, _mesa_texstore_unorm88 },
-   { MESA_FORMAT_AL88_REV, _mesa_texstore_unorm88 },
-   { MESA_FORMAT_AL1616, _mesa_texstore_unorm1616 },
-   { MESA_FORMAT_AL1616_REV, _mesa_texstore_unorm1616 },
-   { MESA_FORMAT_RGB332, _mesa_texstore_rgb332 },
-   { MESA_FORMAT_A8, _mesa_texstore_unorm8 },
-   { MESA_FORMAT_A16, _mesa_texstore_unorm16 },
-   { MESA_FORMAT_L8, _mesa_texstore_unorm8 },
-   { MESA_FORMAT_L16, _mesa_texstore_unorm16 },
-   { MESA_FORMAT_I8, _mesa_texstore_unorm8 },
-   { MESA_FORMAT_I16, _mesa_texstore_unorm16 },
-   { MESA_FORMAT_CI8, _mesa_texstore_ci8 },
-   { MESA_FORMAT_YCBCR, _mesa_texstore_ycbcr },
-   { MESA_FORMAT_YCBCR_REV, _mesa_texstore_ycbcr },
-   { MESA_FORMAT_R8, _mesa_texstore_unorm8 },
-   { MESA_FORMAT_RG88, _mesa_texstore_unorm88 },
-   { MESA_FORMAT_RG88_REV, _mesa_texstore_unorm88 },
-   { MESA_FORMAT_R16, _mesa_texstore_unorm16 },
-   { MESA_FORMAT_RG1616, _mesa_texstore_unorm1616 },
-   { MESA_FORMAT_RG1616_REV, _mesa_texstore_unorm1616 },
-   { MESA_FORMAT_ARGB2101010, _mesa_texstore_argb2101010 },
-   { MESA_FORMAT_Z24_S8, _mesa_texstore_z24_s8 },
-   { MESA_FORMAT_S8_Z24, _mesa_texstore_s8_z24 },
-   { MESA_FORMAT_Z16, _mesa_texstore_z16 },
-   { MESA_FORMAT_X8_Z24, _mesa_texstore_x8_z24 },
-   { MESA_FORMAT_Z24_X8, _mesa_texstore_z24_x8 },
-   { MESA_FORMAT_Z32, _mesa_texstore_z32 },
-   { MESA_FORMAT_S8, _mesa_texstore_s8 },
-   { MESA_FORMAT_SRGB8, _mesa_texstore_srgb8 },
-   { MESA_FORMAT_SRGBA8, _mesa_texstore_srgba8 },
-   { MESA_FORMAT_SARGB8, _mesa_texstore_sargb8 },
-   { MESA_FORMAT_SL8, _mesa_texstore_sl8 },
-   { MESA_FORMAT_SLA8, _mesa_texstore_sla8 },
-   { MESA_FORMAT_SRGB_DXT1, _mesa_texstore_rgb_dxt1 },
-   { MESA_FORMAT_SRGBA_DXT1, _mesa_texstore_rgba_dxt1 },
-   { MESA_FORMAT_SRGBA_DXT3, _mesa_texstore_rgba_dxt3 },
-   { MESA_FORMAT_SRGBA_DXT5, _mesa_texstore_rgba_dxt5 },
-   { MESA_FORMAT_RGB_FXT1, _mesa_texstore_rgb_fxt1 },
-   { MESA_FORMAT_RGBA_FXT1, _mesa_texstore_rgba_fxt1 },
-   { MESA_FORMAT_RGB_DXT1, _mesa_texstore_rgb_dxt1 },
-   { MESA_FORMAT_RGBA_DXT1, _mesa_texstore_rgba_dxt1 },
-   { MESA_FORMAT_RGBA_DXT3, _mesa_texstore_rgba_dxt3 },
-   { MESA_FORMAT_RGBA_DXT5, _mesa_texstore_rgba_dxt5 },
-   { MESA_FORMAT_RGBA_FLOAT32, _mesa_texstore_rgba_float32 },
-   { MESA_FORMAT_RGBA_FLOAT16, _mesa_texstore_rgba_float16 },
-   { MESA_FORMAT_RGB_FLOAT32, _mesa_texstore_rgba_float32 },
-   { MESA_FORMAT_RGB_FLOAT16, _mesa_texstore_rgba_float16 },
-   { MESA_FORMAT_ALPHA_FLOAT32, _mesa_texstore_rgba_float32 },
-   { MESA_FORMAT_ALPHA_FLOAT16, _mesa_texstore_rgba_float16 },
-   { MESA_FORMAT_LUMINANCE_FLOAT32, _mesa_texstore_rgba_float32 },
-   { MESA_FORMAT_LUMINANCE_FLOAT16, _mesa_texstore_rgba_float16 },
-   { MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32, _mesa_texstore_rgba_float32 },
-   { MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16, _mesa_texstore_rgba_float16 },
-   { MESA_FORMAT_INTENSITY_FLOAT32, _mesa_texstore_rgba_float32 },
-   { MESA_FORMAT_INTENSITY_FLOAT16, _mesa_texstore_rgba_float16 },
-
-   { MESA_FORMAT_RGBA_INT8, _mesa_texstore_rgba_int8 },
-   { MESA_FORMAT_RGBA_INT16, _mesa_texstore_rgba_int16 },
-   { MESA_FORMAT_RGBA_INT32, _mesa_texstore_rgba_int32 },
-   { MESA_FORMAT_RGBA_UINT8, _mesa_texstore_rgba_uint8 },
-   { MESA_FORMAT_RGBA_UINT16, _mesa_texstore_rgba_uint16 },
-   { MESA_FORMAT_RGBA_UINT32, _mesa_texstore_rgba_uint32 },
-
-   { MESA_FORMAT_DUDV8, _mesa_texstore_dudv8 },
-
-   { MESA_FORMAT_SIGNED_R8, _mesa_texstore_signed_r8 },
-   { MESA_FORMAT_SIGNED_RG88, _mesa_texstore_signed_rg88 },
-   { MESA_FORMAT_SIGNED_RGBX8888, _mesa_texstore_signed_rgbx8888 },
-
-   { MESA_FORMAT_SIGNED_RGBA8888, _mesa_texstore_signed_rgba8888 },
-   { MESA_FORMAT_SIGNED_RGBA8888_REV, _mesa_texstore_signed_rgba8888 },
-
-   { MESA_FORMAT_SIGNED_R_16, _mesa_texstore_signed_rgba_16 },
-   { MESA_FORMAT_SIGNED_RG_16, _mesa_texstore_signed_rgba_16 },
-   { MESA_FORMAT_SIGNED_RGB_16, _mesa_texstore_signed_rgba_16 },
-   { MESA_FORMAT_SIGNED_RGBA_16, _mesa_texstore_signed_rgba_16 },
-   { MESA_FORMAT_RGBA_16, _mesa_texstore_rgba_16 },
-
-   { MESA_FORMAT_RED_RGTC1, _mesa_texstore_red_rgtc1 },
-   { MESA_FORMAT_SIGNED_RED_RGTC1, _mesa_texstore_signed_red_rgtc1 },
-   { MESA_FORMAT_RG_RGTC2, _mesa_texstore_rg_rgtc2 },
-   { MESA_FORMAT_SIGNED_RG_RGTC2, _mesa_texstore_signed_rg_rgtc2 },
-
-   /* Re-use the R/RG texstore functions.
-    * The code is generic enough to handle LATC too. */
-   { MESA_FORMAT_L_LATC1, _mesa_texstore_red_rgtc1 },
-   { MESA_FORMAT_SIGNED_L_LATC1, _mesa_texstore_signed_red_rgtc1 },
-   { MESA_FORMAT_LA_LATC2, _mesa_texstore_rg_rgtc2 },
-   { MESA_FORMAT_SIGNED_LA_LATC2, _mesa_texstore_signed_rg_rgtc2 }
-};
-
-
-static GLboolean
-_mesa_texstore_null(TEXSTORE_PARAMS)
-{
-   (void) ctx; (void) dims;
-   (void) baseInternalFormat;
-   (void) dstFormat;
-   (void) dstAddr;
-   (void) dstXoffset; (void) dstYoffset; (void) dstZoffset;
-   (void) dstRowStride; (void) dstImageOffsets;
-   (void) srcWidth; (void) srcHeight; (void) srcDepth;
-   (void) srcFormat; (void) srcType;
-   (void) srcAddr;
-   (void) srcPacking;
-
-   /* should never happen */
-   _mesa_problem(NULL, "_mesa_texstore_null() is called");
-   return GL_FALSE;
-}
-
-
-/**
- * Return the StoreTexImageFunc pointer to store an image in the given format.
- */
-static StoreTexImageFunc
-_mesa_get_texstore_func(gl_format format)
-{
-#ifdef DEBUG
-   GLuint i;
-   for (i = 0; i < MESA_FORMAT_COUNT; i++) {
-      ASSERT(texstore_funcs[i].Name == i);
-   }
-#endif
-   ASSERT(texstore_funcs[format].Name == format);
-
-   if (texstore_funcs[format].Store)
-      return texstore_funcs[format].Store;
-   else
-      return _mesa_texstore_null;
-}
-
-
-/**
- * Store user data into texture memory.
- * Called via glTex[Sub]Image1/2/3D()
- */
-GLboolean
-_mesa_texstore(TEXSTORE_PARAMS)
-{
-   StoreTexImageFunc storeImage;
-   GLboolean success;
-
-   storeImage = _mesa_get_texstore_func(dstFormat);
-
-   success = storeImage(ctx, dims, baseInternalFormat,
-                        dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
-                        dstRowStride, dstImageOffsets,
-                        srcWidth, srcHeight, srcDepth,
-                        srcFormat, srcType, srcAddr, srcPacking);
-   return success;
-}
-
-
-/** Return texture size in bytes */
-static GLuint
-texture_size(const struct gl_texture_image *texImage)
-{
-   GLuint sz = _mesa_format_image_size(texImage->TexFormat, texImage->Width,
-                                       texImage->Height, texImage->Depth);
-   return sz;
-}
-
-
-/** Return row stride in bytes */
-static GLuint
-texture_row_stride(const struct gl_texture_image *texImage)
-{
-   GLuint stride = _mesa_format_row_stride(texImage->TexFormat,
-                                           texImage->Width);
-   return stride;
-}
-
-
-
-/**
- * This is the software fallback for Driver.TexImage1D()
- * and Driver.CopyTexImage1D().
- * \sa _mesa_store_teximage2d()
- */
-void
-_mesa_store_teximage1d(struct gl_context *ctx, GLenum target, GLint level,
-                       GLint internalFormat,
-                       GLint width, GLint border,
-                       GLenum format, GLenum type, const GLvoid *pixels,
-                       const struct gl_pixelstore_attrib *packing,
-                       struct gl_texture_object *texObj,
-                       struct gl_texture_image *texImage)
-{
-   GLuint sizeInBytes;
-   (void) border;
-
-   /* allocate memory */
-   sizeInBytes = texture_size(texImage);
-   texImage->Data = _mesa_alloc_texmemory(sizeInBytes);
-   if (!texImage->Data) {
-      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D");
-      return;
-   }
-
-   pixels = _mesa_validate_pbo_teximage(ctx, 1, width, 1, 1, format, type,
-                                        pixels, packing, "glTexImage1D");
-   if (!pixels) {
-      /* Note: we check for a NULL image pointer here, _after_ we allocated
-       * memory for the texture.  That's what the GL spec calls for.
-       */
-      return;
-   }
-   else {
-      const GLint dstRowStride = 0;
-      GLboolean success = _mesa_texstore(ctx, 1, texImage->_BaseFormat,
-                                         texImage->TexFormat,
-                                         texImage->Data,
-                                         0, 0, 0,  /* dstX/Y/Zoffset */
-                                         dstRowStride,
-                                         texImage->ImageOffsets,
-                                         width, 1, 1,
-                                         format, type, pixels, packing);
-      if (!success) {
-         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D");
-      }
-   }
-
-   _mesa_unmap_teximage_pbo(ctx, packing);
-}
-
-
-/**
- * This is the software fallback for Driver.TexImage2D()
- * and Driver.CopyTexImage2D().
- *
- * This function is oriented toward storing images in main memory, rather
- * than VRAM.  Device driver's can easily plug in their own replacement.
- */
-void
-_mesa_store_teximage2d(struct gl_context *ctx, GLenum target, GLint level,
-                       GLint internalFormat,
-                       GLint width, GLint height, GLint border,
-                       GLenum format, GLenum type, const void *pixels,
-                       const struct gl_pixelstore_attrib *packing,
-                       struct gl_texture_object *texObj,
-                       struct gl_texture_image *texImage)
-{
-   GLuint sizeInBytes;
-   (void) border;
-
-   /* allocate memory */
-   sizeInBytes = texture_size(texImage);
-   texImage->Data = _mesa_alloc_texmemory(sizeInBytes);
-   if (!texImage->Data) {
-      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");
-      return;
-   }
-
-   pixels = _mesa_validate_pbo_teximage(ctx, 2, width, height, 1, format, type,
-                                        pixels, packing, "glTexImage2D");
-   if (!pixels) {
-      /* Note: we check for a NULL image pointer here, _after_ we allocated
-       * memory for the texture.  That's what the GL spec calls for.
-       */
-      return;
-   }
-   else {
-      GLint dstRowStride = texture_row_stride(texImage);
-      GLboolean success = _mesa_texstore(ctx, 2, texImage->_BaseFormat,
-                                         texImage->TexFormat,
-                                         texImage->Data,
-                                         0, 0, 0,  /* dstX/Y/Zoffset */
-                                         dstRowStride,
-                                         texImage->ImageOffsets,
-                                         width, height, 1,
-                                         format, type, pixels, packing);
-      if (!success) {
-         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");
-      }
-   }
-
-   _mesa_unmap_teximage_pbo(ctx, packing);
-}
-
-
-
-/**
- * This is the software fallback for Driver.TexImage3D()
- * and Driver.CopyTexImage3D().
- * \sa _mesa_store_teximage2d()
- */
-void
-_mesa_store_teximage3d(struct gl_context *ctx, GLenum target, GLint level,
-                       GLint internalFormat,
-                       GLint width, GLint height, GLint depth, GLint border,
-                       GLenum format, GLenum type, const void *pixels,
-                       const struct gl_pixelstore_attrib *packing,
-                       struct gl_texture_object *texObj,
-                       struct gl_texture_image *texImage)
-{
-   GLuint sizeInBytes;
-   (void) border;
-
-   /* allocate memory */
-   sizeInBytes = texture_size(texImage);
-   texImage->Data = _mesa_alloc_texmemory(sizeInBytes);
-   if (!texImage->Data) {
-      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D");
-      return;
-   }
-
-   pixels = _mesa_validate_pbo_teximage(ctx, 3, width, height, depth, format,
-                                        type, pixels, packing, "glTexImage3D");
-   if (!pixels) {
-      /* Note: we check for a NULL image pointer here, _after_ we allocated
-       * memory for the texture.  That's what the GL spec calls for.
-       */
-      return;
-   }
-   else {
-      GLint dstRowStride = texture_row_stride(texImage);
-      GLboolean success = _mesa_texstore(ctx, 3, texImage->_BaseFormat,
-                                         texImage->TexFormat,
-                                         texImage->Data,
-                                         0, 0, 0,  /* dstX/Y/Zoffset */
-                                         dstRowStride,
-                                         texImage->ImageOffsets,
-                                         width, height, depth,
-                                         format, type, pixels, packing);
-      if (!success) {
-         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D");
-      }
-   }
-
-   _mesa_unmap_teximage_pbo(ctx, packing);
-}
-
-
-
-
-/*
- * This is the software fallback for Driver.TexSubImage1D()
- * and Driver.CopyTexSubImage1D().
- */
-void
-_mesa_store_texsubimage1d(struct gl_context *ctx, GLenum target, GLint level,
-                          GLint xoffset, GLint width,
-                          GLenum format, GLenum type, const void *pixels,
-                          const struct gl_pixelstore_attrib *packing,
-                          struct gl_texture_object *texObj,
-                          struct gl_texture_image *texImage)
-{
-   /* get pointer to src pixels (may be in a pbo which we'll map here) */
-   pixels = _mesa_validate_pbo_teximage(ctx, 1, width, 1, 1, format, type,
-                                        pixels, packing, "glTexSubImage1D");
-   if (!pixels)
-      return;
-
-   {
-      const GLint dstRowStride = 0;
-      GLboolean success = _mesa_texstore(ctx, 1, texImage->_BaseFormat,
-                                         texImage->TexFormat,
-                                         texImage->Data,
-                                         xoffset, 0, 0,  /* offsets */
-                                         dstRowStride,
-                                         texImage->ImageOffsets,
-                                         width, 1, 1,
-                                         format, type, pixels, packing);
-      if (!success) {
-         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage1D");
-      }
-   }
-
-   _mesa_unmap_teximage_pbo(ctx, packing);
-}
-
-
-
-/**
- * This is the software fallback for Driver.TexSubImage2D()
- * and Driver.CopyTexSubImage2D().
- */
-void
-_mesa_store_texsubimage2d(struct gl_context *ctx, GLenum target, GLint level,
-                          GLint xoffset, GLint yoffset,
-                          GLint width, GLint height,
-                          GLenum format, GLenum type, const void *pixels,
-                          const struct gl_pixelstore_attrib *packing,
-                          struct gl_texture_object *texObj,
-                          struct gl_texture_image *texImage)
-{
-   /* get pointer to src pixels (may be in a pbo which we'll map here) */
-   pixels = _mesa_validate_pbo_teximage(ctx, 2, width, height, 1, format, type,
-                                        pixels, packing, "glTexSubImage2D");
-   if (!pixels)
-      return;
-
-   {
-      GLint dstRowStride = texture_row_stride(texImage);
-      GLboolean success = _mesa_texstore(ctx, 2, texImage->_BaseFormat,
-                                         texImage->TexFormat,
-                                         texImage->Data,
-                                         xoffset, yoffset, 0,
-                                         dstRowStride,
-                                         texImage->ImageOffsets,
-                                         width, height, 1,
-                                         format, type, pixels, packing);
-      if (!success) {
-         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage2D");
-      }
-   }
-
-   _mesa_unmap_teximage_pbo(ctx, packing);
-}
-
-
-/*
- * This is the software fallback for Driver.TexSubImage3D().
- * and Driver.CopyTexSubImage3D().
- */
-void
-_mesa_store_texsubimage3d(struct gl_context *ctx, GLenum target, GLint level,
-                          GLint xoffset, GLint yoffset, GLint zoffset,
-                          GLint width, GLint height, GLint depth,
-                          GLenum format, GLenum type, const void *pixels,
-                          const struct gl_pixelstore_attrib *packing,
-                          struct gl_texture_object *texObj,
-                          struct gl_texture_image *texImage)
-{
-   /* get pointer to src pixels (may be in a pbo which we'll map here) */
-   pixels = _mesa_validate_pbo_teximage(ctx, 3, width, height, depth, format,
-                                        type, pixels, packing,
-                                        "glTexSubImage3D");
-   if (!pixels)
-      return;
-
-   {
-      GLint dstRowStride = texture_row_stride(texImage);
-      GLboolean success = _mesa_texstore(ctx, 3, texImage->_BaseFormat,
-                                         texImage->TexFormat,
-                                         texImage->Data,
-                                         xoffset, yoffset, zoffset,
-                                         dstRowStride,
-                                         texImage->ImageOffsets,
-                                         width, height, depth,
-                                         format, type, pixels, packing);
-      if (!success) {
-         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage3D");
-      }
-   }
-
-   _mesa_unmap_teximage_pbo(ctx, packing);
-}
-
-
-/*
- * Fallback for Driver.CompressedTexImage1D()
- */
-void
-_mesa_store_compressed_teximage1d(struct gl_context *ctx,
-                                  GLenum target, GLint level,
-                                  GLint internalFormat,
-                                  GLint width, GLint border,
-                                  GLsizei imageSize, const GLvoid *data,
-                                  struct gl_texture_object *texObj,
-                                  struct gl_texture_image *texImage)
-{
-   /* this space intentionally left blank */
-   (void) ctx;
-   (void) target; (void) level;
-   (void) internalFormat;
-   (void) width; (void) border;
-   (void) imageSize; (void) data;
-   (void) texObj;
-   (void) texImage;
-}
-
-
-
-/**
- * Fallback for Driver.CompressedTexImage2D()
- */
-void
-_mesa_store_compressed_teximage2d(struct gl_context *ctx,
-                                  GLenum target, GLint level,
-                                  GLint internalFormat,
-                                  GLint width, GLint height, GLint border,
-                                  GLsizei imageSize, const GLvoid *data,
-                                  struct gl_texture_object *texObj,
-                                  struct gl_texture_image *texImage)
-{
-   (void) width; (void) height; (void) border;
-
-   /* This is pretty simple, basically just do a memcpy without worrying
-    * about the usual image unpacking or image transfer operations.
-    */
-   ASSERT(texObj);
-   ASSERT(texImage);
-   ASSERT(texImage->Width > 0);
-   ASSERT(texImage->Height > 0);
-   ASSERT(texImage->Depth == 1);
-   ASSERT(texImage->Data == NULL); /* was freed in glCompressedTexImage2DARB */
-
-   /* allocate storage */
-   texImage->Data = _mesa_alloc_texmemory(imageSize);
-   if (!texImage->Data) {
-      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2DARB");
-      return;
-   }
-
-   data = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, data,
-                                                 &ctx->Unpack,
-                                                 "glCompressedTexImage2D");
-   if (!data)
-      return;
-
-   /* copy the data */
-   memcpy(texImage->Data, data, imageSize);
-
-   _mesa_unmap_teximage_pbo(ctx, &ctx->Unpack);
-}
-
-
-
-/*
- * Fallback for Driver.CompressedTexImage3D()
- */
-void
-_mesa_store_compressed_teximage3d(struct gl_context *ctx,
-                                  GLenum target, GLint level,
-                                  GLint internalFormat,
-                                  GLint width, GLint height, GLint depth,
-                                  GLint border,
-                                  GLsizei imageSize, const GLvoid *data,
-                                  struct gl_texture_object *texObj,
-                                  struct gl_texture_image *texImage)
-{
-   /* this space intentionally left blank */
-   (void) ctx;
-   (void) target; (void) level;
-   (void) internalFormat;
-   (void) width; (void) height; (void) depth;
-   (void) border;
-   (void) imageSize; (void) data;
-   (void) texObj;
-   (void) texImage;
-}
-
-
-
-/**
- * Fallback for Driver.CompressedTexSubImage1D()
- */
-void
-_mesa_store_compressed_texsubimage1d(struct gl_context *ctx, GLenum target,
-                                     GLint level,
-                                     GLint xoffset, GLsizei width,
-                                     GLenum format,
-                                     GLsizei imageSize, const GLvoid *data,
-                                     struct gl_texture_object *texObj,
-                                     struct gl_texture_image *texImage)
-{
-   /* there are no compressed 1D texture formats yet */
-   (void) ctx;
-   (void) target; (void) level;
-   (void) xoffset; (void) width;
-   (void) format;
-   (void) imageSize; (void) data;
-   (void) texObj;
-   (void) texImage;
-}
-
-
-/**
- * Fallback for Driver.CompressedTexSubImage2D()
- */
-void
-_mesa_store_compressed_texsubimage2d(struct gl_context *ctx, GLenum target,
-                                     GLint level,
-                                     GLint xoffset, GLint yoffset,
-                                     GLsizei width, GLsizei height,
-                                     GLenum format,
-                                     GLsizei imageSize, const GLvoid *data,
-                                     struct gl_texture_object *texObj,
-                                     struct gl_texture_image *texImage)
-{
-   GLint bytesPerRow, destRowStride, srcRowStride;
-   GLint i, rows;
-   GLubyte *dest;
-   const GLubyte *src;
-   const gl_format texFormat = texImage->TexFormat;
-   const GLint destWidth = texImage->Width;
-   GLuint bw, bh;
-
-   _mesa_get_format_block_size(texFormat, &bw, &bh);
-
-   (void) level;
-   (void) format;
-
-   /* these should have been caught sooner */
-   ASSERT((width % bw) == 0 || width == 2 || width == 1);
-   ASSERT((height % bh) == 0 || height == 2 || height == 1);
-   ASSERT((xoffset % bw) == 0);
-   ASSERT((yoffset % bh) == 0);
-
-   /* get pointer to src pixels (may be in a pbo which we'll map here) */
-   data = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, data,
-                                                 &ctx->Unpack,
-                                                 "glCompressedTexSubImage2D");
-   if (!data)
-      return;
-
-   srcRowStride = _mesa_format_row_stride(texFormat, width);
-   src = (const GLubyte *) data;
-
-   destRowStride = _mesa_format_row_stride(texFormat, destWidth);
-   dest = _mesa_compressed_image_address(xoffset, yoffset, 0,
-                                         texFormat, destWidth,
-                                         (GLubyte *) texImage->Data);
-
-   bytesPerRow = srcRowStride;  /* bytes per row of blocks */
-   rows = height / bh;  /* rows in blocks */
-
-   /* copy rows of blocks */
-   for (i = 0; i < rows; i++) {
-      memcpy(dest, src, bytesPerRow);
-      dest += destRowStride;
-      src += srcRowStride;
-   }
-
-   _mesa_unmap_teximage_pbo(ctx, &ctx->Unpack);
-}
-
-
-/**
- * Fallback for Driver.CompressedTexSubImage3D()
- */
-void
-_mesa_store_compressed_texsubimage3d(struct gl_context *ctx, GLenum target,
-                                GLint level,
-                                GLint xoffset, GLint yoffset, GLint zoffset,
-                                GLsizei width, GLsizei height, GLsizei depth,
-                                GLenum format,
-                                GLsizei imageSize, const GLvoid *data,
-                                struct gl_texture_object *texObj,
-                                struct gl_texture_image *texImage)
-{
-   /* there are no compressed 3D texture formats yet */
-   (void) ctx;
-   (void) target; (void) level;
-   (void) xoffset; (void) yoffset; (void) zoffset;
-   (void) width; (void) height; (void) depth;
-   (void) format;
-   (void) imageSize; (void) data;
-   (void) texObj;
-   (void) texImage;
-}
+/*
+ * Mesa 3-D graphics library
+ * Version:  7.5
+ *
+ * Copyright (C) 1999-2008  Brian Paul   All Rights Reserved.
+ * Copyright (c) 2008-2009  VMware, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/*
+ * Authors:
+ *   Brian Paul
+ */
+
+/**
+ * The GL texture image functions in teximage.c basically just do
+ * error checking and data structure allocation.  They in turn call
+ * device driver functions which actually copy/convert/store the user's
+ * texture image data.
+ *
+ * However, most device drivers will be able to use the fallback functions
+ * in this file.  That is, most drivers will have the following bit of
+ * code:
+ *   ctx->Driver.TexImage1D = _mesa_store_teximage1d;
+ *   ctx->Driver.TexImage2D = _mesa_store_teximage2d;
+ *   ctx->Driver.TexImage3D = _mesa_store_teximage3d;
+ *   etc...
+ *
+ * Texture image processing is actually kind of complicated.  We have to do:
+ *    Format/type conversions
+ *    pixel unpacking
+ *    pixel transfer (scale, bais, lookup, etc)
+ *
+ * These functions can handle most everything, including processing full
+ * images and sub-images.
+ */
+
+
+#include "glheader.h"
+#include "bufferobj.h"
+#include "colormac.h"
+#include "image.h"
+#include "macros.h"
+#include "mipmap.h"
+#include "mfeatures.h"
+#include "mtypes.h"
+#include "pack.h"
+#include "pbo.h"
+#include "imports.h"
+#include "pack.h"
+#include "texcompress.h"
+#include "texcompress_fxt1.h"
+#include "texcompress_rgtc.h"
+#include "texcompress_s3tc.h"
+#include "teximage.h"
+#include "texstore.h"
+#include "enums.h"
+
+
+enum {
+   ZERO = 4, 
+   ONE = 5
+};
+
+
+/**
+ * Texture image storage function.
+ */
+typedef GLboolean (*StoreTexImageFunc)(TEXSTORE_PARAMS);
+
+
+/**
+ * Return GL_TRUE if the given image format is one that be converted
+ * to another format by swizzling.
+ */
+static GLboolean
+can_swizzle(GLenum logicalBaseFormat)
+{
+   switch (logicalBaseFormat) {
+   case GL_RGBA:
+   case GL_RGB:
+   case GL_LUMINANCE_ALPHA:
+   case GL_INTENSITY:
+   case GL_ALPHA:
+   case GL_LUMINANCE:
+   case GL_RED:
+   case GL_GREEN:
+   case GL_BLUE:
+   case GL_BGR:
+   case GL_BGRA:
+   case GL_ABGR_EXT:
+   case GL_RG:
+      return GL_TRUE;
+   default:
+      return GL_FALSE;
+   }
+}
+
+
+
+enum {
+   IDX_LUMINANCE = 0,
+   IDX_ALPHA,
+   IDX_INTENSITY,
+   IDX_LUMINANCE_ALPHA,
+   IDX_RGB,
+   IDX_RGBA,
+   IDX_RED,
+   IDX_GREEN,
+   IDX_BLUE,
+   IDX_BGR,
+   IDX_BGRA,
+   IDX_ABGR,
+   IDX_RG,
+   MAX_IDX
+};
+
+#define MAP1(x)       MAP4(x, ZERO, ZERO, ZERO)
+#define MAP2(x,y)     MAP4(x, y, ZERO, ZERO)
+#define MAP3(x,y,z)   MAP4(x, y, z, ZERO)
+#define MAP4(x,y,z,w) { x, y, z, w, ZERO, ONE }
+
+
+static const struct {
+   GLubyte format_idx;
+   GLubyte to_rgba[6];
+   GLubyte from_rgba[6];
+} mappings[MAX_IDX] = 
+{
+   {
+      IDX_LUMINANCE,
+      MAP4(0,0,0,ONE),
+      MAP1(0)
+   },
+
+   {
+      IDX_ALPHA,
+      MAP4(ZERO, ZERO, ZERO, 0),
+      MAP1(3)
+   },
+
+   {
+      IDX_INTENSITY,
+      MAP4(0, 0, 0, 0),
+      MAP1(0),
+   },
+
+   {
+      IDX_LUMINANCE_ALPHA,
+      MAP4(0,0,0,1),
+      MAP2(0,3)
+   },
+
+   {
+      IDX_RGB,
+      MAP4(0,1,2,ONE),
+      MAP3(0,1,2)
+   },
+
+   {
+      IDX_RGBA,
+      MAP4(0,1,2,3),
+      MAP4(0,1,2,3),
+   },
+
+   {
+      IDX_RED,
+      MAP4(0, ZERO, ZERO, ONE),
+      MAP1(0),
+   },
+
+   {
+      IDX_GREEN,
+      MAP4(ZERO, 0, ZERO, ONE),
+      MAP1(1),
+   },
+
+   {
+      IDX_BLUE,
+      MAP4(ZERO, ZERO, 0, ONE),
+      MAP1(2),
+   },
+
+   {
+      IDX_BGR,
+      MAP4(2,1,0,ONE),
+      MAP3(2,1,0)
+   },
+
+   {
+      IDX_BGRA,
+      MAP4(2,1,0,3),
+      MAP4(2,1,0,3)
+   },
+
+   {
+      IDX_ABGR,
+      MAP4(3,2,1,0),
+      MAP4(3,2,1,0)
+   },
+
+   {
+      IDX_RG,
+      MAP4(0, 1, ZERO, ONE),
+      MAP2(0, 1)
+   },
+};
+
+
+
+/**
+ * Convert a GL image format enum to an IDX_* value (see above).
+ */
+static int
+get_map_idx(GLenum value)
+{
+   switch (value) {
+   case GL_LUMINANCE: return IDX_LUMINANCE;
+   case GL_ALPHA: return IDX_ALPHA;
+   case GL_INTENSITY: return IDX_INTENSITY;
+   case GL_LUMINANCE_ALPHA: return IDX_LUMINANCE_ALPHA;
+   case GL_RGB: return IDX_RGB;
+   case GL_RGBA: return IDX_RGBA;
+   case GL_RED: return IDX_RED;
+   case GL_GREEN: return IDX_GREEN;
+   case GL_BLUE: return IDX_BLUE;
+   case GL_BGR: return IDX_BGR;
+   case GL_BGRA: return IDX_BGRA;
+   case GL_ABGR_EXT: return IDX_ABGR;
+   case GL_RG: return IDX_RG;
+   default:
+      _mesa_problem(NULL, "Unexpected inFormat");
+      return 0;
+   }
+}   
+
+
+/**
+ * When promoting texture formats (see below) we need to compute the
+ * mapping of dest components back to source components.
+ * This function does that.
+ * \param inFormat  the incoming format of the texture
+ * \param outFormat  the final texture format
+ * \return map[6]  a full 6-component map
+ */
+static void
+compute_component_mapping(GLenum inFormat, GLenum outFormat, 
+			  GLubyte *map)
+{
+   const int inFmt = get_map_idx(inFormat);
+   const int outFmt = get_map_idx(outFormat);
+   const GLubyte *in2rgba = mappings[inFmt].to_rgba;
+   const GLubyte *rgba2out = mappings[outFmt].from_rgba;
+   int i;
+   
+   for (i = 0; i < 4; i++)
+      map[i] = in2rgba[rgba2out[i]];
+
+   map[ZERO] = ZERO;
+   map[ONE] = ONE;   
+
+#if 0
+   printf("from %x/%s to %x/%s map %d %d %d %d %d %d\n",
+	  inFormat, _mesa_lookup_enum_by_nr(inFormat),
+	  outFormat, _mesa_lookup_enum_by_nr(outFormat),
+	  map[0], 
+	  map[1], 
+	  map[2], 
+	  map[3], 
+	  map[4], 
+	  map[5]); 
+#endif
+}
+
+
+/**
+ * Make a temporary (color) texture image with GLfloat components.
+ * Apply all needed pixel unpacking and pixel transfer operations.
+ * Note that there are both logicalBaseFormat and textureBaseFormat parameters.
+ * Suppose the user specifies GL_LUMINANCE as the internal texture format
+ * but the graphics hardware doesn't support luminance textures.  So, we might
+ * use an RGB hardware format instead.
+ * If logicalBaseFormat != textureBaseFormat we have some extra work to do.
+ *
+ * \param ctx  the rendering context
+ * \param dims  image dimensions: 1, 2 or 3
+ * \param logicalBaseFormat  basic texture derived from the user's
+ *    internal texture format value
+ * \param textureBaseFormat  the actual basic format of the texture
+ * \param srcWidth  source image width
+ * \param srcHeight  source image height
+ * \param srcDepth  source image depth
+ * \param srcFormat  source image format
+ * \param srcType  source image type
+ * \param srcAddr  source image address
+ * \param srcPacking  source image pixel packing
+ * \return resulting image with format = textureBaseFormat and type = GLfloat.
+ */
+GLfloat *
+_mesa_make_temp_float_image(struct gl_context *ctx, GLuint dims,
+			    GLenum logicalBaseFormat,
+			    GLenum textureBaseFormat,
+			    GLint srcWidth, GLint srcHeight, GLint srcDepth,
+			    GLenum srcFormat, GLenum srcType,
+			    const GLvoid *srcAddr,
+			    const struct gl_pixelstore_attrib *srcPacking,
+			    GLbitfield transferOps)
+{
+   GLfloat *tempImage;
+   const GLint components = _mesa_components_in_format(logicalBaseFormat);
+   const GLint srcStride =
+      _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
+   GLfloat *dst;
+   GLint img, row;
+
+   ASSERT(dims >= 1 && dims <= 3);
+
+   ASSERT(logicalBaseFormat == GL_RGBA ||
+          logicalBaseFormat == GL_RGB ||
+          logicalBaseFormat == GL_RG ||
+          logicalBaseFormat == GL_RED ||
+          logicalBaseFormat == GL_LUMINANCE_ALPHA ||
+          logicalBaseFormat == GL_LUMINANCE ||
+          logicalBaseFormat == GL_ALPHA ||
+          logicalBaseFormat == GL_INTENSITY ||
+          logicalBaseFormat == GL_COLOR_INDEX ||
+          logicalBaseFormat == GL_DEPTH_COMPONENT);
+
+   ASSERT(textureBaseFormat == GL_RGBA ||
+          textureBaseFormat == GL_RGB ||
+          textureBaseFormat == GL_RG ||
+          textureBaseFormat == GL_RED ||
+          textureBaseFormat == GL_LUMINANCE_ALPHA ||
+          textureBaseFormat == GL_LUMINANCE ||
+          textureBaseFormat == GL_ALPHA ||
+          textureBaseFormat == GL_INTENSITY ||
+          textureBaseFormat == GL_COLOR_INDEX ||
+          textureBaseFormat == GL_DEPTH_COMPONENT);
+
+   tempImage = (GLfloat *) malloc(srcWidth * srcHeight * srcDepth
+				  * components * sizeof(GLfloat));
+   if (!tempImage)
+      return NULL;
+
+   dst = tempImage;
+   for (img = 0; img < srcDepth; img++) {
+      const GLubyte *src
+	 = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
+						 srcWidth, srcHeight,
+						 srcFormat, srcType,
+						 img, 0, 0);
+      for (row = 0; row < srcHeight; row++) {
+	 _mesa_unpack_color_span_float(ctx, srcWidth, logicalBaseFormat,
+				       dst, srcFormat, srcType, src,
+				       srcPacking, transferOps);
+	 dst += srcWidth * components;
+	 src += srcStride;
+      }
+   }
+
+   if (logicalBaseFormat != textureBaseFormat) {
+      /* more work */
+      GLint texComponents = _mesa_components_in_format(textureBaseFormat);
+      GLint logComponents = _mesa_components_in_format(logicalBaseFormat);
+      GLfloat *newImage;
+      GLint i, n;
+      GLubyte map[6];
+
+      /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */
+      ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA ||
+             textureBaseFormat == GL_LUMINANCE_ALPHA);
+
+      /* The actual texture format should have at least as many components
+       * as the logical texture format.
+       */
+      ASSERT(texComponents >= logComponents);
+
+      newImage = (GLfloat *) malloc(srcWidth * srcHeight * srcDepth
+                                          * texComponents * sizeof(GLfloat));
+      if (!newImage) {
+         free(tempImage);
+         return NULL;
+      }
+
+      compute_component_mapping(logicalBaseFormat, textureBaseFormat, map);
+
+      n = srcWidth * srcHeight * srcDepth;
+      for (i = 0; i < n; i++) {
+         GLint k;
+         for (k = 0; k < texComponents; k++) {
+            GLint j = map[k];
+            if (j == ZERO)
+               newImage[i * texComponents + k] = 0.0F;
+            else if (j == ONE)
+               newImage[i * texComponents + k] = 1.0F;
+            else
+               newImage[i * texComponents + k] = tempImage[i * logComponents + j];
+         }
+      }
+
+      free(tempImage);
+      tempImage = newImage;
+   }
+
+   return tempImage;
+}
+
+
+/**
+ * Make temporary image with uint pixel values.  Used for unsigned
+ * integer-valued textures.
+ */
+static GLuint *
+make_temp_uint_image(struct gl_context *ctx, GLuint dims,
+                     GLenum logicalBaseFormat,
+                     GLenum textureBaseFormat,
+                     GLint srcWidth, GLint srcHeight, GLint srcDepth,
+                     GLenum srcFormat, GLenum srcType,
+                     const GLvoid *srcAddr,
+                     const struct gl_pixelstore_attrib *srcPacking)
+{
+   GLuint *tempImage;
+   const GLint components = _mesa_components_in_format(logicalBaseFormat);
+   const GLint srcStride =
+      _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
+   GLuint *dst;
+   GLint img, row;
+
+   ASSERT(dims >= 1 && dims <= 3);
+
+   ASSERT(logicalBaseFormat == GL_RGBA ||
+          logicalBaseFormat == GL_RGB ||
+          logicalBaseFormat == GL_RG ||
+          logicalBaseFormat == GL_RED ||
+          logicalBaseFormat == GL_LUMINANCE_ALPHA ||
+          logicalBaseFormat == GL_LUMINANCE ||
+          logicalBaseFormat == GL_INTENSITY ||
+          logicalBaseFormat == GL_ALPHA);
+
+   ASSERT(textureBaseFormat == GL_RGBA ||
+          textureBaseFormat == GL_RGB ||
+          textureBaseFormat == GL_RG ||
+          textureBaseFormat == GL_RED ||
+          textureBaseFormat == GL_LUMINANCE_ALPHA ||
+          textureBaseFormat == GL_LUMINANCE ||
+          textureBaseFormat == GL_ALPHA);
+
+   tempImage = (GLuint *) malloc(srcWidth * srcHeight * srcDepth
+                                 * components * sizeof(GLuint));
+   if (!tempImage)
+      return NULL;
+
+   dst = tempImage;
+   for (img = 0; img < srcDepth; img++) {
+      const GLubyte *src
+	 = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
+						 srcWidth, srcHeight,
+						 srcFormat, srcType,
+						 img, 0, 0);
+      for (row = 0; row < srcHeight; row++) {
+	 _mesa_unpack_color_span_uint(ctx, srcWidth, logicalBaseFormat,
+                                      dst, srcFormat, srcType, src,
+                                      srcPacking);
+	 dst += srcWidth * components;
+	 src += srcStride;
+      }
+   }
+
+   if (logicalBaseFormat != textureBaseFormat) {
+      /* more work */
+      GLint texComponents = _mesa_components_in_format(textureBaseFormat);
+      GLint logComponents = _mesa_components_in_format(logicalBaseFormat);
+      GLuint *newImage;
+      GLint i, n;
+      GLubyte map[6];
+
+      /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */
+      ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA ||
+             textureBaseFormat == GL_LUMINANCE_ALPHA);
+
+      /* The actual texture format should have at least as many components
+       * as the logical texture format.
+       */
+      ASSERT(texComponents >= logComponents);
+
+      newImage = (GLuint *) malloc(srcWidth * srcHeight * srcDepth
+                                   * texComponents * sizeof(GLuint));
+      if (!newImage) {
+         free(tempImage);
+         return NULL;
+      }
+
+      compute_component_mapping(logicalBaseFormat, textureBaseFormat, map);
+
+      n = srcWidth * srcHeight * srcDepth;
+      for (i = 0; i < n; i++) {
+         GLint k;
+         for (k = 0; k < texComponents; k++) {
+            GLint j = map[k];
+            if (j == ZERO)
+               newImage[i * texComponents + k] = 0.0F;
+            else if (j == ONE)
+               newImage[i * texComponents + k] = 1.0F;
+            else
+               newImage[i * texComponents + k] = tempImage[i * logComponents + j];
+         }
+      }
+
+      free(tempImage);
+      tempImage = newImage;
+   }
+
+   return tempImage;
+}
+
+
+
+/**
+ * Make a temporary (color) texture image with GLchan components.
+ * Apply all needed pixel unpacking and pixel transfer operations.
+ * Note that there are both logicalBaseFormat and textureBaseFormat parameters.
+ * Suppose the user specifies GL_LUMINANCE as the internal texture format
+ * but the graphics hardware doesn't support luminance textures.  So, we might
+ * use an RGB hardware format instead.
+ * If logicalBaseFormat != textureBaseFormat we have some extra work to do.
+ *
+ * \param ctx  the rendering context
+ * \param dims  image dimensions: 1, 2 or 3
+ * \param logicalBaseFormat  basic texture derived from the user's
+ *    internal texture format value
+ * \param textureBaseFormat  the actual basic format of the texture
+ * \param srcWidth  source image width
+ * \param srcHeight  source image height
+ * \param srcDepth  source image depth
+ * \param srcFormat  source image format
+ * \param srcType  source image type
+ * \param srcAddr  source image address
+ * \param srcPacking  source image pixel packing
+ * \return resulting image with format = textureBaseFormat and type = GLchan.
+ */
+GLchan *
+_mesa_make_temp_chan_image(struct gl_context *ctx, GLuint dims,
+                           GLenum logicalBaseFormat,
+                           GLenum textureBaseFormat,
+                           GLint srcWidth, GLint srcHeight, GLint srcDepth,
+                           GLenum srcFormat, GLenum srcType,
+                           const GLvoid *srcAddr,
+                           const struct gl_pixelstore_attrib *srcPacking)
+{
+   GLuint transferOps = ctx->_ImageTransferState;
+   const GLint components = _mesa_components_in_format(logicalBaseFormat);
+   GLint img, row;
+   GLchan *tempImage, *dst;
+
+   ASSERT(dims >= 1 && dims <= 3);
+
+   ASSERT(logicalBaseFormat == GL_RGBA ||
+          logicalBaseFormat == GL_RGB ||
+          logicalBaseFormat == GL_RG ||
+          logicalBaseFormat == GL_RED ||
+          logicalBaseFormat == GL_LUMINANCE_ALPHA ||
+          logicalBaseFormat == GL_LUMINANCE ||
+          logicalBaseFormat == GL_ALPHA ||
+          logicalBaseFormat == GL_INTENSITY);
+
+   ASSERT(textureBaseFormat == GL_RGBA ||
+          textureBaseFormat == GL_RGB ||
+          textureBaseFormat == GL_RG ||
+          textureBaseFormat == GL_RED ||
+          textureBaseFormat == GL_LUMINANCE_ALPHA ||
+          textureBaseFormat == GL_LUMINANCE ||
+          textureBaseFormat == GL_ALPHA ||
+          textureBaseFormat == GL_INTENSITY);
+
+   /* unpack and transfer the source image */
+   tempImage = (GLchan *) malloc(srcWidth * srcHeight * srcDepth
+                                       * components * sizeof(GLchan));
+   if (!tempImage) {
+      return NULL;
+   }
+
+   dst = tempImage;
+   for (img = 0; img < srcDepth; img++) {
+      const GLint srcStride =
+         _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
+      const GLubyte *src =
+         (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr,
+                                               srcWidth, srcHeight,
+                                               srcFormat, srcType,
+                                               img, 0, 0);
+      for (row = 0; row < srcHeight; row++) {
+         _mesa_unpack_color_span_chan(ctx, srcWidth, logicalBaseFormat, dst,
+                                      srcFormat, srcType, src, srcPacking,
+                                      transferOps);
+         dst += srcWidth * components;
+         src += srcStride;
+      }
+   }
+
+   if (logicalBaseFormat != textureBaseFormat) {
+      /* one more conversion step */
+      GLint texComponents = _mesa_components_in_format(textureBaseFormat);
+      GLint logComponents = _mesa_components_in_format(logicalBaseFormat);
+      GLchan *newImage;
+      GLint i, n;
+      GLubyte map[6];
+
+      /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */
+      ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA ||
+             textureBaseFormat == GL_LUMINANCE_ALPHA);
+
+      /* The actual texture format should have at least as many components
+       * as the logical texture format.
+       */
+      ASSERT(texComponents >= logComponents);
+
+      newImage = (GLchan *) malloc(srcWidth * srcHeight * srcDepth
+                                         * texComponents * sizeof(GLchan));
+      if (!newImage) {
+         free(tempImage);
+         return NULL;
+      }
+
+      compute_component_mapping(logicalBaseFormat, textureBaseFormat, map);
+
+      n = srcWidth * srcHeight * srcDepth;
+      for (i = 0; i < n; i++) {
+         GLint k;
+         for (k = 0; k < texComponents; k++) {
+            GLint j = map[k];
+            if (j == ZERO)
+               newImage[i * texComponents + k] = 0;
+            else if (j == ONE)
+               newImage[i * texComponents + k] = CHAN_MAX;
+            else
+               newImage[i * texComponents + k] = tempImage[i * logComponents + j];
+         }
+      }
+
+      free(tempImage);
+      tempImage = newImage;
+   }
+
+   return tempImage;
+}
+
+
+/**
+ * Copy GLubyte pixels from <src> to <dst> with swizzling.
+ * \param dst  destination pixels
+ * \param dstComponents  number of color components in destination pixels
+ * \param src  source pixels
+ * \param srcComponents  number of color components in source pixels
+ * \param map  the swizzle mapping.  map[X] says where to find the X component
+ *             in the source image's pixels.  For example, if the source image
+ *             is GL_BGRA and X = red, map[0] yields 2.
+ * \param count  number of pixels to copy/swizzle.
+ */
+static void
+swizzle_copy(GLubyte *dst, GLuint dstComponents, const GLubyte *src, 
+             GLuint srcComponents, const GLubyte *map, GLuint count)
+{
+#define SWZ_CPY(dst, src, count, dstComps, srcComps) \
+   do {                                              \
+      GLuint i;                                      \
+      for (i = 0; i < count; i++) {                  \
+         GLuint j;                                   \
+         if (srcComps == 4) {                        \
+            COPY_4UBV(tmp, src);                     \
+         }                                           \
+         else {                                      \
+            for (j = 0; j < srcComps; j++) {         \
+               tmp[j] = src[j];                      \
+            }                                        \
+         }                                           \
+         src += srcComps;                            \
+         for (j = 0; j < dstComps; j++) {            \
+            dst[j] = tmp[map[j]];                    \
+         }                                           \
+         dst += dstComps;                            \
+      }                                              \
+   } while (0)
+
+   GLubyte tmp[6];
+
+   tmp[ZERO] = 0x0;
+   tmp[ONE] = 0xff;
+
+   ASSERT(srcComponents <= 4);
+   ASSERT(dstComponents <= 4);
+
+   switch (dstComponents) {
+   case 4:
+      switch (srcComponents) {
+      case 4:
+         SWZ_CPY(dst, src, count, 4, 4);
+         break;
+      case 3:
+         SWZ_CPY(dst, src, count, 4, 3);
+         break;
+      case 2:
+         SWZ_CPY(dst, src, count, 4, 2);
+         break;
+      case 1:
+         SWZ_CPY(dst, src, count, 4, 1);
+         break;
+      default:
+         ;
+      }
+      break;
+   case 3:
+      switch (srcComponents) {
+      case 4:
+         SWZ_CPY(dst, src, count, 3, 4);
+         break;
+      case 3:
+         SWZ_CPY(dst, src, count, 3, 3);
+         break;
+      case 2:
+         SWZ_CPY(dst, src, count, 3, 2);
+         break;
+      case 1:
+         SWZ_CPY(dst, src, count, 3, 1);
+         break;
+      default:
+         ;
+      }
+      break;
+   case 2:
+      switch (srcComponents) {
+      case 4:
+         SWZ_CPY(dst, src, count, 2, 4);
+         break;
+      case 3:
+         SWZ_CPY(dst, src, count, 2, 3);
+         break;
+      case 2:
+         SWZ_CPY(dst, src, count, 2, 2);
+         break;
+      case 1:
+         SWZ_CPY(dst, src, count, 2, 1);
+         break;
+      default:
+         ;
+      }
+      break;
+   case 1:
+      switch (srcComponents) {
+      case 4:
+         SWZ_CPY(dst, src, count, 1, 4);
+         break;
+      case 3:
+         SWZ_CPY(dst, src, count, 1, 3);
+         break;
+      case 2:
+         SWZ_CPY(dst, src, count, 1, 2);
+         break;
+      case 1:
+         SWZ_CPY(dst, src, count, 1, 1);
+         break;
+      default:
+         ;
+      }
+      break;
+   default:
+      ;
+   }
+#undef SWZ_CPY
+}
+
+
+
+static const GLubyte map_identity[6] = { 0, 1, 2, 3, ZERO, ONE };
+static const GLubyte map_3210[6] = { 3, 2, 1, 0, ZERO, ONE };
+
+
+/**
+ * For 1-byte/pixel formats (or 8_8_8_8 packed formats), return a
+ * mapping array depending on endianness.
+ */
+static const GLubyte *
+type_mapping( GLenum srcType )
+{
+   switch (srcType) {
+   case GL_BYTE:
+   case GL_UNSIGNED_BYTE:
+      return map_identity;
+   case GL_UNSIGNED_INT_8_8_8_8:
+      return _mesa_little_endian() ? map_3210 : map_identity;
+   case GL_UNSIGNED_INT_8_8_8_8_REV:
+      return _mesa_little_endian() ? map_identity : map_3210;
+   default:
+      return NULL;
+   }
+}
+
+
+/**
+ * For 1-byte/pixel formats (or 8_8_8_8 packed formats), return a
+ * mapping array depending on pixelstore byte swapping state.
+ */
+static const GLubyte *
+byteswap_mapping( GLboolean swapBytes,
+		  GLenum srcType )
+{
+   if (!swapBytes) 
+      return map_identity;
+
+   switch (srcType) {
+   case GL_BYTE:
+   case GL_UNSIGNED_BYTE:
+      return map_identity;
+   case GL_UNSIGNED_INT_8_8_8_8:
+   case GL_UNSIGNED_INT_8_8_8_8_REV:
+      return map_3210;
+   default:
+      return NULL;
+   }
+}
+
+
+
+/**
+ * Transfer a GLubyte texture image with component swizzling.
+ */
+static void
+_mesa_swizzle_ubyte_image(struct gl_context *ctx, 
+			  GLuint dimensions,
+			  GLenum srcFormat,
+			  GLenum srcType,
+
+			  GLenum baseInternalFormat,
+
+			  const GLubyte *rgba2dst,
+			  GLuint dstComponents,
+
+			  GLvoid *dstAddr,
+			  GLint dstXoffset, GLint dstYoffset, GLint dstZoffset,
+			  GLint dstRowStride,
+                          const GLuint *dstImageOffsets,
+
+			  GLint srcWidth, GLint srcHeight, GLint srcDepth,
+			  const GLvoid *srcAddr,
+			  const struct gl_pixelstore_attrib *srcPacking )
+{
+   GLint srcComponents = _mesa_components_in_format(srcFormat);
+   const GLubyte *srctype2ubyte, *swap;
+   GLubyte map[4], src2base[6], base2rgba[6];
+   GLint i;
+   const GLint srcRowStride =
+      _mesa_image_row_stride(srcPacking, srcWidth,
+                             srcFormat, GL_UNSIGNED_BYTE);
+   const GLint srcImageStride
+      = _mesa_image_image_stride(srcPacking, srcWidth, srcHeight, srcFormat,
+                                 GL_UNSIGNED_BYTE);
+   const GLubyte *srcImage
+      = (const GLubyte *) _mesa_image_address(dimensions, srcPacking, srcAddr,
+                                              srcWidth, srcHeight, srcFormat,
+                                              GL_UNSIGNED_BYTE, 0, 0, 0);
+
+   (void) ctx;
+
+   /* Translate from src->baseInternal->GL_RGBA->dst.  This will
+    * correctly deal with RGBA->RGB->RGBA conversions where the final
+    * A value must be 0xff regardless of the incoming alpha values.
+    */
+   compute_component_mapping(srcFormat, baseInternalFormat, src2base);
+   compute_component_mapping(baseInternalFormat, GL_RGBA, base2rgba);
+   swap = byteswap_mapping(srcPacking->SwapBytes, srcType);
+   srctype2ubyte = type_mapping(srcType);
+
+
+   for (i = 0; i < 4; i++)
+      map[i] = srctype2ubyte[swap[src2base[base2rgba[rgba2dst[i]]]]];
+
+/*    printf("map %d %d %d %d\n", map[0], map[1], map[2], map[3]);  */
+
+   if (srcComponents == dstComponents &&
+       srcRowStride == dstRowStride &&
+       srcRowStride == srcWidth * srcComponents &&
+       dimensions < 3) {
+      /* 1 and 2D images only */
+      GLubyte *dstImage = (GLubyte *) dstAddr
+         + dstYoffset * dstRowStride
+         + dstXoffset * dstComponents;
+      swizzle_copy(dstImage, dstComponents, srcImage, srcComponents, map, 
+		   srcWidth * srcHeight);
+   }
+   else {
+      GLint img, row;
+      for (img = 0; img < srcDepth; img++) {
+         const GLubyte *srcRow = srcImage;
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * dstComponents
+            + dstYoffset * dstRowStride
+            + dstXoffset * dstComponents;
+         for (row = 0; row < srcHeight; row++) {
+	    swizzle_copy(dstRow, dstComponents, srcRow, srcComponents, map, srcWidth);
+            dstRow += dstRowStride;
+            srcRow += srcRowStride;
+         }
+         srcImage += srcImageStride;
+      }
+   }
+}
+
+
+/**
+ * Teximage storage routine for when a simple memcpy will do.
+ * No pixel transfer operations or special texel encodings allowed.
+ * 1D, 2D and 3D images supported.
+ */
+static void
+memcpy_texture(struct gl_context *ctx,
+	       GLuint dimensions,
+               gl_format dstFormat,
+               GLvoid *dstAddr,
+               GLint dstXoffset, GLint dstYoffset, GLint dstZoffset,
+               GLint dstRowStride,
+               const GLuint *dstImageOffsets,
+               GLint srcWidth, GLint srcHeight, GLint srcDepth,
+               GLenum srcFormat, GLenum srcType,
+               const GLvoid *srcAddr,
+               const struct gl_pixelstore_attrib *srcPacking)
+{
+   const GLint srcRowStride = _mesa_image_row_stride(srcPacking, srcWidth,
+                                                     srcFormat, srcType);
+   const GLint srcImageStride = _mesa_image_image_stride(srcPacking,
+                                      srcWidth, srcHeight, srcFormat, srcType);
+   const GLubyte *srcImage = (const GLubyte *) _mesa_image_address(dimensions,
+        srcPacking, srcAddr, srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0);
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLint bytesPerRow = srcWidth * texelBytes;
+
+#if 0
+   /* XXX update/re-enable for dstImageOffsets array */
+   const GLint bytesPerImage = srcHeight * bytesPerRow;
+   const GLint bytesPerTexture = srcDepth * bytesPerImage;
+   GLubyte *dstImage = (GLubyte *) dstAddr
+                     + dstZoffset * dstImageStride
+                     + dstYoffset * dstRowStride
+                     + dstXoffset * texelBytes;
+
+   if (dstRowStride == srcRowStride &&
+       dstRowStride == bytesPerRow &&
+       ((dstImageStride == srcImageStride &&
+         dstImageStride == bytesPerImage) ||
+        (srcDepth == 1))) {
+      /* one big memcpy */
+      ctx->Driver.TextureMemCpy(dstImage, srcImage, bytesPerTexture);
+   }
+   else
+   {
+      GLint img, row;
+      for (img = 0; img < srcDepth; img++) {
+         const GLubyte *srcRow = srcImage;
+         GLubyte *dstRow = dstImage;
+         for (row = 0; row < srcHeight; row++) {
+            ctx->Driver.TextureMemCpy(dstRow, srcRow, bytesPerRow);
+            dstRow += dstRowStride;
+            srcRow += srcRowStride;
+         }
+         srcImage += srcImageStride;
+         dstImage += dstImageStride;
+      }
+   }
+#endif
+
+   GLint img, row;
+   for (img = 0; img < srcDepth; img++) {
+      const GLubyte *srcRow = srcImage;
+      GLubyte *dstRow = (GLubyte *) dstAddr
+         + dstImageOffsets[dstZoffset + img] * texelBytes
+         + dstYoffset * dstRowStride
+         + dstXoffset * texelBytes;
+      for (row = 0; row < srcHeight; row++) {
+         ctx->Driver.TextureMemCpy(dstRow, srcRow, bytesPerRow);
+         dstRow += dstRowStride;
+         srcRow += srcRowStride;
+      }
+      srcImage += srcImageStride;
+   }
+}
+
+
+
+/**
+ * Store a 32-bit integer depth component texture image.
+ */
+static GLboolean
+_mesa_texstore_z32(TEXSTORE_PARAMS)
+{
+   const GLuint depthScale = 0xffffffff;
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   (void) dims;
+   ASSERT(dstFormat == MESA_FORMAT_Z32);
+   ASSERT(texelBytes == sizeof(GLuint));
+
+   if (ctx->Pixel.DepthScale == 1.0f &&
+       ctx->Pixel.DepthBias == 0.0f &&
+       !srcPacking->SwapBytes &&
+       baseInternalFormat == GL_DEPTH_COMPONENT &&
+       srcFormat == GL_DEPTH_COMPONENT &&
+       srcType == GL_UNSIGNED_INT) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else {
+      /* general path */
+      GLint img, row;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            const GLvoid *src = _mesa_image_address(dims, srcPacking,
+                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
+            _mesa_unpack_depth_span(ctx, srcWidth,
+                                    GL_UNSIGNED_INT, (GLuint *) dstRow,
+                                    depthScale, srcType, src, srcPacking);
+            dstRow += dstRowStride;
+         }
+      }
+   }
+   return GL_TRUE;
+}
+
+
+/**
+ * Store a 24-bit integer depth component texture image.
+ */
+static GLboolean
+_mesa_texstore_x8_z24(TEXSTORE_PARAMS)
+{
+   const GLuint depthScale = 0xffffff;
+   const GLuint texelBytes = 4;
+
+   (void) dims;
+   ASSERT(dstFormat == MESA_FORMAT_X8_Z24);
+
+   {
+      /* general path */
+      GLint img, row;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            const GLvoid *src = _mesa_image_address(dims, srcPacking,
+                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
+            _mesa_unpack_depth_span(ctx, srcWidth,
+                                    GL_UNSIGNED_INT, (GLuint *) dstRow,
+                                    depthScale, srcType, src, srcPacking);
+            dstRow += dstRowStride;
+         }
+      }
+   }
+   return GL_TRUE;
+}
+
+
+/**
+ * Store a 24-bit integer depth component texture image.
+ */
+static GLboolean
+_mesa_texstore_z24_x8(TEXSTORE_PARAMS)
+{
+   const GLuint depthScale = 0xffffff;
+   const GLuint texelBytes = 4;
+
+   (void) dims;
+   ASSERT(dstFormat == MESA_FORMAT_Z24_X8);
+
+   {
+      /* general path */
+      GLint img, row;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            const GLvoid *src = _mesa_image_address(dims, srcPacking,
+                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
+            GLuint *dst = (GLuint *) dstRow;
+            GLint i;
+            _mesa_unpack_depth_span(ctx, srcWidth,
+                                    GL_UNSIGNED_INT, dst,
+                                    depthScale, srcType, src, srcPacking);
+            for (i = 0; i < srcWidth; i++)
+               dst[i] <<= 8;
+            dstRow += dstRowStride;
+         }
+      }
+   }
+   return GL_TRUE;
+}
+
+
+/**
+ * Store a 16-bit integer depth component texture image.
+ */
+static GLboolean
+_mesa_texstore_z16(TEXSTORE_PARAMS)
+{
+   const GLuint depthScale = 0xffff;
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   (void) dims;
+   ASSERT(dstFormat == MESA_FORMAT_Z16);
+   ASSERT(texelBytes == sizeof(GLushort));
+
+   if (ctx->Pixel.DepthScale == 1.0f &&
+       ctx->Pixel.DepthBias == 0.0f &&
+       !srcPacking->SwapBytes &&
+       baseInternalFormat == GL_DEPTH_COMPONENT &&
+       srcFormat == GL_DEPTH_COMPONENT &&
+       srcType == GL_UNSIGNED_SHORT) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else {
+      /* general path */
+      GLint img, row;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            const GLvoid *src = _mesa_image_address(dims, srcPacking,
+                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
+            GLushort *dst16 = (GLushort *) dstRow;
+            _mesa_unpack_depth_span(ctx, srcWidth,
+                                    GL_UNSIGNED_SHORT, dst16, depthScale,
+                                    srcType, src, srcPacking);
+            dstRow += dstRowStride;
+         }
+      }
+   }
+   return GL_TRUE;
+}
+
+
+/**
+ * Store an rgb565 or rgb565_rev texture image.
+ */
+static GLboolean
+_mesa_texstore_rgb565(TEXSTORE_PARAMS)
+{
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_RGB565 ||
+          dstFormat == MESA_FORMAT_RGB565_REV);
+   ASSERT(texelBytes == 2);
+
+   if (!ctx->_ImageTransferState &&
+       !srcPacking->SwapBytes &&
+       dstFormat == MESA_FORMAT_RGB565 &&
+       baseInternalFormat == GL_RGB &&
+       srcFormat == GL_RGB &&
+       srcType == GL_UNSIGNED_SHORT_5_6_5) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else if (!ctx->_ImageTransferState &&
+            !srcPacking->SwapBytes &&
+            baseInternalFormat == GL_RGB &&
+            srcFormat == GL_RGB &&
+            srcType == GL_UNSIGNED_BYTE &&
+            dims == 2) {
+      /* do optimized tex store */
+      const GLint srcRowStride =
+         _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
+      const GLubyte *src = (const GLubyte *)
+         _mesa_image_address(dims, srcPacking, srcAddr, srcWidth, srcHeight,
+                             srcFormat, srcType, 0, 0, 0);
+      GLubyte *dst = (GLubyte *) dstAddr
+                   + dstYoffset * dstRowStride
+                   + dstXoffset * texelBytes;
+      GLint row, col;
+      for (row = 0; row < srcHeight; row++) {
+         const GLubyte *srcUB = (const GLubyte *) src;
+         GLushort *dstUS = (GLushort *) dst;
+         /* check for byteswapped format */
+         if (dstFormat == MESA_FORMAT_RGB565) {
+            for (col = 0; col < srcWidth; col++) {
+               dstUS[col] = PACK_COLOR_565( srcUB[0], srcUB[1], srcUB[2] );
+               srcUB += 3;
+            }
+         }
+         else {
+            for (col = 0; col < srcWidth; col++) {
+               dstUS[col] = PACK_COLOR_565_REV( srcUB[0], srcUB[1], srcUB[2] );
+               srcUB += 3;
+            }
+         }
+         dst += dstRowStride;
+         src += srcRowStride;
+      }
+   }
+   else {
+      /* general path */
+      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
+                                                 baseInternalFormat,
+                                                 baseFormat,
+                                                 srcWidth, srcHeight, srcDepth,
+                                                 srcFormat, srcType, srcAddr,
+                                                 srcPacking);
+      const GLchan *src = tempImage;
+      GLint img, row, col;
+      if (!tempImage)
+         return GL_FALSE;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            GLushort *dstUS = (GLushort *) dstRow;
+            /* check for byteswapped format */
+            if (dstFormat == MESA_FORMAT_RGB565) {
+               for (col = 0; col < srcWidth; col++) {
+                  dstUS[col] = PACK_COLOR_565( CHAN_TO_UBYTE(src[RCOMP]),
+                                               CHAN_TO_UBYTE(src[GCOMP]),
+                                               CHAN_TO_UBYTE(src[BCOMP]) );
+                  src += 3;
+               }
+            }
+            else {
+               for (col = 0; col < srcWidth; col++) {
+                  dstUS[col] = PACK_COLOR_565_REV( CHAN_TO_UBYTE(src[RCOMP]),
+                                                   CHAN_TO_UBYTE(src[GCOMP]),
+                                                   CHAN_TO_UBYTE(src[BCOMP]) );
+                  src += 3;
+               }
+            }
+            dstRow += dstRowStride;
+         }
+      }
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+
+/**
+ * Store a texture in MESA_FORMAT_RGBA8888 or MESA_FORMAT_RGBA8888_REV.
+ */
+static GLboolean
+_mesa_texstore_rgba8888(TEXSTORE_PARAMS)
+{
+   const GLboolean littleEndian = _mesa_little_endian();
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_RGBA8888 ||
+          dstFormat == MESA_FORMAT_RGBA8888_REV);
+   ASSERT(texelBytes == 4);
+
+   if (!ctx->_ImageTransferState &&
+       !srcPacking->SwapBytes &&
+       dstFormat == MESA_FORMAT_RGBA8888 &&
+       baseInternalFormat == GL_RGBA &&
+      ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8) ||
+       (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && !littleEndian) ||
+       (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) ||
+       (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_BYTE && littleEndian))) {
+       /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else if (!ctx->_ImageTransferState &&
+       !srcPacking->SwapBytes &&
+       dstFormat == MESA_FORMAT_RGBA8888_REV &&
+       baseInternalFormat == GL_RGBA &&
+      ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) ||
+       (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && littleEndian) ||
+       (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_INT_8_8_8_8) ||
+       (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_BYTE && !littleEndian))) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else if (!ctx->_ImageTransferState &&
+	    (srcType == GL_UNSIGNED_BYTE ||
+	     srcType == GL_UNSIGNED_INT_8_8_8_8 ||
+	     srcType == GL_UNSIGNED_INT_8_8_8_8_REV) &&
+	    can_swizzle(baseInternalFormat) &&
+	    can_swizzle(srcFormat)) {
+
+      GLubyte dstmap[4];
+
+      /* dstmap - how to swizzle from RGBA to dst format:
+       */
+      if ((littleEndian && dstFormat == MESA_FORMAT_RGBA8888) ||
+	  (!littleEndian && dstFormat == MESA_FORMAT_RGBA8888_REV)) {
+	 dstmap[3] = 0;
+	 dstmap[2] = 1;
+	 dstmap[1] = 2;
+	 dstmap[0] = 3;
+      }
+      else {
+	 dstmap[3] = 3;
+	 dstmap[2] = 2;
+	 dstmap[1] = 1;
+	 dstmap[0] = 0;
+      }
+      
+      _mesa_swizzle_ubyte_image(ctx, dims,
+				srcFormat,
+				srcType,
+				baseInternalFormat,
+				dstmap, 4,
+				dstAddr, dstXoffset, dstYoffset, dstZoffset,
+				dstRowStride, dstImageOffsets,
+				srcWidth, srcHeight, srcDepth, srcAddr,
+				srcPacking);      
+   }
+   else {
+      /* general path */
+      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
+                                                 baseInternalFormat,
+                                                 baseFormat,
+                                                 srcWidth, srcHeight, srcDepth,
+                                                 srcFormat, srcType, srcAddr,
+                                                 srcPacking);
+      const GLchan *src = tempImage;
+      GLint img, row, col;
+      if (!tempImage)
+         return GL_FALSE;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            GLuint *dstUI = (GLuint *) dstRow;
+            if (dstFormat == MESA_FORMAT_RGBA8888) {
+               for (col = 0; col < srcWidth; col++) {
+                  dstUI[col] = PACK_COLOR_8888( CHAN_TO_UBYTE(src[RCOMP]),
+                                                CHAN_TO_UBYTE(src[GCOMP]),
+                                                CHAN_TO_UBYTE(src[BCOMP]),
+                                                CHAN_TO_UBYTE(src[ACOMP]) );
+                  src += 4;
+               }
+            }
+            else {
+               for (col = 0; col < srcWidth; col++) {
+                  dstUI[col] = PACK_COLOR_8888_REV( CHAN_TO_UBYTE(src[RCOMP]),
+                                                    CHAN_TO_UBYTE(src[GCOMP]),
+                                                    CHAN_TO_UBYTE(src[BCOMP]),
+                                                    CHAN_TO_UBYTE(src[ACOMP]) );
+                  src += 4;
+               }
+            }
+            dstRow += dstRowStride;
+         }
+      }
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+
+static GLboolean
+_mesa_texstore_argb8888(TEXSTORE_PARAMS)
+{
+   const GLboolean littleEndian = _mesa_little_endian();
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = GL_RGBA;
+
+   ASSERT(dstFormat == MESA_FORMAT_ARGB8888 ||
+          dstFormat == MESA_FORMAT_ARGB8888_REV ||
+          dstFormat == MESA_FORMAT_XRGB8888 ||
+          dstFormat == MESA_FORMAT_XRGB8888_REV );
+   ASSERT(texelBytes == 4);
+
+   if (!ctx->_ImageTransferState &&
+       !srcPacking->SwapBytes &&
+       (dstFormat == MESA_FORMAT_ARGB8888 ||
+        dstFormat == MESA_FORMAT_XRGB8888) &&
+       baseInternalFormat == GL_RGBA &&
+       srcFormat == GL_BGRA &&
+       ((srcType == GL_UNSIGNED_BYTE && littleEndian) ||
+        srcType == GL_UNSIGNED_INT_8_8_8_8_REV)) {
+      /* simple memcpy path (little endian) */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else if (!ctx->_ImageTransferState &&
+       !srcPacking->SwapBytes &&
+       (dstFormat == MESA_FORMAT_ARGB8888_REV ||
+        dstFormat == MESA_FORMAT_XRGB8888_REV) &&
+       baseInternalFormat == GL_RGBA &&
+       srcFormat == GL_BGRA &&
+       ((srcType == GL_UNSIGNED_BYTE && !littleEndian) ||
+        srcType == GL_UNSIGNED_INT_8_8_8_8)) {
+      /* simple memcpy path (big endian) */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else if (!ctx->_ImageTransferState &&
+            !srcPacking->SwapBytes &&
+	    (dstFormat == MESA_FORMAT_ARGB8888 ||
+             dstFormat == MESA_FORMAT_XRGB8888) &&
+            srcFormat == GL_RGB &&
+	    (baseInternalFormat == GL_RGBA ||
+	     baseInternalFormat == GL_RGB) &&
+            srcType == GL_UNSIGNED_BYTE) {
+      int img, row, col;
+      for (img = 0; img < srcDepth; img++) {
+         const GLint srcRowStride =
+            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
+         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
+                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            GLuint *d4 = (GLuint *) dstRow;
+            for (col = 0; col < srcWidth; col++) {
+               d4[col] = PACK_COLOR_8888(0xff,
+                                         srcRow[col * 3 + RCOMP],
+                                         srcRow[col * 3 + GCOMP],
+                                         srcRow[col * 3 + BCOMP]);
+            }
+            dstRow += dstRowStride;
+            srcRow += srcRowStride;
+         }
+      }
+   }
+   else if (!ctx->_ImageTransferState &&
+            !srcPacking->SwapBytes &&
+	    dstFormat == MESA_FORMAT_ARGB8888 &&
+            srcFormat == GL_RGBA &&
+	    baseInternalFormat == GL_RGBA &&
+            srcType == GL_UNSIGNED_BYTE) {
+      /* same as above case, but src data has alpha too */
+      GLint img, row, col;
+      /* For some reason, streaming copies to write-combined regions
+       * are extremely sensitive to the characteristics of how the
+       * source data is retrieved.  By reordering the source reads to
+       * be in-order, the speed of this operation increases by half.
+       * Strangely the same isn't required for the RGB path, above.
+       */
+      for (img = 0; img < srcDepth; img++) {
+         const GLint srcRowStride =
+            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
+         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
+                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            GLuint *d4 = (GLuint *) dstRow;
+            for (col = 0; col < srcWidth; col++) {
+               d4[col] = PACK_COLOR_8888(srcRow[col * 4 + ACOMP],
+                                         srcRow[col * 4 + RCOMP],
+                                         srcRow[col * 4 + GCOMP],
+                                         srcRow[col * 4 + BCOMP]);
+            }
+            dstRow += dstRowStride;
+            srcRow += srcRowStride;
+         }
+      }
+   }
+   else if (!ctx->_ImageTransferState &&
+	    (srcType == GL_UNSIGNED_BYTE ||
+	     srcType == GL_UNSIGNED_INT_8_8_8_8 ||
+	     srcType == GL_UNSIGNED_INT_8_8_8_8_REV) &&
+	    can_swizzle(baseInternalFormat) &&	   
+	    can_swizzle(srcFormat)) {
+
+      GLubyte dstmap[4];
+
+      /* dstmap - how to swizzle from RGBA to dst format:
+       */
+      if ((littleEndian && dstFormat == MESA_FORMAT_ARGB8888) ||
+          (littleEndian && dstFormat == MESA_FORMAT_XRGB8888) ||
+	  (!littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) ||
+	  (!littleEndian && dstFormat == MESA_FORMAT_XRGB8888_REV)) {
+	 dstmap[3] = 3;		/* alpha */
+	 dstmap[2] = 0;		/* red */
+	 dstmap[1] = 1;		/* green */
+	 dstmap[0] = 2;		/* blue */
+      }
+      else {
+	 assert((littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) ||
+		(!littleEndian && dstFormat == MESA_FORMAT_ARGB8888) ||
+		(littleEndian && dstFormat == MESA_FORMAT_XRGB8888_REV) ||
+		(!littleEndian && dstFormat == MESA_FORMAT_XRGB8888));
+	 dstmap[3] = 2;
+	 dstmap[2] = 1;
+	 dstmap[1] = 0;
+	 dstmap[0] = 3;
+      }
+ 
+      _mesa_swizzle_ubyte_image(ctx, dims,
+				srcFormat,
+				srcType,
+				baseInternalFormat,
+				dstmap, 4,
+				dstAddr, dstXoffset, dstYoffset, dstZoffset,
+				dstRowStride,
+                                dstImageOffsets,
+				srcWidth, srcHeight, srcDepth, srcAddr,
+				srcPacking);      
+   }
+   else {
+      /* general path */
+      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
+                                                 baseInternalFormat,
+                                                 baseFormat,
+                                                 srcWidth, srcHeight, srcDepth,
+                                                 srcFormat, srcType, srcAddr,
+                                                 srcPacking);
+      const GLchan *src = tempImage;
+      GLint img, row, col;
+      if (!tempImage)
+         return GL_FALSE;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            GLuint *dstUI = (GLuint *) dstRow;
+            if (dstFormat == MESA_FORMAT_ARGB8888) {
+               for (col = 0; col < srcWidth; col++) {
+                  dstUI[col] = PACK_COLOR_8888( CHAN_TO_UBYTE(src[ACOMP]),
+                                                CHAN_TO_UBYTE(src[RCOMP]),
+                                                CHAN_TO_UBYTE(src[GCOMP]),
+                                                CHAN_TO_UBYTE(src[BCOMP]) );
+                  src += 4;
+               }
+            }
+            else if (dstFormat == MESA_FORMAT_XRGB8888) {
+               for (col = 0; col < srcWidth; col++) {
+                  dstUI[col] = PACK_COLOR_8888( 0xff,
+                                                CHAN_TO_UBYTE(src[RCOMP]),
+                                                CHAN_TO_UBYTE(src[GCOMP]),
+                                                CHAN_TO_UBYTE(src[BCOMP]) );
+                  src += 4;
+               }
+            }
+            else {
+               for (col = 0; col < srcWidth; col++) {
+                  dstUI[col] = PACK_COLOR_8888_REV( CHAN_TO_UBYTE(src[ACOMP]),
+                                                    CHAN_TO_UBYTE(src[RCOMP]),
+                                                    CHAN_TO_UBYTE(src[GCOMP]),
+                                                    CHAN_TO_UBYTE(src[BCOMP]) );
+                  src += 4;
+               }
+            }
+            dstRow += dstRowStride;
+         }
+      }
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+
+static GLboolean
+_mesa_texstore_rgb888(TEXSTORE_PARAMS)
+{
+   const GLboolean littleEndian = _mesa_little_endian();
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_RGB888);
+   ASSERT(texelBytes == 3);
+
+   if (!ctx->_ImageTransferState &&
+       !srcPacking->SwapBytes &&
+       baseInternalFormat == GL_RGB &&
+       srcFormat == GL_BGR &&
+       srcType == GL_UNSIGNED_BYTE &&
+       littleEndian) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else if (!ctx->_ImageTransferState &&
+            !srcPacking->SwapBytes &&
+            srcFormat == GL_RGBA &&
+            srcType == GL_UNSIGNED_BYTE) {
+      /* extract RGB from RGBA */
+      GLint img, row, col;
+      for (img = 0; img < srcDepth; img++) {
+         const GLint srcRowStride =
+            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
+         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
+                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            for (col = 0; col < srcWidth; col++) {
+               dstRow[col * 3 + 0] = srcRow[col * 4 + BCOMP];
+               dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP];
+               dstRow[col * 3 + 2] = srcRow[col * 4 + RCOMP];
+            }
+            dstRow += dstRowStride;
+            srcRow += srcRowStride;
+         }
+      }
+   }
+   else if (!ctx->_ImageTransferState &&
+	    srcType == GL_UNSIGNED_BYTE &&
+	    can_swizzle(baseInternalFormat) &&
+	    can_swizzle(srcFormat)) {
+
+      GLubyte dstmap[4];
+
+      /* dstmap - how to swizzle from RGBA to dst format:
+       */
+      dstmap[0] = 2;
+      dstmap[1] = 1;
+      dstmap[2] = 0;
+      dstmap[3] = ONE;		/* ? */
+      
+      _mesa_swizzle_ubyte_image(ctx, dims,
+				srcFormat,
+				srcType,
+				baseInternalFormat,
+				dstmap, 3,
+				dstAddr, dstXoffset, dstYoffset, dstZoffset,
+				dstRowStride, dstImageOffsets,
+				srcWidth, srcHeight, srcDepth, srcAddr,
+				srcPacking);      
+   }
+   else {
+      /* general path */
+      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
+                                                 baseInternalFormat,
+                                                 baseFormat,
+                                                 srcWidth, srcHeight, srcDepth,
+                                                 srcFormat, srcType, srcAddr,
+                                                 srcPacking);
+      const GLchan *src = (const GLchan *) tempImage;
+      GLint img, row, col;
+      if (!tempImage)
+         return GL_FALSE;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+#if 0
+            if (littleEndian) {
+               for (col = 0; col < srcWidth; col++) {
+                  dstRow[col * 3 + 0] = CHAN_TO_UBYTE(src[RCOMP]);
+                  dstRow[col * 3 + 1] = CHAN_TO_UBYTE(src[GCOMP]);
+                  dstRow[col * 3 + 2] = CHAN_TO_UBYTE(src[BCOMP]);
+                  srcUB += 3;
+               }
+            }
+            else {
+               for (col = 0; col < srcWidth; col++) {
+                  dstRow[col * 3 + 0] = srcUB[BCOMP];
+                  dstRow[col * 3 + 1] = srcUB[GCOMP];
+                  dstRow[col * 3 + 2] = srcUB[RCOMP];
+                  srcUB += 3;
+               }
+            }
+#else
+            for (col = 0; col < srcWidth; col++) {
+               dstRow[col * 3 + 0] = CHAN_TO_UBYTE(src[BCOMP]);
+               dstRow[col * 3 + 1] = CHAN_TO_UBYTE(src[GCOMP]);
+               dstRow[col * 3 + 2] = CHAN_TO_UBYTE(src[RCOMP]);
+               src += 3;
+            }
+#endif
+            dstRow += dstRowStride;
+         }
+      }
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+
+static GLboolean
+_mesa_texstore_bgr888(TEXSTORE_PARAMS)
+{
+   const GLboolean littleEndian = _mesa_little_endian();
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_BGR888);
+   ASSERT(texelBytes == 3);
+
+   if (!ctx->_ImageTransferState &&
+       !srcPacking->SwapBytes &&
+       baseInternalFormat == GL_RGB &&
+       srcFormat == GL_RGB &&
+       srcType == GL_UNSIGNED_BYTE &&
+       littleEndian) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else if (!ctx->_ImageTransferState &&
+            !srcPacking->SwapBytes &&
+            srcFormat == GL_RGBA &&
+            srcType == GL_UNSIGNED_BYTE) {
+      /* extract BGR from RGBA */
+      int img, row, col;
+      for (img = 0; img < srcDepth; img++) {
+         const GLint srcRowStride =
+            _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType);
+         GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking,
+                  srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0);
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            for (col = 0; col < srcWidth; col++) {
+               dstRow[col * 3 + 0] = srcRow[col * 4 + RCOMP];
+               dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP];
+               dstRow[col * 3 + 2] = srcRow[col * 4 + BCOMP];
+            }
+            dstRow += dstRowStride;
+            srcRow += srcRowStride;
+         }
+      }
+   }
+   else if (!ctx->_ImageTransferState &&
+	    srcType == GL_UNSIGNED_BYTE &&
+	    can_swizzle(baseInternalFormat) &&
+	    can_swizzle(srcFormat)) {
+
+      GLubyte dstmap[4];
+
+      /* dstmap - how to swizzle from RGBA to dst format:
+       */
+      dstmap[0] = 0;
+      dstmap[1] = 1;
+      dstmap[2] = 2;
+      dstmap[3] = ONE;		/* ? */
+      
+      _mesa_swizzle_ubyte_image(ctx, dims,
+				srcFormat,
+				srcType,
+				baseInternalFormat,
+				dstmap, 3,
+				dstAddr, dstXoffset, dstYoffset, dstZoffset,
+				dstRowStride, dstImageOffsets,
+				srcWidth, srcHeight, srcDepth, srcAddr,
+				srcPacking);      
+   }   
+   else {
+      /* general path */
+      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
+                                                 baseInternalFormat,
+                                                 baseFormat,
+                                                 srcWidth, srcHeight, srcDepth,
+                                                 srcFormat, srcType, srcAddr,
+                                                 srcPacking);
+      const GLchan *src = (const GLchan *) tempImage;
+      GLint img, row, col;
+      if (!tempImage)
+         return GL_FALSE;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            for (col = 0; col < srcWidth; col++) {
+               dstRow[col * 3 + 0] = CHAN_TO_UBYTE(src[RCOMP]);
+               dstRow[col * 3 + 1] = CHAN_TO_UBYTE(src[GCOMP]);
+               dstRow[col * 3 + 2] = CHAN_TO_UBYTE(src[BCOMP]);
+               src += 3;
+            }
+            dstRow += dstRowStride;
+         }
+      }
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+
+static GLboolean
+_mesa_texstore_argb4444(TEXSTORE_PARAMS)
+{
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_ARGB4444 ||
+          dstFormat == MESA_FORMAT_ARGB4444_REV);
+   ASSERT(texelBytes == 2);
+
+   if (!ctx->_ImageTransferState &&
+       !srcPacking->SwapBytes &&
+       dstFormat == MESA_FORMAT_ARGB4444 &&
+       baseInternalFormat == GL_RGBA &&
+       srcFormat == GL_BGRA &&
+       srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else {
+      /* general path */
+      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
+                                                 baseInternalFormat,
+                                                 baseFormat,
+                                                 srcWidth, srcHeight, srcDepth,
+                                                 srcFormat, srcType, srcAddr,
+                                                 srcPacking);
+      const GLchan *src = tempImage;
+      GLint img, row, col;
+      if (!tempImage)
+         return GL_FALSE;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            GLushort *dstUS = (GLushort *) dstRow;
+            if (dstFormat == MESA_FORMAT_ARGB4444) {
+               for (col = 0; col < srcWidth; col++) {
+                  dstUS[col] = PACK_COLOR_4444( CHAN_TO_UBYTE(src[ACOMP]),
+                                                CHAN_TO_UBYTE(src[RCOMP]),
+                                                CHAN_TO_UBYTE(src[GCOMP]),
+                                                CHAN_TO_UBYTE(src[BCOMP]) );
+                  src += 4;
+               }
+            }
+            else {
+               for (col = 0; col < srcWidth; col++) {
+                  dstUS[col] = PACK_COLOR_4444_REV( CHAN_TO_UBYTE(src[ACOMP]),
+                                                    CHAN_TO_UBYTE(src[RCOMP]),
+                                                    CHAN_TO_UBYTE(src[GCOMP]),
+                                                    CHAN_TO_UBYTE(src[BCOMP]) );
+                  src += 4;
+               }
+            }
+            dstRow += dstRowStride;
+         }
+      }
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+static GLboolean
+_mesa_texstore_rgba5551(TEXSTORE_PARAMS)
+{
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_RGBA5551);
+   ASSERT(texelBytes == 2);
+
+   if (!ctx->_ImageTransferState &&
+       !srcPacking->SwapBytes &&
+       dstFormat == MESA_FORMAT_RGBA5551 &&
+       baseInternalFormat == GL_RGBA &&
+       srcFormat == GL_RGBA &&
+       srcType == GL_UNSIGNED_SHORT_5_5_5_1) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else {
+      /* general path */
+      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
+                                                 baseInternalFormat,
+                                                 baseFormat,
+                                                 srcWidth, srcHeight, srcDepth,
+                                                 srcFormat, srcType, srcAddr,
+                                                 srcPacking);
+      const GLchan *src =tempImage;
+      GLint img, row, col;
+      if (!tempImage)
+         return GL_FALSE;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            GLushort *dstUS = (GLushort *) dstRow;
+	    for (col = 0; col < srcWidth; col++) {
+	       dstUS[col] = PACK_COLOR_5551( CHAN_TO_UBYTE(src[RCOMP]),
+					     CHAN_TO_UBYTE(src[GCOMP]),
+					     CHAN_TO_UBYTE(src[BCOMP]),
+					     CHAN_TO_UBYTE(src[ACOMP]) );
+	      src += 4;
+	    }
+            dstRow += dstRowStride;
+         }
+      }
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+static GLboolean
+_mesa_texstore_argb1555(TEXSTORE_PARAMS)
+{
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_ARGB1555 ||
+          dstFormat == MESA_FORMAT_ARGB1555_REV);
+   ASSERT(texelBytes == 2);
+
+   if (!ctx->_ImageTransferState &&
+       !srcPacking->SwapBytes &&
+       dstFormat == MESA_FORMAT_ARGB1555 &&
+       baseInternalFormat == GL_RGBA &&
+       srcFormat == GL_BGRA &&
+       srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else {
+      /* general path */
+      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
+                                                 baseInternalFormat,
+                                                 baseFormat,
+                                                 srcWidth, srcHeight, srcDepth,
+                                                 srcFormat, srcType, srcAddr,
+                                                 srcPacking);
+      const GLchan *src =tempImage;
+      GLint img, row, col;
+      if (!tempImage)
+         return GL_FALSE;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            GLushort *dstUS = (GLushort *) dstRow;
+            if (dstFormat == MESA_FORMAT_ARGB1555) {
+               for (col = 0; col < srcWidth; col++) {
+                  dstUS[col] = PACK_COLOR_1555( CHAN_TO_UBYTE(src[ACOMP]),
+                                                CHAN_TO_UBYTE(src[RCOMP]),
+                                                CHAN_TO_UBYTE(src[GCOMP]),
+                                                CHAN_TO_UBYTE(src[BCOMP]) );
+                  src += 4;
+               }
+            }
+            else {
+               for (col = 0; col < srcWidth; col++) {
+                  dstUS[col] = PACK_COLOR_1555_REV( CHAN_TO_UBYTE(src[ACOMP]),
+                                                    CHAN_TO_UBYTE(src[RCOMP]),
+                                                    CHAN_TO_UBYTE(src[GCOMP]),
+                                                    CHAN_TO_UBYTE(src[BCOMP]) );
+                  src += 4;
+               }
+            }
+            dstRow += dstRowStride;
+         }
+      }
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+
+static GLboolean
+_mesa_texstore_argb2101010(TEXSTORE_PARAMS)
+{
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_ARGB2101010);
+   ASSERT(texelBytes == 4);
+
+   if (!ctx->_ImageTransferState &&
+       !srcPacking->SwapBytes &&
+       dstFormat == MESA_FORMAT_ARGB2101010 &&
+       srcFormat == GL_BGRA &&
+       srcType == GL_UNSIGNED_INT_2_10_10_10_REV &&
+       baseInternalFormat == GL_RGBA) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else {
+      /* general path */
+      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
+                                                 baseInternalFormat,
+                                                 baseFormat,
+                                                 srcWidth, srcHeight, srcDepth,
+                                                 srcFormat, srcType, srcAddr,
+                                                 srcPacking,
+                                                 ctx->_ImageTransferState);
+      const GLfloat *src = tempImage;
+      GLint img, row, col;
+      if (!tempImage)
+         return GL_FALSE;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         if (baseInternalFormat == GL_RGBA) {
+            for (row = 0; row < srcHeight; row++) {
+               GLuint *dstUI = (GLuint *) dstRow;
+               for (col = 0; col < srcWidth; col++) {
+                  GLushort a,r,g,b;
+
+                  UNCLAMPED_FLOAT_TO_USHORT(a, src[ACOMP]);
+                  UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]);
+                  UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]);
+                  UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]);
+                  dstUI[col] = PACK_COLOR_2101010_US(a, r, g, b);
+                  src += 4;
+               }
+               dstRow += dstRowStride;
+            }
+         } else if (baseInternalFormat == GL_RGB) {
+            for (row = 0; row < srcHeight; row++) {
+               GLuint *dstUI = (GLuint *) dstRow;
+               for (col = 0; col < srcWidth; col++) {
+                  GLushort r,g,b;
+
+                  UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]);
+                  UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]);
+                  UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]);
+                  dstUI[col] = PACK_COLOR_2101010_US(0xffff, r, g, b);
+                  src += 4;
+               }
+               dstRow += dstRowStride;
+            }
+         } else {
+            ASSERT(0);
+         }
+      }
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+
+/**
+ * Do texstore for 2-channel, 4-bit/channel, unsigned normalized formats.
+ */
+static GLboolean
+_mesa_texstore_unorm44(TEXSTORE_PARAMS)
+{
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_AL44);
+   ASSERT(texelBytes == 1);
+
+   {
+      /* general path */
+      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
+                                                 baseInternalFormat,
+                                                 baseFormat,
+                                                 srcWidth, srcHeight, srcDepth,
+                                                 srcFormat, srcType, srcAddr,
+                                                 srcPacking);
+      const GLchan *src = tempImage;
+      GLint img, row, col;
+      if (!tempImage)
+         return GL_FALSE;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            GLubyte *dstUS = (GLubyte *) dstRow;
+            for (col = 0; col < srcWidth; col++) {
+               /* src[0] is luminance, src[1] is alpha */
+               dstUS[col] = PACK_COLOR_44( CHAN_TO_UBYTE(src[1]),
+                                           CHAN_TO_UBYTE(src[0]) );
+               src += 2;
+            }
+            dstRow += dstRowStride;
+         }
+      }
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+
+/**
+ * Do texstore for 2-channel, 8-bit/channel, unsigned normalized formats.
+ */
+static GLboolean
+_mesa_texstore_unorm88(TEXSTORE_PARAMS)
+{
+   const GLboolean littleEndian = _mesa_little_endian();
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_AL88 ||
+          dstFormat == MESA_FORMAT_AL88_REV ||
+          dstFormat == MESA_FORMAT_RG88 ||
+          dstFormat == MESA_FORMAT_RG88_REV);
+   ASSERT(texelBytes == 2);
+
+   if (!ctx->_ImageTransferState &&
+       !srcPacking->SwapBytes &&
+       (dstFormat == MESA_FORMAT_AL88 || dstFormat == MESA_FORMAT_RG88) &&
+       baseInternalFormat == srcFormat &&
+       srcType == GL_UNSIGNED_BYTE &&
+       littleEndian) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else if (!ctx->_ImageTransferState &&
+	    littleEndian &&
+	    srcType == GL_UNSIGNED_BYTE &&
+	    can_swizzle(baseInternalFormat) &&
+	    can_swizzle(srcFormat)) {
+      GLubyte dstmap[4];
+
+      /* dstmap - how to swizzle from RGBA to dst format:
+       */
+      if (dstFormat == MESA_FORMAT_AL88 || dstFormat == MESA_FORMAT_AL88_REV) {
+	 if ((littleEndian && dstFormat == MESA_FORMAT_AL88) ||
+	     (!littleEndian && dstFormat == MESA_FORMAT_AL88_REV)) {
+	    dstmap[0] = 0;
+	    dstmap[1] = 3;
+	 }
+	 else {
+	    dstmap[0] = 3;
+	    dstmap[1] = 0;
+	 }
+      }
+      else {
+	 if ((littleEndian && dstFormat == MESA_FORMAT_RG88) ||
+	     (!littleEndian && dstFormat == MESA_FORMAT_RG88_REV)) {
+	    dstmap[0] = 0;
+	    dstmap[1] = 1;
+	 }
+	 else {
+	    dstmap[0] = 1;
+	    dstmap[1] = 0;
+	 }
+      }
+      dstmap[2] = ZERO;		/* ? */
+      dstmap[3] = ONE;		/* ? */
+      
+      _mesa_swizzle_ubyte_image(ctx, dims,
+				srcFormat,
+				srcType,
+				baseInternalFormat,
+				dstmap, 2,
+				dstAddr, dstXoffset, dstYoffset, dstZoffset,
+				dstRowStride, dstImageOffsets,
+				srcWidth, srcHeight, srcDepth, srcAddr,
+				srcPacking);      
+   }   
+   else {
+      /* general path */
+      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
+                                                 baseInternalFormat,
+                                                 baseFormat,
+                                                 srcWidth, srcHeight, srcDepth,
+                                                 srcFormat, srcType, srcAddr,
+                                                 srcPacking);
+      const GLchan *src = tempImage;
+      GLint img, row, col;
+      if (!tempImage)
+         return GL_FALSE;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            GLushort *dstUS = (GLushort *) dstRow;
+            if (dstFormat == MESA_FORMAT_AL88 ||
+		dstFormat == MESA_FORMAT_RG88) {
+               for (col = 0; col < srcWidth; col++) {
+                  /* src[0] is luminance, src[1] is alpha */
+                 dstUS[col] = PACK_COLOR_88( CHAN_TO_UBYTE(src[1]),
+                                             CHAN_TO_UBYTE(src[0]) );
+                 src += 2;
+               }
+            }
+            else {
+               for (col = 0; col < srcWidth; col++) {
+                  /* src[0] is luminance, src[1] is alpha */
+                 dstUS[col] = PACK_COLOR_88_REV( CHAN_TO_UBYTE(src[1]),
+                                                 CHAN_TO_UBYTE(src[0]) );
+                 src += 2;
+               }
+            }
+            dstRow += dstRowStride;
+         }
+      }
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+
+/**
+ * Do texstore for 2-channel, 16-bit/channel, unsigned normalized formats.
+ */
+static GLboolean
+_mesa_texstore_unorm1616(TEXSTORE_PARAMS)
+{
+   const GLboolean littleEndian = _mesa_little_endian();
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_AL1616 ||
+          dstFormat == MESA_FORMAT_AL1616_REV ||
+	  dstFormat == MESA_FORMAT_RG1616 ||
+          dstFormat == MESA_FORMAT_RG1616_REV);
+   ASSERT(texelBytes == 4);
+
+   if (!ctx->_ImageTransferState &&
+       !srcPacking->SwapBytes &&
+       (dstFormat == MESA_FORMAT_AL1616 || dstFormat == MESA_FORMAT_RG1616) &&
+       baseInternalFormat == srcFormat &&
+       srcType == GL_UNSIGNED_SHORT &&
+       littleEndian) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else {
+      /* general path */
+      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
+                                                 baseInternalFormat,
+                                                 baseFormat,
+                                                 srcWidth, srcHeight, srcDepth,
+                                                 srcFormat, srcType, srcAddr,
+                                                 srcPacking,
+                                                 ctx->_ImageTransferState);
+      const GLfloat *src = tempImage;
+      GLint img, row, col;
+      if (!tempImage)
+         return GL_FALSE;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            GLuint *dstUI = (GLuint *) dstRow;
+            if (dstFormat == MESA_FORMAT_AL1616 ||
+		dstFormat == MESA_FORMAT_RG1616) {
+               for (col = 0; col < srcWidth; col++) {
+		  GLushort l, a;
+
+		  UNCLAMPED_FLOAT_TO_USHORT(l, src[0]);
+		  UNCLAMPED_FLOAT_TO_USHORT(a, src[1]);
+		  dstUI[col] = PACK_COLOR_1616(a, l);
+		  src += 2;
+               }
+            }
+            else {
+               for (col = 0; col < srcWidth; col++) {
+		  GLushort l, a;
+
+		  UNCLAMPED_FLOAT_TO_USHORT(l, src[0]);
+		  UNCLAMPED_FLOAT_TO_USHORT(a, src[1]);
+		  dstUI[col] = PACK_COLOR_1616_REV(a, l);
+		  src += 2;
+               }
+            }
+            dstRow += dstRowStride;
+         }
+      }
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+
+/* Texstore for R16, A16, L16, I16. */
+static GLboolean
+_mesa_texstore_unorm16(TEXSTORE_PARAMS)
+{
+   const GLboolean littleEndian = _mesa_little_endian();
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_R16 ||
+          dstFormat == MESA_FORMAT_A16 ||
+          dstFormat == MESA_FORMAT_L16 ||
+          dstFormat == MESA_FORMAT_I16);
+   ASSERT(texelBytes == 2);
+
+   if (!ctx->_ImageTransferState &&
+       !srcPacking->SwapBytes &&
+       baseInternalFormat == srcFormat &&
+       srcType == GL_UNSIGNED_SHORT &&
+       littleEndian) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else {
+      /* general path */
+      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
+                                                 baseInternalFormat,
+                                                 baseFormat,
+                                                 srcWidth, srcHeight, srcDepth,
+                                                 srcFormat, srcType, srcAddr,
+                                                 srcPacking,
+                                                 ctx->_ImageTransferState);
+      const GLfloat *src = tempImage;
+      GLint img, row, col;
+      if (!tempImage)
+         return GL_FALSE;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            GLushort *dstUS = (GLushort *) dstRow;
+	    for (col = 0; col < srcWidth; col++) {
+	       GLushort r;
+
+	       UNCLAMPED_FLOAT_TO_USHORT(r, src[0]);
+	       dstUS[col] = r;
+	       src += 1;
+	    }
+            dstRow += dstRowStride;
+         }
+      }
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+
+static GLboolean
+_mesa_texstore_rgba_16(TEXSTORE_PARAMS)
+{
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_RGBA_16);
+   ASSERT(texelBytes == 8);
+
+   if (!ctx->_ImageTransferState &&
+       !srcPacking->SwapBytes &&
+       baseInternalFormat == GL_RGBA &&
+       srcFormat == GL_RGBA &&
+       srcType == GL_UNSIGNED_SHORT) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else {
+      /* general path */
+      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
+                                                 baseInternalFormat,
+                                                 baseFormat,
+                                                 srcWidth, srcHeight, srcDepth,
+                                                 srcFormat, srcType, srcAddr,
+                                                 srcPacking,
+                                                 ctx->_ImageTransferState);
+      const GLfloat *src = tempImage;
+      GLint img, row, col;
+      if (!tempImage)
+         return GL_FALSE;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            GLushort *dstUS = (GLushort *) dstRow;
+            for (col = 0; col < srcWidth; col++) {
+               GLushort r, g, b, a;
+
+               UNCLAMPED_FLOAT_TO_USHORT(r, src[0]);
+               UNCLAMPED_FLOAT_TO_USHORT(g, src[1]);
+               UNCLAMPED_FLOAT_TO_USHORT(b, src[2]);
+               UNCLAMPED_FLOAT_TO_USHORT(a, src[3]);
+               dstUS[col*4+0] = r;
+               dstUS[col*4+1] = g;
+               dstUS[col*4+2] = b;
+               dstUS[col*4+3] = a;
+               src += 4;
+            }
+            dstRow += dstRowStride;
+         }
+      }
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+
+static GLboolean
+_mesa_texstore_signed_rgba_16(TEXSTORE_PARAMS)
+{
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGB_16 ||
+          dstFormat == MESA_FORMAT_SIGNED_RGBA_16);
+
+   if (!ctx->_ImageTransferState &&
+       !srcPacking->SwapBytes &&
+       baseInternalFormat == GL_RGBA &&
+       dstFormat == MESA_FORMAT_SIGNED_RGBA_16 &&
+       srcFormat == GL_RGBA &&
+       srcType == GL_SHORT) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else {
+      /* general path */
+      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
+                                                 baseInternalFormat,
+                                                 baseFormat,
+                                                 srcWidth, srcHeight, srcDepth,
+                                                 srcFormat, srcType, srcAddr,
+                                                 srcPacking,
+                                                 ctx->_ImageTransferState);
+      const GLfloat *src = tempImage;
+      const GLuint comps = _mesa_get_format_bytes(dstFormat) / 2;
+      GLint img, row, col;
+
+      if (!tempImage)
+         return GL_FALSE;
+
+      /* Note: tempImage is always float[4] / RGBA.  We convert to 1, 2,
+       * 3 or 4 components/pixel here.
+       */
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            GLshort *dstRowS = (GLshort *) dstRow;
+            if (dstFormat == MESA_FORMAT_SIGNED_RGBA_16) {
+               for (col = 0; col < srcWidth; col++) {
+                  GLuint c;
+                  for (c = 0; c < comps; c++) {
+                     GLshort p;
+                     UNCLAMPED_FLOAT_TO_SHORT(p, src[col * 4 + c]);
+                     dstRowS[col * comps + c] = p;
+                  }
+               }
+               dstRow += dstRowStride;
+               src += 4 * srcWidth;
+            } else {
+               for (col = 0; col < srcWidth; col++) {
+                  GLuint c;
+                  for (c = 0; c < comps; c++) {
+                     GLshort p;
+                     UNCLAMPED_FLOAT_TO_SHORT(p, src[col * 3 + c]);
+                     dstRowS[col * comps + c] = p;
+                  }
+               }
+               dstRow += dstRowStride;
+               src += 3 * srcWidth;
+            }
+         }
+      }
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+
+static GLboolean
+_mesa_texstore_rgb332(TEXSTORE_PARAMS)
+{
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_RGB332);
+   ASSERT(texelBytes == 1);
+
+   if (!ctx->_ImageTransferState &&
+       !srcPacking->SwapBytes &&
+       baseInternalFormat == GL_RGB &&
+       srcFormat == GL_RGB && srcType == GL_UNSIGNED_BYTE_3_3_2) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else {
+      /* general path */
+      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
+                                                 baseInternalFormat,
+                                                 baseFormat,
+                                                 srcWidth, srcHeight, srcDepth,
+                                                 srcFormat, srcType, srcAddr,
+                                                 srcPacking);
+      const GLchan *src = tempImage;
+      GLint img, row, col;
+      if (!tempImage)
+         return GL_FALSE;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            for (col = 0; col < srcWidth; col++) {
+               dstRow[col] = PACK_COLOR_332( CHAN_TO_UBYTE(src[RCOMP]),
+                                             CHAN_TO_UBYTE(src[GCOMP]),
+                                             CHAN_TO_UBYTE(src[BCOMP]) );
+               src += 3;
+            }
+            dstRow += dstRowStride;
+         }
+      }
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+
+/**
+ * Texstore for _mesa_texformat_a8, _mesa_texformat_l8, _mesa_texformat_i8.
+ */
+static GLboolean
+_mesa_texstore_unorm8(TEXSTORE_PARAMS)
+{
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_A8 ||
+          dstFormat == MESA_FORMAT_L8 ||
+          dstFormat == MESA_FORMAT_I8 ||
+          dstFormat == MESA_FORMAT_R8);
+   ASSERT(texelBytes == 1);
+
+   if (!ctx->_ImageTransferState &&
+       !srcPacking->SwapBytes &&
+       baseInternalFormat == srcFormat &&
+       srcType == GL_UNSIGNED_BYTE) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else if (!ctx->_ImageTransferState &&
+	    srcType == GL_UNSIGNED_BYTE &&
+	    can_swizzle(baseInternalFormat) &&
+	    can_swizzle(srcFormat)) {
+      GLubyte dstmap[4];
+
+      /* dstmap - how to swizzle from RGBA to dst format:
+       */
+      if (dstFormat == MESA_FORMAT_A8) {
+	 dstmap[0] = 3;
+      }
+      else {
+	 dstmap[0] = 0;
+      }
+      dstmap[1] = ZERO;		/* ? */
+      dstmap[2] = ZERO;		/* ? */
+      dstmap[3] = ONE;		/* ? */
+      
+      _mesa_swizzle_ubyte_image(ctx, dims,
+				srcFormat,
+				srcType,
+				baseInternalFormat,
+				dstmap, 1,
+				dstAddr, dstXoffset, dstYoffset, dstZoffset,
+				dstRowStride, dstImageOffsets,
+				srcWidth, srcHeight, srcDepth, srcAddr,
+				srcPacking);      
+   }   
+   else {
+      /* general path */
+      const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims,
+                                                 baseInternalFormat,
+                                                 baseFormat,
+                                                 srcWidth, srcHeight, srcDepth,
+                                                 srcFormat, srcType, srcAddr,
+                                                 srcPacking);
+      const GLchan *src = tempImage;
+      GLint img, row, col;
+      if (!tempImage)
+         return GL_FALSE;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            for (col = 0; col < srcWidth; col++) {
+               dstRow[col] = CHAN_TO_UBYTE(src[col]);
+            }
+            dstRow += dstRowStride;
+            src += srcWidth;
+         }
+      }
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+
+
+static GLboolean
+_mesa_texstore_ci8(TEXSTORE_PARAMS)
+{
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+
+   (void) dims; (void) baseInternalFormat;
+   ASSERT(dstFormat == MESA_FORMAT_CI8);
+   ASSERT(texelBytes == 1);
+   ASSERT(baseInternalFormat == GL_COLOR_INDEX);
+
+   if (!ctx->_ImageTransferState &&
+       !srcPacking->SwapBytes &&
+       srcFormat == GL_COLOR_INDEX &&
+       srcType == GL_UNSIGNED_BYTE) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else {
+      /* general path */
+      GLint img, row;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            const GLvoid *src = _mesa_image_address(dims, srcPacking,
+                srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0);
+            _mesa_unpack_index_span(ctx, srcWidth, GL_UNSIGNED_BYTE, dstRow,
+                                    srcType, src, srcPacking,
+                                    ctx->_ImageTransferState);
+            dstRow += dstRowStride;
+         }
+      }
+   }
+   return GL_TRUE;
+}
+
+
+/**
+ * Texstore for _mesa_texformat_ycbcr or _mesa_texformat_ycbcr_REV.
+ */
+static GLboolean
+_mesa_texstore_ycbcr(TEXSTORE_PARAMS)
+{
+   const GLboolean littleEndian = _mesa_little_endian();
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+
+   (void) ctx; (void) dims; (void) baseInternalFormat;
+
+   ASSERT((dstFormat == MESA_FORMAT_YCBCR) ||
+          (dstFormat == MESA_FORMAT_YCBCR_REV));
+   ASSERT(texelBytes == 2);
+   ASSERT(ctx->Extensions.MESA_ycbcr_texture);
+   ASSERT(srcFormat == GL_YCBCR_MESA);
+   ASSERT((srcType == GL_UNSIGNED_SHORT_8_8_MESA) ||
+          (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA));
+   ASSERT(baseInternalFormat == GL_YCBCR_MESA);
+
+   /* always just memcpy since no pixel transfer ops apply */
+   memcpy_texture(ctx, dims,
+                  dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                  dstRowStride,
+                  dstImageOffsets,
+                  srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                  srcAddr, srcPacking);
+
+   /* Check if we need byte swapping */
+   /* XXX the logic here _might_ be wrong */
+   if (srcPacking->SwapBytes ^
+       (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA) ^
+       (dstFormat == MESA_FORMAT_YCBCR_REV) ^
+       !littleEndian) {
+      GLint img, row;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            _mesa_swap2((GLushort *) dstRow, srcWidth);
+            dstRow += dstRowStride;
+         }
+      }
+   }
+   return GL_TRUE;
+}
+
+static GLboolean
+_mesa_texstore_dudv8(TEXSTORE_PARAMS)
+{
+   const GLboolean littleEndian = _mesa_little_endian();
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_DUDV8);
+   ASSERT(texelBytes == 2);
+   ASSERT(ctx->Extensions.ATI_envmap_bumpmap);
+   ASSERT((srcFormat == GL_DU8DV8_ATI) ||
+	  (srcFormat == GL_DUDV_ATI));
+   ASSERT(baseInternalFormat == GL_DUDV_ATI);
+
+   if (!srcPacking->SwapBytes && srcType == GL_BYTE &&
+       littleEndian) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else if (srcType == GL_BYTE) {
+      GLubyte dstmap[4];
+
+      /* dstmap - how to swizzle from RGBA to dst format:
+       */
+      if (littleEndian) {
+	 dstmap[0] = 0;
+	 dstmap[1] = 3;
+      }
+      else {
+	 dstmap[0] = 3;
+	 dstmap[1] = 0;
+      }
+      dstmap[2] = ZERO;		/* ? */
+      dstmap[3] = ONE;		/* ? */
+      
+      _mesa_swizzle_ubyte_image(ctx, dims,
+				GL_LUMINANCE_ALPHA, /* hack */
+				GL_UNSIGNED_BYTE, /* hack */
+				GL_LUMINANCE_ALPHA, /* hack */
+				dstmap, 2,
+				dstAddr, dstXoffset, dstYoffset, dstZoffset,
+				dstRowStride, dstImageOffsets,
+				srcWidth, srcHeight, srcDepth, srcAddr,
+				srcPacking);      
+   }   
+   else {
+      /* general path - note this is defined for 2d textures only */
+      const GLint components = _mesa_components_in_format(baseInternalFormat);
+      const GLint srcStride = _mesa_image_row_stride(srcPacking, srcWidth,
+                                                     srcFormat, srcType);
+      GLbyte *tempImage, *dst, *src;
+      GLint row;
+
+      tempImage = (GLbyte *) malloc(srcWidth * srcHeight * srcDepth
+                                          * components * sizeof(GLbyte));
+      if (!tempImage)
+         return GL_FALSE;
+
+      src = (GLbyte *) _mesa_image_address(dims, srcPacking, srcAddr,
+                                           srcWidth, srcHeight,
+                                           srcFormat, srcType,
+                                           0, 0, 0);
+
+      dst = tempImage;
+      for (row = 0; row < srcHeight; row++) {
+         _mesa_unpack_dudv_span_byte(ctx, srcWidth, baseInternalFormat,
+                                     dst, srcFormat, srcType, src,
+                                     srcPacking, 0);
+         dst += srcWidth * components;
+         src += srcStride;
+      }
+ 
+      src = tempImage;
+      dst = (GLbyte *) dstAddr
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+      for (row = 0; row < srcHeight; row++) {
+         memcpy(dst, src, srcWidth * texelBytes);
+         dst += dstRowStride;
+         src += srcWidth * texelBytes;
+      }
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+
+/**
+ * Store a texture in a signed normalized 8-bit format.
+ */
+static GLboolean
+_mesa_texstore_snorm8(TEXSTORE_PARAMS)
+{
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_SIGNED_A8 ||
+          dstFormat == MESA_FORMAT_SIGNED_L8 ||
+          dstFormat == MESA_FORMAT_SIGNED_I8 ||
+          dstFormat == MESA_FORMAT_SIGNED_R8);
+   ASSERT(texelBytes == 1);
+
+   if (!ctx->_ImageTransferState &&
+       !srcPacking->SwapBytes &&
+       baseInternalFormat == srcFormat &&
+       srcType == GL_BYTE) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else {
+      /* general path */
+      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
+                                                 baseInternalFormat,
+                                                 baseFormat,
+                                                 srcWidth, srcHeight, srcDepth,
+                                                 srcFormat, srcType, srcAddr,
+                                                 srcPacking,
+                                                 ctx->_ImageTransferState);
+      const GLfloat *src = tempImage;
+      GLint img, row, col;
+      if (!tempImage)
+         return GL_FALSE;
+      for (img = 0; img < srcDepth; img++) {
+         GLbyte *dstRow = (GLbyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            for (col = 0; col < srcWidth; col++) {
+               dstRow[col] = FLOAT_TO_BYTE_TEX(src[col]);
+            }
+            dstRow += dstRowStride;
+            src += srcWidth;
+         }
+      }
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+
+/**
+ * Store a texture in a signed normalized two-channel 16-bit format.
+ */
+static GLboolean
+_mesa_texstore_snorm88(TEXSTORE_PARAMS)
+{
+   const GLboolean littleEndian = _mesa_little_endian();
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_SIGNED_AL88 ||
+          dstFormat == MESA_FORMAT_SIGNED_RG88_REV);
+   ASSERT(texelBytes == 2);
+
+   if (!ctx->_ImageTransferState &&
+       !srcPacking->SwapBytes &&
+       baseInternalFormat == srcFormat &&
+       srcType == GL_BYTE &&
+       littleEndian) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else {
+      /* general path */
+      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
+                                                 baseInternalFormat,
+                                                 baseFormat,
+                                                 srcWidth, srcHeight, srcDepth,
+                                                 srcFormat, srcType, srcAddr,
+                                                 srcPacking,
+                                                 ctx->_ImageTransferState);
+      const GLfloat *src = tempImage;
+      GLint img, row, col;
+      if (!tempImage)
+         return GL_FALSE;
+      for (img = 0; img < srcDepth; img++) {
+         GLbyte *dstRow = (GLbyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            GLbyte *dst = dstRow;
+            for (col = 0; col < srcWidth; col++) {
+               dst[0] = FLOAT_TO_BYTE_TEX(src[0]);
+               dst[1] = FLOAT_TO_BYTE_TEX(src[1]);
+               src += 2;
+               dst += 2;
+            }
+            dstRow += dstRowStride;
+         }
+      }
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+/* Texstore for signed R16, A16, L16, I16. */
+static GLboolean
+_mesa_texstore_snorm16(TEXSTORE_PARAMS)
+{
+   const GLboolean littleEndian = _mesa_little_endian();
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_SIGNED_R16 ||
+          dstFormat == MESA_FORMAT_SIGNED_A16 ||
+          dstFormat == MESA_FORMAT_SIGNED_L16 ||
+          dstFormat == MESA_FORMAT_SIGNED_I16);
+   ASSERT(texelBytes == 2);
+
+   if (!ctx->_ImageTransferState &&
+       !srcPacking->SwapBytes &&
+       baseInternalFormat == srcFormat &&
+       srcType == GL_SHORT &&
+       littleEndian) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else {
+      /* general path */
+      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
+                                                 baseInternalFormat,
+                                                 baseFormat,
+                                                 srcWidth, srcHeight, srcDepth,
+                                                 srcFormat, srcType, srcAddr,
+                                                 srcPacking,
+                                                 ctx->_ImageTransferState);
+      const GLfloat *src = tempImage;
+      GLint img, row, col;
+      if (!tempImage)
+         return GL_FALSE;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            GLshort *dstUS = (GLshort *) dstRow;
+	    for (col = 0; col < srcWidth; col++) {
+	       GLushort r;
+
+	       UNCLAMPED_FLOAT_TO_SHORT(r, src[0]);
+	       dstUS[col] = r;
+	       src += 1;
+	    }
+            dstRow += dstRowStride;
+         }
+      }
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+/**
+ * Do texstore for 2-channel, 16-bit/channel, signed normalized formats.
+ */
+static GLboolean
+_mesa_texstore_snorm1616(TEXSTORE_PARAMS)
+{
+   const GLboolean littleEndian = _mesa_little_endian();
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_SIGNED_AL1616 ||
+          dstFormat == MESA_FORMAT_SIGNED_GR1616);
+   ASSERT(texelBytes == 4);
+
+   if (!ctx->_ImageTransferState &&
+       !srcPacking->SwapBytes &&
+       baseInternalFormat == srcFormat &&
+       srcType == GL_SHORT &&
+       littleEndian) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else {
+      /* general path */
+      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
+                                                 baseInternalFormat,
+                                                 baseFormat,
+                                                 srcWidth, srcHeight, srcDepth,
+                                                 srcFormat, srcType, srcAddr,
+                                                 srcPacking,
+                                                 ctx->_ImageTransferState);
+      const GLfloat *src = tempImage;
+      GLint img, row, col;
+      if (!tempImage)
+         return GL_FALSE;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            GLshort *dst = (GLshort *) dstRow;
+            for (col = 0; col < srcWidth; col++) {
+               GLushort l, a;
+
+               UNCLAMPED_FLOAT_TO_SHORT(l, src[0]);
+               UNCLAMPED_FLOAT_TO_SHORT(a, src[1]);
+               dst[0] = l;
+               dst[1] = a;
+               src += 2;
+               dst += 2;
+            }
+            dstRow += dstRowStride;
+         }
+      }
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+/**
+ * Store a texture in MESA_FORMAT_SIGNED_RGBX8888.
+ */
+static GLboolean
+_mesa_texstore_signed_rgbx8888(TEXSTORE_PARAMS)
+{
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBX8888);
+   ASSERT(texelBytes == 4);
+
+   {
+      /* general path */
+      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
+                                                 baseInternalFormat,
+                                                 baseFormat,
+                                                 srcWidth, srcHeight, srcDepth,
+                                                 srcFormat, srcType, srcAddr,
+                                                 srcPacking,
+                                                 ctx->_ImageTransferState);
+      const GLfloat *srcRow = tempImage;
+      GLint img, row, col;
+      if (!tempImage)
+         return GL_FALSE;
+      for (img = 0; img < srcDepth; img++) {
+         GLbyte *dstRow = (GLbyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            GLbyte *dst = dstRow;
+            for (col = 0; col < srcWidth; col++) {
+               dst[3] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]);
+               dst[2] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]);
+               dst[1] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]);
+               dst[0] = 0xff;
+               srcRow += 3;
+               dst += 4;
+            }
+            dstRow += dstRowStride;
+         }
+      }
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+
+
+/**
+ * Store a texture in MESA_FORMAT_SIGNED_RGBA8888 or
+ * MESA_FORMAT_SIGNED_RGBA8888_REV
+ */
+static GLboolean
+_mesa_texstore_signed_rgba8888(TEXSTORE_PARAMS)
+{
+   const GLboolean littleEndian = _mesa_little_endian();
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBA8888 ||
+          dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV);
+   ASSERT(texelBytes == 4);
+
+   if (!ctx->_ImageTransferState &&
+       !srcPacking->SwapBytes &&
+       dstFormat == MESA_FORMAT_SIGNED_RGBA8888 &&
+       baseInternalFormat == GL_RGBA &&
+      ((srcFormat == GL_RGBA && srcType == GL_BYTE && !littleEndian) ||
+       (srcFormat == GL_ABGR_EXT && srcType == GL_BYTE && littleEndian))) {
+       /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else if (!ctx->_ImageTransferState &&
+       !srcPacking->SwapBytes &&
+       dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV &&
+       baseInternalFormat == GL_RGBA &&
+      ((srcFormat == GL_RGBA && srcType == GL_BYTE && littleEndian) ||
+       (srcFormat == GL_ABGR_EXT && srcType == GL_BYTE && !littleEndian))) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else {
+      /* general path */
+      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
+                                                 baseInternalFormat,
+                                                 baseFormat,
+                                                 srcWidth, srcHeight, srcDepth,
+                                                 srcFormat, srcType, srcAddr,
+                                                 srcPacking,
+                                                 ctx->_ImageTransferState);
+      const GLfloat *srcRow = tempImage;
+      GLint img, row, col;
+      if (!tempImage)
+         return GL_FALSE;
+      for (img = 0; img < srcDepth; img++) {
+         GLbyte *dstRow = (GLbyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            GLbyte *dst = dstRow;
+            if (dstFormat == MESA_FORMAT_SIGNED_RGBA8888) {
+               for (col = 0; col < srcWidth; col++) {
+                  dst[3] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]);
+                  dst[2] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]);
+                  dst[1] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]);
+                  dst[0] = FLOAT_TO_BYTE_TEX(srcRow[ACOMP]);
+                  srcRow += 4;
+                  dst += 4;
+               }
+            }
+            else {
+               for (col = 0; col < srcWidth; col++) {
+                  dst[0] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]);
+                  dst[1] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]);
+                  dst[2] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]);
+                  dst[3] = FLOAT_TO_BYTE_TEX(srcRow[ACOMP]);
+                  srcRow += 4;
+                  dst += 4;
+               }
+            }
+            dstRow += dstRowStride;
+         }
+      }
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+
+/**
+ * Store a combined depth/stencil texture image.
+ */
+static GLboolean
+_mesa_texstore_z24_s8(TEXSTORE_PARAMS)
+{
+   const GLuint depthScale = 0xffffff;
+   const GLint srcRowStride
+      = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType)
+      / sizeof(GLuint);
+   GLint img, row;
+
+   ASSERT(dstFormat == MESA_FORMAT_Z24_S8);
+   ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT || srcFormat == GL_DEPTH_COMPONENT);
+   ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT || srcType == GL_UNSIGNED_INT_24_8_EXT);
+
+   if (srcFormat != GL_DEPTH_COMPONENT && ctx->Pixel.DepthScale == 1.0f &&
+       ctx->Pixel.DepthBias == 0.0f &&
+       !srcPacking->SwapBytes) {
+      /* simple path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else if (srcFormat == GL_DEPTH_COMPONENT) {
+      /* In case we only upload depth we need to preserve the stencil */
+      for (img = 0; img < srcDepth; img++) {
+	 GLuint *dstRow = (GLuint *) dstAddr
+            + dstImageOffsets[dstZoffset + img]
+            + dstYoffset * dstRowStride / sizeof(GLuint)
+            + dstXoffset;
+         const GLuint *src
+            = (const GLuint *) _mesa_image_address(dims, srcPacking, srcAddr,
+                  srcWidth, srcHeight,
+                  srcFormat, srcType,
+                  img, 0, 0);
+         for (row = 0; row < srcHeight; row++) {
+            GLuint depth[MAX_WIDTH];
+	    GLubyte stencil[MAX_WIDTH];
+            GLint i;
+	    GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE;
+
+	    if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */
+	       keepstencil = GL_TRUE;
+	    }
+            else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */
+	       keepdepth = GL_TRUE;
+	    }
+
+	    if (keepdepth == GL_FALSE)
+	       /* the 24 depth bits will be in the low position: */
+	       _mesa_unpack_depth_span(ctx, srcWidth,
+				       GL_UNSIGNED_INT, /* dst type */
+				       keepstencil ? depth : dstRow, /* dst addr */
+				       depthScale,
+				       srcType, src, srcPacking);
+
+	    if (keepstencil == GL_FALSE)
+	       /* get the 8-bit stencil values */
+	       _mesa_unpack_stencil_span(ctx, srcWidth,
+					 GL_UNSIGNED_BYTE, /* dst type */
+					 stencil, /* dst addr */
+					 srcType, src, srcPacking,
+					 ctx->_ImageTransferState);
+
+	    for (i = 0; i < srcWidth; i++) {
+	       if (keepstencil)
+		  dstRow[i] = depth[i] << 8 | (dstRow[i] & 0x000000FF);
+	       else
+		  dstRow[i] = (dstRow[i] & 0xFFFFFF00) | (stencil[i] & 0xFF);
+	    }
+
+            src += srcRowStride;
+            dstRow += dstRowStride / sizeof(GLuint);
+         }
+      }
+   }
+   return GL_TRUE;
+}
+
+
+/**
+ * Store a combined depth/stencil texture image.
+ */
+static GLboolean
+_mesa_texstore_s8_z24(TEXSTORE_PARAMS)
+{
+   const GLuint depthScale = 0xffffff;
+   const GLint srcRowStride
+      = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType)
+      / sizeof(GLuint);
+   GLint img, row;
+
+   ASSERT(dstFormat == MESA_FORMAT_S8_Z24);
+   ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT ||
+          srcFormat == GL_DEPTH_COMPONENT ||
+          srcFormat == GL_STENCIL_INDEX);
+   ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT ||
+          srcType == GL_UNSIGNED_INT_24_8_EXT);
+
+   for (img = 0; img < srcDepth; img++) {
+      GLuint *dstRow = (GLuint *) dstAddr
+	 + dstImageOffsets[dstZoffset + img]
+	 + dstYoffset * dstRowStride / sizeof(GLuint)
+	 + dstXoffset;
+      const GLuint *src
+	 = (const GLuint *) _mesa_image_address(dims, srcPacking, srcAddr,
+						srcWidth, srcHeight,
+						srcFormat, srcType,
+						img, 0, 0);
+      for (row = 0; row < srcHeight; row++) {
+	 GLuint depth[MAX_WIDTH];
+	 GLubyte stencil[MAX_WIDTH];
+	 GLint i;
+	 GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE;
+	 
+	 if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */
+	    keepstencil = GL_TRUE;
+	 }
+         else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */
+	    keepdepth = GL_TRUE;
+	 }
+
+	 if (keepdepth == GL_FALSE)
+	    /* the 24 depth bits will be in the low position: */
+	    _mesa_unpack_depth_span(ctx, srcWidth,
+				    GL_UNSIGNED_INT, /* dst type */
+				    keepstencil ? depth : dstRow, /* dst addr */
+				    depthScale,
+				    srcType, src, srcPacking);	 
+
+	 if (keepstencil == GL_FALSE)
+	    /* get the 8-bit stencil values */
+	    _mesa_unpack_stencil_span(ctx, srcWidth,
+				      GL_UNSIGNED_BYTE, /* dst type */
+				      stencil, /* dst addr */
+				      srcType, src, srcPacking,
+				      ctx->_ImageTransferState);
+
+	 /* merge stencil values into depth values */
+	 for (i = 0; i < srcWidth; i++) {
+	    if (keepstencil)
+	       dstRow[i] = depth[i] | (dstRow[i] & 0xFF000000);
+	    else
+	       dstRow[i] = (dstRow[i] & 0xFFFFFF) | (stencil[i] << 24);
+
+	 }
+	 src += srcRowStride;
+	 dstRow += dstRowStride / sizeof(GLuint);
+      }
+   }
+   return GL_TRUE;
+}
+
+
+/**
+ * Store simple 8-bit/value stencil texture data.
+ */
+static GLboolean
+_mesa_texstore_s8(TEXSTORE_PARAMS)
+{
+   ASSERT(dstFormat == MESA_FORMAT_S8);
+   ASSERT(srcFormat == GL_STENCIL_INDEX);
+
+   if (!ctx->_ImageTransferState &&
+       !srcPacking->SwapBytes &&
+       baseInternalFormat == srcFormat &&
+       srcType == GL_UNSIGNED_BYTE) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else {
+      const GLint srcRowStride
+	 = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType)
+	 / sizeof(GLuint);
+      GLint img, row;
+      
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img]
+            + dstYoffset * dstRowStride / sizeof(GLuint)
+            + dstXoffset;
+         const GLuint *src
+            = (const GLuint *) _mesa_image_address(dims, srcPacking, srcAddr,
+                                                   srcWidth, srcHeight,
+                                                   srcFormat, srcType,
+                                                   img, 0, 0);
+         for (row = 0; row < srcHeight; row++) {
+            GLubyte stencil[MAX_WIDTH];
+            GLint i;
+
+            /* get the 8-bit stencil values */
+            _mesa_unpack_stencil_span(ctx, srcWidth,
+                                      GL_UNSIGNED_BYTE, /* dst type */
+                                      stencil, /* dst addr */
+                                      srcType, src, srcPacking,
+                                      ctx->_ImageTransferState);
+            /* merge stencil values into depth values */
+            for (i = 0; i < srcWidth; i++)
+               dstRow[i] = stencil[i];
+
+            src += srcRowStride;
+            dstRow += dstRowStride / sizeof(GLubyte);
+         }
+      }
+
+   }
+
+   return GL_TRUE;
+}
+
+
+/**
+ * Store an image in any of the formats:
+ *   _mesa_texformat_rgba_float32
+ *   _mesa_texformat_rgb_float32
+ *   _mesa_texformat_alpha_float32
+ *   _mesa_texformat_luminance_float32
+ *   _mesa_texformat_luminance_alpha_float32
+ *   _mesa_texformat_intensity_float32
+ */
+static GLboolean
+_mesa_texstore_rgba_float32(TEXSTORE_PARAMS)
+{
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+   const GLint components = _mesa_components_in_format(baseFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT32 ||
+          dstFormat == MESA_FORMAT_RGB_FLOAT32 ||
+          dstFormat == MESA_FORMAT_ALPHA_FLOAT32 ||
+          dstFormat == MESA_FORMAT_LUMINANCE_FLOAT32 ||
+          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32 ||
+          dstFormat == MESA_FORMAT_INTENSITY_FLOAT32);
+   ASSERT(baseInternalFormat == GL_RGBA ||
+          baseInternalFormat == GL_RGB ||
+          baseInternalFormat == GL_ALPHA ||
+          baseInternalFormat == GL_LUMINANCE ||
+          baseInternalFormat == GL_LUMINANCE_ALPHA ||
+          baseInternalFormat == GL_INTENSITY);
+   ASSERT(texelBytes == components * sizeof(GLfloat));
+
+   if (!ctx->_ImageTransferState &&
+       !srcPacking->SwapBytes &&
+       baseInternalFormat == srcFormat &&
+       srcType == GL_FLOAT) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else {
+      /* general path */
+      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
+                                                 baseInternalFormat,
+                                                 baseFormat,
+                                                 srcWidth, srcHeight, srcDepth,
+                                                 srcFormat, srcType, srcAddr,
+                                                 srcPacking,
+                                                 ctx->_ImageTransferState);
+      const GLfloat *srcRow = tempImage;
+      GLint bytesPerRow;
+      GLint img, row;
+      if (!tempImage)
+         return GL_FALSE;
+      bytesPerRow = srcWidth * components * sizeof(GLfloat);
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            memcpy(dstRow, srcRow, bytesPerRow);
+            dstRow += dstRowStride;
+            srcRow += srcWidth * components;
+         }
+      }
+
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+
+
+/**
+ * As above, but store 16-bit floats.
+ */
+static GLboolean
+_mesa_texstore_rgba_float16(TEXSTORE_PARAMS)
+{
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+   const GLint components = _mesa_components_in_format(baseFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT16 ||
+          dstFormat == MESA_FORMAT_RGB_FLOAT16 ||
+          dstFormat == MESA_FORMAT_ALPHA_FLOAT16 ||
+          dstFormat == MESA_FORMAT_LUMINANCE_FLOAT16 ||
+          dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16 ||
+          dstFormat == MESA_FORMAT_INTENSITY_FLOAT16);
+   ASSERT(baseInternalFormat == GL_RGBA ||
+          baseInternalFormat == GL_RGB ||
+          baseInternalFormat == GL_ALPHA ||
+          baseInternalFormat == GL_LUMINANCE ||
+          baseInternalFormat == GL_LUMINANCE_ALPHA ||
+          baseInternalFormat == GL_INTENSITY);
+   ASSERT(texelBytes == components * sizeof(GLhalfARB));
+
+   if (!ctx->_ImageTransferState &&
+       !srcPacking->SwapBytes &&
+       baseInternalFormat == srcFormat &&
+       srcType == GL_HALF_FLOAT_ARB) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else {
+      /* general path */
+      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
+                                                 baseInternalFormat,
+                                                 baseFormat,
+                                                 srcWidth, srcHeight, srcDepth,
+                                                 srcFormat, srcType, srcAddr,
+                                                 srcPacking,
+                                                 ctx->_ImageTransferState);
+      const GLfloat *src = tempImage;
+      GLint img, row;
+      if (!tempImage)
+         return GL_FALSE;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            GLhalfARB *dstTexel = (GLhalfARB *) dstRow;
+            GLint i;
+            for (i = 0; i < srcWidth * components; i++) {
+               dstTexel[i] = _mesa_float_to_half(src[i]);
+            }
+            dstRow += dstRowStride;
+            src += srcWidth * components;
+         }
+      }
+
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+
+/* non-normalized, signed int8 */
+static GLboolean
+_mesa_texstore_rgba_int8(TEXSTORE_PARAMS)
+{
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+   const GLint components = _mesa_components_in_format(baseFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_RGBA_INT8);
+   ASSERT(baseInternalFormat == GL_RGBA ||
+          baseInternalFormat == GL_RGB ||
+          baseInternalFormat == GL_ALPHA ||
+          baseInternalFormat == GL_LUMINANCE ||
+          baseInternalFormat == GL_LUMINANCE_ALPHA ||
+          baseInternalFormat == GL_INTENSITY);
+   ASSERT(texelBytes == components * sizeof(GLbyte));
+
+   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
+    * to integer formats.
+    */
+   if (!srcPacking->SwapBytes &&
+       baseInternalFormat == srcFormat &&
+       srcType == GL_BYTE) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else {
+      /* general path */
+      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
+                                                 baseInternalFormat,
+                                                 baseFormat,
+                                                 srcWidth, srcHeight, srcDepth,
+                                                 srcFormat, srcType, srcAddr,
+                                                 srcPacking, 0x0);
+      const GLfloat *src = tempImage;
+      GLint img, row;
+      if (!tempImage)
+         return GL_FALSE;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            GLbyte *dstTexel = (GLbyte *) dstRow;
+            GLint i;
+            for (i = 0; i < srcWidth * components; i++) {
+               dstTexel[i] = (GLbyte) src[i];
+            }
+            dstRow += dstRowStride;
+            src += srcWidth * components;
+         }
+      }
+
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+
+/* non-normalized, signed int16 */
+static GLboolean
+_mesa_texstore_rgba_int16(TEXSTORE_PARAMS)
+{
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+   const GLint components = _mesa_components_in_format(baseFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_RGBA_INT16);
+   ASSERT(baseInternalFormat == GL_RGBA ||
+          baseInternalFormat == GL_RGB ||
+          baseInternalFormat == GL_ALPHA ||
+          baseInternalFormat == GL_LUMINANCE ||
+          baseInternalFormat == GL_LUMINANCE_ALPHA ||
+          baseInternalFormat == GL_INTENSITY);
+   ASSERT(texelBytes == components * sizeof(GLshort));
+
+   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
+    * to integer formats.
+    */
+   if (!srcPacking->SwapBytes &&
+       baseInternalFormat == srcFormat &&
+       srcType == GL_SHORT) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else {
+      /* general path */
+      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
+                                                 baseInternalFormat,
+                                                 baseFormat,
+                                                 srcWidth, srcHeight, srcDepth,
+                                                 srcFormat, srcType, srcAddr,
+                                                 srcPacking, 0x0);
+      const GLfloat *src = tempImage;
+      GLint img, row;
+      if (!tempImage)
+         return GL_FALSE;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            GLshort *dstTexel = (GLshort *) dstRow;
+            GLint i;
+            for (i = 0; i < srcWidth * components; i++) {
+               dstTexel[i] = (GLint) src[i];
+            }
+            dstRow += dstRowStride;
+            src += srcWidth * components;
+         }
+      }
+
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+
+/* non-normalized, signed int32 */
+static GLboolean
+_mesa_texstore_rgba_int32(TEXSTORE_PARAMS)
+{
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+   const GLint components = _mesa_components_in_format(baseFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_RGBA_INT32);
+   ASSERT(baseInternalFormat == GL_RGBA ||
+          baseInternalFormat == GL_RGB ||
+          baseInternalFormat == GL_ALPHA ||
+          baseInternalFormat == GL_LUMINANCE ||
+          baseInternalFormat == GL_LUMINANCE_ALPHA ||
+          baseInternalFormat == GL_INTENSITY);
+   ASSERT(texelBytes == components * sizeof(GLint));
+
+   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
+    * to integer formats.
+    */
+   if (!srcPacking->SwapBytes &&
+       baseInternalFormat == srcFormat &&
+       srcType == GL_INT) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else {
+      /* general path */
+      const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims,
+                                                 baseInternalFormat,
+                                                 baseFormat,
+                                                 srcWidth, srcHeight, srcDepth,
+                                                 srcFormat, srcType, srcAddr,
+                                                 srcPacking, 0x0);
+      const GLfloat *src = tempImage;
+      GLint img, row;
+      if (!tempImage)
+         return GL_FALSE;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            GLint *dstTexel = (GLint *) dstRow;
+            GLint i;
+            for (i = 0; i < srcWidth * components; i++) {
+               dstTexel[i] = (GLint) src[i];
+            }
+            dstRow += dstRowStride;
+            src += srcWidth * components;
+         }
+      }
+
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+
+/* non-normalized, unsigned int8 */
+static GLboolean
+_mesa_texstore_rgba_uint8(TEXSTORE_PARAMS)
+{
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+   const GLint components = _mesa_components_in_format(baseFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_RGBA_UINT8);
+   ASSERT(baseInternalFormat == GL_RGBA ||
+          baseInternalFormat == GL_RGB ||
+          baseInternalFormat == GL_ALPHA ||
+          baseInternalFormat == GL_LUMINANCE ||
+          baseInternalFormat == GL_LUMINANCE_ALPHA ||
+          baseInternalFormat == GL_INTENSITY);
+   ASSERT(texelBytes == components * sizeof(GLubyte));
+
+   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
+    * to integer formats.
+    */
+   if (!srcPacking->SwapBytes &&
+       baseInternalFormat == srcFormat &&
+       srcType == GL_UNSIGNED_BYTE) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else {
+      /* general path */
+      const GLuint *tempImage =
+         make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat,
+                              srcWidth, srcHeight, srcDepth,
+                              srcFormat, srcType, srcAddr, srcPacking);
+      const GLuint *src = tempImage;
+      GLint img, row;
+      if (!tempImage)
+         return GL_FALSE;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            GLubyte *dstTexel = (GLubyte *) dstRow;
+            GLint i;
+            for (i = 0; i < srcWidth * components; i++) {
+               dstTexel[i] = (GLubyte) CLAMP(src[i], 0, 0xff);
+            }
+            dstRow += dstRowStride;
+            src += srcWidth * components;
+         }
+      }
+
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+
+/* non-normalized, unsigned int16 */
+static GLboolean
+_mesa_texstore_rgba_uint16(TEXSTORE_PARAMS)
+{
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+   const GLint components = _mesa_components_in_format(baseFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_RGBA_UINT16);
+   ASSERT(baseInternalFormat == GL_RGBA ||
+          baseInternalFormat == GL_RGB ||
+          baseInternalFormat == GL_ALPHA ||
+          baseInternalFormat == GL_LUMINANCE ||
+          baseInternalFormat == GL_LUMINANCE_ALPHA ||
+          baseInternalFormat == GL_INTENSITY);
+   ASSERT(texelBytes == components * sizeof(GLushort));
+
+   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
+    * to integer formats.
+    */
+   if (!srcPacking->SwapBytes &&
+       baseInternalFormat == srcFormat &&
+       srcType == GL_UNSIGNED_SHORT) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else {
+      /* general path */
+      const GLuint *tempImage =
+         make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat,
+                              srcWidth, srcHeight, srcDepth,
+                              srcFormat, srcType, srcAddr, srcPacking);
+      const GLuint *src = tempImage;
+      GLint img, row;
+      if (!tempImage)
+         return GL_FALSE;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            GLushort *dstTexel = (GLushort *) dstRow;
+            GLint i;
+            for (i = 0; i < srcWidth * components; i++) {
+               dstTexel[i] = (GLushort) CLAMP(src[i], 0, 0xffff);
+            }
+            dstRow += dstRowStride;
+            src += srcWidth * components;
+         }
+      }
+
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+
+/* non-normalized, unsigned int32 */
+static GLboolean
+_mesa_texstore_rgba_uint32(TEXSTORE_PARAMS)
+{
+   const GLuint texelBytes = _mesa_get_format_bytes(dstFormat);
+   const GLenum baseFormat = _mesa_get_format_base_format(dstFormat);
+   const GLint components = _mesa_components_in_format(baseFormat);
+
+   ASSERT(dstFormat == MESA_FORMAT_RGBA_UINT32);
+   ASSERT(baseInternalFormat == GL_RGBA ||
+          baseInternalFormat == GL_RGB ||
+          baseInternalFormat == GL_ALPHA ||
+          baseInternalFormat == GL_LUMINANCE ||
+          baseInternalFormat == GL_LUMINANCE_ALPHA ||
+          baseInternalFormat == GL_INTENSITY);
+   ASSERT(texelBytes == components * sizeof(GLuint));
+
+   /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply
+    * to integer formats.
+    */
+   if (!srcPacking->SwapBytes &&
+       baseInternalFormat == srcFormat &&
+       srcType == GL_UNSIGNED_INT) {
+      /* simple memcpy path */
+      memcpy_texture(ctx, dims,
+                     dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                     dstRowStride,
+                     dstImageOffsets,
+                     srcWidth, srcHeight, srcDepth, srcFormat, srcType,
+                     srcAddr, srcPacking);
+   }
+   else {
+      /* general path */
+      const GLuint *tempImage =
+         make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat,
+                              srcWidth, srcHeight, srcDepth,
+                              srcFormat, srcType, srcAddr, srcPacking);
+      const GLuint *src = tempImage;
+      GLint img, row;
+      if (!tempImage)
+         return GL_FALSE;
+      for (img = 0; img < srcDepth; img++) {
+         GLubyte *dstRow = (GLubyte *) dstAddr
+            + dstImageOffsets[dstZoffset + img] * texelBytes
+            + dstYoffset * dstRowStride
+            + dstXoffset * texelBytes;
+         for (row = 0; row < srcHeight; row++) {
+            GLuint *dstTexel = (GLuint *) dstRow;
+            GLint i;
+            for (i = 0; i < srcWidth * components; i++) {
+               dstTexel[i] = src[i];
+            }
+            dstRow += dstRowStride;
+            src += srcWidth * components;
+         }
+      }
+
+      free((void *) tempImage);
+   }
+   return GL_TRUE;
+}
+
+
+
+
+#if FEATURE_EXT_texture_sRGB
+static GLboolean
+_mesa_texstore_srgb8(TEXSTORE_PARAMS)
+{
+   gl_format newDstFormat;
+   GLboolean k;
+
+   ASSERT(dstFormat == MESA_FORMAT_SRGB8);
+
+   /* reuse normal rgb texstore code */
+   newDstFormat = MESA_FORMAT_RGB888;
+
+   k = _mesa_texstore_rgb888(ctx, dims, baseInternalFormat,
+                             newDstFormat, dstAddr,
+                             dstXoffset, dstYoffset, dstZoffset,
+                             dstRowStride, dstImageOffsets,
+                             srcWidth, srcHeight, srcDepth,
+                             srcFormat, srcType,
+                             srcAddr, srcPacking);
+   return k;
+}
+
+
+static GLboolean
+_mesa_texstore_srgba8(TEXSTORE_PARAMS)
+{
+   gl_format newDstFormat;
+   GLboolean k;
+
+   ASSERT(dstFormat == MESA_FORMAT_SRGBA8);
+
+   /* reuse normal rgba texstore code */
+   newDstFormat = MESA_FORMAT_RGBA8888;
+   k = _mesa_texstore_rgba8888(ctx, dims, baseInternalFormat,
+                               newDstFormat, dstAddr,
+                               dstXoffset, dstYoffset, dstZoffset,
+                               dstRowStride, dstImageOffsets,
+                               srcWidth, srcHeight, srcDepth,
+                               srcFormat, srcType,
+                               srcAddr, srcPacking);
+   return k;
+}
+
+
+static GLboolean
+_mesa_texstore_sargb8(TEXSTORE_PARAMS)
+{
+   gl_format newDstFormat;
+   GLboolean k;
+
+   ASSERT(dstFormat == MESA_FORMAT_SARGB8);
+
+   /* reuse normal rgba texstore code */
+   newDstFormat = MESA_FORMAT_ARGB8888;
+
+   k = _mesa_texstore_argb8888(ctx, dims, baseInternalFormat,
+                               newDstFormat, dstAddr,
+                               dstXoffset, dstYoffset, dstZoffset,
+                               dstRowStride, dstImageOffsets,
+                               srcWidth, srcHeight, srcDepth,
+                               srcFormat, srcType,
+                               srcAddr, srcPacking);
+   return k;
+}
+
+
+static GLboolean
+_mesa_texstore_sl8(TEXSTORE_PARAMS)
+{
+   gl_format newDstFormat;
+   GLboolean k;
+
+   ASSERT(dstFormat == MESA_FORMAT_SL8);
+
+   newDstFormat = MESA_FORMAT_L8;
+
+   /* _mesa_textore_a8 handles luminance8 too */
+   k = _mesa_texstore_unorm8(ctx, dims, baseInternalFormat,
+                         newDstFormat, dstAddr,
+                         dstXoffset, dstYoffset, dstZoffset,
+                         dstRowStride, dstImageOffsets,
+                         srcWidth, srcHeight, srcDepth,
+                         srcFormat, srcType,
+                         srcAddr, srcPacking);
+   return k;
+}
+
+
+static GLboolean
+_mesa_texstore_sla8(TEXSTORE_PARAMS)
+{
+   gl_format newDstFormat;
+   GLboolean k;
+
+   ASSERT(dstFormat == MESA_FORMAT_SLA8);
+
+   /* reuse normal luminance/alpha texstore code */
+   newDstFormat = MESA_FORMAT_AL88;
+
+   k = _mesa_texstore_unorm88(ctx, dims, baseInternalFormat,
+			      newDstFormat, dstAddr,
+			      dstXoffset, dstYoffset, dstZoffset,
+			      dstRowStride, dstImageOffsets,
+			      srcWidth, srcHeight, srcDepth,
+			      srcFormat, srcType,
+			      srcAddr, srcPacking);
+   return k;
+}
+
+#else
+
+/* these are used only in texstore_funcs[] below */
+#define _mesa_texstore_srgb8 NULL
+#define _mesa_texstore_srgba8 NULL
+#define _mesa_texstore_sargb8 NULL
+#define _mesa_texstore_sl8 NULL
+#define _mesa_texstore_sla8 NULL
+
+#endif /* FEATURE_EXT_texture_sRGB */
+
+
+
+
+/**
+ * Table mapping MESA_FORMAT_* to _mesa_texstore_*()
+ * XXX this is somewhat temporary.
+ */
+static const struct {
+   gl_format Name;
+   StoreTexImageFunc Store;
+}
+texstore_funcs[MESA_FORMAT_COUNT] =
+{
+   { MESA_FORMAT_NONE, NULL },
+   { MESA_FORMAT_RGBA8888, _mesa_texstore_rgba8888 },
+   { MESA_FORMAT_RGBA8888_REV, _mesa_texstore_rgba8888 },
+   { MESA_FORMAT_ARGB8888, _mesa_texstore_argb8888 },
+   { MESA_FORMAT_ARGB8888_REV, _mesa_texstore_argb8888 },
+   { MESA_FORMAT_XRGB8888, _mesa_texstore_argb8888 },
+   { MESA_FORMAT_XRGB8888_REV, _mesa_texstore_argb8888 },
+   { MESA_FORMAT_RGB888, _mesa_texstore_rgb888 },
+   { MESA_FORMAT_BGR888, _mesa_texstore_bgr888 },
+   { MESA_FORMAT_RGB565, _mesa_texstore_rgb565 },
+   { MESA_FORMAT_RGB565_REV, _mesa_texstore_rgb565 },
+   { MESA_FORMAT_ARGB4444, _mesa_texstore_argb4444 },
+   { MESA_FORMAT_ARGB4444_REV, _mesa_texstore_argb4444 },
+   { MESA_FORMAT_RGBA5551, _mesa_texstore_rgba5551 },
+   { MESA_FORMAT_ARGB1555, _mesa_texstore_argb1555 },
+   { MESA_FORMAT_ARGB1555_REV, _mesa_texstore_argb1555 },
+   { MESA_FORMAT_AL44, _mesa_texstore_unorm44 },
+   { MESA_FORMAT_AL88, _mesa_texstore_unorm88 },
+   { MESA_FORMAT_AL88_REV, _mesa_texstore_unorm88 },
+   { MESA_FORMAT_AL1616, _mesa_texstore_unorm1616 },
+   { MESA_FORMAT_AL1616_REV, _mesa_texstore_unorm1616 },
+   { MESA_FORMAT_RGB332, _mesa_texstore_rgb332 },
+   { MESA_FORMAT_A8, _mesa_texstore_unorm8 },
+   { MESA_FORMAT_A16, _mesa_texstore_unorm16 },
+   { MESA_FORMAT_L8, _mesa_texstore_unorm8 },
+   { MESA_FORMAT_L16, _mesa_texstore_unorm16 },
+   { MESA_FORMAT_I8, _mesa_texstore_unorm8 },
+   { MESA_FORMAT_I16, _mesa_texstore_unorm16 },
+   { MESA_FORMAT_CI8, _mesa_texstore_ci8 },
+   { MESA_FORMAT_YCBCR, _mesa_texstore_ycbcr },
+   { MESA_FORMAT_YCBCR_REV, _mesa_texstore_ycbcr },
+   { MESA_FORMAT_R8, _mesa_texstore_unorm8 },
+   { MESA_FORMAT_RG88, _mesa_texstore_unorm88 },
+   { MESA_FORMAT_RG88_REV, _mesa_texstore_unorm88 },
+   { MESA_FORMAT_R16, _mesa_texstore_unorm16 },
+   { MESA_FORMAT_RG1616, _mesa_texstore_unorm1616 },
+   { MESA_FORMAT_RG1616_REV, _mesa_texstore_unorm1616 },
+   { MESA_FORMAT_ARGB2101010, _mesa_texstore_argb2101010 },
+   { MESA_FORMAT_Z24_S8, _mesa_texstore_z24_s8 },
+   { MESA_FORMAT_S8_Z24, _mesa_texstore_s8_z24 },
+   { MESA_FORMAT_Z16, _mesa_texstore_z16 },
+   { MESA_FORMAT_X8_Z24, _mesa_texstore_x8_z24 },
+   { MESA_FORMAT_Z24_X8, _mesa_texstore_z24_x8 },
+   { MESA_FORMAT_Z32, _mesa_texstore_z32 },
+   { MESA_FORMAT_S8, _mesa_texstore_s8 },
+   { MESA_FORMAT_SRGB8, _mesa_texstore_srgb8 },
+   { MESA_FORMAT_SRGBA8, _mesa_texstore_srgba8 },
+   { MESA_FORMAT_SARGB8, _mesa_texstore_sargb8 },
+   { MESA_FORMAT_SL8, _mesa_texstore_sl8 },
+   { MESA_FORMAT_SLA8, _mesa_texstore_sla8 },
+   { MESA_FORMAT_SRGB_DXT1, _mesa_texstore_rgb_dxt1 },
+   { MESA_FORMAT_SRGBA_DXT1, _mesa_texstore_rgba_dxt1 },
+   { MESA_FORMAT_SRGBA_DXT3, _mesa_texstore_rgba_dxt3 },
+   { MESA_FORMAT_SRGBA_DXT5, _mesa_texstore_rgba_dxt5 },
+   { MESA_FORMAT_RGB_FXT1, _mesa_texstore_rgb_fxt1 },
+   { MESA_FORMAT_RGBA_FXT1, _mesa_texstore_rgba_fxt1 },
+   { MESA_FORMAT_RGB_DXT1, _mesa_texstore_rgb_dxt1 },
+   { MESA_FORMAT_RGBA_DXT1, _mesa_texstore_rgba_dxt1 },
+   { MESA_FORMAT_RGBA_DXT3, _mesa_texstore_rgba_dxt3 },
+   { MESA_FORMAT_RGBA_DXT5, _mesa_texstore_rgba_dxt5 },
+   { MESA_FORMAT_RGBA_FLOAT32, _mesa_texstore_rgba_float32 },
+   { MESA_FORMAT_RGBA_FLOAT16, _mesa_texstore_rgba_float16 },
+   { MESA_FORMAT_RGB_FLOAT32, _mesa_texstore_rgba_float32 },
+   { MESA_FORMAT_RGB_FLOAT16, _mesa_texstore_rgba_float16 },
+   { MESA_FORMAT_ALPHA_FLOAT32, _mesa_texstore_rgba_float32 },
+   { MESA_FORMAT_ALPHA_FLOAT16, _mesa_texstore_rgba_float16 },
+   { MESA_FORMAT_LUMINANCE_FLOAT32, _mesa_texstore_rgba_float32 },
+   { MESA_FORMAT_LUMINANCE_FLOAT16, _mesa_texstore_rgba_float16 },
+   { MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32, _mesa_texstore_rgba_float32 },
+   { MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16, _mesa_texstore_rgba_float16 },
+   { MESA_FORMAT_INTENSITY_FLOAT32, _mesa_texstore_rgba_float32 },
+   { MESA_FORMAT_INTENSITY_FLOAT16, _mesa_texstore_rgba_float16 },
+
+   { MESA_FORMAT_RGBA_INT8, _mesa_texstore_rgba_int8 },
+   { MESA_FORMAT_RGBA_INT16, _mesa_texstore_rgba_int16 },
+   { MESA_FORMAT_RGBA_INT32, _mesa_texstore_rgba_int32 },
+   { MESA_FORMAT_RGBA_UINT8, _mesa_texstore_rgba_uint8 },
+   { MESA_FORMAT_RGBA_UINT16, _mesa_texstore_rgba_uint16 },
+   { MESA_FORMAT_RGBA_UINT32, _mesa_texstore_rgba_uint32 },
+
+   { MESA_FORMAT_DUDV8, _mesa_texstore_dudv8 },
+
+   { MESA_FORMAT_SIGNED_R8, _mesa_texstore_snorm8 },
+   { MESA_FORMAT_SIGNED_RG88_REV, _mesa_texstore_snorm88 },
+   { MESA_FORMAT_SIGNED_RGBX8888, _mesa_texstore_signed_rgbx8888 },
+
+   { MESA_FORMAT_SIGNED_RGBA8888, _mesa_texstore_signed_rgba8888 },
+   { MESA_FORMAT_SIGNED_RGBA8888_REV, _mesa_texstore_signed_rgba8888 },
+
+   { MESA_FORMAT_SIGNED_R16, _mesa_texstore_snorm16 },
+   { MESA_FORMAT_SIGNED_GR1616, _mesa_texstore_snorm1616 },
+   { MESA_FORMAT_SIGNED_RGB_16, _mesa_texstore_signed_rgba_16 },
+   { MESA_FORMAT_SIGNED_RGBA_16, _mesa_texstore_signed_rgba_16 },
+   { MESA_FORMAT_RGBA_16, _mesa_texstore_rgba_16 },
+
+   { MESA_FORMAT_RED_RGTC1, _mesa_texstore_red_rgtc1 },
+   { MESA_FORMAT_SIGNED_RED_RGTC1, _mesa_texstore_signed_red_rgtc1 },
+   { MESA_FORMAT_RG_RGTC2, _mesa_texstore_rg_rgtc2 },
+   { MESA_FORMAT_SIGNED_RG_RGTC2, _mesa_texstore_signed_rg_rgtc2 },
+
+   /* Re-use the R/RG texstore functions.
+    * The code is generic enough to handle LATC too. */
+   { MESA_FORMAT_L_LATC1, _mesa_texstore_red_rgtc1 },
+   { MESA_FORMAT_SIGNED_L_LATC1, _mesa_texstore_signed_red_rgtc1 },
+   { MESA_FORMAT_LA_LATC2, _mesa_texstore_rg_rgtc2 },
+   { MESA_FORMAT_SIGNED_LA_LATC2, _mesa_texstore_signed_rg_rgtc2 },
+
+   { MESA_FORMAT_SIGNED_A8, _mesa_texstore_snorm8 },
+   { MESA_FORMAT_SIGNED_L8, _mesa_texstore_snorm8 },
+   { MESA_FORMAT_SIGNED_AL88, _mesa_texstore_snorm88 },
+   { MESA_FORMAT_SIGNED_I8, _mesa_texstore_snorm8 },
+
+   { MESA_FORMAT_SIGNED_A16, _mesa_texstore_snorm16 },
+   { MESA_FORMAT_SIGNED_L16, _mesa_texstore_snorm16 },
+   { MESA_FORMAT_SIGNED_AL1616, _mesa_texstore_snorm1616 },
+   { MESA_FORMAT_SIGNED_I16, _mesa_texstore_snorm16 },
+};
+
+
+static GLboolean
+_mesa_texstore_null(TEXSTORE_PARAMS)
+{
+   (void) ctx; (void) dims;
+   (void) baseInternalFormat;
+   (void) dstFormat;
+   (void) dstAddr;
+   (void) dstXoffset; (void) dstYoffset; (void) dstZoffset;
+   (void) dstRowStride; (void) dstImageOffsets;
+   (void) srcWidth; (void) srcHeight; (void) srcDepth;
+   (void) srcFormat; (void) srcType;
+   (void) srcAddr;
+   (void) srcPacking;
+
+   /* should never happen */
+   _mesa_problem(NULL, "_mesa_texstore_null() is called");
+   return GL_FALSE;
+}
+
+
+/**
+ * Return the StoreTexImageFunc pointer to store an image in the given format.
+ */
+static StoreTexImageFunc
+_mesa_get_texstore_func(gl_format format)
+{
+#ifdef DEBUG
+   GLuint i;
+   for (i = 0; i < MESA_FORMAT_COUNT; i++) {
+      ASSERT(texstore_funcs[i].Name == i);
+   }
+#endif
+   ASSERT(texstore_funcs[format].Name == format);
+
+   if (texstore_funcs[format].Store)
+      return texstore_funcs[format].Store;
+   else
+      return _mesa_texstore_null;
+}
+
+
+/**
+ * Store user data into texture memory.
+ * Called via glTex[Sub]Image1/2/3D()
+ */
+GLboolean
+_mesa_texstore(TEXSTORE_PARAMS)
+{
+   StoreTexImageFunc storeImage;
+   GLboolean success;
+
+   storeImage = _mesa_get_texstore_func(dstFormat);
+
+   success = storeImage(ctx, dims, baseInternalFormat,
+                        dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset,
+                        dstRowStride, dstImageOffsets,
+                        srcWidth, srcHeight, srcDepth,
+                        srcFormat, srcType, srcAddr, srcPacking);
+   return success;
+}
+
+
+/** Return texture size in bytes */
+static GLuint
+texture_size(const struct gl_texture_image *texImage)
+{
+   GLuint sz = _mesa_format_image_size(texImage->TexFormat, texImage->Width,
+                                       texImage->Height, texImage->Depth);
+   return sz;
+}
+
+
+/** Return row stride in bytes */
+static GLuint
+texture_row_stride(const struct gl_texture_image *texImage)
+{
+   GLuint stride = _mesa_format_row_stride(texImage->TexFormat,
+                                           texImage->Width);
+   return stride;
+}
+
+
+
+/**
+ * This is the software fallback for Driver.TexImage1D()
+ * and Driver.CopyTexImage1D().
+ * \sa _mesa_store_teximage2d()
+ */
+void
+_mesa_store_teximage1d(struct gl_context *ctx, GLenum target, GLint level,
+                       GLint internalFormat,
+                       GLint width, GLint border,
+                       GLenum format, GLenum type, const GLvoid *pixels,
+                       const struct gl_pixelstore_attrib *packing,
+                       struct gl_texture_object *texObj,
+                       struct gl_texture_image *texImage)
+{
+   GLuint sizeInBytes;
+   (void) border;
+
+   /* allocate memory */
+   sizeInBytes = texture_size(texImage);
+   texImage->Data = _mesa_alloc_texmemory(sizeInBytes);
+   if (!texImage->Data) {
+      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D");
+      return;
+   }
+
+   pixels = _mesa_validate_pbo_teximage(ctx, 1, width, 1, 1, format, type,
+                                        pixels, packing, "glTexImage1D");
+   if (!pixels) {
+      /* Note: we check for a NULL image pointer here, _after_ we allocated
+       * memory for the texture.  That's what the GL spec calls for.
+       */
+      return;
+   }
+   else {
+      const GLint dstRowStride = 0;
+      GLboolean success = _mesa_texstore(ctx, 1, texImage->_BaseFormat,
+                                         texImage->TexFormat,
+                                         texImage->Data,
+                                         0, 0, 0,  /* dstX/Y/Zoffset */
+                                         dstRowStride,
+                                         texImage->ImageOffsets,
+                                         width, 1, 1,
+                                         format, type, pixels, packing);
+      if (!success) {
+         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D");
+      }
+   }
+
+   _mesa_unmap_teximage_pbo(ctx, packing);
+}
+
+
+/**
+ * This is the software fallback for Driver.TexImage2D()
+ * and Driver.CopyTexImage2D().
+ *
+ * This function is oriented toward storing images in main memory, rather
+ * than VRAM.  Device driver's can easily plug in their own replacement.
+ */
+void
+_mesa_store_teximage2d(struct gl_context *ctx, GLenum target, GLint level,
+                       GLint internalFormat,
+                       GLint width, GLint height, GLint border,
+                       GLenum format, GLenum type, const void *pixels,
+                       const struct gl_pixelstore_attrib *packing,
+                       struct gl_texture_object *texObj,
+                       struct gl_texture_image *texImage)
+{
+   GLuint sizeInBytes;
+   (void) border;
+
+   /* allocate memory */
+   sizeInBytes = texture_size(texImage);
+   texImage->Data = _mesa_alloc_texmemory(sizeInBytes);
+   if (!texImage->Data) {
+      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");
+      return;
+   }
+
+   pixels = _mesa_validate_pbo_teximage(ctx, 2, width, height, 1, format, type,
+                                        pixels, packing, "glTexImage2D");
+   if (!pixels) {
+      /* Note: we check for a NULL image pointer here, _after_ we allocated
+       * memory for the texture.  That's what the GL spec calls for.
+       */
+      return;
+   }
+   else {
+      GLint dstRowStride = texture_row_stride(texImage);
+      GLboolean success = _mesa_texstore(ctx, 2, texImage->_BaseFormat,
+                                         texImage->TexFormat,
+                                         texImage->Data,
+                                         0, 0, 0,  /* dstX/Y/Zoffset */
+                                         dstRowStride,
+                                         texImage->ImageOffsets,
+                                         width, height, 1,
+                                         format, type, pixels, packing);
+      if (!success) {
+         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D");
+      }
+   }
+
+   _mesa_unmap_teximage_pbo(ctx, packing);
+}
+
+
+
+/**
+ * This is the software fallback for Driver.TexImage3D()
+ * and Driver.CopyTexImage3D().
+ * \sa _mesa_store_teximage2d()
+ */
+void
+_mesa_store_teximage3d(struct gl_context *ctx, GLenum target, GLint level,
+                       GLint internalFormat,
+                       GLint width, GLint height, GLint depth, GLint border,
+                       GLenum format, GLenum type, const void *pixels,
+                       const struct gl_pixelstore_attrib *packing,
+                       struct gl_texture_object *texObj,
+                       struct gl_texture_image *texImage)
+{
+   GLuint sizeInBytes;
+   (void) border;
+
+   /* allocate memory */
+   sizeInBytes = texture_size(texImage);
+   texImage->Data = _mesa_alloc_texmemory(sizeInBytes);
+   if (!texImage->Data) {
+      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D");
+      return;
+   }
+
+   pixels = _mesa_validate_pbo_teximage(ctx, 3, width, height, depth, format,
+                                        type, pixels, packing, "glTexImage3D");
+   if (!pixels) {
+      /* Note: we check for a NULL image pointer here, _after_ we allocated
+       * memory for the texture.  That's what the GL spec calls for.
+       */
+      return;
+   }
+   else {
+      GLint dstRowStride = texture_row_stride(texImage);
+      GLboolean success = _mesa_texstore(ctx, 3, texImage->_BaseFormat,
+                                         texImage->TexFormat,
+                                         texImage->Data,
+                                         0, 0, 0,  /* dstX/Y/Zoffset */
+                                         dstRowStride,
+                                         texImage->ImageOffsets,
+                                         width, height, depth,
+                                         format, type, pixels, packing);
+      if (!success) {
+         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D");
+      }
+   }
+
+   _mesa_unmap_teximage_pbo(ctx, packing);
+}
+
+
+
+
+/*
+ * This is the software fallback for Driver.TexSubImage1D()
+ * and Driver.CopyTexSubImage1D().
+ */
+void
+_mesa_store_texsubimage1d(struct gl_context *ctx, GLenum target, GLint level,
+                          GLint xoffset, GLint width,
+                          GLenum format, GLenum type, const void *pixels,
+                          const struct gl_pixelstore_attrib *packing,
+                          struct gl_texture_object *texObj,
+                          struct gl_texture_image *texImage)
+{
+   /* get pointer to src pixels (may be in a pbo which we'll map here) */
+   pixels = _mesa_validate_pbo_teximage(ctx, 1, width, 1, 1, format, type,
+                                        pixels, packing, "glTexSubImage1D");
+   if (!pixels)
+      return;
+
+   {
+      const GLint dstRowStride = 0;
+      GLboolean success = _mesa_texstore(ctx, 1, texImage->_BaseFormat,
+                                         texImage->TexFormat,
+                                         texImage->Data,
+                                         xoffset, 0, 0,  /* offsets */
+                                         dstRowStride,
+                                         texImage->ImageOffsets,
+                                         width, 1, 1,
+                                         format, type, pixels, packing);
+      if (!success) {
+         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage1D");
+      }
+   }
+
+   _mesa_unmap_teximage_pbo(ctx, packing);
+}
+
+
+
+/**
+ * This is the software fallback for Driver.TexSubImage2D()
+ * and Driver.CopyTexSubImage2D().
+ */
+void
+_mesa_store_texsubimage2d(struct gl_context *ctx, GLenum target, GLint level,
+                          GLint xoffset, GLint yoffset,
+                          GLint width, GLint height,
+                          GLenum format, GLenum type, const void *pixels,
+                          const struct gl_pixelstore_attrib *packing,
+                          struct gl_texture_object *texObj,
+                          struct gl_texture_image *texImage)
+{
+   /* get pointer to src pixels (may be in a pbo which we'll map here) */
+   pixels = _mesa_validate_pbo_teximage(ctx, 2, width, height, 1, format, type,
+                                        pixels, packing, "glTexSubImage2D");
+   if (!pixels)
+      return;
+
+   {
+      GLint dstRowStride = texture_row_stride(texImage);
+      GLboolean success = _mesa_texstore(ctx, 2, texImage->_BaseFormat,
+                                         texImage->TexFormat,
+                                         texImage->Data,
+                                         xoffset, yoffset, 0,
+                                         dstRowStride,
+                                         texImage->ImageOffsets,
+                                         width, height, 1,
+                                         format, type, pixels, packing);
+      if (!success) {
+         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage2D");
+      }
+   }
+
+   _mesa_unmap_teximage_pbo(ctx, packing);
+}
+
+
+/*
+ * This is the software fallback for Driver.TexSubImage3D().
+ * and Driver.CopyTexSubImage3D().
+ */
+void
+_mesa_store_texsubimage3d(struct gl_context *ctx, GLenum target, GLint level,
+                          GLint xoffset, GLint yoffset, GLint zoffset,
+                          GLint width, GLint height, GLint depth,
+                          GLenum format, GLenum type, const void *pixels,
+                          const struct gl_pixelstore_attrib *packing,
+                          struct gl_texture_object *texObj,
+                          struct gl_texture_image *texImage)
+{
+   /* get pointer to src pixels (may be in a pbo which we'll map here) */
+   pixels = _mesa_validate_pbo_teximage(ctx, 3, width, height, depth, format,
+                                        type, pixels, packing,
+                                        "glTexSubImage3D");
+   if (!pixels)
+      return;
+
+   {
+      GLint dstRowStride = texture_row_stride(texImage);
+      GLboolean success = _mesa_texstore(ctx, 3, texImage->_BaseFormat,
+                                         texImage->TexFormat,
+                                         texImage->Data,
+                                         xoffset, yoffset, zoffset,
+                                         dstRowStride,
+                                         texImage->ImageOffsets,
+                                         width, height, depth,
+                                         format, type, pixels, packing);
+      if (!success) {
+         _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage3D");
+      }
+   }
+
+   _mesa_unmap_teximage_pbo(ctx, packing);
+}
+
+
+/*
+ * Fallback for Driver.CompressedTexImage1D()
+ */
+void
+_mesa_store_compressed_teximage1d(struct gl_context *ctx,
+                                  GLenum target, GLint level,
+                                  GLint internalFormat,
+                                  GLint width, GLint border,
+                                  GLsizei imageSize, const GLvoid *data,
+                                  struct gl_texture_object *texObj,
+                                  struct gl_texture_image *texImage)
+{
+   /* this space intentionally left blank */
+   (void) ctx;
+   (void) target; (void) level;
+   (void) internalFormat;
+   (void) width; (void) border;
+   (void) imageSize; (void) data;
+   (void) texObj;
+   (void) texImage;
+}
+
+
+
+/**
+ * Fallback for Driver.CompressedTexImage2D()
+ */
+void
+_mesa_store_compressed_teximage2d(struct gl_context *ctx,
+                                  GLenum target, GLint level,
+                                  GLint internalFormat,
+                                  GLint width, GLint height, GLint border,
+                                  GLsizei imageSize, const GLvoid *data,
+                                  struct gl_texture_object *texObj,
+                                  struct gl_texture_image *texImage)
+{
+   (void) width; (void) height; (void) border;
+
+   /* This is pretty simple, basically just do a memcpy without worrying
+    * about the usual image unpacking or image transfer operations.
+    */
+   ASSERT(texObj);
+   ASSERT(texImage);
+   ASSERT(texImage->Width > 0);
+   ASSERT(texImage->Height > 0);
+   ASSERT(texImage->Depth == 1);
+   ASSERT(texImage->Data == NULL); /* was freed in glCompressedTexImage2DARB */
+
+   /* allocate storage */
+   texImage->Data = _mesa_alloc_texmemory(imageSize);
+   if (!texImage->Data) {
+      _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2DARB");
+      return;
+   }
+
+   data = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, data,
+                                                 &ctx->Unpack,
+                                                 "glCompressedTexImage2D");
+   if (!data)
+      return;
+
+   /* copy the data */
+   memcpy(texImage->Data, data, imageSize);
+
+   _mesa_unmap_teximage_pbo(ctx, &ctx->Unpack);
+}
+
+
+
+/*
+ * Fallback for Driver.CompressedTexImage3D()
+ */
+void
+_mesa_store_compressed_teximage3d(struct gl_context *ctx,
+                                  GLenum target, GLint level,
+                                  GLint internalFormat,
+                                  GLint width, GLint height, GLint depth,
+                                  GLint border,
+                                  GLsizei imageSize, const GLvoid *data,
+                                  struct gl_texture_object *texObj,
+                                  struct gl_texture_image *texImage)
+{
+   /* this space intentionally left blank */
+   (void) ctx;
+   (void) target; (void) level;
+   (void) internalFormat;
+   (void) width; (void) height; (void) depth;
+   (void) border;
+   (void) imageSize; (void) data;
+   (void) texObj;
+   (void) texImage;
+}
+
+
+
+/**
+ * Fallback for Driver.CompressedTexSubImage1D()
+ */
+void
+_mesa_store_compressed_texsubimage1d(struct gl_context *ctx, GLenum target,
+                                     GLint level,
+                                     GLint xoffset, GLsizei width,
+                                     GLenum format,
+                                     GLsizei imageSize, const GLvoid *data,
+                                     struct gl_texture_object *texObj,
+                                     struct gl_texture_image *texImage)
+{
+   /* there are no compressed 1D texture formats yet */
+   (void) ctx;
+   (void) target; (void) level;
+   (void) xoffset; (void) width;
+   (void) format;
+   (void) imageSize; (void) data;
+   (void) texObj;
+   (void) texImage;
+}
+
+
+/**
+ * Fallback for Driver.CompressedTexSubImage2D()
+ */
+void
+_mesa_store_compressed_texsubimage2d(struct gl_context *ctx, GLenum target,
+                                     GLint level,
+                                     GLint xoffset, GLint yoffset,
+                                     GLsizei width, GLsizei height,
+                                     GLenum format,
+                                     GLsizei imageSize, const GLvoid *data,
+                                     struct gl_texture_object *texObj,
+                                     struct gl_texture_image *texImage)
+{
+   GLint bytesPerRow, destRowStride, srcRowStride;
+   GLint i, rows;
+   GLubyte *dest;
+   const GLubyte *src;
+   const gl_format texFormat = texImage->TexFormat;
+   const GLint destWidth = texImage->Width;
+   GLuint bw, bh;
+
+   _mesa_get_format_block_size(texFormat, &bw, &bh);
+
+   (void) level;
+   (void) format;
+
+   /* these should have been caught sooner */
+   ASSERT((width % bw) == 0 || width == 2 || width == 1);
+   ASSERT((height % bh) == 0 || height == 2 || height == 1);
+   ASSERT((xoffset % bw) == 0);
+   ASSERT((yoffset % bh) == 0);
+
+   /* get pointer to src pixels (may be in a pbo which we'll map here) */
+   data = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, data,
+                                                 &ctx->Unpack,
+                                                 "glCompressedTexSubImage2D");
+   if (!data)
+      return;
+
+   srcRowStride = _mesa_format_row_stride(texFormat, width);
+   src = (const GLubyte *) data;
+
+   destRowStride = _mesa_format_row_stride(texFormat, destWidth);
+   dest = _mesa_compressed_image_address(xoffset, yoffset, 0,
+                                         texFormat, destWidth,
+                                         (GLubyte *) texImage->Data);
+
+   bytesPerRow = srcRowStride;  /* bytes per row of blocks */
+   rows = height / bh;  /* rows in blocks */
+
+   /* copy rows of blocks */
+   for (i = 0; i < rows; i++) {
+      memcpy(dest, src, bytesPerRow);
+      dest += destRowStride;
+      src += srcRowStride;
+   }
+
+   _mesa_unmap_teximage_pbo(ctx, &ctx->Unpack);
+}
+
+
+/**
+ * Fallback for Driver.CompressedTexSubImage3D()
+ */
+void
+_mesa_store_compressed_texsubimage3d(struct gl_context *ctx, GLenum target,
+                                GLint level,
+                                GLint xoffset, GLint yoffset, GLint zoffset,
+                                GLsizei width, GLsizei height, GLsizei depth,
+                                GLenum format,
+                                GLsizei imageSize, const GLvoid *data,
+                                struct gl_texture_object *texObj,
+                                struct gl_texture_image *texImage)
+{
+   /* there are no compressed 3D texture formats yet */
+   (void) ctx;
+   (void) target; (void) level;
+   (void) xoffset; (void) yoffset; (void) zoffset;
+   (void) width; (void) height; (void) depth;
+   (void) format;
+   (void) imageSize; (void) data;
+   (void) texObj;
+   (void) texImage;
+}
diff --git a/mesalib/src/mesa/main/uniforms.c b/mesalib/src/mesa/main/uniforms.c
index 523b8e1a9..f984ce3bc 100644
--- a/mesalib/src/mesa/main/uniforms.c
+++ b/mesalib/src/mesa/main/uniforms.c
@@ -1,1707 +1,1459 @@
-/*
- * Mesa 3-D graphics library
- *
- * Copyright (C) 2004-2008  Brian Paul   All Rights Reserved.
- * Copyright (C) 2009-2010  VMware, Inc.  All Rights Reserved.
- * Copyright © 2010 Intel Corporation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/**
- * \file uniforms.c
- * Functions related to GLSL uniform variables.
- * \author Brian Paul
- */
-
-/**
- * XXX things to do:
- * 1. Check that the right error code is generated for all _mesa_error() calls.
- * 2. Insert FLUSH_VERTICES calls in various places
- */
-
-
-#include "main/glheader.h"
-#include "main/context.h"
-#include "main/dispatch.h"
-#include "main/mfeatures.h"
-#include "main/mtypes.h"
-#include "main/shaderapi.h"
-#include "main/shaderobj.h"
-#include "main/uniforms.h"
-#include "program/prog_parameter.h"
-#include "program/prog_statevars.h"
-#include "program/prog_uniform.h"
-#include "program/prog_instruction.h"
-
-
-static GLenum
-base_uniform_type(GLenum type)
-{
-   switch (type) {
-#if 0 /* not needed, for now */
-   case GL_BOOL:
-   case GL_BOOL_VEC2:
-   case GL_BOOL_VEC3:
-   case GL_BOOL_VEC4:
-      return GL_BOOL;
-#endif
-   case GL_FLOAT:
-   case GL_FLOAT_VEC2:
-   case GL_FLOAT_VEC3:
-   case GL_FLOAT_VEC4:
-      return GL_FLOAT;
-   case GL_UNSIGNED_INT:
-   case GL_UNSIGNED_INT_VEC2:
-   case GL_UNSIGNED_INT_VEC3:
-   case GL_UNSIGNED_INT_VEC4:
-      return GL_UNSIGNED_INT;
-   case GL_INT:
-   case GL_INT_VEC2:
-   case GL_INT_VEC3:
-   case GL_INT_VEC4:
-      return GL_INT;
-   default:
-      _mesa_problem(NULL, "Invalid type in base_uniform_type()");
-      return GL_FLOAT;
-   }
-}
-
-static struct gl_builtin_uniform_element gl_DepthRange_elements[] = {
-   {"near", {STATE_DEPTH_RANGE, 0, 0}, SWIZZLE_XXXX},
-   {"far", {STATE_DEPTH_RANGE, 0, 0}, SWIZZLE_YYYY},
-   {"diff", {STATE_DEPTH_RANGE, 0, 0}, SWIZZLE_ZZZZ},
-};
-
-static struct gl_builtin_uniform_element gl_ClipPlane_elements[] = {
-   {NULL, {STATE_CLIPPLANE, 0, 0}, SWIZZLE_XYZW}
-};
-
-static struct gl_builtin_uniform_element gl_Point_elements[] = {
-   {"size", {STATE_POINT_SIZE}, SWIZZLE_XXXX},
-   {"sizeMin", {STATE_POINT_SIZE}, SWIZZLE_YYYY},
-   {"sizeMax", {STATE_POINT_SIZE}, SWIZZLE_ZZZZ},
-   {"fadeThresholdSize", {STATE_POINT_SIZE}, SWIZZLE_WWWW},
-   {"distanceConstantAttenuation", {STATE_POINT_ATTENUATION}, SWIZZLE_XXXX},
-   {"distanceLinearAttenuation", {STATE_POINT_ATTENUATION}, SWIZZLE_YYYY},
-   {"distanceQuadraticAttenuation", {STATE_POINT_ATTENUATION}, SWIZZLE_ZZZZ},
-};
-
-static struct gl_builtin_uniform_element gl_FrontMaterial_elements[] = {
-   {"emission", {STATE_MATERIAL, 0, STATE_EMISSION}, SWIZZLE_XYZW},
-   {"ambient", {STATE_MATERIAL, 0, STATE_AMBIENT}, SWIZZLE_XYZW},
-   {"diffuse", {STATE_MATERIAL, 0, STATE_DIFFUSE}, SWIZZLE_XYZW},
-   {"specular", {STATE_MATERIAL, 0, STATE_SPECULAR}, SWIZZLE_XYZW},
-   {"shininess", {STATE_MATERIAL, 0, STATE_SHININESS}, SWIZZLE_XXXX},
-};
-
-static struct gl_builtin_uniform_element gl_BackMaterial_elements[] = {
-   {"emission", {STATE_MATERIAL, 1, STATE_EMISSION}, SWIZZLE_XYZW},
-   {"ambient", {STATE_MATERIAL, 1, STATE_AMBIENT}, SWIZZLE_XYZW},
-   {"diffuse", {STATE_MATERIAL, 1, STATE_DIFFUSE}, SWIZZLE_XYZW},
-   {"specular", {STATE_MATERIAL, 1, STATE_SPECULAR}, SWIZZLE_XYZW},
-   {"shininess", {STATE_MATERIAL, 1, STATE_SHININESS}, SWIZZLE_XXXX},
-};
-
-static struct gl_builtin_uniform_element gl_LightSource_elements[] = {
-   {"ambient", {STATE_LIGHT, 0, STATE_AMBIENT}, SWIZZLE_XYZW},
-   {"diffuse", {STATE_LIGHT, 0, STATE_DIFFUSE}, SWIZZLE_XYZW},
-   {"specular", {STATE_LIGHT, 0, STATE_SPECULAR}, SWIZZLE_XYZW},
-   {"position", {STATE_LIGHT, 0, STATE_POSITION}, SWIZZLE_XYZW},
-   {"halfVector", {STATE_LIGHT, 0, STATE_HALF_VECTOR}, SWIZZLE_XYZW},
-   {"spotDirection", {STATE_LIGHT, 0, STATE_SPOT_DIRECTION},
-    MAKE_SWIZZLE4(SWIZZLE_X,
-		  SWIZZLE_Y,
-		  SWIZZLE_Z,
-		  SWIZZLE_Z)},
-   {"spotCosCutoff", {STATE_LIGHT, 0, STATE_SPOT_DIRECTION}, SWIZZLE_WWWW},
-   {"spotCutoff", {STATE_LIGHT, 0, STATE_SPOT_CUTOFF}, SWIZZLE_XXXX},
-   {"spotExponent", {STATE_LIGHT, 0, STATE_ATTENUATION}, SWIZZLE_WWWW},
-   {"constantAttenuation", {STATE_LIGHT, 0, STATE_ATTENUATION}, SWIZZLE_XXXX},
-   {"linearAttenuation", {STATE_LIGHT, 0, STATE_ATTENUATION}, SWIZZLE_YYYY},
-   {"quadraticAttenuation", {STATE_LIGHT, 0, STATE_ATTENUATION}, SWIZZLE_ZZZZ},
-};
-
-static struct gl_builtin_uniform_element gl_LightModel_elements[] = {
-   {"ambient", {STATE_LIGHTMODEL_AMBIENT, 0}, SWIZZLE_XYZW},
-};
-
-static struct gl_builtin_uniform_element gl_FrontLightModelProduct_elements[] = {
-   {"sceneColor", {STATE_LIGHTMODEL_SCENECOLOR, 0}, SWIZZLE_XYZW},
-};
-
-static struct gl_builtin_uniform_element gl_BackLightModelProduct_elements[] = {
-   {"sceneColor", {STATE_LIGHTMODEL_SCENECOLOR, 1}, SWIZZLE_XYZW},
-};
-
-static struct gl_builtin_uniform_element gl_FrontLightProduct_elements[] = {
-   {"ambient", {STATE_LIGHTPROD, 0, 0, STATE_AMBIENT}, SWIZZLE_XYZW},
-   {"diffuse", {STATE_LIGHTPROD, 0, 0, STATE_DIFFUSE}, SWIZZLE_XYZW},
-   {"specular", {STATE_LIGHTPROD, 0, 0, STATE_SPECULAR}, SWIZZLE_XYZW},
-};
-
-static struct gl_builtin_uniform_element gl_BackLightProduct_elements[] = {
-   {"ambient", {STATE_LIGHTPROD, 0, 1, STATE_AMBIENT}, SWIZZLE_XYZW},
-   {"diffuse", {STATE_LIGHTPROD, 0, 1, STATE_DIFFUSE}, SWIZZLE_XYZW},
-   {"specular", {STATE_LIGHTPROD, 0, 1, STATE_SPECULAR}, SWIZZLE_XYZW},
-};
-
-static struct gl_builtin_uniform_element gl_TextureEnvColor_elements[] = {
-   {NULL, {STATE_TEXENV_COLOR, 0}, SWIZZLE_XYZW},
-};
-
-static struct gl_builtin_uniform_element gl_EyePlaneS_elements[] = {
-   {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_EYE_S}, SWIZZLE_XYZW},
-};
-
-static struct gl_builtin_uniform_element gl_EyePlaneT_elements[] = {
-   {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_EYE_T}, SWIZZLE_XYZW},
-};
-
-static struct gl_builtin_uniform_element gl_EyePlaneR_elements[] = {
-   {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_EYE_R}, SWIZZLE_XYZW},
-};
-
-static struct gl_builtin_uniform_element gl_EyePlaneQ_elements[] = {
-   {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_EYE_Q}, SWIZZLE_XYZW},
-};
-
-static struct gl_builtin_uniform_element gl_ObjectPlaneS_elements[] = {
-   {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_OBJECT_S}, SWIZZLE_XYZW},
-};
-
-static struct gl_builtin_uniform_element gl_ObjectPlaneT_elements[] = {
-   {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_OBJECT_T}, SWIZZLE_XYZW},
-};
-
-static struct gl_builtin_uniform_element gl_ObjectPlaneR_elements[] = {
-   {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_OBJECT_R}, SWIZZLE_XYZW},
-};
-
-static struct gl_builtin_uniform_element gl_ObjectPlaneQ_elements[] = {
-   {NULL, {STATE_TEXGEN, 0, STATE_TEXGEN_OBJECT_Q}, SWIZZLE_XYZW},
-};
-
-static struct gl_builtin_uniform_element gl_Fog_elements[] = {
-   {"color", {STATE_FOG_COLOR}, SWIZZLE_XYZW},
-   {"density", {STATE_FOG_PARAMS}, SWIZZLE_XXXX},
-   {"start", {STATE_FOG_PARAMS}, SWIZZLE_YYYY},
-   {"end", {STATE_FOG_PARAMS}, SWIZZLE_ZZZZ},
-   {"scale", {STATE_FOG_PARAMS}, SWIZZLE_WWWW},
-};
-
-static struct gl_builtin_uniform_element gl_NormalScale_elements[] = {
-   {NULL, {STATE_NORMAL_SCALE}, SWIZZLE_XXXX},
-};
-
-static struct gl_builtin_uniform_element gl_MESABumpRotMatrix0_elements[] = {
-   {NULL, {STATE_INTERNAL, STATE_ROT_MATRIX_0}, SWIZZLE_XYZW},
-};
-
-static struct gl_builtin_uniform_element gl_MESABumpRotMatrix1_elements[] = {
-   {NULL, {STATE_INTERNAL, STATE_ROT_MATRIX_1}, SWIZZLE_XYZW},
-};
-
-static struct gl_builtin_uniform_element gl_MESAFogParamsOptimized_elements[] = {
-   {NULL, {STATE_INTERNAL, STATE_FOG_PARAMS_OPTIMIZED}, SWIZZLE_XYZW},
-};
-
-#define MATRIX(name, statevar, modifier)				\
-   static struct gl_builtin_uniform_element name ## _elements[] = {	\
-      { NULL, { statevar, 0, 0, 0, modifier}, SWIZZLE_XYZW },		\
-      { NULL, { statevar, 0, 1, 1, modifier}, SWIZZLE_XYZW },		\
-      { NULL, { statevar, 0, 2, 2, modifier}, SWIZZLE_XYZW },		\
-      { NULL, { statevar, 0, 3, 3, modifier}, SWIZZLE_XYZW },		\
-   }
-
-MATRIX(gl_ModelViewMatrix,
-       STATE_MODELVIEW_MATRIX, STATE_MATRIX_TRANSPOSE);
-MATRIX(gl_ModelViewMatrixInverse,
-       STATE_MODELVIEW_MATRIX, STATE_MATRIX_INVTRANS);
-MATRIX(gl_ModelViewMatrixTranspose,
-       STATE_MODELVIEW_MATRIX, 0);
-MATRIX(gl_ModelViewMatrixInverseTranspose,
-       STATE_MODELVIEW_MATRIX, STATE_MATRIX_INVERSE);
-
-MATRIX(gl_ProjectionMatrix,
-       STATE_PROJECTION_MATRIX, STATE_MATRIX_TRANSPOSE);
-MATRIX(gl_ProjectionMatrixInverse,
-       STATE_PROJECTION_MATRIX, STATE_MATRIX_INVTRANS);
-MATRIX(gl_ProjectionMatrixTranspose,
-       STATE_PROJECTION_MATRIX, 0);
-MATRIX(gl_ProjectionMatrixInverseTranspose,
-       STATE_PROJECTION_MATRIX, STATE_MATRIX_INVERSE);
-
-MATRIX(gl_ModelViewProjectionMatrix,
-       STATE_MVP_MATRIX, STATE_MATRIX_TRANSPOSE);
-MATRIX(gl_ModelViewProjectionMatrixInverse,
-       STATE_MVP_MATRIX, STATE_MATRIX_INVTRANS);
-MATRIX(gl_ModelViewProjectionMatrixTranspose,
-       STATE_MVP_MATRIX, 0);
-MATRIX(gl_ModelViewProjectionMatrixInverseTranspose,
-       STATE_MVP_MATRIX, STATE_MATRIX_INVERSE);
-
-MATRIX(gl_TextureMatrix,
-       STATE_TEXTURE_MATRIX, STATE_MATRIX_TRANSPOSE);
-MATRIX(gl_TextureMatrixInverse,
-       STATE_TEXTURE_MATRIX, STATE_MATRIX_INVTRANS);
-MATRIX(gl_TextureMatrixTranspose,
-       STATE_TEXTURE_MATRIX, 0);
-MATRIX(gl_TextureMatrixInverseTranspose,
-       STATE_TEXTURE_MATRIX, STATE_MATRIX_INVERSE);
-
-static struct gl_builtin_uniform_element gl_NormalMatrix_elements[] = {
-   { NULL, { STATE_MODELVIEW_MATRIX, 0, 0, 0, STATE_MATRIX_INVERSE},
-     SWIZZLE_XYZW },
-   { NULL, { STATE_MODELVIEW_MATRIX, 0, 1, 1, STATE_MATRIX_INVERSE},
-     SWIZZLE_XYZW },
-   { NULL, { STATE_MODELVIEW_MATRIX, 0, 2, 2, STATE_MATRIX_INVERSE},
-     SWIZZLE_XYZW },
-};
-
-#undef MATRIX
-
-#define STATEVAR(name) {#name, name ## _elements, Elements(name ## _elements)}
-
-const struct gl_builtin_uniform_desc _mesa_builtin_uniform_desc[] = {
-   STATEVAR(gl_DepthRange),
-   STATEVAR(gl_ClipPlane),
-   STATEVAR(gl_Point),
-   STATEVAR(gl_FrontMaterial),
-   STATEVAR(gl_BackMaterial),
-   STATEVAR(gl_LightSource),
-   STATEVAR(gl_LightModel),
-   STATEVAR(gl_FrontLightModelProduct),
-   STATEVAR(gl_BackLightModelProduct),
-   STATEVAR(gl_FrontLightProduct),
-   STATEVAR(gl_BackLightProduct),
-   STATEVAR(gl_TextureEnvColor),
-   STATEVAR(gl_EyePlaneS),
-   STATEVAR(gl_EyePlaneT),
-   STATEVAR(gl_EyePlaneR),
-   STATEVAR(gl_EyePlaneQ),
-   STATEVAR(gl_ObjectPlaneS),
-   STATEVAR(gl_ObjectPlaneT),
-   STATEVAR(gl_ObjectPlaneR),
-   STATEVAR(gl_ObjectPlaneQ),
-   STATEVAR(gl_Fog),
-
-   STATEVAR(gl_ModelViewMatrix),
-   STATEVAR(gl_ModelViewMatrixInverse),
-   STATEVAR(gl_ModelViewMatrixTranspose),
-   STATEVAR(gl_ModelViewMatrixInverseTranspose),
-
-   STATEVAR(gl_ProjectionMatrix),
-   STATEVAR(gl_ProjectionMatrixInverse),
-   STATEVAR(gl_ProjectionMatrixTranspose),
-   STATEVAR(gl_ProjectionMatrixInverseTranspose),
-
-   STATEVAR(gl_ModelViewProjectionMatrix),
-   STATEVAR(gl_ModelViewProjectionMatrixInverse),
-   STATEVAR(gl_ModelViewProjectionMatrixTranspose),
-   STATEVAR(gl_ModelViewProjectionMatrixInverseTranspose),
-
-   STATEVAR(gl_TextureMatrix),
-   STATEVAR(gl_TextureMatrixInverse),
-   STATEVAR(gl_TextureMatrixTranspose),
-   STATEVAR(gl_TextureMatrixInverseTranspose),
-
-   STATEVAR(gl_NormalMatrix),
-   STATEVAR(gl_NormalScale),
-
-   STATEVAR(gl_MESABumpRotMatrix0),
-   STATEVAR(gl_MESABumpRotMatrix1),
-   STATEVAR(gl_MESAFogParamsOptimized),
-
-   {NULL, NULL, 0}
-};
-
-static GLboolean
-is_boolean_type(GLenum type)
-{
-   switch (type) {
-   case GL_BOOL:
-   case GL_BOOL_VEC2:
-   case GL_BOOL_VEC3:
-   case GL_BOOL_VEC4:
-      return GL_TRUE;
-   default:
-      return GL_FALSE;
-   }
-}
-
-
-static GLboolean
-is_sampler_type(GLenum type)
-{
-   switch (type) {
-   case GL_SAMPLER_1D:
-   case GL_SAMPLER_2D:
-   case GL_SAMPLER_3D:
-   case GL_SAMPLER_CUBE:
-   case GL_SAMPLER_1D_SHADOW:
-   case GL_SAMPLER_2D_SHADOW:
-   case GL_SAMPLER_2D_RECT_ARB:
-   case GL_SAMPLER_2D_RECT_SHADOW_ARB:
-   case GL_SAMPLER_1D_ARRAY_EXT:
-   case GL_SAMPLER_2D_ARRAY_EXT:
-   case GL_SAMPLER_1D_ARRAY_SHADOW_EXT:
-   case GL_SAMPLER_2D_ARRAY_SHADOW_EXT:
-      return GL_TRUE;
-   default:
-      return GL_FALSE;
-   }
-}
-
-
-static struct gl_program_parameter *
-get_uniform_parameter(const struct gl_shader_program *shProg, GLuint index)
-{
-   const struct gl_program *prog = NULL;
-   GLint progPos;
-
-   progPos = shProg->Uniforms->Uniforms[index].VertPos;
-   if (progPos >= 0) {
-      prog = &shProg->VertexProgram->Base;
-   }
-   else {
-      progPos = shProg->Uniforms->Uniforms[index].FragPos;
-      if (progPos >= 0) {
-         prog = &shProg->FragmentProgram->Base;
-      } else {
-         progPos = shProg->Uniforms->Uniforms[index].GeomPos;
-         if (progPos >= 0) {
-            prog = &shProg->GeometryProgram->Base;
-         }
-      }
-   }
-
-   if (!prog || progPos < 0)
-      return NULL; /* should never happen */
-
-   return &prog->Parameters->Parameters[progPos];
-}
-
-
-/**
- * Called by glGetActiveUniform().
- */
-static void
-_mesa_get_active_uniform(struct gl_context *ctx, GLuint program, GLuint index,
-                         GLsizei maxLength, GLsizei *length, GLint *size,
-                         GLenum *type, GLchar *nameOut)
-{
-   const struct gl_shader_program *shProg;
-   const struct gl_program *prog = NULL;
-   const struct gl_program_parameter *param;
-   GLint progPos;
-
-   shProg = _mesa_lookup_shader_program_err(ctx, program, "glGetActiveUniform");
-   if (!shProg)
-      return;
-
-   if (!shProg->Uniforms || index >= shProg->Uniforms->NumUniforms) {
-      _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveUniform(index)");
-      return;
-   }
-
-   progPos = shProg->Uniforms->Uniforms[index].VertPos;
-   if (progPos >= 0) {
-      prog = &shProg->VertexProgram->Base;
-   }
-   else {
-      progPos = shProg->Uniforms->Uniforms[index].FragPos;
-      if (progPos >= 0) {
-         prog = &shProg->FragmentProgram->Base;
-      } else {
-         progPos = shProg->Uniforms->Uniforms[index].GeomPos;
-         if (progPos >= 0) {
-            prog = &shProg->GeometryProgram->Base;
-         }
-      }
-   }
-
-   if (!prog || progPos < 0)
-      return; /* should never happen */
-
-   ASSERT(progPos < prog->Parameters->NumParameters);
-   param = &prog->Parameters->Parameters[progPos];
-
-   if (nameOut) {
-      _mesa_copy_string(nameOut, maxLength, length, param->Name);
-   }
-
-   if (size) {
-      GLint typeSize = _mesa_sizeof_glsl_type(param->DataType);
-      if ((GLint) param->Size > typeSize) {
-         /* This is an array.
-          * Array elements are placed on vector[4] boundaries so they're
-          * a multiple of four floats.  We round typeSize up to next multiple
-          * of four to get the right size below.
-          */
-         typeSize = (typeSize + 3) & ~3;
-      }
-      /* Note that the returned size is in units of the <type>, not bytes */
-      *size = param->Size / typeSize;
-   }
-
-   if (type) {
-      *type = param->DataType;
-   }
-}
-
-
-static unsigned
-get_vector_elements(GLenum type)
-{
-   switch (type) {
-   case GL_FLOAT:
-   case GL_INT:
-   case GL_BOOL:
-   case GL_UNSIGNED_INT:
-   default: /* Catch all the various sampler types. */
-      return 1;
-
-   case GL_FLOAT_VEC2:
-   case GL_INT_VEC2:
-   case GL_BOOL_VEC2:
-   case GL_UNSIGNED_INT_VEC2:
-      return 2;
-
-   case GL_FLOAT_VEC3:
-   case GL_INT_VEC3:
-   case GL_BOOL_VEC3:
-   case GL_UNSIGNED_INT_VEC3:
-      return 3;
-
-   case GL_FLOAT_VEC4:
-   case GL_INT_VEC4:
-   case GL_BOOL_VEC4:
-   case GL_UNSIGNED_INT_VEC4:
-      return 4;
-   }
-}
-
-static void
-get_matrix_dims(GLenum type, GLint *rows, GLint *cols)
-{
-   switch (type) {
-   case GL_FLOAT_MAT2:
-      *rows = *cols = 2;
-      break;
-   case GL_FLOAT_MAT2x3:
-      *rows = 3;
-      *cols = 2;
-      break;
-   case GL_FLOAT_MAT2x4:
-      *rows = 4;
-      *cols = 2;
-      break;
-   case GL_FLOAT_MAT3:
-      *rows = 3;
-      *cols = 3;
-      break;
-   case GL_FLOAT_MAT3x2:
-      *rows = 2;
-      *cols = 3;
-      break;
-   case GL_FLOAT_MAT3x4:
-      *rows = 4;
-      *cols = 3;
-      break;
-   case GL_FLOAT_MAT4:
-      *rows = 4;
-      *cols = 4;
-      break;
-   case GL_FLOAT_MAT4x2:
-      *rows = 2;
-      *cols = 4;
-      break;
-   case GL_FLOAT_MAT4x3:
-      *rows = 3;
-      *cols = 4;
-      break;
-   default:
-      *rows = *cols = 0;
-   }
-}
-
-
-/**
- * Determine the number of rows and columns occupied by a uniform
- * according to its datatype.  For non-matrix types (such as GL_FLOAT_VEC4),
- * the number of rows = 1 and cols = number of elements in the vector.
- */
-static void
-get_uniform_rows_cols(const struct gl_program_parameter *p,
-                      GLint *rows, GLint *cols)
-{
-   get_matrix_dims(p->DataType, rows, cols);
-   if (*rows == 0 && *cols == 0) {
-      /* not a matrix type, probably a float or vector */
-      *rows = 1;
-      *cols = get_vector_elements(p->DataType);
-   }
-}
-
-
-/**
- * Helper for get_uniform[fi]v() functions.
- * Given a shader program name and uniform location, return a pointer
- * to the shader program and return the program parameter position.
- */
-static void
-lookup_uniform_parameter(struct gl_context *ctx, GLuint program, GLint location,
-                         struct gl_program **progOut, GLint *paramPosOut)
-{
-   struct gl_shader_program *shProg
-      = _mesa_lookup_shader_program_err(ctx, program, "glGetUniform[if]v");
-   struct gl_program *prog = NULL;
-   GLint progPos = -1;
-
-   /* if shProg is NULL, we'll have already recorded an error */
-
-   if (shProg) {
-      if (!shProg->Uniforms ||
-          location < 0 ||
-          location >= (GLint) shProg->Uniforms->NumUniforms) {
-         _mesa_error(ctx, GL_INVALID_OPERATION,  "glGetUniformfv(location)");
-      }
-      else {
-         /* OK, find the gl_program and program parameter location */
-         progPos = shProg->Uniforms->Uniforms[location].VertPos;
-         if (progPos >= 0) {
-            prog = &shProg->VertexProgram->Base;
-         }
-         else {
-            progPos = shProg->Uniforms->Uniforms[location].FragPos;
-            if (progPos >= 0) {
-               prog = &shProg->FragmentProgram->Base;
-            } else {
-               progPos = shProg->Uniforms->Uniforms[location].GeomPos;
-               if (progPos >= 0) {
-                  prog = &shProg->GeometryProgram->Base;
-               }
-            }
-         }
-      }
-   }
-
-   *progOut = prog;
-   *paramPosOut = progPos;
-}
-
-
-/**
- * GLGL uniform arrays and structs require special handling.
- *
- * The GL_ARB_shader_objects spec says that if you use
- * glGetUniformLocation to get the location of an array, you CANNOT
- * access other elements of the array by adding an offset to the
- * returned location.  For example, you must call
- * glGetUniformLocation("foo[16]") if you want to set the 16th element
- * of the array with glUniform().
- *
- * HOWEVER, some other OpenGL drivers allow accessing array elements
- * by adding an offset to the returned array location.  And some apps
- * seem to depend on that behaviour.
- *
- * Mesa's gl_uniform_list doesn't directly support this since each
- * entry in the list describes one uniform variable, not one uniform
- * element.  We could insert dummy entries in the list for each array
- * element after [0] but that causes complications elsewhere.
- *
- * We solve this problem by encoding two values in the location that's
- * returned by glGetUniformLocation():
- *  a) index into gl_uniform_list::Uniforms[] for the uniform
- *  b) an array/field offset (0 for simple types)
- *
- * These two values are encoded in the high and low halves of a GLint.
- * By putting the uniform number in the high part and the offset in the
- * low part, we can support the unofficial ability to index into arrays
- * by adding offsets to the location value.
- */
-static void
-merge_location_offset(GLint *location, GLint offset)
-{
-   *location = (*location << 16) | offset;
-}
-
-
-/**
- * Separate the uniform location and parameter offset.  See above.
- */
-static void
-split_location_offset(GLint *location, GLint *offset)
-{
-   *offset = *location & 0xffff;
-   *location = *location >> 16;
-}
-
-
-
-/**
- * Called via glGetUniformfv().
- */
-static void
-_mesa_get_uniformfv(struct gl_context *ctx, GLuint program, GLint location,
-                    GLfloat *params)
-{
-   struct gl_program *prog;
-   GLint paramPos;
-   GLint offset;
-
-   split_location_offset(&location, &offset);
-
-   lookup_uniform_parameter(ctx, program, location, &prog, &paramPos);
-
-   if (prog) {
-      const struct gl_program_parameter *p =
-         &prog->Parameters->Parameters[paramPos];
-      GLint rows, cols, i, j, k;
-
-      get_uniform_rows_cols(p, &rows, &cols);
-
-      k = 0;
-      for (i = 0; i < rows; i++) {
-	 const int base = paramPos + offset + i;
-
-         for (j = 0; j < cols; j++ ) {
-            params[k++] = prog->Parameters->ParameterValues[base][j];
-         }
-      }
-   }
-}
-
-
-/**
- * Called via glGetUniformiv().
- * \sa _mesa_get_uniformfv, only difference is a cast.
- */
-static void
-_mesa_get_uniformiv(struct gl_context *ctx, GLuint program, GLint location,
-                    GLint *params)
-{
-   struct gl_program *prog;
-   GLint paramPos;
-   GLint offset;
-
-   split_location_offset(&location, &offset);
-
-   lookup_uniform_parameter(ctx, program, location, &prog, &paramPos);
-
-   if (prog) {
-      const struct gl_program_parameter *p =
-         &prog->Parameters->Parameters[paramPos];
-      GLint rows, cols, i, j, k;
-
-      get_uniform_rows_cols(p, &rows, &cols);
-
-      k = 0;
-      for (i = 0; i < rows; i++) {
-	 const int base = paramPos + offset + i;
-
-         for (j = 0; j < cols; j++ ) {
-            params[k++] = (GLint) prog->Parameters->ParameterValues[base][j];
-         }
-      }
-   }
-}
-
-
-/**
- * Called via glGetUniformuiv().
- * New in GL_EXT_gpu_shader4, OpenGL 3.0
- * \sa _mesa_get_uniformfv, only difference is a cast.
- */
-static void
-_mesa_get_uniformuiv(struct gl_context *ctx, GLuint program, GLint location,
-                     GLuint *params)
-{
-   struct gl_program *prog;
-   GLint paramPos;
-   GLint offset;
-
-   split_location_offset(&location, &offset);
-
-   lookup_uniform_parameter(ctx, program, location, &prog, &paramPos);
-
-   if (prog) {
-      const struct gl_program_parameter *p =
-         &prog->Parameters->Parameters[paramPos];
-      GLint rows, cols, i, j, k;
-
-      get_uniform_rows_cols(p, &rows, &cols);
-
-      k = 0;
-      for (i = 0; i < rows; i++) {
-	 const int base = paramPos + offset + i;
-
-         for (j = 0; j < cols; j++ ) {
-            params[k++] = (GLuint) prog->Parameters->ParameterValues[base][j];
-         }
-      }
-   }
-}
-
-
-/**
- * Called via glGetUniformLocation().
- *
- * The return value will encode two values, the uniform location and an
- * offset (used for arrays, structs).
- */
-GLint
-_mesa_get_uniform_location(struct gl_context *ctx, struct gl_shader_program *shProg,
-			   const GLchar *name)
-{
-   GLint offset = 0, location = -1;
-
-   if (shProg->LinkStatus == GL_FALSE) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetUniformfv(program)");
-      return -1;
-   }
-
-   /* XXX we should return -1 if the uniform was declared, but not
-    * actually used.
-    */
-
-   /* XXX we need to be able to parse uniform names for structs and arrays
-    * such as:
-    *   mymatrix[1]
-    *   mystruct.field1
-    */
-
-   {
-      /* handle 1-dimension arrays here... */
-      char *c = strchr(name, '[');
-      if (c) {
-         /* truncate name at [ */
-         const GLint len = c - name;
-         GLchar *newName = malloc(len + 1);
-         if (!newName)
-            return -1; /* out of mem */
-         memcpy(newName, name, len);
-         newName[len] = 0;
-
-         location = _mesa_lookup_uniform(shProg->Uniforms, newName);
-         if (location >= 0) {
-            const GLint element = atoi(c + 1);
-            if (element > 0) {
-               /* get type of the uniform array element */
-               struct gl_program_parameter *p;
-               p = get_uniform_parameter(shProg, location);
-               if (p) {
-                  GLint rows, cols;
-                  get_matrix_dims(p->DataType, &rows, &cols);
-                  if (rows < 1)
-                     rows = 1;
-                  offset = element * rows;
-               }
-            }
-         }
-
-         free(newName);
-      }
-   }
-
-   if (location < 0) {
-      location = _mesa_lookup_uniform(shProg->Uniforms, name);
-   }
-
-   if (location >= 0) {
-      merge_location_offset(&location, offset);
-   }
-
-   return location;
-}
-
-
-
-/**
- * Update the vertex/fragment program's TexturesUsed array.
- *
- * This needs to be called after glUniform(set sampler var) is called.
- * A call to glUniform(samplerVar, value) causes a sampler to point to a
- * particular texture unit.  We know the sampler's texture target
- * (1D/2D/3D/etc) from compile time but the sampler's texture unit is
- * set by glUniform() calls.
- *
- * So, scan the program->SamplerUnits[] and program->SamplerTargets[]
- * information to update the prog->TexturesUsed[] values.
- * Each value of TexturesUsed[unit] is one of zero, TEXTURE_1D_INDEX,
- * TEXTURE_2D_INDEX, TEXTURE_3D_INDEX, etc.
- * We'll use that info for state validation before rendering.
- */
-void
-_mesa_update_shader_textures_used(struct gl_program *prog)
-{
-   GLuint s;
-
-   memset(prog->TexturesUsed, 0, sizeof(prog->TexturesUsed));
-
-   for (s = 0; s < MAX_SAMPLERS; s++) {
-      if (prog->SamplersUsed & (1 << s)) {
-         GLuint unit = prog->SamplerUnits[s];
-         GLuint tgt = prog->SamplerTargets[s];
-         assert(unit < MAX_TEXTURE_IMAGE_UNITS);
-         assert(tgt < NUM_TEXTURE_TARGETS);
-         prog->TexturesUsed[unit] |= (1 << tgt);
-      }
-   }
-}
-
-
-/**
- * Check if the type given by userType is allowed to set a uniform of the
- * target type.  Generally, equivalence is required, but setting Boolean
- * uniforms can be done with glUniformiv or glUniformfv.
- */
-static GLboolean
-compatible_types(GLenum userType, GLenum targetType)
-{
-   if (userType == targetType)
-      return GL_TRUE;
-
-   if (targetType == GL_BOOL && (userType == GL_FLOAT ||
-                                 userType == GL_UNSIGNED_INT ||
-                                 userType == GL_INT))
-      return GL_TRUE;
-
-   if (targetType == GL_BOOL_VEC2 && (userType == GL_FLOAT_VEC2 ||
-                                      userType == GL_UNSIGNED_INT_VEC2 ||
-                                      userType == GL_INT_VEC2))
-      return GL_TRUE;
-
-   if (targetType == GL_BOOL_VEC3 && (userType == GL_FLOAT_VEC3 ||
-                                      userType == GL_UNSIGNED_INT_VEC3 ||
-                                      userType == GL_INT_VEC3))
-      return GL_TRUE;
-
-   if (targetType == GL_BOOL_VEC4 && (userType == GL_FLOAT_VEC4 ||
-                                      userType == GL_UNSIGNED_INT_VEC4 ||
-                                      userType == GL_INT_VEC4))
-      return GL_TRUE;
-
-   if (is_sampler_type(targetType) && userType == GL_INT)
-      return GL_TRUE;
-
-   return GL_FALSE;
-}
-
-
-/**
- * Set the value of a program's uniform variable.
- * \param program  the program whose uniform to update
- * \param index  the index of the program parameter for the uniform
- * \param offset  additional parameter slot offset (for arrays)
- * \param type  the incoming datatype of 'values'
- * \param count  the number of uniforms to set
- * \param elems  number of elements per uniform (1, 2, 3 or 4)
- * \param values  the new values, of datatype 'type'
- */
-static void
-set_program_uniform(struct gl_context *ctx, struct gl_program *program,
-                    GLint index, GLint offset,
-                    GLenum type, GLsizei count, GLint elems,
-                    const void *values)
-{
-   const struct gl_program_parameter *param =
-      &program->Parameters->Parameters[index];
-
-   assert(offset >= 0);
-   assert(elems >= 1);
-   assert(elems <= 4);
-
-   if (!compatible_types(type, param->DataType)) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform(type mismatch)");
-      return;
-   }
-
-   if (index + offset > (GLint) program->Parameters->Size) {
-      /* out of bounds! */
-      return;
-   }
-
-   if (param->Type == PROGRAM_SAMPLER) {
-      /* This controls which texture unit which is used by a sampler */
-      GLboolean changed = GL_FALSE;
-      GLint i;
-
-      /* this should have been caught by the compatible_types() check */
-      ASSERT(type == GL_INT);
-
-      /* loop over number of samplers to change */
-      for (i = 0; i < count; i++) {
-         GLuint sampler =
-            (GLuint) program->Parameters->ParameterValues[index + offset + i][0];
-         GLuint texUnit = ((GLuint *) values)[i];
-
-         /* check that the sampler (tex unit index) is legal */
-         if (texUnit >= ctx->Const.MaxTextureImageUnits) {
-            _mesa_error(ctx, GL_INVALID_VALUE,
-                        "glUniform1(invalid sampler/tex unit index for '%s')",
-                        param->Name);
-            return;
-         }
-
-         /* This maps a sampler to a texture unit: */
-         if (sampler < MAX_SAMPLERS) {
-#if 0
-            printf("Set program %p sampler %d '%s' to unit %u\n",
-		   program, sampler, param->Name, texUnit);
-#endif
-            if (program->SamplerUnits[sampler] != texUnit) {
-               program->SamplerUnits[sampler] = texUnit;
-               changed = GL_TRUE;
-            }
-         }
-      }
-
-      if (changed) {
-         /* When a sampler's value changes it usually requires rewriting
-          * a GPU program's TEX instructions since there may not be a
-          * sampler->texture lookup table.  We signal this with the
-          * ProgramStringNotify() callback.
-          */
-         FLUSH_VERTICES(ctx, _NEW_TEXTURE | _NEW_PROGRAM);
-         _mesa_update_shader_textures_used(program);
-         /* Do we need to care about the return value here?
-          * This should not be the first time the driver was notified of
-          * this program.
-          */
-         (void) ctx->Driver.ProgramStringNotify(ctx, program->Target, program);
-      }
-   }
-   else {
-      /* ordinary uniform variable */
-      const GLboolean isUniformBool = is_boolean_type(param->DataType);
-      const GLenum basicType = base_uniform_type(type);
-      const GLint slots = (param->Size + 3) / 4;
-      const GLint typeSize = _mesa_sizeof_glsl_type(param->DataType);
-      GLsizei k, i;
-
-      if ((GLint) param->Size > typeSize) {
-         /* an array */
-         /* we'll ignore extra data below */
-      }
-      else {
-         /* non-array: count must be at most one; count == 0 is handled by the loop below */
-         if (count > 1) {
-            _mesa_error(ctx, GL_INVALID_OPERATION,
-                        "glUniform(uniform '%s' is not an array)",
-                        param->Name);
-            return;
-         }
-      }
-
-      /* loop over number of array elements */
-      for (k = 0; k < count; k++) {
-         GLfloat *uniformVal;
-
-         if (offset + k >= slots) {
-            /* Extra array data is ignored */
-            break;
-         }
-
-         /* uniformVal (the destination) is always float[4] */
-         uniformVal = program->Parameters->ParameterValues[index + offset + k];
-
-         if (basicType == GL_INT) {
-            /* convert user's ints to floats */
-            const GLint *iValues = ((const GLint *) values) + k * elems;
-            for (i = 0; i < elems; i++) {
-               uniformVal[i] = (GLfloat) iValues[i];
-            }
-         }
-         else if (basicType == GL_UNSIGNED_INT) {
-            /* convert user's uints to floats */
-            const GLuint *iValues = ((const GLuint *) values) + k * elems;
-            for (i = 0; i < elems; i++) {
-               uniformVal[i] = (GLfloat) iValues[i];
-            }
-         }
-         else {
-            const GLfloat *fValues = ((const GLfloat *) values) + k * elems;
-            assert(basicType == GL_FLOAT);
-            for (i = 0; i < elems; i++) {
-               uniformVal[i] = fValues[i];
-            }
-         }
-
-         /* if the uniform is bool-valued, convert to 1.0 or 0.0 */
-         if (isUniformBool) {
-            for (i = 0; i < elems; i++) {
-               uniformVal[i] = uniformVal[i] ? 1.0f : 0.0f;
-            }
-         }
-      }
-   }
-}
-
-
-/**
- * Called via glUniform*() functions.
- */
-void
-_mesa_uniform(struct gl_context *ctx, struct gl_shader_program *shProg,
-	      GLint location, GLsizei count,
-              const GLvoid *values, GLenum type)
-{
-   struct gl_uniform *uniform;
-   GLint elems, offset;
-
-   if (!shProg || !shProg->LinkStatus) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform(program not linked)");
-      return;
-   }
-
-   if (location == -1)
-      return;   /* The standard specifies this as a no-op */
-
-   if (location < -1) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform(location=%d)",
-                  location);
-      return;
-   }
-
-   split_location_offset(&location, &offset);
-
-   if (location < 0 || location >= (GLint) shProg->Uniforms->NumUniforms) {
-      _mesa_error(ctx, GL_INVALID_VALUE, "glUniform(location=%d)", location);
-      return;
-   }
-
-   if (count < 0) {
-      _mesa_error(ctx, GL_INVALID_VALUE, "glUniform(count < 0)");
-      return;
-   }
-
-   elems = _mesa_sizeof_glsl_type(type);
-
-   FLUSH_VERTICES(ctx, _NEW_PROGRAM_CONSTANTS);
-
-   uniform = &shProg->Uniforms->Uniforms[location];
-
-   if (ctx->Shader.Flags & GLSL_UNIFORMS) {
-      const GLenum basicType = base_uniform_type(type);
-      GLint i;
-      printf("Mesa: set program %u uniform %s (loc %d) to: ",
-	     shProg->Name, uniform->Name, location);
-      if (basicType == GL_INT) {
-         const GLint *v = (const GLint *) values;
-         for (i = 0; i < count * elems; i++) {
-            printf("%d ", v[i]);
-         }
-      }
-      else if (basicType == GL_UNSIGNED_INT) {
-         const GLuint *v = (const GLuint *) values;
-         for (i = 0; i < count * elems; i++) {
-            printf("%u ", v[i]);
-         }
-      }
-      else {
-         const GLfloat *v = (const GLfloat *) values;
-         assert(basicType == GL_FLOAT);
-         for (i = 0; i < count * elems; i++) {
-            printf("%g ", v[i]);
-         }
-      }
-      printf("\n");
-   }
-
-   /* A uniform var may be used by both a vertex shader and a fragment
-    * shader.  We may need to update one or both shader's uniform here:
-    */
-   if (shProg->VertexProgram) {
-      /* convert uniform location to program parameter index */
-      GLint index = uniform->VertPos;
-      if (index >= 0) {
-         set_program_uniform(ctx, &shProg->VertexProgram->Base,
-                             index, offset, type, count, elems, values);
-      }
-   }
-
-   if (shProg->FragmentProgram) {
-      /* convert uniform location to program parameter index */
-      GLint index = uniform->FragPos;
-      if (index >= 0) {
-         set_program_uniform(ctx, &shProg->FragmentProgram->Base,
-                             index, offset, type, count, elems, values);
-      }
-   }
-
-   if (shProg->GeometryProgram) {
-      /* convert uniform location to program parameter index */
-      GLint index = uniform->GeomPos;
-      if (index >= 0) {
-         set_program_uniform(ctx, &shProg->GeometryProgram->Base,
-                             index, offset, type, count, elems, values);
-      }
-   }
-
-   uniform->Initialized = GL_TRUE;
-}
-
-
-/**
- * Set a matrix-valued program parameter.
- */
-static void
-set_program_uniform_matrix(struct gl_context *ctx, struct gl_program *program,
-                           GLuint index, GLuint offset,
-                           GLuint count, GLuint rows, GLuint cols,
-                           GLboolean transpose, const GLfloat *values)
-{
-   GLuint mat, row, col;
-   GLuint src = 0;
-   const struct gl_program_parameter * param = &program->Parameters->Parameters[index];
-   const GLuint slots = (param->Size + 3) / 4;
-   const GLint typeSize = _mesa_sizeof_glsl_type(param->DataType);
-   GLint nr, nc;
-
-   /* check that the number of rows, columns is correct */
-   get_matrix_dims(param->DataType, &nr, &nc);
-   if (rows != nr || cols != nc) {
-      _mesa_error(ctx, GL_INVALID_OPERATION,
-                  "glUniformMatrix(matrix size mismatch)");
-      return;
-   }
-
-   if ((GLint) param->Size <= typeSize) {
-      /* non-array: count must be at most one; count == 0 is handled by the loop below */
-      if (count > 1) {
-         _mesa_error(ctx, GL_INVALID_OPERATION,
-                     "glUniformMatrix(uniform is not an array)");
-         return;
-      }
-   }
-
-   /*
-    * Note: the _columns_ of a matrix are stored in program registers, not
-    * the rows.  So, the loops below look a little funny.
-    * XXX could optimize this a bit...
-    */
-
-   /* loop over matrices */
-   for (mat = 0; mat < count; mat++) {
-
-      /* each matrix: */
-      for (col = 0; col < cols; col++) {
-         GLfloat *v;
-         if (offset >= slots) {
-            /* Ignore writes beyond the end of (the used part of) an array */
-            return;
-         }
-         v = program->Parameters->ParameterValues[index + offset];
-         for (row = 0; row < rows; row++) {
-            if (transpose) {
-               v[row] = values[src + row * cols + col];
-            }
-            else {
-               v[row] = values[src + col * rows + row];
-            }
-         }
-
-         offset++;
-      }
-
-      src += rows * cols;  /* next matrix */
-   }
-}
-
-
-/**
- * Called by glUniformMatrix*() functions.
- * Note: cols=2, rows=4  ==>  array[2] of vec4
- */
-void
-_mesa_uniform_matrix(struct gl_context *ctx, struct gl_shader_program *shProg,
-		     GLint cols, GLint rows,
-                     GLint location, GLsizei count,
-                     GLboolean transpose, const GLfloat *values)
-{
-   struct gl_uniform *uniform;
-   GLint offset;
-
-   if (!shProg || !shProg->LinkStatus) {
-      _mesa_error(ctx, GL_INVALID_OPERATION,
-         "glUniformMatrix(program not linked)");
-      return;
-   }
-
-   if (location == -1)
-      return;   /* The standard specifies this as a no-op */
-
-   if (location < -1) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glUniformMatrix(location)");
-      return;
-   }
-
-   split_location_offset(&location, &offset);
-
-   if (location < 0 || location >= (GLint) shProg->Uniforms->NumUniforms) {
-      _mesa_error(ctx, GL_INVALID_VALUE, "glUniformMatrix(location)");
-      return;
-   }
-   if (values == NULL) {
-      _mesa_error(ctx, GL_INVALID_VALUE, "glUniformMatrix");
-      return;
-   }
-
-   FLUSH_VERTICES(ctx, _NEW_PROGRAM_CONSTANTS);
-
-   uniform = &shProg->Uniforms->Uniforms[location];
-
-   if (shProg->VertexProgram) {
-      /* convert uniform location to program parameter index */
-      GLint index = uniform->VertPos;
-      if (index >= 0) {
-         set_program_uniform_matrix(ctx, &shProg->VertexProgram->Base,
-                                    index, offset,
-                                    count, rows, cols, transpose, values);
-      }
-   }
-
-   if (shProg->FragmentProgram) {
-      /* convert uniform location to program parameter index */
-      GLint index = uniform->FragPos;
-      if (index >= 0) {
-         set_program_uniform_matrix(ctx, &shProg->FragmentProgram->Base,
-                                    index, offset,
-                                    count, rows, cols, transpose, values);
-      }
-   }
-
-   if (shProg->GeometryProgram) {
-      /* convert uniform location to program parameter index */
-      GLint index = uniform->GeomPos;
-      if (index >= 0) {
-         set_program_uniform_matrix(ctx, &shProg->GeometryProgram->Base,
-                                    index, offset,
-                                    count, rows, cols, transpose, values);
-      }
-   }
-
-   uniform->Initialized = GL_TRUE;
-}
-
-
-void GLAPIENTRY
-_mesa_Uniform1fARB(GLint location, GLfloat v0)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, 1, &v0, GL_FLOAT);
-}
-
-void GLAPIENTRY
-_mesa_Uniform2fARB(GLint location, GLfloat v0, GLfloat v1)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   GLfloat v[2];
-   v[0] = v0;
-   v[1] = v1;
-   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, 1, v, GL_FLOAT_VEC2);
-}
-
-void GLAPIENTRY
-_mesa_Uniform3fARB(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   GLfloat v[3];
-   v[0] = v0;
-   v[1] = v1;
-   v[2] = v2;
-   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, 1, v, GL_FLOAT_VEC3);
-}
-
-void GLAPIENTRY
-_mesa_Uniform4fARB(GLint location, GLfloat v0, GLfloat v1, GLfloat v2,
-                   GLfloat v3)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   GLfloat v[4];
-   v[0] = v0;
-   v[1] = v1;
-   v[2] = v2;
-   v[3] = v3;
-   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, 1, v, GL_FLOAT_VEC4);
-}
-
-void GLAPIENTRY
-_mesa_Uniform1iARB(GLint location, GLint v0)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, 1, &v0, GL_INT);
-}
-
-void GLAPIENTRY
-_mesa_Uniform2iARB(GLint location, GLint v0, GLint v1)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   GLint v[2];
-   v[0] = v0;
-   v[1] = v1;
-   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, 1, v, GL_INT_VEC2);
-}
-
-void GLAPIENTRY
-_mesa_Uniform3iARB(GLint location, GLint v0, GLint v1, GLint v2)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   GLint v[3];
-   v[0] = v0;
-   v[1] = v1;
-   v[2] = v2;
-   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, 1, v, GL_INT_VEC3);
-}
-
-void GLAPIENTRY
-_mesa_Uniform4iARB(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   GLint v[4];
-   v[0] = v0;
-   v[1] = v1;
-   v[2] = v2;
-   v[3] = v3;
-   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, 1, v, GL_INT_VEC4);
-}
-
-void GLAPIENTRY
-_mesa_Uniform1fvARB(GLint location, GLsizei count, const GLfloat * value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, count, value, GL_FLOAT);
-}
-
-void GLAPIENTRY
-_mesa_Uniform2fvARB(GLint location, GLsizei count, const GLfloat * value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, count, value, GL_FLOAT_VEC2);
-}
-
-void GLAPIENTRY
-_mesa_Uniform3fvARB(GLint location, GLsizei count, const GLfloat * value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, count, value, GL_FLOAT_VEC3);
-}
-
-void GLAPIENTRY
-_mesa_Uniform4fvARB(GLint location, GLsizei count, const GLfloat * value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, count, value, GL_FLOAT_VEC4);
-}
-
-void GLAPIENTRY
-_mesa_Uniform1ivARB(GLint location, GLsizei count, const GLint * value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, count, value, GL_INT);
-}
-
-void GLAPIENTRY
-_mesa_Uniform2ivARB(GLint location, GLsizei count, const GLint * value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, count, value, GL_INT_VEC2);
-}
-
-void GLAPIENTRY
-_mesa_Uniform3ivARB(GLint location, GLsizei count, const GLint * value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, count, value, GL_INT_VEC3);
-}
-
-void GLAPIENTRY
-_mesa_Uniform4ivARB(GLint location, GLsizei count, const GLint * value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, count, value, GL_INT_VEC4);
-}
-
-
-/** OpenGL 3.0 GLuint-valued functions **/
-void GLAPIENTRY
-_mesa_Uniform1ui(GLint location, GLuint v0)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, 1, &v0, GL_UNSIGNED_INT);
-}
-
-void GLAPIENTRY
-_mesa_Uniform2ui(GLint location, GLuint v0, GLuint v1)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   GLuint v[2];
-   v[0] = v0;
-   v[1] = v1;
-   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, 1, v, GL_UNSIGNED_INT_VEC2);
-}
-
-void GLAPIENTRY
-_mesa_Uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   GLuint v[3];
-   v[0] = v0;
-   v[1] = v1;
-   v[2] = v2;
-   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, 1, v, GL_UNSIGNED_INT_VEC3);
-}
-
-void GLAPIENTRY
-_mesa_Uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   GLuint v[4];
-   v[0] = v0;
-   v[1] = v1;
-   v[2] = v2;
-   v[3] = v3;
-   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, 1, v, GL_UNSIGNED_INT_VEC4);
-}
-
-void GLAPIENTRY
-_mesa_Uniform1uiv(GLint location, GLsizei count, const GLuint *value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, count, value, GL_UNSIGNED_INT);
-}
-
-void GLAPIENTRY
-_mesa_Uniform2uiv(GLint location, GLsizei count, const GLuint *value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, count, value, GL_UNSIGNED_INT_VEC2);
-}
-
-void GLAPIENTRY
-_mesa_Uniform3uiv(GLint location, GLsizei count, const GLuint *value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, count, value, GL_UNSIGNED_INT_VEC3);
-}
-
-void GLAPIENTRY
-_mesa_Uniform4uiv(GLint location, GLsizei count, const GLuint *value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, count, value, GL_UNSIGNED_INT_VEC4);
-}
-
-
-
-void GLAPIENTRY
-_mesa_UniformMatrix2fvARB(GLint location, GLsizei count, GLboolean transpose,
-                          const GLfloat * value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_uniform_matrix(ctx, ctx->Shader.ActiveProgram,
-			2, 2, location, count, transpose, value);
-}
-
-void GLAPIENTRY
-_mesa_UniformMatrix3fvARB(GLint location, GLsizei count, GLboolean transpose,
-                          const GLfloat * value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_uniform_matrix(ctx, ctx->Shader.ActiveProgram,
-			3, 3, location, count, transpose, value);
-}
-
-void GLAPIENTRY
-_mesa_UniformMatrix4fvARB(GLint location, GLsizei count, GLboolean transpose,
-                          const GLfloat * value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_uniform_matrix(ctx, ctx->Shader.ActiveProgram,
-			4, 4, location, count, transpose, value);
-}
-
-
-/**
- * Non-square UniformMatrix are OpenGL 2.1
- */
-void GLAPIENTRY
-_mesa_UniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose,
-                         const GLfloat *value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_uniform_matrix(ctx, ctx->Shader.ActiveProgram,
-			2, 3, location, count, transpose, value);
-}
-
-void GLAPIENTRY
-_mesa_UniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose,
-                         const GLfloat *value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_uniform_matrix(ctx, ctx->Shader.ActiveProgram,
-			3, 2, location, count, transpose, value);
-}
-
-void GLAPIENTRY
-_mesa_UniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose,
-                         const GLfloat *value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_uniform_matrix(ctx, ctx->Shader.ActiveProgram,
-			2, 4, location, count, transpose, value);
-}
-
-void GLAPIENTRY
-_mesa_UniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose,
-                         const GLfloat *value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_uniform_matrix(ctx, ctx->Shader.ActiveProgram,
-			4, 2, location, count, transpose, value);
-}
-
-void GLAPIENTRY
-_mesa_UniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose,
-                         const GLfloat *value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_uniform_matrix(ctx, ctx->Shader.ActiveProgram,
-			3, 4, location, count, transpose, value);
-}
-
-void GLAPIENTRY
-_mesa_UniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose,
-                         const GLfloat *value)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_uniform_matrix(ctx, ctx->Shader.ActiveProgram,
-			4, 3, location, count, transpose, value);
-}
-
-
-void GLAPIENTRY
-_mesa_GetUniformfvARB(GLhandleARB program, GLint location, GLfloat *params)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_get_uniformfv(ctx, program, location, params);
-}
-
-
-void GLAPIENTRY
-_mesa_GetUniformivARB(GLhandleARB program, GLint location, GLint *params)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_get_uniformiv(ctx, program, location, params);
-}
-
-
-/* GL3 */
-void GLAPIENTRY
-_mesa_GetUniformuiv(GLhandleARB program, GLint location, GLuint *params)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_get_uniformuiv(ctx, program, location, params);
-}
-
-
-
-GLint GLAPIENTRY
-_mesa_GetUniformLocationARB(GLhandleARB programObj, const GLcharARB *name)
-{
-   struct gl_shader_program *shProg;
-
-   GET_CURRENT_CONTEXT(ctx);
-
-   shProg = _mesa_lookup_shader_program_err(ctx, programObj,
-					    "glGetUniformLocation");
-   if (!shProg)
-      return -1;
-
-   return _mesa_get_uniform_location(ctx, shProg, name);
-}
-
-
-void GLAPIENTRY
-_mesa_GetActiveUniformARB(GLhandleARB program, GLuint index,
-                          GLsizei maxLength, GLsizei * length, GLint * size,
-                          GLenum * type, GLcharARB * name)
-{
-   GET_CURRENT_CONTEXT(ctx);
-   _mesa_get_active_uniform(ctx, program, index, maxLength, length, size,
-                            type, name);
-}
-
-
-/**
- * Plug in shader uniform-related functions into API dispatch table.
- */
-void
-_mesa_init_shader_uniform_dispatch(struct _glapi_table *exec)
-{
-#if FEATURE_GL
-   SET_Uniform1fARB(exec, _mesa_Uniform1fARB);
-   SET_Uniform2fARB(exec, _mesa_Uniform2fARB);
-   SET_Uniform3fARB(exec, _mesa_Uniform3fARB);
-   SET_Uniform4fARB(exec, _mesa_Uniform4fARB);
-   SET_Uniform1iARB(exec, _mesa_Uniform1iARB);
-   SET_Uniform2iARB(exec, _mesa_Uniform2iARB);
-   SET_Uniform3iARB(exec, _mesa_Uniform3iARB);
-   SET_Uniform4iARB(exec, _mesa_Uniform4iARB);
-   SET_Uniform1fvARB(exec, _mesa_Uniform1fvARB);
-   SET_Uniform2fvARB(exec, _mesa_Uniform2fvARB);
-   SET_Uniform3fvARB(exec, _mesa_Uniform3fvARB);
-   SET_Uniform4fvARB(exec, _mesa_Uniform4fvARB);
-   SET_Uniform1ivARB(exec, _mesa_Uniform1ivARB);
-   SET_Uniform2ivARB(exec, _mesa_Uniform2ivARB);
-   SET_Uniform3ivARB(exec, _mesa_Uniform3ivARB);
-   SET_Uniform4ivARB(exec, _mesa_Uniform4ivARB);
-   SET_UniformMatrix2fvARB(exec, _mesa_UniformMatrix2fvARB);
-   SET_UniformMatrix3fvARB(exec, _mesa_UniformMatrix3fvARB);
-   SET_UniformMatrix4fvARB(exec, _mesa_UniformMatrix4fvARB);
-
-   SET_GetActiveUniformARB(exec, _mesa_GetActiveUniformARB);
-   SET_GetUniformLocationARB(exec, _mesa_GetUniformLocationARB);
-   SET_GetUniformfvARB(exec, _mesa_GetUniformfvARB);
-   SET_GetUniformivARB(exec, _mesa_GetUniformivARB);
-
-   /* OpenGL 2.1 */
-   SET_UniformMatrix2x3fv(exec, _mesa_UniformMatrix2x3fv);
-   SET_UniformMatrix3x2fv(exec, _mesa_UniformMatrix3x2fv);
-   SET_UniformMatrix2x4fv(exec, _mesa_UniformMatrix2x4fv);
-   SET_UniformMatrix4x2fv(exec, _mesa_UniformMatrix4x2fv);
-   SET_UniformMatrix3x4fv(exec, _mesa_UniformMatrix3x4fv);
-   SET_UniformMatrix4x3fv(exec, _mesa_UniformMatrix4x3fv);
-
-   /* OpenGL 3.0 */
-   /* XXX finish dispatch */
-   SET_Uniform1uiEXT(exec, _mesa_Uniform1ui);
-   SET_Uniform2uiEXT(exec, _mesa_Uniform2ui);
-   SET_Uniform3uiEXT(exec, _mesa_Uniform3ui);
-   SET_Uniform4uiEXT(exec, _mesa_Uniform4ui);
-   SET_Uniform1uivEXT(exec, _mesa_Uniform1uiv);
-   SET_Uniform2uivEXT(exec, _mesa_Uniform2uiv);
-   SET_Uniform3uivEXT(exec, _mesa_Uniform3uiv);
-   SET_Uniform4uivEXT(exec, _mesa_Uniform4uiv);
-   SET_GetUniformuivEXT(exec, _mesa_GetUniformuiv);
-
-
-#endif /* FEATURE_GL */
-}
+/*
+ * Mesa 3-D graphics library
+ *
+ * Copyright (C) 2004-2008  Brian Paul   All Rights Reserved.
+ * Copyright (C) 2009-2010  VMware, Inc.  All Rights Reserved.
+ * Copyright © 2010 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/**
+ * \file uniforms.c
+ * Functions related to GLSL uniform variables.
+ * \author Brian Paul
+ */
+
+/**
+ * XXX things to do:
+ * 1. Check that the right error code is generated for all _mesa_error() calls.
+ * 2. Insert FLUSH_VERTICES calls in various places
+ */
+
+
+#include "main/glheader.h"
+#include "main/context.h"
+#include "main/dispatch.h"
+#include "main/mfeatures.h"
+#include "main/mtypes.h"
+#include "main/shaderapi.h"
+#include "main/shaderobj.h"
+#include "main/uniforms.h"
+#include "program/prog_parameter.h"
+#include "program/prog_statevars.h"
+#include "program/prog_uniform.h"
+#include "program/prog_instruction.h"
+
+
+static GLenum
+base_uniform_type(GLenum type)
+{
+   switch (type) {
+#if 0 /* not needed, for now */
+   case GL_BOOL:
+   case GL_BOOL_VEC2:
+   case GL_BOOL_VEC3:
+   case GL_BOOL_VEC4:
+      return GL_BOOL;
+#endif
+   case GL_FLOAT:
+   case GL_FLOAT_VEC2:
+   case GL_FLOAT_VEC3:
+   case GL_FLOAT_VEC4:
+      return GL_FLOAT;
+   case GL_UNSIGNED_INT:
+   case GL_UNSIGNED_INT_VEC2:
+   case GL_UNSIGNED_INT_VEC3:
+   case GL_UNSIGNED_INT_VEC4:
+      return GL_UNSIGNED_INT;
+   case GL_INT:
+   case GL_INT_VEC2:
+   case GL_INT_VEC3:
+   case GL_INT_VEC4:
+      return GL_INT;
+   default:
+      _mesa_problem(NULL, "Invalid type in base_uniform_type()");
+      return GL_FLOAT;
+   }
+}
+
+
+static GLboolean
+is_boolean_type(GLenum type)
+{
+   switch (type) {
+   case GL_BOOL:
+   case GL_BOOL_VEC2:
+   case GL_BOOL_VEC3:
+   case GL_BOOL_VEC4:
+      return GL_TRUE;
+   default:
+      return GL_FALSE;
+   }
+}
+
+
+static GLboolean
+is_sampler_type(GLenum type)
+{
+   switch (type) {
+   case GL_SAMPLER_1D:
+   case GL_SAMPLER_2D:
+   case GL_SAMPLER_3D:
+   case GL_SAMPLER_CUBE:
+   case GL_SAMPLER_1D_SHADOW:
+   case GL_SAMPLER_2D_SHADOW:
+   case GL_SAMPLER_2D_RECT_ARB:
+   case GL_SAMPLER_2D_RECT_SHADOW_ARB:
+   case GL_SAMPLER_1D_ARRAY_EXT:
+   case GL_SAMPLER_2D_ARRAY_EXT:
+   case GL_SAMPLER_1D_ARRAY_SHADOW_EXT:
+   case GL_SAMPLER_2D_ARRAY_SHADOW_EXT:
+      return GL_TRUE;
+   default:
+      return GL_FALSE;
+   }
+}
+
+
+static struct gl_program_parameter *
+get_uniform_parameter(const struct gl_shader_program *shProg, GLuint index)
+{
+   const struct gl_program *prog = NULL;
+   GLint progPos;
+
+   progPos = shProg->Uniforms->Uniforms[index].VertPos;
+   if (progPos >= 0) {
+      prog = &shProg->VertexProgram->Base;
+   }
+   else {
+      progPos = shProg->Uniforms->Uniforms[index].FragPos;
+      if (progPos >= 0) {
+         prog = &shProg->FragmentProgram->Base;
+      } else {
+         progPos = shProg->Uniforms->Uniforms[index].GeomPos;
+         if (progPos >= 0) {
+            prog = &shProg->GeometryProgram->Base;
+         }
+      }
+   }
+
+   if (!prog || progPos < 0)
+      return NULL; /* should never happen */
+
+   return &prog->Parameters->Parameters[progPos];
+}
+
+
+/**
+ * Called by glGetActiveUniform().
+ */
+static void
+_mesa_get_active_uniform(struct gl_context *ctx, GLuint program, GLuint index,
+                         GLsizei maxLength, GLsizei *length, GLint *size,
+                         GLenum *type, GLchar *nameOut)
+{
+   const struct gl_shader_program *shProg;
+   const struct gl_program *prog = NULL;
+   const struct gl_program_parameter *param;
+   GLint progPos;
+
+   shProg = _mesa_lookup_shader_program_err(ctx, program, "glGetActiveUniform");
+   if (!shProg)
+      return;
+
+   if (!shProg->Uniforms || index >= shProg->Uniforms->NumUniforms) {
+      _mesa_error(ctx, GL_INVALID_VALUE, "glGetActiveUniform(index)");
+      return;
+   }
+
+   progPos = shProg->Uniforms->Uniforms[index].VertPos;
+   if (progPos >= 0) {
+      prog = &shProg->VertexProgram->Base;
+   }
+   else {
+      progPos = shProg->Uniforms->Uniforms[index].FragPos;
+      if (progPos >= 0) {
+         prog = &shProg->FragmentProgram->Base;
+      } else {
+         progPos = shProg->Uniforms->Uniforms[index].GeomPos;
+         if (progPos >= 0) {
+            prog = &shProg->GeometryProgram->Base;
+         }
+      }
+   }
+
+   if (!prog || progPos < 0)
+      return; /* should never happen */
+
+   ASSERT(progPos < prog->Parameters->NumParameters);
+   param = &prog->Parameters->Parameters[progPos];
+
+   if (nameOut) {
+      _mesa_copy_string(nameOut, maxLength, length, param->Name);
+   }
+
+   if (size) {
+      GLint typeSize = _mesa_sizeof_glsl_type(param->DataType);
+      if ((GLint) param->Size > typeSize) {
+         /* This is an array.
+          * Array elements are placed on vector[4] boundaries so they're
+          * a multiple of four floats.  We round typeSize up to next multiple
+          * of four to get the right size below.
+          */
+         typeSize = (typeSize + 3) & ~3;
+      }
+      /* Note that the returned size is in units of the <type>, not bytes */
+      *size = param->Size / typeSize;
+   }
+
+   if (type) {
+      *type = param->DataType;
+   }
+}
+
+
+static unsigned
+get_vector_elements(GLenum type)
+{
+   switch (type) {
+   case GL_FLOAT:
+   case GL_INT:
+   case GL_BOOL:
+   case GL_UNSIGNED_INT:
+   default: /* Catch all the various sampler types. */
+      return 1;
+
+   case GL_FLOAT_VEC2:
+   case GL_INT_VEC2:
+   case GL_BOOL_VEC2:
+   case GL_UNSIGNED_INT_VEC2:
+      return 2;
+
+   case GL_FLOAT_VEC3:
+   case GL_INT_VEC3:
+   case GL_BOOL_VEC3:
+   case GL_UNSIGNED_INT_VEC3:
+      return 3;
+
+   case GL_FLOAT_VEC4:
+   case GL_INT_VEC4:
+   case GL_BOOL_VEC4:
+   case GL_UNSIGNED_INT_VEC4:
+      return 4;
+   }
+}
+
+static void
+get_matrix_dims(GLenum type, GLint *rows, GLint *cols)
+{
+   switch (type) {
+   case GL_FLOAT_MAT2:
+      *rows = *cols = 2;
+      break;
+   case GL_FLOAT_MAT2x3:
+      *rows = 3;
+      *cols = 2;
+      break;
+   case GL_FLOAT_MAT2x4:
+      *rows = 4;
+      *cols = 2;
+      break;
+   case GL_FLOAT_MAT3:
+      *rows = 3;
+      *cols = 3;
+      break;
+   case GL_FLOAT_MAT3x2:
+      *rows = 2;
+      *cols = 3;
+      break;
+   case GL_FLOAT_MAT3x4:
+      *rows = 4;
+      *cols = 3;
+      break;
+   case GL_FLOAT_MAT4:
+      *rows = 4;
+      *cols = 4;
+      break;
+   case GL_FLOAT_MAT4x2:
+      *rows = 2;
+      *cols = 4;
+      break;
+   case GL_FLOAT_MAT4x3:
+      *rows = 3;
+      *cols = 4;
+      break;
+   default:
+      *rows = *cols = 0;
+   }
+}
+
+
+/**
+ * Determine the number of rows and columns occupied by a uniform
+ * according to its datatype.  For non-matrix types (such as GL_FLOAT_VEC4),
+ * the number of rows = 1 and cols = number of elements in the vector.
+ */
+static void
+get_uniform_rows_cols(const struct gl_program_parameter *p,
+                      GLint *rows, GLint *cols)
+{
+   get_matrix_dims(p->DataType, rows, cols);
+   if (*rows == 0 && *cols == 0) {
+      /* not a matrix type, probably a float or vector */
+      *rows = 1;
+      *cols = get_vector_elements(p->DataType);
+   }
+}
+
+
+/**
+ * Helper for get_uniform[fi]v() functions.
+ * Given a shader program name and uniform location, return a pointer
+ * to the shader program and return the program parameter position.
+ */
+static void
+lookup_uniform_parameter(struct gl_context *ctx, GLuint program, GLint location,
+                         struct gl_program **progOut, GLint *paramPosOut)
+{
+   struct gl_shader_program *shProg
+      = _mesa_lookup_shader_program_err(ctx, program, "glGetUniform[if]v");
+   struct gl_program *prog = NULL;
+   GLint progPos = -1;
+
+   /* if shProg is NULL, we'll have already recorded an error */
+
+   if (shProg) {
+      if (!shProg->Uniforms ||
+          location < 0 ||
+          location >= (GLint) shProg->Uniforms->NumUniforms) {
+         _mesa_error(ctx, GL_INVALID_OPERATION,  "glGetUniformfv(location)");
+      }
+      else {
+         /* OK, find the gl_program and program parameter location */
+         progPos = shProg->Uniforms->Uniforms[location].VertPos;
+         if (progPos >= 0) {
+            prog = &shProg->VertexProgram->Base;
+         }
+         else {
+            progPos = shProg->Uniforms->Uniforms[location].FragPos;
+            if (progPos >= 0) {
+               prog = &shProg->FragmentProgram->Base;
+            } else {
+               progPos = shProg->Uniforms->Uniforms[location].GeomPos;
+               if (progPos >= 0) {
+                  prog = &shProg->GeometryProgram->Base;
+               }
+            }
+         }
+      }
+   }
+
+   *progOut = prog;
+   *paramPosOut = progPos;
+}
+
+
+/**
+ * GLGL uniform arrays and structs require special handling.
+ *
+ * The GL_ARB_shader_objects spec says that if you use
+ * glGetUniformLocation to get the location of an array, you CANNOT
+ * access other elements of the array by adding an offset to the
+ * returned location.  For example, you must call
+ * glGetUniformLocation("foo[16]") if you want to set the 16th element
+ * of the array with glUniform().
+ *
+ * HOWEVER, some other OpenGL drivers allow accessing array elements
+ * by adding an offset to the returned array location.  And some apps
+ * seem to depend on that behaviour.
+ *
+ * Mesa's gl_uniform_list doesn't directly support this since each
+ * entry in the list describes one uniform variable, not one uniform
+ * element.  We could insert dummy entries in the list for each array
+ * element after [0] but that causes complications elsewhere.
+ *
+ * We solve this problem by encoding two values in the location that's
+ * returned by glGetUniformLocation():
+ *  a) index into gl_uniform_list::Uniforms[] for the uniform
+ *  b) an array/field offset (0 for simple types)
+ *
+ * These two values are encoded in the high and low halves of a GLint.
+ * By putting the uniform number in the high part and the offset in the
+ * low part, we can support the unofficial ability to index into arrays
+ * by adding offsets to the location value.
+ */
+static void
+merge_location_offset(GLint *location, GLint offset)
+{
+   *location = (*location << 16) | offset;
+}
+
+
+/**
+ * Separate the uniform location and parameter offset.  See above.
+ */
+static void
+split_location_offset(GLint *location, GLint *offset)
+{
+   *offset = *location & 0xffff;
+   *location = *location >> 16;
+}
+
+
+
+/**
+ * Called via glGetUniformfv().
+ */
+static void
+_mesa_get_uniformfv(struct gl_context *ctx, GLuint program, GLint location,
+                    GLfloat *params)
+{
+   struct gl_program *prog;
+   GLint paramPos;
+   GLint offset;
+
+   split_location_offset(&location, &offset);
+
+   lookup_uniform_parameter(ctx, program, location, &prog, &paramPos);
+
+   if (prog) {
+      const struct gl_program_parameter *p =
+         &prog->Parameters->Parameters[paramPos];
+      GLint rows, cols, i, j, k;
+
+      get_uniform_rows_cols(p, &rows, &cols);
+
+      k = 0;
+      for (i = 0; i < rows; i++) {
+	 const int base = paramPos + offset + i;
+
+         for (j = 0; j < cols; j++ ) {
+            params[k++] = prog->Parameters->ParameterValues[base][j];
+         }
+      }
+   }
+}
+
+
+/**
+ * Called via glGetUniformiv().
+ * \sa _mesa_get_uniformfv, only difference is a cast.
+ */
+static void
+_mesa_get_uniformiv(struct gl_context *ctx, GLuint program, GLint location,
+                    GLint *params)
+{
+   struct gl_program *prog;
+   GLint paramPos;
+   GLint offset;
+
+   split_location_offset(&location, &offset);
+
+   lookup_uniform_parameter(ctx, program, location, &prog, &paramPos);
+
+   if (prog) {
+      const struct gl_program_parameter *p =
+         &prog->Parameters->Parameters[paramPos];
+      GLint rows, cols, i, j, k;
+
+      get_uniform_rows_cols(p, &rows, &cols);
+
+      k = 0;
+      for (i = 0; i < rows; i++) {
+	 const int base = paramPos + offset + i;
+
+         for (j = 0; j < cols; j++ ) {
+            params[k++] = (GLint) prog->Parameters->ParameterValues[base][j];
+         }
+      }
+   }
+}
+
+
+/**
+ * Called via glGetUniformuiv().
+ * New in GL_EXT_gpu_shader4, OpenGL 3.0
+ * \sa _mesa_get_uniformfv, only difference is a cast.
+ */
+static void
+_mesa_get_uniformuiv(struct gl_context *ctx, GLuint program, GLint location,
+                     GLuint *params)
+{
+   struct gl_program *prog;
+   GLint paramPos;
+   GLint offset;
+
+   split_location_offset(&location, &offset);
+
+   lookup_uniform_parameter(ctx, program, location, &prog, &paramPos);
+
+   if (prog) {
+      const struct gl_program_parameter *p =
+         &prog->Parameters->Parameters[paramPos];
+      GLint rows, cols, i, j, k;
+
+      get_uniform_rows_cols(p, &rows, &cols);
+
+      k = 0;
+      for (i = 0; i < rows; i++) {
+	 const int base = paramPos + offset + i;
+
+         for (j = 0; j < cols; j++ ) {
+            params[k++] = (GLuint) prog->Parameters->ParameterValues[base][j];
+         }
+      }
+   }
+}
+
+
+/**
+ * Called via glGetUniformLocation().
+ *
+ * The return value will encode two values, the uniform location and an
+ * offset (used for arrays, structs).
+ */
+GLint
+_mesa_get_uniform_location(struct gl_context *ctx, struct gl_shader_program *shProg,
+			   const GLchar *name)
+{
+   GLint offset = 0, location = -1;
+
+   if (shProg->LinkStatus == GL_FALSE) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetUniformfv(program)");
+      return -1;
+   }
+
+   /* XXX we should return -1 if the uniform was declared, but not
+    * actually used.
+    */
+
+   /* XXX we need to be able to parse uniform names for structs and arrays
+    * such as:
+    *   mymatrix[1]
+    *   mystruct.field1
+    */
+
+   {
+      /* handle 1-dimension arrays here... */
+      char *c = strchr(name, '[');
+      if (c) {
+         /* truncate name at [ */
+         const GLint len = c - name;
+         GLchar *newName = malloc(len + 1);
+         if (!newName)
+            return -1; /* out of mem */
+         memcpy(newName, name, len);
+         newName[len] = 0;
+
+         location = _mesa_lookup_uniform(shProg->Uniforms, newName);
+         if (location >= 0) {
+            const GLint element = atoi(c + 1);
+            if (element > 0) {
+               /* get type of the uniform array element */
+               struct gl_program_parameter *p;
+               p = get_uniform_parameter(shProg, location);
+               if (p) {
+                  GLint rows, cols;
+                  get_matrix_dims(p->DataType, &rows, &cols);
+                  if (rows < 1)
+                     rows = 1;
+                  offset = element * rows;
+               }
+            }
+         }
+
+         free(newName);
+      }
+   }
+
+   if (location < 0) {
+      location = _mesa_lookup_uniform(shProg->Uniforms, name);
+   }
+
+   if (location >= 0) {
+      merge_location_offset(&location, offset);
+   }
+
+   return location;
+}
+
+
+
+/**
+ * Update the vertex/fragment program's TexturesUsed array.
+ *
+ * This needs to be called after glUniform(set sampler var) is called.
+ * A call to glUniform(samplerVar, value) causes a sampler to point to a
+ * particular texture unit.  We know the sampler's texture target
+ * (1D/2D/3D/etc) from compile time but the sampler's texture unit is
+ * set by glUniform() calls.
+ *
+ * So, scan the program->SamplerUnits[] and program->SamplerTargets[]
+ * information to update the prog->TexturesUsed[] values.
+ * Each value of TexturesUsed[unit] is one of zero, TEXTURE_1D_INDEX,
+ * TEXTURE_2D_INDEX, TEXTURE_3D_INDEX, etc.
+ * We'll use that info for state validation before rendering.
+ */
+void
+_mesa_update_shader_textures_used(struct gl_program *prog)
+{
+   GLuint s;
+
+   memset(prog->TexturesUsed, 0, sizeof(prog->TexturesUsed));
+
+   for (s = 0; s < MAX_SAMPLERS; s++) {
+      if (prog->SamplersUsed & (1 << s)) {
+         GLuint unit = prog->SamplerUnits[s];
+         GLuint tgt = prog->SamplerTargets[s];
+         assert(unit < MAX_TEXTURE_IMAGE_UNITS);
+         assert(tgt < NUM_TEXTURE_TARGETS);
+         prog->TexturesUsed[unit] |= (1 << tgt);
+      }
+   }
+}
+
+
+/**
+ * Check if the type given by userType is allowed to set a uniform of the
+ * target type.  Generally, equivalence is required, but setting Boolean
+ * uniforms can be done with glUniformiv or glUniformfv.
+ */
+static GLboolean
+compatible_types(GLenum userType, GLenum targetType)
+{
+   if (userType == targetType)
+      return GL_TRUE;
+
+   if (targetType == GL_BOOL && (userType == GL_FLOAT ||
+                                 userType == GL_UNSIGNED_INT ||
+                                 userType == GL_INT))
+      return GL_TRUE;
+
+   if (targetType == GL_BOOL_VEC2 && (userType == GL_FLOAT_VEC2 ||
+                                      userType == GL_UNSIGNED_INT_VEC2 ||
+                                      userType == GL_INT_VEC2))
+      return GL_TRUE;
+
+   if (targetType == GL_BOOL_VEC3 && (userType == GL_FLOAT_VEC3 ||
+                                      userType == GL_UNSIGNED_INT_VEC3 ||
+                                      userType == GL_INT_VEC3))
+      return GL_TRUE;
+
+   if (targetType == GL_BOOL_VEC4 && (userType == GL_FLOAT_VEC4 ||
+                                      userType == GL_UNSIGNED_INT_VEC4 ||
+                                      userType == GL_INT_VEC4))
+      return GL_TRUE;
+
+   if (is_sampler_type(targetType) && userType == GL_INT)
+      return GL_TRUE;
+
+   return GL_FALSE;
+}
+
+
+/**
+ * Set the value of a program's uniform variable.
+ * \param program  the program whose uniform to update
+ * \param index  the index of the program parameter for the uniform
+ * \param offset  additional parameter slot offset (for arrays)
+ * \param type  the incoming datatype of 'values'
+ * \param count  the number of uniforms to set
+ * \param elems  number of elements per uniform (1, 2, 3 or 4)
+ * \param values  the new values, of datatype 'type'
+ */
+static void
+set_program_uniform(struct gl_context *ctx, struct gl_program *program,
+                    GLint index, GLint offset,
+                    GLenum type, GLsizei count, GLint elems,
+                    const void *values)
+{
+   const struct gl_program_parameter *param =
+      &program->Parameters->Parameters[index];
+
+   assert(offset >= 0);
+   assert(elems >= 1);
+   assert(elems <= 4);
+
+   if (!compatible_types(type, param->DataType)) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform(type mismatch)");
+      return;
+   }
+
+   if (index + offset > (GLint) program->Parameters->Size) {
+      /* out of bounds! */
+      return;
+   }
+
+   if (param->Type == PROGRAM_SAMPLER) {
+      /* This controls which texture unit which is used by a sampler */
+      GLboolean changed = GL_FALSE;
+      GLint i;
+
+      /* this should have been caught by the compatible_types() check */
+      ASSERT(type == GL_INT);
+
+      /* loop over number of samplers to change */
+      for (i = 0; i < count; i++) {
+         GLuint sampler =
+            (GLuint) program->Parameters->ParameterValues[index + offset + i][0];
+         GLuint texUnit = ((GLuint *) values)[i];
+
+         /* check that the sampler (tex unit index) is legal */
+         if (texUnit >= ctx->Const.MaxTextureImageUnits) {
+            _mesa_error(ctx, GL_INVALID_VALUE,
+                        "glUniform1(invalid sampler/tex unit index for '%s')",
+                        param->Name);
+            return;
+         }
+
+         /* This maps a sampler to a texture unit: */
+         if (sampler < MAX_SAMPLERS) {
+#if 0
+            printf("Set program %p sampler %d '%s' to unit %u\n",
+		   program, sampler, param->Name, texUnit);
+#endif
+            if (program->SamplerUnits[sampler] != texUnit) {
+               program->SamplerUnits[sampler] = texUnit;
+               changed = GL_TRUE;
+            }
+         }
+      }
+
+      if (changed) {
+         /* When a sampler's value changes it usually requires rewriting
+          * a GPU program's TEX instructions since there may not be a
+          * sampler->texture lookup table.  We signal this with the
+          * ProgramStringNotify() callback.
+          */
+         FLUSH_VERTICES(ctx, _NEW_TEXTURE | _NEW_PROGRAM);
+         _mesa_update_shader_textures_used(program);
+         /* Do we need to care about the return value here?
+          * This should not be the first time the driver was notified of
+          * this program.
+          */
+         (void) ctx->Driver.ProgramStringNotify(ctx, program->Target, program);
+      }
+   }
+   else {
+      /* ordinary uniform variable */
+      const GLboolean isUniformBool = is_boolean_type(param->DataType);
+      const GLenum basicType = base_uniform_type(type);
+      const GLint slots = (param->Size + 3) / 4;
+      const GLint typeSize = _mesa_sizeof_glsl_type(param->DataType);
+      GLsizei k, i;
+
+      if ((GLint) param->Size > typeSize) {
+         /* an array */
+         /* we'll ignore extra data below */
+      }
+      else {
+         /* non-array: count must be at most one; count == 0 is handled by the loop below */
+         if (count > 1) {
+            _mesa_error(ctx, GL_INVALID_OPERATION,
+                        "glUniform(uniform '%s' is not an array)",
+                        param->Name);
+            return;
+         }
+      }
+
+      /* loop over number of array elements */
+      for (k = 0; k < count; k++) {
+         GLfloat *uniformVal;
+
+         if (offset + k >= slots) {
+            /* Extra array data is ignored */
+            break;
+         }
+
+         /* uniformVal (the destination) is always float[4] */
+         uniformVal = program->Parameters->ParameterValues[index + offset + k];
+
+         if (basicType == GL_INT) {
+            /* convert user's ints to floats */
+            const GLint *iValues = ((const GLint *) values) + k * elems;
+            for (i = 0; i < elems; i++) {
+               uniformVal[i] = (GLfloat) iValues[i];
+            }
+         }
+         else if (basicType == GL_UNSIGNED_INT) {
+            /* convert user's uints to floats */
+            const GLuint *iValues = ((const GLuint *) values) + k * elems;
+            for (i = 0; i < elems; i++) {
+               uniformVal[i] = (GLfloat) iValues[i];
+            }
+         }
+         else {
+            const GLfloat *fValues = ((const GLfloat *) values) + k * elems;
+            assert(basicType == GL_FLOAT);
+            for (i = 0; i < elems; i++) {
+               uniformVal[i] = fValues[i];
+            }
+         }
+
+         /* if the uniform is bool-valued, convert to 1.0 or 0.0 */
+         if (isUniformBool) {
+            for (i = 0; i < elems; i++) {
+               uniformVal[i] = uniformVal[i] ? 1.0f : 0.0f;
+            }
+         }
+      }
+   }
+}
+
+
+/**
+ * Called via glUniform*() functions.
+ */
+void
+_mesa_uniform(struct gl_context *ctx, struct gl_shader_program *shProg,
+	      GLint location, GLsizei count,
+              const GLvoid *values, GLenum type)
+{
+   struct gl_uniform *uniform;
+   GLint elems, offset;
+
+   if (!shProg || !shProg->LinkStatus) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform(program not linked)");
+      return;
+   }
+
+   if (location == -1)
+      return;   /* The standard specifies this as a no-op */
+
+   if (location < -1) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glUniform(location=%d)",
+                  location);
+      return;
+   }
+
+   split_location_offset(&location, &offset);
+
+   if (location < 0 || location >= (GLint) shProg->Uniforms->NumUniforms) {
+      _mesa_error(ctx, GL_INVALID_VALUE, "glUniform(location=%d)", location);
+      return;
+   }
+
+   if (count < 0) {
+      _mesa_error(ctx, GL_INVALID_VALUE, "glUniform(count < 0)");
+      return;
+   }
+
+   elems = _mesa_sizeof_glsl_type(type);
+
+   FLUSH_VERTICES(ctx, _NEW_PROGRAM_CONSTANTS);
+
+   uniform = &shProg->Uniforms->Uniforms[location];
+
+   if (ctx->Shader.Flags & GLSL_UNIFORMS) {
+      const GLenum basicType = base_uniform_type(type);
+      GLint i;
+      printf("Mesa: set program %u uniform %s (loc %d) to: ",
+	     shProg->Name, uniform->Name, location);
+      if (basicType == GL_INT) {
+         const GLint *v = (const GLint *) values;
+         for (i = 0; i < count * elems; i++) {
+            printf("%d ", v[i]);
+         }
+      }
+      else if (basicType == GL_UNSIGNED_INT) {
+         const GLuint *v = (const GLuint *) values;
+         for (i = 0; i < count * elems; i++) {
+            printf("%u ", v[i]);
+         }
+      }
+      else {
+         const GLfloat *v = (const GLfloat *) values;
+         assert(basicType == GL_FLOAT);
+         for (i = 0; i < count * elems; i++) {
+            printf("%g ", v[i]);
+         }
+      }
+      printf("\n");
+   }
+
+   /* A uniform var may be used by both a vertex shader and a fragment
+    * shader.  We may need to update one or both shader's uniform here:
+    */
+   if (shProg->VertexProgram) {
+      /* convert uniform location to program parameter index */
+      GLint index = uniform->VertPos;
+      if (index >= 0) {
+         set_program_uniform(ctx, &shProg->VertexProgram->Base,
+                             index, offset, type, count, elems, values);
+      }
+   }
+
+   if (shProg->FragmentProgram) {
+      /* convert uniform location to program parameter index */
+      GLint index = uniform->FragPos;
+      if (index >= 0) {
+         set_program_uniform(ctx, &shProg->FragmentProgram->Base,
+                             index, offset, type, count, elems, values);
+      }
+   }
+
+   if (shProg->GeometryProgram) {
+      /* convert uniform location to program parameter index */
+      GLint index = uniform->GeomPos;
+      if (index >= 0) {
+         set_program_uniform(ctx, &shProg->GeometryProgram->Base,
+                             index, offset, type, count, elems, values);
+      }
+   }
+
+   uniform->Initialized = GL_TRUE;
+}
+
+
+/**
+ * Set a matrix-valued program parameter.
+ */
+static void
+set_program_uniform_matrix(struct gl_context *ctx, struct gl_program *program,
+                           GLuint index, GLuint offset,
+                           GLuint count, GLuint rows, GLuint cols,
+                           GLboolean transpose, const GLfloat *values)
+{
+   GLuint mat, row, col;
+   GLuint src = 0;
+   const struct gl_program_parameter * param = &program->Parameters->Parameters[index];
+   const GLuint slots = (param->Size + 3) / 4;
+   const GLint typeSize = _mesa_sizeof_glsl_type(param->DataType);
+   GLint nr, nc;
+
+   /* check that the number of rows, columns is correct */
+   get_matrix_dims(param->DataType, &nr, &nc);
+   if (rows != nr || cols != nc) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+                  "glUniformMatrix(matrix size mismatch)");
+      return;
+   }
+
+   if ((GLint) param->Size <= typeSize) {
+      /* non-array: count must be at most one; count == 0 is handled by the loop below */
+      if (count > 1) {
+         _mesa_error(ctx, GL_INVALID_OPERATION,
+                     "glUniformMatrix(uniform is not an array)");
+         return;
+      }
+   }
+
+   /*
+    * Note: the _columns_ of a matrix are stored in program registers, not
+    * the rows.  So, the loops below look a little funny.
+    * XXX could optimize this a bit...
+    */
+
+   /* loop over matrices */
+   for (mat = 0; mat < count; mat++) {
+
+      /* each matrix: */
+      for (col = 0; col < cols; col++) {
+         GLfloat *v;
+         if (offset >= slots) {
+            /* Ignore writes beyond the end of (the used part of) an array */
+            return;
+         }
+         v = program->Parameters->ParameterValues[index + offset];
+         for (row = 0; row < rows; row++) {
+            if (transpose) {
+               v[row] = values[src + row * cols + col];
+            }
+            else {
+               v[row] = values[src + col * rows + row];
+            }
+         }
+
+         offset++;
+      }
+
+      src += rows * cols;  /* next matrix */
+   }
+}
+
+
+/**
+ * Called by glUniformMatrix*() functions.
+ * Note: cols=2, rows=4  ==>  array[2] of vec4
+ */
+void
+_mesa_uniform_matrix(struct gl_context *ctx, struct gl_shader_program *shProg,
+		     GLint cols, GLint rows,
+                     GLint location, GLsizei count,
+                     GLboolean transpose, const GLfloat *values)
+{
+   struct gl_uniform *uniform;
+   GLint offset;
+
+   if (!shProg || !shProg->LinkStatus) {
+      _mesa_error(ctx, GL_INVALID_OPERATION,
+         "glUniformMatrix(program not linked)");
+      return;
+   }
+
+   if (location == -1)
+      return;   /* The standard specifies this as a no-op */
+
+   if (location < -1) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glUniformMatrix(location)");
+      return;
+   }
+
+   split_location_offset(&location, &offset);
+
+   if (location < 0 || location >= (GLint) shProg->Uniforms->NumUniforms) {
+      _mesa_error(ctx, GL_INVALID_VALUE, "glUniformMatrix(location)");
+      return;
+   }
+   if (values == NULL) {
+      _mesa_error(ctx, GL_INVALID_VALUE, "glUniformMatrix");
+      return;
+   }
+
+   FLUSH_VERTICES(ctx, _NEW_PROGRAM_CONSTANTS);
+
+   uniform = &shProg->Uniforms->Uniforms[location];
+
+   if (shProg->VertexProgram) {
+      /* convert uniform location to program parameter index */
+      GLint index = uniform->VertPos;
+      if (index >= 0) {
+         set_program_uniform_matrix(ctx, &shProg->VertexProgram->Base,
+                                    index, offset,
+                                    count, rows, cols, transpose, values);
+      }
+   }
+
+   if (shProg->FragmentProgram) {
+      /* convert uniform location to program parameter index */
+      GLint index = uniform->FragPos;
+      if (index >= 0) {
+         set_program_uniform_matrix(ctx, &shProg->FragmentProgram->Base,
+                                    index, offset,
+                                    count, rows, cols, transpose, values);
+      }
+   }
+
+   if (shProg->GeometryProgram) {
+      /* convert uniform location to program parameter index */
+      GLint index = uniform->GeomPos;
+      if (index >= 0) {
+         set_program_uniform_matrix(ctx, &shProg->GeometryProgram->Base,
+                                    index, offset,
+                                    count, rows, cols, transpose, values);
+      }
+   }
+
+   uniform->Initialized = GL_TRUE;
+}
+
+
+void GLAPIENTRY
+_mesa_Uniform1fARB(GLint location, GLfloat v0)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, 1, &v0, GL_FLOAT);
+}
+
+void GLAPIENTRY
+_mesa_Uniform2fARB(GLint location, GLfloat v0, GLfloat v1)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   GLfloat v[2];
+   v[0] = v0;
+   v[1] = v1;
+   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, 1, v, GL_FLOAT_VEC2);
+}
+
+void GLAPIENTRY
+_mesa_Uniform3fARB(GLint location, GLfloat v0, GLfloat v1, GLfloat v2)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   GLfloat v[3];
+   v[0] = v0;
+   v[1] = v1;
+   v[2] = v2;
+   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, 1, v, GL_FLOAT_VEC3);
+}
+
+void GLAPIENTRY
+_mesa_Uniform4fARB(GLint location, GLfloat v0, GLfloat v1, GLfloat v2,
+                   GLfloat v3)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   GLfloat v[4];
+   v[0] = v0;
+   v[1] = v1;
+   v[2] = v2;
+   v[3] = v3;
+   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, 1, v, GL_FLOAT_VEC4);
+}
+
+void GLAPIENTRY
+_mesa_Uniform1iARB(GLint location, GLint v0)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, 1, &v0, GL_INT);
+}
+
+void GLAPIENTRY
+_mesa_Uniform2iARB(GLint location, GLint v0, GLint v1)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   GLint v[2];
+   v[0] = v0;
+   v[1] = v1;
+   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, 1, v, GL_INT_VEC2);
+}
+
+void GLAPIENTRY
+_mesa_Uniform3iARB(GLint location, GLint v0, GLint v1, GLint v2)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   GLint v[3];
+   v[0] = v0;
+   v[1] = v1;
+   v[2] = v2;
+   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, 1, v, GL_INT_VEC3);
+}
+
+void GLAPIENTRY
+_mesa_Uniform4iARB(GLint location, GLint v0, GLint v1, GLint v2, GLint v3)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   GLint v[4];
+   v[0] = v0;
+   v[1] = v1;
+   v[2] = v2;
+   v[3] = v3;
+   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, 1, v, GL_INT_VEC4);
+}
+
+void GLAPIENTRY
+_mesa_Uniform1fvARB(GLint location, GLsizei count, const GLfloat * value)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, count, value, GL_FLOAT);
+}
+
+void GLAPIENTRY
+_mesa_Uniform2fvARB(GLint location, GLsizei count, const GLfloat * value)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, count, value, GL_FLOAT_VEC2);
+}
+
+void GLAPIENTRY
+_mesa_Uniform3fvARB(GLint location, GLsizei count, const GLfloat * value)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, count, value, GL_FLOAT_VEC3);
+}
+
+void GLAPIENTRY
+_mesa_Uniform4fvARB(GLint location, GLsizei count, const GLfloat * value)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, count, value, GL_FLOAT_VEC4);
+}
+
+void GLAPIENTRY
+_mesa_Uniform1ivARB(GLint location, GLsizei count, const GLint * value)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, count, value, GL_INT);
+}
+
+void GLAPIENTRY
+_mesa_Uniform2ivARB(GLint location, GLsizei count, const GLint * value)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, count, value, GL_INT_VEC2);
+}
+
+void GLAPIENTRY
+_mesa_Uniform3ivARB(GLint location, GLsizei count, const GLint * value)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, count, value, GL_INT_VEC3);
+}
+
+void GLAPIENTRY
+_mesa_Uniform4ivARB(GLint location, GLsizei count, const GLint * value)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, count, value, GL_INT_VEC4);
+}
+
+
+/** OpenGL 3.0 GLuint-valued functions **/
+void GLAPIENTRY
+_mesa_Uniform1ui(GLint location, GLuint v0)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, 1, &v0, GL_UNSIGNED_INT);
+}
+
+void GLAPIENTRY
+_mesa_Uniform2ui(GLint location, GLuint v0, GLuint v1)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   GLuint v[2];
+   v[0] = v0;
+   v[1] = v1;
+   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, 1, v, GL_UNSIGNED_INT_VEC2);
+}
+
+void GLAPIENTRY
+_mesa_Uniform3ui(GLint location, GLuint v0, GLuint v1, GLuint v2)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   GLuint v[3];
+   v[0] = v0;
+   v[1] = v1;
+   v[2] = v2;
+   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, 1, v, GL_UNSIGNED_INT_VEC3);
+}
+
+void GLAPIENTRY
+_mesa_Uniform4ui(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   GLuint v[4];
+   v[0] = v0;
+   v[1] = v1;
+   v[2] = v2;
+   v[3] = v3;
+   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, 1, v, GL_UNSIGNED_INT_VEC4);
+}
+
+void GLAPIENTRY
+_mesa_Uniform1uiv(GLint location, GLsizei count, const GLuint *value)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, count, value, GL_UNSIGNED_INT);
+}
+
+void GLAPIENTRY
+_mesa_Uniform2uiv(GLint location, GLsizei count, const GLuint *value)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, count, value, GL_UNSIGNED_INT_VEC2);
+}
+
+void GLAPIENTRY
+_mesa_Uniform3uiv(GLint location, GLsizei count, const GLuint *value)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, count, value, GL_UNSIGNED_INT_VEC3);
+}
+
+void GLAPIENTRY
+_mesa_Uniform4uiv(GLint location, GLsizei count, const GLuint *value)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_uniform(ctx, ctx->Shader.ActiveProgram, location, count, value, GL_UNSIGNED_INT_VEC4);
+}
+
+
+
+void GLAPIENTRY
+_mesa_UniformMatrix2fvARB(GLint location, GLsizei count, GLboolean transpose,
+                          const GLfloat * value)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_uniform_matrix(ctx, ctx->Shader.ActiveProgram,
+			2, 2, location, count, transpose, value);
+}
+
+void GLAPIENTRY
+_mesa_UniformMatrix3fvARB(GLint location, GLsizei count, GLboolean transpose,
+                          const GLfloat * value)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_uniform_matrix(ctx, ctx->Shader.ActiveProgram,
+			3, 3, location, count, transpose, value);
+}
+
+void GLAPIENTRY
+_mesa_UniformMatrix4fvARB(GLint location, GLsizei count, GLboolean transpose,
+                          const GLfloat * value)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_uniform_matrix(ctx, ctx->Shader.ActiveProgram,
+			4, 4, location, count, transpose, value);
+}
+
+
+/**
+ * Non-square UniformMatrix are OpenGL 2.1
+ */
+void GLAPIENTRY
+_mesa_UniformMatrix2x3fv(GLint location, GLsizei count, GLboolean transpose,
+                         const GLfloat *value)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_uniform_matrix(ctx, ctx->Shader.ActiveProgram,
+			2, 3, location, count, transpose, value);
+}
+
+void GLAPIENTRY
+_mesa_UniformMatrix3x2fv(GLint location, GLsizei count, GLboolean transpose,
+                         const GLfloat *value)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_uniform_matrix(ctx, ctx->Shader.ActiveProgram,
+			3, 2, location, count, transpose, value);
+}
+
+void GLAPIENTRY
+_mesa_UniformMatrix2x4fv(GLint location, GLsizei count, GLboolean transpose,
+                         const GLfloat *value)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_uniform_matrix(ctx, ctx->Shader.ActiveProgram,
+			2, 4, location, count, transpose, value);
+}
+
+void GLAPIENTRY
+_mesa_UniformMatrix4x2fv(GLint location, GLsizei count, GLboolean transpose,
+                         const GLfloat *value)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_uniform_matrix(ctx, ctx->Shader.ActiveProgram,
+			4, 2, location, count, transpose, value);
+}
+
+void GLAPIENTRY
+_mesa_UniformMatrix3x4fv(GLint location, GLsizei count, GLboolean transpose,
+                         const GLfloat *value)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_uniform_matrix(ctx, ctx->Shader.ActiveProgram,
+			3, 4, location, count, transpose, value);
+}
+
+void GLAPIENTRY
+_mesa_UniformMatrix4x3fv(GLint location, GLsizei count, GLboolean transpose,
+                         const GLfloat *value)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_uniform_matrix(ctx, ctx->Shader.ActiveProgram,
+			4, 3, location, count, transpose, value);
+}
+
+
+void GLAPIENTRY
+_mesa_GetUniformfvARB(GLhandleARB program, GLint location, GLfloat *params)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_get_uniformfv(ctx, program, location, params);
+}
+
+
+void GLAPIENTRY
+_mesa_GetUniformivARB(GLhandleARB program, GLint location, GLint *params)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_get_uniformiv(ctx, program, location, params);
+}
+
+
+/* GL3 */
+void GLAPIENTRY
+_mesa_GetUniformuiv(GLhandleARB program, GLint location, GLuint *params)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_get_uniformuiv(ctx, program, location, params);
+}
+
+
+
+GLint GLAPIENTRY
+_mesa_GetUniformLocationARB(GLhandleARB programObj, const GLcharARB *name)
+{
+   struct gl_shader_program *shProg;
+
+   GET_CURRENT_CONTEXT(ctx);
+
+   shProg = _mesa_lookup_shader_program_err(ctx, programObj,
+					    "glGetUniformLocation");
+   if (!shProg)
+      return -1;
+
+   return _mesa_get_uniform_location(ctx, shProg, name);
+}
+
+
+void GLAPIENTRY
+_mesa_GetActiveUniformARB(GLhandleARB program, GLuint index,
+                          GLsizei maxLength, GLsizei * length, GLint * size,
+                          GLenum * type, GLcharARB * name)
+{
+   GET_CURRENT_CONTEXT(ctx);
+   _mesa_get_active_uniform(ctx, program, index, maxLength, length, size,
+                            type, name);
+}
+
+
+/**
+ * Plug in shader uniform-related functions into API dispatch table.
+ */
+void
+_mesa_init_shader_uniform_dispatch(struct _glapi_table *exec)
+{
+#if FEATURE_GL
+   SET_Uniform1fARB(exec, _mesa_Uniform1fARB);
+   SET_Uniform2fARB(exec, _mesa_Uniform2fARB);
+   SET_Uniform3fARB(exec, _mesa_Uniform3fARB);
+   SET_Uniform4fARB(exec, _mesa_Uniform4fARB);
+   SET_Uniform1iARB(exec, _mesa_Uniform1iARB);
+   SET_Uniform2iARB(exec, _mesa_Uniform2iARB);
+   SET_Uniform3iARB(exec, _mesa_Uniform3iARB);
+   SET_Uniform4iARB(exec, _mesa_Uniform4iARB);
+   SET_Uniform1fvARB(exec, _mesa_Uniform1fvARB);
+   SET_Uniform2fvARB(exec, _mesa_Uniform2fvARB);
+   SET_Uniform3fvARB(exec, _mesa_Uniform3fvARB);
+   SET_Uniform4fvARB(exec, _mesa_Uniform4fvARB);
+   SET_Uniform1ivARB(exec, _mesa_Uniform1ivARB);
+   SET_Uniform2ivARB(exec, _mesa_Uniform2ivARB);
+   SET_Uniform3ivARB(exec, _mesa_Uniform3ivARB);
+   SET_Uniform4ivARB(exec, _mesa_Uniform4ivARB);
+   SET_UniformMatrix2fvARB(exec, _mesa_UniformMatrix2fvARB);
+   SET_UniformMatrix3fvARB(exec, _mesa_UniformMatrix3fvARB);
+   SET_UniformMatrix4fvARB(exec, _mesa_UniformMatrix4fvARB);
+
+   SET_GetActiveUniformARB(exec, _mesa_GetActiveUniformARB);
+   SET_GetUniformLocationARB(exec, _mesa_GetUniformLocationARB);
+   SET_GetUniformfvARB(exec, _mesa_GetUniformfvARB);
+   SET_GetUniformivARB(exec, _mesa_GetUniformivARB);
+
+   /* OpenGL 2.1 */
+   SET_UniformMatrix2x3fv(exec, _mesa_UniformMatrix2x3fv);
+   SET_UniformMatrix3x2fv(exec, _mesa_UniformMatrix3x2fv);
+   SET_UniformMatrix2x4fv(exec, _mesa_UniformMatrix2x4fv);
+   SET_UniformMatrix4x2fv(exec, _mesa_UniformMatrix4x2fv);
+   SET_UniformMatrix3x4fv(exec, _mesa_UniformMatrix3x4fv);
+   SET_UniformMatrix4x3fv(exec, _mesa_UniformMatrix4x3fv);
+
+   /* OpenGL 3.0 */
+   /* XXX finish dispatch */
+   SET_Uniform1uiEXT(exec, _mesa_Uniform1ui);
+   SET_Uniform2uiEXT(exec, _mesa_Uniform2ui);
+   SET_Uniform3uiEXT(exec, _mesa_Uniform3ui);
+   SET_Uniform4uiEXT(exec, _mesa_Uniform4ui);
+   SET_Uniform1uivEXT(exec, _mesa_Uniform1uiv);
+   SET_Uniform2uivEXT(exec, _mesa_Uniform2uiv);
+   SET_Uniform3uivEXT(exec, _mesa_Uniform3uiv);
+   SET_Uniform4uivEXT(exec, _mesa_Uniform4uiv);
+   SET_GetUniformuivEXT(exec, _mesa_GetUniformuiv);
+
+
+#endif /* FEATURE_GL */
+}
diff --git a/mesalib/src/mesa/main/version.c b/mesalib/src/mesa/main/version.c
index f18fa5fcc..c7a0d69a4 100644
--- a/mesalib/src/mesa/main/version.c
+++ b/mesalib/src/mesa/main/version.c
@@ -1,285 +1,288 @@
-/*
- * Mesa 3-D graphics library
- *
- * Copyright (C) 2010  VMware, Inc.  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"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-
-#include "imports.h"
-#include "mtypes.h"
-#include "version.h"
-
-
-
-/**
- * Examine enabled GL extensions to determine GL version.
- * Return major and minor version numbers.
- */
-static void
-compute_version(struct gl_context *ctx)
-{
-   GLuint major, minor;
-   static const int max = 100;
-
-   const GLboolean ver_1_3 = (ctx->Extensions.ARB_multisample &&
-                              ctx->Extensions.ARB_multitexture &&
-                              ctx->Extensions.ARB_texture_border_clamp &&
-                              ctx->Extensions.ARB_texture_compression &&
-                              ctx->Extensions.ARB_texture_cube_map &&
-                              ctx->Extensions.EXT_texture_env_add &&
-                              ctx->Extensions.ARB_texture_env_combine &&
-                              ctx->Extensions.ARB_texture_env_dot3);
-   const GLboolean ver_1_4 = (ver_1_3 &&
-                              ctx->Extensions.ARB_depth_texture &&
-                              ctx->Extensions.ARB_shadow &&
-                              ctx->Extensions.ARB_texture_env_crossbar &&
-                              ctx->Extensions.ARB_texture_mirrored_repeat &&
-                              ctx->Extensions.ARB_window_pos &&
-                              ctx->Extensions.EXT_blend_color &&
-                              ctx->Extensions.EXT_blend_func_separate &&
-                              ctx->Extensions.EXT_blend_minmax &&
-                              ctx->Extensions.EXT_blend_subtract &&
-                              ctx->Extensions.EXT_fog_coord &&
-                              ctx->Extensions.EXT_multi_draw_arrays &&
-                              ctx->Extensions.EXT_point_parameters &&
-                              ctx->Extensions.EXT_secondary_color &&
-                              ctx->Extensions.EXT_stencil_wrap &&
-                              ctx->Extensions.EXT_texture_lod_bias &&
-                              ctx->Extensions.SGIS_generate_mipmap);
-   const GLboolean ver_1_5 = (ver_1_4 &&
-                              ctx->Extensions.ARB_occlusion_query &&
-                              ctx->Extensions.ARB_vertex_buffer_object &&
-                              ctx->Extensions.EXT_shadow_funcs);
-   const GLboolean ver_2_0 = (ver_1_5 &&
-                              ctx->Extensions.ARB_draw_buffers &&
-                              ctx->Extensions.ARB_point_sprite &&
-                              ctx->Extensions.ARB_shader_objects &&
-                              ctx->Extensions.ARB_vertex_shader &&
-                              ctx->Extensions.ARB_fragment_shader &&
-                              ctx->Extensions.ARB_texture_non_power_of_two &&
-                              ctx->Extensions.EXT_blend_equation_separate &&
-
-			      /* Technically, 2.0 requires the functionality
-			       * of the EXT version.  Enable 2.0 if either
-			       * extension is available, and assume that a
-			       * driver that only exposes the ATI extension
-			       * will fallback to software when necessary.
-			       */
-			      (ctx->Extensions.EXT_stencil_two_side
-			       || ctx->Extensions.ATI_separate_stencil));
-   const GLboolean ver_2_1 = (ver_2_0 &&
-                              ctx->Const.GLSLVersion >= 120 &&
-                              ctx->Extensions.EXT_pixel_buffer_object &&
-                              ctx->Extensions.EXT_texture_sRGB);
-   const GLboolean ver_3_0 = (ver_2_1 &&
-                              ctx->Extensions.ARB_half_float_pixel &&
-                              ctx->Extensions.ARB_map_buffer_range &&
-                              ctx->Extensions.ARB_texture_float &&
-                              ctx->Extensions.ARB_texture_rg &&
-                              ctx->Extensions.ARB_texture_compression_rgtc &&
-                              ctx->Extensions.APPLE_vertex_array_object &&
-                              ctx->Extensions.EXT_draw_buffers2 &&
-                              ctx->Extensions.EXT_framebuffer_blit &&
-                              ctx->Extensions.EXT_framebuffer_multisample &&
-                              ctx->Extensions.EXT_framebuffer_object &&
-                              ctx->Extensions.EXT_framebuffer_sRGB &&
-                              ctx->Extensions.EXT_packed_depth_stencil &&
-                              ctx->Extensions.EXT_packed_float &&
-                              ctx->Extensions.EXT_texture_array &&
-                              ctx->Extensions.EXT_texture_integer &&
-                              ctx->Extensions.EXT_texture_shared_exponent &&
-                              ctx->Extensions.EXT_transform_feedback &&
-                              ctx->Extensions.NV_conditional_render);
-   const GLboolean ver_3_1 = (ver_3_0 &&
-                              ctx->Extensions.ARB_copy_buffer &&
-                              ctx->Extensions.ARB_draw_instanced &&
-                              ctx->Extensions.ARB_texture_buffer_object &&
-                              ctx->Extensions.ARB_uniform_buffer_object &&
-                              ctx->Extensions.NV_primitive_restart &&
-                              ctx->Extensions.NV_texture_rectangle &&
-                              ctx->Const.MaxVertexTextureImageUnits >= 16);
-   const GLboolean ver_3_2 = (ver_3_1 &&
-                              ctx->Extensions.ARB_depth_clamp &&
-                              ctx->Extensions.ARB_draw_elements_base_vertex &&
-                              ctx->Extensions.ARB_fragment_coord_conventions &&
-                              ctx->Extensions.ARB_geometry_shader4 &&
-                              ctx->Extensions.EXT_provoking_vertex &&
-                              ctx->Extensions.ARB_seamless_cube_map &&
-                              ctx->Extensions.ARB_sync &&
-                              ctx->Extensions.ARB_texture_multisample &&
-                              ctx->Extensions.EXT_vertex_array_bgra);
-   const GLboolean ver_3_3 = (ver_3_2 &&
-                              ctx->Extensions.ARB_blend_func_extended &&
-                              ctx->Extensions.ARB_explicit_attrib_location &&
-                              ctx->Extensions.ARB_instanced_arrays &&
-                              ctx->Extensions.ARB_occlusion_query2 &&
-                              ctx->Extensions.ARB_sampler_objects &&
-                              ctx->Extensions.ARB_texture_rgb10_a2ui &&
-                              ctx->Extensions.ARB_timer_query &&
-                              ctx->Extensions.ARB_vertex_type_2_10_10_10_rev &&
-                              ctx->Extensions.EXT_texture_swizzle);
-
-   if (ver_3_3) {
-      major = 3;
-      minor = 3;
-   }
-   else if (ver_3_2) {
-      major = 3;
-      minor = 2;
-   }
-   else if (ver_3_1) {
-      major = 3;
-      minor = 1;
-   }
-   else if (ver_3_0) {
-      major = 3;
-      minor = 0;
-   }
-   else if (ver_2_1) {
-      major = 2;
-      minor = 1;
-   }
-   else if (ver_2_0) {
-      major = 2;
-      minor = 0;
-   }
-   else if (ver_1_5) {
-      major = 1;
-      minor = 5;
-   }
-   else if (ver_1_4) {
-      major = 1;
-      minor = 4;
-   }
-   else if (ver_1_3) {
-      major = 1;
-      minor = 3;
-   }
-   else {
-      major = 1;
-      minor = 2;
-   }
-
-   ctx->VersionMajor = major;
-   ctx->VersionMinor = minor;
-   ctx->VersionString = (char *) malloc(max);
-   if (ctx->VersionString) {
-      _mesa_snprintf(ctx->VersionString, max,
-		     "%u.%u Mesa " MESA_VERSION_STRING,
-		     ctx->VersionMajor, ctx->VersionMinor);
-   }
-}
-
-static void
-compute_version_es1(struct gl_context *ctx)
-{
-   static const int max = 100;
-
-   /* OpenGL ES 1.0 is derived from OpenGL 1.3 */
-   const GLboolean ver_1_0 = (ctx->Extensions.ARB_multisample &&
-                              ctx->Extensions.ARB_multitexture &&
-                              ctx->Extensions.ARB_texture_compression &&
-                              ctx->Extensions.EXT_texture_env_add &&
-                              ctx->Extensions.ARB_texture_env_combine &&
-                              ctx->Extensions.ARB_texture_env_dot3);
-   /* OpenGL ES 1.1 is derived from OpenGL 1.5 */
-   const GLboolean ver_1_1 = (ver_1_0 &&
-                              ctx->Extensions.EXT_point_parameters &&
-                              ctx->Extensions.SGIS_generate_mipmap &&
-                              ctx->Extensions.ARB_vertex_buffer_object);
-
-   if (ver_1_1) {
-      ctx->VersionMajor = 1;
-      ctx->VersionMinor = 1;
-   } else if (ver_1_0) {
-      ctx->VersionMajor = 1;
-      ctx->VersionMinor = 0;
-   } else {
-      _mesa_problem(ctx, "Incomplete OpenGL ES 1.0 support.");
-   }
-
-   ctx->VersionString = (char *) malloc(max);
-   if (ctx->VersionString) {
-      _mesa_snprintf(ctx->VersionString, max,
-		     "OpenGL ES-CM 1.%d Mesa " MESA_VERSION_STRING,
-		     ctx->VersionMinor);
-   }
-}
-
-static void
-compute_version_es2(struct gl_context *ctx)
-{
-   static const int max = 100;
-
-   /* OpenGL ES 2.0 is derived from OpenGL 2.0 */
-   const GLboolean ver_2_0 = (ctx->Extensions.ARB_multisample &&
-                              ctx->Extensions.ARB_multitexture &&
-                              ctx->Extensions.ARB_texture_compression &&
-                              ctx->Extensions.ARB_texture_cube_map &&
-                              ctx->Extensions.ARB_texture_mirrored_repeat &&
-                              ctx->Extensions.EXT_blend_color &&
-                              ctx->Extensions.EXT_blend_func_separate &&
-                              ctx->Extensions.EXT_blend_minmax &&
-                              ctx->Extensions.EXT_blend_subtract &&
-                              ctx->Extensions.EXT_stencil_wrap &&
-                              ctx->Extensions.ARB_vertex_buffer_object &&
-                              ctx->Extensions.ARB_shader_objects &&
-                              ctx->Extensions.ARB_vertex_shader &&
-                              ctx->Extensions.ARB_fragment_shader &&
-                              ctx->Extensions.ARB_texture_non_power_of_two &&
-                              ctx->Extensions.EXT_blend_equation_separate);
-   if (ver_2_0) {
-      ctx->VersionMajor = 2;
-      ctx->VersionMinor = 0;
-   } else {
-      _mesa_problem(ctx, "Incomplete OpenGL ES 2.0 support.");
-   }
-
-   ctx->VersionString = (char *) malloc(max);
-   if (ctx->VersionString) {
-      _mesa_snprintf(ctx->VersionString, max,
-		     "OpenGL ES 2.0 Mesa " MESA_VERSION_STRING);
-   }
-}
-
-/**
- * Set the context's VersionMajor, VersionMinor, VersionString fields.
- * This should only be called once as part of context initialization
- * or to perform version check for GLX_ARB_create_context_profile.
- */
-void
-_mesa_compute_version(struct gl_context *ctx)
-{
-   if (ctx->VersionMajor)
-      return;
-
-   switch (ctx->API) {
-   case API_OPENGL:
-      compute_version(ctx);
-      break;
-   case API_OPENGLES:
-      compute_version_es1(ctx);
-      break;
-   case API_OPENGLES2:
-      compute_version_es2(ctx);
-      break;
-   }
-
-}
+/*
+ * Mesa 3-D graphics library
+ *
+ * Copyright (C) 2010  VMware, Inc.  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"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+
+#include "imports.h"
+#include "mtypes.h"
+#include "version.h"
+
+
+
+/**
+ * Examine enabled GL extensions to determine GL version.
+ * Return major and minor version numbers.
+ */
+static void
+compute_version(struct gl_context *ctx)
+{
+   GLuint major, minor;
+   static const int max = 100;
+
+   const GLboolean ver_1_3 = (ctx->Extensions.ARB_multisample &&
+                              ctx->Extensions.ARB_multitexture &&
+                              ctx->Extensions.ARB_texture_border_clamp &&
+                              ctx->Extensions.ARB_texture_compression &&
+                              ctx->Extensions.ARB_texture_cube_map &&
+                              ctx->Extensions.EXT_texture_env_add &&
+                              ctx->Extensions.ARB_texture_env_combine &&
+                              ctx->Extensions.ARB_texture_env_dot3);
+   const GLboolean ver_1_4 = (ver_1_3 &&
+                              ctx->Extensions.ARB_depth_texture &&
+                              ctx->Extensions.ARB_shadow &&
+                              ctx->Extensions.ARB_texture_env_crossbar &&
+                              ctx->Extensions.ARB_texture_mirrored_repeat &&
+                              ctx->Extensions.ARB_window_pos &&
+                              ctx->Extensions.EXT_blend_color &&
+                              ctx->Extensions.EXT_blend_func_separate &&
+                              ctx->Extensions.EXT_blend_minmax &&
+                              ctx->Extensions.EXT_blend_subtract &&
+                              ctx->Extensions.EXT_fog_coord &&
+                              ctx->Extensions.EXT_multi_draw_arrays &&
+                              ctx->Extensions.EXT_point_parameters &&
+                              ctx->Extensions.EXT_secondary_color &&
+                              ctx->Extensions.EXT_stencil_wrap &&
+                              ctx->Extensions.EXT_texture_lod_bias &&
+                              ctx->Extensions.SGIS_generate_mipmap);
+   const GLboolean ver_1_5 = (ver_1_4 &&
+                              ctx->Extensions.ARB_occlusion_query &&
+                              ctx->Extensions.ARB_vertex_buffer_object &&
+                              ctx->Extensions.EXT_shadow_funcs);
+   const GLboolean ver_2_0 = (ver_1_5 &&
+                              ctx->Extensions.ARB_draw_buffers &&
+                              ctx->Extensions.ARB_point_sprite &&
+                              ctx->Extensions.ARB_shader_objects &&
+                              ctx->Extensions.ARB_vertex_shader &&
+                              ctx->Extensions.ARB_fragment_shader &&
+                              ctx->Extensions.ARB_texture_non_power_of_two &&
+                              ctx->Extensions.EXT_blend_equation_separate &&
+
+			      /* Technically, 2.0 requires the functionality
+			       * of the EXT version.  Enable 2.0 if either
+			       * extension is available, and assume that a
+			       * driver that only exposes the ATI extension
+			       * will fallback to software when necessary.
+			       */
+			      (ctx->Extensions.EXT_stencil_two_side
+			       || ctx->Extensions.ATI_separate_stencil));
+   const GLboolean ver_2_1 = (ver_2_0 &&
+                              ctx->Const.GLSLVersion >= 120 &&
+                              ctx->Extensions.EXT_pixel_buffer_object &&
+                              ctx->Extensions.EXT_texture_sRGB);
+   const GLboolean ver_3_0 = (ver_2_1 &&
+                              ctx->Extensions.ARB_color_buffer_float &&
+                              ctx->Extensions.ARB_depth_buffer_float &&
+                              ctx->Extensions.ARB_half_float_pixel &&
+                              ctx->Extensions.ARB_map_buffer_range &&
+                              ctx->Extensions.ARB_texture_float &&
+                              ctx->Extensions.ARB_texture_rg &&
+                              ctx->Extensions.ARB_texture_compression_rgtc &&
+                              ctx->Extensions.APPLE_vertex_array_object &&
+                              ctx->Extensions.EXT_draw_buffers2 &&
+                              ctx->Extensions.EXT_framebuffer_blit &&
+                              ctx->Extensions.EXT_framebuffer_multisample &&
+                              ctx->Extensions.EXT_framebuffer_object &&
+                              ctx->Extensions.EXT_framebuffer_sRGB &&
+                              ctx->Extensions.EXT_packed_depth_stencil &&
+                              ctx->Extensions.EXT_packed_float &&
+                              ctx->Extensions.EXT_texture_array &&
+                              ctx->Extensions.EXT_texture_integer &&
+                              ctx->Extensions.EXT_texture_shared_exponent &&
+                              ctx->Extensions.EXT_transform_feedback &&
+                              ctx->Extensions.NV_conditional_render);
+   const GLboolean ver_3_1 = (ver_3_0 &&
+                              ctx->Extensions.ARB_copy_buffer &&
+                              ctx->Extensions.ARB_draw_instanced &&
+                              ctx->Extensions.ARB_texture_buffer_object &&
+                              ctx->Extensions.ARB_uniform_buffer_object &&
+                              ctx->Extensions.EXT_texture_snorm &&
+                              ctx->Extensions.NV_primitive_restart &&
+                              ctx->Extensions.NV_texture_rectangle &&
+                              ctx->Const.MaxVertexTextureImageUnits >= 16);
+   const GLboolean ver_3_2 = (ver_3_1 &&
+                              ctx->Extensions.ARB_depth_clamp &&
+                              ctx->Extensions.ARB_draw_elements_base_vertex &&
+                              ctx->Extensions.ARB_fragment_coord_conventions &&
+                              ctx->Extensions.ARB_geometry_shader4 &&
+                              ctx->Extensions.EXT_provoking_vertex &&
+                              ctx->Extensions.ARB_seamless_cube_map &&
+                              ctx->Extensions.ARB_sync &&
+                              ctx->Extensions.ARB_texture_multisample &&
+                              ctx->Extensions.EXT_vertex_array_bgra);
+   const GLboolean ver_3_3 = (ver_3_2 &&
+                              ctx->Extensions.ARB_blend_func_extended &&
+                              ctx->Extensions.ARB_explicit_attrib_location &&
+                              ctx->Extensions.ARB_instanced_arrays &&
+                              ctx->Extensions.ARB_occlusion_query2 &&
+                              ctx->Extensions.ARB_sampler_objects &&
+                              ctx->Extensions.ARB_texture_rgb10_a2ui &&
+                              ctx->Extensions.ARB_timer_query &&
+                              ctx->Extensions.ARB_vertex_type_2_10_10_10_rev &&
+                              ctx->Extensions.EXT_texture_swizzle);
+
+   if (ver_3_3) {
+      major = 3;
+      minor = 3;
+   }
+   else if (ver_3_2) {
+      major = 3;
+      minor = 2;
+   }
+   else if (ver_3_1) {
+      major = 3;
+      minor = 1;
+   }
+   else if (ver_3_0) {
+      major = 3;
+      minor = 0;
+   }
+   else if (ver_2_1) {
+      major = 2;
+      minor = 1;
+   }
+   else if (ver_2_0) {
+      major = 2;
+      minor = 0;
+   }
+   else if (ver_1_5) {
+      major = 1;
+      minor = 5;
+   }
+   else if (ver_1_4) {
+      major = 1;
+      minor = 4;
+   }
+   else if (ver_1_3) {
+      major = 1;
+      minor = 3;
+   }
+   else {
+      major = 1;
+      minor = 2;
+   }
+
+   ctx->VersionMajor = major;
+   ctx->VersionMinor = minor;
+   ctx->VersionString = (char *) malloc(max);
+   if (ctx->VersionString) {
+      _mesa_snprintf(ctx->VersionString, max,
+		     "%u.%u Mesa " MESA_VERSION_STRING,
+		     ctx->VersionMajor, ctx->VersionMinor);
+   }
+}
+
+static void
+compute_version_es1(struct gl_context *ctx)
+{
+   static const int max = 100;
+
+   /* OpenGL ES 1.0 is derived from OpenGL 1.3 */
+   const GLboolean ver_1_0 = (ctx->Extensions.ARB_multisample &&
+                              ctx->Extensions.ARB_multitexture &&
+                              ctx->Extensions.ARB_texture_compression &&
+                              ctx->Extensions.EXT_texture_env_add &&
+                              ctx->Extensions.ARB_texture_env_combine &&
+                              ctx->Extensions.ARB_texture_env_dot3);
+   /* OpenGL ES 1.1 is derived from OpenGL 1.5 */
+   const GLboolean ver_1_1 = (ver_1_0 &&
+                              ctx->Extensions.EXT_point_parameters &&
+                              ctx->Extensions.SGIS_generate_mipmap &&
+                              ctx->Extensions.ARB_vertex_buffer_object);
+
+   if (ver_1_1) {
+      ctx->VersionMajor = 1;
+      ctx->VersionMinor = 1;
+   } else if (ver_1_0) {
+      ctx->VersionMajor = 1;
+      ctx->VersionMinor = 0;
+   } else {
+      _mesa_problem(ctx, "Incomplete OpenGL ES 1.0 support.");
+   }
+
+   ctx->VersionString = (char *) malloc(max);
+   if (ctx->VersionString) {
+      _mesa_snprintf(ctx->VersionString, max,
+		     "OpenGL ES-CM 1.%d Mesa " MESA_VERSION_STRING,
+		     ctx->VersionMinor);
+   }
+}
+
+static void
+compute_version_es2(struct gl_context *ctx)
+{
+   static const int max = 100;
+
+   /* OpenGL ES 2.0 is derived from OpenGL 2.0 */
+   const GLboolean ver_2_0 = (ctx->Extensions.ARB_multisample &&
+                              ctx->Extensions.ARB_multitexture &&
+                              ctx->Extensions.ARB_texture_compression &&
+                              ctx->Extensions.ARB_texture_cube_map &&
+                              ctx->Extensions.ARB_texture_mirrored_repeat &&
+                              ctx->Extensions.EXT_blend_color &&
+                              ctx->Extensions.EXT_blend_func_separate &&
+                              ctx->Extensions.EXT_blend_minmax &&
+                              ctx->Extensions.EXT_blend_subtract &&
+                              ctx->Extensions.EXT_stencil_wrap &&
+                              ctx->Extensions.ARB_vertex_buffer_object &&
+                              ctx->Extensions.ARB_shader_objects &&
+                              ctx->Extensions.ARB_vertex_shader &&
+                              ctx->Extensions.ARB_fragment_shader &&
+                              ctx->Extensions.ARB_texture_non_power_of_two &&
+                              ctx->Extensions.EXT_blend_equation_separate);
+   if (ver_2_0) {
+      ctx->VersionMajor = 2;
+      ctx->VersionMinor = 0;
+   } else {
+      _mesa_problem(ctx, "Incomplete OpenGL ES 2.0 support.");
+   }
+
+   ctx->VersionString = (char *) malloc(max);
+   if (ctx->VersionString) {
+      _mesa_snprintf(ctx->VersionString, max,
+		     "OpenGL ES 2.0 Mesa " MESA_VERSION_STRING);
+   }
+}
+
+/**
+ * Set the context's VersionMajor, VersionMinor, VersionString fields.
+ * This should only be called once as part of context initialization
+ * or to perform version check for GLX_ARB_create_context_profile.
+ */
+void
+_mesa_compute_version(struct gl_context *ctx)
+{
+   if (ctx->VersionMajor)
+      return;
+
+   switch (ctx->API) {
+   case API_OPENGL:
+      compute_version(ctx);
+      break;
+   case API_OPENGLES:
+      compute_version_es1(ctx);
+      break;
+   case API_OPENGLES2:
+      compute_version_es2(ctx);
+      break;
+   }
+
+}
diff --git a/mesalib/src/mesa/program/arbprogparse.c b/mesalib/src/mesa/program/arbprogparse.c
index ebbc195bc..7f778c3c3 100644
--- a/mesalib/src/mesa/program/arbprogparse.c
+++ b/mesalib/src/mesa/program/arbprogparse.c
@@ -1,219 +1,222 @@
-/*
- * Mesa 3-D graphics library
- * Version:  7.1
- *
- * Copyright (C) 1999-2008  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"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#define DEBUG_PARSING 0
-
-/**
- * \file arbprogparse.c
- * ARB_*_program parser core
- * \author Karl Rasche
- */
-
-/**
-Notes on program parameters, etc.
-
-The instructions we emit will use six kinds of source registers:
-
-  PROGRAM_INPUT      - input registers
-  PROGRAM_TEMPORARY  - temp registers
-  PROGRAM_ADDRESS    - address/indirect register
-  PROGRAM_SAMPLER    - texture sampler
-  PROGRAM_CONSTANT   - indexes into program->Parameters, a known constant/literal
-  PROGRAM_STATE_VAR  - indexes into program->Parameters, and may actually be:
-                       + a state variable, like "state.fog.color", or
-                       + a pointer to a "program.local[k]" parameter, or
-                       + a pointer to a "program.env[k]" parameter
-
-Basically, all the program.local[] and program.env[] values will get mapped
-into the unified gl_program->Parameters array.  This solves the problem of
-having three separate program parameter arrays.
-*/
-
-
-#include "main/glheader.h"
-#include "main/imports.h"
-#include "main/context.h"
-#include "main/mtypes.h"
-#include "arbprogparse.h"
-#include "programopt.h"
-#include "prog_parameter.h"
-#include "prog_statevars.h"
-#include "prog_instruction.h"
-#include "program_parser.h"
-
-
-void
-_mesa_parse_arb_fragment_program(struct gl_context* ctx, GLenum target,
-                                 const GLvoid *str, GLsizei len,
-                                 struct gl_fragment_program *program)
-{
-   struct gl_program prog;
-   struct asm_parser_state state;
-   GLuint i;
-
-   ASSERT(target == GL_FRAGMENT_PROGRAM_ARB);
-
-   memset(&prog, 0, sizeof(prog));
-   memset(&state, 0, sizeof(state));
-   state.prog = &prog;
-
-   if (!_mesa_parse_arb_program(ctx, target, (const GLubyte*) str, len,
-				&state)) {
-      /* Error in the program. Just return. */
-      return;
-   }
-
-   if (program->Base.String != NULL)
-      free(program->Base.String);
-
-   /* Copy the relevant contents of the arb_program struct into the
-    * fragment_program struct.
-    */
-   program->Base.String          = prog.String;
-   program->Base.NumInstructions = prog.NumInstructions;
-   program->Base.NumTemporaries  = prog.NumTemporaries;
-   program->Base.NumParameters   = prog.NumParameters;
-   program->Base.NumAttributes   = prog.NumAttributes;
-   program->Base.NumAddressRegs  = prog.NumAddressRegs;
-   program->Base.NumNativeInstructions = prog.NumNativeInstructions;
-   program->Base.NumNativeTemporaries = prog.NumNativeTemporaries;
-   program->Base.NumNativeParameters = prog.NumNativeParameters;
-   program->Base.NumNativeAttributes = prog.NumNativeAttributes;
-   program->Base.NumNativeAddressRegs = prog.NumNativeAddressRegs;
-   program->Base.NumAluInstructions   = prog.NumAluInstructions;
-   program->Base.NumTexInstructions   = prog.NumTexInstructions;
-   program->Base.NumTexIndirections   = prog.NumTexIndirections;
-   program->Base.NumNativeAluInstructions = prog.NumAluInstructions;
-   program->Base.NumNativeTexInstructions = prog.NumTexInstructions;
-   program->Base.NumNativeTexIndirections = prog.NumTexIndirections;
-   program->Base.InputsRead      = prog.InputsRead;
-   program->Base.OutputsWritten  = prog.OutputsWritten;
-   program->Base.IndirectRegisterFiles = prog.IndirectRegisterFiles;
-   for (i = 0; i < MAX_TEXTURE_IMAGE_UNITS; i++) {
-      program->Base.TexturesUsed[i] = prog.TexturesUsed[i];
-      if (prog.TexturesUsed[i])
-         program->Base.SamplersUsed |= (1 << i);
-   }
-   program->Base.ShadowSamplers = prog.ShadowSamplers;
-   switch (state.option.Fog) {
-   case OPTION_FOG_EXP:    program->FogOption = GL_EXP;    break;
-   case OPTION_FOG_EXP2:   program->FogOption = GL_EXP2;   break;
-   case OPTION_FOG_LINEAR: program->FogOption = GL_LINEAR; break;
-   default:                program->FogOption = GL_NONE;   break;
-   }
-   program->OriginUpperLeft = state.option.OriginUpperLeft;
-   program->PixelCenterInteger = state.option.PixelCenterInteger;
-
-   program->UsesKill            = state.fragment.UsesKill;
-
-   if (program->FogOption)
-      program->Base.InputsRead |= FRAG_BIT_FOGC;
-
-   if (program->Base.Instructions)
-      free(program->Base.Instructions);
-   program->Base.Instructions = prog.Instructions;
-
-   if (program->Base.Parameters)
-      _mesa_free_parameter_list(program->Base.Parameters);
-   program->Base.Parameters    = prog.Parameters;
-
-   /* Append fog instructions now if the program has "OPTION ARB_fog_exp"
-    * or similar.  We used to leave this up to drivers, but it appears
-    * there's no hardware that wants to do fog in a discrete stage separate
-    * from the fragment shader.
-    */
-   if (program->FogOption != GL_NONE) {
-      _mesa_append_fog_code(ctx, program);
-      program->FogOption = GL_NONE;
-   }
-
-#if DEBUG_FP
-   printf("____________Fragment program %u ________\n", program->Base.Id);
-   _mesa_print_program(&program->Base);
-#endif
-}
-
-
-
-/**
- * Parse the vertex program string.  If success, update the given
- * vertex_program object with the new program.  Else, leave the vertex_program
- * object unchanged.
- */
-void
-_mesa_parse_arb_vertex_program(struct gl_context *ctx, GLenum target,
-			       const GLvoid *str, GLsizei len,
-			       struct gl_vertex_program *program)
-{
-   struct gl_program prog;
-   struct asm_parser_state state;
-
-   ASSERT(target == GL_VERTEX_PROGRAM_ARB);
-
-   memset(&prog, 0, sizeof(prog));
-   memset(&state, 0, sizeof(state));
-   state.prog = &prog;
-
-   if (!_mesa_parse_arb_program(ctx, target, (const GLubyte*) str, len,
-				&state)) {
-      _mesa_error(ctx, GL_INVALID_OPERATION, "glProgramString(bad program)");
-      return;
-   }
-
-   if (program->Base.String != NULL)
-      free(program->Base.String);
-
-   /* Copy the relevant contents of the arb_program struct into the 
-    * vertex_program struct.
-    */
-   program->Base.String          = prog.String;
-   program->Base.NumInstructions = prog.NumInstructions;
-   program->Base.NumTemporaries  = prog.NumTemporaries;
-   program->Base.NumParameters   = prog.NumParameters;
-   program->Base.NumAttributes   = prog.NumAttributes;
-   program->Base.NumAddressRegs  = prog.NumAddressRegs;
-   program->Base.NumNativeInstructions = prog.NumNativeInstructions;
-   program->Base.NumNativeTemporaries = prog.NumNativeTemporaries;
-   program->Base.NumNativeParameters = prog.NumNativeParameters;
-   program->Base.NumNativeAttributes = prog.NumNativeAttributes;
-   program->Base.NumNativeAddressRegs = prog.NumNativeAddressRegs;
-   program->Base.InputsRead     = prog.InputsRead;
-   program->Base.OutputsWritten = prog.OutputsWritten;
-   program->Base.IndirectRegisterFiles = prog.IndirectRegisterFiles;
-   program->IsPositionInvariant = (state.option.PositionInvariant)
-      ? GL_TRUE : GL_FALSE;
-
-   if (program->Base.Instructions)
-      free(program->Base.Instructions);
-   program->Base.Instructions = prog.Instructions;
-
-   if (program->Base.Parameters)
-      _mesa_free_parameter_list(program->Base.Parameters);
-   program->Base.Parameters = prog.Parameters; 
-
-#if DEBUG_VP
-   printf("____________Vertex program %u __________\n", program->Base.Id);
-   _mesa_print_program(&program->Base);
-#endif
-}
+/*
+ * Mesa 3-D graphics library
+ * Version:  7.1
+ *
+ * Copyright (C) 1999-2008  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"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#define DEBUG_PARSING 0
+
+/**
+ * \file arbprogparse.c
+ * ARB_*_program parser core
+ * \author Karl Rasche
+ */
+
+/**
+Notes on program parameters, etc.
+
+The instructions we emit will use six kinds of source registers:
+
+  PROGRAM_INPUT      - input registers
+  PROGRAM_TEMPORARY  - temp registers
+  PROGRAM_ADDRESS    - address/indirect register
+  PROGRAM_SAMPLER    - texture sampler
+  PROGRAM_CONSTANT   - indexes into program->Parameters, a known constant/literal
+  PROGRAM_STATE_VAR  - indexes into program->Parameters, and may actually be:
+                       + a state variable, like "state.fog.color", or
+                       + a pointer to a "program.local[k]" parameter, or
+                       + a pointer to a "program.env[k]" parameter
+
+Basically, all the program.local[] and program.env[] values will get mapped
+into the unified gl_program->Parameters array.  This solves the problem of
+having three separate program parameter arrays.
+*/
+
+
+#include "main/glheader.h"
+#include "main/imports.h"
+#include "main/context.h"
+#include "main/mtypes.h"
+#include "arbprogparse.h"
+#include "programopt.h"
+#include "prog_parameter.h"
+#include "prog_statevars.h"
+#include "prog_instruction.h"
+#include "program_parser.h"
+
+
+void
+_mesa_parse_arb_fragment_program(struct gl_context* ctx, GLenum target,
+                                 const GLvoid *str, GLsizei len,
+                                 struct gl_fragment_program *program)
+{
+   struct gl_program prog;
+   struct asm_parser_state state;
+   GLuint i;
+
+   ASSERT(target == GL_FRAGMENT_PROGRAM_ARB);
+
+   memset(&prog, 0, sizeof(prog));
+   memset(&state, 0, sizeof(state));
+   state.prog = &prog;
+
+   if (!_mesa_parse_arb_program(ctx, target, (const GLubyte*) str, len,
+				&state)) {
+      /* Error in the program. Just return. */
+      return;
+   }
+
+   if (program->Base.String != NULL)
+      free(program->Base.String);
+
+   /* Copy the relevant contents of the arb_program struct into the
+    * fragment_program struct.
+    */
+   program->Base.String          = prog.String;
+   program->Base.NumInstructions = prog.NumInstructions;
+   program->Base.NumTemporaries  = prog.NumTemporaries;
+   program->Base.NumParameters   = prog.NumParameters;
+   program->Base.NumAttributes   = prog.NumAttributes;
+   program->Base.NumAddressRegs  = prog.NumAddressRegs;
+   program->Base.NumNativeInstructions = prog.NumNativeInstructions;
+   program->Base.NumNativeTemporaries = prog.NumNativeTemporaries;
+   program->Base.NumNativeParameters = prog.NumNativeParameters;
+   program->Base.NumNativeAttributes = prog.NumNativeAttributes;
+   program->Base.NumNativeAddressRegs = prog.NumNativeAddressRegs;
+   program->Base.NumAluInstructions   = prog.NumAluInstructions;
+   program->Base.NumTexInstructions   = prog.NumTexInstructions;
+   program->Base.NumTexIndirections   = prog.NumTexIndirections;
+   program->Base.NumNativeAluInstructions = prog.NumAluInstructions;
+   program->Base.NumNativeTexInstructions = prog.NumTexInstructions;
+   program->Base.NumNativeTexIndirections = prog.NumTexIndirections;
+   program->Base.InputsRead      = prog.InputsRead;
+   program->Base.OutputsWritten  = prog.OutputsWritten;
+   program->Base.IndirectRegisterFiles = prog.IndirectRegisterFiles;
+   for (i = 0; i < MAX_TEXTURE_IMAGE_UNITS; i++) {
+      program->Base.TexturesUsed[i] = prog.TexturesUsed[i];
+      if (prog.TexturesUsed[i])
+         program->Base.SamplersUsed |= (1 << i);
+   }
+   program->Base.ShadowSamplers = prog.ShadowSamplers;
+   switch (state.option.Fog) {
+   case OPTION_FOG_EXP:    program->FogOption = GL_EXP;    break;
+   case OPTION_FOG_EXP2:   program->FogOption = GL_EXP2;   break;
+   case OPTION_FOG_LINEAR: program->FogOption = GL_LINEAR; break;
+   default:                program->FogOption = GL_NONE;   break;
+   }
+   program->OriginUpperLeft = state.option.OriginUpperLeft;
+   program->PixelCenterInteger = state.option.PixelCenterInteger;
+
+   program->UsesKill            = state.fragment.UsesKill;
+
+   if (program->FogOption)
+      program->Base.InputsRead |= FRAG_BIT_FOGC;
+
+   if (program->Base.Instructions)
+      free(program->Base.Instructions);
+   program->Base.Instructions = prog.Instructions;
+
+   if (program->Base.Parameters)
+      _mesa_free_parameter_list(program->Base.Parameters);
+   program->Base.Parameters    = prog.Parameters;
+
+   /* Append fog instructions now if the program has "OPTION ARB_fog_exp"
+    * or similar.  We used to leave this up to drivers, but it appears
+    * there's no hardware that wants to do fog in a discrete stage separate
+    * from the fragment shader.
+    */
+   if (program->FogOption != GL_NONE) {
+      /* XXX: we should somehow recompile this to remove clamping if disabled
+       * On the ATI driver, this is unclampled if fragment clamping is disabled
+       */
+      _mesa_append_fog_code(ctx, program, GL_TRUE);
+      program->FogOption = GL_NONE;
+   }
+
+#if DEBUG_FP
+   printf("____________Fragment program %u ________\n", program->Base.Id);
+   _mesa_print_program(&program->Base);
+#endif
+}
+
+
+
+/**
+ * Parse the vertex program string.  If success, update the given
+ * vertex_program object with the new program.  Else, leave the vertex_program
+ * object unchanged.
+ */
+void
+_mesa_parse_arb_vertex_program(struct gl_context *ctx, GLenum target,
+			       const GLvoid *str, GLsizei len,
+			       struct gl_vertex_program *program)
+{
+   struct gl_program prog;
+   struct asm_parser_state state;
+
+   ASSERT(target == GL_VERTEX_PROGRAM_ARB);
+
+   memset(&prog, 0, sizeof(prog));
+   memset(&state, 0, sizeof(state));
+   state.prog = &prog;
+
+   if (!_mesa_parse_arb_program(ctx, target, (const GLubyte*) str, len,
+				&state)) {
+      _mesa_error(ctx, GL_INVALID_OPERATION, "glProgramString(bad program)");
+      return;
+   }
+
+   if (program->Base.String != NULL)
+      free(program->Base.String);
+
+   /* Copy the relevant contents of the arb_program struct into the 
+    * vertex_program struct.
+    */
+   program->Base.String          = prog.String;
+   program->Base.NumInstructions = prog.NumInstructions;
+   program->Base.NumTemporaries  = prog.NumTemporaries;
+   program->Base.NumParameters   = prog.NumParameters;
+   program->Base.NumAttributes   = prog.NumAttributes;
+   program->Base.NumAddressRegs  = prog.NumAddressRegs;
+   program->Base.NumNativeInstructions = prog.NumNativeInstructions;
+   program->Base.NumNativeTemporaries = prog.NumNativeTemporaries;
+   program->Base.NumNativeParameters = prog.NumNativeParameters;
+   program->Base.NumNativeAttributes = prog.NumNativeAttributes;
+   program->Base.NumNativeAddressRegs = prog.NumNativeAddressRegs;
+   program->Base.InputsRead     = prog.InputsRead;
+   program->Base.OutputsWritten = prog.OutputsWritten;
+   program->Base.IndirectRegisterFiles = prog.IndirectRegisterFiles;
+   program->IsPositionInvariant = (state.option.PositionInvariant)
+      ? GL_TRUE : GL_FALSE;
+
+   if (program->Base.Instructions)
+      free(program->Base.Instructions);
+   program->Base.Instructions = prog.Instructions;
+
+   if (program->Base.Parameters)
+      _mesa_free_parameter_list(program->Base.Parameters);
+   program->Base.Parameters = prog.Parameters; 
+
+#if DEBUG_VP
+   printf("____________Vertex program %u __________\n", program->Base.Id);
+   _mesa_print_program(&program->Base);
+#endif
+}
diff --git a/mesalib/src/mesa/program/ir_to_mesa.cpp b/mesalib/src/mesa/program/ir_to_mesa.cpp
index c1b28ec3f..bf2513d47 100644
--- a/mesalib/src/mesa/program/ir_to_mesa.cpp
+++ b/mesalib/src/mesa/program/ir_to_mesa.cpp
@@ -1,3332 +1,3309 @@
-/*
- * Copyright (C) 2005-2007  Brian Paul   All Rights Reserved.
- * Copyright (C) 2008  VMware, Inc.   All Rights Reserved.
- * Copyright © 2010 Intel Corporation
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-
-/**
- * \file ir_to_mesa.cpp
- *
- * Translate GLSL IR to Mesa's gl_program representation.
- */
-
-#include <stdio.h>
-#include "main/compiler.h"
-#include "ir.h"
-#include "ir_visitor.h"
-#include "ir_print_visitor.h"
-#include "ir_expression_flattening.h"
-#include "glsl_types.h"
-#include "glsl_parser_extras.h"
-#include "../glsl/program.h"
-#include "ir_optimization.h"
-#include "ast.h"
-
-extern "C" {
-#include "main/mtypes.h"
-#include "main/shaderapi.h"
-#include "main/shaderobj.h"
-#include "main/uniforms.h"
-#include "program/hash_table.h"
-#include "program/prog_instruction.h"
-#include "program/prog_optimize.h"
-#include "program/prog_print.h"
-#include "program/program.h"
-#include "program/prog_uniform.h"
-#include "program/prog_parameter.h"
-#include "program/sampler.h"
-}
-
-static int swizzle_for_size(int size);
-
-/**
- * This struct is a corresponding struct to Mesa prog_src_register, with
- * wider fields.
- */
-typedef struct ir_to_mesa_src_reg {
-   ir_to_mesa_src_reg(int file, int index, const glsl_type *type)
-   {
-      this->file = (gl_register_file) file;
-      this->index = index;
-      if (type && (type->is_scalar() || type->is_vector() || type->is_matrix()))
-	 this->swizzle = swizzle_for_size(type->vector_elements);
-      else
-	 this->swizzle = SWIZZLE_XYZW;
-      this->negate = 0;
-      this->reladdr = NULL;
-   }
-
-   ir_to_mesa_src_reg()
-   {
-      this->file = PROGRAM_UNDEFINED;
-      this->index = 0;
-      this->swizzle = 0;
-      this->negate = 0;
-      this->reladdr = NULL;
-   }
-
-   gl_register_file file; /**< PROGRAM_* from Mesa */
-   int index; /**< temporary index, VERT_ATTRIB_*, FRAG_ATTRIB_*, etc. */
-   GLuint swizzle; /**< SWIZZLE_XYZWONEZERO swizzles from Mesa. */
-   int negate; /**< NEGATE_XYZW mask from mesa */
-   /** Register index should be offset by the integer in this reg. */
-   ir_to_mesa_src_reg *reladdr;
-} ir_to_mesa_src_reg;
-
-typedef struct ir_to_mesa_dst_reg {
-   int file; /**< PROGRAM_* from Mesa */
-   int index; /**< temporary index, VERT_ATTRIB_*, FRAG_ATTRIB_*, etc. */
-   int writemask; /**< Bitfield of WRITEMASK_[XYZW] */
-   GLuint cond_mask:4;
-   /** Register index should be offset by the integer in this reg. */
-   ir_to_mesa_src_reg *reladdr;
-} ir_to_mesa_dst_reg;
-
-extern ir_to_mesa_src_reg ir_to_mesa_undef;
-
-class ir_to_mesa_instruction : public exec_node {
-public:
-   /* Callers of this ralloc-based new need not call delete. It's
-    * easier to just ralloc_free 'ctx' (or any of its ancestors). */
-   static void* operator new(size_t size, void *ctx)
-   {
-      void *node;
-
-      node = rzalloc_size(ctx, size);
-      assert(node != NULL);
-
-      return node;
-   }
-
-   enum prog_opcode op;
-   ir_to_mesa_dst_reg dst_reg;
-   ir_to_mesa_src_reg src_reg[3];
-   /** Pointer to the ir source this tree came from for debugging */
-   ir_instruction *ir;
-   GLboolean cond_update;
-   bool saturate;
-   int sampler; /**< sampler index */
-   int tex_target; /**< One of TEXTURE_*_INDEX */
-   GLboolean tex_shadow;
-
-   class function_entry *function; /* Set on OPCODE_CAL or OPCODE_BGNSUB */
-};
-
-class variable_storage : public exec_node {
-public:
-   variable_storage(ir_variable *var, gl_register_file file, int index)
-      : file(file), index(index), var(var)
-   {
-      /* empty */
-   }
-
-   gl_register_file file;
-   int index;
-   ir_variable *var; /* variable that maps to this, if any */
-};
-
-class function_entry : public exec_node {
-public:
-   ir_function_signature *sig;
-
-   /**
-    * identifier of this function signature used by the program.
-    *
-    * At the point that Mesa instructions for function calls are
-    * generated, we don't know the address of the first instruction of
-    * the function body.  So we make the BranchTarget that is called a
-    * small integer and rewrite them during set_branchtargets().
-    */
-   int sig_id;
-
-   /**
-    * Pointer to first instruction of the function body.
-    *
-    * Set during function body emits after main() is processed.
-    */
-   ir_to_mesa_instruction *bgn_inst;
-
-   /**
-    * Index of the first instruction of the function body in actual
-    * Mesa IR.
-    *
-    * Set after convertion from ir_to_mesa_instruction to prog_instruction.
-    */
-   int inst;
-
-   /** Storage for the return value. */
-   ir_to_mesa_src_reg return_reg;
-};
-
-class ir_to_mesa_visitor : public ir_visitor {
-public:
-   ir_to_mesa_visitor();
-   ~ir_to_mesa_visitor();
-
-   function_entry *current_function;
-
-   struct gl_context *ctx;
-   struct gl_program *prog;
-   struct gl_shader_program *shader_program;
-   struct gl_shader_compiler_options *options;
-
-   int next_temp;
-
-   variable_storage *find_variable_storage(ir_variable *var);
-
-   function_entry *get_function_signature(ir_function_signature *sig);
-
-   ir_to_mesa_src_reg get_temp(const glsl_type *type);
-   void reladdr_to_temp(ir_instruction *ir,
-			ir_to_mesa_src_reg *reg, int *num_reladdr);
-
-   struct ir_to_mesa_src_reg src_reg_for_float(float val);
-
-   /**
-    * \name Visit methods
-    *
-    * As typical for the visitor pattern, there must be one \c visit method for
-    * each concrete subclass of \c ir_instruction.  Virtual base classes within
-    * the hierarchy should not have \c visit methods.
-    */
-   /*@{*/
-   virtual void visit(ir_variable *);
-   virtual void visit(ir_loop *);
-   virtual void visit(ir_loop_jump *);
-   virtual void visit(ir_function_signature *);
-   virtual void visit(ir_function *);
-   virtual void visit(ir_expression *);
-   virtual void visit(ir_swizzle *);
-   virtual void visit(ir_dereference_variable  *);
-   virtual void visit(ir_dereference_array *);
-   virtual void visit(ir_dereference_record *);
-   virtual void visit(ir_assignment *);
-   virtual void visit(ir_constant *);
-   virtual void visit(ir_call *);
-   virtual void visit(ir_return *);
-   virtual void visit(ir_discard *);
-   virtual void visit(ir_texture *);
-   virtual void visit(ir_if *);
-   /*@}*/
-
-   struct ir_to_mesa_src_reg result;
-
-   /** List of variable_storage */
-   exec_list variables;
-
-   /** List of function_entry */
-   exec_list function_signatures;
-   int next_signature_id;
-
-   /** List of ir_to_mesa_instruction */
-   exec_list instructions;
-
-   ir_to_mesa_instruction *ir_to_mesa_emit_op0(ir_instruction *ir,
-					       enum prog_opcode op);
-
-   ir_to_mesa_instruction *ir_to_mesa_emit_op1(ir_instruction *ir,
-					       enum prog_opcode op,
-					       ir_to_mesa_dst_reg dst,
-					       ir_to_mesa_src_reg src0);
-
-   ir_to_mesa_instruction *ir_to_mesa_emit_op2(ir_instruction *ir,
-					       enum prog_opcode op,
-					       ir_to_mesa_dst_reg dst,
-					       ir_to_mesa_src_reg src0,
-					       ir_to_mesa_src_reg src1);
-
-   ir_to_mesa_instruction *ir_to_mesa_emit_op3(ir_instruction *ir,
-					       enum prog_opcode op,
-					       ir_to_mesa_dst_reg dst,
-					       ir_to_mesa_src_reg src0,
-					       ir_to_mesa_src_reg src1,
-					       ir_to_mesa_src_reg src2);
-
-   /**
-    * Emit the correct dot-product instruction for the type of arguments
-    *
-    * \sa ir_to_mesa_emit_op2
-    */
-   void ir_to_mesa_emit_dp(ir_instruction *ir,
-			   ir_to_mesa_dst_reg dst,
-			   ir_to_mesa_src_reg src0,
-			   ir_to_mesa_src_reg src1,
-			   unsigned elements);
-
-   void ir_to_mesa_emit_scalar_op1(ir_instruction *ir,
-				   enum prog_opcode op,
-				   ir_to_mesa_dst_reg dst,
-				   ir_to_mesa_src_reg src0);
-
-   void ir_to_mesa_emit_scalar_op2(ir_instruction *ir,
-				   enum prog_opcode op,
-				   ir_to_mesa_dst_reg dst,
-				   ir_to_mesa_src_reg src0,
-				   ir_to_mesa_src_reg src1);
-
-   void emit_scs(ir_instruction *ir, enum prog_opcode op,
-		 ir_to_mesa_dst_reg dst,
-		 const ir_to_mesa_src_reg &src);
-
-   GLboolean try_emit_mad(ir_expression *ir,
-			  int mul_operand);
-   GLboolean try_emit_sat(ir_expression *ir);
-
-   void emit_swz(ir_expression *ir);
-
-   bool process_move_condition(ir_rvalue *ir);
-
-   void copy_propagate(void);
-
-   void *mem_ctx;
-};
-
-ir_to_mesa_src_reg ir_to_mesa_undef = ir_to_mesa_src_reg(PROGRAM_UNDEFINED, 0, NULL);
-
-ir_to_mesa_dst_reg ir_to_mesa_undef_dst = {
-   PROGRAM_UNDEFINED, 0, SWIZZLE_NOOP, COND_TR, NULL,
-};
-
-ir_to_mesa_dst_reg ir_to_mesa_address_reg = {
-   PROGRAM_ADDRESS, 0, WRITEMASK_X, COND_TR, NULL
-};
-
-static void
-fail_link(struct gl_shader_program *prog, const char *fmt, ...) PRINTFLIKE(2, 3);
-
-static void
-fail_link(struct gl_shader_program *prog, const char *fmt, ...)
-{
-   va_list args;
-   va_start(args, fmt);
-   ralloc_vasprintf_append(&prog->InfoLog, fmt, args);
-   va_end(args);
-
-   prog->LinkStatus = GL_FALSE;
-}
-
-static int
-swizzle_for_size(int size)
-{
-   int size_swizzles[4] = {
-      MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X),
-      MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y),
-      MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_Z),
-      MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_W),
-   };
-
-   assert((size >= 1) && (size <= 4));
-   return size_swizzles[size - 1];
-}
-
-ir_to_mesa_instruction *
-ir_to_mesa_visitor::ir_to_mesa_emit_op3(ir_instruction *ir,
-					enum prog_opcode op,
-					ir_to_mesa_dst_reg dst,
-					ir_to_mesa_src_reg src0,
-					ir_to_mesa_src_reg src1,
-					ir_to_mesa_src_reg src2)
-{
-   ir_to_mesa_instruction *inst = new(mem_ctx) ir_to_mesa_instruction();
-   int num_reladdr = 0;
-
-   /* If we have to do relative addressing, we want to load the ARL
-    * reg directly for one of the regs, and preload the other reladdr
-    * sources into temps.
-    */
-   num_reladdr += dst.reladdr != NULL;
-   num_reladdr += src0.reladdr != NULL;
-   num_reladdr += src1.reladdr != NULL;
-   num_reladdr += src2.reladdr != NULL;
-
-   reladdr_to_temp(ir, &src2, &num_reladdr);
-   reladdr_to_temp(ir, &src1, &num_reladdr);
-   reladdr_to_temp(ir, &src0, &num_reladdr);
-
-   if (dst.reladdr) {
-      ir_to_mesa_emit_op1(ir, OPCODE_ARL, ir_to_mesa_address_reg,
-                          *dst.reladdr);
-
-      num_reladdr--;
-   }
-   assert(num_reladdr == 0);
-
-   inst->op = op;
-   inst->dst_reg = dst;
-   inst->src_reg[0] = src0;
-   inst->src_reg[1] = src1;
-   inst->src_reg[2] = src2;
-   inst->ir = ir;
-
-   inst->function = NULL;
-
-   this->instructions.push_tail(inst);
-
-   return inst;
-}
-
-
-ir_to_mesa_instruction *
-ir_to_mesa_visitor::ir_to_mesa_emit_op2(ir_instruction *ir,
-					enum prog_opcode op,
-					ir_to_mesa_dst_reg dst,
-					ir_to_mesa_src_reg src0,
-					ir_to_mesa_src_reg src1)
-{
-   return ir_to_mesa_emit_op3(ir, op, dst, src0, src1, ir_to_mesa_undef);
-}
-
-ir_to_mesa_instruction *
-ir_to_mesa_visitor::ir_to_mesa_emit_op1(ir_instruction *ir,
-					enum prog_opcode op,
-					ir_to_mesa_dst_reg dst,
-					ir_to_mesa_src_reg src0)
-{
-   assert(dst.writemask != 0);
-   return ir_to_mesa_emit_op3(ir, op, dst,
-			      src0, ir_to_mesa_undef, ir_to_mesa_undef);
-}
-
-ir_to_mesa_instruction *
-ir_to_mesa_visitor::ir_to_mesa_emit_op0(ir_instruction *ir,
-					enum prog_opcode op)
-{
-   return ir_to_mesa_emit_op3(ir, op, ir_to_mesa_undef_dst,
-			      ir_to_mesa_undef,
-			      ir_to_mesa_undef,
-			      ir_to_mesa_undef);
-}
-
-void
-ir_to_mesa_visitor::ir_to_mesa_emit_dp(ir_instruction *ir,
-				       ir_to_mesa_dst_reg dst,
-				       ir_to_mesa_src_reg src0,
-				       ir_to_mesa_src_reg src1,
-				       unsigned elements)
-{
-   static const gl_inst_opcode dot_opcodes[] = {
-      OPCODE_DP2, OPCODE_DP3, OPCODE_DP4
-   };
-
-   ir_to_mesa_emit_op3(ir, dot_opcodes[elements - 2],
-		       dst, src0, src1, ir_to_mesa_undef);
-}
-
-inline ir_to_mesa_dst_reg
-ir_to_mesa_dst_reg_from_src(ir_to_mesa_src_reg reg)
-{
-   ir_to_mesa_dst_reg dst_reg;
-
-   dst_reg.file = reg.file;
-   dst_reg.index = reg.index;
-   dst_reg.writemask = WRITEMASK_XYZW;
-   dst_reg.cond_mask = COND_TR;
-   dst_reg.reladdr = reg.reladdr;
-
-   return dst_reg;
-}
-
-inline ir_to_mesa_src_reg
-ir_to_mesa_src_reg_from_dst(ir_to_mesa_dst_reg reg)
-{
-   return ir_to_mesa_src_reg(reg.file, reg.index, NULL);
-}
-
-/**
- * Emits Mesa scalar opcodes to produce unique answers across channels.
- *
- * Some Mesa opcodes are scalar-only, like ARB_fp/vp.  The src X
- * channel determines the result across all channels.  So to do a vec4
- * of this operation, we want to emit a scalar per source channel used
- * to produce dest channels.
- */
-void
-ir_to_mesa_visitor::ir_to_mesa_emit_scalar_op2(ir_instruction *ir,
-					       enum prog_opcode op,
-					       ir_to_mesa_dst_reg dst,
-					       ir_to_mesa_src_reg orig_src0,
-					       ir_to_mesa_src_reg orig_src1)
-{
-   int i, j;
-   int done_mask = ~dst.writemask;
-
-   /* Mesa RCP is a scalar operation splatting results to all channels,
-    * like ARB_fp/vp.  So emit as many RCPs as necessary to cover our
-    * dst channels.
-    */
-   for (i = 0; i < 4; i++) {
-      GLuint this_mask = (1 << i);
-      ir_to_mesa_instruction *inst;
-      ir_to_mesa_src_reg src0 = orig_src0;
-      ir_to_mesa_src_reg src1 = orig_src1;
-
-      if (done_mask & this_mask)
-	 continue;
-
-      GLuint src0_swiz = GET_SWZ(src0.swizzle, i);
-      GLuint src1_swiz = GET_SWZ(src1.swizzle, i);
-      for (j = i + 1; j < 4; j++) {
-	 /* If there is another enabled component in the destination that is
-	  * derived from the same inputs, generate its value on this pass as
-	  * well.
-	  */
-	 if (!(done_mask & (1 << j)) &&
-	     GET_SWZ(src0.swizzle, j) == src0_swiz &&
-	     GET_SWZ(src1.swizzle, j) == src1_swiz) {
-	    this_mask |= (1 << j);
-	 }
-      }
-      src0.swizzle = MAKE_SWIZZLE4(src0_swiz, src0_swiz,
-				   src0_swiz, src0_swiz);
-      src1.swizzle = MAKE_SWIZZLE4(src1_swiz, src1_swiz,
-				  src1_swiz, src1_swiz);
-
-      inst = ir_to_mesa_emit_op2(ir, op,
-				 dst,
-				 src0,
-				 src1);
-      inst->dst_reg.writemask = this_mask;
-      done_mask |= this_mask;
-   }
-}
-
-void
-ir_to_mesa_visitor::ir_to_mesa_emit_scalar_op1(ir_instruction *ir,
-					       enum prog_opcode op,
-					       ir_to_mesa_dst_reg dst,
-					       ir_to_mesa_src_reg src0)
-{
-   ir_to_mesa_src_reg undef = ir_to_mesa_undef;
-
-   undef.swizzle = SWIZZLE_XXXX;
-
-   ir_to_mesa_emit_scalar_op2(ir, op, dst, src0, undef);
-}
-
-/**
- * Emit an OPCODE_SCS instruction
- *
- * The \c SCS opcode functions a bit differently than the other Mesa (or
- * ARB_fragment_program) opcodes.  Instead of splatting its result across all
- * four components of the destination, it writes one value to the \c x
- * component and another value to the \c y component.
- *
- * \param ir        IR instruction being processed
- * \param op        Either \c OPCODE_SIN or \c OPCODE_COS depending on which
- *                  value is desired.
- * \param dst       Destination register
- * \param src       Source register
- */
-void
-ir_to_mesa_visitor::emit_scs(ir_instruction *ir, enum prog_opcode op,
-			     ir_to_mesa_dst_reg dst,
-			     const ir_to_mesa_src_reg &src)
-{
-   /* Vertex programs cannot use the SCS opcode.
-    */
-   if (this->prog->Target == GL_VERTEX_PROGRAM_ARB) {
-      ir_to_mesa_emit_scalar_op1(ir, op, dst, src);
-      return;
-   }
-
-   const unsigned component = (op == OPCODE_SIN) ? 0 : 1;
-   const unsigned scs_mask = (1U << component);
-   int done_mask = ~dst.writemask;
-   ir_to_mesa_src_reg tmp;
-
-   assert(op == OPCODE_SIN || op == OPCODE_COS);
-
-   /* If there are compnents in the destination that differ from the component
-    * that will be written by the SCS instrution, we'll need a temporary.
-    */
-   if (scs_mask != unsigned(dst.writemask)) {
-      tmp = get_temp(glsl_type::vec4_type);
-   }
-
-   for (unsigned i = 0; i < 4; i++) {
-      unsigned this_mask = (1U << i);
-      ir_to_mesa_src_reg src0 = src;
-
-      if ((done_mask & this_mask) != 0)
-	 continue;
-
-      /* The source swizzle specified which component of the source generates
-       * sine / cosine for the current component in the destination.  The SCS
-       * instruction requires that this value be swizzle to the X component.
-       * Replace the current swizzle with a swizzle that puts the source in
-       * the X component.
-       */
-      unsigned src0_swiz = GET_SWZ(src.swizzle, i);
-
-      src0.swizzle = MAKE_SWIZZLE4(src0_swiz, src0_swiz,
-				   src0_swiz, src0_swiz);
-      for (unsigned j = i + 1; j < 4; j++) {
-	 /* If there is another enabled component in the destination that is
-	  * derived from the same inputs, generate its value on this pass as
-	  * well.
-	  */
-	 if (!(done_mask & (1 << j)) &&
-	     GET_SWZ(src0.swizzle, j) == src0_swiz) {
-	    this_mask |= (1 << j);
-	 }
-      }
-
-      if (this_mask != scs_mask) {
-	 ir_to_mesa_instruction *inst;
-	 ir_to_mesa_dst_reg tmp_dst = ir_to_mesa_dst_reg_from_src(tmp);
-
-	 /* Emit the SCS instruction.
-	  */
-	 inst = ir_to_mesa_emit_op1(ir, OPCODE_SCS, tmp_dst, src0);
-	 inst->dst_reg.writemask = scs_mask;
-
-	 /* Move the result of the SCS instruction to the desired location in
-	  * the destination.
-	  */
-	 tmp.swizzle = MAKE_SWIZZLE4(component, component,
-				     component, component);
-	 inst = ir_to_mesa_emit_op1(ir, OPCODE_SCS, dst, tmp);
-	 inst->dst_reg.writemask = this_mask;
-      } else {
-	 /* Emit the SCS instruction to write directly to the destination.
-	  */
-	 ir_to_mesa_instruction *inst =
-	    ir_to_mesa_emit_op1(ir, OPCODE_SCS, dst, src0);
-	 inst->dst_reg.writemask = scs_mask;
-      }
-
-      done_mask |= this_mask;
-   }
-}
-
-struct ir_to_mesa_src_reg
-ir_to_mesa_visitor::src_reg_for_float(float val)
-{
-   ir_to_mesa_src_reg src_reg(PROGRAM_CONSTANT, -1, NULL);
-
-   src_reg.index = _mesa_add_unnamed_constant(this->prog->Parameters,
-					      &val, 1, &src_reg.swizzle);
-
-   return src_reg;
-}
-
-static int
-type_size(const struct glsl_type *type)
-{
-   unsigned int i;
-   int size;
-
-   switch (type->base_type) {
-   case GLSL_TYPE_UINT:
-   case GLSL_TYPE_INT:
-   case GLSL_TYPE_FLOAT:
-   case GLSL_TYPE_BOOL:
-      if (type->is_matrix()) {
-	 return type->matrix_columns;
-      } else {
-	 /* Regardless of size of vector, it gets a vec4. This is bad
-	  * packing for things like floats, but otherwise arrays become a
-	  * mess.  Hopefully a later pass over the code can pack scalars
-	  * down if appropriate.
-	  */
-	 return 1;
-      }
-   case GLSL_TYPE_ARRAY:
-      assert(type->length > 0);
-      return type_size(type->fields.array) * type->length;
-   case GLSL_TYPE_STRUCT:
-      size = 0;
-      for (i = 0; i < type->length; i++) {
-	 size += type_size(type->fields.structure[i].type);
-      }
-      return size;
-   case GLSL_TYPE_SAMPLER:
-      /* Samplers take up one slot in UNIFORMS[], but they're baked in
-       * at link time.
-       */
-      return 1;
-   default:
-      assert(0);
-      return 0;
-   }
-}
-
-/**
- * In the initial pass of codegen, we assign temporary numbers to
- * intermediate results.  (not SSA -- variable assignments will reuse
- * storage).  Actual register allocation for the Mesa VM occurs in a
- * pass over the Mesa IR later.
- */
-ir_to_mesa_src_reg
-ir_to_mesa_visitor::get_temp(const glsl_type *type)
-{
-   ir_to_mesa_src_reg src_reg;
-   int swizzle[4];
-   int i;
-
-   src_reg.file = PROGRAM_TEMPORARY;
-   src_reg.index = next_temp;
-   src_reg.reladdr = NULL;
-   next_temp += type_size(type);
-
-   if (type->is_array() || type->is_record()) {
-      src_reg.swizzle = SWIZZLE_NOOP;
-   } else {
-      for (i = 0; i < type->vector_elements; i++)
-	 swizzle[i] = i;
-      for (; i < 4; i++)
-	 swizzle[i] = type->vector_elements - 1;
-      src_reg.swizzle = MAKE_SWIZZLE4(swizzle[0], swizzle[1],
-				      swizzle[2], swizzle[3]);
-   }
-   src_reg.negate = 0;
-
-   return src_reg;
-}
-
-variable_storage *
-ir_to_mesa_visitor::find_variable_storage(ir_variable *var)
-{
-   
-   variable_storage *entry;
-
-   foreach_iter(exec_list_iterator, iter, this->variables) {
-      entry = (variable_storage *)iter.get();
-
-      if (entry->var == var)
-	 return entry;
-   }
-
-   return NULL;
-}
-
-void
-ir_to_mesa_visitor::visit(ir_variable *ir)
-{
-   if (strcmp(ir->name, "gl_FragCoord") == 0) {
-      struct gl_fragment_program *fp = (struct gl_fragment_program *)this->prog;
-
-      fp->OriginUpperLeft = ir->origin_upper_left;
-      fp->PixelCenterInteger = ir->pixel_center_integer;
-
-   } else if (strcmp(ir->name, "gl_FragDepth") == 0) {
-      struct gl_fragment_program *fp = (struct gl_fragment_program *)this->prog;
-      switch (ir->depth_layout) {
-      case ir_depth_layout_none:
-	 fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_NONE;
-	 break;
-      case ir_depth_layout_any:
-	 fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_ANY;
-	 break;
-      case ir_depth_layout_greater:
-	 fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_GREATER;
-	 break;
-      case ir_depth_layout_less:
-	 fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_LESS;
-	 break;
-      case ir_depth_layout_unchanged:
-	 fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_UNCHANGED;
-	 break;
-      default:
-	 assert(0);
-	 break;
-      }
-   }
-
-   if (ir->mode == ir_var_uniform && strncmp(ir->name, "gl_", 3) == 0) {
-      unsigned int i;
-      const struct gl_builtin_uniform_desc *statevar;
-
-      for (i = 0; _mesa_builtin_uniform_desc[i].name; i++) {
-	 if (strcmp(ir->name, _mesa_builtin_uniform_desc[i].name) == 0)
-	    break;
-      }
-
-      if (!_mesa_builtin_uniform_desc[i].name) {
-	 fail_link(this->shader_program,
-		   "Failed to find builtin uniform `%s'\n", ir->name);
-	 return;
-      }
-
-      statevar = &_mesa_builtin_uniform_desc[i];
-
-      int array_count;
-      if (ir->type->is_array()) {
-	 array_count = ir->type->length;
-      } else {
-	 array_count = 1;
-      }
-
-      /* Check if this statevar's setup in the STATE file exactly
-       * matches how we'll want to reference it as a
-       * struct/array/whatever.  If not, then we need to move it into
-       * temporary storage and hope that it'll get copy-propagated
-       * out.
-       */
-      for (i = 0; i < statevar->num_elements; i++) {
-	 if (statevar->elements[i].swizzle != SWIZZLE_XYZW) {
-	    break;
-	 }
-      }
-
-      struct variable_storage *storage;
-      ir_to_mesa_dst_reg dst;
-      if (i == statevar->num_elements) {
-	 /* We'll set the index later. */
-	 storage = new(mem_ctx) variable_storage(ir, PROGRAM_STATE_VAR, -1);
-	 this->variables.push_tail(storage);
-
-	 dst = ir_to_mesa_undef_dst;
-      } else {
-	 storage = new(mem_ctx) variable_storage(ir, PROGRAM_TEMPORARY,
-						 this->next_temp);
-	 this->variables.push_tail(storage);
-	 this->next_temp += type_size(ir->type);
-
-	 dst = ir_to_mesa_dst_reg_from_src(ir_to_mesa_src_reg(PROGRAM_TEMPORARY,
-							      storage->index,
-							      NULL));
-      }
-
-
-      for (int a = 0; a < array_count; a++) {
-	 for (unsigned int i = 0; i < statevar->num_elements; i++) {
-	    struct gl_builtin_uniform_element *element = &statevar->elements[i];
-	    int tokens[STATE_LENGTH];
-
-	    memcpy(tokens, element->tokens, sizeof(element->tokens));
-	    if (ir->type->is_array()) {
-	       tokens[1] = a;
-	    }
-
-	    int index = _mesa_add_state_reference(this->prog->Parameters,
-						  (gl_state_index *)tokens);
-
-	    if (storage->file == PROGRAM_STATE_VAR) {
-	       if (storage->index == -1) {
-		  storage->index = index;
-	       } else {
-		  assert(index ==
-                         (int)(storage->index + a * statevar->num_elements + i));
-	       }
-	    } else {
-	       ir_to_mesa_src_reg src(PROGRAM_STATE_VAR, index, NULL);
-	       src.swizzle = element->swizzle;
-	       ir_to_mesa_emit_op1(ir, OPCODE_MOV, dst, src);
-	       /* even a float takes up a whole vec4 reg in a struct/array. */
-	       dst.index++;
-	    }
-	 }
-      }
-      if (storage->file == PROGRAM_TEMPORARY &&
-	  dst.index != storage->index + type_size(ir->type)) {
-	 fail_link(this->shader_program,
-		   "failed to load builtin uniform `%s'  (%d/%d regs loaded)\n",
-		   ir->name, dst.index - storage->index,
-		   type_size(ir->type));
-      }
-   }
-}
-
-void
-ir_to_mesa_visitor::visit(ir_loop *ir)
-{
-   ir_dereference_variable *counter = NULL;
-
-   if (ir->counter != NULL)
-      counter = new(ir) ir_dereference_variable(ir->counter);
-
-   if (ir->from != NULL) {
-      assert(ir->counter != NULL);
-
-      ir_assignment *a = new(ir) ir_assignment(counter, ir->from, NULL);
-
-      a->accept(this);
-      delete a;
-   }
-
-   ir_to_mesa_emit_op0(NULL, OPCODE_BGNLOOP);
-
-   if (ir->to) {
-      ir_expression *e =
-	 new(ir) ir_expression(ir->cmp, glsl_type::bool_type,
-			       counter, ir->to);
-      ir_if *if_stmt =  new(ir) ir_if(e);
-
-      ir_loop_jump *brk = new(ir) ir_loop_jump(ir_loop_jump::jump_break);
-
-      if_stmt->then_instructions.push_tail(brk);
-
-      if_stmt->accept(this);
-
-      delete if_stmt;
-      delete e;
-      delete brk;
-   }
-
-   visit_exec_list(&ir->body_instructions, this);
-
-   if (ir->increment) {
-      ir_expression *e =
-	 new(ir) ir_expression(ir_binop_add, counter->type,
-			       counter, ir->increment);
-
-      ir_assignment *a = new(ir) ir_assignment(counter, e, NULL);
-
-      a->accept(this);
-      delete a;
-      delete e;
-   }
-
-   ir_to_mesa_emit_op0(NULL, OPCODE_ENDLOOP);
-}
-
-void
-ir_to_mesa_visitor::visit(ir_loop_jump *ir)
-{
-   switch (ir->mode) {
-   case ir_loop_jump::jump_break:
-      ir_to_mesa_emit_op0(NULL, OPCODE_BRK);
-      break;
-   case ir_loop_jump::jump_continue:
-      ir_to_mesa_emit_op0(NULL, OPCODE_CONT);
-      break;
-   }
-}
-
-
-void
-ir_to_mesa_visitor::visit(ir_function_signature *ir)
-{
-   assert(0);
-   (void)ir;
-}
-
-void
-ir_to_mesa_visitor::visit(ir_function *ir)
-{
-   /* Ignore function bodies other than main() -- we shouldn't see calls to
-    * them since they should all be inlined before we get to ir_to_mesa.
-    */
-   if (strcmp(ir->name, "main") == 0) {
-      const ir_function_signature *sig;
-      exec_list empty;
-
-      sig = ir->matching_signature(&empty);
-
-      assert(sig);
-
-      foreach_iter(exec_list_iterator, iter, sig->body) {
-	 ir_instruction *ir = (ir_instruction *)iter.get();
-
-	 ir->accept(this);
-      }
-   }
-}
-
-GLboolean
-ir_to_mesa_visitor::try_emit_mad(ir_expression *ir, int mul_operand)
-{
-   int nonmul_operand = 1 - mul_operand;
-   ir_to_mesa_src_reg a, b, c;
-
-   ir_expression *expr = ir->operands[mul_operand]->as_expression();
-   if (!expr || expr->operation != ir_binop_mul)
-      return false;
-
-   expr->operands[0]->accept(this);
-   a = this->result;
-   expr->operands[1]->accept(this);
-   b = this->result;
-   ir->operands[nonmul_operand]->accept(this);
-   c = this->result;
-
-   this->result = get_temp(ir->type);
-   ir_to_mesa_emit_op3(ir, OPCODE_MAD,
-		       ir_to_mesa_dst_reg_from_src(this->result), a, b, c);
-
-   return true;
-}
-
-GLboolean
-ir_to_mesa_visitor::try_emit_sat(ir_expression *ir)
-{
-   /* Saturates were only introduced to vertex programs in
-    * NV_vertex_program3, so don't give them to drivers in the VP.
-    */
-   if (this->prog->Target == GL_VERTEX_PROGRAM_ARB)
-      return false;
-
-   ir_rvalue *sat_src = ir->as_rvalue_to_saturate();
-   if (!sat_src)
-      return false;
-
-   sat_src->accept(this);
-   ir_to_mesa_src_reg src = this->result;
-
-   this->result = get_temp(ir->type);
-   ir_to_mesa_instruction *inst;
-   inst = ir_to_mesa_emit_op1(ir, OPCODE_MOV,
-			      ir_to_mesa_dst_reg_from_src(this->result),
-			      src);
-   inst->saturate = true;
-
-   return true;
-}
-
-void
-ir_to_mesa_visitor::reladdr_to_temp(ir_instruction *ir,
-				    ir_to_mesa_src_reg *reg, int *num_reladdr)
-{
-   if (!reg->reladdr)
-      return;
-
-   ir_to_mesa_emit_op1(ir, OPCODE_ARL, ir_to_mesa_address_reg, *reg->reladdr);
-
-   if (*num_reladdr != 1) {
-      ir_to_mesa_src_reg temp = get_temp(glsl_type::vec4_type);
-
-      ir_to_mesa_emit_op1(ir, OPCODE_MOV,
-			  ir_to_mesa_dst_reg_from_src(temp), *reg);
-      *reg = temp;
-   }
-
-   (*num_reladdr)--;
-}
-
-void
-ir_to_mesa_visitor::emit_swz(ir_expression *ir)
-{
-   /* Assume that the vector operator is in a form compatible with OPCODE_SWZ.
-    * This means that each of the operands is either an immediate value of -1,
-    * 0, or 1, or is a component from one source register (possibly with
-    * negation).
-    */
-   uint8_t components[4] = { 0 };
-   bool negate[4] = { false };
-   ir_variable *var = NULL;
-
-   for (unsigned i = 0; i < ir->type->vector_elements; i++) {
-      ir_rvalue *op = ir->operands[i];
-
-      assert(op->type->is_scalar());
-
-      while (op != NULL) {
-	 switch (op->ir_type) {
-	 case ir_type_constant: {
-
-	    assert(op->type->is_scalar());
-
-	    const ir_constant *const c = op->as_constant();
-	    if (c->is_one()) {
-	       components[i] = SWIZZLE_ONE;
-	    } else if (c->is_zero()) {
-	       components[i] = SWIZZLE_ZERO;
-	    } else if (c->is_negative_one()) {
-	       components[i] = SWIZZLE_ONE;
-	       negate[i] = true;
-	    } else {
-	       assert(!"SWZ constant must be 0.0 or 1.0.");
-	    }
-
-	    op = NULL;
-	    break;
-	 }
-
-	 case ir_type_dereference_variable: {
-	    ir_dereference_variable *const deref =
-	       (ir_dereference_variable *) op;
-
-	    assert((var == NULL) || (deref->var == var));
-	    components[i] = SWIZZLE_X;
-	    var = deref->var;
-	    op = NULL;
-	    break;
-	 }
-
-	 case ir_type_expression: {
-	    ir_expression *const expr = (ir_expression *) op;
-
-	    assert(expr->operation == ir_unop_neg);
-	    negate[i] = true;
-
-	    op = expr->operands[0];
-	    break;
-	 }
-
-	 case ir_type_swizzle: {
-	    ir_swizzle *const swiz = (ir_swizzle *) op;
-
-	    components[i] = swiz->mask.x;
-	    op = swiz->val;
-	    break;
-	 }
-
-	 default:
-	    assert(!"Should not get here.");
-	    return;
-	 }
-      }
-   }
-
-   assert(var != NULL);
-
-   ir_dereference_variable *const deref =
-      new(mem_ctx) ir_dereference_variable(var);
-
-   this->result.file = PROGRAM_UNDEFINED;
-   deref->accept(this);
-   if (this->result.file == PROGRAM_UNDEFINED) {
-      ir_print_visitor v;
-      printf("Failed to get tree for expression operand:\n");
-      deref->accept(&v);
-      exit(1);
-   }
-
-   ir_to_mesa_src_reg src;
-
-   src = this->result;
-   src.swizzle = MAKE_SWIZZLE4(components[0],
-			       components[1],
-			       components[2],
-			       components[3]);
-   src.negate = ((unsigned(negate[0]) << 0)
-		 | (unsigned(negate[1]) << 1)
-		 | (unsigned(negate[2]) << 2)
-		 | (unsigned(negate[3]) << 3));
-
-   /* Storage for our result.  Ideally for an assignment we'd be using the
-    * actual storage for the result here, instead.
-    */
-   const ir_to_mesa_src_reg result_src = get_temp(ir->type);
-   ir_to_mesa_dst_reg result_dst = ir_to_mesa_dst_reg_from_src(result_src);
-
-   /* Limit writes to the channels that will be used by result_src later.
-    * This does limit this temp's use as a temporary for multi-instruction
-    * sequences.
-    */
-   result_dst.writemask = (1 << ir->type->vector_elements) - 1;
-
-   ir_to_mesa_emit_op1(ir, OPCODE_SWZ, result_dst, src);
-   this->result = result_src;
-}
-
-void
-ir_to_mesa_visitor::visit(ir_expression *ir)
-{
-   unsigned int operand;
-   struct ir_to_mesa_src_reg op[Elements(ir->operands)];
-   struct ir_to_mesa_src_reg result_src;
-   struct ir_to_mesa_dst_reg result_dst;
-
-   /* Quick peephole: Emit OPCODE_MAD(a, b, c) instead of ADD(MUL(a, b), c)
-    */
-   if (ir->operation == ir_binop_add) {
-      if (try_emit_mad(ir, 1))
-	 return;
-      if (try_emit_mad(ir, 0))
-	 return;
-   }
-   if (try_emit_sat(ir))
-      return;
-
-   if (ir->operation == ir_quadop_vector) {
-      this->emit_swz(ir);
-      return;
-   }
-
-   for (operand = 0; operand < ir->get_num_operands(); operand++) {
-      this->result.file = PROGRAM_UNDEFINED;
-      ir->operands[operand]->accept(this);
-      if (this->result.file == PROGRAM_UNDEFINED) {
-	 ir_print_visitor v;
-	 printf("Failed to get tree for expression operand:\n");
-	 ir->operands[operand]->accept(&v);
-	 exit(1);
-      }
-      op[operand] = this->result;
-
-      /* Matrix expression operands should have been broken down to vector
-       * operations already.
-       */
-      assert(!ir->operands[operand]->type->is_matrix());
-   }
-
-   int vector_elements = ir->operands[0]->type->vector_elements;
-   if (ir->operands[1]) {
-      vector_elements = MAX2(vector_elements,
-			     ir->operands[1]->type->vector_elements);
-   }
-
-   this->result.file = PROGRAM_UNDEFINED;
-
-   /* Storage for our result.  Ideally for an assignment we'd be using
-    * the actual storage for the result here, instead.
-    */
-   result_src = get_temp(ir->type);
-   /* convenience for the emit functions below. */
-   result_dst = ir_to_mesa_dst_reg_from_src(result_src);
-   /* Limit writes to the channels that will be used by result_src later.
-    * This does limit this temp's use as a temporary for multi-instruction
-    * sequences.
-    */
-   result_dst.writemask = (1 << ir->type->vector_elements) - 1;
-
-   switch (ir->operation) {
-   case ir_unop_logic_not:
-      ir_to_mesa_emit_op2(ir, OPCODE_SEQ, result_dst,
-			  op[0], src_reg_for_float(0.0));
-      break;
-   case ir_unop_neg:
-      op[0].negate = ~op[0].negate;
-      result_src = op[0];
-      break;
-   case ir_unop_abs:
-      ir_to_mesa_emit_op1(ir, OPCODE_ABS, result_dst, op[0]);
-      break;
-   case ir_unop_sign:
-      ir_to_mesa_emit_op1(ir, OPCODE_SSG, result_dst, op[0]);
-      break;
-   case ir_unop_rcp:
-      ir_to_mesa_emit_scalar_op1(ir, OPCODE_RCP, result_dst, op[0]);
-      break;
-
-   case ir_unop_exp2:
-      ir_to_mesa_emit_scalar_op1(ir, OPCODE_EX2, result_dst, op[0]);
-      break;
-   case ir_unop_exp:
-   case ir_unop_log:
-      assert(!"not reached: should be handled by ir_explog_to_explog2");
-      break;
-   case ir_unop_log2:
-      ir_to_mesa_emit_scalar_op1(ir, OPCODE_LG2, result_dst, op[0]);
-      break;
-   case ir_unop_sin:
-      ir_to_mesa_emit_scalar_op1(ir, OPCODE_SIN, result_dst, op[0]);
-      break;
-   case ir_unop_cos:
-      ir_to_mesa_emit_scalar_op1(ir, OPCODE_COS, result_dst, op[0]);
-      break;
-   case ir_unop_sin_reduced:
-      emit_scs(ir, OPCODE_SIN, result_dst, op[0]);
-      break;
-   case ir_unop_cos_reduced:
-      emit_scs(ir, OPCODE_COS, result_dst, op[0]);
-      break;
-
-   case ir_unop_dFdx:
-      ir_to_mesa_emit_op1(ir, OPCODE_DDX, result_dst, op[0]);
-      break;
-   case ir_unop_dFdy:
-      ir_to_mesa_emit_op1(ir, OPCODE_DDY, result_dst, op[0]);
-      break;
-
-   case ir_unop_noise: {
-      const enum prog_opcode opcode =
-	 prog_opcode(OPCODE_NOISE1
-		     + (ir->operands[0]->type->vector_elements) - 1);
-      assert((opcode >= OPCODE_NOISE1) && (opcode <= OPCODE_NOISE4));
-
-      ir_to_mesa_emit_op1(ir, opcode, result_dst, op[0]);
-      break;
-   }
-
-   case ir_binop_add:
-      ir_to_mesa_emit_op2(ir, OPCODE_ADD, result_dst, op[0], op[1]);
-      break;
-   case ir_binop_sub:
-      ir_to_mesa_emit_op2(ir, OPCODE_SUB, result_dst, op[0], op[1]);
-      break;
-
-   case ir_binop_mul:
-      ir_to_mesa_emit_op2(ir, OPCODE_MUL, result_dst, op[0], op[1]);
-      break;
-   case ir_binop_div:
-      assert(!"not reached: should be handled by ir_div_to_mul_rcp");
-   case ir_binop_mod:
-      assert(!"ir_binop_mod should have been converted to b * fract(a/b)");
-      break;
-
-   case ir_binop_less:
-      ir_to_mesa_emit_op2(ir, OPCODE_SLT, result_dst, op[0], op[1]);
-      break;
-   case ir_binop_greater:
-      ir_to_mesa_emit_op2(ir, OPCODE_SGT, result_dst, op[0], op[1]);
-      break;
-   case ir_binop_lequal:
-      ir_to_mesa_emit_op2(ir, OPCODE_SLE, result_dst, op[0], op[1]);
-      break;
-   case ir_binop_gequal:
-      ir_to_mesa_emit_op2(ir, OPCODE_SGE, result_dst, op[0], op[1]);
-      break;
-   case ir_binop_equal:
-      ir_to_mesa_emit_op2(ir, OPCODE_SEQ, result_dst, op[0], op[1]);
-      break;
-   case ir_binop_nequal:
-      ir_to_mesa_emit_op2(ir, OPCODE_SNE, result_dst, op[0], op[1]);
-      break;
-   case ir_binop_all_equal:
-      /* "==" operator producing a scalar boolean. */
-      if (ir->operands[0]->type->is_vector() ||
-	  ir->operands[1]->type->is_vector()) {
-	 ir_to_mesa_src_reg temp = get_temp(glsl_type::vec4_type);
-	 ir_to_mesa_emit_op2(ir, OPCODE_SNE,
-			     ir_to_mesa_dst_reg_from_src(temp), op[0], op[1]);
-	 ir_to_mesa_emit_dp(ir, result_dst, temp, temp, vector_elements);
-	 ir_to_mesa_emit_op2(ir, OPCODE_SEQ,
-			     result_dst, result_src, src_reg_for_float(0.0));
-      } else {
-	 ir_to_mesa_emit_op2(ir, OPCODE_SEQ, result_dst, op[0], op[1]);
-      }
-      break;
-   case ir_binop_any_nequal:
-      /* "!=" operator producing a scalar boolean. */
-      if (ir->operands[0]->type->is_vector() ||
-	  ir->operands[1]->type->is_vector()) {
-	 ir_to_mesa_src_reg temp = get_temp(glsl_type::vec4_type);
-	 ir_to_mesa_emit_op2(ir, OPCODE_SNE,
-			     ir_to_mesa_dst_reg_from_src(temp), op[0], op[1]);
-	 ir_to_mesa_emit_dp(ir, result_dst, temp, temp, vector_elements);
-	 ir_to_mesa_emit_op2(ir, OPCODE_SNE,
-			     result_dst, result_src, src_reg_for_float(0.0));
-      } else {
-	 ir_to_mesa_emit_op2(ir, OPCODE_SNE, result_dst, op[0], op[1]);
-      }
-      break;
-
-   case ir_unop_any:
-      assert(ir->operands[0]->type->is_vector());
-      ir_to_mesa_emit_dp(ir, result_dst, op[0], op[0],
-			 ir->operands[0]->type->vector_elements);
-      ir_to_mesa_emit_op2(ir, OPCODE_SNE,
-			  result_dst, result_src, src_reg_for_float(0.0));
-      break;
-
-   case ir_binop_logic_xor:
-      ir_to_mesa_emit_op2(ir, OPCODE_SNE, result_dst, op[0], op[1]);
-      break;
-
-   case ir_binop_logic_or:
-      /* This could be a saturated add and skip the SNE. */
-      ir_to_mesa_emit_op2(ir, OPCODE_ADD,
-			  result_dst,
-			  op[0], op[1]);
-
-      ir_to_mesa_emit_op2(ir, OPCODE_SNE,
-			  result_dst,
-			  result_src, src_reg_for_float(0.0));
-      break;
-
-   case ir_binop_logic_and:
-      /* the bool args are stored as float 0.0 or 1.0, so "mul" gives us "and". */
-      ir_to_mesa_emit_op2(ir, OPCODE_MUL,
-			  result_dst,
-			  op[0], op[1]);
-      break;
-
-   case ir_binop_dot:
-      assert(ir->operands[0]->type->is_vector());
-      assert(ir->operands[0]->type == ir->operands[1]->type);
-      ir_to_mesa_emit_dp(ir, result_dst, op[0], op[1],
-			 ir->operands[0]->type->vector_elements);
-      break;
-
-   case ir_unop_sqrt:
-      /* sqrt(x) = x * rsq(x). */
-      ir_to_mesa_emit_scalar_op1(ir, OPCODE_RSQ, result_dst, op[0]);
-      ir_to_mesa_emit_op2(ir, OPCODE_MUL, result_dst, result_src, op[0]);
-      /* For incoming channels <= 0, set the result to 0. */
-      op[0].negate = ~op[0].negate;
-      ir_to_mesa_emit_op3(ir, OPCODE_CMP, result_dst,
-			  op[0], result_src, src_reg_for_float(0.0));
-      break;
-   case ir_unop_rsq:
-      ir_to_mesa_emit_scalar_op1(ir, OPCODE_RSQ, result_dst, op[0]);
-      break;
-   case ir_unop_i2f:
-   case ir_unop_b2f:
-   case ir_unop_b2i:
-      /* Mesa IR lacks types, ints are stored as truncated floats. */
-      result_src = op[0];
-      break;
-   case ir_unop_f2i:
-      ir_to_mesa_emit_op1(ir, OPCODE_TRUNC, result_dst, op[0]);
-      break;
-   case ir_unop_f2b:
-   case ir_unop_i2b:
-      ir_to_mesa_emit_op2(ir, OPCODE_SNE, result_dst,
-			  op[0], src_reg_for_float(0.0));
-      break;
-   case ir_unop_trunc:
-      ir_to_mesa_emit_op1(ir, OPCODE_TRUNC, result_dst, op[0]);
-      break;
-   case ir_unop_ceil:
-      op[0].negate = ~op[0].negate;
-      ir_to_mesa_emit_op1(ir, OPCODE_FLR, result_dst, op[0]);
-      result_src.negate = ~result_src.negate;
-      break;
-   case ir_unop_floor:
-      ir_to_mesa_emit_op1(ir, OPCODE_FLR, result_dst, op[0]);
-      break;
-   case ir_unop_fract:
-      ir_to_mesa_emit_op1(ir, OPCODE_FRC, result_dst, op[0]);
-      break;
-
-   case ir_binop_min:
-      ir_to_mesa_emit_op2(ir, OPCODE_MIN, result_dst, op[0], op[1]);
-      break;
-   case ir_binop_max:
-      ir_to_mesa_emit_op2(ir, OPCODE_MAX, result_dst, op[0], op[1]);
-      break;
-   case ir_binop_pow:
-      ir_to_mesa_emit_scalar_op2(ir, OPCODE_POW, result_dst, op[0], op[1]);
-      break;
-
-   case ir_unop_bit_not:
-   case ir_unop_u2f:
-   case ir_binop_lshift:
-   case ir_binop_rshift:
-   case ir_binop_bit_and:
-   case ir_binop_bit_xor:
-   case ir_binop_bit_or:
-   case ir_unop_round_even:
-      assert(!"GLSL 1.30 features unsupported");
-      break;
-
-   case ir_quadop_vector:
-      /* This operation should have already been handled.
-       */
-      assert(!"Should not get here.");
-      break;
-   }
-
-   this->result = result_src;
-}
-
-
-void
-ir_to_mesa_visitor::visit(ir_swizzle *ir)
-{
-   ir_to_mesa_src_reg src_reg;
-   int i;
-   int swizzle[4];
-
-   /* Note that this is only swizzles in expressions, not those on the left
-    * hand side of an assignment, which do write masking.  See ir_assignment
-    * for that.
-    */
-
-   ir->val->accept(this);
-   src_reg = this->result;
-   assert(src_reg.file != PROGRAM_UNDEFINED);
-
-   for (i = 0; i < 4; i++) {
-      if (i < ir->type->vector_elements) {
-	 switch (i) {
-	 case 0:
-	    swizzle[i] = GET_SWZ(src_reg.swizzle, ir->mask.x);
-	    break;
-	 case 1:
-	    swizzle[i] = GET_SWZ(src_reg.swizzle, ir->mask.y);
-	    break;
-	 case 2:
-	    swizzle[i] = GET_SWZ(src_reg.swizzle, ir->mask.z);
-	    break;
-	 case 3:
-	    swizzle[i] = GET_SWZ(src_reg.swizzle, ir->mask.w);
-	    break;
-	 }
-      } else {
-	 /* If the type is smaller than a vec4, replicate the last
-	  * channel out.
-	  */
-	 swizzle[i] = swizzle[ir->type->vector_elements - 1];
-      }
-   }
-
-   src_reg.swizzle = MAKE_SWIZZLE4(swizzle[0],
-				   swizzle[1],
-				   swizzle[2],
-				   swizzle[3]);
-
-   this->result = src_reg;
-}
-
-void
-ir_to_mesa_visitor::visit(ir_dereference_variable *ir)
-{
-   variable_storage *entry = find_variable_storage(ir->var);
-   ir_variable *var = ir->var;
-
-   if (!entry) {
-      switch (var->mode) {
-      case ir_var_uniform:
-	 entry = new(mem_ctx) variable_storage(var, PROGRAM_UNIFORM,
-					       var->location);
-	 this->variables.push_tail(entry);
-	 break;
-      case ir_var_in:
-      case ir_var_inout:
-	 /* The linker assigns locations for varyings and attributes,
-	  * including deprecated builtins (like gl_Color), user-assign
-	  * generic attributes (glBindVertexLocation), and
-	  * user-defined varyings.
-	  *
-	  * FINISHME: We would hit this path for function arguments.  Fix!
-	  */
-	 assert(var->location != -1);
-         entry = new(mem_ctx) variable_storage(var,
-                                               PROGRAM_INPUT,
-                                               var->location);
-         if (this->prog->Target == GL_VERTEX_PROGRAM_ARB &&
-             var->location >= VERT_ATTRIB_GENERIC0) {
-            _mesa_add_attribute(this->prog->Attributes,
-                                var->name,
-                                _mesa_sizeof_glsl_type(var->type->gl_type),
-                                var->type->gl_type,
-                                var->location - VERT_ATTRIB_GENERIC0);
-         }
-         break;
-      case ir_var_out:
-	 assert(var->location != -1);
-         entry = new(mem_ctx) variable_storage(var,
-                                               PROGRAM_OUTPUT,
-                                               var->location);
-	 break;
-      case ir_var_system_value:
-         entry = new(mem_ctx) variable_storage(var,
-                                               PROGRAM_SYSTEM_VALUE,
-                                               var->location);
-         break;
-      case ir_var_auto:
-      case ir_var_temporary:
-	 entry = new(mem_ctx) variable_storage(var, PROGRAM_TEMPORARY,
-					       this->next_temp);
-	 this->variables.push_tail(entry);
-
-	 next_temp += type_size(var->type);
-	 break;
-      }
-
-      if (!entry) {
-	 printf("Failed to make storage for %s\n", var->name);
-	 exit(1);
-      }
-   }
-
-   this->result = ir_to_mesa_src_reg(entry->file, entry->index, var->type);
-}
-
-void
-ir_to_mesa_visitor::visit(ir_dereference_array *ir)
-{
-   ir_constant *index;
-   ir_to_mesa_src_reg src_reg;
-   int element_size = type_size(ir->type);
-
-   index = ir->array_index->constant_expression_value();
-
-   ir->array->accept(this);
-   src_reg = this->result;
-
-   if (index) {
-      src_reg.index += index->value.i[0] * element_size;
-   } else {
-      ir_to_mesa_src_reg array_base = this->result;
-      /* Variable index array dereference.  It eats the "vec4" of the
-       * base of the array and an index that offsets the Mesa register
-       * index.
-       */
-      ir->array_index->accept(this);
-
-      ir_to_mesa_src_reg index_reg;
-
-      if (element_size == 1) {
-	 index_reg = this->result;
-      } else {
-	 index_reg = get_temp(glsl_type::float_type);
-
-	 ir_to_mesa_emit_op2(ir, OPCODE_MUL,
-			     ir_to_mesa_dst_reg_from_src(index_reg),
-			     this->result, src_reg_for_float(element_size));
-      }
-
-      src_reg.reladdr = ralloc(mem_ctx, ir_to_mesa_src_reg);
-      memcpy(src_reg.reladdr, &index_reg, sizeof(index_reg));
-   }
-
-   /* If the type is smaller than a vec4, replicate the last channel out. */
-   if (ir->type->is_scalar() || ir->type->is_vector())
-      src_reg.swizzle = swizzle_for_size(ir->type->vector_elements);
-   else
-      src_reg.swizzle = SWIZZLE_NOOP;
-
-   this->result = src_reg;
-}
-
-void
-ir_to_mesa_visitor::visit(ir_dereference_record *ir)
-{
-   unsigned int i;
-   const glsl_type *struct_type = ir->record->type;
-   int offset = 0;
-
-   ir->record->accept(this);
-
-   for (i = 0; i < struct_type->length; i++) {
-      if (strcmp(struct_type->fields.structure[i].name, ir->field) == 0)
-	 break;
-      offset += type_size(struct_type->fields.structure[i].type);
-   }
-
-   /* If the type is smaller than a vec4, replicate the last channel out. */
-   if (ir->type->is_scalar() || ir->type->is_vector())
-      this->result.swizzle = swizzle_for_size(ir->type->vector_elements);
-   else
-      this->result.swizzle = SWIZZLE_NOOP;
-
-   this->result.index += offset;
-}
-
-/**
- * We want to be careful in assignment setup to hit the actual storage
- * instead of potentially using a temporary like we might with the
- * ir_dereference handler.
- */
-static struct ir_to_mesa_dst_reg
-get_assignment_lhs(ir_dereference *ir, ir_to_mesa_visitor *v)
-{
-   /* The LHS must be a dereference.  If the LHS is a variable indexed array
-    * access of a vector, it must be separated into a series conditional moves
-    * before reaching this point (see ir_vec_index_to_cond_assign).
-    */
-   assert(ir->as_dereference());
-   ir_dereference_array *deref_array = ir->as_dereference_array();
-   if (deref_array) {
-      assert(!deref_array->array->type->is_vector());
-   }
-
-   /* Use the rvalue deref handler for the most part.  We'll ignore
-    * swizzles in it and write swizzles using writemask, though.
-    */
-   ir->accept(v);
-   return ir_to_mesa_dst_reg_from_src(v->result);
-}
-
-/**
- * Process the condition of a conditional assignment
- *
- * Examines the condition of a conditional assignment to generate the optimal
- * first operand of a \c CMP instruction.  If the condition is a relational
- * operator with 0 (e.g., \c ir_binop_less), the value being compared will be
- * used as the source for the \c CMP instruction.  Otherwise the comparison
- * is processed to a boolean result, and the boolean result is used as the
- * operand to the CMP instruction.
- */
-bool
-ir_to_mesa_visitor::process_move_condition(ir_rvalue *ir)
-{
-   ir_rvalue *src_ir = ir;
-   bool negate = true;
-   bool switch_order = false;
-
-   ir_expression *const expr = ir->as_expression();
-   if ((expr != NULL) && (expr->get_num_operands() == 2)) {
-      bool zero_on_left = false;
-
-      if (expr->operands[0]->is_zero()) {
-	 src_ir = expr->operands[1];
-	 zero_on_left = true;
-      } else if (expr->operands[1]->is_zero()) {
-	 src_ir = expr->operands[0];
-	 zero_on_left = false;
-      }
-
-      /*      a is -  0  +            -  0  +
-       * (a <  0)  T  F  F  ( a < 0)  T  F  F
-       * (0 <  a)  F  F  T  (-a < 0)  F  F  T
-       * (a <= 0)  T  T  F  (-a < 0)  F  F  T  (swap order of other operands)
-       * (0 <= a)  F  T  T  ( a < 0)  T  F  F  (swap order of other operands)
-       * (a >  0)  F  F  T  (-a < 0)  F  F  T
-       * (0 >  a)  T  F  F  ( a < 0)  T  F  F
-       * (a >= 0)  F  T  T  ( a < 0)  T  F  F  (swap order of other operands)
-       * (0 >= a)  T  T  F  (-a < 0)  F  F  T  (swap order of other operands)
-       *
-       * Note that exchanging the order of 0 and 'a' in the comparison simply
-       * means that the value of 'a' should be negated.
-       */
-      if (src_ir != ir) {
-	 switch (expr->operation) {
-	 case ir_binop_less:
-	    switch_order = false;
-	    negate = zero_on_left;
-	    break;
-
-	 case ir_binop_greater:
-	    switch_order = false;
-	    negate = !zero_on_left;
-	    break;
-
-	 case ir_binop_lequal:
-	    switch_order = true;
-	    negate = !zero_on_left;
-	    break;
-
-	 case ir_binop_gequal:
-	    switch_order = true;
-	    negate = zero_on_left;
-	    break;
-
-	 default:
-	    /* This isn't the right kind of comparison afterall, so make sure
-	     * the whole condition is visited.
-	     */
-	    src_ir = ir;
-	    break;
-	 }
-      }
-   }
-
-   src_ir->accept(this);
-
-   /* We use the OPCODE_CMP (a < 0 ? b : c) for conditional moves, and the
-    * condition we produced is 0.0 or 1.0.  By flipping the sign, we can
-    * choose which value OPCODE_CMP produces without an extra instruction
-    * computing the condition.
-    */
-   if (negate)
-      this->result.negate = ~this->result.negate;
-
-   return switch_order;
-}
-
-void
-ir_to_mesa_visitor::visit(ir_assignment *ir)
-{
-   struct ir_to_mesa_dst_reg l;
-   struct ir_to_mesa_src_reg r;
-   int i;
-
-   ir->rhs->accept(this);
-   r = this->result;
-
-   l = get_assignment_lhs(ir->lhs, this);
-
-   /* FINISHME: This should really set to the correct maximal writemask for each
-    * FINISHME: component written (in the loops below).  This case can only
-    * FINISHME: occur for matrices, arrays, and structures.
-    */
-   if (ir->write_mask == 0) {
-      assert(!ir->lhs->type->is_scalar() && !ir->lhs->type->is_vector());
-      l.writemask = WRITEMASK_XYZW;
-   } else if (ir->lhs->type->is_scalar()) {
-      /* FINISHME: This hack makes writing to gl_FragDepth, which lives in the
-       * FINISHME: W component of fragment shader output zero, work correctly.
-       */
-      l.writemask = WRITEMASK_XYZW;
-   } else {
-      int swizzles[4];
-      int first_enabled_chan = 0;
-      int rhs_chan = 0;
-
-      assert(ir->lhs->type->is_vector());
-      l.writemask = ir->write_mask;
-
-      for (int i = 0; i < 4; i++) {
-	 if (l.writemask & (1 << i)) {
-	    first_enabled_chan = GET_SWZ(r.swizzle, i);
-	    break;
-	 }
-      }
-
-      /* Swizzle a small RHS vector into the channels being written.
-       *
-       * glsl ir treats write_mask as dictating how many channels are
-       * present on the RHS while Mesa IR treats write_mask as just
-       * showing which channels of the vec4 RHS get written.
-       */
-      for (int i = 0; i < 4; i++) {
-	 if (l.writemask & (1 << i))
-	    swizzles[i] = GET_SWZ(r.swizzle, rhs_chan++);
-	 else
-	    swizzles[i] = first_enabled_chan;
-      }
-      r.swizzle = MAKE_SWIZZLE4(swizzles[0], swizzles[1],
-				swizzles[2], swizzles[3]);
-   }
-
-   assert(l.file != PROGRAM_UNDEFINED);
-   assert(r.file != PROGRAM_UNDEFINED);
-
-   if (ir->condition) {
-      const bool switch_order = this->process_move_condition(ir->condition);
-      ir_to_mesa_src_reg condition = this->result;
-
-      for (i = 0; i < type_size(ir->lhs->type); i++) {
-	 if (switch_order) {
-	    ir_to_mesa_emit_op3(ir, OPCODE_CMP, l,
-				condition, ir_to_mesa_src_reg_from_dst(l), r);
-	 } else {
-	    ir_to_mesa_emit_op3(ir, OPCODE_CMP, l,
-				condition, r, ir_to_mesa_src_reg_from_dst(l));
-	 }
-
-	 l.index++;
-	 r.index++;
-      }
-   } else {
-      for (i = 0; i < type_size(ir->lhs->type); i++) {
-	 ir_to_mesa_emit_op1(ir, OPCODE_MOV, l, r);
-	 l.index++;
-	 r.index++;
-      }
-   }
-}
-
-
-void
-ir_to_mesa_visitor::visit(ir_constant *ir)
-{
-   ir_to_mesa_src_reg src_reg;
-   GLfloat stack_vals[4] = { 0 };
-   GLfloat *values = stack_vals;
-   unsigned int i;
-
-   /* Unfortunately, 4 floats is all we can get into
-    * _mesa_add_unnamed_constant.  So, make a temp to store an
-    * aggregate constant and move each constant value into it.  If we
-    * get lucky, copy propagation will eliminate the extra moves.
-    */
-
-   if (ir->type->base_type == GLSL_TYPE_STRUCT) {
-      ir_to_mesa_src_reg temp_base = get_temp(ir->type);
-      ir_to_mesa_dst_reg temp = ir_to_mesa_dst_reg_from_src(temp_base);
-
-      foreach_iter(exec_list_iterator, iter, ir->components) {
-	 ir_constant *field_value = (ir_constant *)iter.get();
-	 int size = type_size(field_value->type);
-
-	 assert(size > 0);
-
-	 field_value->accept(this);
-	 src_reg = this->result;
-
-	 for (i = 0; i < (unsigned int)size; i++) {
-	    ir_to_mesa_emit_op1(ir, OPCODE_MOV, temp, src_reg);
-
-	    src_reg.index++;
-	    temp.index++;
-	 }
-      }
-      this->result = temp_base;
-      return;
-   }
-
-   if (ir->type->is_array()) {
-      ir_to_mesa_src_reg temp_base = get_temp(ir->type);
-      ir_to_mesa_dst_reg temp = ir_to_mesa_dst_reg_from_src(temp_base);
-      int size = type_size(ir->type->fields.array);
-
-      assert(size > 0);
-
-      for (i = 0; i < ir->type->length; i++) {
-	 ir->array_elements[i]->accept(this);
-	 src_reg = this->result;
-	 for (int j = 0; j < size; j++) {
-	    ir_to_mesa_emit_op1(ir, OPCODE_MOV, temp, src_reg);
-
-	    src_reg.index++;
-	    temp.index++;
-	 }
-      }
-      this->result = temp_base;
-      return;
-   }
-
-   if (ir->type->is_matrix()) {
-      ir_to_mesa_src_reg mat = get_temp(ir->type);
-      ir_to_mesa_dst_reg mat_column = ir_to_mesa_dst_reg_from_src(mat);
-
-      for (i = 0; i < ir->type->matrix_columns; i++) {
-	 assert(ir->type->base_type == GLSL_TYPE_FLOAT);
-	 values = &ir->value.f[i * ir->type->vector_elements];
-
-	 src_reg = ir_to_mesa_src_reg(PROGRAM_CONSTANT, -1, NULL);
-	 src_reg.index = _mesa_add_unnamed_constant(this->prog->Parameters,
-						values,
-						ir->type->vector_elements,
-						&src_reg.swizzle);
-	 ir_to_mesa_emit_op1(ir, OPCODE_MOV, mat_column, src_reg);
-
-	 mat_column.index++;
-      }
-
-      this->result = mat;
-      return;
-   }
-
-   src_reg.file = PROGRAM_CONSTANT;
-   switch (ir->type->base_type) {
-   case GLSL_TYPE_FLOAT:
-      values = &ir->value.f[0];
-      break;
-   case GLSL_TYPE_UINT:
-      for (i = 0; i < ir->type->vector_elements; i++) {
-	 values[i] = ir->value.u[i];
-      }
-      break;
-   case GLSL_TYPE_INT:
-      for (i = 0; i < ir->type->vector_elements; i++) {
-	 values[i] = ir->value.i[i];
-      }
-      break;
-   case GLSL_TYPE_BOOL:
-      for (i = 0; i < ir->type->vector_elements; i++) {
-	 values[i] = ir->value.b[i];
-      }
-      break;
-   default:
-      assert(!"Non-float/uint/int/bool constant");
-   }
-
-   this->result = ir_to_mesa_src_reg(PROGRAM_CONSTANT, -1, ir->type);
-   this->result.index = _mesa_add_unnamed_constant(this->prog->Parameters,
-						   values,
-						   ir->type->vector_elements,
-						   &this->result.swizzle);
-}
-
-function_entry *
-ir_to_mesa_visitor::get_function_signature(ir_function_signature *sig)
-{
-   function_entry *entry;
-
-   foreach_iter(exec_list_iterator, iter, this->function_signatures) {
-      entry = (function_entry *)iter.get();
-
-      if (entry->sig == sig)
-	 return entry;
-   }
-
-   entry = ralloc(mem_ctx, function_entry);
-   entry->sig = sig;
-   entry->sig_id = this->next_signature_id++;
-   entry->bgn_inst = NULL;
-
-   /* Allocate storage for all the parameters. */
-   foreach_iter(exec_list_iterator, iter, sig->parameters) {
-      ir_variable *param = (ir_variable *)iter.get();
-      variable_storage *storage;
-
-      storage = find_variable_storage(param);
-      assert(!storage);
-
-      storage = new(mem_ctx) variable_storage(param, PROGRAM_TEMPORARY,
-					      this->next_temp);
-      this->variables.push_tail(storage);
-
-      this->next_temp += type_size(param->type);
-   }
-
-   if (!sig->return_type->is_void()) {
-      entry->return_reg = get_temp(sig->return_type);
-   } else {
-      entry->return_reg = ir_to_mesa_undef;
-   }
-
-   this->function_signatures.push_tail(entry);
-   return entry;
-}
-
-void
-ir_to_mesa_visitor::visit(ir_call *ir)
-{
-   ir_to_mesa_instruction *call_inst;
-   ir_function_signature *sig = ir->get_callee();
-   function_entry *entry = get_function_signature(sig);
-   int i;
-
-   /* Process in parameters. */
-   exec_list_iterator sig_iter = sig->parameters.iterator();
-   foreach_iter(exec_list_iterator, iter, *ir) {
-      ir_rvalue *param_rval = (ir_rvalue *)iter.get();
-      ir_variable *param = (ir_variable *)sig_iter.get();
-
-      if (param->mode == ir_var_in ||
-	  param->mode == ir_var_inout) {
-	 variable_storage *storage = find_variable_storage(param);
-	 assert(storage);
-
-	 param_rval->accept(this);
-	 ir_to_mesa_src_reg r = this->result;
-
-	 ir_to_mesa_dst_reg l;
-	 l.file = storage->file;
-	 l.index = storage->index;
-	 l.reladdr = NULL;
-	 l.writemask = WRITEMASK_XYZW;
-	 l.cond_mask = COND_TR;
-
-	 for (i = 0; i < type_size(param->type); i++) {
-	    ir_to_mesa_emit_op1(ir, OPCODE_MOV, l, r);
-	    l.index++;
-	    r.index++;
-	 }
-      }
-
-      sig_iter.next();
-   }
-   assert(!sig_iter.has_next());
-
-   /* Emit call instruction */
-   call_inst = ir_to_mesa_emit_op1(ir, OPCODE_CAL,
-				   ir_to_mesa_undef_dst, ir_to_mesa_undef);
-   call_inst->function = entry;
-
-   /* Process out parameters. */
-   sig_iter = sig->parameters.iterator();
-   foreach_iter(exec_list_iterator, iter, *ir) {
-      ir_rvalue *param_rval = (ir_rvalue *)iter.get();
-      ir_variable *param = (ir_variable *)sig_iter.get();
-
-      if (param->mode == ir_var_out ||
-	  param->mode == ir_var_inout) {
-	 variable_storage *storage = find_variable_storage(param);
-	 assert(storage);
-
-	 ir_to_mesa_src_reg r;
-	 r.file = storage->file;
-	 r.index = storage->index;
-	 r.reladdr = NULL;
-	 r.swizzle = SWIZZLE_NOOP;
-	 r.negate = 0;
-
-	 param_rval->accept(this);
-	 ir_to_mesa_dst_reg l = ir_to_mesa_dst_reg_from_src(this->result);
-
-	 for (i = 0; i < type_size(param->type); i++) {
-	    ir_to_mesa_emit_op1(ir, OPCODE_MOV, l, r);
-	    l.index++;
-	    r.index++;
-	 }
-      }
-
-      sig_iter.next();
-   }
-   assert(!sig_iter.has_next());
-
-   /* Process return value. */
-   this->result = entry->return_reg;
-}
-
-void
-ir_to_mesa_visitor::visit(ir_texture *ir)
-{
-   ir_to_mesa_src_reg result_src, coord, lod_info, projector;
-   ir_to_mesa_dst_reg result_dst, coord_dst;
-   ir_to_mesa_instruction *inst = NULL;
-   prog_opcode opcode = OPCODE_NOP;
-
-   ir->coordinate->accept(this);
-
-   /* Put our coords in a temp.  We'll need to modify them for shadow,
-    * projection, or LOD, so the only case we'd use it as is is if
-    * we're doing plain old texturing.  Mesa IR optimization should
-    * handle cleaning up our mess in that case.
-    */
-   coord = get_temp(glsl_type::vec4_type);
-   coord_dst = ir_to_mesa_dst_reg_from_src(coord);
-   ir_to_mesa_emit_op1(ir, OPCODE_MOV, coord_dst,
-		       this->result);
-
-   if (ir->projector) {
-      ir->projector->accept(this);
-      projector = this->result;
-   }
-
-   /* Storage for our result.  Ideally for an assignment we'd be using
-    * the actual storage for the result here, instead.
-    */
-   result_src = get_temp(glsl_type::vec4_type);
-   result_dst = ir_to_mesa_dst_reg_from_src(result_src);
-
-   switch (ir->op) {
-   case ir_tex:
-      opcode = OPCODE_TEX;
-      break;
-   case ir_txb:
-      opcode = OPCODE_TXB;
-      ir->lod_info.bias->accept(this);
-      lod_info = this->result;
-      break;
-   case ir_txl:
-      opcode = OPCODE_TXL;
-      ir->lod_info.lod->accept(this);
-      lod_info = this->result;
-      break;
-   case ir_txd:
-   case ir_txf:
-      assert(!"GLSL 1.30 features unsupported");
-      break;
-   }
-
-   if (ir->projector) {
-      if (opcode == OPCODE_TEX) {
-	 /* Slot the projector in as the last component of the coord. */
-	 coord_dst.writemask = WRITEMASK_W;
-	 ir_to_mesa_emit_op1(ir, OPCODE_MOV, coord_dst, projector);
-	 coord_dst.writemask = WRITEMASK_XYZW;
-	 opcode = OPCODE_TXP;
-      } else {
-	 ir_to_mesa_src_reg coord_w = coord;
-	 coord_w.swizzle = SWIZZLE_WWWW;
-
-	 /* For the other TEX opcodes there's no projective version
-	  * since the last slot is taken up by lod info.  Do the
-	  * projective divide now.
-	  */
-	 coord_dst.writemask = WRITEMASK_W;
-	 ir_to_mesa_emit_op1(ir, OPCODE_RCP, coord_dst, projector);
-
-	 coord_dst.writemask = WRITEMASK_XYZ;
-	 ir_to_mesa_emit_op2(ir, OPCODE_MUL, coord_dst, coord, coord_w);
-
-	 coord_dst.writemask = WRITEMASK_XYZW;
-	 coord.swizzle = SWIZZLE_XYZW;
-      }
-   }
-
-   if (ir->shadow_comparitor) {
-      /* Slot the shadow value in as the second to last component of the
-       * coord.
-       */
-      ir->shadow_comparitor->accept(this);
-      coord_dst.writemask = WRITEMASK_Z;
-      ir_to_mesa_emit_op1(ir, OPCODE_MOV, coord_dst, this->result);
-      coord_dst.writemask = WRITEMASK_XYZW;
-   }
-
-   if (opcode == OPCODE_TXL || opcode == OPCODE_TXB) {
-      /* Mesa IR stores lod or lod bias in the last channel of the coords. */
-      coord_dst.writemask = WRITEMASK_W;
-      ir_to_mesa_emit_op1(ir, OPCODE_MOV, coord_dst, lod_info);
-      coord_dst.writemask = WRITEMASK_XYZW;
-   }
-
-   inst = ir_to_mesa_emit_op1(ir, opcode, result_dst, coord);
-
-   if (ir->shadow_comparitor)
-      inst->tex_shadow = GL_TRUE;
-
-   inst->sampler = _mesa_get_sampler_uniform_value(ir->sampler,
-						   this->shader_program,
-						   this->prog);
-
-   const glsl_type *sampler_type = ir->sampler->type;
-
-   switch (sampler_type->sampler_dimensionality) {
-   case GLSL_SAMPLER_DIM_1D:
-      inst->tex_target = (sampler_type->sampler_array)
-	 ? TEXTURE_1D_ARRAY_INDEX : TEXTURE_1D_INDEX;
-      break;
-   case GLSL_SAMPLER_DIM_2D:
-      inst->tex_target = (sampler_type->sampler_array)
-	 ? TEXTURE_2D_ARRAY_INDEX : TEXTURE_2D_INDEX;
-      break;
-   case GLSL_SAMPLER_DIM_3D:
-      inst->tex_target = TEXTURE_3D_INDEX;
-      break;
-   case GLSL_SAMPLER_DIM_CUBE:
-      inst->tex_target = TEXTURE_CUBE_INDEX;
-      break;
-   case GLSL_SAMPLER_DIM_RECT:
-      inst->tex_target = TEXTURE_RECT_INDEX;
-      break;
-   case GLSL_SAMPLER_DIM_BUF:
-      assert(!"FINISHME: Implement ARB_texture_buffer_object");
-      break;
-   default:
-      assert(!"Should not get here.");
-   }
-
-   this->result = result_src;
-}
-
-void
-ir_to_mesa_visitor::visit(ir_return *ir)
-{
-   if (ir->get_value()) {
-      ir_to_mesa_dst_reg l;
-      int i;
-
-      assert(current_function);
-
-      ir->get_value()->accept(this);
-      ir_to_mesa_src_reg r = this->result;
-
-      l = ir_to_mesa_dst_reg_from_src(current_function->return_reg);
-
-      for (i = 0; i < type_size(current_function->sig->return_type); i++) {
-	 ir_to_mesa_emit_op1(ir, OPCODE_MOV, l, r);
-	 l.index++;
-	 r.index++;
-      }
-   }
-
-   ir_to_mesa_emit_op0(ir, OPCODE_RET);
-}
-
-void
-ir_to_mesa_visitor::visit(ir_discard *ir)
-{
-   struct gl_fragment_program *fp = (struct gl_fragment_program *)this->prog;
-
-   if (ir->condition) {
-      ir->condition->accept(this);
-      this->result.negate = ~this->result.negate;
-      ir_to_mesa_emit_op1(ir, OPCODE_KIL, ir_to_mesa_undef_dst, this->result);
-   } else {
-      ir_to_mesa_emit_op0(ir, OPCODE_KIL_NV);
-   }
-
-   fp->UsesKill = GL_TRUE;
-}
-
-void
-ir_to_mesa_visitor::visit(ir_if *ir)
-{
-   ir_to_mesa_instruction *cond_inst, *if_inst, *else_inst = NULL;
-   ir_to_mesa_instruction *prev_inst;
-
-   prev_inst = (ir_to_mesa_instruction *)this->instructions.get_tail();
-
-   ir->condition->accept(this);
-   assert(this->result.file != PROGRAM_UNDEFINED);
-
-   if (this->options->EmitCondCodes) {
-      cond_inst = (ir_to_mesa_instruction *)this->instructions.get_tail();
-
-      /* See if we actually generated any instruction for generating
-       * the condition.  If not, then cook up a move to a temp so we
-       * have something to set cond_update on.
-       */
-      if (cond_inst == prev_inst) {
-	 ir_to_mesa_src_reg temp = get_temp(glsl_type::bool_type);
-	 cond_inst = ir_to_mesa_emit_op1(ir->condition, OPCODE_MOV,
-					 ir_to_mesa_dst_reg_from_src(temp),
-					 result);
-      }
-      cond_inst->cond_update = GL_TRUE;
-
-      if_inst = ir_to_mesa_emit_op0(ir->condition, OPCODE_IF);
-      if_inst->dst_reg.cond_mask = COND_NE;
-   } else {
-      if_inst = ir_to_mesa_emit_op1(ir->condition,
-				    OPCODE_IF, ir_to_mesa_undef_dst,
-				    this->result);
-   }
-
-   this->instructions.push_tail(if_inst);
-
-   visit_exec_list(&ir->then_instructions, this);
-
-   if (!ir->else_instructions.is_empty()) {
-      else_inst = ir_to_mesa_emit_op0(ir->condition, OPCODE_ELSE);
-      visit_exec_list(&ir->else_instructions, this);
-   }
-
-   if_inst = ir_to_mesa_emit_op1(ir->condition, OPCODE_ENDIF,
-				 ir_to_mesa_undef_dst, ir_to_mesa_undef);
-}
-
-ir_to_mesa_visitor::ir_to_mesa_visitor()
-{
-   result.file = PROGRAM_UNDEFINED;
-   next_temp = 1;
-   next_signature_id = 1;
-   current_function = NULL;
-   mem_ctx = ralloc_context(NULL);
-}
-
-ir_to_mesa_visitor::~ir_to_mesa_visitor()
-{
-   ralloc_free(mem_ctx);
-}
-
-static struct prog_src_register
-mesa_src_reg_from_ir_src_reg(ir_to_mesa_src_reg reg)
-{
-   struct prog_src_register mesa_reg;
-
-   mesa_reg.File = reg.file;
-   assert(reg.index < (1 << INST_INDEX_BITS));
-   mesa_reg.Index = reg.index;
-   mesa_reg.Swizzle = reg.swizzle;
-   mesa_reg.RelAddr = reg.reladdr != NULL;
-   mesa_reg.Negate = reg.negate;
-   mesa_reg.Abs = 0;
-   mesa_reg.HasIndex2 = GL_FALSE;
-   mesa_reg.RelAddr2 = 0;
-   mesa_reg.Index2 = 0;
-
-   return mesa_reg;
-}
-
-static void
-set_branchtargets(ir_to_mesa_visitor *v,
-		  struct prog_instruction *mesa_instructions,
-		  int num_instructions)
-{
-   int if_count = 0, loop_count = 0;
-   int *if_stack, *loop_stack;
-   int if_stack_pos = 0, loop_stack_pos = 0;
-   int i, j;
-
-   for (i = 0; i < num_instructions; i++) {
-      switch (mesa_instructions[i].Opcode) {
-      case OPCODE_IF:
-	 if_count++;
-	 break;
-      case OPCODE_BGNLOOP:
-	 loop_count++;
-	 break;
-      case OPCODE_BRK:
-      case OPCODE_CONT:
-	 mesa_instructions[i].BranchTarget = -1;
-	 break;
-      default:
-	 break;
-      }
-   }
-
-   if_stack = rzalloc_array(v->mem_ctx, int, if_count);
-   loop_stack = rzalloc_array(v->mem_ctx, int, loop_count);
-
-   for (i = 0; i < num_instructions; i++) {
-      switch (mesa_instructions[i].Opcode) {
-      case OPCODE_IF:
-	 if_stack[if_stack_pos] = i;
-	 if_stack_pos++;
-	 break;
-      case OPCODE_ELSE:
-	 mesa_instructions[if_stack[if_stack_pos - 1]].BranchTarget = i;
-	 if_stack[if_stack_pos - 1] = i;
-	 break;
-      case OPCODE_ENDIF:
-	 mesa_instructions[if_stack[if_stack_pos - 1]].BranchTarget = i;
-	 if_stack_pos--;
-	 break;
-      case OPCODE_BGNLOOP:
-	 loop_stack[loop_stack_pos] = i;
-	 loop_stack_pos++;
-	 break;
-      case OPCODE_ENDLOOP:
-	 loop_stack_pos--;
-	 /* Rewrite any breaks/conts at this nesting level (haven't
-	  * already had a BranchTarget assigned) to point to the end
-	  * of the loop.
-	  */
-	 for (j = loop_stack[loop_stack_pos]; j < i; j++) {
-	    if (mesa_instructions[j].Opcode == OPCODE_BRK ||
-		mesa_instructions[j].Opcode == OPCODE_CONT) {
-	       if (mesa_instructions[j].BranchTarget == -1) {
-		  mesa_instructions[j].BranchTarget = i;
-	       }
-	    }
-	 }
-	 /* The loop ends point at each other. */
-	 mesa_instructions[i].BranchTarget = loop_stack[loop_stack_pos];
-	 mesa_instructions[loop_stack[loop_stack_pos]].BranchTarget = i;
-	 break;
-      case OPCODE_CAL:
-	 foreach_iter(exec_list_iterator, iter, v->function_signatures) {
-	    function_entry *entry = (function_entry *)iter.get();
-
-	    if (entry->sig_id == mesa_instructions[i].BranchTarget) {
-	       mesa_instructions[i].BranchTarget = entry->inst;
-	       break;
-	    }
-	 }
-	 break;
-      default:
-	 break;
-      }
-   }
-}
-
-static void
-print_program(struct prog_instruction *mesa_instructions,
-	      ir_instruction **mesa_instruction_annotation,
-	      int num_instructions)
-{
-   ir_instruction *last_ir = NULL;
-   int i;
-   int indent = 0;
-
-   for (i = 0; i < num_instructions; i++) {
-      struct prog_instruction *mesa_inst = mesa_instructions + i;
-      ir_instruction *ir = mesa_instruction_annotation[i];
-
-      fprintf(stdout, "%3d: ", i);
-
-      if (last_ir != ir && ir) {
-	 int j;
-
-	 for (j = 0; j < indent; j++) {
-	    fprintf(stdout, " ");
-	 }
-	 ir->print();
-	 printf("\n");
-	 last_ir = ir;
-
-	 fprintf(stdout, "     "); /* line number spacing. */
-      }
-
-      indent = _mesa_fprint_instruction_opt(stdout, mesa_inst, indent,
-					    PROG_PRINT_DEBUG, NULL);
-   }
-}
-
-
-/**
- * Count resources used by the given gpu program (number of texture
- * samplers, etc).
- */
-static void
-count_resources(struct gl_program *prog)
-{
-   unsigned int i;
-
-   prog->SamplersUsed = 0;
-
-   for (i = 0; i < prog->NumInstructions; i++) {
-      struct prog_instruction *inst = &prog->Instructions[i];
-
-      if (_mesa_is_tex_instruction(inst->Opcode)) {
-	 prog->SamplerTargets[inst->TexSrcUnit] =
-	    (gl_texture_index)inst->TexSrcTarget;
-	 prog->SamplersUsed |= 1 << inst->TexSrcUnit;
-	 if (inst->TexShadow) {
-	    prog->ShadowSamplers |= 1 << inst->TexSrcUnit;
-	 }
-      }
-   }
-
-   _mesa_update_shader_textures_used(prog);
-}
-
-
-/**
- * Check if the given vertex/fragment/shader program is within the
- * resource limits of the context (number of texture units, etc).
- * If any of those checks fail, record a linker error.
- *
- * XXX more checks are needed...
- */
-static void
-check_resources(const struct gl_context *ctx,
-                struct gl_shader_program *shader_program,
-                struct gl_program *prog)
-{
-   switch (prog->Target) {
-   case GL_VERTEX_PROGRAM_ARB:
-      if (_mesa_bitcount(prog->SamplersUsed) >
-          ctx->Const.MaxVertexTextureImageUnits) {
-         fail_link(shader_program, "Too many vertex shader texture samplers");
-      }
-      if (prog->Parameters->NumParameters > MAX_UNIFORMS) {
-         fail_link(shader_program, "Too many vertex shader constants");
-      }
-      break;
-   case MESA_GEOMETRY_PROGRAM:
-      if (_mesa_bitcount(prog->SamplersUsed) >
-          ctx->Const.MaxGeometryTextureImageUnits) {
-         fail_link(shader_program, "Too many geometry shader texture samplers");
-      }
-      if (prog->Parameters->NumParameters >
-          MAX_GEOMETRY_UNIFORM_COMPONENTS / 4) {
-         fail_link(shader_program, "Too many geometry shader constants");
-      }
-      break;
-   case GL_FRAGMENT_PROGRAM_ARB:
-      if (_mesa_bitcount(prog->SamplersUsed) >
-          ctx->Const.MaxTextureImageUnits) {
-         fail_link(shader_program, "Too many fragment shader texture samplers");
-      }
-      if (prog->Parameters->NumParameters > MAX_UNIFORMS) {
-         fail_link(shader_program, "Too many fragment shader constants");
-      }
-      break;
-   default:
-      _mesa_problem(ctx, "unexpected program type in check_resources()");
-   }
-}
-
-
-
-struct uniform_sort {
-   struct gl_uniform *u;
-   int pos;
-};
-
-/* The shader_program->Uniforms list is almost sorted in increasing
- * uniform->{Frag,Vert}Pos locations, but not quite when there are
- * uniforms shared between targets.  We need to add parameters in
- * increasing order for the targets.
- */
-static int
-sort_uniforms(const void *a, const void *b)
-{
-   struct uniform_sort *u1 = (struct uniform_sort *)a;
-   struct uniform_sort *u2 = (struct uniform_sort *)b;
-
-   return u1->pos - u2->pos;
-}
-
-/* Add the uniforms to the parameters.  The linker chose locations
- * in our parameters lists (which weren't created yet), which the
- * uniforms code will use to poke values into our parameters list
- * when uniforms are updated.
- */
-static void
-add_uniforms_to_parameters_list(struct gl_shader_program *shader_program,
-				struct gl_shader *shader,
-				struct gl_program *prog)
-{
-   unsigned int i;
-   unsigned int next_sampler = 0, num_uniforms = 0;
-   struct uniform_sort *sorted_uniforms;
-
-   sorted_uniforms = ralloc_array(NULL, struct uniform_sort,
-				  shader_program->Uniforms->NumUniforms);
-
-   for (i = 0; i < shader_program->Uniforms->NumUniforms; i++) {
-      struct gl_uniform *uniform = shader_program->Uniforms->Uniforms + i;
-      int parameter_index = -1;
-
-      switch (shader->Type) {
-      case GL_VERTEX_SHADER:
-	 parameter_index = uniform->VertPos;
-	 break;
-      case GL_FRAGMENT_SHADER:
-	 parameter_index = uniform->FragPos;
-	 break;
-      case GL_GEOMETRY_SHADER:
-	 parameter_index = uniform->GeomPos;
-	 break;
-      }
-
-      /* Only add uniforms used in our target. */
-      if (parameter_index != -1) {
-	 sorted_uniforms[num_uniforms].pos = parameter_index;
-	 sorted_uniforms[num_uniforms].u = uniform;
-	 num_uniforms++;
-      }
-   }
-
-   qsort(sorted_uniforms, num_uniforms, sizeof(struct uniform_sort),
-	 sort_uniforms);
-
-   for (i = 0; i < num_uniforms; i++) {
-      struct gl_uniform *uniform = sorted_uniforms[i].u;
-      int parameter_index = sorted_uniforms[i].pos;
-      const glsl_type *type = uniform->Type;
-      unsigned int size;
-
-      if (type->is_vector() ||
-	  type->is_scalar()) {
-	 size = type->vector_elements;
-      } else {
-	 size = type_size(type) * 4;
-      }
-
-      gl_register_file file;
-      if (type->is_sampler() ||
-	  (type->is_array() && type->fields.array->is_sampler())) {
-	 file = PROGRAM_SAMPLER;
-      } else {
-	 file = PROGRAM_UNIFORM;
-      }
-
-      GLint index = _mesa_lookup_parameter_index(prog->Parameters, -1,
-						 uniform->Name);
-
-      if (index < 0) {
-	 index = _mesa_add_parameter(prog->Parameters, file,
-				     uniform->Name, size, type->gl_type,
-				     NULL, NULL, 0x0);
-
-	 /* Sampler uniform values are stored in prog->SamplerUnits,
-	  * and the entry in that array is selected by this index we
-	  * store in ParameterValues[].
-	  */
-	 if (file == PROGRAM_SAMPLER) {
-	    for (unsigned int j = 0; j < size / 4; j++)
-	       prog->Parameters->ParameterValues[index + j][0] = next_sampler++;
-	 }
-
-	 /* The location chosen in the Parameters list here (returned
-	  * from _mesa_add_uniform) has to match what the linker chose.
-	  */
-	 if (index != parameter_index) {
-	    fail_link(shader_program, "Allocation of uniform `%s' to target "
-		      "failed (%d vs %d)\n",
-		      uniform->Name, index, parameter_index);
-	 }
-      }
-   }
-
-   ralloc_free(sorted_uniforms);
-}
-
-static void
-set_uniform_initializer(struct gl_context *ctx, void *mem_ctx,
-			struct gl_shader_program *shader_program,
-			const char *name, const glsl_type *type,
-			ir_constant *val)
-{
-   if (type->is_record()) {
-      ir_constant *field_constant;
-
-      field_constant = (ir_constant *)val->components.get_head();
-
-      for (unsigned int i = 0; i < type->length; i++) {
-	 const glsl_type *field_type = type->fields.structure[i].type;
-	 const char *field_name = ralloc_asprintf(mem_ctx, "%s.%s", name,
-					    type->fields.structure[i].name);
-	 set_uniform_initializer(ctx, mem_ctx, shader_program, field_name,
-				 field_type, field_constant);
-	 field_constant = (ir_constant *)field_constant->next;
-      }
-      return;
-   }
-
-   int loc = _mesa_get_uniform_location(ctx, shader_program, name);
-
-   if (loc == -1) {
-      fail_link(shader_program,
-		"Couldn't find uniform for initializer %s\n", name);
-      return;
-   }
-
-   for (unsigned int i = 0; i < (type->is_array() ? type->length : 1); i++) {
-      ir_constant *element;
-      const glsl_type *element_type;
-      if (type->is_array()) {
-	 element = val->array_elements[i];
-	 element_type = type->fields.array;
-      } else {
-	 element = val;
-	 element_type = type;
-      }
-
-      void *values;
-
-      if (element_type->base_type == GLSL_TYPE_BOOL) {
-	 int *conv = ralloc_array(mem_ctx, int, element_type->components());
-	 for (unsigned int j = 0; j < element_type->components(); j++) {
-	    conv[j] = element->value.b[j];
-	 }
-	 values = (void *)conv;
-	 element_type = glsl_type::get_instance(GLSL_TYPE_INT,
-						element_type->vector_elements,
-						1);
-      } else {
-	 values = &element->value;
-      }
-
-      if (element_type->is_matrix()) {
-	 _mesa_uniform_matrix(ctx, shader_program,
-			      element_type->matrix_columns,
-			      element_type->vector_elements,
-			      loc, 1, GL_FALSE, (GLfloat *)values);
-	 loc += element_type->matrix_columns;
-      } else {
-	 _mesa_uniform(ctx, shader_program, loc, element_type->matrix_columns,
-		       values, element_type->gl_type);
-	 loc += type_size(element_type);
-      }
-   }
-}
-
-static void
-set_uniform_initializers(struct gl_context *ctx,
-			 struct gl_shader_program *shader_program)
-{
-   void *mem_ctx = NULL;
-
-   for (unsigned int i = 0; i < MESA_SHADER_TYPES; i++) {
-      struct gl_shader *shader = shader_program->_LinkedShaders[i];
-
-      if (shader == NULL)
-	 continue;
-
-      foreach_iter(exec_list_iterator, iter, *shader->ir) {
-	 ir_instruction *ir = (ir_instruction *)iter.get();
-	 ir_variable *var = ir->as_variable();
-
-	 if (!var || var->mode != ir_var_uniform || !var->constant_value)
-	    continue;
-
-	 if (!mem_ctx)
-	    mem_ctx = ralloc_context(NULL);
-
-	 set_uniform_initializer(ctx, mem_ctx, shader_program, var->name,
-				 var->type, var->constant_value);
-      }
-   }
-
-   ralloc_free(mem_ctx);
-}
-
-/*
- * On a basic block basis, tracks available PROGRAM_TEMPORARY register
- * channels for copy propagation and updates following instructions to
- * use the original versions.
- *
- * The ir_to_mesa_visitor lazily produces code assuming that this pass
- * will occur.  As an example, a TXP production before this pass:
- *
- * 0: MOV TEMP[1], INPUT[4].xyyy;
- * 1: MOV TEMP[1].w, INPUT[4].wwww;
- * 2: TXP TEMP[2], TEMP[1], texture[0], 2D;
- *
- * and after:
- *
- * 0: MOV TEMP[1], INPUT[4].xyyy;
- * 1: MOV TEMP[1].w, INPUT[4].wwww;
- * 2: TXP TEMP[2], INPUT[4].xyyw, texture[0], 2D;
- *
- * which allows for dead code elimination on TEMP[1]'s writes.
- */
-void
-ir_to_mesa_visitor::copy_propagate(void)
-{
-   ir_to_mesa_instruction **acp = rzalloc_array(mem_ctx,
-						    ir_to_mesa_instruction *,
-						    this->next_temp * 4);
-   int *acp_level = rzalloc_array(mem_ctx, int, this->next_temp * 4);
-   int level = 0;
-
-   foreach_iter(exec_list_iterator, iter, this->instructions) {
-      ir_to_mesa_instruction *inst = (ir_to_mesa_instruction *)iter.get();
-
-      assert(inst->dst_reg.file != PROGRAM_TEMPORARY
-	     || inst->dst_reg.index < this->next_temp);
-
-      /* First, do any copy propagation possible into the src regs. */
-      for (int r = 0; r < 3; r++) {
-	 ir_to_mesa_instruction *first = NULL;
-	 bool good = true;
-	 int acp_base = inst->src_reg[r].index * 4;
-
-	 if (inst->src_reg[r].file != PROGRAM_TEMPORARY ||
-	     inst->src_reg[r].reladdr)
-	    continue;
-
-	 /* See if we can find entries in the ACP consisting of MOVs
-	  * from the same src register for all the swizzled channels
-	  * of this src register reference.
-	  */
-	 for (int i = 0; i < 4; i++) {
-	    int src_chan = GET_SWZ(inst->src_reg[r].swizzle, i);
-	    ir_to_mesa_instruction *copy_chan = acp[acp_base + src_chan];
-
-	    if (!copy_chan) {
-	       good = false;
-	       break;
-	    }
-
-	    assert(acp_level[acp_base + src_chan] <= level);
-
-	    if (!first) {
-	       first = copy_chan;
-	    } else {
-	       if (first->src_reg[0].file != copy_chan->src_reg[0].file ||
-		   first->src_reg[0].index != copy_chan->src_reg[0].index) {
-		  good = false;
-		  break;
-	       }
-	    }
-	 }
-
-	 if (good) {
-	    /* We've now validated that we can copy-propagate to
-	     * replace this src register reference.  Do it.
-	     */
-	    inst->src_reg[r].file = first->src_reg[0].file;
-	    inst->src_reg[r].index = first->src_reg[0].index;
-
-	    int swizzle = 0;
-	    for (int i = 0; i < 4; i++) {
-	       int src_chan = GET_SWZ(inst->src_reg[r].swizzle, i);
-	       ir_to_mesa_instruction *copy_inst = acp[acp_base + src_chan];
-	       swizzle |= (GET_SWZ(copy_inst->src_reg[0].swizzle, src_chan) <<
-			   (3 * i));
-	    }
-	    inst->src_reg[r].swizzle = swizzle;
-	 }
-      }
-
-      switch (inst->op) {
-      case OPCODE_BGNLOOP:
-      case OPCODE_ENDLOOP:
-	 /* End of a basic block, clear the ACP entirely. */
-	 memset(acp, 0, sizeof(*acp) * this->next_temp * 4);
-	 break;
-
-      case OPCODE_IF:
-	 ++level;
-	 break;
-
-      case OPCODE_ENDIF:
-      case OPCODE_ELSE:
-	 /* Clear all channels written inside the block from the ACP, but
-	  * leaving those that were not touched.
-	  */
-	 for (int r = 0; r < this->next_temp; r++) {
-	    for (int c = 0; c < 4; c++) {
-	       if (!acp[4 * r + c])
-		  continue;
-
-	       if (acp_level[4 * r + c] >= level)
-		  acp[4 * r + c] = NULL;
-	    }
-	 }
-	 if (inst->op == OPCODE_ENDIF)
-	    --level;
-	 break;
-
-      default:
-	 /* Continuing the block, clear any written channels from
-	  * the ACP.
-	  */
-	 if (inst->dst_reg.file == PROGRAM_TEMPORARY && inst->dst_reg.reladdr) {
-	    /* Any temporary might be written, so no copy propagation
-	     * across this instruction.
-	     */
-	    memset(acp, 0, sizeof(*acp) * this->next_temp * 4);
-	 } else if (inst->dst_reg.file == PROGRAM_OUTPUT &&
-		    inst->dst_reg.reladdr) {
-	    /* Any output might be written, so no copy propagation
-	     * from outputs across this instruction.
-	     */
-	    for (int r = 0; r < this->next_temp; r++) {
-	       for (int c = 0; c < 4; c++) {
-		  if (!acp[4 * r + c])
-		     continue;
-
-		  if (acp[4 * r + c]->src_reg[0].file == PROGRAM_OUTPUT)
-		     acp[4 * r + c] = NULL;
-	       }
-	    }
-	 } else if (inst->dst_reg.file == PROGRAM_TEMPORARY ||
-		    inst->dst_reg.file == PROGRAM_OUTPUT) {
-	    /* Clear where it's used as dst. */
-	    if (inst->dst_reg.file == PROGRAM_TEMPORARY) {
-	       for (int c = 0; c < 4; c++) {
-		  if (inst->dst_reg.writemask & (1 << c)) {
-		     acp[4 * inst->dst_reg.index + c] = NULL;
-		  }
-	       }
-	    }
-
-	    /* Clear where it's used as src. */
-	    for (int r = 0; r < this->next_temp; r++) {
-	       for (int c = 0; c < 4; c++) {
-		  if (!acp[4 * r + c])
-		     continue;
-
-		  int src_chan = GET_SWZ(acp[4 * r + c]->src_reg[0].swizzle, c);
-
-		  if (acp[4 * r + c]->src_reg[0].file == inst->dst_reg.file &&
-		      acp[4 * r + c]->src_reg[0].index == inst->dst_reg.index &&
-		      inst->dst_reg.writemask & (1 << src_chan))
-		  {
-		     acp[4 * r + c] = NULL;
-		  }
-	       }
-	    }
-	 }
-	 break;
-      }
-
-      /* If this is a copy, add it to the ACP. */
-      if (inst->op == OPCODE_MOV &&
-	  inst->dst_reg.file == PROGRAM_TEMPORARY &&
-	  !inst->dst_reg.reladdr &&
-	  !inst->saturate &&
-	  !inst->src_reg[0].reladdr &&
-	  !inst->src_reg[0].negate) {
-	 for (int i = 0; i < 4; i++) {
-	    if (inst->dst_reg.writemask & (1 << i)) {
-	       acp[4 * inst->dst_reg.index + i] = inst;
-	       acp_level[4 * inst->dst_reg.index + i] = level;
-	    }
-	 }
-      }
-   }
-
-   ralloc_free(acp_level);
-   ralloc_free(acp);
-}
-
-
-/**
- * Convert a shader's GLSL IR into a Mesa gl_program.
- */
-static struct gl_program *
-get_mesa_program(struct gl_context *ctx,
-                 struct gl_shader_program *shader_program,
-		 struct gl_shader *shader)
-{
-   ir_to_mesa_visitor v;
-   struct prog_instruction *mesa_instructions, *mesa_inst;
-   ir_instruction **mesa_instruction_annotation;
-   int i;
-   struct gl_program *prog;
-   GLenum target;
-   const char *target_string;
-   GLboolean progress;
-   struct gl_shader_compiler_options *options =
-         &ctx->ShaderCompilerOptions[_mesa_shader_type_to_index(shader->Type)];
-
-   switch (shader->Type) {
-   case GL_VERTEX_SHADER:
-      target = GL_VERTEX_PROGRAM_ARB;
-      target_string = "vertex";
-      break;
-   case GL_FRAGMENT_SHADER:
-      target = GL_FRAGMENT_PROGRAM_ARB;
-      target_string = "fragment";
-      break;
-   case GL_GEOMETRY_SHADER:
-      target = GL_GEOMETRY_PROGRAM_NV;
-      target_string = "geometry";
-      break;
-   default:
-      assert(!"should not be reached");
-      return NULL;
-   }
-
-   validate_ir_tree(shader->ir);
-
-   prog = ctx->Driver.NewProgram(ctx, target, shader_program->Name);
-   if (!prog)
-      return NULL;
-   prog->Parameters = _mesa_new_parameter_list();
-   prog->Varying = _mesa_new_parameter_list();
-   prog->Attributes = _mesa_new_parameter_list();
-   v.ctx = ctx;
-   v.prog = prog;
-   v.shader_program = shader_program;
-   v.options = options;
-
-   add_uniforms_to_parameters_list(shader_program, shader, prog);
-
-   /* Emit Mesa IR for main(). */
-   visit_exec_list(shader->ir, &v);
-   v.ir_to_mesa_emit_op0(NULL, OPCODE_END);
-
-   /* Now emit bodies for any functions that were used. */
-   do {
-      progress = GL_FALSE;
-
-      foreach_iter(exec_list_iterator, iter, v.function_signatures) {
-	 function_entry *entry = (function_entry *)iter.get();
-
-	 if (!entry->bgn_inst) {
-	    v.current_function = entry;
-
-	    entry->bgn_inst = v.ir_to_mesa_emit_op0(NULL, OPCODE_BGNSUB);
-	    entry->bgn_inst->function = entry;
-
-	    visit_exec_list(&entry->sig->body, &v);
-
-	    ir_to_mesa_instruction *last;
-	    last = (ir_to_mesa_instruction *)v.instructions.get_tail();
-	    if (last->op != OPCODE_RET)
-	       v.ir_to_mesa_emit_op0(NULL, OPCODE_RET);
-
-	    ir_to_mesa_instruction *end;
-	    end = v.ir_to_mesa_emit_op0(NULL, OPCODE_ENDSUB);
-	    end->function = entry;
-
-	    progress = GL_TRUE;
-	 }
-      }
-   } while (progress);
-
-   prog->NumTemporaries = v.next_temp;
-
-   int num_instructions = 0;
-   foreach_iter(exec_list_iterator, iter, v.instructions) {
-      num_instructions++;
-   }
-
-   mesa_instructions =
-      (struct prog_instruction *)calloc(num_instructions,
-					sizeof(*mesa_instructions));
-   mesa_instruction_annotation = ralloc_array(v.mem_ctx, ir_instruction *,
-					      num_instructions);
-
-   v.copy_propagate();
-
-   /* Convert ir_mesa_instructions into prog_instructions.
-    */
-   mesa_inst = mesa_instructions;
-   i = 0;
-   foreach_iter(exec_list_iterator, iter, v.instructions) {
-      const ir_to_mesa_instruction *inst = (ir_to_mesa_instruction *)iter.get();
-
-      mesa_inst->Opcode = inst->op;
-      mesa_inst->CondUpdate = inst->cond_update;
-      if (inst->saturate)
-	 mesa_inst->SaturateMode = SATURATE_ZERO_ONE;
-      mesa_inst->DstReg.File = inst->dst_reg.file;
-      mesa_inst->DstReg.Index = inst->dst_reg.index;
-      mesa_inst->DstReg.CondMask = inst->dst_reg.cond_mask;
-      mesa_inst->DstReg.WriteMask = inst->dst_reg.writemask;
-      mesa_inst->DstReg.RelAddr = inst->dst_reg.reladdr != NULL;
-      mesa_inst->SrcReg[0] = mesa_src_reg_from_ir_src_reg(inst->src_reg[0]);
-      mesa_inst->SrcReg[1] = mesa_src_reg_from_ir_src_reg(inst->src_reg[1]);
-      mesa_inst->SrcReg[2] = mesa_src_reg_from_ir_src_reg(inst->src_reg[2]);
-      mesa_inst->TexSrcUnit = inst->sampler;
-      mesa_inst->TexSrcTarget = inst->tex_target;
-      mesa_inst->TexShadow = inst->tex_shadow;
-      mesa_instruction_annotation[i] = inst->ir;
-
-      /* Set IndirectRegisterFiles. */
-      if (mesa_inst->DstReg.RelAddr)
-         prog->IndirectRegisterFiles |= 1 << mesa_inst->DstReg.File;
-
-      /* Update program's bitmask of indirectly accessed register files */
-      for (unsigned src = 0; src < 3; src++)
-         if (mesa_inst->SrcReg[src].RelAddr)
-            prog->IndirectRegisterFiles |= 1 << mesa_inst->SrcReg[src].File;
-
-      if (options->EmitNoIfs && mesa_inst->Opcode == OPCODE_IF) {
-	 fail_link(shader_program, "Couldn't flatten if statement\n");
-      }
-
-      switch (mesa_inst->Opcode) {
-      case OPCODE_BGNSUB:
-	 inst->function->inst = i;
-	 mesa_inst->Comment = strdup(inst->function->sig->function_name());
-	 break;
-      case OPCODE_ENDSUB:
-	 mesa_inst->Comment = strdup(inst->function->sig->function_name());
-	 break;
-      case OPCODE_CAL:
-	 mesa_inst->BranchTarget = inst->function->sig_id; /* rewritten later */
-	 break;
-      case OPCODE_ARL:
-	 prog->NumAddressRegs = 1;
-	 break;
-      default:
-	 break;
-      }
-
-      mesa_inst++;
-      i++;
-
-      if (!shader_program->LinkStatus)
-         break;
-   }
-
-   if (!shader_program->LinkStatus) {
-      free(mesa_instructions);
-      _mesa_reference_program(ctx, &shader->Program, NULL);
-      return NULL;
-   }
-
-   set_branchtargets(&v, mesa_instructions, num_instructions);
-
-   if (ctx->Shader.Flags & GLSL_DUMP) {
-      printf("\n");
-      printf("GLSL IR for linked %s program %d:\n", target_string,
-	     shader_program->Name);
-      _mesa_print_ir(shader->ir, NULL);
-      printf("\n");
-      printf("\n");
-      printf("Mesa IR for linked %s program %d:\n", target_string,
-	     shader_program->Name);
-      print_program(mesa_instructions, mesa_instruction_annotation,
-		    num_instructions);
-   }
-
-   prog->Instructions = mesa_instructions;
-   prog->NumInstructions = num_instructions;
-
-   do_set_program_inouts(shader->ir, prog);
-   count_resources(prog);
-
-   check_resources(ctx, shader_program, prog);
-
-   _mesa_reference_program(ctx, &shader->Program, prog);
-
-   if ((ctx->Shader.Flags & GLSL_NO_OPT) == 0) {
-      _mesa_optimize_program(ctx, prog);
-   }
-
-   return prog;
-}
-
-extern "C" {
-
-/**
- * Link a shader.
- * Called via ctx->Driver.LinkShader()
- * This actually involves converting GLSL IR into Mesa gl_programs with
- * code lowering and other optimizations.
- */
-GLboolean
-_mesa_ir_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
-{
-   assert(prog->LinkStatus);
-
-   for (unsigned i = 0; i < MESA_SHADER_TYPES; i++) {
-      if (prog->_LinkedShaders[i] == NULL)
-	 continue;
-
-      bool progress;
-      exec_list *ir = prog->_LinkedShaders[i]->ir;
-      const struct gl_shader_compiler_options *options =
-            &ctx->ShaderCompilerOptions[_mesa_shader_type_to_index(prog->_LinkedShaders[i]->Type)];
-
-      do {
-	 progress = false;
-
-	 /* Lowering */
-	 do_mat_op_to_vec(ir);
-	 lower_instructions(ir, (MOD_TO_FRACT | DIV_TO_MUL_RCP | EXP_TO_EXP2
-				 | LOG_TO_LOG2
-				 | ((options->EmitNoPow) ? POW_TO_EXP2 : 0)));
-
-	 progress = do_lower_jumps(ir, true, true, options->EmitNoMainReturn, options->EmitNoCont, options->EmitNoLoops) || progress;
-
-	 progress = do_common_optimization(ir, true, options->MaxUnrollIterations) || progress;
-
-	 progress = lower_quadop_vector(ir, true) || progress;
-
-	 if (options->EmitNoIfs) {
-	    progress = lower_discard(ir) || progress;
-	    progress = lower_if_to_cond_assign(ir) || progress;
-	 }
-
-	 if (options->EmitNoNoise)
-	    progress = lower_noise(ir) || progress;
-
-	 /* If there are forms of indirect addressing that the driver
-	  * cannot handle, perform the lowering pass.
-	  */
-	 if (options->EmitNoIndirectInput || options->EmitNoIndirectOutput
-	     || options->EmitNoIndirectTemp || options->EmitNoIndirectUniform)
-	   progress =
-	     lower_variable_index_to_cond_assign(ir,
-						 options->EmitNoIndirectInput,
-						 options->EmitNoIndirectOutput,
-						 options->EmitNoIndirectTemp,
-						 options->EmitNoIndirectUniform)
-	     || progress;
-
-	 progress = do_vec_index_to_cond_assign(ir) || progress;
-      } while (progress);
-
-      validate_ir_tree(ir);
-   }
-
-   for (unsigned i = 0; i < MESA_SHADER_TYPES; i++) {
-      struct gl_program *linked_prog;
-
-      if (prog->_LinkedShaders[i] == NULL)
-	 continue;
-
-      linked_prog = get_mesa_program(ctx, prog, prog->_LinkedShaders[i]);
-
-      if (linked_prog) {
-         bool ok = true;
-
-         switch (prog->_LinkedShaders[i]->Type) {
-         case GL_VERTEX_SHADER:
-            _mesa_reference_vertprog(ctx, &prog->VertexProgram,
-                                     (struct gl_vertex_program *)linked_prog);
-            ok = ctx->Driver.ProgramStringNotify(ctx, GL_VERTEX_PROGRAM_ARB,
-                                                 linked_prog);
-            break;
-         case GL_FRAGMENT_SHADER:
-            _mesa_reference_fragprog(ctx, &prog->FragmentProgram,
-                                     (struct gl_fragment_program *)linked_prog);
-            ok = ctx->Driver.ProgramStringNotify(ctx, GL_FRAGMENT_PROGRAM_ARB,
-                                                 linked_prog);
-            break;
-         case GL_GEOMETRY_SHADER:
-            _mesa_reference_geomprog(ctx, &prog->GeometryProgram,
-                                     (struct gl_geometry_program *)linked_prog);
-            ok = ctx->Driver.ProgramStringNotify(ctx, GL_GEOMETRY_PROGRAM_NV,
-                                                 linked_prog);
-            break;
-         }
-         if (!ok) {
-            return GL_FALSE;
-         }
-      }
-
-      _mesa_reference_program(ctx, &linked_prog, NULL);
-   }
-
-   return GL_TRUE;
-}
-
-
-/**
- * Compile a GLSL shader.  Called via glCompileShader().
- */
-void
-_mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader)
-{
-   struct _mesa_glsl_parse_state *state =
-      new(shader) _mesa_glsl_parse_state(ctx, shader->Type, shader);
-
-   const char *source = shader->Source;
-   /* Check if the user called glCompileShader without first calling
-    * glShaderSource.  This should fail to compile, but not raise a GL_ERROR.
-    */
-   if (source == NULL) {
-      shader->CompileStatus = GL_FALSE;
-      return;
-   }
-
-   state->error = preprocess(state, &source, &state->info_log,
-			     &ctx->Extensions, ctx->API);
-
-   if (ctx->Shader.Flags & GLSL_DUMP) {
-      printf("GLSL source for shader %d:\n", shader->Name);
-      printf("%s\n", shader->Source);
-   }
-
-   if (!state->error) {
-     _mesa_glsl_lexer_ctor(state, source);
-     _mesa_glsl_parse(state);
-     _mesa_glsl_lexer_dtor(state);
-   }
-
-   ralloc_free(shader->ir);
-   shader->ir = new(shader) exec_list;
-   if (!state->error && !state->translation_unit.is_empty())
-      _mesa_ast_to_hir(shader->ir, state);
-
-   if (!state->error && !shader->ir->is_empty()) {
-      validate_ir_tree(shader->ir);
-
-      /* Do some optimization at compile time to reduce shader IR size
-       * and reduce later work if the same shader is linked multiple times
-       */
-      while (do_common_optimization(shader->ir, false, 32))
-	 ;
-
-      validate_ir_tree(shader->ir);
-   }
-
-   shader->symbols = state->symbols;
-
-   shader->CompileStatus = !state->error;
-   shader->InfoLog = state->info_log;
-   shader->Version = state->language_version;
-   memcpy(shader->builtins_to_link, state->builtins_to_link,
-	  sizeof(shader->builtins_to_link[0]) * state->num_builtins_to_link);
-   shader->num_builtins_to_link = state->num_builtins_to_link;
-
-   if (ctx->Shader.Flags & GLSL_LOG) {
-      _mesa_write_shader_to_file(shader);
-   }
-
-   if (ctx->Shader.Flags & GLSL_DUMP) {
-      if (shader->CompileStatus) {
-	 printf("GLSL IR for shader %d:\n", shader->Name);
-	 _mesa_print_ir(shader->ir, NULL);
-	 printf("\n\n");
-      } else {
-	 printf("GLSL shader %d failed to compile.\n", shader->Name);
-      }
-      if (shader->InfoLog && shader->InfoLog[0] != 0) {
-	 printf("GLSL shader %d info log:\n", shader->Name);
-	 printf("%s\n", shader->InfoLog);
-      }
-   }
-
-   /* Retain any live IR, but trash the rest. */
-   reparent_ir(shader->ir, shader->ir);
-
-   ralloc_free(state);
-}
-
-
-/**
- * Link a GLSL shader program.  Called via glLinkProgram().
- */
-void
-_mesa_glsl_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
-{
-   unsigned int i;
-
-   _mesa_clear_shader_program_data(ctx, prog);
-
-   prog->LinkStatus = GL_TRUE;
-
-   for (i = 0; i < prog->NumShaders; i++) {
-      if (!prog->Shaders[i]->CompileStatus) {
-	 fail_link(prog, "linking with uncompiled shader");
-	 prog->LinkStatus = GL_FALSE;
-      }
-   }
-
-   prog->Varying = _mesa_new_parameter_list();
-   _mesa_reference_vertprog(ctx, &prog->VertexProgram, NULL);
-   _mesa_reference_fragprog(ctx, &prog->FragmentProgram, NULL);
-   _mesa_reference_geomprog(ctx, &prog->GeometryProgram, NULL);
-
-   if (prog->LinkStatus) {
-      link_shaders(ctx, prog);
-   }
-
-   if (prog->LinkStatus) {
-      if (!ctx->Driver.LinkShader(ctx, prog)) {
-	 prog->LinkStatus = GL_FALSE;
-      }
-   }
-
-   set_uniform_initializers(ctx, prog);
-
-   if (ctx->Shader.Flags & GLSL_DUMP) {
-      if (!prog->LinkStatus) {
-	 printf("GLSL shader program %d failed to link\n", prog->Name);
-      }
-
-      if (prog->InfoLog && prog->InfoLog[0] != 0) {
-	 printf("GLSL shader program %d info log:\n", prog->Name);
-	 printf("%s\n", prog->InfoLog);
-      }
-   }
-}
-
-} /* extern "C" */
+/*
+ * Copyright (C) 2005-2007  Brian Paul   All Rights Reserved.
+ * Copyright (C) 2008  VMware, Inc.   All Rights Reserved.
+ * Copyright © 2010 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
+
+/**
+ * \file ir_to_mesa.cpp
+ *
+ * Translate GLSL IR to Mesa's gl_program representation.
+ */
+
+#include <stdio.h>
+#include "main/compiler.h"
+#include "ir.h"
+#include "ir_visitor.h"
+#include "ir_print_visitor.h"
+#include "ir_expression_flattening.h"
+#include "glsl_types.h"
+#include "glsl_parser_extras.h"
+#include "../glsl/program.h"
+#include "ir_optimization.h"
+#include "ast.h"
+
+extern "C" {
+#include "main/mtypes.h"
+#include "main/shaderapi.h"
+#include "main/shaderobj.h"
+#include "main/uniforms.h"
+#include "program/hash_table.h"
+#include "program/prog_instruction.h"
+#include "program/prog_optimize.h"
+#include "program/prog_print.h"
+#include "program/program.h"
+#include "program/prog_uniform.h"
+#include "program/prog_parameter.h"
+#include "program/sampler.h"
+}
+
+static int swizzle_for_size(int size);
+
+/**
+ * This struct is a corresponding struct to Mesa prog_src_register, with
+ * wider fields.
+ */
+typedef struct ir_to_mesa_src_reg {
+   ir_to_mesa_src_reg(int file, int index, const glsl_type *type)
+   {
+      this->file = (gl_register_file) file;
+      this->index = index;
+      if (type && (type->is_scalar() || type->is_vector() || type->is_matrix()))
+	 this->swizzle = swizzle_for_size(type->vector_elements);
+      else
+	 this->swizzle = SWIZZLE_XYZW;
+      this->negate = 0;
+      this->reladdr = NULL;
+   }
+
+   ir_to_mesa_src_reg()
+   {
+      this->file = PROGRAM_UNDEFINED;
+      this->index = 0;
+      this->swizzle = 0;
+      this->negate = 0;
+      this->reladdr = NULL;
+   }
+
+   gl_register_file file; /**< PROGRAM_* from Mesa */
+   int index; /**< temporary index, VERT_ATTRIB_*, FRAG_ATTRIB_*, etc. */
+   GLuint swizzle; /**< SWIZZLE_XYZWONEZERO swizzles from Mesa. */
+   int negate; /**< NEGATE_XYZW mask from mesa */
+   /** Register index should be offset by the integer in this reg. */
+   ir_to_mesa_src_reg *reladdr;
+} ir_to_mesa_src_reg;
+
+typedef struct ir_to_mesa_dst_reg {
+   int file; /**< PROGRAM_* from Mesa */
+   int index; /**< temporary index, VERT_ATTRIB_*, FRAG_ATTRIB_*, etc. */
+   int writemask; /**< Bitfield of WRITEMASK_[XYZW] */
+   GLuint cond_mask:4;
+   /** Register index should be offset by the integer in this reg. */
+   ir_to_mesa_src_reg *reladdr;
+} ir_to_mesa_dst_reg;
+
+extern ir_to_mesa_src_reg ir_to_mesa_undef;
+
+class ir_to_mesa_instruction : public exec_node {
+public:
+   /* Callers of this ralloc-based new need not call delete. It's
+    * easier to just ralloc_free 'ctx' (or any of its ancestors). */
+   static void* operator new(size_t size, void *ctx)
+   {
+      void *node;
+
+      node = rzalloc_size(ctx, size);
+      assert(node != NULL);
+
+      return node;
+   }
+
+   enum prog_opcode op;
+   ir_to_mesa_dst_reg dst_reg;
+   ir_to_mesa_src_reg src_reg[3];
+   /** Pointer to the ir source this tree came from for debugging */
+   ir_instruction *ir;
+   GLboolean cond_update;
+   bool saturate;
+   int sampler; /**< sampler index */
+   int tex_target; /**< One of TEXTURE_*_INDEX */
+   GLboolean tex_shadow;
+
+   class function_entry *function; /* Set on OPCODE_CAL or OPCODE_BGNSUB */
+};
+
+class variable_storage : public exec_node {
+public:
+   variable_storage(ir_variable *var, gl_register_file file, int index)
+      : file(file), index(index), var(var)
+   {
+      /* empty */
+   }
+
+   gl_register_file file;
+   int index;
+   ir_variable *var; /* variable that maps to this, if any */
+};
+
+class function_entry : public exec_node {
+public:
+   ir_function_signature *sig;
+
+   /**
+    * identifier of this function signature used by the program.
+    *
+    * At the point that Mesa instructions for function calls are
+    * generated, we don't know the address of the first instruction of
+    * the function body.  So we make the BranchTarget that is called a
+    * small integer and rewrite them during set_branchtargets().
+    */
+   int sig_id;
+
+   /**
+    * Pointer to first instruction of the function body.
+    *
+    * Set during function body emits after main() is processed.
+    */
+   ir_to_mesa_instruction *bgn_inst;
+
+   /**
+    * Index of the first instruction of the function body in actual
+    * Mesa IR.
+    *
+    * Set after convertion from ir_to_mesa_instruction to prog_instruction.
+    */
+   int inst;
+
+   /** Storage for the return value. */
+   ir_to_mesa_src_reg return_reg;
+};
+
+class ir_to_mesa_visitor : public ir_visitor {
+public:
+   ir_to_mesa_visitor();
+   ~ir_to_mesa_visitor();
+
+   function_entry *current_function;
+
+   struct gl_context *ctx;
+   struct gl_program *prog;
+   struct gl_shader_program *shader_program;
+   struct gl_shader_compiler_options *options;
+
+   int next_temp;
+
+   variable_storage *find_variable_storage(ir_variable *var);
+
+   function_entry *get_function_signature(ir_function_signature *sig);
+
+   ir_to_mesa_src_reg get_temp(const glsl_type *type);
+   void reladdr_to_temp(ir_instruction *ir,
+			ir_to_mesa_src_reg *reg, int *num_reladdr);
+
+   struct ir_to_mesa_src_reg src_reg_for_float(float val);
+
+   /**
+    * \name Visit methods
+    *
+    * As typical for the visitor pattern, there must be one \c visit method for
+    * each concrete subclass of \c ir_instruction.  Virtual base classes within
+    * the hierarchy should not have \c visit methods.
+    */
+   /*@{*/
+   virtual void visit(ir_variable *);
+   virtual void visit(ir_loop *);
+   virtual void visit(ir_loop_jump *);
+   virtual void visit(ir_function_signature *);
+   virtual void visit(ir_function *);
+   virtual void visit(ir_expression *);
+   virtual void visit(ir_swizzle *);
+   virtual void visit(ir_dereference_variable  *);
+   virtual void visit(ir_dereference_array *);
+   virtual void visit(ir_dereference_record *);
+   virtual void visit(ir_assignment *);
+   virtual void visit(ir_constant *);
+   virtual void visit(ir_call *);
+   virtual void visit(ir_return *);
+   virtual void visit(ir_discard *);
+   virtual void visit(ir_texture *);
+   virtual void visit(ir_if *);
+   /*@}*/
+
+   struct ir_to_mesa_src_reg result;
+
+   /** List of variable_storage */
+   exec_list variables;
+
+   /** List of function_entry */
+   exec_list function_signatures;
+   int next_signature_id;
+
+   /** List of ir_to_mesa_instruction */
+   exec_list instructions;
+
+   ir_to_mesa_instruction *ir_to_mesa_emit_op0(ir_instruction *ir,
+					       enum prog_opcode op);
+
+   ir_to_mesa_instruction *ir_to_mesa_emit_op1(ir_instruction *ir,
+					       enum prog_opcode op,
+					       ir_to_mesa_dst_reg dst,
+					       ir_to_mesa_src_reg src0);
+
+   ir_to_mesa_instruction *ir_to_mesa_emit_op2(ir_instruction *ir,
+					       enum prog_opcode op,
+					       ir_to_mesa_dst_reg dst,
+					       ir_to_mesa_src_reg src0,
+					       ir_to_mesa_src_reg src1);
+
+   ir_to_mesa_instruction *ir_to_mesa_emit_op3(ir_instruction *ir,
+					       enum prog_opcode op,
+					       ir_to_mesa_dst_reg dst,
+					       ir_to_mesa_src_reg src0,
+					       ir_to_mesa_src_reg src1,
+					       ir_to_mesa_src_reg src2);
+
+   /**
+    * Emit the correct dot-product instruction for the type of arguments
+    *
+    * \sa ir_to_mesa_emit_op2
+    */
+   void ir_to_mesa_emit_dp(ir_instruction *ir,
+			   ir_to_mesa_dst_reg dst,
+			   ir_to_mesa_src_reg src0,
+			   ir_to_mesa_src_reg src1,
+			   unsigned elements);
+
+   void ir_to_mesa_emit_scalar_op1(ir_instruction *ir,
+				   enum prog_opcode op,
+				   ir_to_mesa_dst_reg dst,
+				   ir_to_mesa_src_reg src0);
+
+   void ir_to_mesa_emit_scalar_op2(ir_instruction *ir,
+				   enum prog_opcode op,
+				   ir_to_mesa_dst_reg dst,
+				   ir_to_mesa_src_reg src0,
+				   ir_to_mesa_src_reg src1);
+
+   void emit_scs(ir_instruction *ir, enum prog_opcode op,
+		 ir_to_mesa_dst_reg dst,
+		 const ir_to_mesa_src_reg &src);
+
+   GLboolean try_emit_mad(ir_expression *ir,
+			  int mul_operand);
+   GLboolean try_emit_sat(ir_expression *ir);
+
+   void emit_swz(ir_expression *ir);
+
+   bool process_move_condition(ir_rvalue *ir);
+
+   void copy_propagate(void);
+
+   void *mem_ctx;
+};
+
+ir_to_mesa_src_reg ir_to_mesa_undef = ir_to_mesa_src_reg(PROGRAM_UNDEFINED, 0, NULL);
+
+ir_to_mesa_dst_reg ir_to_mesa_undef_dst = {
+   PROGRAM_UNDEFINED, 0, SWIZZLE_NOOP, COND_TR, NULL,
+};
+
+ir_to_mesa_dst_reg ir_to_mesa_address_reg = {
+   PROGRAM_ADDRESS, 0, WRITEMASK_X, COND_TR, NULL
+};
+
+static void
+fail_link(struct gl_shader_program *prog, const char *fmt, ...) PRINTFLIKE(2, 3);
+
+static void
+fail_link(struct gl_shader_program *prog, const char *fmt, ...)
+{
+   va_list args;
+   va_start(args, fmt);
+   ralloc_vasprintf_append(&prog->InfoLog, fmt, args);
+   va_end(args);
+
+   prog->LinkStatus = GL_FALSE;
+}
+
+static int
+swizzle_for_size(int size)
+{
+   int size_swizzles[4] = {
+      MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_X, SWIZZLE_X, SWIZZLE_X),
+      MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Y, SWIZZLE_Y),
+      MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_Z),
+      MAKE_SWIZZLE4(SWIZZLE_X, SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_W),
+   };
+
+   assert((size >= 1) && (size <= 4));
+   return size_swizzles[size - 1];
+}
+
+ir_to_mesa_instruction *
+ir_to_mesa_visitor::ir_to_mesa_emit_op3(ir_instruction *ir,
+					enum prog_opcode op,
+					ir_to_mesa_dst_reg dst,
+					ir_to_mesa_src_reg src0,
+					ir_to_mesa_src_reg src1,
+					ir_to_mesa_src_reg src2)
+{
+   ir_to_mesa_instruction *inst = new(mem_ctx) ir_to_mesa_instruction();
+   int num_reladdr = 0;
+
+   /* If we have to do relative addressing, we want to load the ARL
+    * reg directly for one of the regs, and preload the other reladdr
+    * sources into temps.
+    */
+   num_reladdr += dst.reladdr != NULL;
+   num_reladdr += src0.reladdr != NULL;
+   num_reladdr += src1.reladdr != NULL;
+   num_reladdr += src2.reladdr != NULL;
+
+   reladdr_to_temp(ir, &src2, &num_reladdr);
+   reladdr_to_temp(ir, &src1, &num_reladdr);
+   reladdr_to_temp(ir, &src0, &num_reladdr);
+
+   if (dst.reladdr) {
+      ir_to_mesa_emit_op1(ir, OPCODE_ARL, ir_to_mesa_address_reg,
+                          *dst.reladdr);
+
+      num_reladdr--;
+   }
+   assert(num_reladdr == 0);
+
+   inst->op = op;
+   inst->dst_reg = dst;
+   inst->src_reg[0] = src0;
+   inst->src_reg[1] = src1;
+   inst->src_reg[2] = src2;
+   inst->ir = ir;
+
+   inst->function = NULL;
+
+   this->instructions.push_tail(inst);
+
+   return inst;
+}
+
+
+ir_to_mesa_instruction *
+ir_to_mesa_visitor::ir_to_mesa_emit_op2(ir_instruction *ir,
+					enum prog_opcode op,
+					ir_to_mesa_dst_reg dst,
+					ir_to_mesa_src_reg src0,
+					ir_to_mesa_src_reg src1)
+{
+   return ir_to_mesa_emit_op3(ir, op, dst, src0, src1, ir_to_mesa_undef);
+}
+
+ir_to_mesa_instruction *
+ir_to_mesa_visitor::ir_to_mesa_emit_op1(ir_instruction *ir,
+					enum prog_opcode op,
+					ir_to_mesa_dst_reg dst,
+					ir_to_mesa_src_reg src0)
+{
+   assert(dst.writemask != 0);
+   return ir_to_mesa_emit_op3(ir, op, dst,
+			      src0, ir_to_mesa_undef, ir_to_mesa_undef);
+}
+
+ir_to_mesa_instruction *
+ir_to_mesa_visitor::ir_to_mesa_emit_op0(ir_instruction *ir,
+					enum prog_opcode op)
+{
+   return ir_to_mesa_emit_op3(ir, op, ir_to_mesa_undef_dst,
+			      ir_to_mesa_undef,
+			      ir_to_mesa_undef,
+			      ir_to_mesa_undef);
+}
+
+void
+ir_to_mesa_visitor::ir_to_mesa_emit_dp(ir_instruction *ir,
+				       ir_to_mesa_dst_reg dst,
+				       ir_to_mesa_src_reg src0,
+				       ir_to_mesa_src_reg src1,
+				       unsigned elements)
+{
+   static const gl_inst_opcode dot_opcodes[] = {
+      OPCODE_DP2, OPCODE_DP3, OPCODE_DP4
+   };
+
+   ir_to_mesa_emit_op3(ir, dot_opcodes[elements - 2],
+		       dst, src0, src1, ir_to_mesa_undef);
+}
+
+inline ir_to_mesa_dst_reg
+ir_to_mesa_dst_reg_from_src(ir_to_mesa_src_reg reg)
+{
+   ir_to_mesa_dst_reg dst_reg;
+
+   dst_reg.file = reg.file;
+   dst_reg.index = reg.index;
+   dst_reg.writemask = WRITEMASK_XYZW;
+   dst_reg.cond_mask = COND_TR;
+   dst_reg.reladdr = reg.reladdr;
+
+   return dst_reg;
+}
+
+inline ir_to_mesa_src_reg
+ir_to_mesa_src_reg_from_dst(ir_to_mesa_dst_reg reg)
+{
+   return ir_to_mesa_src_reg(reg.file, reg.index, NULL);
+}
+
+/**
+ * Emits Mesa scalar opcodes to produce unique answers across channels.
+ *
+ * Some Mesa opcodes are scalar-only, like ARB_fp/vp.  The src X
+ * channel determines the result across all channels.  So to do a vec4
+ * of this operation, we want to emit a scalar per source channel used
+ * to produce dest channels.
+ */
+void
+ir_to_mesa_visitor::ir_to_mesa_emit_scalar_op2(ir_instruction *ir,
+					       enum prog_opcode op,
+					       ir_to_mesa_dst_reg dst,
+					       ir_to_mesa_src_reg orig_src0,
+					       ir_to_mesa_src_reg orig_src1)
+{
+   int i, j;
+   int done_mask = ~dst.writemask;
+
+   /* Mesa RCP is a scalar operation splatting results to all channels,
+    * like ARB_fp/vp.  So emit as many RCPs as necessary to cover our
+    * dst channels.
+    */
+   for (i = 0; i < 4; i++) {
+      GLuint this_mask = (1 << i);
+      ir_to_mesa_instruction *inst;
+      ir_to_mesa_src_reg src0 = orig_src0;
+      ir_to_mesa_src_reg src1 = orig_src1;
+
+      if (done_mask & this_mask)
+	 continue;
+
+      GLuint src0_swiz = GET_SWZ(src0.swizzle, i);
+      GLuint src1_swiz = GET_SWZ(src1.swizzle, i);
+      for (j = i + 1; j < 4; j++) {
+	 /* If there is another enabled component in the destination that is
+	  * derived from the same inputs, generate its value on this pass as
+	  * well.
+	  */
+	 if (!(done_mask & (1 << j)) &&
+	     GET_SWZ(src0.swizzle, j) == src0_swiz &&
+	     GET_SWZ(src1.swizzle, j) == src1_swiz) {
+	    this_mask |= (1 << j);
+	 }
+      }
+      src0.swizzle = MAKE_SWIZZLE4(src0_swiz, src0_swiz,
+				   src0_swiz, src0_swiz);
+      src1.swizzle = MAKE_SWIZZLE4(src1_swiz, src1_swiz,
+				  src1_swiz, src1_swiz);
+
+      inst = ir_to_mesa_emit_op2(ir, op,
+				 dst,
+				 src0,
+				 src1);
+      inst->dst_reg.writemask = this_mask;
+      done_mask |= this_mask;
+   }
+}
+
+void
+ir_to_mesa_visitor::ir_to_mesa_emit_scalar_op1(ir_instruction *ir,
+					       enum prog_opcode op,
+					       ir_to_mesa_dst_reg dst,
+					       ir_to_mesa_src_reg src0)
+{
+   ir_to_mesa_src_reg undef = ir_to_mesa_undef;
+
+   undef.swizzle = SWIZZLE_XXXX;
+
+   ir_to_mesa_emit_scalar_op2(ir, op, dst, src0, undef);
+}
+
+/**
+ * Emit an OPCODE_SCS instruction
+ *
+ * The \c SCS opcode functions a bit differently than the other Mesa (or
+ * ARB_fragment_program) opcodes.  Instead of splatting its result across all
+ * four components of the destination, it writes one value to the \c x
+ * component and another value to the \c y component.
+ *
+ * \param ir        IR instruction being processed
+ * \param op        Either \c OPCODE_SIN or \c OPCODE_COS depending on which
+ *                  value is desired.
+ * \param dst       Destination register
+ * \param src       Source register
+ */
+void
+ir_to_mesa_visitor::emit_scs(ir_instruction *ir, enum prog_opcode op,
+			     ir_to_mesa_dst_reg dst,
+			     const ir_to_mesa_src_reg &src)
+{
+   /* Vertex programs cannot use the SCS opcode.
+    */
+   if (this->prog->Target == GL_VERTEX_PROGRAM_ARB) {
+      ir_to_mesa_emit_scalar_op1(ir, op, dst, src);
+      return;
+   }
+
+   const unsigned component = (op == OPCODE_SIN) ? 0 : 1;
+   const unsigned scs_mask = (1U << component);
+   int done_mask = ~dst.writemask;
+   ir_to_mesa_src_reg tmp;
+
+   assert(op == OPCODE_SIN || op == OPCODE_COS);
+
+   /* If there are compnents in the destination that differ from the component
+    * that will be written by the SCS instrution, we'll need a temporary.
+    */
+   if (scs_mask != unsigned(dst.writemask)) {
+      tmp = get_temp(glsl_type::vec4_type);
+   }
+
+   for (unsigned i = 0; i < 4; i++) {
+      unsigned this_mask = (1U << i);
+      ir_to_mesa_src_reg src0 = src;
+
+      if ((done_mask & this_mask) != 0)
+	 continue;
+
+      /* The source swizzle specified which component of the source generates
+       * sine / cosine for the current component in the destination.  The SCS
+       * instruction requires that this value be swizzle to the X component.
+       * Replace the current swizzle with a swizzle that puts the source in
+       * the X component.
+       */
+      unsigned src0_swiz = GET_SWZ(src.swizzle, i);
+
+      src0.swizzle = MAKE_SWIZZLE4(src0_swiz, src0_swiz,
+				   src0_swiz, src0_swiz);
+      for (unsigned j = i + 1; j < 4; j++) {
+	 /* If there is another enabled component in the destination that is
+	  * derived from the same inputs, generate its value on this pass as
+	  * well.
+	  */
+	 if (!(done_mask & (1 << j)) &&
+	     GET_SWZ(src0.swizzle, j) == src0_swiz) {
+	    this_mask |= (1 << j);
+	 }
+      }
+
+      if (this_mask != scs_mask) {
+	 ir_to_mesa_instruction *inst;
+	 ir_to_mesa_dst_reg tmp_dst = ir_to_mesa_dst_reg_from_src(tmp);
+
+	 /* Emit the SCS instruction.
+	  */
+	 inst = ir_to_mesa_emit_op1(ir, OPCODE_SCS, tmp_dst, src0);
+	 inst->dst_reg.writemask = scs_mask;
+
+	 /* Move the result of the SCS instruction to the desired location in
+	  * the destination.
+	  */
+	 tmp.swizzle = MAKE_SWIZZLE4(component, component,
+				     component, component);
+	 inst = ir_to_mesa_emit_op1(ir, OPCODE_SCS, dst, tmp);
+	 inst->dst_reg.writemask = this_mask;
+      } else {
+	 /* Emit the SCS instruction to write directly to the destination.
+	  */
+	 ir_to_mesa_instruction *inst =
+	    ir_to_mesa_emit_op1(ir, OPCODE_SCS, dst, src0);
+	 inst->dst_reg.writemask = scs_mask;
+      }
+
+      done_mask |= this_mask;
+   }
+}
+
+struct ir_to_mesa_src_reg
+ir_to_mesa_visitor::src_reg_for_float(float val)
+{
+   ir_to_mesa_src_reg src_reg(PROGRAM_CONSTANT, -1, NULL);
+
+   src_reg.index = _mesa_add_unnamed_constant(this->prog->Parameters,
+					      &val, 1, &src_reg.swizzle);
+
+   return src_reg;
+}
+
+static int
+type_size(const struct glsl_type *type)
+{
+   unsigned int i;
+   int size;
+
+   switch (type->base_type) {
+   case GLSL_TYPE_UINT:
+   case GLSL_TYPE_INT:
+   case GLSL_TYPE_FLOAT:
+   case GLSL_TYPE_BOOL:
+      if (type->is_matrix()) {
+	 return type->matrix_columns;
+      } else {
+	 /* Regardless of size of vector, it gets a vec4. This is bad
+	  * packing for things like floats, but otherwise arrays become a
+	  * mess.  Hopefully a later pass over the code can pack scalars
+	  * down if appropriate.
+	  */
+	 return 1;
+      }
+   case GLSL_TYPE_ARRAY:
+      assert(type->length > 0);
+      return type_size(type->fields.array) * type->length;
+   case GLSL_TYPE_STRUCT:
+      size = 0;
+      for (i = 0; i < type->length; i++) {
+	 size += type_size(type->fields.structure[i].type);
+      }
+      return size;
+   case GLSL_TYPE_SAMPLER:
+      /* Samplers take up one slot in UNIFORMS[], but they're baked in
+       * at link time.
+       */
+      return 1;
+   default:
+      assert(0);
+      return 0;
+   }
+}
+
+/**
+ * In the initial pass of codegen, we assign temporary numbers to
+ * intermediate results.  (not SSA -- variable assignments will reuse
+ * storage).  Actual register allocation for the Mesa VM occurs in a
+ * pass over the Mesa IR later.
+ */
+ir_to_mesa_src_reg
+ir_to_mesa_visitor::get_temp(const glsl_type *type)
+{
+   ir_to_mesa_src_reg src_reg;
+   int swizzle[4];
+   int i;
+
+   src_reg.file = PROGRAM_TEMPORARY;
+   src_reg.index = next_temp;
+   src_reg.reladdr = NULL;
+   next_temp += type_size(type);
+
+   if (type->is_array() || type->is_record()) {
+      src_reg.swizzle = SWIZZLE_NOOP;
+   } else {
+      for (i = 0; i < type->vector_elements; i++)
+	 swizzle[i] = i;
+      for (; i < 4; i++)
+	 swizzle[i] = type->vector_elements - 1;
+      src_reg.swizzle = MAKE_SWIZZLE4(swizzle[0], swizzle[1],
+				      swizzle[2], swizzle[3]);
+   }
+   src_reg.negate = 0;
+
+   return src_reg;
+}
+
+variable_storage *
+ir_to_mesa_visitor::find_variable_storage(ir_variable *var)
+{
+   
+   variable_storage *entry;
+
+   foreach_iter(exec_list_iterator, iter, this->variables) {
+      entry = (variable_storage *)iter.get();
+
+      if (entry->var == var)
+	 return entry;
+   }
+
+   return NULL;
+}
+
+void
+ir_to_mesa_visitor::visit(ir_variable *ir)
+{
+   if (strcmp(ir->name, "gl_FragCoord") == 0) {
+      struct gl_fragment_program *fp = (struct gl_fragment_program *)this->prog;
+
+      fp->OriginUpperLeft = ir->origin_upper_left;
+      fp->PixelCenterInteger = ir->pixel_center_integer;
+
+   } else if (strcmp(ir->name, "gl_FragDepth") == 0) {
+      struct gl_fragment_program *fp = (struct gl_fragment_program *)this->prog;
+      switch (ir->depth_layout) {
+      case ir_depth_layout_none:
+	 fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_NONE;
+	 break;
+      case ir_depth_layout_any:
+	 fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_ANY;
+	 break;
+      case ir_depth_layout_greater:
+	 fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_GREATER;
+	 break;
+      case ir_depth_layout_less:
+	 fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_LESS;
+	 break;
+      case ir_depth_layout_unchanged:
+	 fp->FragDepthLayout = FRAG_DEPTH_LAYOUT_UNCHANGED;
+	 break;
+      default:
+	 assert(0);
+	 break;
+      }
+   }
+
+   if (ir->mode == ir_var_uniform && strncmp(ir->name, "gl_", 3) == 0) {
+      unsigned int i;
+      const ir_state_slot *const slots = ir->state_slots;
+      assert(ir->state_slots != NULL);
+
+      /* Check if this statevar's setup in the STATE file exactly
+       * matches how we'll want to reference it as a
+       * struct/array/whatever.  If not, then we need to move it into
+       * temporary storage and hope that it'll get copy-propagated
+       * out.
+       */
+      for (i = 0; i < ir->num_state_slots; i++) {
+	 if (slots[i].swizzle != SWIZZLE_XYZW) {
+	    break;
+	 }
+      }
+
+      struct variable_storage *storage;
+      ir_to_mesa_dst_reg dst;
+      if (i == ir->num_state_slots) {
+	 /* We'll set the index later. */
+	 storage = new(mem_ctx) variable_storage(ir, PROGRAM_STATE_VAR, -1);
+	 this->variables.push_tail(storage);
+
+	 dst = ir_to_mesa_undef_dst;
+      } else {
+	 /* The variable_storage constructor allocates slots based on the size
+	  * of the type.  However, this had better match the number of state
+	  * elements that we're going to copy into the new temporary.
+	  */
+	 assert(ir->num_state_slots == type_size(ir->type));
+
+	 storage = new(mem_ctx) variable_storage(ir, PROGRAM_TEMPORARY,
+						 this->next_temp);
+	 this->variables.push_tail(storage);
+	 this->next_temp += type_size(ir->type);
+
+	 dst = ir_to_mesa_dst_reg_from_src(ir_to_mesa_src_reg(PROGRAM_TEMPORARY,
+							      storage->index,
+							      NULL));
+      }
+
+
+      for (unsigned int i = 0; i < ir->num_state_slots; i++) {
+	 int index = _mesa_add_state_reference(this->prog->Parameters,
+					       (gl_state_index *)slots[i].tokens);
+
+	 if (storage->file == PROGRAM_STATE_VAR) {
+	    if (storage->index == -1) {
+	       storage->index = index;
+	    } else {
+	       assert(index == storage->index + (int)i);
+	    }
+	 } else {
+	    ir_to_mesa_src_reg src(PROGRAM_STATE_VAR, index, NULL);
+	    src.swizzle = slots[i].swizzle;
+	    ir_to_mesa_emit_op1(ir, OPCODE_MOV, dst, src);
+	    /* even a float takes up a whole vec4 reg in a struct/array. */
+	    dst.index++;
+	 }
+      }
+
+      if (storage->file == PROGRAM_TEMPORARY &&
+	  dst.index != storage->index + ir->num_state_slots) {
+	 fail_link(this->shader_program,
+		   "failed to load builtin uniform `%s'  (%d/%d regs loaded)\n",
+		   ir->name, dst.index - storage->index,
+		   type_size(ir->type));
+      }
+   }
+}
+
+void
+ir_to_mesa_visitor::visit(ir_loop *ir)
+{
+   ir_dereference_variable *counter = NULL;
+
+   if (ir->counter != NULL)
+      counter = new(ir) ir_dereference_variable(ir->counter);
+
+   if (ir->from != NULL) {
+      assert(ir->counter != NULL);
+
+      ir_assignment *a = new(ir) ir_assignment(counter, ir->from, NULL);
+
+      a->accept(this);
+      delete a;
+   }
+
+   ir_to_mesa_emit_op0(NULL, OPCODE_BGNLOOP);
+
+   if (ir->to) {
+      ir_expression *e =
+	 new(ir) ir_expression(ir->cmp, glsl_type::bool_type,
+			       counter, ir->to);
+      ir_if *if_stmt =  new(ir) ir_if(e);
+
+      ir_loop_jump *brk = new(ir) ir_loop_jump(ir_loop_jump::jump_break);
+
+      if_stmt->then_instructions.push_tail(brk);
+
+      if_stmt->accept(this);
+
+      delete if_stmt;
+      delete e;
+      delete brk;
+   }
+
+   visit_exec_list(&ir->body_instructions, this);
+
+   if (ir->increment) {
+      ir_expression *e =
+	 new(ir) ir_expression(ir_binop_add, counter->type,
+			       counter, ir->increment);
+
+      ir_assignment *a = new(ir) ir_assignment(counter, e, NULL);
+
+      a->accept(this);
+      delete a;
+      delete e;
+   }
+
+   ir_to_mesa_emit_op0(NULL, OPCODE_ENDLOOP);
+}
+
+void
+ir_to_mesa_visitor::visit(ir_loop_jump *ir)
+{
+   switch (ir->mode) {
+   case ir_loop_jump::jump_break:
+      ir_to_mesa_emit_op0(NULL, OPCODE_BRK);
+      break;
+   case ir_loop_jump::jump_continue:
+      ir_to_mesa_emit_op0(NULL, OPCODE_CONT);
+      break;
+   }
+}
+
+
+void
+ir_to_mesa_visitor::visit(ir_function_signature *ir)
+{
+   assert(0);
+   (void)ir;
+}
+
+void
+ir_to_mesa_visitor::visit(ir_function *ir)
+{
+   /* Ignore function bodies other than main() -- we shouldn't see calls to
+    * them since they should all be inlined before we get to ir_to_mesa.
+    */
+   if (strcmp(ir->name, "main") == 0) {
+      const ir_function_signature *sig;
+      exec_list empty;
+
+      sig = ir->matching_signature(&empty);
+
+      assert(sig);
+
+      foreach_iter(exec_list_iterator, iter, sig->body) {
+	 ir_instruction *ir = (ir_instruction *)iter.get();
+
+	 ir->accept(this);
+      }
+   }
+}
+
+GLboolean
+ir_to_mesa_visitor::try_emit_mad(ir_expression *ir, int mul_operand)
+{
+   int nonmul_operand = 1 - mul_operand;
+   ir_to_mesa_src_reg a, b, c;
+
+   ir_expression *expr = ir->operands[mul_operand]->as_expression();
+   if (!expr || expr->operation != ir_binop_mul)
+      return false;
+
+   expr->operands[0]->accept(this);
+   a = this->result;
+   expr->operands[1]->accept(this);
+   b = this->result;
+   ir->operands[nonmul_operand]->accept(this);
+   c = this->result;
+
+   this->result = get_temp(ir->type);
+   ir_to_mesa_emit_op3(ir, OPCODE_MAD,
+		       ir_to_mesa_dst_reg_from_src(this->result), a, b, c);
+
+   return true;
+}
+
+GLboolean
+ir_to_mesa_visitor::try_emit_sat(ir_expression *ir)
+{
+   /* Saturates were only introduced to vertex programs in
+    * NV_vertex_program3, so don't give them to drivers in the VP.
+    */
+   if (this->prog->Target == GL_VERTEX_PROGRAM_ARB)
+      return false;
+
+   ir_rvalue *sat_src = ir->as_rvalue_to_saturate();
+   if (!sat_src)
+      return false;
+
+   sat_src->accept(this);
+   ir_to_mesa_src_reg src = this->result;
+
+   this->result = get_temp(ir->type);
+   ir_to_mesa_instruction *inst;
+   inst = ir_to_mesa_emit_op1(ir, OPCODE_MOV,
+			      ir_to_mesa_dst_reg_from_src(this->result),
+			      src);
+   inst->saturate = true;
+
+   return true;
+}
+
+void
+ir_to_mesa_visitor::reladdr_to_temp(ir_instruction *ir,
+				    ir_to_mesa_src_reg *reg, int *num_reladdr)
+{
+   if (!reg->reladdr)
+      return;
+
+   ir_to_mesa_emit_op1(ir, OPCODE_ARL, ir_to_mesa_address_reg, *reg->reladdr);
+
+   if (*num_reladdr != 1) {
+      ir_to_mesa_src_reg temp = get_temp(glsl_type::vec4_type);
+
+      ir_to_mesa_emit_op1(ir, OPCODE_MOV,
+			  ir_to_mesa_dst_reg_from_src(temp), *reg);
+      *reg = temp;
+   }
+
+   (*num_reladdr)--;
+}
+
+void
+ir_to_mesa_visitor::emit_swz(ir_expression *ir)
+{
+   /* Assume that the vector operator is in a form compatible with OPCODE_SWZ.
+    * This means that each of the operands is either an immediate value of -1,
+    * 0, or 1, or is a component from one source register (possibly with
+    * negation).
+    */
+   uint8_t components[4] = { 0 };
+   bool negate[4] = { false };
+   ir_variable *var = NULL;
+
+   for (unsigned i = 0; i < ir->type->vector_elements; i++) {
+      ir_rvalue *op = ir->operands[i];
+
+      assert(op->type->is_scalar());
+
+      while (op != NULL) {
+	 switch (op->ir_type) {
+	 case ir_type_constant: {
+
+	    assert(op->type->is_scalar());
+
+	    const ir_constant *const c = op->as_constant();
+	    if (c->is_one()) {
+	       components[i] = SWIZZLE_ONE;
+	    } else if (c->is_zero()) {
+	       components[i] = SWIZZLE_ZERO;
+	    } else if (c->is_negative_one()) {
+	       components[i] = SWIZZLE_ONE;
+	       negate[i] = true;
+	    } else {
+	       assert(!"SWZ constant must be 0.0 or 1.0.");
+	    }
+
+	    op = NULL;
+	    break;
+	 }
+
+	 case ir_type_dereference_variable: {
+	    ir_dereference_variable *const deref =
+	       (ir_dereference_variable *) op;
+
+	    assert((var == NULL) || (deref->var == var));
+	    components[i] = SWIZZLE_X;
+	    var = deref->var;
+	    op = NULL;
+	    break;
+	 }
+
+	 case ir_type_expression: {
+	    ir_expression *const expr = (ir_expression *) op;
+
+	    assert(expr->operation == ir_unop_neg);
+	    negate[i] = true;
+
+	    op = expr->operands[0];
+	    break;
+	 }
+
+	 case ir_type_swizzle: {
+	    ir_swizzle *const swiz = (ir_swizzle *) op;
+
+	    components[i] = swiz->mask.x;
+	    op = swiz->val;
+	    break;
+	 }
+
+	 default:
+	    assert(!"Should not get here.");
+	    return;
+	 }
+      }
+   }
+
+   assert(var != NULL);
+
+   ir_dereference_variable *const deref =
+      new(mem_ctx) ir_dereference_variable(var);
+
+   this->result.file = PROGRAM_UNDEFINED;
+   deref->accept(this);
+   if (this->result.file == PROGRAM_UNDEFINED) {
+      ir_print_visitor v;
+      printf("Failed to get tree for expression operand:\n");
+      deref->accept(&v);
+      exit(1);
+   }
+
+   ir_to_mesa_src_reg src;
+
+   src = this->result;
+   src.swizzle = MAKE_SWIZZLE4(components[0],
+			       components[1],
+			       components[2],
+			       components[3]);
+   src.negate = ((unsigned(negate[0]) << 0)
+		 | (unsigned(negate[1]) << 1)
+		 | (unsigned(negate[2]) << 2)
+		 | (unsigned(negate[3]) << 3));
+
+   /* Storage for our result.  Ideally for an assignment we'd be using the
+    * actual storage for the result here, instead.
+    */
+   const ir_to_mesa_src_reg result_src = get_temp(ir->type);
+   ir_to_mesa_dst_reg result_dst = ir_to_mesa_dst_reg_from_src(result_src);
+
+   /* Limit writes to the channels that will be used by result_src later.
+    * This does limit this temp's use as a temporary for multi-instruction
+    * sequences.
+    */
+   result_dst.writemask = (1 << ir->type->vector_elements) - 1;
+
+   ir_to_mesa_emit_op1(ir, OPCODE_SWZ, result_dst, src);
+   this->result = result_src;
+}
+
+void
+ir_to_mesa_visitor::visit(ir_expression *ir)
+{
+   unsigned int operand;
+   struct ir_to_mesa_src_reg op[Elements(ir->operands)];
+   struct ir_to_mesa_src_reg result_src;
+   struct ir_to_mesa_dst_reg result_dst;
+
+   /* Quick peephole: Emit OPCODE_MAD(a, b, c) instead of ADD(MUL(a, b), c)
+    */
+   if (ir->operation == ir_binop_add) {
+      if (try_emit_mad(ir, 1))
+	 return;
+      if (try_emit_mad(ir, 0))
+	 return;
+   }
+   if (try_emit_sat(ir))
+      return;
+
+   if (ir->operation == ir_quadop_vector) {
+      this->emit_swz(ir);
+      return;
+   }
+
+   for (operand = 0; operand < ir->get_num_operands(); operand++) {
+      this->result.file = PROGRAM_UNDEFINED;
+      ir->operands[operand]->accept(this);
+      if (this->result.file == PROGRAM_UNDEFINED) {
+	 ir_print_visitor v;
+	 printf("Failed to get tree for expression operand:\n");
+	 ir->operands[operand]->accept(&v);
+	 exit(1);
+      }
+      op[operand] = this->result;
+
+      /* Matrix expression operands should have been broken down to vector
+       * operations already.
+       */
+      assert(!ir->operands[operand]->type->is_matrix());
+   }
+
+   int vector_elements = ir->operands[0]->type->vector_elements;
+   if (ir->operands[1]) {
+      vector_elements = MAX2(vector_elements,
+			     ir->operands[1]->type->vector_elements);
+   }
+
+   this->result.file = PROGRAM_UNDEFINED;
+
+   /* Storage for our result.  Ideally for an assignment we'd be using
+    * the actual storage for the result here, instead.
+    */
+   result_src = get_temp(ir->type);
+   /* convenience for the emit functions below. */
+   result_dst = ir_to_mesa_dst_reg_from_src(result_src);
+   /* Limit writes to the channels that will be used by result_src later.
+    * This does limit this temp's use as a temporary for multi-instruction
+    * sequences.
+    */
+   result_dst.writemask = (1 << ir->type->vector_elements) - 1;
+
+   switch (ir->operation) {
+   case ir_unop_logic_not:
+      ir_to_mesa_emit_op2(ir, OPCODE_SEQ, result_dst,
+			  op[0], src_reg_for_float(0.0));
+      break;
+   case ir_unop_neg:
+      op[0].negate = ~op[0].negate;
+      result_src = op[0];
+      break;
+   case ir_unop_abs:
+      ir_to_mesa_emit_op1(ir, OPCODE_ABS, result_dst, op[0]);
+      break;
+   case ir_unop_sign:
+      ir_to_mesa_emit_op1(ir, OPCODE_SSG, result_dst, op[0]);
+      break;
+   case ir_unop_rcp:
+      ir_to_mesa_emit_scalar_op1(ir, OPCODE_RCP, result_dst, op[0]);
+      break;
+
+   case ir_unop_exp2:
+      ir_to_mesa_emit_scalar_op1(ir, OPCODE_EX2, result_dst, op[0]);
+      break;
+   case ir_unop_exp:
+   case ir_unop_log:
+      assert(!"not reached: should be handled by ir_explog_to_explog2");
+      break;
+   case ir_unop_log2:
+      ir_to_mesa_emit_scalar_op1(ir, OPCODE_LG2, result_dst, op[0]);
+      break;
+   case ir_unop_sin:
+      ir_to_mesa_emit_scalar_op1(ir, OPCODE_SIN, result_dst, op[0]);
+      break;
+   case ir_unop_cos:
+      ir_to_mesa_emit_scalar_op1(ir, OPCODE_COS, result_dst, op[0]);
+      break;
+   case ir_unop_sin_reduced:
+      emit_scs(ir, OPCODE_SIN, result_dst, op[0]);
+      break;
+   case ir_unop_cos_reduced:
+      emit_scs(ir, OPCODE_COS, result_dst, op[0]);
+      break;
+
+   case ir_unop_dFdx:
+      ir_to_mesa_emit_op1(ir, OPCODE_DDX, result_dst, op[0]);
+      break;
+   case ir_unop_dFdy:
+      ir_to_mesa_emit_op1(ir, OPCODE_DDY, result_dst, op[0]);
+      break;
+
+   case ir_unop_noise: {
+      const enum prog_opcode opcode =
+	 prog_opcode(OPCODE_NOISE1
+		     + (ir->operands[0]->type->vector_elements) - 1);
+      assert((opcode >= OPCODE_NOISE1) && (opcode <= OPCODE_NOISE4));
+
+      ir_to_mesa_emit_op1(ir, opcode, result_dst, op[0]);
+      break;
+   }
+
+   case ir_binop_add:
+      ir_to_mesa_emit_op2(ir, OPCODE_ADD, result_dst, op[0], op[1]);
+      break;
+   case ir_binop_sub:
+      ir_to_mesa_emit_op2(ir, OPCODE_SUB, result_dst, op[0], op[1]);
+      break;
+
+   case ir_binop_mul:
+      ir_to_mesa_emit_op2(ir, OPCODE_MUL, result_dst, op[0], op[1]);
+      break;
+   case ir_binop_div:
+      assert(!"not reached: should be handled by ir_div_to_mul_rcp");
+   case ir_binop_mod:
+      assert(!"ir_binop_mod should have been converted to b * fract(a/b)");
+      break;
+
+   case ir_binop_less:
+      ir_to_mesa_emit_op2(ir, OPCODE_SLT, result_dst, op[0], op[1]);
+      break;
+   case ir_binop_greater:
+      ir_to_mesa_emit_op2(ir, OPCODE_SGT, result_dst, op[0], op[1]);
+      break;
+   case ir_binop_lequal:
+      ir_to_mesa_emit_op2(ir, OPCODE_SLE, result_dst, op[0], op[1]);
+      break;
+   case ir_binop_gequal:
+      ir_to_mesa_emit_op2(ir, OPCODE_SGE, result_dst, op[0], op[1]);
+      break;
+   case ir_binop_equal:
+      ir_to_mesa_emit_op2(ir, OPCODE_SEQ, result_dst, op[0], op[1]);
+      break;
+   case ir_binop_nequal:
+      ir_to_mesa_emit_op2(ir, OPCODE_SNE, result_dst, op[0], op[1]);
+      break;
+   case ir_binop_all_equal:
+      /* "==" operator producing a scalar boolean. */
+      if (ir->operands[0]->type->is_vector() ||
+	  ir->operands[1]->type->is_vector()) {
+	 ir_to_mesa_src_reg temp = get_temp(glsl_type::vec4_type);
+	 ir_to_mesa_emit_op2(ir, OPCODE_SNE,
+			     ir_to_mesa_dst_reg_from_src(temp), op[0], op[1]);
+	 ir_to_mesa_emit_dp(ir, result_dst, temp, temp, vector_elements);
+	 ir_to_mesa_emit_op2(ir, OPCODE_SEQ,
+			     result_dst, result_src, src_reg_for_float(0.0));
+      } else {
+	 ir_to_mesa_emit_op2(ir, OPCODE_SEQ, result_dst, op[0], op[1]);
+      }
+      break;
+   case ir_binop_any_nequal:
+      /* "!=" operator producing a scalar boolean. */
+      if (ir->operands[0]->type->is_vector() ||
+	  ir->operands[1]->type->is_vector()) {
+	 ir_to_mesa_src_reg temp = get_temp(glsl_type::vec4_type);
+	 ir_to_mesa_emit_op2(ir, OPCODE_SNE,
+			     ir_to_mesa_dst_reg_from_src(temp), op[0], op[1]);
+	 ir_to_mesa_emit_dp(ir, result_dst, temp, temp, vector_elements);
+	 ir_to_mesa_emit_op2(ir, OPCODE_SNE,
+			     result_dst, result_src, src_reg_for_float(0.0));
+      } else {
+	 ir_to_mesa_emit_op2(ir, OPCODE_SNE, result_dst, op[0], op[1]);
+      }
+      break;
+
+   case ir_unop_any:
+      assert(ir->operands[0]->type->is_vector());
+      ir_to_mesa_emit_dp(ir, result_dst, op[0], op[0],
+			 ir->operands[0]->type->vector_elements);
+      ir_to_mesa_emit_op2(ir, OPCODE_SNE,
+			  result_dst, result_src, src_reg_for_float(0.0));
+      break;
+
+   case ir_binop_logic_xor:
+      ir_to_mesa_emit_op2(ir, OPCODE_SNE, result_dst, op[0], op[1]);
+      break;
+
+   case ir_binop_logic_or:
+      /* This could be a saturated add and skip the SNE. */
+      ir_to_mesa_emit_op2(ir, OPCODE_ADD,
+			  result_dst,
+			  op[0], op[1]);
+
+      ir_to_mesa_emit_op2(ir, OPCODE_SNE,
+			  result_dst,
+			  result_src, src_reg_for_float(0.0));
+      break;
+
+   case ir_binop_logic_and:
+      /* the bool args are stored as float 0.0 or 1.0, so "mul" gives us "and". */
+      ir_to_mesa_emit_op2(ir, OPCODE_MUL,
+			  result_dst,
+			  op[0], op[1]);
+      break;
+
+   case ir_binop_dot:
+      assert(ir->operands[0]->type->is_vector());
+      assert(ir->operands[0]->type == ir->operands[1]->type);
+      ir_to_mesa_emit_dp(ir, result_dst, op[0], op[1],
+			 ir->operands[0]->type->vector_elements);
+      break;
+
+   case ir_unop_sqrt:
+      /* sqrt(x) = x * rsq(x). */
+      ir_to_mesa_emit_scalar_op1(ir, OPCODE_RSQ, result_dst, op[0]);
+      ir_to_mesa_emit_op2(ir, OPCODE_MUL, result_dst, result_src, op[0]);
+      /* For incoming channels <= 0, set the result to 0. */
+      op[0].negate = ~op[0].negate;
+      ir_to_mesa_emit_op3(ir, OPCODE_CMP, result_dst,
+			  op[0], result_src, src_reg_for_float(0.0));
+      break;
+   case ir_unop_rsq:
+      ir_to_mesa_emit_scalar_op1(ir, OPCODE_RSQ, result_dst, op[0]);
+      break;
+   case ir_unop_i2f:
+   case ir_unop_b2f:
+   case ir_unop_b2i:
+      /* Mesa IR lacks types, ints are stored as truncated floats. */
+      result_src = op[0];
+      break;
+   case ir_unop_f2i:
+      ir_to_mesa_emit_op1(ir, OPCODE_TRUNC, result_dst, op[0]);
+      break;
+   case ir_unop_f2b:
+   case ir_unop_i2b:
+      ir_to_mesa_emit_op2(ir, OPCODE_SNE, result_dst,
+			  op[0], src_reg_for_float(0.0));
+      break;
+   case ir_unop_trunc:
+      ir_to_mesa_emit_op1(ir, OPCODE_TRUNC, result_dst, op[0]);
+      break;
+   case ir_unop_ceil:
+      op[0].negate = ~op[0].negate;
+      ir_to_mesa_emit_op1(ir, OPCODE_FLR, result_dst, op[0]);
+      result_src.negate = ~result_src.negate;
+      break;
+   case ir_unop_floor:
+      ir_to_mesa_emit_op1(ir, OPCODE_FLR, result_dst, op[0]);
+      break;
+   case ir_unop_fract:
+      ir_to_mesa_emit_op1(ir, OPCODE_FRC, result_dst, op[0]);
+      break;
+
+   case ir_binop_min:
+      ir_to_mesa_emit_op2(ir, OPCODE_MIN, result_dst, op[0], op[1]);
+      break;
+   case ir_binop_max:
+      ir_to_mesa_emit_op2(ir, OPCODE_MAX, result_dst, op[0], op[1]);
+      break;
+   case ir_binop_pow:
+      ir_to_mesa_emit_scalar_op2(ir, OPCODE_POW, result_dst, op[0], op[1]);
+      break;
+
+   case ir_unop_bit_not:
+   case ir_unop_u2f:
+   case ir_binop_lshift:
+   case ir_binop_rshift:
+   case ir_binop_bit_and:
+   case ir_binop_bit_xor:
+   case ir_binop_bit_or:
+   case ir_unop_round_even:
+      assert(!"GLSL 1.30 features unsupported");
+      break;
+
+   case ir_quadop_vector:
+      /* This operation should have already been handled.
+       */
+      assert(!"Should not get here.");
+      break;
+   }
+
+   this->result = result_src;
+}
+
+
+void
+ir_to_mesa_visitor::visit(ir_swizzle *ir)
+{
+   ir_to_mesa_src_reg src_reg;
+   int i;
+   int swizzle[4];
+
+   /* Note that this is only swizzles in expressions, not those on the left
+    * hand side of an assignment, which do write masking.  See ir_assignment
+    * for that.
+    */
+
+   ir->val->accept(this);
+   src_reg = this->result;
+   assert(src_reg.file != PROGRAM_UNDEFINED);
+
+   for (i = 0; i < 4; i++) {
+      if (i < ir->type->vector_elements) {
+	 switch (i) {
+	 case 0:
+	    swizzle[i] = GET_SWZ(src_reg.swizzle, ir->mask.x);
+	    break;
+	 case 1:
+	    swizzle[i] = GET_SWZ(src_reg.swizzle, ir->mask.y);
+	    break;
+	 case 2:
+	    swizzle[i] = GET_SWZ(src_reg.swizzle, ir->mask.z);
+	    break;
+	 case 3:
+	    swizzle[i] = GET_SWZ(src_reg.swizzle, ir->mask.w);
+	    break;
+	 }
+      } else {
+	 /* If the type is smaller than a vec4, replicate the last
+	  * channel out.
+	  */
+	 swizzle[i] = swizzle[ir->type->vector_elements - 1];
+      }
+   }
+
+   src_reg.swizzle = MAKE_SWIZZLE4(swizzle[0],
+				   swizzle[1],
+				   swizzle[2],
+				   swizzle[3]);
+
+   this->result = src_reg;
+}
+
+void
+ir_to_mesa_visitor::visit(ir_dereference_variable *ir)
+{
+   variable_storage *entry = find_variable_storage(ir->var);
+   ir_variable *var = ir->var;
+
+   if (!entry) {
+      switch (var->mode) {
+      case ir_var_uniform:
+	 entry = new(mem_ctx) variable_storage(var, PROGRAM_UNIFORM,
+					       var->location);
+	 this->variables.push_tail(entry);
+	 break;
+      case ir_var_in:
+      case ir_var_inout:
+	 /* The linker assigns locations for varyings and attributes,
+	  * including deprecated builtins (like gl_Color), user-assign
+	  * generic attributes (glBindVertexLocation), and
+	  * user-defined varyings.
+	  *
+	  * FINISHME: We would hit this path for function arguments.  Fix!
+	  */
+	 assert(var->location != -1);
+         entry = new(mem_ctx) variable_storage(var,
+                                               PROGRAM_INPUT,
+                                               var->location);
+         if (this->prog->Target == GL_VERTEX_PROGRAM_ARB &&
+             var->location >= VERT_ATTRIB_GENERIC0) {
+            _mesa_add_attribute(this->prog->Attributes,
+                                var->name,
+                                _mesa_sizeof_glsl_type(var->type->gl_type),
+                                var->type->gl_type,
+                                var->location - VERT_ATTRIB_GENERIC0);
+         }
+         break;
+      case ir_var_out:
+	 assert(var->location != -1);
+         entry = new(mem_ctx) variable_storage(var,
+                                               PROGRAM_OUTPUT,
+                                               var->location);
+	 break;
+      case ir_var_system_value:
+         entry = new(mem_ctx) variable_storage(var,
+                                               PROGRAM_SYSTEM_VALUE,
+                                               var->location);
+         break;
+      case ir_var_auto:
+      case ir_var_temporary:
+	 entry = new(mem_ctx) variable_storage(var, PROGRAM_TEMPORARY,
+					       this->next_temp);
+	 this->variables.push_tail(entry);
+
+	 next_temp += type_size(var->type);
+	 break;
+      }
+
+      if (!entry) {
+	 printf("Failed to make storage for %s\n", var->name);
+	 exit(1);
+      }
+   }
+
+   this->result = ir_to_mesa_src_reg(entry->file, entry->index, var->type);
+}
+
+void
+ir_to_mesa_visitor::visit(ir_dereference_array *ir)
+{
+   ir_constant *index;
+   ir_to_mesa_src_reg src_reg;
+   int element_size = type_size(ir->type);
+
+   index = ir->array_index->constant_expression_value();
+
+   ir->array->accept(this);
+   src_reg = this->result;
+
+   if (index) {
+      src_reg.index += index->value.i[0] * element_size;
+   } else {
+      ir_to_mesa_src_reg array_base = this->result;
+      /* Variable index array dereference.  It eats the "vec4" of the
+       * base of the array and an index that offsets the Mesa register
+       * index.
+       */
+      ir->array_index->accept(this);
+
+      ir_to_mesa_src_reg index_reg;
+
+      if (element_size == 1) {
+	 index_reg = this->result;
+      } else {
+	 index_reg = get_temp(glsl_type::float_type);
+
+	 ir_to_mesa_emit_op2(ir, OPCODE_MUL,
+			     ir_to_mesa_dst_reg_from_src(index_reg),
+			     this->result, src_reg_for_float(element_size));
+      }
+
+      src_reg.reladdr = ralloc(mem_ctx, ir_to_mesa_src_reg);
+      memcpy(src_reg.reladdr, &index_reg, sizeof(index_reg));
+   }
+
+   /* If the type is smaller than a vec4, replicate the last channel out. */
+   if (ir->type->is_scalar() || ir->type->is_vector())
+      src_reg.swizzle = swizzle_for_size(ir->type->vector_elements);
+   else
+      src_reg.swizzle = SWIZZLE_NOOP;
+
+   this->result = src_reg;
+}
+
+void
+ir_to_mesa_visitor::visit(ir_dereference_record *ir)
+{
+   unsigned int i;
+   const glsl_type *struct_type = ir->record->type;
+   int offset = 0;
+
+   ir->record->accept(this);
+
+   for (i = 0; i < struct_type->length; i++) {
+      if (strcmp(struct_type->fields.structure[i].name, ir->field) == 0)
+	 break;
+      offset += type_size(struct_type->fields.structure[i].type);
+   }
+
+   /* If the type is smaller than a vec4, replicate the last channel out. */
+   if (ir->type->is_scalar() || ir->type->is_vector())
+      this->result.swizzle = swizzle_for_size(ir->type->vector_elements);
+   else
+      this->result.swizzle = SWIZZLE_NOOP;
+
+   this->result.index += offset;
+}
+
+/**
+ * We want to be careful in assignment setup to hit the actual storage
+ * instead of potentially using a temporary like we might with the
+ * ir_dereference handler.
+ */
+static struct ir_to_mesa_dst_reg
+get_assignment_lhs(ir_dereference *ir, ir_to_mesa_visitor *v)
+{
+   /* The LHS must be a dereference.  If the LHS is a variable indexed array
+    * access of a vector, it must be separated into a series conditional moves
+    * before reaching this point (see ir_vec_index_to_cond_assign).
+    */
+   assert(ir->as_dereference());
+   ir_dereference_array *deref_array = ir->as_dereference_array();
+   if (deref_array) {
+      assert(!deref_array->array->type->is_vector());
+   }
+
+   /* Use the rvalue deref handler for the most part.  We'll ignore
+    * swizzles in it and write swizzles using writemask, though.
+    */
+   ir->accept(v);
+   return ir_to_mesa_dst_reg_from_src(v->result);
+}
+
+/**
+ * Process the condition of a conditional assignment
+ *
+ * Examines the condition of a conditional assignment to generate the optimal
+ * first operand of a \c CMP instruction.  If the condition is a relational
+ * operator with 0 (e.g., \c ir_binop_less), the value being compared will be
+ * used as the source for the \c CMP instruction.  Otherwise the comparison
+ * is processed to a boolean result, and the boolean result is used as the
+ * operand to the CMP instruction.
+ */
+bool
+ir_to_mesa_visitor::process_move_condition(ir_rvalue *ir)
+{
+   ir_rvalue *src_ir = ir;
+   bool negate = true;
+   bool switch_order = false;
+
+   ir_expression *const expr = ir->as_expression();
+   if ((expr != NULL) && (expr->get_num_operands() == 2)) {
+      bool zero_on_left = false;
+
+      if (expr->operands[0]->is_zero()) {
+	 src_ir = expr->operands[1];
+	 zero_on_left = true;
+      } else if (expr->operands[1]->is_zero()) {
+	 src_ir = expr->operands[0];
+	 zero_on_left = false;
+      }
+
+      /*      a is -  0  +            -  0  +
+       * (a <  0)  T  F  F  ( a < 0)  T  F  F
+       * (0 <  a)  F  F  T  (-a < 0)  F  F  T
+       * (a <= 0)  T  T  F  (-a < 0)  F  F  T  (swap order of other operands)
+       * (0 <= a)  F  T  T  ( a < 0)  T  F  F  (swap order of other operands)
+       * (a >  0)  F  F  T  (-a < 0)  F  F  T
+       * (0 >  a)  T  F  F  ( a < 0)  T  F  F
+       * (a >= 0)  F  T  T  ( a < 0)  T  F  F  (swap order of other operands)
+       * (0 >= a)  T  T  F  (-a < 0)  F  F  T  (swap order of other operands)
+       *
+       * Note that exchanging the order of 0 and 'a' in the comparison simply
+       * means that the value of 'a' should be negated.
+       */
+      if (src_ir != ir) {
+	 switch (expr->operation) {
+	 case ir_binop_less:
+	    switch_order = false;
+	    negate = zero_on_left;
+	    break;
+
+	 case ir_binop_greater:
+	    switch_order = false;
+	    negate = !zero_on_left;
+	    break;
+
+	 case ir_binop_lequal:
+	    switch_order = true;
+	    negate = !zero_on_left;
+	    break;
+
+	 case ir_binop_gequal:
+	    switch_order = true;
+	    negate = zero_on_left;
+	    break;
+
+	 default:
+	    /* This isn't the right kind of comparison afterall, so make sure
+	     * the whole condition is visited.
+	     */
+	    src_ir = ir;
+	    break;
+	 }
+      }
+   }
+
+   src_ir->accept(this);
+
+   /* We use the OPCODE_CMP (a < 0 ? b : c) for conditional moves, and the
+    * condition we produced is 0.0 or 1.0.  By flipping the sign, we can
+    * choose which value OPCODE_CMP produces without an extra instruction
+    * computing the condition.
+    */
+   if (negate)
+      this->result.negate = ~this->result.negate;
+
+   return switch_order;
+}
+
+void
+ir_to_mesa_visitor::visit(ir_assignment *ir)
+{
+   struct ir_to_mesa_dst_reg l;
+   struct ir_to_mesa_src_reg r;
+   int i;
+
+   ir->rhs->accept(this);
+   r = this->result;
+
+   l = get_assignment_lhs(ir->lhs, this);
+
+   /* FINISHME: This should really set to the correct maximal writemask for each
+    * FINISHME: component written (in the loops below).  This case can only
+    * FINISHME: occur for matrices, arrays, and structures.
+    */
+   if (ir->write_mask == 0) {
+      assert(!ir->lhs->type->is_scalar() && !ir->lhs->type->is_vector());
+      l.writemask = WRITEMASK_XYZW;
+   } else if (ir->lhs->type->is_scalar()) {
+      /* FINISHME: This hack makes writing to gl_FragDepth, which lives in the
+       * FINISHME: W component of fragment shader output zero, work correctly.
+       */
+      l.writemask = WRITEMASK_XYZW;
+   } else {
+      int swizzles[4];
+      int first_enabled_chan = 0;
+      int rhs_chan = 0;
+
+      assert(ir->lhs->type->is_vector());
+      l.writemask = ir->write_mask;
+
+      for (int i = 0; i < 4; i++) {
+	 if (l.writemask & (1 << i)) {
+	    first_enabled_chan = GET_SWZ(r.swizzle, i);
+	    break;
+	 }
+      }
+
+      /* Swizzle a small RHS vector into the channels being written.
+       *
+       * glsl ir treats write_mask as dictating how many channels are
+       * present on the RHS while Mesa IR treats write_mask as just
+       * showing which channels of the vec4 RHS get written.
+       */
+      for (int i = 0; i < 4; i++) {
+	 if (l.writemask & (1 << i))
+	    swizzles[i] = GET_SWZ(r.swizzle, rhs_chan++);
+	 else
+	    swizzles[i] = first_enabled_chan;
+      }
+      r.swizzle = MAKE_SWIZZLE4(swizzles[0], swizzles[1],
+				swizzles[2], swizzles[3]);
+   }
+
+   assert(l.file != PROGRAM_UNDEFINED);
+   assert(r.file != PROGRAM_UNDEFINED);
+
+   if (ir->condition) {
+      const bool switch_order = this->process_move_condition(ir->condition);
+      ir_to_mesa_src_reg condition = this->result;
+
+      for (i = 0; i < type_size(ir->lhs->type); i++) {
+	 if (switch_order) {
+	    ir_to_mesa_emit_op3(ir, OPCODE_CMP, l,
+				condition, ir_to_mesa_src_reg_from_dst(l), r);
+	 } else {
+	    ir_to_mesa_emit_op3(ir, OPCODE_CMP, l,
+				condition, r, ir_to_mesa_src_reg_from_dst(l));
+	 }
+
+	 l.index++;
+	 r.index++;
+      }
+   } else {
+      for (i = 0; i < type_size(ir->lhs->type); i++) {
+	 ir_to_mesa_emit_op1(ir, OPCODE_MOV, l, r);
+	 l.index++;
+	 r.index++;
+      }
+   }
+}
+
+
+void
+ir_to_mesa_visitor::visit(ir_constant *ir)
+{
+   ir_to_mesa_src_reg src_reg;
+   GLfloat stack_vals[4] = { 0 };
+   GLfloat *values = stack_vals;
+   unsigned int i;
+
+   /* Unfortunately, 4 floats is all we can get into
+    * _mesa_add_unnamed_constant.  So, make a temp to store an
+    * aggregate constant and move each constant value into it.  If we
+    * get lucky, copy propagation will eliminate the extra moves.
+    */
+
+   if (ir->type->base_type == GLSL_TYPE_STRUCT) {
+      ir_to_mesa_src_reg temp_base = get_temp(ir->type);
+      ir_to_mesa_dst_reg temp = ir_to_mesa_dst_reg_from_src(temp_base);
+
+      foreach_iter(exec_list_iterator, iter, ir->components) {
+	 ir_constant *field_value = (ir_constant *)iter.get();
+	 int size = type_size(field_value->type);
+
+	 assert(size > 0);
+
+	 field_value->accept(this);
+	 src_reg = this->result;
+
+	 for (i = 0; i < (unsigned int)size; i++) {
+	    ir_to_mesa_emit_op1(ir, OPCODE_MOV, temp, src_reg);
+
+	    src_reg.index++;
+	    temp.index++;
+	 }
+      }
+      this->result = temp_base;
+      return;
+   }
+
+   if (ir->type->is_array()) {
+      ir_to_mesa_src_reg temp_base = get_temp(ir->type);
+      ir_to_mesa_dst_reg temp = ir_to_mesa_dst_reg_from_src(temp_base);
+      int size = type_size(ir->type->fields.array);
+
+      assert(size > 0);
+
+      for (i = 0; i < ir->type->length; i++) {
+	 ir->array_elements[i]->accept(this);
+	 src_reg = this->result;
+	 for (int j = 0; j < size; j++) {
+	    ir_to_mesa_emit_op1(ir, OPCODE_MOV, temp, src_reg);
+
+	    src_reg.index++;
+	    temp.index++;
+	 }
+      }
+      this->result = temp_base;
+      return;
+   }
+
+   if (ir->type->is_matrix()) {
+      ir_to_mesa_src_reg mat = get_temp(ir->type);
+      ir_to_mesa_dst_reg mat_column = ir_to_mesa_dst_reg_from_src(mat);
+
+      for (i = 0; i < ir->type->matrix_columns; i++) {
+	 assert(ir->type->base_type == GLSL_TYPE_FLOAT);
+	 values = &ir->value.f[i * ir->type->vector_elements];
+
+	 src_reg = ir_to_mesa_src_reg(PROGRAM_CONSTANT, -1, NULL);
+	 src_reg.index = _mesa_add_unnamed_constant(this->prog->Parameters,
+						values,
+						ir->type->vector_elements,
+						&src_reg.swizzle);
+	 ir_to_mesa_emit_op1(ir, OPCODE_MOV, mat_column, src_reg);
+
+	 mat_column.index++;
+      }
+
+      this->result = mat;
+      return;
+   }
+
+   src_reg.file = PROGRAM_CONSTANT;
+   switch (ir->type->base_type) {
+   case GLSL_TYPE_FLOAT:
+      values = &ir->value.f[0];
+      break;
+   case GLSL_TYPE_UINT:
+      for (i = 0; i < ir->type->vector_elements; i++) {
+	 values[i] = ir->value.u[i];
+      }
+      break;
+   case GLSL_TYPE_INT:
+      for (i = 0; i < ir->type->vector_elements; i++) {
+	 values[i] = ir->value.i[i];
+      }
+      break;
+   case GLSL_TYPE_BOOL:
+      for (i = 0; i < ir->type->vector_elements; i++) {
+	 values[i] = ir->value.b[i];
+      }
+      break;
+   default:
+      assert(!"Non-float/uint/int/bool constant");
+   }
+
+   this->result = ir_to_mesa_src_reg(PROGRAM_CONSTANT, -1, ir->type);
+   this->result.index = _mesa_add_unnamed_constant(this->prog->Parameters,
+						   values,
+						   ir->type->vector_elements,
+						   &this->result.swizzle);
+}
+
+function_entry *
+ir_to_mesa_visitor::get_function_signature(ir_function_signature *sig)
+{
+   function_entry *entry;
+
+   foreach_iter(exec_list_iterator, iter, this->function_signatures) {
+      entry = (function_entry *)iter.get();
+
+      if (entry->sig == sig)
+	 return entry;
+   }
+
+   entry = ralloc(mem_ctx, function_entry);
+   entry->sig = sig;
+   entry->sig_id = this->next_signature_id++;
+   entry->bgn_inst = NULL;
+
+   /* Allocate storage for all the parameters. */
+   foreach_iter(exec_list_iterator, iter, sig->parameters) {
+      ir_variable *param = (ir_variable *)iter.get();
+      variable_storage *storage;
+
+      storage = find_variable_storage(param);
+      assert(!storage);
+
+      storage = new(mem_ctx) variable_storage(param, PROGRAM_TEMPORARY,
+					      this->next_temp);
+      this->variables.push_tail(storage);
+
+      this->next_temp += type_size(param->type);
+   }
+
+   if (!sig->return_type->is_void()) {
+      entry->return_reg = get_temp(sig->return_type);
+   } else {
+      entry->return_reg = ir_to_mesa_undef;
+   }
+
+   this->function_signatures.push_tail(entry);
+   return entry;
+}
+
+void
+ir_to_mesa_visitor::visit(ir_call *ir)
+{
+   ir_to_mesa_instruction *call_inst;
+   ir_function_signature *sig = ir->get_callee();
+   function_entry *entry = get_function_signature(sig);
+   int i;
+
+   /* Process in parameters. */
+   exec_list_iterator sig_iter = sig->parameters.iterator();
+   foreach_iter(exec_list_iterator, iter, *ir) {
+      ir_rvalue *param_rval = (ir_rvalue *)iter.get();
+      ir_variable *param = (ir_variable *)sig_iter.get();
+
+      if (param->mode == ir_var_in ||
+	  param->mode == ir_var_inout) {
+	 variable_storage *storage = find_variable_storage(param);
+	 assert(storage);
+
+	 param_rval->accept(this);
+	 ir_to_mesa_src_reg r = this->result;
+
+	 ir_to_mesa_dst_reg l;
+	 l.file = storage->file;
+	 l.index = storage->index;
+	 l.reladdr = NULL;
+	 l.writemask = WRITEMASK_XYZW;
+	 l.cond_mask = COND_TR;
+
+	 for (i = 0; i < type_size(param->type); i++) {
+	    ir_to_mesa_emit_op1(ir, OPCODE_MOV, l, r);
+	    l.index++;
+	    r.index++;
+	 }
+      }
+
+      sig_iter.next();
+   }
+   assert(!sig_iter.has_next());
+
+   /* Emit call instruction */
+   call_inst = ir_to_mesa_emit_op1(ir, OPCODE_CAL,
+				   ir_to_mesa_undef_dst, ir_to_mesa_undef);
+   call_inst->function = entry;
+
+   /* Process out parameters. */
+   sig_iter = sig->parameters.iterator();
+   foreach_iter(exec_list_iterator, iter, *ir) {
+      ir_rvalue *param_rval = (ir_rvalue *)iter.get();
+      ir_variable *param = (ir_variable *)sig_iter.get();
+
+      if (param->mode == ir_var_out ||
+	  param->mode == ir_var_inout) {
+	 variable_storage *storage = find_variable_storage(param);
+	 assert(storage);
+
+	 ir_to_mesa_src_reg r;
+	 r.file = storage->file;
+	 r.index = storage->index;
+	 r.reladdr = NULL;
+	 r.swizzle = SWIZZLE_NOOP;
+	 r.negate = 0;
+
+	 param_rval->accept(this);
+	 ir_to_mesa_dst_reg l = ir_to_mesa_dst_reg_from_src(this->result);
+
+	 for (i = 0; i < type_size(param->type); i++) {
+	    ir_to_mesa_emit_op1(ir, OPCODE_MOV, l, r);
+	    l.index++;
+	    r.index++;
+	 }
+      }
+
+      sig_iter.next();
+   }
+   assert(!sig_iter.has_next());
+
+   /* Process return value. */
+   this->result = entry->return_reg;
+}
+
+void
+ir_to_mesa_visitor::visit(ir_texture *ir)
+{
+   ir_to_mesa_src_reg result_src, coord, lod_info, projector;
+   ir_to_mesa_dst_reg result_dst, coord_dst;
+   ir_to_mesa_instruction *inst = NULL;
+   prog_opcode opcode = OPCODE_NOP;
+
+   ir->coordinate->accept(this);
+
+   /* Put our coords in a temp.  We'll need to modify them for shadow,
+    * projection, or LOD, so the only case we'd use it as is is if
+    * we're doing plain old texturing.  Mesa IR optimization should
+    * handle cleaning up our mess in that case.
+    */
+   coord = get_temp(glsl_type::vec4_type);
+   coord_dst = ir_to_mesa_dst_reg_from_src(coord);
+   ir_to_mesa_emit_op1(ir, OPCODE_MOV, coord_dst,
+		       this->result);
+
+   if (ir->projector) {
+      ir->projector->accept(this);
+      projector = this->result;
+   }
+
+   /* Storage for our result.  Ideally for an assignment we'd be using
+    * the actual storage for the result here, instead.
+    */
+   result_src = get_temp(glsl_type::vec4_type);
+   result_dst = ir_to_mesa_dst_reg_from_src(result_src);
+
+   switch (ir->op) {
+   case ir_tex:
+      opcode = OPCODE_TEX;
+      break;
+   case ir_txb:
+      opcode = OPCODE_TXB;
+      ir->lod_info.bias->accept(this);
+      lod_info = this->result;
+      break;
+   case ir_txl:
+      opcode = OPCODE_TXL;
+      ir->lod_info.lod->accept(this);
+      lod_info = this->result;
+      break;
+   case ir_txd:
+   case ir_txf:
+      assert(!"GLSL 1.30 features unsupported");
+      break;
+   }
+
+   if (ir->projector) {
+      if (opcode == OPCODE_TEX) {
+	 /* Slot the projector in as the last component of the coord. */
+	 coord_dst.writemask = WRITEMASK_W;
+	 ir_to_mesa_emit_op1(ir, OPCODE_MOV, coord_dst, projector);
+	 coord_dst.writemask = WRITEMASK_XYZW;
+	 opcode = OPCODE_TXP;
+      } else {
+	 ir_to_mesa_src_reg coord_w = coord;
+	 coord_w.swizzle = SWIZZLE_WWWW;
+
+	 /* For the other TEX opcodes there's no projective version
+	  * since the last slot is taken up by lod info.  Do the
+	  * projective divide now.
+	  */
+	 coord_dst.writemask = WRITEMASK_W;
+	 ir_to_mesa_emit_op1(ir, OPCODE_RCP, coord_dst, projector);
+
+	 coord_dst.writemask = WRITEMASK_XYZ;
+	 ir_to_mesa_emit_op2(ir, OPCODE_MUL, coord_dst, coord, coord_w);
+
+	 coord_dst.writemask = WRITEMASK_XYZW;
+	 coord.swizzle = SWIZZLE_XYZW;
+      }
+   }
+
+   if (ir->shadow_comparitor) {
+      /* Slot the shadow value in as the second to last component of the
+       * coord.
+       */
+      ir->shadow_comparitor->accept(this);
+      coord_dst.writemask = WRITEMASK_Z;
+      ir_to_mesa_emit_op1(ir, OPCODE_MOV, coord_dst, this->result);
+      coord_dst.writemask = WRITEMASK_XYZW;
+   }
+
+   if (opcode == OPCODE_TXL || opcode == OPCODE_TXB) {
+      /* Mesa IR stores lod or lod bias in the last channel of the coords. */
+      coord_dst.writemask = WRITEMASK_W;
+      ir_to_mesa_emit_op1(ir, OPCODE_MOV, coord_dst, lod_info);
+      coord_dst.writemask = WRITEMASK_XYZW;
+   }
+
+   inst = ir_to_mesa_emit_op1(ir, opcode, result_dst, coord);
+
+   if (ir->shadow_comparitor)
+      inst->tex_shadow = GL_TRUE;
+
+   inst->sampler = _mesa_get_sampler_uniform_value(ir->sampler,
+						   this->shader_program,
+						   this->prog);
+
+   const glsl_type *sampler_type = ir->sampler->type;
+
+   switch (sampler_type->sampler_dimensionality) {
+   case GLSL_SAMPLER_DIM_1D:
+      inst->tex_target = (sampler_type->sampler_array)
+	 ? TEXTURE_1D_ARRAY_INDEX : TEXTURE_1D_INDEX;
+      break;
+   case GLSL_SAMPLER_DIM_2D:
+      inst->tex_target = (sampler_type->sampler_array)
+	 ? TEXTURE_2D_ARRAY_INDEX : TEXTURE_2D_INDEX;
+      break;
+   case GLSL_SAMPLER_DIM_3D:
+      inst->tex_target = TEXTURE_3D_INDEX;
+      break;
+   case GLSL_SAMPLER_DIM_CUBE:
+      inst->tex_target = TEXTURE_CUBE_INDEX;
+      break;
+   case GLSL_SAMPLER_DIM_RECT:
+      inst->tex_target = TEXTURE_RECT_INDEX;
+      break;
+   case GLSL_SAMPLER_DIM_BUF:
+      assert(!"FINISHME: Implement ARB_texture_buffer_object");
+      break;
+   default:
+      assert(!"Should not get here.");
+   }
+
+   this->result = result_src;
+}
+
+void
+ir_to_mesa_visitor::visit(ir_return *ir)
+{
+   if (ir->get_value()) {
+      ir_to_mesa_dst_reg l;
+      int i;
+
+      assert(current_function);
+
+      ir->get_value()->accept(this);
+      ir_to_mesa_src_reg r = this->result;
+
+      l = ir_to_mesa_dst_reg_from_src(current_function->return_reg);
+
+      for (i = 0; i < type_size(current_function->sig->return_type); i++) {
+	 ir_to_mesa_emit_op1(ir, OPCODE_MOV, l, r);
+	 l.index++;
+	 r.index++;
+      }
+   }
+
+   ir_to_mesa_emit_op0(ir, OPCODE_RET);
+}
+
+void
+ir_to_mesa_visitor::visit(ir_discard *ir)
+{
+   struct gl_fragment_program *fp = (struct gl_fragment_program *)this->prog;
+
+   if (ir->condition) {
+      ir->condition->accept(this);
+      this->result.negate = ~this->result.negate;
+      ir_to_mesa_emit_op1(ir, OPCODE_KIL, ir_to_mesa_undef_dst, this->result);
+   } else {
+      ir_to_mesa_emit_op0(ir, OPCODE_KIL_NV);
+   }
+
+   fp->UsesKill = GL_TRUE;
+}
+
+void
+ir_to_mesa_visitor::visit(ir_if *ir)
+{
+   ir_to_mesa_instruction *cond_inst, *if_inst, *else_inst = NULL;
+   ir_to_mesa_instruction *prev_inst;
+
+   prev_inst = (ir_to_mesa_instruction *)this->instructions.get_tail();
+
+   ir->condition->accept(this);
+   assert(this->result.file != PROGRAM_UNDEFINED);
+
+   if (this->options->EmitCondCodes) {
+      cond_inst = (ir_to_mesa_instruction *)this->instructions.get_tail();
+
+      /* See if we actually generated any instruction for generating
+       * the condition.  If not, then cook up a move to a temp so we
+       * have something to set cond_update on.
+       */
+      if (cond_inst == prev_inst) {
+	 ir_to_mesa_src_reg temp = get_temp(glsl_type::bool_type);
+	 cond_inst = ir_to_mesa_emit_op1(ir->condition, OPCODE_MOV,
+					 ir_to_mesa_dst_reg_from_src(temp),
+					 result);
+      }
+      cond_inst->cond_update = GL_TRUE;
+
+      if_inst = ir_to_mesa_emit_op0(ir->condition, OPCODE_IF);
+      if_inst->dst_reg.cond_mask = COND_NE;
+   } else {
+      if_inst = ir_to_mesa_emit_op1(ir->condition,
+				    OPCODE_IF, ir_to_mesa_undef_dst,
+				    this->result);
+   }
+
+   this->instructions.push_tail(if_inst);
+
+   visit_exec_list(&ir->then_instructions, this);
+
+   if (!ir->else_instructions.is_empty()) {
+      else_inst = ir_to_mesa_emit_op0(ir->condition, OPCODE_ELSE);
+      visit_exec_list(&ir->else_instructions, this);
+   }
+
+   if_inst = ir_to_mesa_emit_op1(ir->condition, OPCODE_ENDIF,
+				 ir_to_mesa_undef_dst, ir_to_mesa_undef);
+}
+
+ir_to_mesa_visitor::ir_to_mesa_visitor()
+{
+   result.file = PROGRAM_UNDEFINED;
+   next_temp = 1;
+   next_signature_id = 1;
+   current_function = NULL;
+   mem_ctx = ralloc_context(NULL);
+}
+
+ir_to_mesa_visitor::~ir_to_mesa_visitor()
+{
+   ralloc_free(mem_ctx);
+}
+
+static struct prog_src_register
+mesa_src_reg_from_ir_src_reg(ir_to_mesa_src_reg reg)
+{
+   struct prog_src_register mesa_reg;
+
+   mesa_reg.File = reg.file;
+   assert(reg.index < (1 << INST_INDEX_BITS));
+   mesa_reg.Index = reg.index;
+   mesa_reg.Swizzle = reg.swizzle;
+   mesa_reg.RelAddr = reg.reladdr != NULL;
+   mesa_reg.Negate = reg.negate;
+   mesa_reg.Abs = 0;
+   mesa_reg.HasIndex2 = GL_FALSE;
+   mesa_reg.RelAddr2 = 0;
+   mesa_reg.Index2 = 0;
+
+   return mesa_reg;
+}
+
+static void
+set_branchtargets(ir_to_mesa_visitor *v,
+		  struct prog_instruction *mesa_instructions,
+		  int num_instructions)
+{
+   int if_count = 0, loop_count = 0;
+   int *if_stack, *loop_stack;
+   int if_stack_pos = 0, loop_stack_pos = 0;
+   int i, j;
+
+   for (i = 0; i < num_instructions; i++) {
+      switch (mesa_instructions[i].Opcode) {
+      case OPCODE_IF:
+	 if_count++;
+	 break;
+      case OPCODE_BGNLOOP:
+	 loop_count++;
+	 break;
+      case OPCODE_BRK:
+      case OPCODE_CONT:
+	 mesa_instructions[i].BranchTarget = -1;
+	 break;
+      default:
+	 break;
+      }
+   }
+
+   if_stack = rzalloc_array(v->mem_ctx, int, if_count);
+   loop_stack = rzalloc_array(v->mem_ctx, int, loop_count);
+
+   for (i = 0; i < num_instructions; i++) {
+      switch (mesa_instructions[i].Opcode) {
+      case OPCODE_IF:
+	 if_stack[if_stack_pos] = i;
+	 if_stack_pos++;
+	 break;
+      case OPCODE_ELSE:
+	 mesa_instructions[if_stack[if_stack_pos - 1]].BranchTarget = i;
+	 if_stack[if_stack_pos - 1] = i;
+	 break;
+      case OPCODE_ENDIF:
+	 mesa_instructions[if_stack[if_stack_pos - 1]].BranchTarget = i;
+	 if_stack_pos--;
+	 break;
+      case OPCODE_BGNLOOP:
+	 loop_stack[loop_stack_pos] = i;
+	 loop_stack_pos++;
+	 break;
+      case OPCODE_ENDLOOP:
+	 loop_stack_pos--;
+	 /* Rewrite any breaks/conts at this nesting level (haven't
+	  * already had a BranchTarget assigned) to point to the end
+	  * of the loop.
+	  */
+	 for (j = loop_stack[loop_stack_pos]; j < i; j++) {
+	    if (mesa_instructions[j].Opcode == OPCODE_BRK ||
+		mesa_instructions[j].Opcode == OPCODE_CONT) {
+	       if (mesa_instructions[j].BranchTarget == -1) {
+		  mesa_instructions[j].BranchTarget = i;
+	       }
+	    }
+	 }
+	 /* The loop ends point at each other. */
+	 mesa_instructions[i].BranchTarget = loop_stack[loop_stack_pos];
+	 mesa_instructions[loop_stack[loop_stack_pos]].BranchTarget = i;
+	 break;
+      case OPCODE_CAL:
+	 foreach_iter(exec_list_iterator, iter, v->function_signatures) {
+	    function_entry *entry = (function_entry *)iter.get();
+
+	    if (entry->sig_id == mesa_instructions[i].BranchTarget) {
+	       mesa_instructions[i].BranchTarget = entry->inst;
+	       break;
+	    }
+	 }
+	 break;
+      default:
+	 break;
+      }
+   }
+}
+
+static void
+print_program(struct prog_instruction *mesa_instructions,
+	      ir_instruction **mesa_instruction_annotation,
+	      int num_instructions)
+{
+   ir_instruction *last_ir = NULL;
+   int i;
+   int indent = 0;
+
+   for (i = 0; i < num_instructions; i++) {
+      struct prog_instruction *mesa_inst = mesa_instructions + i;
+      ir_instruction *ir = mesa_instruction_annotation[i];
+
+      fprintf(stdout, "%3d: ", i);
+
+      if (last_ir != ir && ir) {
+	 int j;
+
+	 for (j = 0; j < indent; j++) {
+	    fprintf(stdout, " ");
+	 }
+	 ir->print();
+	 printf("\n");
+	 last_ir = ir;
+
+	 fprintf(stdout, "     "); /* line number spacing. */
+      }
+
+      indent = _mesa_fprint_instruction_opt(stdout, mesa_inst, indent,
+					    PROG_PRINT_DEBUG, NULL);
+   }
+}
+
+
+/**
+ * Count resources used by the given gpu program (number of texture
+ * samplers, etc).
+ */
+static void
+count_resources(struct gl_program *prog)
+{
+   unsigned int i;
+
+   prog->SamplersUsed = 0;
+
+   for (i = 0; i < prog->NumInstructions; i++) {
+      struct prog_instruction *inst = &prog->Instructions[i];
+
+      if (_mesa_is_tex_instruction(inst->Opcode)) {
+	 prog->SamplerTargets[inst->TexSrcUnit] =
+	    (gl_texture_index)inst->TexSrcTarget;
+	 prog->SamplersUsed |= 1 << inst->TexSrcUnit;
+	 if (inst->TexShadow) {
+	    prog->ShadowSamplers |= 1 << inst->TexSrcUnit;
+	 }
+      }
+   }
+
+   _mesa_update_shader_textures_used(prog);
+}
+
+
+/**
+ * Check if the given vertex/fragment/shader program is within the
+ * resource limits of the context (number of texture units, etc).
+ * If any of those checks fail, record a linker error.
+ *
+ * XXX more checks are needed...
+ */
+static void
+check_resources(const struct gl_context *ctx,
+                struct gl_shader_program *shader_program,
+                struct gl_program *prog)
+{
+   switch (prog->Target) {
+   case GL_VERTEX_PROGRAM_ARB:
+      if (_mesa_bitcount(prog->SamplersUsed) >
+          ctx->Const.MaxVertexTextureImageUnits) {
+         fail_link(shader_program, "Too many vertex shader texture samplers");
+      }
+      if (prog->Parameters->NumParameters > MAX_UNIFORMS) {
+         fail_link(shader_program, "Too many vertex shader constants");
+      }
+      break;
+   case MESA_GEOMETRY_PROGRAM:
+      if (_mesa_bitcount(prog->SamplersUsed) >
+          ctx->Const.MaxGeometryTextureImageUnits) {
+         fail_link(shader_program, "Too many geometry shader texture samplers");
+      }
+      if (prog->Parameters->NumParameters >
+          MAX_GEOMETRY_UNIFORM_COMPONENTS / 4) {
+         fail_link(shader_program, "Too many geometry shader constants");
+      }
+      break;
+   case GL_FRAGMENT_PROGRAM_ARB:
+      if (_mesa_bitcount(prog->SamplersUsed) >
+          ctx->Const.MaxTextureImageUnits) {
+         fail_link(shader_program, "Too many fragment shader texture samplers");
+      }
+      if (prog->Parameters->NumParameters > MAX_UNIFORMS) {
+         fail_link(shader_program, "Too many fragment shader constants");
+      }
+      break;
+   default:
+      _mesa_problem(ctx, "unexpected program type in check_resources()");
+   }
+}
+
+
+
+struct uniform_sort {
+   struct gl_uniform *u;
+   int pos;
+};
+
+/* The shader_program->Uniforms list is almost sorted in increasing
+ * uniform->{Frag,Vert}Pos locations, but not quite when there are
+ * uniforms shared between targets.  We need to add parameters in
+ * increasing order for the targets.
+ */
+static int
+sort_uniforms(const void *a, const void *b)
+{
+   struct uniform_sort *u1 = (struct uniform_sort *)a;
+   struct uniform_sort *u2 = (struct uniform_sort *)b;
+
+   return u1->pos - u2->pos;
+}
+
+/* Add the uniforms to the parameters.  The linker chose locations
+ * in our parameters lists (which weren't created yet), which the
+ * uniforms code will use to poke values into our parameters list
+ * when uniforms are updated.
+ */
+static void
+add_uniforms_to_parameters_list(struct gl_shader_program *shader_program,
+				struct gl_shader *shader,
+				struct gl_program *prog)
+{
+   unsigned int i;
+   unsigned int next_sampler = 0, num_uniforms = 0;
+   struct uniform_sort *sorted_uniforms;
+
+   sorted_uniforms = ralloc_array(NULL, struct uniform_sort,
+				  shader_program->Uniforms->NumUniforms);
+
+   for (i = 0; i < shader_program->Uniforms->NumUniforms; i++) {
+      struct gl_uniform *uniform = shader_program->Uniforms->Uniforms + i;
+      int parameter_index = -1;
+
+      switch (shader->Type) {
+      case GL_VERTEX_SHADER:
+	 parameter_index = uniform->VertPos;
+	 break;
+      case GL_FRAGMENT_SHADER:
+	 parameter_index = uniform->FragPos;
+	 break;
+      case GL_GEOMETRY_SHADER:
+	 parameter_index = uniform->GeomPos;
+	 break;
+      }
+
+      /* Only add uniforms used in our target. */
+      if (parameter_index != -1) {
+	 sorted_uniforms[num_uniforms].pos = parameter_index;
+	 sorted_uniforms[num_uniforms].u = uniform;
+	 num_uniforms++;
+      }
+   }
+
+   qsort(sorted_uniforms, num_uniforms, sizeof(struct uniform_sort),
+	 sort_uniforms);
+
+   for (i = 0; i < num_uniforms; i++) {
+      struct gl_uniform *uniform = sorted_uniforms[i].u;
+      int parameter_index = sorted_uniforms[i].pos;
+      const glsl_type *type = uniform->Type;
+      unsigned int size;
+
+      if (type->is_vector() ||
+	  type->is_scalar()) {
+	 size = type->vector_elements;
+      } else {
+	 size = type_size(type) * 4;
+      }
+
+      gl_register_file file;
+      if (type->is_sampler() ||
+	  (type->is_array() && type->fields.array->is_sampler())) {
+	 file = PROGRAM_SAMPLER;
+      } else {
+	 file = PROGRAM_UNIFORM;
+      }
+
+      GLint index = _mesa_lookup_parameter_index(prog->Parameters, -1,
+						 uniform->Name);
+
+      if (index < 0) {
+	 index = _mesa_add_parameter(prog->Parameters, file,
+				     uniform->Name, size, type->gl_type,
+				     NULL, NULL, 0x0);
+
+	 /* Sampler uniform values are stored in prog->SamplerUnits,
+	  * and the entry in that array is selected by this index we
+	  * store in ParameterValues[].
+	  */
+	 if (file == PROGRAM_SAMPLER) {
+	    for (unsigned int j = 0; j < size / 4; j++)
+	       prog->Parameters->ParameterValues[index + j][0] = next_sampler++;
+	 }
+
+	 /* The location chosen in the Parameters list here (returned
+	  * from _mesa_add_uniform) has to match what the linker chose.
+	  */
+	 if (index != parameter_index) {
+	    fail_link(shader_program, "Allocation of uniform `%s' to target "
+		      "failed (%d vs %d)\n",
+		      uniform->Name, index, parameter_index);
+	 }
+      }
+   }
+
+   ralloc_free(sorted_uniforms);
+}
+
+static void
+set_uniform_initializer(struct gl_context *ctx, void *mem_ctx,
+			struct gl_shader_program *shader_program,
+			const char *name, const glsl_type *type,
+			ir_constant *val)
+{
+   if (type->is_record()) {
+      ir_constant *field_constant;
+
+      field_constant = (ir_constant *)val->components.get_head();
+
+      for (unsigned int i = 0; i < type->length; i++) {
+	 const glsl_type *field_type = type->fields.structure[i].type;
+	 const char *field_name = ralloc_asprintf(mem_ctx, "%s.%s", name,
+					    type->fields.structure[i].name);
+	 set_uniform_initializer(ctx, mem_ctx, shader_program, field_name,
+				 field_type, field_constant);
+	 field_constant = (ir_constant *)field_constant->next;
+      }
+      return;
+   }
+
+   int loc = _mesa_get_uniform_location(ctx, shader_program, name);
+
+   if (loc == -1) {
+      fail_link(shader_program,
+		"Couldn't find uniform for initializer %s\n", name);
+      return;
+   }
+
+   for (unsigned int i = 0; i < (type->is_array() ? type->length : 1); i++) {
+      ir_constant *element;
+      const glsl_type *element_type;
+      if (type->is_array()) {
+	 element = val->array_elements[i];
+	 element_type = type->fields.array;
+      } else {
+	 element = val;
+	 element_type = type;
+      }
+
+      void *values;
+
+      if (element_type->base_type == GLSL_TYPE_BOOL) {
+	 int *conv = ralloc_array(mem_ctx, int, element_type->components());
+	 for (unsigned int j = 0; j < element_type->components(); j++) {
+	    conv[j] = element->value.b[j];
+	 }
+	 values = (void *)conv;
+	 element_type = glsl_type::get_instance(GLSL_TYPE_INT,
+						element_type->vector_elements,
+						1);
+      } else {
+	 values = &element->value;
+      }
+
+      if (element_type->is_matrix()) {
+	 _mesa_uniform_matrix(ctx, shader_program,
+			      element_type->matrix_columns,
+			      element_type->vector_elements,
+			      loc, 1, GL_FALSE, (GLfloat *)values);
+	 loc += element_type->matrix_columns;
+      } else {
+	 _mesa_uniform(ctx, shader_program, loc, element_type->matrix_columns,
+		       values, element_type->gl_type);
+	 loc += type_size(element_type);
+      }
+   }
+}
+
+static void
+set_uniform_initializers(struct gl_context *ctx,
+			 struct gl_shader_program *shader_program)
+{
+   void *mem_ctx = NULL;
+
+   for (unsigned int i = 0; i < MESA_SHADER_TYPES; i++) {
+      struct gl_shader *shader = shader_program->_LinkedShaders[i];
+
+      if (shader == NULL)
+	 continue;
+
+      foreach_iter(exec_list_iterator, iter, *shader->ir) {
+	 ir_instruction *ir = (ir_instruction *)iter.get();
+	 ir_variable *var = ir->as_variable();
+
+	 if (!var || var->mode != ir_var_uniform || !var->constant_value)
+	    continue;
+
+	 if (!mem_ctx)
+	    mem_ctx = ralloc_context(NULL);
+
+	 set_uniform_initializer(ctx, mem_ctx, shader_program, var->name,
+				 var->type, var->constant_value);
+      }
+   }
+
+   ralloc_free(mem_ctx);
+}
+
+/*
+ * On a basic block basis, tracks available PROGRAM_TEMPORARY register
+ * channels for copy propagation and updates following instructions to
+ * use the original versions.
+ *
+ * The ir_to_mesa_visitor lazily produces code assuming that this pass
+ * will occur.  As an example, a TXP production before this pass:
+ *
+ * 0: MOV TEMP[1], INPUT[4].xyyy;
+ * 1: MOV TEMP[1].w, INPUT[4].wwww;
+ * 2: TXP TEMP[2], TEMP[1], texture[0], 2D;
+ *
+ * and after:
+ *
+ * 0: MOV TEMP[1], INPUT[4].xyyy;
+ * 1: MOV TEMP[1].w, INPUT[4].wwww;
+ * 2: TXP TEMP[2], INPUT[4].xyyw, texture[0], 2D;
+ *
+ * which allows for dead code elimination on TEMP[1]'s writes.
+ */
+void
+ir_to_mesa_visitor::copy_propagate(void)
+{
+   ir_to_mesa_instruction **acp = rzalloc_array(mem_ctx,
+						    ir_to_mesa_instruction *,
+						    this->next_temp * 4);
+   int *acp_level = rzalloc_array(mem_ctx, int, this->next_temp * 4);
+   int level = 0;
+
+   foreach_iter(exec_list_iterator, iter, this->instructions) {
+      ir_to_mesa_instruction *inst = (ir_to_mesa_instruction *)iter.get();
+
+      assert(inst->dst_reg.file != PROGRAM_TEMPORARY
+	     || inst->dst_reg.index < this->next_temp);
+
+      /* First, do any copy propagation possible into the src regs. */
+      for (int r = 0; r < 3; r++) {
+	 ir_to_mesa_instruction *first = NULL;
+	 bool good = true;
+	 int acp_base = inst->src_reg[r].index * 4;
+
+	 if (inst->src_reg[r].file != PROGRAM_TEMPORARY ||
+	     inst->src_reg[r].reladdr)
+	    continue;
+
+	 /* See if we can find entries in the ACP consisting of MOVs
+	  * from the same src register for all the swizzled channels
+	  * of this src register reference.
+	  */
+	 for (int i = 0; i < 4; i++) {
+	    int src_chan = GET_SWZ(inst->src_reg[r].swizzle, i);
+	    ir_to_mesa_instruction *copy_chan = acp[acp_base + src_chan];
+
+	    if (!copy_chan) {
+	       good = false;
+	       break;
+	    }
+
+	    assert(acp_level[acp_base + src_chan] <= level);
+
+	    if (!first) {
+	       first = copy_chan;
+	    } else {
+	       if (first->src_reg[0].file != copy_chan->src_reg[0].file ||
+		   first->src_reg[0].index != copy_chan->src_reg[0].index) {
+		  good = false;
+		  break;
+	       }
+	    }
+	 }
+
+	 if (good) {
+	    /* We've now validated that we can copy-propagate to
+	     * replace this src register reference.  Do it.
+	     */
+	    inst->src_reg[r].file = first->src_reg[0].file;
+	    inst->src_reg[r].index = first->src_reg[0].index;
+
+	    int swizzle = 0;
+	    for (int i = 0; i < 4; i++) {
+	       int src_chan = GET_SWZ(inst->src_reg[r].swizzle, i);
+	       ir_to_mesa_instruction *copy_inst = acp[acp_base + src_chan];
+	       swizzle |= (GET_SWZ(copy_inst->src_reg[0].swizzle, src_chan) <<
+			   (3 * i));
+	    }
+	    inst->src_reg[r].swizzle = swizzle;
+	 }
+      }
+
+      switch (inst->op) {
+      case OPCODE_BGNLOOP:
+      case OPCODE_ENDLOOP:
+	 /* End of a basic block, clear the ACP entirely. */
+	 memset(acp, 0, sizeof(*acp) * this->next_temp * 4);
+	 break;
+
+      case OPCODE_IF:
+	 ++level;
+	 break;
+
+      case OPCODE_ENDIF:
+      case OPCODE_ELSE:
+	 /* Clear all channels written inside the block from the ACP, but
+	  * leaving those that were not touched.
+	  */
+	 for (int r = 0; r < this->next_temp; r++) {
+	    for (int c = 0; c < 4; c++) {
+	       if (!acp[4 * r + c])
+		  continue;
+
+	       if (acp_level[4 * r + c] >= level)
+		  acp[4 * r + c] = NULL;
+	    }
+	 }
+	 if (inst->op == OPCODE_ENDIF)
+	    --level;
+	 break;
+
+      default:
+	 /* Continuing the block, clear any written channels from
+	  * the ACP.
+	  */
+	 if (inst->dst_reg.file == PROGRAM_TEMPORARY && inst->dst_reg.reladdr) {
+	    /* Any temporary might be written, so no copy propagation
+	     * across this instruction.
+	     */
+	    memset(acp, 0, sizeof(*acp) * this->next_temp * 4);
+	 } else if (inst->dst_reg.file == PROGRAM_OUTPUT &&
+		    inst->dst_reg.reladdr) {
+	    /* Any output might be written, so no copy propagation
+	     * from outputs across this instruction.
+	     */
+	    for (int r = 0; r < this->next_temp; r++) {
+	       for (int c = 0; c < 4; c++) {
+		  if (!acp[4 * r + c])
+		     continue;
+
+		  if (acp[4 * r + c]->src_reg[0].file == PROGRAM_OUTPUT)
+		     acp[4 * r + c] = NULL;
+	       }
+	    }
+	 } else if (inst->dst_reg.file == PROGRAM_TEMPORARY ||
+		    inst->dst_reg.file == PROGRAM_OUTPUT) {
+	    /* Clear where it's used as dst. */
+	    if (inst->dst_reg.file == PROGRAM_TEMPORARY) {
+	       for (int c = 0; c < 4; c++) {
+		  if (inst->dst_reg.writemask & (1 << c)) {
+		     acp[4 * inst->dst_reg.index + c] = NULL;
+		  }
+	       }
+	    }
+
+	    /* Clear where it's used as src. */
+	    for (int r = 0; r < this->next_temp; r++) {
+	       for (int c = 0; c < 4; c++) {
+		  if (!acp[4 * r + c])
+		     continue;
+
+		  int src_chan = GET_SWZ(acp[4 * r + c]->src_reg[0].swizzle, c);
+
+		  if (acp[4 * r + c]->src_reg[0].file == inst->dst_reg.file &&
+		      acp[4 * r + c]->src_reg[0].index == inst->dst_reg.index &&
+		      inst->dst_reg.writemask & (1 << src_chan))
+		  {
+		     acp[4 * r + c] = NULL;
+		  }
+	       }
+	    }
+	 }
+	 break;
+      }
+
+      /* If this is a copy, add it to the ACP. */
+      if (inst->op == OPCODE_MOV &&
+	  inst->dst_reg.file == PROGRAM_TEMPORARY &&
+	  !inst->dst_reg.reladdr &&
+	  !inst->saturate &&
+	  !inst->src_reg[0].reladdr &&
+	  !inst->src_reg[0].negate) {
+	 for (int i = 0; i < 4; i++) {
+	    if (inst->dst_reg.writemask & (1 << i)) {
+	       acp[4 * inst->dst_reg.index + i] = inst;
+	       acp_level[4 * inst->dst_reg.index + i] = level;
+	    }
+	 }
+      }
+   }
+
+   ralloc_free(acp_level);
+   ralloc_free(acp);
+}
+
+
+/**
+ * Convert a shader's GLSL IR into a Mesa gl_program.
+ */
+static struct gl_program *
+get_mesa_program(struct gl_context *ctx,
+                 struct gl_shader_program *shader_program,
+		 struct gl_shader *shader)
+{
+   ir_to_mesa_visitor v;
+   struct prog_instruction *mesa_instructions, *mesa_inst;
+   ir_instruction **mesa_instruction_annotation;
+   int i;
+   struct gl_program *prog;
+   GLenum target;
+   const char *target_string;
+   GLboolean progress;
+   struct gl_shader_compiler_options *options =
+         &ctx->ShaderCompilerOptions[_mesa_shader_type_to_index(shader->Type)];
+
+   switch (shader->Type) {
+   case GL_VERTEX_SHADER:
+      target = GL_VERTEX_PROGRAM_ARB;
+      target_string = "vertex";
+      break;
+   case GL_FRAGMENT_SHADER:
+      target = GL_FRAGMENT_PROGRAM_ARB;
+      target_string = "fragment";
+      break;
+   case GL_GEOMETRY_SHADER:
+      target = GL_GEOMETRY_PROGRAM_NV;
+      target_string = "geometry";
+      break;
+   default:
+      assert(!"should not be reached");
+      return NULL;
+   }
+
+   validate_ir_tree(shader->ir);
+
+   prog = ctx->Driver.NewProgram(ctx, target, shader_program->Name);
+   if (!prog)
+      return NULL;
+   prog->Parameters = _mesa_new_parameter_list();
+   prog->Varying = _mesa_new_parameter_list();
+   prog->Attributes = _mesa_new_parameter_list();
+   v.ctx = ctx;
+   v.prog = prog;
+   v.shader_program = shader_program;
+   v.options = options;
+
+   add_uniforms_to_parameters_list(shader_program, shader, prog);
+
+   /* Emit Mesa IR for main(). */
+   visit_exec_list(shader->ir, &v);
+   v.ir_to_mesa_emit_op0(NULL, OPCODE_END);
+
+   /* Now emit bodies for any functions that were used. */
+   do {
+      progress = GL_FALSE;
+
+      foreach_iter(exec_list_iterator, iter, v.function_signatures) {
+	 function_entry *entry = (function_entry *)iter.get();
+
+	 if (!entry->bgn_inst) {
+	    v.current_function = entry;
+
+	    entry->bgn_inst = v.ir_to_mesa_emit_op0(NULL, OPCODE_BGNSUB);
+	    entry->bgn_inst->function = entry;
+
+	    visit_exec_list(&entry->sig->body, &v);
+
+	    ir_to_mesa_instruction *last;
+	    last = (ir_to_mesa_instruction *)v.instructions.get_tail();
+	    if (last->op != OPCODE_RET)
+	       v.ir_to_mesa_emit_op0(NULL, OPCODE_RET);
+
+	    ir_to_mesa_instruction *end;
+	    end = v.ir_to_mesa_emit_op0(NULL, OPCODE_ENDSUB);
+	    end->function = entry;
+
+	    progress = GL_TRUE;
+	 }
+      }
+   } while (progress);
+
+   prog->NumTemporaries = v.next_temp;
+
+   int num_instructions = 0;
+   foreach_iter(exec_list_iterator, iter, v.instructions) {
+      num_instructions++;
+   }
+
+   mesa_instructions =
+      (struct prog_instruction *)calloc(num_instructions,
+					sizeof(*mesa_instructions));
+   mesa_instruction_annotation = ralloc_array(v.mem_ctx, ir_instruction *,
+					      num_instructions);
+
+   v.copy_propagate();
+
+   /* Convert ir_mesa_instructions into prog_instructions.
+    */
+   mesa_inst = mesa_instructions;
+   i = 0;
+   foreach_iter(exec_list_iterator, iter, v.instructions) {
+      const ir_to_mesa_instruction *inst = (ir_to_mesa_instruction *)iter.get();
+
+      mesa_inst->Opcode = inst->op;
+      mesa_inst->CondUpdate = inst->cond_update;
+      if (inst->saturate)
+	 mesa_inst->SaturateMode = SATURATE_ZERO_ONE;
+      mesa_inst->DstReg.File = inst->dst_reg.file;
+      mesa_inst->DstReg.Index = inst->dst_reg.index;
+      mesa_inst->DstReg.CondMask = inst->dst_reg.cond_mask;
+      mesa_inst->DstReg.WriteMask = inst->dst_reg.writemask;
+      mesa_inst->DstReg.RelAddr = inst->dst_reg.reladdr != NULL;
+      mesa_inst->SrcReg[0] = mesa_src_reg_from_ir_src_reg(inst->src_reg[0]);
+      mesa_inst->SrcReg[1] = mesa_src_reg_from_ir_src_reg(inst->src_reg[1]);
+      mesa_inst->SrcReg[2] = mesa_src_reg_from_ir_src_reg(inst->src_reg[2]);
+      mesa_inst->TexSrcUnit = inst->sampler;
+      mesa_inst->TexSrcTarget = inst->tex_target;
+      mesa_inst->TexShadow = inst->tex_shadow;
+      mesa_instruction_annotation[i] = inst->ir;
+
+      /* Set IndirectRegisterFiles. */
+      if (mesa_inst->DstReg.RelAddr)
+         prog->IndirectRegisterFiles |= 1 << mesa_inst->DstReg.File;
+
+      /* Update program's bitmask of indirectly accessed register files */
+      for (unsigned src = 0; src < 3; src++)
+         if (mesa_inst->SrcReg[src].RelAddr)
+            prog->IndirectRegisterFiles |= 1 << mesa_inst->SrcReg[src].File;
+
+      if (options->EmitNoIfs && mesa_inst->Opcode == OPCODE_IF) {
+	 fail_link(shader_program, "Couldn't flatten if statement\n");
+      }
+
+      switch (mesa_inst->Opcode) {
+      case OPCODE_BGNSUB:
+	 inst->function->inst = i;
+	 mesa_inst->Comment = strdup(inst->function->sig->function_name());
+	 break;
+      case OPCODE_ENDSUB:
+	 mesa_inst->Comment = strdup(inst->function->sig->function_name());
+	 break;
+      case OPCODE_CAL:
+	 mesa_inst->BranchTarget = inst->function->sig_id; /* rewritten later */
+	 break;
+      case OPCODE_ARL:
+	 prog->NumAddressRegs = 1;
+	 break;
+      default:
+	 break;
+      }
+
+      mesa_inst++;
+      i++;
+
+      if (!shader_program->LinkStatus)
+         break;
+   }
+
+   if (!shader_program->LinkStatus) {
+      free(mesa_instructions);
+      _mesa_reference_program(ctx, &shader->Program, NULL);
+      return NULL;
+   }
+
+   set_branchtargets(&v, mesa_instructions, num_instructions);
+
+   if (ctx->Shader.Flags & GLSL_DUMP) {
+      printf("\n");
+      printf("GLSL IR for linked %s program %d:\n", target_string,
+	     shader_program->Name);
+      _mesa_print_ir(shader->ir, NULL);
+      printf("\n");
+      printf("\n");
+      printf("Mesa IR for linked %s program %d:\n", target_string,
+	     shader_program->Name);
+      print_program(mesa_instructions, mesa_instruction_annotation,
+		    num_instructions);
+   }
+
+   prog->Instructions = mesa_instructions;
+   prog->NumInstructions = num_instructions;
+
+   do_set_program_inouts(shader->ir, prog);
+   count_resources(prog);
+
+   check_resources(ctx, shader_program, prog);
+
+   _mesa_reference_program(ctx, &shader->Program, prog);
+
+   if ((ctx->Shader.Flags & GLSL_NO_OPT) == 0) {
+      _mesa_optimize_program(ctx, prog);
+   }
+
+   return prog;
+}
+
+extern "C" {
+
+/**
+ * Link a shader.
+ * Called via ctx->Driver.LinkShader()
+ * This actually involves converting GLSL IR into Mesa gl_programs with
+ * code lowering and other optimizations.
+ */
+GLboolean
+_mesa_ir_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
+{
+   assert(prog->LinkStatus);
+
+   for (unsigned i = 0; i < MESA_SHADER_TYPES; i++) {
+      if (prog->_LinkedShaders[i] == NULL)
+	 continue;
+
+      bool progress;
+      exec_list *ir = prog->_LinkedShaders[i]->ir;
+      const struct gl_shader_compiler_options *options =
+            &ctx->ShaderCompilerOptions[_mesa_shader_type_to_index(prog->_LinkedShaders[i]->Type)];
+
+      do {
+	 progress = false;
+
+	 /* Lowering */
+	 do_mat_op_to_vec(ir);
+	 lower_instructions(ir, (MOD_TO_FRACT | DIV_TO_MUL_RCP | EXP_TO_EXP2
+				 | LOG_TO_LOG2
+				 | ((options->EmitNoPow) ? POW_TO_EXP2 : 0)));
+
+	 progress = do_lower_jumps(ir, true, true, options->EmitNoMainReturn, options->EmitNoCont, options->EmitNoLoops) || progress;
+
+	 progress = do_common_optimization(ir, true, options->MaxUnrollIterations) || progress;
+
+	 progress = lower_quadop_vector(ir, true) || progress;
+
+	 if (options->EmitNoIfs) {
+	    progress = lower_discard(ir) || progress;
+	    progress = lower_if_to_cond_assign(ir) || progress;
+	 }
+
+	 if (options->EmitNoNoise)
+	    progress = lower_noise(ir) || progress;
+
+	 /* If there are forms of indirect addressing that the driver
+	  * cannot handle, perform the lowering pass.
+	  */
+	 if (options->EmitNoIndirectInput || options->EmitNoIndirectOutput
+	     || options->EmitNoIndirectTemp || options->EmitNoIndirectUniform)
+	   progress =
+	     lower_variable_index_to_cond_assign(ir,
+						 options->EmitNoIndirectInput,
+						 options->EmitNoIndirectOutput,
+						 options->EmitNoIndirectTemp,
+						 options->EmitNoIndirectUniform)
+	     || progress;
+
+	 progress = do_vec_index_to_cond_assign(ir) || progress;
+      } while (progress);
+
+      validate_ir_tree(ir);
+   }
+
+   for (unsigned i = 0; i < MESA_SHADER_TYPES; i++) {
+      struct gl_program *linked_prog;
+
+      if (prog->_LinkedShaders[i] == NULL)
+	 continue;
+
+      linked_prog = get_mesa_program(ctx, prog, prog->_LinkedShaders[i]);
+
+      if (linked_prog) {
+         bool ok = true;
+
+         switch (prog->_LinkedShaders[i]->Type) {
+         case GL_VERTEX_SHADER:
+            _mesa_reference_vertprog(ctx, &prog->VertexProgram,
+                                     (struct gl_vertex_program *)linked_prog);
+            ok = ctx->Driver.ProgramStringNotify(ctx, GL_VERTEX_PROGRAM_ARB,
+                                                 linked_prog);
+            break;
+         case GL_FRAGMENT_SHADER:
+            _mesa_reference_fragprog(ctx, &prog->FragmentProgram,
+                                     (struct gl_fragment_program *)linked_prog);
+            ok = ctx->Driver.ProgramStringNotify(ctx, GL_FRAGMENT_PROGRAM_ARB,
+                                                 linked_prog);
+            break;
+         case GL_GEOMETRY_SHADER:
+            _mesa_reference_geomprog(ctx, &prog->GeometryProgram,
+                                     (struct gl_geometry_program *)linked_prog);
+            ok = ctx->Driver.ProgramStringNotify(ctx, GL_GEOMETRY_PROGRAM_NV,
+                                                 linked_prog);
+            break;
+         }
+         if (!ok) {
+            return GL_FALSE;
+         }
+      }
+
+      _mesa_reference_program(ctx, &linked_prog, NULL);
+   }
+
+   return GL_TRUE;
+}
+
+
+/**
+ * Compile a GLSL shader.  Called via glCompileShader().
+ */
+void
+_mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader)
+{
+   struct _mesa_glsl_parse_state *state =
+      new(shader) _mesa_glsl_parse_state(ctx, shader->Type, shader);
+
+   const char *source = shader->Source;
+   /* Check if the user called glCompileShader without first calling
+    * glShaderSource.  This should fail to compile, but not raise a GL_ERROR.
+    */
+   if (source == NULL) {
+      shader->CompileStatus = GL_FALSE;
+      return;
+   }
+
+   state->error = preprocess(state, &source, &state->info_log,
+			     &ctx->Extensions, ctx->API);
+
+   if (ctx->Shader.Flags & GLSL_DUMP) {
+      printf("GLSL source for shader %d:\n", shader->Name);
+      printf("%s\n", shader->Source);
+   }
+
+   if (!state->error) {
+     _mesa_glsl_lexer_ctor(state, source);
+     _mesa_glsl_parse(state);
+     _mesa_glsl_lexer_dtor(state);
+   }
+
+   ralloc_free(shader->ir);
+   shader->ir = new(shader) exec_list;
+   if (!state->error && !state->translation_unit.is_empty())
+      _mesa_ast_to_hir(shader->ir, state);
+
+   if (!state->error && !shader->ir->is_empty()) {
+      validate_ir_tree(shader->ir);
+
+      /* Do some optimization at compile time to reduce shader IR size
+       * and reduce later work if the same shader is linked multiple times
+       */
+      while (do_common_optimization(shader->ir, false, 32))
+	 ;
+
+      validate_ir_tree(shader->ir);
+   }
+
+   shader->symbols = state->symbols;
+
+   shader->CompileStatus = !state->error;
+   shader->InfoLog = state->info_log;
+   shader->Version = state->language_version;
+   memcpy(shader->builtins_to_link, state->builtins_to_link,
+	  sizeof(shader->builtins_to_link[0]) * state->num_builtins_to_link);
+   shader->num_builtins_to_link = state->num_builtins_to_link;
+
+   if (ctx->Shader.Flags & GLSL_LOG) {
+      _mesa_write_shader_to_file(shader);
+   }
+
+   if (ctx->Shader.Flags & GLSL_DUMP) {
+      if (shader->CompileStatus) {
+	 printf("GLSL IR for shader %d:\n", shader->Name);
+	 _mesa_print_ir(shader->ir, NULL);
+	 printf("\n\n");
+      } else {
+	 printf("GLSL shader %d failed to compile.\n", shader->Name);
+      }
+      if (shader->InfoLog && shader->InfoLog[0] != 0) {
+	 printf("GLSL shader %d info log:\n", shader->Name);
+	 printf("%s\n", shader->InfoLog);
+      }
+   }
+
+   /* Retain any live IR, but trash the rest. */
+   reparent_ir(shader->ir, shader->ir);
+
+   ralloc_free(state);
+}
+
+
+/**
+ * Link a GLSL shader program.  Called via glLinkProgram().
+ */
+void
+_mesa_glsl_link_shader(struct gl_context *ctx, struct gl_shader_program *prog)
+{
+   unsigned int i;
+
+   _mesa_clear_shader_program_data(ctx, prog);
+
+   prog->LinkStatus = GL_TRUE;
+
+   for (i = 0; i < prog->NumShaders; i++) {
+      if (!prog->Shaders[i]->CompileStatus) {
+	 fail_link(prog, "linking with uncompiled shader");
+	 prog->LinkStatus = GL_FALSE;
+      }
+   }
+
+   prog->Varying = _mesa_new_parameter_list();
+   _mesa_reference_vertprog(ctx, &prog->VertexProgram, NULL);
+   _mesa_reference_fragprog(ctx, &prog->FragmentProgram, NULL);
+   _mesa_reference_geomprog(ctx, &prog->GeometryProgram, NULL);
+
+   if (prog->LinkStatus) {
+      link_shaders(ctx, prog);
+   }
+
+   if (prog->LinkStatus) {
+      if (!ctx->Driver.LinkShader(ctx, prog)) {
+	 prog->LinkStatus = GL_FALSE;
+      }
+   }
+
+   set_uniform_initializers(ctx, prog);
+
+   if (ctx->Shader.Flags & GLSL_DUMP) {
+      if (!prog->LinkStatus) {
+	 printf("GLSL shader program %d failed to link\n", prog->Name);
+      }
+
+      if (prog->InfoLog && prog->InfoLog[0] != 0) {
+	 printf("GLSL shader program %d info log:\n", prog->Name);
+	 printf("%s\n", prog->InfoLog);
+      }
+   }
+}
+
+} /* extern "C" */
diff --git a/mesalib/src/mesa/program/prog_statevars.c b/mesalib/src/mesa/program/prog_statevars.c
index df3c76d18..384aa2cb2 100644
--- a/mesalib/src/mesa/program/prog_statevars.c
+++ b/mesalib/src/mesa/program/prog_statevars.c
@@ -1,1182 +1,1208 @@
-/*
- * Mesa 3-D graphics library
- * Version:  7.1
- *
- * Copyright (C) 1999-2007  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"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/**
- * \file prog_statevars.c
- * Program state variable management.
- * \author Brian Paul
- */
-
-
-#include "main/glheader.h"
-#include "main/context.h"
-#include "main/imports.h"
-#include "main/macros.h"
-#include "main/mtypes.h"
-#include "prog_statevars.h"
-#include "prog_parameter.h"
-
-
-/**
- * Use the list of tokens in the state[] array to find global GL state
- * and return it in <value>.  Usually, four values are returned in <value>
- * but matrix queries may return as many as 16 values.
- * This function is used for ARB vertex/fragment programs.
- * The program parser will produce the state[] values.
- */
-static void
-_mesa_fetch_state(struct gl_context *ctx, const gl_state_index state[],
-                  GLfloat *value)
-{
-   switch (state[0]) {
-   case STATE_MATERIAL:
-      {
-         /* state[1] is either 0=front or 1=back side */
-         const GLuint face = (GLuint) state[1];
-         const struct gl_material *mat = &ctx->Light.Material;
-         ASSERT(face == 0 || face == 1);
-         /* we rely on tokens numbered so that _BACK_ == _FRONT_+ 1 */
-         ASSERT(MAT_ATTRIB_FRONT_AMBIENT + 1 == MAT_ATTRIB_BACK_AMBIENT);
-         /* XXX we could get rid of this switch entirely with a little
-          * work in arbprogparse.c's parse_state_single_item().
-          */
-         /* state[2] is the material attribute */
-         switch (state[2]) {
-         case STATE_AMBIENT:
-            COPY_4V(value, mat->Attrib[MAT_ATTRIB_FRONT_AMBIENT + face]);
-            return;
-         case STATE_DIFFUSE:
-            COPY_4V(value, mat->Attrib[MAT_ATTRIB_FRONT_DIFFUSE + face]);
-            return;
-         case STATE_SPECULAR:
-            COPY_4V(value, mat->Attrib[MAT_ATTRIB_FRONT_SPECULAR + face]);
-            return;
-         case STATE_EMISSION:
-            COPY_4V(value, mat->Attrib[MAT_ATTRIB_FRONT_EMISSION + face]);
-            return;
-         case STATE_SHININESS:
-            value[0] = mat->Attrib[MAT_ATTRIB_FRONT_SHININESS + face][0];
-            value[1] = 0.0F;
-            value[2] = 0.0F;
-            value[3] = 1.0F;
-            return;
-         default:
-            _mesa_problem(ctx, "Invalid material state in fetch_state");
-            return;
-         }
-      }
-   case STATE_LIGHT:
-      {
-         /* state[1] is the light number */
-         const GLuint ln = (GLuint) state[1];
-         /* state[2] is the light attribute */
-         switch (state[2]) {
-         case STATE_AMBIENT:
-            COPY_4V(value, ctx->Light.Light[ln].Ambient);
-            return;
-         case STATE_DIFFUSE:
-            COPY_4V(value, ctx->Light.Light[ln].Diffuse);
-            return;
-         case STATE_SPECULAR:
-            COPY_4V(value, ctx->Light.Light[ln].Specular);
-            return;
-         case STATE_POSITION:
-            COPY_4V(value, ctx->Light.Light[ln].EyePosition);
-            return;
-         case STATE_ATTENUATION:
-            value[0] = ctx->Light.Light[ln].ConstantAttenuation;
-            value[1] = ctx->Light.Light[ln].LinearAttenuation;
-            value[2] = ctx->Light.Light[ln].QuadraticAttenuation;
-            value[3] = ctx->Light.Light[ln].SpotExponent;
-            return;
-         case STATE_SPOT_DIRECTION:
-            COPY_3V(value, ctx->Light.Light[ln].SpotDirection);
-            value[3] = ctx->Light.Light[ln]._CosCutoff;
-            return;
-         case STATE_SPOT_CUTOFF:
-            value[0] = ctx->Light.Light[ln].SpotCutoff;
-            return;
-         case STATE_HALF_VECTOR:
-            {
-               static const GLfloat eye_z[] = {0, 0, 1};
-               GLfloat p[3];
-               /* Compute infinite half angle vector:
-                *   halfVector = normalize(normalize(lightPos) + (0, 0, 1))
-		* light.EyePosition.w should be 0 for infinite lights.
-                */
-               COPY_3V(p, ctx->Light.Light[ln].EyePosition);
-               NORMALIZE_3FV(p);
-	       ADD_3V(value, p, eye_z);
-	       NORMALIZE_3FV(value);
-	       value[3] = 1.0;
-            }
-            return;
-         default:
-            _mesa_problem(ctx, "Invalid light state in fetch_state");
-            return;
-         }
-      }
-   case STATE_LIGHTMODEL_AMBIENT:
-      COPY_4V(value, ctx->Light.Model.Ambient);
-      return;
-   case STATE_LIGHTMODEL_SCENECOLOR:
-      if (state[1] == 0) {
-         /* front */
-         GLint i;
-         for (i = 0; i < 3; i++) {
-            value[i] = ctx->Light.Model.Ambient[i]
-               * ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT][i]
-               + ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_EMISSION][i];
-         }
-	 value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3];
-      }
-      else {
-         /* back */
-         GLint i;
-         for (i = 0; i < 3; i++) {
-            value[i] = ctx->Light.Model.Ambient[i]
-               * ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_AMBIENT][i]
-               + ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_EMISSION][i];
-         }
-	 value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3];
-      }
-      return;
-   case STATE_LIGHTPROD:
-      {
-         const GLuint ln = (GLuint) state[1];
-         const GLuint face = (GLuint) state[2];
-         GLint i;
-         ASSERT(face == 0 || face == 1);
-         switch (state[3]) {
-            case STATE_AMBIENT:
-               for (i = 0; i < 3; i++) {
-                  value[i] = ctx->Light.Light[ln].Ambient[i] *
-                     ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT+face][i];
-               }
-               /* [3] = material alpha */
-               value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT+face][3];
-               return;
-            case STATE_DIFFUSE:
-               for (i = 0; i < 3; i++) {
-                  value[i] = ctx->Light.Light[ln].Diffuse[i] *
-                     ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE+face][i];
-               }
-               /* [3] = material alpha */
-               value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE+face][3];
-               return;
-            case STATE_SPECULAR:
-               for (i = 0; i < 3; i++) {
-                  value[i] = ctx->Light.Light[ln].Specular[i] *
-                     ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_SPECULAR+face][i];
-               }
-               /* [3] = material alpha */
-               value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_SPECULAR+face][3];
-               return;
-            default:
-               _mesa_problem(ctx, "Invalid lightprod state in fetch_state");
-               return;
-         }
-      }
-   case STATE_TEXGEN:
-      {
-         /* state[1] is the texture unit */
-         const GLuint unit = (GLuint) state[1];
-         /* state[2] is the texgen attribute */
-         switch (state[2]) {
-         case STATE_TEXGEN_EYE_S:
-            COPY_4V(value, ctx->Texture.Unit[unit].GenS.EyePlane);
-            return;
-         case STATE_TEXGEN_EYE_T:
-            COPY_4V(value, ctx->Texture.Unit[unit].GenT.EyePlane);
-            return;
-         case STATE_TEXGEN_EYE_R:
-            COPY_4V(value, ctx->Texture.Unit[unit].GenR.EyePlane);
-            return;
-         case STATE_TEXGEN_EYE_Q:
-            COPY_4V(value, ctx->Texture.Unit[unit].GenQ.EyePlane);
-            return;
-         case STATE_TEXGEN_OBJECT_S:
-            COPY_4V(value, ctx->Texture.Unit[unit].GenS.ObjectPlane);
-            return;
-         case STATE_TEXGEN_OBJECT_T:
-            COPY_4V(value, ctx->Texture.Unit[unit].GenT.ObjectPlane);
-            return;
-         case STATE_TEXGEN_OBJECT_R:
-            COPY_4V(value, ctx->Texture.Unit[unit].GenR.ObjectPlane);
-            return;
-         case STATE_TEXGEN_OBJECT_Q:
-            COPY_4V(value, ctx->Texture.Unit[unit].GenQ.ObjectPlane);
-            return;
-         default:
-            _mesa_problem(ctx, "Invalid texgen state in fetch_state");
-            return;
-         }
-      }
-   case STATE_TEXENV_COLOR:
-      {
-         /* state[1] is the texture unit */
-         const GLuint unit = (GLuint) state[1];
-         COPY_4V(value, ctx->Texture.Unit[unit].EnvColor);
-      }
-      return;
-   case STATE_FOG_COLOR:
-      COPY_4V(value, ctx->Fog.Color);
-      return;
-   case STATE_FOG_PARAMS:
-      value[0] = ctx->Fog.Density;
-      value[1] = ctx->Fog.Start;
-      value[2] = ctx->Fog.End;
-      value[3] = (ctx->Fog.End == ctx->Fog.Start)
-         ? 1.0f : (GLfloat)(1.0 / (ctx->Fog.End - ctx->Fog.Start));
-      return;
-   case STATE_CLIPPLANE:
-      {
-         const GLuint plane = (GLuint) state[1];
-         COPY_4V(value, ctx->Transform.EyeUserPlane[plane]);
-      }
-      return;
-   case STATE_POINT_SIZE:
-      value[0] = ctx->Point.Size;
-      value[1] = ctx->Point.MinSize;
-      value[2] = ctx->Point.MaxSize;
-      value[3] = ctx->Point.Threshold;
-      return;
-   case STATE_POINT_ATTENUATION:
-      value[0] = ctx->Point.Params[0];
-      value[1] = ctx->Point.Params[1];
-      value[2] = ctx->Point.Params[2];
-      value[3] = 1.0F;
-      return;
-   case STATE_MODELVIEW_MATRIX:
-   case STATE_PROJECTION_MATRIX:
-   case STATE_MVP_MATRIX:
-   case STATE_TEXTURE_MATRIX:
-   case STATE_PROGRAM_MATRIX:
-      {
-         /* state[0] = modelview, projection, texture, etc. */
-         /* state[1] = which texture matrix or program matrix */
-         /* state[2] = first row to fetch */
-         /* state[3] = last row to fetch */
-         /* state[4] = transpose, inverse or invtrans */
-         const GLmatrix *matrix;
-         const gl_state_index mat = state[0];
-         const GLuint index = (GLuint) state[1];
-         const GLuint firstRow = (GLuint) state[2];
-         const GLuint lastRow = (GLuint) state[3];
-         const gl_state_index modifier = state[4];
-         const GLfloat *m;
-         GLuint row, i;
-         ASSERT(firstRow >= 0);
-         ASSERT(firstRow < 4);
-         ASSERT(lastRow >= 0);
-         ASSERT(lastRow < 4);
-         if (mat == STATE_MODELVIEW_MATRIX) {
-            matrix = ctx->ModelviewMatrixStack.Top;
-         }
-         else if (mat == STATE_PROJECTION_MATRIX) {
-            matrix = ctx->ProjectionMatrixStack.Top;
-         }
-         else if (mat == STATE_MVP_MATRIX) {
-            matrix = &ctx->_ModelProjectMatrix;
-         }
-         else if (mat == STATE_TEXTURE_MATRIX) {
-            ASSERT(index < Elements(ctx->TextureMatrixStack));
-            matrix = ctx->TextureMatrixStack[index].Top;
-         }
-         else if (mat == STATE_PROGRAM_MATRIX) {
-            ASSERT(index < Elements(ctx->ProgramMatrixStack));
-            matrix = ctx->ProgramMatrixStack[index].Top;
-         }
-         else {
-            _mesa_problem(ctx, "Bad matrix name in _mesa_fetch_state()");
-            return;
-         }
-         if (modifier == STATE_MATRIX_INVERSE ||
-             modifier == STATE_MATRIX_INVTRANS) {
-            /* Be sure inverse is up to date:
-	     */
-            _math_matrix_alloc_inv( (GLmatrix *) matrix );
-	    _math_matrix_analyse( (GLmatrix*) matrix );
-            m = matrix->inv;
-         }
-         else {
-            m = matrix->m;
-         }
-         if (modifier == STATE_MATRIX_TRANSPOSE ||
-             modifier == STATE_MATRIX_INVTRANS) {
-            for (i = 0, row = firstRow; row <= lastRow; row++) {
-               value[i++] = m[row * 4 + 0];
-               value[i++] = m[row * 4 + 1];
-               value[i++] = m[row * 4 + 2];
-               value[i++] = m[row * 4 + 3];
-            }
-         }
-         else {
-            for (i = 0, row = firstRow; row <= lastRow; row++) {
-               value[i++] = m[row + 0];
-               value[i++] = m[row + 4];
-               value[i++] = m[row + 8];
-               value[i++] = m[row + 12];
-            }
-         }
-      }
-      return;
-   case STATE_DEPTH_RANGE:
-      value[0] = ctx->Viewport.Near;                     /* near       */
-      value[1] = ctx->Viewport.Far;                      /* far        */
-      value[2] = ctx->Viewport.Far - ctx->Viewport.Near; /* far - near */
-      value[3] = 1.0;
-      return;
-   case STATE_FRAGMENT_PROGRAM:
-      {
-         /* state[1] = {STATE_ENV, STATE_LOCAL} */
-         /* state[2] = parameter index          */
-         const int idx = (int) state[2];
-         switch (state[1]) {
-            case STATE_ENV:
-               COPY_4V(value, ctx->FragmentProgram.Parameters[idx]);
-               return;
-            case STATE_LOCAL:
-               COPY_4V(value, ctx->FragmentProgram.Current->Base.LocalParams[idx]);
-               return;
-            default:
-               _mesa_problem(ctx, "Bad state switch in _mesa_fetch_state()");
-               return;
-         }
-      }
-      return;
-
-   case STATE_VERTEX_PROGRAM:
-      {
-         /* state[1] = {STATE_ENV, STATE_LOCAL} */
-         /* state[2] = parameter index          */
-         const int idx = (int) state[2];
-         switch (state[1]) {
-            case STATE_ENV:
-               COPY_4V(value, ctx->VertexProgram.Parameters[idx]);
-               return;
-            case STATE_LOCAL:
-               COPY_4V(value, ctx->VertexProgram.Current->Base.LocalParams[idx]);
-               return;
-            default:
-               _mesa_problem(ctx, "Bad state switch in _mesa_fetch_state()");
-               return;
-         }
-      }
-      return;
-
-   case STATE_NORMAL_SCALE:
-      ASSIGN_4V(value, ctx->_ModelViewInvScale, 0, 0, 1);
-      return;
-
-   case STATE_INTERNAL:
-      switch (state[1]) {
-      case STATE_CURRENT_ATTRIB:
-         {
-            const GLuint idx = (GLuint) state[2];
-            COPY_4V(value, ctx->Current.Attrib[idx]);
-         }
-         return;
-
-      case STATE_NORMAL_SCALE:
-         ASSIGN_4V(value, 
-                   ctx->_ModelViewInvScale, 
-                   ctx->_ModelViewInvScale, 
-                   ctx->_ModelViewInvScale, 
-                   1);
-         return;
-
-      case STATE_TEXRECT_SCALE:
-         /* Value = { 1/texWidth, 1/texHeight, 0, 1 }.
-          * Used to convert unnormalized texcoords to normalized texcoords.
-          */
-         {
-            const int unit = (int) state[2];
-            const struct gl_texture_object *texObj
-               = ctx->Texture.Unit[unit]._Current;
-            if (texObj) {
-               struct gl_texture_image *texImage = texObj->Image[0][0];
-               ASSIGN_4V(value,
-                         (GLfloat) (1.0 / texImage->Width),
-                         (GLfloat) (1.0 / texImage->Height),
-                         0.0f, 1.0f);
-            }
-         }
-         return;
-
-      case STATE_FOG_PARAMS_OPTIMIZED:
-         /* for simpler per-vertex/pixel fog calcs. POW (for EXP/EXP2 fog)
-          * might be more expensive than EX2 on some hw, plus it needs
-          * another constant (e) anyway. Linear fog can now be done with a
-          * single MAD.
-          * linear: fogcoord * -1/(end-start) + end/(end-start)
-          * exp: 2^-(density/ln(2) * fogcoord)
-          * exp2: 2^-((density/(ln(2)^2) * fogcoord)^2)
-          */
-         value[0] = (ctx->Fog.End == ctx->Fog.Start)
-            ? 1.0f : (GLfloat)(-1.0F / (ctx->Fog.End - ctx->Fog.Start));
-         value[1] = ctx->Fog.End * -value[0];
-         value[2] = (GLfloat)(ctx->Fog.Density * ONE_DIV_LN2);
-         value[3] = (GLfloat)(ctx->Fog.Density * ONE_DIV_SQRT_LN2);
-         return;
-
-      case STATE_POINT_SIZE_CLAMPED:
-         {
-           /* this includes implementation dependent limits, to avoid
-            * another potentially necessary clamp.
-            * Note: for sprites, point smooth (point AA) is ignored
-            * and we'll clamp to MinPointSizeAA and MaxPointSize, because we
-            * expect drivers will want to say their minimum for AA size is 0.0
-            * but for non-AA it's 1.0 (because normal points with size below 1.0
-            * need to get rounded up to 1.0, hence never disappear). GL does
-            * not specify max clamp size for sprites, other than it needs to be
-            * at least as large as max AA size, hence use non-AA size there.
-            */
-            GLfloat minImplSize;
-            GLfloat maxImplSize;
-            if (ctx->Point.PointSprite) {
-               minImplSize = ctx->Const.MinPointSizeAA;
-               maxImplSize = ctx->Const.MaxPointSize;
-            }
-            else if (ctx->Point.SmoothFlag || ctx->Multisample._Enabled) {
-               minImplSize = ctx->Const.MinPointSizeAA;
-               maxImplSize = ctx->Const.MaxPointSizeAA;
-            }
-            else {
-               minImplSize = ctx->Const.MinPointSize;
-               maxImplSize = ctx->Const.MaxPointSize;
-            }
-            value[0] = ctx->Point.Size;
-            value[1] = ctx->Point.MinSize >= minImplSize ? ctx->Point.MinSize : minImplSize;
-            value[2] = ctx->Point.MaxSize <= maxImplSize ? ctx->Point.MaxSize : maxImplSize;
-            value[3] = ctx->Point.Threshold;
-         }
-         return;
-      case STATE_POINT_SIZE_IMPL_CLAMP:
-         {
-           /* for implementation clamp only in vs */
-            GLfloat minImplSize;
-            GLfloat maxImplSize;
-            if (ctx->Point.PointSprite) {
-               minImplSize = ctx->Const.MinPointSizeAA;
-               maxImplSize = ctx->Const.MaxPointSize;
-            }
-            else if (ctx->Point.SmoothFlag || ctx->Multisample._Enabled) {
-               minImplSize = ctx->Const.MinPointSizeAA;
-               maxImplSize = ctx->Const.MaxPointSizeAA;
-            }
-            else {
-               minImplSize = ctx->Const.MinPointSize;
-               maxImplSize = ctx->Const.MaxPointSize;
-            }
-            value[0] = ctx->Point.Size;
-            value[1] = minImplSize;
-            value[2] = maxImplSize;
-            value[3] = ctx->Point.Threshold;
-         }
-         return;
-      case STATE_LIGHT_SPOT_DIR_NORMALIZED:
-         {
-            /* here, state[2] is the light number */
-            /* pre-normalize spot dir */
-            const GLuint ln = (GLuint) state[2];
-            COPY_3V(value, ctx->Light.Light[ln]._NormSpotDirection);
-            value[3] = ctx->Light.Light[ln]._CosCutoff;
-         }
-         return;
-
-      case STATE_LIGHT_POSITION:
-         {
-            const GLuint ln = (GLuint) state[2];
-            COPY_4V(value, ctx->Light.Light[ln]._Position);
-         }
-         return;
-
-      case STATE_LIGHT_POSITION_NORMALIZED:
-         {
-            const GLuint ln = (GLuint) state[2];
-            COPY_4V(value, ctx->Light.Light[ln]._Position);
-            NORMALIZE_3FV( value );
-         }
-         return;
-
-      case STATE_LIGHT_HALF_VECTOR:
-         {
-            const GLuint ln = (GLuint) state[2];
-            GLfloat p[3];
-            /* Compute infinite half angle vector:
-             *   halfVector = normalize(normalize(lightPos) + (0, 0, 1))
-             * light.EyePosition.w should be 0 for infinite lights.
-             */
-            COPY_3V(p, ctx->Light.Light[ln]._Position);
-            NORMALIZE_3FV(p);
-            ADD_3V(value, p, ctx->_EyeZDir);
-            NORMALIZE_3FV(value);
-            value[3] = 1.0;
-         }
-         return;
-
-      case STATE_PT_SCALE:
-         value[0] = ctx->Pixel.RedScale;
-         value[1] = ctx->Pixel.GreenScale;
-         value[2] = ctx->Pixel.BlueScale;
-         value[3] = ctx->Pixel.AlphaScale;
-         return;
-
-      case STATE_PT_BIAS:
-         value[0] = ctx->Pixel.RedBias;
-         value[1] = ctx->Pixel.GreenBias;
-         value[2] = ctx->Pixel.BlueBias;
-         value[3] = ctx->Pixel.AlphaBias;
-         return;
-
-      case STATE_SHADOW_AMBIENT:
-         {
-            const int unit = (int) state[2];
-            const struct gl_texture_object *texObj
-               = ctx->Texture.Unit[unit]._Current;
-            if (texObj) {
-               value[0] =
-               value[1] =
-               value[2] =
-               value[3] = texObj->CompareFailValue;
-            }
-         }
-         return;
-
-      case STATE_FB_SIZE:
-         value[0] = (GLfloat) (ctx->DrawBuffer->Width - 1);
-         value[1] = (GLfloat) (ctx->DrawBuffer->Height - 1);
-         value[2] = 0.0F;
-         value[3] = 0.0F;
-         return;
-
-      case STATE_FB_WPOS_Y_TRANSFORM:
-         /* A driver may negate this conditional by using ZW swizzle
-          * instead of XY (based on e.g. some other state). */
-         if (ctx->DrawBuffer->Name != 0) {
-            /* Identity (XY) followed by flipping Y upside down (ZW). */
-            value[0] = 1.0F;
-            value[1] = 0.0F;
-            value[2] = -1.0F;
-            value[3] = (GLfloat) (ctx->DrawBuffer->Height - 1);
-         } else {
-            /* Flipping Y upside down (XY) followed by identity (ZW). */
-            value[0] = -1.0F;
-            value[1] = (GLfloat) (ctx->DrawBuffer->Height - 1);
-            value[2] = 1.0F;
-            value[3] = 0.0F;
-         }
-         return;
-
-      case STATE_ROT_MATRIX_0:
-         {
-            const int unit = (int) state[2];
-            GLfloat *rotMat22 = ctx->Texture.Unit[unit].RotMatrix;
-            value[0] = rotMat22[0]; 
-            value[1] = rotMat22[2];
-            value[2] = 0.0;
-            value[3] = 0.0;
-         }
-         return;
-
-      case STATE_ROT_MATRIX_1:
-         {
-            const int unit = (int) state[2];
-            GLfloat *rotMat22 = ctx->Texture.Unit[unit].RotMatrix;
-            value[0] = rotMat22[1];
-            value[1] = rotMat22[3];
-            value[2] = 0.0;
-            value[3] = 0.0;
-         }
-         return;
-
-      /* XXX: make sure new tokens added here are also handled in the 
-       * _mesa_program_state_flags() switch, below.
-       */
-      default:
-         /* Unknown state indexes are silently ignored here.
-          * Drivers may do something special.
-          */
-         return;
-      }
-      return;
-
-   default:
-      _mesa_problem(ctx, "Invalid state in _mesa_fetch_state");
-      return;
-   }
-}
-
-
-/**
- * Return a bitmask of the Mesa state flags (_NEW_* values) which would
- * indicate that the given context state may have changed.
- * The bitmask is used during validation to determine if we need to update
- * vertex/fragment program parameters (like "state.material.color") when
- * some GL state has changed.
- */
-GLbitfield
-_mesa_program_state_flags(const gl_state_index state[STATE_LENGTH])
-{
-   switch (state[0]) {
-   case STATE_MATERIAL:
-   case STATE_LIGHT:
-   case STATE_LIGHTMODEL_AMBIENT:
-   case STATE_LIGHTMODEL_SCENECOLOR:
-   case STATE_LIGHTPROD:
-      return _NEW_LIGHT;
-
-   case STATE_TEXGEN:
-   case STATE_TEXENV_COLOR:
-      return _NEW_TEXTURE;
-
-   case STATE_FOG_COLOR:
-   case STATE_FOG_PARAMS:
-      return _NEW_FOG;
-
-   case STATE_CLIPPLANE:
-      return _NEW_TRANSFORM;
-
-   case STATE_POINT_SIZE:
-   case STATE_POINT_ATTENUATION:
-      return _NEW_POINT;
-
-   case STATE_MODELVIEW_MATRIX:
-      return _NEW_MODELVIEW;
-   case STATE_PROJECTION_MATRIX:
-      return _NEW_PROJECTION;
-   case STATE_MVP_MATRIX:
-      return _NEW_MODELVIEW | _NEW_PROJECTION;
-   case STATE_TEXTURE_MATRIX:
-      return _NEW_TEXTURE_MATRIX;
-   case STATE_PROGRAM_MATRIX:
-      return _NEW_TRACK_MATRIX;
-
-   case STATE_DEPTH_RANGE:
-      return _NEW_VIEWPORT;
-
-   case STATE_FRAGMENT_PROGRAM:
-   case STATE_VERTEX_PROGRAM:
-      return _NEW_PROGRAM;
-
-   case STATE_NORMAL_SCALE:
-      return _NEW_MODELVIEW;
-
-   case STATE_INTERNAL:
-      switch (state[1]) {
-      case STATE_CURRENT_ATTRIB:
-         return _NEW_CURRENT_ATTRIB;
-
-      case STATE_NORMAL_SCALE:
-         return _NEW_MODELVIEW;
-
-      case STATE_TEXRECT_SCALE:
-      case STATE_SHADOW_AMBIENT:
-      case STATE_ROT_MATRIX_0:
-      case STATE_ROT_MATRIX_1:
-	 return _NEW_TEXTURE;
-      case STATE_FOG_PARAMS_OPTIMIZED:
-	 return _NEW_FOG;
-      case STATE_POINT_SIZE_CLAMPED:
-      case STATE_POINT_SIZE_IMPL_CLAMP:
-         return _NEW_POINT | _NEW_MULTISAMPLE;
-      case STATE_LIGHT_SPOT_DIR_NORMALIZED:
-      case STATE_LIGHT_POSITION:
-      case STATE_LIGHT_POSITION_NORMALIZED:
-      case STATE_LIGHT_HALF_VECTOR:
-         return _NEW_LIGHT;
-
-      case STATE_PT_SCALE:
-      case STATE_PT_BIAS:
-         return _NEW_PIXEL;
-
-      case STATE_FB_SIZE:
-      case STATE_FB_WPOS_Y_TRANSFORM:
-         return _NEW_BUFFERS;
-
-      default:
-         /* unknown state indexes are silently ignored and
-         *  no flag set, since it is handled by the driver.
-         */
-	 return 0;
-      }
-
-   default:
-      _mesa_problem(NULL, "unexpected state[0] in make_state_flags()");
-      return 0;
-   }
-}
-
-
-static void
-append(char *dst, const char *src)
-{
-   while (*dst)
-      dst++;
-   while (*src)
-     *dst++ = *src++;
-   *dst = 0;
-}
-
-
-/**
- * Convert token 'k' to a string, append it onto 'dst' string.
- */
-static void
-append_token(char *dst, gl_state_index k)
-{
-   switch (k) {
-   case STATE_MATERIAL:
-      append(dst, "material");
-      break;
-   case STATE_LIGHT:
-      append(dst, "light");
-      break;
-   case STATE_LIGHTMODEL_AMBIENT:
-      append(dst, "lightmodel.ambient");
-      break;
-   case STATE_LIGHTMODEL_SCENECOLOR:
-      break;
-   case STATE_LIGHTPROD:
-      append(dst, "lightprod");
-      break;
-   case STATE_TEXGEN:
-      append(dst, "texgen");
-      break;
-   case STATE_FOG_COLOR:
-      append(dst, "fog.color");
-      break;
-   case STATE_FOG_PARAMS:
-      append(dst, "fog.params");
-      break;
-   case STATE_CLIPPLANE:
-      append(dst, "clip");
-      break;
-   case STATE_POINT_SIZE:
-      append(dst, "point.size");
-      break;
-   case STATE_POINT_ATTENUATION:
-      append(dst, "point.attenuation");
-      break;
-   case STATE_MODELVIEW_MATRIX:
-      append(dst, "matrix.modelview");
-      break;
-   case STATE_PROJECTION_MATRIX:
-      append(dst, "matrix.projection");
-      break;
-   case STATE_MVP_MATRIX:
-      append(dst, "matrix.mvp");
-      break;
-   case STATE_TEXTURE_MATRIX:
-      append(dst, "matrix.texture");
-      break;
-   case STATE_PROGRAM_MATRIX:
-      append(dst, "matrix.program");
-      break;
-   case STATE_MATRIX_INVERSE:
-      append(dst, ".inverse");
-      break;
-   case STATE_MATRIX_TRANSPOSE:
-      append(dst, ".transpose");
-      break;
-   case STATE_MATRIX_INVTRANS:
-      append(dst, ".invtrans");
-      break;
-   case STATE_AMBIENT:
-      append(dst, ".ambient");
-      break;
-   case STATE_DIFFUSE:
-      append(dst, ".diffuse");
-      break;
-   case STATE_SPECULAR:
-      append(dst, ".specular");
-      break;
-   case STATE_EMISSION:
-      append(dst, ".emission");
-      break;
-   case STATE_SHININESS:
-      append(dst, "lshininess");
-      break;
-   case STATE_HALF_VECTOR:
-      append(dst, ".half");
-      break;
-   case STATE_POSITION:
-      append(dst, ".position");
-      break;
-   case STATE_ATTENUATION:
-      append(dst, ".attenuation");
-      break;
-   case STATE_SPOT_DIRECTION:
-      append(dst, ".spot.direction");
-      break;
-   case STATE_SPOT_CUTOFF:
-      append(dst, ".spot.cutoff");
-      break;
-   case STATE_TEXGEN_EYE_S:
-      append(dst, ".eye.s");
-      break;
-   case STATE_TEXGEN_EYE_T:
-      append(dst, ".eye.t");
-      break;
-   case STATE_TEXGEN_EYE_R:
-      append(dst, ".eye.r");
-      break;
-   case STATE_TEXGEN_EYE_Q:
-      append(dst, ".eye.q");
-      break;
-   case STATE_TEXGEN_OBJECT_S:
-      append(dst, ".object.s");
-      break;
-   case STATE_TEXGEN_OBJECT_T:
-      append(dst, ".object.t");
-      break;
-   case STATE_TEXGEN_OBJECT_R:
-      append(dst, ".object.r");
-      break;
-   case STATE_TEXGEN_OBJECT_Q:
-      append(dst, ".object.q");
-      break;
-   case STATE_TEXENV_COLOR:
-      append(dst, "texenv");
-      break;
-   case STATE_DEPTH_RANGE:
-      append(dst, "depth.range");
-      break;
-   case STATE_VERTEX_PROGRAM:
-   case STATE_FRAGMENT_PROGRAM:
-      break;
-   case STATE_ENV:
-      append(dst, "env");
-      break;
-   case STATE_LOCAL:
-      append(dst, "local");
-      break;
-   /* BEGIN internal state vars */
-   case STATE_INTERNAL:
-      append(dst, ".internal.");
-      break;
-   case STATE_CURRENT_ATTRIB:
-      append(dst, "current");
-      break;
-   case STATE_NORMAL_SCALE:
-      append(dst, "normalScale");
-      break;
-   case STATE_TEXRECT_SCALE:
-      append(dst, "texrectScale");
-      break;
-   case STATE_FOG_PARAMS_OPTIMIZED:
-      append(dst, "fogParamsOptimized");
-      break;
-   case STATE_POINT_SIZE_CLAMPED:
-      append(dst, "pointSizeClamped");
-      break;
-   case STATE_POINT_SIZE_IMPL_CLAMP:
-      append(dst, "pointSizeImplClamp");
-      break;
-   case STATE_LIGHT_SPOT_DIR_NORMALIZED:
-      append(dst, "lightSpotDirNormalized");
-      break;
-   case STATE_LIGHT_POSITION:
-      append(dst, "lightPosition");
-      break;
-   case STATE_LIGHT_POSITION_NORMALIZED:
-      append(dst, "light.position.normalized");
-      break;
-   case STATE_LIGHT_HALF_VECTOR:
-      append(dst, "lightHalfVector");
-      break;
-   case STATE_PT_SCALE:
-      append(dst, "PTscale");
-      break;
-   case STATE_PT_BIAS:
-      append(dst, "PTbias");
-      break;
-   case STATE_SHADOW_AMBIENT:
-      append(dst, "CompareFailValue");
-      break;
-   case STATE_FB_SIZE:
-      append(dst, "FbSize");
-      break;
-   case STATE_FB_WPOS_Y_TRANSFORM:
-      append(dst, "FbWposYTransform");
-      break;
-   case STATE_ROT_MATRIX_0:
-      append(dst, "rotMatrixRow0");
-      break;
-   case STATE_ROT_MATRIX_1:
-      append(dst, "rotMatrixRow1");
-      break;
-   default:
-      /* probably STATE_INTERNAL_DRIVER+i (driver private state) */
-      append(dst, "driverState");
-   }
-}
-
-static void
-append_face(char *dst, GLint face)
-{
-   if (face == 0)
-      append(dst, "front.");
-   else
-      append(dst, "back.");
-}
-
-static void
-append_index(char *dst, GLint index)
-{
-   char s[20];
-   sprintf(s, "[%d]", index);
-   append(dst, s);
-}
-
-/**
- * Make a string from the given state vector.
- * For example, return "state.matrix.texture[2].inverse".
- * Use free() to deallocate the string.
- */
-char *
-_mesa_program_state_string(const gl_state_index state[STATE_LENGTH])
-{
-   char str[1000] = "";
-   char tmp[30];
-
-   append(str, "state.");
-   append_token(str, state[0]);
-
-   switch (state[0]) {
-   case STATE_MATERIAL:
-      append_face(str, state[1]);
-      append_token(str, state[2]);
-      break;
-   case STATE_LIGHT:
-      append_index(str, state[1]); /* light number [i]. */
-      append_token(str, state[2]); /* coefficients */
-      break;
-   case STATE_LIGHTMODEL_AMBIENT:
-      append(str, "lightmodel.ambient");
-      break;
-   case STATE_LIGHTMODEL_SCENECOLOR:
-      if (state[1] == 0) {
-         append(str, "lightmodel.front.scenecolor");
-      }
-      else {
-         append(str, "lightmodel.back.scenecolor");
-      }
-      break;
-   case STATE_LIGHTPROD:
-      append_index(str, state[1]); /* light number [i]. */
-      append_face(str, state[2]);
-      append_token(str, state[3]);
-      break;
-   case STATE_TEXGEN:
-      append_index(str, state[1]); /* tex unit [i] */
-      append_token(str, state[2]); /* plane coef */
-      break;
-   case STATE_TEXENV_COLOR:
-      append_index(str, state[1]); /* tex unit [i] */
-      append(str, "color");
-      break;
-   case STATE_CLIPPLANE:
-      append_index(str, state[1]); /* plane [i] */
-      append(str, ".plane");
-      break;
-   case STATE_MODELVIEW_MATRIX:
-   case STATE_PROJECTION_MATRIX:
-   case STATE_MVP_MATRIX:
-   case STATE_TEXTURE_MATRIX:
-   case STATE_PROGRAM_MATRIX:
-      {
-         /* state[0] = modelview, projection, texture, etc. */
-         /* state[1] = which texture matrix or program matrix */
-         /* state[2] = first row to fetch */
-         /* state[3] = last row to fetch */
-         /* state[4] = transpose, inverse or invtrans */
-         const gl_state_index mat = state[0];
-         const GLuint index = (GLuint) state[1];
-         const GLuint firstRow = (GLuint) state[2];
-         const GLuint lastRow = (GLuint) state[3];
-         const gl_state_index modifier = state[4];
-         if (index ||
-             mat == STATE_TEXTURE_MATRIX ||
-             mat == STATE_PROGRAM_MATRIX)
-            append_index(str, index);
-         if (modifier)
-            append_token(str, modifier);
-         if (firstRow == lastRow)
-            sprintf(tmp, ".row[%d]", firstRow);
-         else
-            sprintf(tmp, ".row[%d..%d]", firstRow, lastRow);
-         append(str, tmp);
-      }
-      break;
-   case STATE_POINT_SIZE:
-      break;
-   case STATE_POINT_ATTENUATION:
-      break;
-   case STATE_FOG_PARAMS:
-      break;
-   case STATE_FOG_COLOR:
-      break;
-   case STATE_DEPTH_RANGE:
-      break;
-   case STATE_FRAGMENT_PROGRAM:
-   case STATE_VERTEX_PROGRAM:
-      /* state[1] = {STATE_ENV, STATE_LOCAL} */
-      /* state[2] = parameter index          */
-      append_token(str, state[1]);
-      append_index(str, state[2]);
-      break;
-   case STATE_NORMAL_SCALE:
-      break;
-   case STATE_INTERNAL:
-      append_token(str, state[1]);
-      if (state[1] == STATE_CURRENT_ATTRIB)
-         append_index(str, state[2]);
-       break;
-   default:
-      _mesa_problem(NULL, "Invalid state in _mesa_program_state_string");
-      break;
-   }
-
-   return _mesa_strdup(str);
-}
-
-
-/**
- * Loop over all the parameters in a parameter list.  If the parameter
- * is a GL state reference, look up the current value of that state
- * variable and put it into the parameter's Value[4] array.
- * Other parameter types never change or are explicitly set by the user
- * with glUniform() or glProgramParameter(), etc.
- * This would be called at glBegin time.
- */
-void
-_mesa_load_state_parameters(struct gl_context *ctx,
-                            struct gl_program_parameter_list *paramList)
-{
-   GLuint i;
-
-   if (!paramList)
-      return;
-
-   for (i = 0; i < paramList->NumParameters; i++) {
-      if (paramList->Parameters[i].Type == PROGRAM_STATE_VAR) {
-         _mesa_fetch_state(ctx,
-			   paramList->Parameters[i].StateIndexes,
-                           paramList->ParameterValues[i]);
-      }
-   }
-}
-
-
-/**
- * Copy the 16 elements of a matrix into four consecutive program
- * registers starting at 'pos'.
- */
-static void
-load_matrix(GLfloat registers[][4], GLuint pos, const GLfloat mat[16])
-{
-   GLuint i;
-   for (i = 0; i < 4; i++) {
-      registers[pos + i][0] = mat[0 + i];
-      registers[pos + i][1] = mat[4 + i];
-      registers[pos + i][2] = mat[8 + i];
-      registers[pos + i][3] = mat[12 + i];
-   }
-}
-
-
-/**
- * As above, but transpose the matrix.
- */
-static void
-load_transpose_matrix(GLfloat registers[][4], GLuint pos,
-                      const GLfloat mat[16])
-{
-   memcpy(registers[pos], mat, 16 * sizeof(GLfloat));
-}
-
-
-/**
- * Load current vertex program's parameter registers with tracked
- * matrices (if NV program).  This only needs to be done per
- * glBegin/glEnd, not per-vertex.
- */
-void
-_mesa_load_tracked_matrices(struct gl_context *ctx)
-{
-   GLuint i;
-
-   for (i = 0; i < MAX_NV_VERTEX_PROGRAM_PARAMS / 4; i++) {
-      /* point 'mat' at source matrix */
-      GLmatrix *mat;
-      if (ctx->VertexProgram.TrackMatrix[i] == GL_MODELVIEW) {
-         mat = ctx->ModelviewMatrixStack.Top;
-      }
-      else if (ctx->VertexProgram.TrackMatrix[i] == GL_PROJECTION) {
-         mat = ctx->ProjectionMatrixStack.Top;
-      }
-      else if (ctx->VertexProgram.TrackMatrix[i] == GL_TEXTURE) {
-         GLuint unit = MIN2(ctx->Texture.CurrentUnit,
-                            Elements(ctx->TextureMatrixStack) - 1);
-         mat = ctx->TextureMatrixStack[unit].Top;
-      }
-      else if (ctx->VertexProgram.TrackMatrix[i]==GL_MODELVIEW_PROJECTION_NV) {
-         /* XXX verify the combined matrix is up to date */
-         mat = &ctx->_ModelProjectMatrix;
-      }
-      else if (ctx->VertexProgram.TrackMatrix[i] >= GL_MATRIX0_NV &&
-               ctx->VertexProgram.TrackMatrix[i] <= GL_MATRIX7_NV) {
-         GLuint n = ctx->VertexProgram.TrackMatrix[i] - GL_MATRIX0_NV;
-         ASSERT(n < Elements(ctx->ProgramMatrixStack));
-         mat = ctx->ProgramMatrixStack[n].Top;
-      }
-      else {
-         /* no matrix is tracked, but we leave the register values as-is */
-         assert(ctx->VertexProgram.TrackMatrix[i] == GL_NONE);
-         continue;
-      }
-
-      /* load the matrix values into sequential registers */
-      if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_IDENTITY_NV) {
-         load_matrix(ctx->VertexProgram.Parameters, i*4, mat->m);
-      }
-      else if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_INVERSE_NV) {
-         _math_matrix_analyse(mat); /* update the inverse */
-         ASSERT(!_math_matrix_is_dirty(mat));
-         load_matrix(ctx->VertexProgram.Parameters, i*4, mat->inv);
-      }
-      else if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_TRANSPOSE_NV) {
-         load_transpose_matrix(ctx->VertexProgram.Parameters, i*4, mat->m);
-      }
-      else {
-         assert(ctx->VertexProgram.TrackMatrixTransform[i]
-                == GL_INVERSE_TRANSPOSE_NV);
-         _math_matrix_analyse(mat); /* update the inverse */
-         ASSERT(!_math_matrix_is_dirty(mat));
-         load_transpose_matrix(ctx->VertexProgram.Parameters, i*4, mat->inv);
-      }
-   }
-}
+/*
+ * Mesa 3-D graphics library
+ * Version:  7.1
+ *
+ * Copyright (C) 1999-2007  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"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/**
+ * \file prog_statevars.c
+ * Program state variable management.
+ * \author Brian Paul
+ */
+
+
+#include "main/glheader.h"
+#include "main/context.h"
+#include "main/imports.h"
+#include "main/macros.h"
+#include "main/mtypes.h"
+#include "prog_statevars.h"
+#include "prog_parameter.h"
+
+
+/**
+ * Use the list of tokens in the state[] array to find global GL state
+ * and return it in <value>.  Usually, four values are returned in <value>
+ * but matrix queries may return as many as 16 values.
+ * This function is used for ARB vertex/fragment programs.
+ * The program parser will produce the state[] values.
+ */
+static void
+_mesa_fetch_state(struct gl_context *ctx, const gl_state_index state[],
+                  GLfloat *value)
+{
+   switch (state[0]) {
+   case STATE_MATERIAL:
+      {
+         /* state[1] is either 0=front or 1=back side */
+         const GLuint face = (GLuint) state[1];
+         const struct gl_material *mat = &ctx->Light.Material;
+         ASSERT(face == 0 || face == 1);
+         /* we rely on tokens numbered so that _BACK_ == _FRONT_+ 1 */
+         ASSERT(MAT_ATTRIB_FRONT_AMBIENT + 1 == MAT_ATTRIB_BACK_AMBIENT);
+         /* XXX we could get rid of this switch entirely with a little
+          * work in arbprogparse.c's parse_state_single_item().
+          */
+         /* state[2] is the material attribute */
+         switch (state[2]) {
+         case STATE_AMBIENT:
+            COPY_4V(value, mat->Attrib[MAT_ATTRIB_FRONT_AMBIENT + face]);
+            return;
+         case STATE_DIFFUSE:
+            COPY_4V(value, mat->Attrib[MAT_ATTRIB_FRONT_DIFFUSE + face]);
+            return;
+         case STATE_SPECULAR:
+            COPY_4V(value, mat->Attrib[MAT_ATTRIB_FRONT_SPECULAR + face]);
+            return;
+         case STATE_EMISSION:
+            COPY_4V(value, mat->Attrib[MAT_ATTRIB_FRONT_EMISSION + face]);
+            return;
+         case STATE_SHININESS:
+            value[0] = mat->Attrib[MAT_ATTRIB_FRONT_SHININESS + face][0];
+            value[1] = 0.0F;
+            value[2] = 0.0F;
+            value[3] = 1.0F;
+            return;
+         default:
+            _mesa_problem(ctx, "Invalid material state in fetch_state");
+            return;
+         }
+      }
+   case STATE_LIGHT:
+      {
+         /* state[1] is the light number */
+         const GLuint ln = (GLuint) state[1];
+         /* state[2] is the light attribute */
+         switch (state[2]) {
+         case STATE_AMBIENT:
+            COPY_4V(value, ctx->Light.Light[ln].Ambient);
+            return;
+         case STATE_DIFFUSE:
+            COPY_4V(value, ctx->Light.Light[ln].Diffuse);
+            return;
+         case STATE_SPECULAR:
+            COPY_4V(value, ctx->Light.Light[ln].Specular);
+            return;
+         case STATE_POSITION:
+            COPY_4V(value, ctx->Light.Light[ln].EyePosition);
+            return;
+         case STATE_ATTENUATION:
+            value[0] = ctx->Light.Light[ln].ConstantAttenuation;
+            value[1] = ctx->Light.Light[ln].LinearAttenuation;
+            value[2] = ctx->Light.Light[ln].QuadraticAttenuation;
+            value[3] = ctx->Light.Light[ln].SpotExponent;
+            return;
+         case STATE_SPOT_DIRECTION:
+            COPY_3V(value, ctx->Light.Light[ln].SpotDirection);
+            value[3] = ctx->Light.Light[ln]._CosCutoff;
+            return;
+         case STATE_SPOT_CUTOFF:
+            value[0] = ctx->Light.Light[ln].SpotCutoff;
+            return;
+         case STATE_HALF_VECTOR:
+            {
+               static const GLfloat eye_z[] = {0, 0, 1};
+               GLfloat p[3];
+               /* Compute infinite half angle vector:
+                *   halfVector = normalize(normalize(lightPos) + (0, 0, 1))
+		* light.EyePosition.w should be 0 for infinite lights.
+                */
+               COPY_3V(p, ctx->Light.Light[ln].EyePosition);
+               NORMALIZE_3FV(p);
+	       ADD_3V(value, p, eye_z);
+	       NORMALIZE_3FV(value);
+	       value[3] = 1.0;
+            }
+            return;
+         default:
+            _mesa_problem(ctx, "Invalid light state in fetch_state");
+            return;
+         }
+      }
+   case STATE_LIGHTMODEL_AMBIENT:
+      COPY_4V(value, ctx->Light.Model.Ambient);
+      return;
+   case STATE_LIGHTMODEL_SCENECOLOR:
+      if (state[1] == 0) {
+         /* front */
+         GLint i;
+         for (i = 0; i < 3; i++) {
+            value[i] = ctx->Light.Model.Ambient[i]
+               * ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT][i]
+               + ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_EMISSION][i];
+         }
+	 value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE][3];
+      }
+      else {
+         /* back */
+         GLint i;
+         for (i = 0; i < 3; i++) {
+            value[i] = ctx->Light.Model.Ambient[i]
+               * ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_AMBIENT][i]
+               + ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_EMISSION][i];
+         }
+	 value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_BACK_DIFFUSE][3];
+      }
+      return;
+   case STATE_LIGHTPROD:
+      {
+         const GLuint ln = (GLuint) state[1];
+         const GLuint face = (GLuint) state[2];
+         GLint i;
+         ASSERT(face == 0 || face == 1);
+         switch (state[3]) {
+            case STATE_AMBIENT:
+               for (i = 0; i < 3; i++) {
+                  value[i] = ctx->Light.Light[ln].Ambient[i] *
+                     ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT+face][i];
+               }
+               /* [3] = material alpha */
+               value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_AMBIENT+face][3];
+               return;
+            case STATE_DIFFUSE:
+               for (i = 0; i < 3; i++) {
+                  value[i] = ctx->Light.Light[ln].Diffuse[i] *
+                     ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE+face][i];
+               }
+               /* [3] = material alpha */
+               value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_DIFFUSE+face][3];
+               return;
+            case STATE_SPECULAR:
+               for (i = 0; i < 3; i++) {
+                  value[i] = ctx->Light.Light[ln].Specular[i] *
+                     ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_SPECULAR+face][i];
+               }
+               /* [3] = material alpha */
+               value[3] = ctx->Light.Material.Attrib[MAT_ATTRIB_FRONT_SPECULAR+face][3];
+               return;
+            default:
+               _mesa_problem(ctx, "Invalid lightprod state in fetch_state");
+               return;
+         }
+      }
+   case STATE_TEXGEN:
+      {
+         /* state[1] is the texture unit */
+         const GLuint unit = (GLuint) state[1];
+         /* state[2] is the texgen attribute */
+         switch (state[2]) {
+         case STATE_TEXGEN_EYE_S:
+            COPY_4V(value, ctx->Texture.Unit[unit].GenS.EyePlane);
+            return;
+         case STATE_TEXGEN_EYE_T:
+            COPY_4V(value, ctx->Texture.Unit[unit].GenT.EyePlane);
+            return;
+         case STATE_TEXGEN_EYE_R:
+            COPY_4V(value, ctx->Texture.Unit[unit].GenR.EyePlane);
+            return;
+         case STATE_TEXGEN_EYE_Q:
+            COPY_4V(value, ctx->Texture.Unit[unit].GenQ.EyePlane);
+            return;
+         case STATE_TEXGEN_OBJECT_S:
+            COPY_4V(value, ctx->Texture.Unit[unit].GenS.ObjectPlane);
+            return;
+         case STATE_TEXGEN_OBJECT_T:
+            COPY_4V(value, ctx->Texture.Unit[unit].GenT.ObjectPlane);
+            return;
+         case STATE_TEXGEN_OBJECT_R:
+            COPY_4V(value, ctx->Texture.Unit[unit].GenR.ObjectPlane);
+            return;
+         case STATE_TEXGEN_OBJECT_Q:
+            COPY_4V(value, ctx->Texture.Unit[unit].GenQ.ObjectPlane);
+            return;
+         default:
+            _mesa_problem(ctx, "Invalid texgen state in fetch_state");
+            return;
+         }
+      }
+   case STATE_TEXENV_COLOR:
+      {
+         /* state[1] is the texture unit */
+         const GLuint unit = (GLuint) state[1];
+         if(ctx->Color._ClampFragmentColor)
+            COPY_4V(value, ctx->Texture.Unit[unit].EnvColor);
+         else
+            COPY_4V(value, ctx->Texture.Unit[unit].EnvColorUnclamped);
+      }
+      return;
+   case STATE_FOG_COLOR:
+      if(ctx->Color._ClampFragmentColor)
+         COPY_4V(value, ctx->Fog.Color);
+      else
+         COPY_4V(value, ctx->Fog.ColorUnclamped);
+      return;
+   case STATE_FOG_PARAMS:
+      value[0] = ctx->Fog.Density;
+      value[1] = ctx->Fog.Start;
+      value[2] = ctx->Fog.End;
+      value[3] = (ctx->Fog.End == ctx->Fog.Start)
+         ? 1.0f : (GLfloat)(1.0 / (ctx->Fog.End - ctx->Fog.Start));
+      return;
+   case STATE_CLIPPLANE:
+      {
+         const GLuint plane = (GLuint) state[1];
+         COPY_4V(value, ctx->Transform.EyeUserPlane[plane]);
+      }
+      return;
+   case STATE_POINT_SIZE:
+      value[0] = ctx->Point.Size;
+      value[1] = ctx->Point.MinSize;
+      value[2] = ctx->Point.MaxSize;
+      value[3] = ctx->Point.Threshold;
+      return;
+   case STATE_POINT_ATTENUATION:
+      value[0] = ctx->Point.Params[0];
+      value[1] = ctx->Point.Params[1];
+      value[2] = ctx->Point.Params[2];
+      value[3] = 1.0F;
+      return;
+   case STATE_MODELVIEW_MATRIX:
+   case STATE_PROJECTION_MATRIX:
+   case STATE_MVP_MATRIX:
+   case STATE_TEXTURE_MATRIX:
+   case STATE_PROGRAM_MATRIX:
+      {
+         /* state[0] = modelview, projection, texture, etc. */
+         /* state[1] = which texture matrix or program matrix */
+         /* state[2] = first row to fetch */
+         /* state[3] = last row to fetch */
+         /* state[4] = transpose, inverse or invtrans */
+         const GLmatrix *matrix;
+         const gl_state_index mat = state[0];
+         const GLuint index = (GLuint) state[1];
+         const GLuint firstRow = (GLuint) state[2];
+         const GLuint lastRow = (GLuint) state[3];
+         const gl_state_index modifier = state[4];
+         const GLfloat *m;
+         GLuint row, i;
+         ASSERT(firstRow >= 0);
+         ASSERT(firstRow < 4);
+         ASSERT(lastRow >= 0);
+         ASSERT(lastRow < 4);
+         if (mat == STATE_MODELVIEW_MATRIX) {
+            matrix = ctx->ModelviewMatrixStack.Top;
+         }
+         else if (mat == STATE_PROJECTION_MATRIX) {
+            matrix = ctx->ProjectionMatrixStack.Top;
+         }
+         else if (mat == STATE_MVP_MATRIX) {
+            matrix = &ctx->_ModelProjectMatrix;
+         }
+         else if (mat == STATE_TEXTURE_MATRIX) {
+            ASSERT(index < Elements(ctx->TextureMatrixStack));
+            matrix = ctx->TextureMatrixStack[index].Top;
+         }
+         else if (mat == STATE_PROGRAM_MATRIX) {
+            ASSERT(index < Elements(ctx->ProgramMatrixStack));
+            matrix = ctx->ProgramMatrixStack[index].Top;
+         }
+         else {
+            _mesa_problem(ctx, "Bad matrix name in _mesa_fetch_state()");
+            return;
+         }
+         if (modifier == STATE_MATRIX_INVERSE ||
+             modifier == STATE_MATRIX_INVTRANS) {
+            /* Be sure inverse is up to date:
+	     */
+            _math_matrix_alloc_inv( (GLmatrix *) matrix );
+	    _math_matrix_analyse( (GLmatrix*) matrix );
+            m = matrix->inv;
+         }
+         else {
+            m = matrix->m;
+         }
+         if (modifier == STATE_MATRIX_TRANSPOSE ||
+             modifier == STATE_MATRIX_INVTRANS) {
+            for (i = 0, row = firstRow; row <= lastRow; row++) {
+               value[i++] = m[row * 4 + 0];
+               value[i++] = m[row * 4 + 1];
+               value[i++] = m[row * 4 + 2];
+               value[i++] = m[row * 4 + 3];
+            }
+         }
+         else {
+            for (i = 0, row = firstRow; row <= lastRow; row++) {
+               value[i++] = m[row + 0];
+               value[i++] = m[row + 4];
+               value[i++] = m[row + 8];
+               value[i++] = m[row + 12];
+            }
+         }
+      }
+      return;
+   case STATE_DEPTH_RANGE:
+      value[0] = ctx->Viewport.Near;                     /* near       */
+      value[1] = ctx->Viewport.Far;                      /* far        */
+      value[2] = ctx->Viewport.Far - ctx->Viewport.Near; /* far - near */
+      value[3] = 1.0;
+      return;
+   case STATE_FRAGMENT_PROGRAM:
+      {
+         /* state[1] = {STATE_ENV, STATE_LOCAL} */
+         /* state[2] = parameter index          */
+         const int idx = (int) state[2];
+         switch (state[1]) {
+            case STATE_ENV:
+               COPY_4V(value, ctx->FragmentProgram.Parameters[idx]);
+               return;
+            case STATE_LOCAL:
+               COPY_4V(value, ctx->FragmentProgram.Current->Base.LocalParams[idx]);
+               return;
+            default:
+               _mesa_problem(ctx, "Bad state switch in _mesa_fetch_state()");
+               return;
+         }
+      }
+      return;
+
+   case STATE_VERTEX_PROGRAM:
+      {
+         /* state[1] = {STATE_ENV, STATE_LOCAL} */
+         /* state[2] = parameter index          */
+         const int idx = (int) state[2];
+         switch (state[1]) {
+            case STATE_ENV:
+               COPY_4V(value, ctx->VertexProgram.Parameters[idx]);
+               return;
+            case STATE_LOCAL:
+               COPY_4V(value, ctx->VertexProgram.Current->Base.LocalParams[idx]);
+               return;
+            default:
+               _mesa_problem(ctx, "Bad state switch in _mesa_fetch_state()");
+               return;
+         }
+      }
+      return;
+
+   case STATE_NORMAL_SCALE:
+      ASSIGN_4V(value, ctx->_ModelViewInvScale, 0, 0, 1);
+      return;
+
+   case STATE_INTERNAL:
+      switch (state[1]) {
+      case STATE_CURRENT_ATTRIB:
+         {
+            const GLuint idx = (GLuint) state[2];
+            COPY_4V(value, ctx->Current.Attrib[idx]);
+         }
+         return;
+
+      case STATE_CURRENT_ATTRIB_MAYBE_VP_CLAMPED:
+         {
+            const GLuint idx = (GLuint) state[2];
+            if(ctx->Light._ClampVertexColor &&
+               (idx == VERT_ATTRIB_COLOR0 ||
+                idx == VERT_ATTRIB_COLOR1)) {
+               value[0] = CLAMP(ctx->Current.Attrib[idx][0], 0.0f, 1.0f);
+               value[1] = CLAMP(ctx->Current.Attrib[idx][1], 0.0f, 1.0f);
+               value[2] = CLAMP(ctx->Current.Attrib[idx][2], 0.0f, 1.0f);
+               value[3] = CLAMP(ctx->Current.Attrib[idx][3], 0.0f, 1.0f);
+            }
+            else
+               COPY_4V(value, ctx->Current.Attrib[idx]);
+         }
+         return;
+
+      case STATE_NORMAL_SCALE:
+         ASSIGN_4V(value, 
+                   ctx->_ModelViewInvScale, 
+                   ctx->_ModelViewInvScale, 
+                   ctx->_ModelViewInvScale, 
+                   1);
+         return;
+
+      case STATE_TEXRECT_SCALE:
+         /* Value = { 1/texWidth, 1/texHeight, 0, 1 }.
+          * Used to convert unnormalized texcoords to normalized texcoords.
+          */
+         {
+            const int unit = (int) state[2];
+            const struct gl_texture_object *texObj
+               = ctx->Texture.Unit[unit]._Current;
+            if (texObj) {
+               struct gl_texture_image *texImage = texObj->Image[0][0];
+               ASSIGN_4V(value,
+                         (GLfloat) (1.0 / texImage->Width),
+                         (GLfloat) (1.0 / texImage->Height),
+                         0.0f, 1.0f);
+            }
+         }
+         return;
+
+      case STATE_FOG_PARAMS_OPTIMIZED:
+         /* for simpler per-vertex/pixel fog calcs. POW (for EXP/EXP2 fog)
+          * might be more expensive than EX2 on some hw, plus it needs
+          * another constant (e) anyway. Linear fog can now be done with a
+          * single MAD.
+          * linear: fogcoord * -1/(end-start) + end/(end-start)
+          * exp: 2^-(density/ln(2) * fogcoord)
+          * exp2: 2^-((density/(ln(2)^2) * fogcoord)^2)
+          */
+         value[0] = (ctx->Fog.End == ctx->Fog.Start)
+            ? 1.0f : (GLfloat)(-1.0F / (ctx->Fog.End - ctx->Fog.Start));
+         value[1] = ctx->Fog.End * -value[0];
+         value[2] = (GLfloat)(ctx->Fog.Density * ONE_DIV_LN2);
+         value[3] = (GLfloat)(ctx->Fog.Density * ONE_DIV_SQRT_LN2);
+         return;
+
+      case STATE_POINT_SIZE_CLAMPED:
+         {
+           /* this includes implementation dependent limits, to avoid
+            * another potentially necessary clamp.
+            * Note: for sprites, point smooth (point AA) is ignored
+            * and we'll clamp to MinPointSizeAA and MaxPointSize, because we
+            * expect drivers will want to say their minimum for AA size is 0.0
+            * but for non-AA it's 1.0 (because normal points with size below 1.0
+            * need to get rounded up to 1.0, hence never disappear). GL does
+            * not specify max clamp size for sprites, other than it needs to be
+            * at least as large as max AA size, hence use non-AA size there.
+            */
+            GLfloat minImplSize;
+            GLfloat maxImplSize;
+            if (ctx->Point.PointSprite) {
+               minImplSize = ctx->Const.MinPointSizeAA;
+               maxImplSize = ctx->Const.MaxPointSize;
+            }
+            else if (ctx->Point.SmoothFlag || ctx->Multisample._Enabled) {
+               minImplSize = ctx->Const.MinPointSizeAA;
+               maxImplSize = ctx->Const.MaxPointSizeAA;
+            }
+            else {
+               minImplSize = ctx->Const.MinPointSize;
+               maxImplSize = ctx->Const.MaxPointSize;
+            }
+            value[0] = ctx->Point.Size;
+            value[1] = ctx->Point.MinSize >= minImplSize ? ctx->Point.MinSize : minImplSize;
+            value[2] = ctx->Point.MaxSize <= maxImplSize ? ctx->Point.MaxSize : maxImplSize;
+            value[3] = ctx->Point.Threshold;
+         }
+         return;
+      case STATE_POINT_SIZE_IMPL_CLAMP:
+         {
+           /* for implementation clamp only in vs */
+            GLfloat minImplSize;
+            GLfloat maxImplSize;
+            if (ctx->Point.PointSprite) {
+               minImplSize = ctx->Const.MinPointSizeAA;
+               maxImplSize = ctx->Const.MaxPointSize;
+            }
+            else if (ctx->Point.SmoothFlag || ctx->Multisample._Enabled) {
+               minImplSize = ctx->Const.MinPointSizeAA;
+               maxImplSize = ctx->Const.MaxPointSizeAA;
+            }
+            else {
+               minImplSize = ctx->Const.MinPointSize;
+               maxImplSize = ctx->Const.MaxPointSize;
+            }
+            value[0] = ctx->Point.Size;
+            value[1] = minImplSize;
+            value[2] = maxImplSize;
+            value[3] = ctx->Point.Threshold;
+         }
+         return;
+      case STATE_LIGHT_SPOT_DIR_NORMALIZED:
+         {
+            /* here, state[2] is the light number */
+            /* pre-normalize spot dir */
+            const GLuint ln = (GLuint) state[2];
+            COPY_3V(value, ctx->Light.Light[ln]._NormSpotDirection);
+            value[3] = ctx->Light.Light[ln]._CosCutoff;
+         }
+         return;
+
+      case STATE_LIGHT_POSITION:
+         {
+            const GLuint ln = (GLuint) state[2];
+            COPY_4V(value, ctx->Light.Light[ln]._Position);
+         }
+         return;
+
+      case STATE_LIGHT_POSITION_NORMALIZED:
+         {
+            const GLuint ln = (GLuint) state[2];
+            COPY_4V(value, ctx->Light.Light[ln]._Position);
+            NORMALIZE_3FV( value );
+         }
+         return;
+
+      case STATE_LIGHT_HALF_VECTOR:
+         {
+            const GLuint ln = (GLuint) state[2];
+            GLfloat p[3];
+            /* Compute infinite half angle vector:
+             *   halfVector = normalize(normalize(lightPos) + (0, 0, 1))
+             * light.EyePosition.w should be 0 for infinite lights.
+             */
+            COPY_3V(p, ctx->Light.Light[ln]._Position);
+            NORMALIZE_3FV(p);
+            ADD_3V(value, p, ctx->_EyeZDir);
+            NORMALIZE_3FV(value);
+            value[3] = 1.0;
+         }
+         return;
+
+      case STATE_PT_SCALE:
+         value[0] = ctx->Pixel.RedScale;
+         value[1] = ctx->Pixel.GreenScale;
+         value[2] = ctx->Pixel.BlueScale;
+         value[3] = ctx->Pixel.AlphaScale;
+         return;
+
+      case STATE_PT_BIAS:
+         value[0] = ctx->Pixel.RedBias;
+         value[1] = ctx->Pixel.GreenBias;
+         value[2] = ctx->Pixel.BlueBias;
+         value[3] = ctx->Pixel.AlphaBias;
+         return;
+
+      case STATE_SHADOW_AMBIENT:
+         {
+            const int unit = (int) state[2];
+            const struct gl_texture_object *texObj
+               = ctx->Texture.Unit[unit]._Current;
+            if (texObj) {
+               value[0] =
+               value[1] =
+               value[2] =
+               value[3] = texObj->CompareFailValue;
+            }
+         }
+         return;
+
+      case STATE_FB_SIZE:
+         value[0] = (GLfloat) (ctx->DrawBuffer->Width - 1);
+         value[1] = (GLfloat) (ctx->DrawBuffer->Height - 1);
+         value[2] = 0.0F;
+         value[3] = 0.0F;
+         return;
+
+      case STATE_FB_WPOS_Y_TRANSFORM:
+         /* A driver may negate this conditional by using ZW swizzle
+          * instead of XY (based on e.g. some other state). */
+         if (ctx->DrawBuffer->Name != 0) {
+            /* Identity (XY) followed by flipping Y upside down (ZW). */
+            value[0] = 1.0F;
+            value[1] = 0.0F;
+            value[2] = -1.0F;
+            value[3] = (GLfloat) (ctx->DrawBuffer->Height - 1);
+         } else {
+            /* Flipping Y upside down (XY) followed by identity (ZW). */
+            value[0] = -1.0F;
+            value[1] = (GLfloat) (ctx->DrawBuffer->Height - 1);
+            value[2] = 1.0F;
+            value[3] = 0.0F;
+         }
+         return;
+
+      case STATE_ROT_MATRIX_0:
+         {
+            const int unit = (int) state[2];
+            GLfloat *rotMat22 = ctx->Texture.Unit[unit].RotMatrix;
+            value[0] = rotMat22[0]; 
+            value[1] = rotMat22[2];
+            value[2] = 0.0;
+            value[3] = 0.0;
+         }
+         return;
+
+      case STATE_ROT_MATRIX_1:
+         {
+            const int unit = (int) state[2];
+            GLfloat *rotMat22 = ctx->Texture.Unit[unit].RotMatrix;
+            value[0] = rotMat22[1];
+            value[1] = rotMat22[3];
+            value[2] = 0.0;
+            value[3] = 0.0;
+         }
+         return;
+
+      /* XXX: make sure new tokens added here are also handled in the 
+       * _mesa_program_state_flags() switch, below.
+       */
+      default:
+         /* Unknown state indexes are silently ignored here.
+          * Drivers may do something special.
+          */
+         return;
+      }
+      return;
+
+   default:
+      _mesa_problem(ctx, "Invalid state in _mesa_fetch_state");
+      return;
+   }
+}
+
+
+/**
+ * Return a bitmask of the Mesa state flags (_NEW_* values) which would
+ * indicate that the given context state may have changed.
+ * The bitmask is used during validation to determine if we need to update
+ * vertex/fragment program parameters (like "state.material.color") when
+ * some GL state has changed.
+ */
+GLbitfield
+_mesa_program_state_flags(const gl_state_index state[STATE_LENGTH])
+{
+   switch (state[0]) {
+   case STATE_MATERIAL:
+   case STATE_LIGHT:
+   case STATE_LIGHTMODEL_AMBIENT:
+   case STATE_LIGHTMODEL_SCENECOLOR:
+   case STATE_LIGHTPROD:
+      return _NEW_LIGHT;
+
+   case STATE_TEXGEN:
+      return _NEW_TEXTURE;
+   case STATE_TEXENV_COLOR:
+      return _NEW_TEXTURE | _NEW_BUFFERS | _NEW_FRAG_CLAMP;
+
+   case STATE_FOG_COLOR:
+      return _NEW_FOG | _NEW_BUFFERS | _NEW_FRAG_CLAMP;
+   case STATE_FOG_PARAMS:
+      return _NEW_FOG;
+
+   case STATE_CLIPPLANE:
+      return _NEW_TRANSFORM;
+
+   case STATE_POINT_SIZE:
+   case STATE_POINT_ATTENUATION:
+      return _NEW_POINT;
+
+   case STATE_MODELVIEW_MATRIX:
+      return _NEW_MODELVIEW;
+   case STATE_PROJECTION_MATRIX:
+      return _NEW_PROJECTION;
+   case STATE_MVP_MATRIX:
+      return _NEW_MODELVIEW | _NEW_PROJECTION;
+   case STATE_TEXTURE_MATRIX:
+      return _NEW_TEXTURE_MATRIX;
+   case STATE_PROGRAM_MATRIX:
+      return _NEW_TRACK_MATRIX;
+
+   case STATE_DEPTH_RANGE:
+      return _NEW_VIEWPORT;
+
+   case STATE_FRAGMENT_PROGRAM:
+   case STATE_VERTEX_PROGRAM:
+      return _NEW_PROGRAM;
+
+   case STATE_NORMAL_SCALE:
+      return _NEW_MODELVIEW;
+
+   case STATE_INTERNAL:
+      switch (state[1]) {
+      case STATE_CURRENT_ATTRIB:
+         return _NEW_CURRENT_ATTRIB;
+      case STATE_CURRENT_ATTRIB_MAYBE_VP_CLAMPED:
+         return _NEW_CURRENT_ATTRIB | _NEW_LIGHT | _NEW_BUFFERS;
+
+      case STATE_NORMAL_SCALE:
+         return _NEW_MODELVIEW;
+
+      case STATE_TEXRECT_SCALE:
+      case STATE_SHADOW_AMBIENT:
+      case STATE_ROT_MATRIX_0:
+      case STATE_ROT_MATRIX_1:
+	 return _NEW_TEXTURE;
+      case STATE_FOG_PARAMS_OPTIMIZED:
+	 return _NEW_FOG;
+      case STATE_POINT_SIZE_CLAMPED:
+      case STATE_POINT_SIZE_IMPL_CLAMP:
+         return _NEW_POINT | _NEW_MULTISAMPLE;
+      case STATE_LIGHT_SPOT_DIR_NORMALIZED:
+      case STATE_LIGHT_POSITION:
+      case STATE_LIGHT_POSITION_NORMALIZED:
+      case STATE_LIGHT_HALF_VECTOR:
+         return _NEW_LIGHT;
+
+      case STATE_PT_SCALE:
+      case STATE_PT_BIAS:
+         return _NEW_PIXEL;
+
+      case STATE_FB_SIZE:
+      case STATE_FB_WPOS_Y_TRANSFORM:
+         return _NEW_BUFFERS;
+
+      default:
+         /* unknown state indexes are silently ignored and
+         *  no flag set, since it is handled by the driver.
+         */
+	 return 0;
+      }
+
+   default:
+      _mesa_problem(NULL, "unexpected state[0] in make_state_flags()");
+      return 0;
+   }
+}
+
+
+static void
+append(char *dst, const char *src)
+{
+   while (*dst)
+      dst++;
+   while (*src)
+     *dst++ = *src++;
+   *dst = 0;
+}
+
+
+/**
+ * Convert token 'k' to a string, append it onto 'dst' string.
+ */
+static void
+append_token(char *dst, gl_state_index k)
+{
+   switch (k) {
+   case STATE_MATERIAL:
+      append(dst, "material");
+      break;
+   case STATE_LIGHT:
+      append(dst, "light");
+      break;
+   case STATE_LIGHTMODEL_AMBIENT:
+      append(dst, "lightmodel.ambient");
+      break;
+   case STATE_LIGHTMODEL_SCENECOLOR:
+      break;
+   case STATE_LIGHTPROD:
+      append(dst, "lightprod");
+      break;
+   case STATE_TEXGEN:
+      append(dst, "texgen");
+      break;
+   case STATE_FOG_COLOR:
+      append(dst, "fog.color");
+      break;
+   case STATE_FOG_PARAMS:
+      append(dst, "fog.params");
+      break;
+   case STATE_CLIPPLANE:
+      append(dst, "clip");
+      break;
+   case STATE_POINT_SIZE:
+      append(dst, "point.size");
+      break;
+   case STATE_POINT_ATTENUATION:
+      append(dst, "point.attenuation");
+      break;
+   case STATE_MODELVIEW_MATRIX:
+      append(dst, "matrix.modelview");
+      break;
+   case STATE_PROJECTION_MATRIX:
+      append(dst, "matrix.projection");
+      break;
+   case STATE_MVP_MATRIX:
+      append(dst, "matrix.mvp");
+      break;
+   case STATE_TEXTURE_MATRIX:
+      append(dst, "matrix.texture");
+      break;
+   case STATE_PROGRAM_MATRIX:
+      append(dst, "matrix.program");
+      break;
+   case STATE_MATRIX_INVERSE:
+      append(dst, ".inverse");
+      break;
+   case STATE_MATRIX_TRANSPOSE:
+      append(dst, ".transpose");
+      break;
+   case STATE_MATRIX_INVTRANS:
+      append(dst, ".invtrans");
+      break;
+   case STATE_AMBIENT:
+      append(dst, ".ambient");
+      break;
+   case STATE_DIFFUSE:
+      append(dst, ".diffuse");
+      break;
+   case STATE_SPECULAR:
+      append(dst, ".specular");
+      break;
+   case STATE_EMISSION:
+      append(dst, ".emission");
+      break;
+   case STATE_SHININESS:
+      append(dst, "lshininess");
+      break;
+   case STATE_HALF_VECTOR:
+      append(dst, ".half");
+      break;
+   case STATE_POSITION:
+      append(dst, ".position");
+      break;
+   case STATE_ATTENUATION:
+      append(dst, ".attenuation");
+      break;
+   case STATE_SPOT_DIRECTION:
+      append(dst, ".spot.direction");
+      break;
+   case STATE_SPOT_CUTOFF:
+      append(dst, ".spot.cutoff");
+      break;
+   case STATE_TEXGEN_EYE_S:
+      append(dst, ".eye.s");
+      break;
+   case STATE_TEXGEN_EYE_T:
+      append(dst, ".eye.t");
+      break;
+   case STATE_TEXGEN_EYE_R:
+      append(dst, ".eye.r");
+      break;
+   case STATE_TEXGEN_EYE_Q:
+      append(dst, ".eye.q");
+      break;
+   case STATE_TEXGEN_OBJECT_S:
+      append(dst, ".object.s");
+      break;
+   case STATE_TEXGEN_OBJECT_T:
+      append(dst, ".object.t");
+      break;
+   case STATE_TEXGEN_OBJECT_R:
+      append(dst, ".object.r");
+      break;
+   case STATE_TEXGEN_OBJECT_Q:
+      append(dst, ".object.q");
+      break;
+   case STATE_TEXENV_COLOR:
+      append(dst, "texenv");
+      break;
+   case STATE_DEPTH_RANGE:
+      append(dst, "depth.range");
+      break;
+   case STATE_VERTEX_PROGRAM:
+   case STATE_FRAGMENT_PROGRAM:
+      break;
+   case STATE_ENV:
+      append(dst, "env");
+      break;
+   case STATE_LOCAL:
+      append(dst, "local");
+      break;
+   /* BEGIN internal state vars */
+   case STATE_INTERNAL:
+      append(dst, ".internal.");
+      break;
+   case STATE_CURRENT_ATTRIB:
+      append(dst, "current");
+      break;
+   case STATE_NORMAL_SCALE:
+      append(dst, "normalScale");
+      break;
+   case STATE_TEXRECT_SCALE:
+      append(dst, "texrectScale");
+      break;
+   case STATE_FOG_PARAMS_OPTIMIZED:
+      append(dst, "fogParamsOptimized");
+      break;
+   case STATE_POINT_SIZE_CLAMPED:
+      append(dst, "pointSizeClamped");
+      break;
+   case STATE_POINT_SIZE_IMPL_CLAMP:
+      append(dst, "pointSizeImplClamp");
+      break;
+   case STATE_LIGHT_SPOT_DIR_NORMALIZED:
+      append(dst, "lightSpotDirNormalized");
+      break;
+   case STATE_LIGHT_POSITION:
+      append(dst, "lightPosition");
+      break;
+   case STATE_LIGHT_POSITION_NORMALIZED:
+      append(dst, "light.position.normalized");
+      break;
+   case STATE_LIGHT_HALF_VECTOR:
+      append(dst, "lightHalfVector");
+      break;
+   case STATE_PT_SCALE:
+      append(dst, "PTscale");
+      break;
+   case STATE_PT_BIAS:
+      append(dst, "PTbias");
+      break;
+   case STATE_SHADOW_AMBIENT:
+      append(dst, "CompareFailValue");
+      break;
+   case STATE_FB_SIZE:
+      append(dst, "FbSize");
+      break;
+   case STATE_FB_WPOS_Y_TRANSFORM:
+      append(dst, "FbWposYTransform");
+      break;
+   case STATE_ROT_MATRIX_0:
+      append(dst, "rotMatrixRow0");
+      break;
+   case STATE_ROT_MATRIX_1:
+      append(dst, "rotMatrixRow1");
+      break;
+   default:
+      /* probably STATE_INTERNAL_DRIVER+i (driver private state) */
+      append(dst, "driverState");
+   }
+}
+
+static void
+append_face(char *dst, GLint face)
+{
+   if (face == 0)
+      append(dst, "front.");
+   else
+      append(dst, "back.");
+}
+
+static void
+append_index(char *dst, GLint index)
+{
+   char s[20];
+   sprintf(s, "[%d]", index);
+   append(dst, s);
+}
+
+/**
+ * Make a string from the given state vector.
+ * For example, return "state.matrix.texture[2].inverse".
+ * Use free() to deallocate the string.
+ */
+char *
+_mesa_program_state_string(const gl_state_index state[STATE_LENGTH])
+{
+   char str[1000] = "";
+   char tmp[30];
+
+   append(str, "state.");
+   append_token(str, state[0]);
+
+   switch (state[0]) {
+   case STATE_MATERIAL:
+      append_face(str, state[1]);
+      append_token(str, state[2]);
+      break;
+   case STATE_LIGHT:
+      append_index(str, state[1]); /* light number [i]. */
+      append_token(str, state[2]); /* coefficients */
+      break;
+   case STATE_LIGHTMODEL_AMBIENT:
+      append(str, "lightmodel.ambient");
+      break;
+   case STATE_LIGHTMODEL_SCENECOLOR:
+      if (state[1] == 0) {
+         append(str, "lightmodel.front.scenecolor");
+      }
+      else {
+         append(str, "lightmodel.back.scenecolor");
+      }
+      break;
+   case STATE_LIGHTPROD:
+      append_index(str, state[1]); /* light number [i]. */
+      append_face(str, state[2]);
+      append_token(str, state[3]);
+      break;
+   case STATE_TEXGEN:
+      append_index(str, state[1]); /* tex unit [i] */
+      append_token(str, state[2]); /* plane coef */
+      break;
+   case STATE_TEXENV_COLOR:
+      append_index(str, state[1]); /* tex unit [i] */
+      append(str, "color");
+      break;
+   case STATE_CLIPPLANE:
+      append_index(str, state[1]); /* plane [i] */
+      append(str, ".plane");
+      break;
+   case STATE_MODELVIEW_MATRIX:
+   case STATE_PROJECTION_MATRIX:
+   case STATE_MVP_MATRIX:
+   case STATE_TEXTURE_MATRIX:
+   case STATE_PROGRAM_MATRIX:
+      {
+         /* state[0] = modelview, projection, texture, etc. */
+         /* state[1] = which texture matrix or program matrix */
+         /* state[2] = first row to fetch */
+         /* state[3] = last row to fetch */
+         /* state[4] = transpose, inverse or invtrans */
+         const gl_state_index mat = state[0];
+         const GLuint index = (GLuint) state[1];
+         const GLuint firstRow = (GLuint) state[2];
+         const GLuint lastRow = (GLuint) state[3];
+         const gl_state_index modifier = state[4];
+         if (index ||
+             mat == STATE_TEXTURE_MATRIX ||
+             mat == STATE_PROGRAM_MATRIX)
+            append_index(str, index);
+         if (modifier)
+            append_token(str, modifier);
+         if (firstRow == lastRow)
+            sprintf(tmp, ".row[%d]", firstRow);
+         else
+            sprintf(tmp, ".row[%d..%d]", firstRow, lastRow);
+         append(str, tmp);
+      }
+      break;
+   case STATE_POINT_SIZE:
+      break;
+   case STATE_POINT_ATTENUATION:
+      break;
+   case STATE_FOG_PARAMS:
+      break;
+   case STATE_FOG_COLOR:
+      break;
+   case STATE_DEPTH_RANGE:
+      break;
+   case STATE_FRAGMENT_PROGRAM:
+   case STATE_VERTEX_PROGRAM:
+      /* state[1] = {STATE_ENV, STATE_LOCAL} */
+      /* state[2] = parameter index          */
+      append_token(str, state[1]);
+      append_index(str, state[2]);
+      break;
+   case STATE_NORMAL_SCALE:
+      break;
+   case STATE_INTERNAL:
+      append_token(str, state[1]);
+      if (state[1] == STATE_CURRENT_ATTRIB)
+         append_index(str, state[2]);
+       break;
+   default:
+      _mesa_problem(NULL, "Invalid state in _mesa_program_state_string");
+      break;
+   }
+
+   return _mesa_strdup(str);
+}
+
+
+/**
+ * Loop over all the parameters in a parameter list.  If the parameter
+ * is a GL state reference, look up the current value of that state
+ * variable and put it into the parameter's Value[4] array.
+ * Other parameter types never change or are explicitly set by the user
+ * with glUniform() or glProgramParameter(), etc.
+ * This would be called at glBegin time.
+ */
+void
+_mesa_load_state_parameters(struct gl_context *ctx,
+                            struct gl_program_parameter_list *paramList)
+{
+   GLuint i;
+
+   if (!paramList)
+      return;
+
+   for (i = 0; i < paramList->NumParameters; i++) {
+      if (paramList->Parameters[i].Type == PROGRAM_STATE_VAR) {
+         _mesa_fetch_state(ctx,
+			   paramList->Parameters[i].StateIndexes,
+                           paramList->ParameterValues[i]);
+      }
+   }
+}
+
+
+/**
+ * Copy the 16 elements of a matrix into four consecutive program
+ * registers starting at 'pos'.
+ */
+static void
+load_matrix(GLfloat registers[][4], GLuint pos, const GLfloat mat[16])
+{
+   GLuint i;
+   for (i = 0; i < 4; i++) {
+      registers[pos + i][0] = mat[0 + i];
+      registers[pos + i][1] = mat[4 + i];
+      registers[pos + i][2] = mat[8 + i];
+      registers[pos + i][3] = mat[12 + i];
+   }
+}
+
+
+/**
+ * As above, but transpose the matrix.
+ */
+static void
+load_transpose_matrix(GLfloat registers[][4], GLuint pos,
+                      const GLfloat mat[16])
+{
+   memcpy(registers[pos], mat, 16 * sizeof(GLfloat));
+}
+
+
+/**
+ * Load current vertex program's parameter registers with tracked
+ * matrices (if NV program).  This only needs to be done per
+ * glBegin/glEnd, not per-vertex.
+ */
+void
+_mesa_load_tracked_matrices(struct gl_context *ctx)
+{
+   GLuint i;
+
+   for (i = 0; i < MAX_NV_VERTEX_PROGRAM_PARAMS / 4; i++) {
+      /* point 'mat' at source matrix */
+      GLmatrix *mat;
+      if (ctx->VertexProgram.TrackMatrix[i] == GL_MODELVIEW) {
+         mat = ctx->ModelviewMatrixStack.Top;
+      }
+      else if (ctx->VertexProgram.TrackMatrix[i] == GL_PROJECTION) {
+         mat = ctx->ProjectionMatrixStack.Top;
+      }
+      else if (ctx->VertexProgram.TrackMatrix[i] == GL_TEXTURE) {
+         GLuint unit = MIN2(ctx->Texture.CurrentUnit,
+                            Elements(ctx->TextureMatrixStack) - 1);
+         mat = ctx->TextureMatrixStack[unit].Top;
+      }
+      else if (ctx->VertexProgram.TrackMatrix[i]==GL_MODELVIEW_PROJECTION_NV) {
+         /* XXX verify the combined matrix is up to date */
+         mat = &ctx->_ModelProjectMatrix;
+      }
+      else if (ctx->VertexProgram.TrackMatrix[i] >= GL_MATRIX0_NV &&
+               ctx->VertexProgram.TrackMatrix[i] <= GL_MATRIX7_NV) {
+         GLuint n = ctx->VertexProgram.TrackMatrix[i] - GL_MATRIX0_NV;
+         ASSERT(n < Elements(ctx->ProgramMatrixStack));
+         mat = ctx->ProgramMatrixStack[n].Top;
+      }
+      else {
+         /* no matrix is tracked, but we leave the register values as-is */
+         assert(ctx->VertexProgram.TrackMatrix[i] == GL_NONE);
+         continue;
+      }
+
+      /* load the matrix values into sequential registers */
+      if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_IDENTITY_NV) {
+         load_matrix(ctx->VertexProgram.Parameters, i*4, mat->m);
+      }
+      else if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_INVERSE_NV) {
+         _math_matrix_analyse(mat); /* update the inverse */
+         ASSERT(!_math_matrix_is_dirty(mat));
+         load_matrix(ctx->VertexProgram.Parameters, i*4, mat->inv);
+      }
+      else if (ctx->VertexProgram.TrackMatrixTransform[i] == GL_TRANSPOSE_NV) {
+         load_transpose_matrix(ctx->VertexProgram.Parameters, i*4, mat->m);
+      }
+      else {
+         assert(ctx->VertexProgram.TrackMatrixTransform[i]
+                == GL_INVERSE_TRANSPOSE_NV);
+         _math_matrix_analyse(mat); /* update the inverse */
+         ASSERT(!_math_matrix_is_dirty(mat));
+         load_transpose_matrix(ctx->VertexProgram.Parameters, i*4, mat->inv);
+      }
+   }
+}
diff --git a/mesalib/src/mesa/program/prog_statevars.h b/mesalib/src/mesa/program/prog_statevars.h
index a92b77855..9fe8d81b3 100644
--- a/mesalib/src/mesa/program/prog_statevars.h
+++ b/mesalib/src/mesa/program/prog_statevars.h
@@ -1,147 +1,148 @@
-/*
- * Mesa 3-D graphics library
- * Version:  7.1
- *
- * Copyright (C) 1999-2007  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"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-#ifndef PROG_STATEVARS_H
-#define PROG_STATEVARS_H
-
-#include "main/glheader.h"
-
-struct gl_context;
-struct gl_program_parameter_list;
-
-/**
- * Number of STATE_* values we need to address any GL state.
- * Used to dimension arrays.
- */
-#define STATE_LENGTH 5
-
-
-/**
- * Used for describing GL state referenced from inside ARB vertex and
- * fragment programs.
- * A string such as "state.light[0].ambient" gets translated into a
- * sequence of tokens such as [ STATE_LIGHT, 0, STATE_AMBIENT ].
- *
- * For state that's an array, like STATE_CLIPPLANE, the 2nd token [1] should
- * always be the array index.
- */
-typedef enum gl_state_index_ {
-   STATE_MATERIAL = 100,  /* start at 100 so small ints are seen as ints */
-
-   STATE_LIGHT,
-   STATE_LIGHTMODEL_AMBIENT,
-   STATE_LIGHTMODEL_SCENECOLOR,
-   STATE_LIGHTPROD,
-
-   STATE_TEXGEN,
-
-   STATE_FOG_COLOR,
-   STATE_FOG_PARAMS,
-
-   STATE_CLIPPLANE,
-
-   STATE_POINT_SIZE,
-   STATE_POINT_ATTENUATION,
-
-   STATE_MODELVIEW_MATRIX,
-   STATE_PROJECTION_MATRIX,
-   STATE_MVP_MATRIX,
-   STATE_TEXTURE_MATRIX,
-   STATE_PROGRAM_MATRIX,
-   STATE_MATRIX_INVERSE,
-   STATE_MATRIX_TRANSPOSE,
-   STATE_MATRIX_INVTRANS,
-
-   STATE_AMBIENT,
-   STATE_DIFFUSE,
-   STATE_SPECULAR,
-   STATE_EMISSION,
-   STATE_SHININESS,
-   STATE_HALF_VECTOR,
-
-   STATE_POSITION,       /**< xyzw = position */
-   STATE_ATTENUATION,    /**< xyz = attenuation, w = spot exponent */
-   STATE_SPOT_DIRECTION, /**< xyz = direction, w = cos(cutoff) */
-   STATE_SPOT_CUTOFF,    /**< x = cutoff, yzw = undefined */
-
-   STATE_TEXGEN_EYE_S,
-   STATE_TEXGEN_EYE_T,
-   STATE_TEXGEN_EYE_R,
-   STATE_TEXGEN_EYE_Q,
-   STATE_TEXGEN_OBJECT_S,
-   STATE_TEXGEN_OBJECT_T,
-   STATE_TEXGEN_OBJECT_R,
-   STATE_TEXGEN_OBJECT_Q,
-
-   STATE_TEXENV_COLOR,
-
-   STATE_DEPTH_RANGE,
-
-   STATE_VERTEX_PROGRAM,
-   STATE_FRAGMENT_PROGRAM,
-
-   STATE_ENV,
-   STATE_LOCAL,
-
-   STATE_INTERNAL,		/* Mesa additions */
-   STATE_CURRENT_ATTRIB,        /* ctx->Current vertex attrib value */
-   STATE_NORMAL_SCALE,
-   STATE_TEXRECT_SCALE,
-   STATE_FOG_PARAMS_OPTIMIZED,  /* for faster fog calc */
-   STATE_POINT_SIZE_CLAMPED,    /* includes implementation dependent size clamp */
-   STATE_POINT_SIZE_IMPL_CLAMP, /* for implementation clamp only in vs */
-   STATE_LIGHT_SPOT_DIR_NORMALIZED,   /* pre-normalized spot dir */
-   STATE_LIGHT_POSITION,              /* object vs eye space */
-   STATE_LIGHT_POSITION_NORMALIZED,   /* object vs eye space */
-   STATE_LIGHT_HALF_VECTOR,           /* object vs eye space */
-   STATE_PT_SCALE,              /**< Pixel transfer RGBA scale */
-   STATE_PT_BIAS,               /**< Pixel transfer RGBA bias */
-   STATE_SHADOW_AMBIENT,        /**< ARB_shadow_ambient fail value; token[2] is texture unit index */
-   STATE_FB_SIZE,               /**< (width-1, height-1, 0, 0) */
-   STATE_FB_WPOS_Y_TRANSFORM,   /**< (1, 0, -1, height-1) if a FBO is bound, (-1, height-1, 1, 0) otherwise */
-   STATE_ROT_MATRIX_0,          /**< ATI_envmap_bumpmap, rot matrix row 0 */
-   STATE_ROT_MATRIX_1,          /**< ATI_envmap_bumpmap, rot matrix row 1 */
-   STATE_INTERNAL_DRIVER	/* first available state index for drivers (must be last) */
-} gl_state_index;
-
-
-
-extern void
-_mesa_load_state_parameters(struct gl_context *ctx,
-                            struct gl_program_parameter_list *paramList);
-
-
-extern GLbitfield
-_mesa_program_state_flags(const gl_state_index state[STATE_LENGTH]);
-
-
-extern char *
-_mesa_program_state_string(const gl_state_index state[STATE_LENGTH]);
-
-
-extern void
-_mesa_load_tracked_matrices(struct gl_context *ctx);
-
-
-#endif /* PROG_STATEVARS_H */
+/*
+ * Mesa 3-D graphics library
+ * Version:  7.1
+ *
+ * Copyright (C) 1999-2007  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"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+#ifndef PROG_STATEVARS_H
+#define PROG_STATEVARS_H
+
+#include "main/glheader.h"
+
+struct gl_context;
+struct gl_program_parameter_list;
+
+/**
+ * Number of STATE_* values we need to address any GL state.
+ * Used to dimension arrays.
+ */
+#define STATE_LENGTH 5
+
+
+/**
+ * Used for describing GL state referenced from inside ARB vertex and
+ * fragment programs.
+ * A string such as "state.light[0].ambient" gets translated into a
+ * sequence of tokens such as [ STATE_LIGHT, 0, STATE_AMBIENT ].
+ *
+ * For state that's an array, like STATE_CLIPPLANE, the 2nd token [1] should
+ * always be the array index.
+ */
+typedef enum gl_state_index_ {
+   STATE_MATERIAL = 100,  /* start at 100 so small ints are seen as ints */
+
+   STATE_LIGHT,
+   STATE_LIGHTMODEL_AMBIENT,
+   STATE_LIGHTMODEL_SCENECOLOR,
+   STATE_LIGHTPROD,
+
+   STATE_TEXGEN,
+
+   STATE_FOG_COLOR,
+   STATE_FOG_PARAMS,
+
+   STATE_CLIPPLANE,
+
+   STATE_POINT_SIZE,
+   STATE_POINT_ATTENUATION,
+
+   STATE_MODELVIEW_MATRIX,
+   STATE_PROJECTION_MATRIX,
+   STATE_MVP_MATRIX,
+   STATE_TEXTURE_MATRIX,
+   STATE_PROGRAM_MATRIX,
+   STATE_MATRIX_INVERSE,
+   STATE_MATRIX_TRANSPOSE,
+   STATE_MATRIX_INVTRANS,
+
+   STATE_AMBIENT,
+   STATE_DIFFUSE,
+   STATE_SPECULAR,
+   STATE_EMISSION,
+   STATE_SHININESS,
+   STATE_HALF_VECTOR,
+
+   STATE_POSITION,       /**< xyzw = position */
+   STATE_ATTENUATION,    /**< xyz = attenuation, w = spot exponent */
+   STATE_SPOT_DIRECTION, /**< xyz = direction, w = cos(cutoff) */
+   STATE_SPOT_CUTOFF,    /**< x = cutoff, yzw = undefined */
+
+   STATE_TEXGEN_EYE_S,
+   STATE_TEXGEN_EYE_T,
+   STATE_TEXGEN_EYE_R,
+   STATE_TEXGEN_EYE_Q,
+   STATE_TEXGEN_OBJECT_S,
+   STATE_TEXGEN_OBJECT_T,
+   STATE_TEXGEN_OBJECT_R,
+   STATE_TEXGEN_OBJECT_Q,
+
+   STATE_TEXENV_COLOR,
+
+   STATE_DEPTH_RANGE,
+
+   STATE_VERTEX_PROGRAM,
+   STATE_FRAGMENT_PROGRAM,
+
+   STATE_ENV,
+   STATE_LOCAL,
+
+   STATE_INTERNAL,		/* Mesa additions */
+   STATE_CURRENT_ATTRIB,        /* ctx->Current vertex attrib value */
+   STATE_CURRENT_ATTRIB_MAYBE_VP_CLAMPED,        /* ctx->Current vertex attrib value after passthrough vertex processing */
+   STATE_NORMAL_SCALE,
+   STATE_TEXRECT_SCALE,
+   STATE_FOG_PARAMS_OPTIMIZED,  /* for faster fog calc */
+   STATE_POINT_SIZE_CLAMPED,    /* includes implementation dependent size clamp */
+   STATE_POINT_SIZE_IMPL_CLAMP, /* for implementation clamp only in vs */
+   STATE_LIGHT_SPOT_DIR_NORMALIZED,   /* pre-normalized spot dir */
+   STATE_LIGHT_POSITION,              /* object vs eye space */
+   STATE_LIGHT_POSITION_NORMALIZED,   /* object vs eye space */
+   STATE_LIGHT_HALF_VECTOR,           /* object vs eye space */
+   STATE_PT_SCALE,              /**< Pixel transfer RGBA scale */
+   STATE_PT_BIAS,               /**< Pixel transfer RGBA bias */
+   STATE_SHADOW_AMBIENT,        /**< ARB_shadow_ambient fail value; token[2] is texture unit index */
+   STATE_FB_SIZE,               /**< (width-1, height-1, 0, 0) */
+   STATE_FB_WPOS_Y_TRANSFORM,   /**< (1, 0, -1, height-1) if a FBO is bound, (-1, height-1, 1, 0) otherwise */
+   STATE_ROT_MATRIX_0,          /**< ATI_envmap_bumpmap, rot matrix row 0 */
+   STATE_ROT_MATRIX_1,          /**< ATI_envmap_bumpmap, rot matrix row 1 */
+   STATE_INTERNAL_DRIVER	/* first available state index for drivers (must be last) */
+} gl_state_index;
+
+
+
+extern void
+_mesa_load_state_parameters(struct gl_context *ctx,
+                            struct gl_program_parameter_list *paramList);
+
+
+extern GLbitfield
+_mesa_program_state_flags(const gl_state_index state[STATE_LENGTH]);
+
+
+extern char *
+_mesa_program_state_string(const gl_state_index state[STATE_LENGTH]);
+
+
+extern void
+_mesa_load_tracked_matrices(struct gl_context *ctx);
+
+
+#endif /* PROG_STATEVARS_H */
diff --git a/mesalib/src/mesa/program/programopt.c b/mesalib/src/mesa/program/programopt.c
index 6601f7416..5ad9571f7 100644
--- a/mesalib/src/mesa/program/programopt.c
+++ b/mesalib/src/mesa/program/programopt.c
@@ -1,669 +1,670 @@
-/*
- * Mesa 3-D graphics library
- * Version:  6.5.3
- *
- * Copyright (C) 1999-2007  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"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-/**
- * \file  programopt.c 
- * Vertex/Fragment program optimizations and transformations for program
- * options, etc.
- *
- * \author Brian Paul
- */
-
-
-#include "main/glheader.h"
-#include "main/context.h"
-#include "prog_parameter.h"
-#include "prog_statevars.h"
-#include "program.h"
-#include "programopt.h"
-#include "prog_instruction.h"
-
-
-/**
- * This function inserts instructions for coordinate modelview * projection
- * into a vertex program.
- * May be used to implement the position_invariant option.
- */
-static void
-_mesa_insert_mvp_dp4_code(struct gl_context *ctx, struct gl_vertex_program *vprog)
-{
-   struct prog_instruction *newInst;
-   const GLuint origLen = vprog->Base.NumInstructions;
-   const GLuint newLen = origLen + 4;
-   GLuint i;
-
-   /*
-    * Setup state references for the modelview/projection matrix.
-    * XXX we should check if these state vars are already declared.
-    */
-   static const gl_state_index mvpState[4][STATE_LENGTH] = {
-      { STATE_MVP_MATRIX, 0, 0, 0, 0 },  /* state.matrix.mvp.row[0] */
-      { STATE_MVP_MATRIX, 0, 1, 1, 0 },  /* state.matrix.mvp.row[1] */
-      { STATE_MVP_MATRIX, 0, 2, 2, 0 },  /* state.matrix.mvp.row[2] */
-      { STATE_MVP_MATRIX, 0, 3, 3, 0 },  /* state.matrix.mvp.row[3] */
-   };
-   GLint mvpRef[4];
-
-   for (i = 0; i < 4; i++) {
-      mvpRef[i] = _mesa_add_state_reference(vprog->Base.Parameters,
-                                            mvpState[i]);
-   }
-
-   /* Alloc storage for new instructions */
-   newInst = _mesa_alloc_instructions(newLen);
-   if (!newInst) {
-      _mesa_error(ctx, GL_OUT_OF_MEMORY,
-                  "glProgramString(inserting position_invariant code)");
-      return;
-   }
-
-   /*
-    * Generated instructions:
-    * newInst[0] = DP4 result.position.x, mvp.row[0], vertex.position;
-    * newInst[1] = DP4 result.position.y, mvp.row[1], vertex.position;
-    * newInst[2] = DP4 result.position.z, mvp.row[2], vertex.position;
-    * newInst[3] = DP4 result.position.w, mvp.row[3], vertex.position;
-    */
-   _mesa_init_instructions(newInst, 4);
-   for (i = 0; i < 4; i++) {
-      newInst[i].Opcode = OPCODE_DP4;
-      newInst[i].DstReg.File = PROGRAM_OUTPUT;
-      newInst[i].DstReg.Index = VERT_RESULT_HPOS;
-      newInst[i].DstReg.WriteMask = (WRITEMASK_X << i);
-      newInst[i].SrcReg[0].File = PROGRAM_STATE_VAR;
-      newInst[i].SrcReg[0].Index = mvpRef[i];
-      newInst[i].SrcReg[0].Swizzle = SWIZZLE_NOOP;
-      newInst[i].SrcReg[1].File = PROGRAM_INPUT;
-      newInst[i].SrcReg[1].Index = VERT_ATTRIB_POS;
-      newInst[i].SrcReg[1].Swizzle = SWIZZLE_NOOP;
-   }
-
-   /* Append original instructions after new instructions */
-   _mesa_copy_instructions (newInst + 4, vprog->Base.Instructions, origLen);
-
-   /* free old instructions */
-   _mesa_free_instructions(vprog->Base.Instructions, origLen);
-
-   /* install new instructions */
-   vprog->Base.Instructions = newInst;
-   vprog->Base.NumInstructions = newLen;
-   vprog->Base.InputsRead |= VERT_BIT_POS;
-   vprog->Base.OutputsWritten |= BITFIELD64_BIT(VERT_RESULT_HPOS);
-}
-
-
-static void
-_mesa_insert_mvp_mad_code(struct gl_context *ctx, struct gl_vertex_program *vprog)
-{
-   struct prog_instruction *newInst;
-   const GLuint origLen = vprog->Base.NumInstructions;
-   const GLuint newLen = origLen + 4;
-   GLuint hposTemp;
-   GLuint i;
-
-   /*
-    * Setup state references for the modelview/projection matrix.
-    * XXX we should check if these state vars are already declared.
-    */
-   static const gl_state_index mvpState[4][STATE_LENGTH] = {
-      { STATE_MVP_MATRIX, 0, 0, 0, STATE_MATRIX_TRANSPOSE },
-      { STATE_MVP_MATRIX, 0, 1, 1, STATE_MATRIX_TRANSPOSE },
-      { STATE_MVP_MATRIX, 0, 2, 2, STATE_MATRIX_TRANSPOSE },
-      { STATE_MVP_MATRIX, 0, 3, 3, STATE_MATRIX_TRANSPOSE },
-   };
-   GLint mvpRef[4];
-
-   for (i = 0; i < 4; i++) {
-      mvpRef[i] = _mesa_add_state_reference(vprog->Base.Parameters,
-                                            mvpState[i]);
-   }
-
-   /* Alloc storage for new instructions */
-   newInst = _mesa_alloc_instructions(newLen);
-   if (!newInst) {
-      _mesa_error(ctx, GL_OUT_OF_MEMORY,
-                  "glProgramString(inserting position_invariant code)");
-      return;
-   }
-
-   /* TEMP hposTemp; */
-   hposTemp = vprog->Base.NumTemporaries++;
-
-   /*
-    * Generated instructions:
-    *    emit_op2(p, OPCODE_MUL, tmp, 0, swizzle1(src,X), mat[0]);
-    *    emit_op3(p, OPCODE_MAD, tmp, 0, swizzle1(src,Y), mat[1], tmp);
-    *    emit_op3(p, OPCODE_MAD, tmp, 0, swizzle1(src,Z), mat[2], tmp);
-    *    emit_op3(p, OPCODE_MAD, dest, 0, swizzle1(src,W), mat[3], tmp);
-    */
-   _mesa_init_instructions(newInst, 4);
-
-   newInst[0].Opcode = OPCODE_MUL;
-   newInst[0].DstReg.File = PROGRAM_TEMPORARY;
-   newInst[0].DstReg.Index = hposTemp;
-   newInst[0].DstReg.WriteMask = WRITEMASK_XYZW;
-   newInst[0].SrcReg[0].File = PROGRAM_INPUT;
-   newInst[0].SrcReg[0].Index = VERT_ATTRIB_POS;
-   newInst[0].SrcReg[0].Swizzle = SWIZZLE_XXXX;
-   newInst[0].SrcReg[1].File = PROGRAM_STATE_VAR;
-   newInst[0].SrcReg[1].Index = mvpRef[0];
-   newInst[0].SrcReg[1].Swizzle = SWIZZLE_NOOP;
-
-   for (i = 1; i <= 2; i++) {
-      newInst[i].Opcode = OPCODE_MAD;
-      newInst[i].DstReg.File = PROGRAM_TEMPORARY;
-      newInst[i].DstReg.Index = hposTemp;
-      newInst[i].DstReg.WriteMask = WRITEMASK_XYZW;
-      newInst[i].SrcReg[0].File = PROGRAM_INPUT;
-      newInst[i].SrcReg[0].Index = VERT_ATTRIB_POS;
-      newInst[i].SrcReg[0].Swizzle = MAKE_SWIZZLE4(i,i,i,i);
-      newInst[i].SrcReg[1].File = PROGRAM_STATE_VAR;
-      newInst[i].SrcReg[1].Index = mvpRef[i];
-      newInst[i].SrcReg[1].Swizzle = SWIZZLE_NOOP;
-      newInst[i].SrcReg[2].File = PROGRAM_TEMPORARY;
-      newInst[i].SrcReg[2].Index = hposTemp;
-      newInst[1].SrcReg[2].Swizzle = SWIZZLE_NOOP;
-   }
-
-   newInst[3].Opcode = OPCODE_MAD;
-   newInst[3].DstReg.File = PROGRAM_OUTPUT;
-   newInst[3].DstReg.Index = VERT_RESULT_HPOS;
-   newInst[3].DstReg.WriteMask = WRITEMASK_XYZW;
-   newInst[3].SrcReg[0].File = PROGRAM_INPUT;
-   newInst[3].SrcReg[0].Index = VERT_ATTRIB_POS;
-   newInst[3].SrcReg[0].Swizzle = SWIZZLE_WWWW;
-   newInst[3].SrcReg[1].File = PROGRAM_STATE_VAR;
-   newInst[3].SrcReg[1].Index = mvpRef[3];
-   newInst[3].SrcReg[1].Swizzle = SWIZZLE_NOOP;
-   newInst[3].SrcReg[2].File = PROGRAM_TEMPORARY;
-   newInst[3].SrcReg[2].Index = hposTemp;
-   newInst[3].SrcReg[2].Swizzle = SWIZZLE_NOOP;
-
-
-   /* Append original instructions after new instructions */
-   _mesa_copy_instructions (newInst + 4, vprog->Base.Instructions, origLen);
-
-   /* free old instructions */
-   _mesa_free_instructions(vprog->Base.Instructions, origLen);
-
-   /* install new instructions */
-   vprog->Base.Instructions = newInst;
-   vprog->Base.NumInstructions = newLen;
-   vprog->Base.InputsRead |= VERT_BIT_POS;
-   vprog->Base.OutputsWritten |= BITFIELD64_BIT(VERT_RESULT_HPOS);
-}
-
-
-void
-_mesa_insert_mvp_code(struct gl_context *ctx, struct gl_vertex_program *vprog)
-{
-   if (ctx->mvp_with_dp4) 
-      _mesa_insert_mvp_dp4_code( ctx, vprog );
-   else
-      _mesa_insert_mvp_mad_code( ctx, vprog );
-}
-      
-
-
-
-
-
-/**
- * Append extra instructions onto the given fragment program to implement
- * the fog mode specified by fprog->FogOption.
- * The fragment.fogcoord input is used to compute the fog blend factor.
- *
- * XXX with a little work, this function could be adapted to add fog code
- * to vertex programs too.
- */
-void
-_mesa_append_fog_code(struct gl_context *ctx, struct gl_fragment_program *fprog)
-{
-   static const gl_state_index fogPStateOpt[STATE_LENGTH]
-      = { STATE_INTERNAL, STATE_FOG_PARAMS_OPTIMIZED, 0, 0, 0 };
-   static const gl_state_index fogColorState[STATE_LENGTH]
-      = { STATE_FOG_COLOR, 0, 0, 0, 0};
-   struct prog_instruction *newInst, *inst;
-   const GLuint origLen = fprog->Base.NumInstructions;
-   const GLuint newLen = origLen + 5;
-   GLuint i;
-   GLint fogPRefOpt, fogColorRef; /* state references */
-   GLuint colorTemp, fogFactorTemp; /* temporary registerss */
-
-   if (fprog->FogOption == GL_NONE) {
-      _mesa_problem(ctx, "_mesa_append_fog_code() called for fragment program"
-                    " with FogOption == GL_NONE");
-      return;
-   }
-
-   /* Alloc storage for new instructions */
-   newInst = _mesa_alloc_instructions(newLen);
-   if (!newInst) {
-      _mesa_error(ctx, GL_OUT_OF_MEMORY,
-                  "glProgramString(inserting fog_option code)");
-      return;
-   }
-
-   /* Copy orig instructions into new instruction buffer */
-   _mesa_copy_instructions(newInst, fprog->Base.Instructions, origLen);
-
-   /* PARAM fogParamsRefOpt = internal optimized fog params; */
-   fogPRefOpt
-      = _mesa_add_state_reference(fprog->Base.Parameters, fogPStateOpt);
-   /* PARAM fogColorRef = state.fog.color; */
-   fogColorRef
-      = _mesa_add_state_reference(fprog->Base.Parameters, fogColorState);
-
-   /* TEMP colorTemp; */
-   colorTemp = fprog->Base.NumTemporaries++;
-   /* TEMP fogFactorTemp; */
-   fogFactorTemp = fprog->Base.NumTemporaries++;
-
-   /* Scan program to find where result.color is written */
-   inst = newInst;
-   for (i = 0; i < fprog->Base.NumInstructions; i++) {
-      if (inst->Opcode == OPCODE_END)
-         break;
-      if (inst->DstReg.File == PROGRAM_OUTPUT &&
-          inst->DstReg.Index == FRAG_RESULT_COLOR) {
-         /* change the instruction to write to colorTemp w/ clamping */
-         inst->DstReg.File = PROGRAM_TEMPORARY;
-         inst->DstReg.Index = colorTemp;
-         inst->SaturateMode = SATURATE_ZERO_ONE;
-         /* don't break (may be several writes to result.color) */
-      }
-      inst++;
-   }
-   assert(inst->Opcode == OPCODE_END); /* we'll overwrite this inst */
-
-   _mesa_init_instructions(inst, 5);
-
-   /* emit instructions to compute fog blending factor */
-   if (fprog->FogOption == GL_LINEAR) {
-      /* MAD fogFactorTemp.x, fragment.fogcoord.x, fogPRefOpt.x, fogPRefOpt.y; */
-      inst->Opcode = OPCODE_MAD;
-      inst->DstReg.File = PROGRAM_TEMPORARY;
-      inst->DstReg.Index = fogFactorTemp;
-      inst->DstReg.WriteMask = WRITEMASK_X;
-      inst->SrcReg[0].File = PROGRAM_INPUT;
-      inst->SrcReg[0].Index = FRAG_ATTRIB_FOGC;
-      inst->SrcReg[0].Swizzle = SWIZZLE_XXXX;
-      inst->SrcReg[1].File = PROGRAM_STATE_VAR;
-      inst->SrcReg[1].Index = fogPRefOpt;
-      inst->SrcReg[1].Swizzle = SWIZZLE_XXXX;
-      inst->SrcReg[2].File = PROGRAM_STATE_VAR;
-      inst->SrcReg[2].Index = fogPRefOpt;
-      inst->SrcReg[2].Swizzle = SWIZZLE_YYYY;
-      inst->SaturateMode = SATURATE_ZERO_ONE;
-      inst++;
-   }
-   else {
-      ASSERT(fprog->FogOption == GL_EXP || fprog->FogOption == GL_EXP2);
-      /* fogPRefOpt.z = d/ln(2), fogPRefOpt.w = d/sqrt(ln(2) */
-      /* EXP: MUL fogFactorTemp.x, fogPRefOpt.z, fragment.fogcoord.x; */
-      /* EXP2: MUL fogFactorTemp.x, fogPRefOpt.w, fragment.fogcoord.x; */
-      inst->Opcode = OPCODE_MUL;
-      inst->DstReg.File = PROGRAM_TEMPORARY;
-      inst->DstReg.Index = fogFactorTemp;
-      inst->DstReg.WriteMask = WRITEMASK_X;
-      inst->SrcReg[0].File = PROGRAM_STATE_VAR;
-      inst->SrcReg[0].Index = fogPRefOpt;
-      inst->SrcReg[0].Swizzle
-         = (fprog->FogOption == GL_EXP) ? SWIZZLE_ZZZZ : SWIZZLE_WWWW;
-      inst->SrcReg[1].File = PROGRAM_INPUT;
-      inst->SrcReg[1].Index = FRAG_ATTRIB_FOGC;
-      inst->SrcReg[1].Swizzle = SWIZZLE_XXXX;
-      inst++;
-      if (fprog->FogOption == GL_EXP2) {
-         /* MUL fogFactorTemp.x, fogFactorTemp.x, fogFactorTemp.x; */
-         inst->Opcode = OPCODE_MUL;
-         inst->DstReg.File = PROGRAM_TEMPORARY;
-         inst->DstReg.Index = fogFactorTemp;
-         inst->DstReg.WriteMask = WRITEMASK_X;
-         inst->SrcReg[0].File = PROGRAM_TEMPORARY;
-         inst->SrcReg[0].Index = fogFactorTemp;
-         inst->SrcReg[0].Swizzle = SWIZZLE_XXXX;
-         inst->SrcReg[1].File = PROGRAM_TEMPORARY;
-         inst->SrcReg[1].Index = fogFactorTemp;
-         inst->SrcReg[1].Swizzle = SWIZZLE_XXXX;
-         inst++;
-      }
-      /* EX2_SAT fogFactorTemp.x, -fogFactorTemp.x; */
-      inst->Opcode = OPCODE_EX2;
-      inst->DstReg.File = PROGRAM_TEMPORARY;
-      inst->DstReg.Index = fogFactorTemp;
-      inst->DstReg.WriteMask = WRITEMASK_X;
-      inst->SrcReg[0].File = PROGRAM_TEMPORARY;
-      inst->SrcReg[0].Index = fogFactorTemp;
-      inst->SrcReg[0].Negate = NEGATE_XYZW;
-      inst->SrcReg[0].Swizzle = SWIZZLE_XXXX;
-      inst->SaturateMode = SATURATE_ZERO_ONE;
-      inst++;
-   }
-   /* LRP result.color.xyz, fogFactorTemp.xxxx, colorTemp, fogColorRef; */
-   inst->Opcode = OPCODE_LRP;
-   inst->DstReg.File = PROGRAM_OUTPUT;
-   inst->DstReg.Index = FRAG_RESULT_COLOR;
-   inst->DstReg.WriteMask = WRITEMASK_XYZ;
-   inst->SrcReg[0].File = PROGRAM_TEMPORARY;
-   inst->SrcReg[0].Index = fogFactorTemp;
-   inst->SrcReg[0].Swizzle = SWIZZLE_XXXX;
-   inst->SrcReg[1].File = PROGRAM_TEMPORARY;
-   inst->SrcReg[1].Index = colorTemp;
-   inst->SrcReg[1].Swizzle = SWIZZLE_NOOP;
-   inst->SrcReg[2].File = PROGRAM_STATE_VAR;
-   inst->SrcReg[2].Index = fogColorRef;
-   inst->SrcReg[2].Swizzle = SWIZZLE_NOOP;
-   inst++;
-   /* MOV result.color.w, colorTemp.x;  # copy alpha */
-   inst->Opcode = OPCODE_MOV;
-   inst->DstReg.File = PROGRAM_OUTPUT;
-   inst->DstReg.Index = FRAG_RESULT_COLOR;
-   inst->DstReg.WriteMask = WRITEMASK_W;
-   inst->SrcReg[0].File = PROGRAM_TEMPORARY;
-   inst->SrcReg[0].Index = colorTemp;
-   inst->SrcReg[0].Swizzle = SWIZZLE_NOOP;
-   inst++;
-   /* END; */
-   inst->Opcode = OPCODE_END;
-   inst++;
-
-   /* free old instructions */
-   _mesa_free_instructions(fprog->Base.Instructions, origLen);
-
-   /* install new instructions */
-   fprog->Base.Instructions = newInst;
-   fprog->Base.NumInstructions = inst - newInst;
-   fprog->Base.InputsRead |= FRAG_BIT_FOGC;
-   /* XXX do this?  fprog->FogOption = GL_NONE; */
-}
-
-
-
-static GLboolean
-is_texture_instruction(const struct prog_instruction *inst)
-{
-   switch (inst->Opcode) {
-   case OPCODE_TEX:
-   case OPCODE_TXB:
-   case OPCODE_TXD:
-   case OPCODE_TXL:
-   case OPCODE_TXP:
-   case OPCODE_TXP_NV:
-      return GL_TRUE;
-   default:
-      return GL_FALSE;
-   }
-}
-      
-
-/**
- * Count the number of texure indirections in the given program.
- * The program's NumTexIndirections field will be updated.
- * See the GL_ARB_fragment_program spec (issue 24) for details.
- * XXX we count texture indirections in texenvprogram.c (maybe use this code
- * instead and elsewhere).
- */
-void
-_mesa_count_texture_indirections(struct gl_program *prog)
-{
-   GLuint indirections = 1;
-   GLbitfield tempsOutput = 0x0;
-   GLbitfield aluTemps = 0x0;
-   GLuint i;
-
-   for (i = 0; i < prog->NumInstructions; i++) {
-      const struct prog_instruction *inst = prog->Instructions + i;
-
-      if (is_texture_instruction(inst)) {
-         if (((inst->SrcReg[0].File == PROGRAM_TEMPORARY) && 
-              (tempsOutput & (1 << inst->SrcReg[0].Index))) ||
-             ((inst->Opcode != OPCODE_KIL) &&
-              (inst->DstReg.File == PROGRAM_TEMPORARY) && 
-              (aluTemps & (1 << inst->DstReg.Index)))) 
-            {
-               indirections++;
-               tempsOutput = 0x0;
-               aluTemps = 0x0;
-            }
-      }
-      else {
-         GLuint j;
-         for (j = 0; j < 3; j++) {
-            if (inst->SrcReg[j].File == PROGRAM_TEMPORARY)
-               aluTemps |= (1 << inst->SrcReg[j].Index);
-         }
-         if (inst->DstReg.File == PROGRAM_TEMPORARY)
-            aluTemps |= (1 << inst->DstReg.Index);
-      }
-
-      if ((inst->Opcode != OPCODE_KIL) && (inst->DstReg.File == PROGRAM_TEMPORARY))
-         tempsOutput |= (1 << inst->DstReg.Index);
-   }
-
-   prog->NumTexIndirections = indirections;
-}
-
-
-/**
- * Count number of texture instructions in given program and update the
- * program's NumTexInstructions field.
- */
-void
-_mesa_count_texture_instructions(struct gl_program *prog)
-{
-   GLuint i;
-   prog->NumTexInstructions = 0;
-   for (i = 0; i < prog->NumInstructions; i++) {
-      prog->NumTexInstructions += is_texture_instruction(prog->Instructions + i);
-   }
-}
-
-
-/**
- * Scan/rewrite program to remove reads of custom (output) registers.
- * The passed type has to be either PROGRAM_OUTPUT or PROGRAM_VARYING
- * (for vertex shaders).
- * In GLSL shaders, varying vars can be read and written.
- * On some hardware, trying to read an output register causes trouble.
- * So, rewrite the program to use a temporary register in this case.
- */
-void
-_mesa_remove_output_reads(struct gl_program *prog, gl_register_file type)
-{
-   GLuint i;
-   GLint outputMap[VERT_RESULT_MAX];
-   GLuint numVaryingReads = 0;
-   GLboolean usedTemps[MAX_PROGRAM_TEMPS];
-   GLuint firstTemp = 0;
-
-   _mesa_find_used_registers(prog, PROGRAM_TEMPORARY,
-                             usedTemps, MAX_PROGRAM_TEMPS);
-
-   assert(type == PROGRAM_VARYING || type == PROGRAM_OUTPUT);
-   assert(prog->Target == GL_VERTEX_PROGRAM_ARB || type != PROGRAM_VARYING);
-
-   for (i = 0; i < VERT_RESULT_MAX; i++)
-      outputMap[i] = -1;
-
-   /* look for instructions which read from varying vars */
-   for (i = 0; i < prog->NumInstructions; i++) {
-      struct prog_instruction *inst = prog->Instructions + i;
-      const GLuint numSrc = _mesa_num_inst_src_regs(inst->Opcode);
-      GLuint j;
-      for (j = 0; j < numSrc; j++) {
-         if (inst->SrcReg[j].File == type) {
-            /* replace the read with a temp reg */
-            const GLuint var = inst->SrcReg[j].Index;
-            if (outputMap[var] == -1) {
-               numVaryingReads++;
-               outputMap[var] = _mesa_find_free_register(usedTemps,
-                                                         MAX_PROGRAM_TEMPS,
-                                                         firstTemp);
-               firstTemp = outputMap[var] + 1;
-            }
-            inst->SrcReg[j].File = PROGRAM_TEMPORARY;
-            inst->SrcReg[j].Index = outputMap[var];
-         }
-      }
-   }
-
-   if (numVaryingReads == 0)
-      return; /* nothing to be done */
-
-   /* look for instructions which write to the varying vars identified above */
-   for (i = 0; i < prog->NumInstructions; i++) {
-      struct prog_instruction *inst = prog->Instructions + i;
-      if (inst->DstReg.File == type &&
-          outputMap[inst->DstReg.Index] >= 0) {
-         /* change inst to write to the temp reg, instead of the varying */
-         inst->DstReg.File = PROGRAM_TEMPORARY;
-         inst->DstReg.Index = outputMap[inst->DstReg.Index];
-      }
-   }
-
-   /* insert new instructions to copy the temp vars to the varying vars */
-   {
-      struct prog_instruction *inst;
-      GLint endPos, var;
-
-      /* Look for END instruction and insert the new varying writes */
-      endPos = -1;
-      for (i = 0; i < prog->NumInstructions; i++) {
-         struct prog_instruction *inst = prog->Instructions + i;
-         if (inst->Opcode == OPCODE_END) {
-            endPos = i;
-            _mesa_insert_instructions(prog, i, numVaryingReads);
-            break;
-         }
-      }
-
-      assert(endPos >= 0);
-
-      /* insert new MOV instructions here */
-      inst = prog->Instructions + endPos;
-      for (var = 0; var < VERT_RESULT_MAX; var++) {
-         if (outputMap[var] >= 0) {
-            /* MOV VAR[var], TEMP[tmp]; */
-            inst->Opcode = OPCODE_MOV;
-            inst->DstReg.File = type;
-            inst->DstReg.Index = var;
-            inst->SrcReg[0].File = PROGRAM_TEMPORARY;
-            inst->SrcReg[0].Index = outputMap[var];
-            inst++;
-         }
-      }
-   }
-}
-
-
-/**
- * Make the given fragment program into a "no-op" shader.
- * Actually, just copy the incoming fragment color (or texcoord)
- * to the output color.
- * This is for debug/test purposes.
- */
-void
-_mesa_nop_fragment_program(struct gl_context *ctx, struct gl_fragment_program *prog)
-{
-   struct prog_instruction *inst;
-   GLuint inputAttr;
-
-   inst = _mesa_alloc_instructions(2);
-   if (!inst) {
-      _mesa_error(ctx, GL_OUT_OF_MEMORY, "_mesa_nop_fragment_program");
-      return;
-   }
-
-   _mesa_init_instructions(inst, 2);
-
-   inst[0].Opcode = OPCODE_MOV;
-   inst[0].DstReg.File = PROGRAM_OUTPUT;
-   inst[0].DstReg.Index = FRAG_RESULT_COLOR;
-   inst[0].SrcReg[0].File = PROGRAM_INPUT;
-   if (prog->Base.InputsRead & FRAG_BIT_COL0)
-      inputAttr = FRAG_ATTRIB_COL0;
-   else
-      inputAttr = FRAG_ATTRIB_TEX0;
-   inst[0].SrcReg[0].Index = inputAttr;
-
-   inst[1].Opcode = OPCODE_END;
-
-   _mesa_free_instructions(prog->Base.Instructions,
-                           prog->Base.NumInstructions);
-
-   prog->Base.Instructions = inst;
-   prog->Base.NumInstructions = 2;
-   prog->Base.InputsRead = 1 << inputAttr;
-   prog->Base.OutputsWritten = BITFIELD64_BIT(FRAG_RESULT_COLOR);
-}
-
-
-/**
- * \sa _mesa_nop_fragment_program
- * Replace the given vertex program with a "no-op" program that just
- * transforms vertex position and emits color.
- */
-void
-_mesa_nop_vertex_program(struct gl_context *ctx, struct gl_vertex_program *prog)
-{
-   struct prog_instruction *inst;
-   GLuint inputAttr;
-
-   /*
-    * Start with a simple vertex program that emits color.
-    */
-   inst = _mesa_alloc_instructions(2);
-   if (!inst) {
-      _mesa_error(ctx, GL_OUT_OF_MEMORY, "_mesa_nop_vertex_program");
-      return;
-   }
-
-   _mesa_init_instructions(inst, 2);
-
-   inst[0].Opcode = OPCODE_MOV;
-   inst[0].DstReg.File = PROGRAM_OUTPUT;
-   inst[0].DstReg.Index = VERT_RESULT_COL0;
-   inst[0].SrcReg[0].File = PROGRAM_INPUT;
-   if (prog->Base.InputsRead & VERT_BIT_COLOR0)
-      inputAttr = VERT_ATTRIB_COLOR0;
-   else
-      inputAttr = VERT_ATTRIB_TEX0;
-   inst[0].SrcReg[0].Index = inputAttr;
-
-   inst[1].Opcode = OPCODE_END;
-
-   _mesa_free_instructions(prog->Base.Instructions,
-                           prog->Base.NumInstructions);
-
-   prog->Base.Instructions = inst;
-   prog->Base.NumInstructions = 2;
-   prog->Base.InputsRead = 1 << inputAttr;
-   prog->Base.OutputsWritten = BITFIELD64_BIT(VERT_RESULT_COL0);
-
-   /*
-    * Now insert code to do standard modelview/projection transformation.
-    */
-   _mesa_insert_mvp_code(ctx, prog);
-}
+/*
+ * Mesa 3-D graphics library
+ * Version:  6.5.3
+ *
+ * Copyright (C) 1999-2007  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"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+/**
+ * \file  programopt.c 
+ * Vertex/Fragment program optimizations and transformations for program
+ * options, etc.
+ *
+ * \author Brian Paul
+ */
+
+
+#include "main/glheader.h"
+#include "main/context.h"
+#include "prog_parameter.h"
+#include "prog_statevars.h"
+#include "program.h"
+#include "programopt.h"
+#include "prog_instruction.h"
+
+
+/**
+ * This function inserts instructions for coordinate modelview * projection
+ * into a vertex program.
+ * May be used to implement the position_invariant option.
+ */
+static void
+_mesa_insert_mvp_dp4_code(struct gl_context *ctx, struct gl_vertex_program *vprog)
+{
+   struct prog_instruction *newInst;
+   const GLuint origLen = vprog->Base.NumInstructions;
+   const GLuint newLen = origLen + 4;
+   GLuint i;
+
+   /*
+    * Setup state references for the modelview/projection matrix.
+    * XXX we should check if these state vars are already declared.
+    */
+   static const gl_state_index mvpState[4][STATE_LENGTH] = {
+      { STATE_MVP_MATRIX, 0, 0, 0, 0 },  /* state.matrix.mvp.row[0] */
+      { STATE_MVP_MATRIX, 0, 1, 1, 0 },  /* state.matrix.mvp.row[1] */
+      { STATE_MVP_MATRIX, 0, 2, 2, 0 },  /* state.matrix.mvp.row[2] */
+      { STATE_MVP_MATRIX, 0, 3, 3, 0 },  /* state.matrix.mvp.row[3] */
+   };
+   GLint mvpRef[4];
+
+   for (i = 0; i < 4; i++) {
+      mvpRef[i] = _mesa_add_state_reference(vprog->Base.Parameters,
+                                            mvpState[i]);
+   }
+
+   /* Alloc storage for new instructions */
+   newInst = _mesa_alloc_instructions(newLen);
+   if (!newInst) {
+      _mesa_error(ctx, GL_OUT_OF_MEMORY,
+                  "glProgramString(inserting position_invariant code)");
+      return;
+   }
+
+   /*
+    * Generated instructions:
+    * newInst[0] = DP4 result.position.x, mvp.row[0], vertex.position;
+    * newInst[1] = DP4 result.position.y, mvp.row[1], vertex.position;
+    * newInst[2] = DP4 result.position.z, mvp.row[2], vertex.position;
+    * newInst[3] = DP4 result.position.w, mvp.row[3], vertex.position;
+    */
+   _mesa_init_instructions(newInst, 4);
+   for (i = 0; i < 4; i++) {
+      newInst[i].Opcode = OPCODE_DP4;
+      newInst[i].DstReg.File = PROGRAM_OUTPUT;
+      newInst[i].DstReg.Index = VERT_RESULT_HPOS;
+      newInst[i].DstReg.WriteMask = (WRITEMASK_X << i);
+      newInst[i].SrcReg[0].File = PROGRAM_STATE_VAR;
+      newInst[i].SrcReg[0].Index = mvpRef[i];
+      newInst[i].SrcReg[0].Swizzle = SWIZZLE_NOOP;
+      newInst[i].SrcReg[1].File = PROGRAM_INPUT;
+      newInst[i].SrcReg[1].Index = VERT_ATTRIB_POS;
+      newInst[i].SrcReg[1].Swizzle = SWIZZLE_NOOP;
+   }
+
+   /* Append original instructions after new instructions */
+   _mesa_copy_instructions (newInst + 4, vprog->Base.Instructions, origLen);
+
+   /* free old instructions */
+   _mesa_free_instructions(vprog->Base.Instructions, origLen);
+
+   /* install new instructions */
+   vprog->Base.Instructions = newInst;
+   vprog->Base.NumInstructions = newLen;
+   vprog->Base.InputsRead |= VERT_BIT_POS;
+   vprog->Base.OutputsWritten |= BITFIELD64_BIT(VERT_RESULT_HPOS);
+}
+
+
+static void
+_mesa_insert_mvp_mad_code(struct gl_context *ctx, struct gl_vertex_program *vprog)
+{
+   struct prog_instruction *newInst;
+   const GLuint origLen = vprog->Base.NumInstructions;
+   const GLuint newLen = origLen + 4;
+   GLuint hposTemp;
+   GLuint i;
+
+   /*
+    * Setup state references for the modelview/projection matrix.
+    * XXX we should check if these state vars are already declared.
+    */
+   static const gl_state_index mvpState[4][STATE_LENGTH] = {
+      { STATE_MVP_MATRIX, 0, 0, 0, STATE_MATRIX_TRANSPOSE },
+      { STATE_MVP_MATRIX, 0, 1, 1, STATE_MATRIX_TRANSPOSE },
+      { STATE_MVP_MATRIX, 0, 2, 2, STATE_MATRIX_TRANSPOSE },
+      { STATE_MVP_MATRIX, 0, 3, 3, STATE_MATRIX_TRANSPOSE },
+   };
+   GLint mvpRef[4];
+
+   for (i = 0; i < 4; i++) {
+      mvpRef[i] = _mesa_add_state_reference(vprog->Base.Parameters,
+                                            mvpState[i]);
+   }
+
+   /* Alloc storage for new instructions */
+   newInst = _mesa_alloc_instructions(newLen);
+   if (!newInst) {
+      _mesa_error(ctx, GL_OUT_OF_MEMORY,
+                  "glProgramString(inserting position_invariant code)");
+      return;
+   }
+
+   /* TEMP hposTemp; */
+   hposTemp = vprog->Base.NumTemporaries++;
+
+   /*
+    * Generated instructions:
+    *    emit_op2(p, OPCODE_MUL, tmp, 0, swizzle1(src,X), mat[0]);
+    *    emit_op3(p, OPCODE_MAD, tmp, 0, swizzle1(src,Y), mat[1], tmp);
+    *    emit_op3(p, OPCODE_MAD, tmp, 0, swizzle1(src,Z), mat[2], tmp);
+    *    emit_op3(p, OPCODE_MAD, dest, 0, swizzle1(src,W), mat[3], tmp);
+    */
+   _mesa_init_instructions(newInst, 4);
+
+   newInst[0].Opcode = OPCODE_MUL;
+   newInst[0].DstReg.File = PROGRAM_TEMPORARY;
+   newInst[0].DstReg.Index = hposTemp;
+   newInst[0].DstReg.WriteMask = WRITEMASK_XYZW;
+   newInst[0].SrcReg[0].File = PROGRAM_INPUT;
+   newInst[0].SrcReg[0].Index = VERT_ATTRIB_POS;
+   newInst[0].SrcReg[0].Swizzle = SWIZZLE_XXXX;
+   newInst[0].SrcReg[1].File = PROGRAM_STATE_VAR;
+   newInst[0].SrcReg[1].Index = mvpRef[0];
+   newInst[0].SrcReg[1].Swizzle = SWIZZLE_NOOP;
+
+   for (i = 1; i <= 2; i++) {
+      newInst[i].Opcode = OPCODE_MAD;
+      newInst[i].DstReg.File = PROGRAM_TEMPORARY;
+      newInst[i].DstReg.Index = hposTemp;
+      newInst[i].DstReg.WriteMask = WRITEMASK_XYZW;
+      newInst[i].SrcReg[0].File = PROGRAM_INPUT;
+      newInst[i].SrcReg[0].Index = VERT_ATTRIB_POS;
+      newInst[i].SrcReg[0].Swizzle = MAKE_SWIZZLE4(i,i,i,i);
+      newInst[i].SrcReg[1].File = PROGRAM_STATE_VAR;
+      newInst[i].SrcReg[1].Index = mvpRef[i];
+      newInst[i].SrcReg[1].Swizzle = SWIZZLE_NOOP;
+      newInst[i].SrcReg[2].File = PROGRAM_TEMPORARY;
+      newInst[i].SrcReg[2].Index = hposTemp;
+      newInst[1].SrcReg[2].Swizzle = SWIZZLE_NOOP;
+   }
+
+   newInst[3].Opcode = OPCODE_MAD;
+   newInst[3].DstReg.File = PROGRAM_OUTPUT;
+   newInst[3].DstReg.Index = VERT_RESULT_HPOS;
+   newInst[3].DstReg.WriteMask = WRITEMASK_XYZW;
+   newInst[3].SrcReg[0].File = PROGRAM_INPUT;
+   newInst[3].SrcReg[0].Index = VERT_ATTRIB_POS;
+   newInst[3].SrcReg[0].Swizzle = SWIZZLE_WWWW;
+   newInst[3].SrcReg[1].File = PROGRAM_STATE_VAR;
+   newInst[3].SrcReg[1].Index = mvpRef[3];
+   newInst[3].SrcReg[1].Swizzle = SWIZZLE_NOOP;
+   newInst[3].SrcReg[2].File = PROGRAM_TEMPORARY;
+   newInst[3].SrcReg[2].Index = hposTemp;
+   newInst[3].SrcReg[2].Swizzle = SWIZZLE_NOOP;
+
+
+   /* Append original instructions after new instructions */
+   _mesa_copy_instructions (newInst + 4, vprog->Base.Instructions, origLen);
+
+   /* free old instructions */
+   _mesa_free_instructions(vprog->Base.Instructions, origLen);
+
+   /* install new instructions */
+   vprog->Base.Instructions = newInst;
+   vprog->Base.NumInstructions = newLen;
+   vprog->Base.InputsRead |= VERT_BIT_POS;
+   vprog->Base.OutputsWritten |= BITFIELD64_BIT(VERT_RESULT_HPOS);
+}
+
+
+void
+_mesa_insert_mvp_code(struct gl_context *ctx, struct gl_vertex_program *vprog)
+{
+   if (ctx->mvp_with_dp4) 
+      _mesa_insert_mvp_dp4_code( ctx, vprog );
+   else
+      _mesa_insert_mvp_mad_code( ctx, vprog );
+}
+      
+
+
+
+
+
+/**
+ * Append extra instructions onto the given fragment program to implement
+ * the fog mode specified by fprog->FogOption.
+ * The fragment.fogcoord input is used to compute the fog blend factor.
+ *
+ * XXX with a little work, this function could be adapted to add fog code
+ * to vertex programs too.
+ */
+void
+_mesa_append_fog_code(struct gl_context *ctx, struct gl_fragment_program *fprog, GLboolean saturate)
+{
+   static const gl_state_index fogPStateOpt[STATE_LENGTH]
+      = { STATE_INTERNAL, STATE_FOG_PARAMS_OPTIMIZED, 0, 0, 0 };
+   static const gl_state_index fogColorState[STATE_LENGTH]
+      = { STATE_FOG_COLOR, 0, 0, 0, 0};
+   struct prog_instruction *newInst, *inst;
+   const GLuint origLen = fprog->Base.NumInstructions;
+   const GLuint newLen = origLen + 5;
+   GLuint i;
+   GLint fogPRefOpt, fogColorRef; /* state references */
+   GLuint colorTemp, fogFactorTemp; /* temporary registerss */
+
+   if (fprog->FogOption == GL_NONE) {
+      _mesa_problem(ctx, "_mesa_append_fog_code() called for fragment program"
+                    " with FogOption == GL_NONE");
+      return;
+   }
+
+   /* Alloc storage for new instructions */
+   newInst = _mesa_alloc_instructions(newLen);
+   if (!newInst) {
+      _mesa_error(ctx, GL_OUT_OF_MEMORY,
+                  "glProgramString(inserting fog_option code)");
+      return;
+   }
+
+   /* Copy orig instructions into new instruction buffer */
+   _mesa_copy_instructions(newInst, fprog->Base.Instructions, origLen);
+
+   /* PARAM fogParamsRefOpt = internal optimized fog params; */
+   fogPRefOpt
+      = _mesa_add_state_reference(fprog->Base.Parameters, fogPStateOpt);
+   /* PARAM fogColorRef = state.fog.color; */
+   fogColorRef
+      = _mesa_add_state_reference(fprog->Base.Parameters, fogColorState);
+
+   /* TEMP colorTemp; */
+   colorTemp = fprog->Base.NumTemporaries++;
+   /* TEMP fogFactorTemp; */
+   fogFactorTemp = fprog->Base.NumTemporaries++;
+
+   /* Scan program to find where result.color is written */
+   inst = newInst;
+   for (i = 0; i < fprog->Base.NumInstructions; i++) {
+      if (inst->Opcode == OPCODE_END)
+         break;
+      if (inst->DstReg.File == PROGRAM_OUTPUT &&
+          inst->DstReg.Index == FRAG_RESULT_COLOR) {
+         /* change the instruction to write to colorTemp w/ clamping */
+         inst->DstReg.File = PROGRAM_TEMPORARY;
+         inst->DstReg.Index = colorTemp;
+         inst->SaturateMode = saturate;
+         /* don't break (may be several writes to result.color) */
+      }
+      inst++;
+   }
+   assert(inst->Opcode == OPCODE_END); /* we'll overwrite this inst */
+
+   _mesa_init_instructions(inst, 5);
+
+   /* emit instructions to compute fog blending factor */
+   /* this is always clamped to [0, 1] regardless of fragment clamping */
+   if (fprog->FogOption == GL_LINEAR) {
+      /* MAD fogFactorTemp.x, fragment.fogcoord.x, fogPRefOpt.x, fogPRefOpt.y; */
+      inst->Opcode = OPCODE_MAD;
+      inst->DstReg.File = PROGRAM_TEMPORARY;
+      inst->DstReg.Index = fogFactorTemp;
+      inst->DstReg.WriteMask = WRITEMASK_X;
+      inst->SrcReg[0].File = PROGRAM_INPUT;
+      inst->SrcReg[0].Index = FRAG_ATTRIB_FOGC;
+      inst->SrcReg[0].Swizzle = SWIZZLE_XXXX;
+      inst->SrcReg[1].File = PROGRAM_STATE_VAR;
+      inst->SrcReg[1].Index = fogPRefOpt;
+      inst->SrcReg[1].Swizzle = SWIZZLE_XXXX;
+      inst->SrcReg[2].File = PROGRAM_STATE_VAR;
+      inst->SrcReg[2].Index = fogPRefOpt;
+      inst->SrcReg[2].Swizzle = SWIZZLE_YYYY;
+      inst->SaturateMode = SATURATE_ZERO_ONE;
+      inst++;
+   }
+   else {
+      ASSERT(fprog->FogOption == GL_EXP || fprog->FogOption == GL_EXP2);
+      /* fogPRefOpt.z = d/ln(2), fogPRefOpt.w = d/sqrt(ln(2) */
+      /* EXP: MUL fogFactorTemp.x, fogPRefOpt.z, fragment.fogcoord.x; */
+      /* EXP2: MUL fogFactorTemp.x, fogPRefOpt.w, fragment.fogcoord.x; */
+      inst->Opcode = OPCODE_MUL;
+      inst->DstReg.File = PROGRAM_TEMPORARY;
+      inst->DstReg.Index = fogFactorTemp;
+      inst->DstReg.WriteMask = WRITEMASK_X;
+      inst->SrcReg[0].File = PROGRAM_STATE_VAR;
+      inst->SrcReg[0].Index = fogPRefOpt;
+      inst->SrcReg[0].Swizzle
+         = (fprog->FogOption == GL_EXP) ? SWIZZLE_ZZZZ : SWIZZLE_WWWW;
+      inst->SrcReg[1].File = PROGRAM_INPUT;
+      inst->SrcReg[1].Index = FRAG_ATTRIB_FOGC;
+      inst->SrcReg[1].Swizzle = SWIZZLE_XXXX;
+      inst++;
+      if (fprog->FogOption == GL_EXP2) {
+         /* MUL fogFactorTemp.x, fogFactorTemp.x, fogFactorTemp.x; */
+         inst->Opcode = OPCODE_MUL;
+         inst->DstReg.File = PROGRAM_TEMPORARY;
+         inst->DstReg.Index = fogFactorTemp;
+         inst->DstReg.WriteMask = WRITEMASK_X;
+         inst->SrcReg[0].File = PROGRAM_TEMPORARY;
+         inst->SrcReg[0].Index = fogFactorTemp;
+         inst->SrcReg[0].Swizzle = SWIZZLE_XXXX;
+         inst->SrcReg[1].File = PROGRAM_TEMPORARY;
+         inst->SrcReg[1].Index = fogFactorTemp;
+         inst->SrcReg[1].Swizzle = SWIZZLE_XXXX;
+         inst++;
+      }
+      /* EX2_SAT fogFactorTemp.x, -fogFactorTemp.x; */
+      inst->Opcode = OPCODE_EX2;
+      inst->DstReg.File = PROGRAM_TEMPORARY;
+      inst->DstReg.Index = fogFactorTemp;
+      inst->DstReg.WriteMask = WRITEMASK_X;
+      inst->SrcReg[0].File = PROGRAM_TEMPORARY;
+      inst->SrcReg[0].Index = fogFactorTemp;
+      inst->SrcReg[0].Negate = NEGATE_XYZW;
+      inst->SrcReg[0].Swizzle = SWIZZLE_XXXX;
+      inst->SaturateMode = SATURATE_ZERO_ONE;
+      inst++;
+   }
+   /* LRP result.color.xyz, fogFactorTemp.xxxx, colorTemp, fogColorRef; */
+   inst->Opcode = OPCODE_LRP;
+   inst->DstReg.File = PROGRAM_OUTPUT;
+   inst->DstReg.Index = FRAG_RESULT_COLOR;
+   inst->DstReg.WriteMask = WRITEMASK_XYZ;
+   inst->SrcReg[0].File = PROGRAM_TEMPORARY;
+   inst->SrcReg[0].Index = fogFactorTemp;
+   inst->SrcReg[0].Swizzle = SWIZZLE_XXXX;
+   inst->SrcReg[1].File = PROGRAM_TEMPORARY;
+   inst->SrcReg[1].Index = colorTemp;
+   inst->SrcReg[1].Swizzle = SWIZZLE_NOOP;
+   inst->SrcReg[2].File = PROGRAM_STATE_VAR;
+   inst->SrcReg[2].Index = fogColorRef;
+   inst->SrcReg[2].Swizzle = SWIZZLE_NOOP;
+   inst++;
+   /* MOV result.color.w, colorTemp.x;  # copy alpha */
+   inst->Opcode = OPCODE_MOV;
+   inst->DstReg.File = PROGRAM_OUTPUT;
+   inst->DstReg.Index = FRAG_RESULT_COLOR;
+   inst->DstReg.WriteMask = WRITEMASK_W;
+   inst->SrcReg[0].File = PROGRAM_TEMPORARY;
+   inst->SrcReg[0].Index = colorTemp;
+   inst->SrcReg[0].Swizzle = SWIZZLE_NOOP;
+   inst++;
+   /* END; */
+   inst->Opcode = OPCODE_END;
+   inst++;
+
+   /* free old instructions */
+   _mesa_free_instructions(fprog->Base.Instructions, origLen);
+
+   /* install new instructions */
+   fprog->Base.Instructions = newInst;
+   fprog->Base.NumInstructions = inst - newInst;
+   fprog->Base.InputsRead |= FRAG_BIT_FOGC;
+   /* XXX do this?  fprog->FogOption = GL_NONE; */
+}
+
+
+
+static GLboolean
+is_texture_instruction(const struct prog_instruction *inst)
+{
+   switch (inst->Opcode) {
+   case OPCODE_TEX:
+   case OPCODE_TXB:
+   case OPCODE_TXD:
+   case OPCODE_TXL:
+   case OPCODE_TXP:
+   case OPCODE_TXP_NV:
+      return GL_TRUE;
+   default:
+      return GL_FALSE;
+   }
+}
+      
+
+/**
+ * Count the number of texure indirections in the given program.
+ * The program's NumTexIndirections field will be updated.
+ * See the GL_ARB_fragment_program spec (issue 24) for details.
+ * XXX we count texture indirections in texenvprogram.c (maybe use this code
+ * instead and elsewhere).
+ */
+void
+_mesa_count_texture_indirections(struct gl_program *prog)
+{
+   GLuint indirections = 1;
+   GLbitfield tempsOutput = 0x0;
+   GLbitfield aluTemps = 0x0;
+   GLuint i;
+
+   for (i = 0; i < prog->NumInstructions; i++) {
+      const struct prog_instruction *inst = prog->Instructions + i;
+
+      if (is_texture_instruction(inst)) {
+         if (((inst->SrcReg[0].File == PROGRAM_TEMPORARY) && 
+              (tempsOutput & (1 << inst->SrcReg[0].Index))) ||
+             ((inst->Opcode != OPCODE_KIL) &&
+              (inst->DstReg.File == PROGRAM_TEMPORARY) && 
+              (aluTemps & (1 << inst->DstReg.Index)))) 
+            {
+               indirections++;
+               tempsOutput = 0x0;
+               aluTemps = 0x0;
+            }
+      }
+      else {
+         GLuint j;
+         for (j = 0; j < 3; j++) {
+            if (inst->SrcReg[j].File == PROGRAM_TEMPORARY)
+               aluTemps |= (1 << inst->SrcReg[j].Index);
+         }
+         if (inst->DstReg.File == PROGRAM_TEMPORARY)
+            aluTemps |= (1 << inst->DstReg.Index);
+      }
+
+      if ((inst->Opcode != OPCODE_KIL) && (inst->DstReg.File == PROGRAM_TEMPORARY))
+         tempsOutput |= (1 << inst->DstReg.Index);
+   }
+
+   prog->NumTexIndirections = indirections;
+}
+
+
+/**
+ * Count number of texture instructions in given program and update the
+ * program's NumTexInstructions field.
+ */
+void
+_mesa_count_texture_instructions(struct gl_program *prog)
+{
+   GLuint i;
+   prog->NumTexInstructions = 0;
+   for (i = 0; i < prog->NumInstructions; i++) {
+      prog->NumTexInstructions += is_texture_instruction(prog->Instructions + i);
+   }
+}
+
+
+/**
+ * Scan/rewrite program to remove reads of custom (output) registers.
+ * The passed type has to be either PROGRAM_OUTPUT or PROGRAM_VARYING
+ * (for vertex shaders).
+ * In GLSL shaders, varying vars can be read and written.
+ * On some hardware, trying to read an output register causes trouble.
+ * So, rewrite the program to use a temporary register in this case.
+ */
+void
+_mesa_remove_output_reads(struct gl_program *prog, gl_register_file type)
+{
+   GLuint i;
+   GLint outputMap[VERT_RESULT_MAX];
+   GLuint numVaryingReads = 0;
+   GLboolean usedTemps[MAX_PROGRAM_TEMPS];
+   GLuint firstTemp = 0;
+
+   _mesa_find_used_registers(prog, PROGRAM_TEMPORARY,
+                             usedTemps, MAX_PROGRAM_TEMPS);
+
+   assert(type == PROGRAM_VARYING || type == PROGRAM_OUTPUT);
+   assert(prog->Target == GL_VERTEX_PROGRAM_ARB || type != PROGRAM_VARYING);
+
+   for (i = 0; i < VERT_RESULT_MAX; i++)
+      outputMap[i] = -1;
+
+   /* look for instructions which read from varying vars */
+   for (i = 0; i < prog->NumInstructions; i++) {
+      struct prog_instruction *inst = prog->Instructions + i;
+      const GLuint numSrc = _mesa_num_inst_src_regs(inst->Opcode);
+      GLuint j;
+      for (j = 0; j < numSrc; j++) {
+         if (inst->SrcReg[j].File == type) {
+            /* replace the read with a temp reg */
+            const GLuint var = inst->SrcReg[j].Index;
+            if (outputMap[var] == -1) {
+               numVaryingReads++;
+               outputMap[var] = _mesa_find_free_register(usedTemps,
+                                                         MAX_PROGRAM_TEMPS,
+                                                         firstTemp);
+               firstTemp = outputMap[var] + 1;
+            }
+            inst->SrcReg[j].File = PROGRAM_TEMPORARY;
+            inst->SrcReg[j].Index = outputMap[var];
+         }
+      }
+   }
+
+   if (numVaryingReads == 0)
+      return; /* nothing to be done */
+
+   /* look for instructions which write to the varying vars identified above */
+   for (i = 0; i < prog->NumInstructions; i++) {
+      struct prog_instruction *inst = prog->Instructions + i;
+      if (inst->DstReg.File == type &&
+          outputMap[inst->DstReg.Index] >= 0) {
+         /* change inst to write to the temp reg, instead of the varying */
+         inst->DstReg.File = PROGRAM_TEMPORARY;
+         inst->DstReg.Index = outputMap[inst->DstReg.Index];
+      }
+   }
+
+   /* insert new instructions to copy the temp vars to the varying vars */
+   {
+      struct prog_instruction *inst;
+      GLint endPos, var;
+
+      /* Look for END instruction and insert the new varying writes */
+      endPos = -1;
+      for (i = 0; i < prog->NumInstructions; i++) {
+         struct prog_instruction *inst = prog->Instructions + i;
+         if (inst->Opcode == OPCODE_END) {
+            endPos = i;
+            _mesa_insert_instructions(prog, i, numVaryingReads);
+            break;
+         }
+      }
+
+      assert(endPos >= 0);
+
+      /* insert new MOV instructions here */
+      inst = prog->Instructions + endPos;
+      for (var = 0; var < VERT_RESULT_MAX; var++) {
+         if (outputMap[var] >= 0) {
+            /* MOV VAR[var], TEMP[tmp]; */
+            inst->Opcode = OPCODE_MOV;
+            inst->DstReg.File = type;
+            inst->DstReg.Index = var;
+            inst->SrcReg[0].File = PROGRAM_TEMPORARY;
+            inst->SrcReg[0].Index = outputMap[var];
+            inst++;
+         }
+      }
+   }
+}
+
+
+/**
+ * Make the given fragment program into a "no-op" shader.
+ * Actually, just copy the incoming fragment color (or texcoord)
+ * to the output color.
+ * This is for debug/test purposes.
+ */
+void
+_mesa_nop_fragment_program(struct gl_context *ctx, struct gl_fragment_program *prog)
+{
+   struct prog_instruction *inst;
+   GLuint inputAttr;
+
+   inst = _mesa_alloc_instructions(2);
+   if (!inst) {
+      _mesa_error(ctx, GL_OUT_OF_MEMORY, "_mesa_nop_fragment_program");
+      return;
+   }
+
+   _mesa_init_instructions(inst, 2);
+
+   inst[0].Opcode = OPCODE_MOV;
+   inst[0].DstReg.File = PROGRAM_OUTPUT;
+   inst[0].DstReg.Index = FRAG_RESULT_COLOR;
+   inst[0].SrcReg[0].File = PROGRAM_INPUT;
+   if (prog->Base.InputsRead & FRAG_BIT_COL0)
+      inputAttr = FRAG_ATTRIB_COL0;
+   else
+      inputAttr = FRAG_ATTRIB_TEX0;
+   inst[0].SrcReg[0].Index = inputAttr;
+
+   inst[1].Opcode = OPCODE_END;
+
+   _mesa_free_instructions(prog->Base.Instructions,
+                           prog->Base.NumInstructions);
+
+   prog->Base.Instructions = inst;
+   prog->Base.NumInstructions = 2;
+   prog->Base.InputsRead = 1 << inputAttr;
+   prog->Base.OutputsWritten = BITFIELD64_BIT(FRAG_RESULT_COLOR);
+}
+
+
+/**
+ * \sa _mesa_nop_fragment_program
+ * Replace the given vertex program with a "no-op" program that just
+ * transforms vertex position and emits color.
+ */
+void
+_mesa_nop_vertex_program(struct gl_context *ctx, struct gl_vertex_program *prog)
+{
+   struct prog_instruction *inst;
+   GLuint inputAttr;
+
+   /*
+    * Start with a simple vertex program that emits color.
+    */
+   inst = _mesa_alloc_instructions(2);
+   if (!inst) {
+      _mesa_error(ctx, GL_OUT_OF_MEMORY, "_mesa_nop_vertex_program");
+      return;
+   }
+
+   _mesa_init_instructions(inst, 2);
+
+   inst[0].Opcode = OPCODE_MOV;
+   inst[0].DstReg.File = PROGRAM_OUTPUT;
+   inst[0].DstReg.Index = VERT_RESULT_COL0;
+   inst[0].SrcReg[0].File = PROGRAM_INPUT;
+   if (prog->Base.InputsRead & VERT_BIT_COLOR0)
+      inputAttr = VERT_ATTRIB_COLOR0;
+   else
+      inputAttr = VERT_ATTRIB_TEX0;
+   inst[0].SrcReg[0].Index = inputAttr;
+
+   inst[1].Opcode = OPCODE_END;
+
+   _mesa_free_instructions(prog->Base.Instructions,
+                           prog->Base.NumInstructions);
+
+   prog->Base.Instructions = inst;
+   prog->Base.NumInstructions = 2;
+   prog->Base.InputsRead = 1 << inputAttr;
+   prog->Base.OutputsWritten = BITFIELD64_BIT(VERT_RESULT_COL0);
+
+   /*
+    * Now insert code to do standard modelview/projection transformation.
+    */
+   _mesa_insert_mvp_code(ctx, prog);
+}
diff --git a/mesalib/src/mesa/program/programopt.h b/mesalib/src/mesa/program/programopt.h
index 2e07d8989..79631aa58 100644
--- a/mesalib/src/mesa/program/programopt.h
+++ b/mesalib/src/mesa/program/programopt.h
@@ -1,53 +1,53 @@
-/*
- * Mesa 3-D graphics library
- * Version:  6.5.3
- *
- * Copyright (C) 1999-2007  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"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-
-#ifndef PROGRAMOPT_H
-#define PROGRAMOPT_H 1
-
-#include "main/mtypes.h"
-
-extern void
-_mesa_insert_mvp_code(struct gl_context *ctx, struct gl_vertex_program *vprog);
-
-extern void
-_mesa_append_fog_code(struct gl_context *ctx, struct gl_fragment_program *fprog);
-
-extern void
-_mesa_count_texture_indirections(struct gl_program *prog);
-
-extern void
-_mesa_count_texture_instructions(struct gl_program *prog);
-
-extern void
-_mesa_remove_output_reads(struct gl_program *prog, gl_register_file type);
-
-extern void
-_mesa_nop_fragment_program(struct gl_context *ctx, struct gl_fragment_program *prog);
-
-extern void
-_mesa_nop_vertex_program(struct gl_context *ctx, struct gl_vertex_program *prog);
-
-
-#endif /* PROGRAMOPT_H */
+/*
+ * Mesa 3-D graphics library
+ * Version:  6.5.3
+ *
+ * Copyright (C) 1999-2007  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"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included
+ * in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
+ * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ */
+
+
+#ifndef PROGRAMOPT_H
+#define PROGRAMOPT_H 1
+
+#include "main/mtypes.h"
+
+extern void
+_mesa_insert_mvp_code(struct gl_context *ctx, struct gl_vertex_program *vprog);
+
+extern void
+_mesa_append_fog_code(struct gl_context *ctx, struct gl_fragment_program *fprog, GLboolean saturate);
+
+extern void
+_mesa_count_texture_indirections(struct gl_program *prog);
+
+extern void
+_mesa_count_texture_instructions(struct gl_program *prog);
+
+extern void
+_mesa_remove_output_reads(struct gl_program *prog, gl_register_file type);
+
+extern void
+_mesa_nop_fragment_program(struct gl_context *ctx, struct gl_fragment_program *prog);
+
+extern void
+_mesa_nop_vertex_program(struct gl_context *ctx, struct gl_vertex_program *prog);
+
+
+#endif /* PROGRAMOPT_H */
diff --git a/mesalib/src/mesa/state_tracker/st_atom_blend.c b/mesalib/src/mesa/state_tracker/st_atom_blend.c
index fb1c7a4ef..d1844e106 100644
--- a/mesalib/src/mesa/state_tracker/st_atom_blend.c
+++ b/mesalib/src/mesa/state_tracker/st_atom_blend.c
@@ -286,7 +286,7 @@ update_blend( struct st_context *st )
 
    {
       struct pipe_blend_color bc;
-      COPY_4FV(bc.color, st->ctx->Color.BlendColor);
+      COPY_4FV(bc.color, st->ctx->Color.BlendColorUnclamped);
       cso_set_blend_color(st->cso_context, &bc);
    }
 }
diff --git a/mesalib/src/mesa/state_tracker/st_atom_depth.c b/mesalib/src/mesa/state_tracker/st_atom_depth.c
index e8e8db41d..6c51b1ac1 100644
--- a/mesalib/src/mesa/state_tracker/st_atom_depth.c
+++ b/mesalib/src/mesa/state_tracker/st_atom_depth.c
@@ -1,160 +1,160 @@
-/**************************************************************************
- * 
- * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
- * 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"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- * 
- **************************************************************************/
-
- /*
-  * Authors:
-  *   Keith Whitwell <keith@tungstengraphics.com>
-  *   Brian Paul
-  *   Zack  Rusin
-  */
- 
-
-#include <assert.h>
-
-#include "st_context.h"
-#include "st_atom.h"
-#include "pipe/p_context.h"
-#include "pipe/p_defines.h"
-#include "cso_cache/cso_context.h"
-
-
-/**
- * Convert an OpenGL compare mode to a pipe tokens.
- */
-GLuint
-st_compare_func_to_pipe(GLenum func)
-{
-   /* Same values, just biased */
-   assert(PIPE_FUNC_NEVER == GL_NEVER - GL_NEVER);
-   assert(PIPE_FUNC_LESS == GL_LESS - GL_NEVER);
-   assert(PIPE_FUNC_EQUAL == GL_EQUAL - GL_NEVER);
-   assert(PIPE_FUNC_LEQUAL == GL_LEQUAL - GL_NEVER);
-   assert(PIPE_FUNC_GREATER == GL_GREATER - GL_NEVER);
-   assert(PIPE_FUNC_NOTEQUAL == GL_NOTEQUAL - GL_NEVER);
-   assert(PIPE_FUNC_GEQUAL == GL_GEQUAL - GL_NEVER);
-   assert(PIPE_FUNC_ALWAYS == GL_ALWAYS - GL_NEVER);
-   assert(func >= GL_NEVER);
-   assert(func <= GL_ALWAYS);
-   return func - GL_NEVER;
-}
-
-
-/**
- * Convert GLenum stencil op tokens to pipe tokens.
- */
-static GLuint
-gl_stencil_op_to_pipe(GLenum func)
-{
-   switch (func) {
-   case GL_KEEP:
-      return PIPE_STENCIL_OP_KEEP;
-   case GL_ZERO:
-      return PIPE_STENCIL_OP_ZERO;
-   case GL_REPLACE:
-      return PIPE_STENCIL_OP_REPLACE;
-   case GL_INCR:
-      return PIPE_STENCIL_OP_INCR;
-   case GL_DECR:
-      return PIPE_STENCIL_OP_DECR;
-   case GL_INCR_WRAP:
-      return PIPE_STENCIL_OP_INCR_WRAP;
-   case GL_DECR_WRAP:
-      return PIPE_STENCIL_OP_DECR_WRAP;
-   case GL_INVERT:
-      return PIPE_STENCIL_OP_INVERT;
-   default:
-      assert("invalid GL token in gl_stencil_op_to_pipe()" == NULL);
-      return 0;
-   }
-}
-
-static void
-update_depth_stencil_alpha(struct st_context *st)
-{
-   struct pipe_depth_stencil_alpha_state *dsa = &st->state.depth_stencil;
-   struct pipe_stencil_ref sr;
-   struct gl_context *ctx = st->ctx;
-
-   memset(dsa, 0, sizeof(*dsa));
-   memset(&sr, 0, sizeof(sr));
-
-   if (ctx->Depth.Test && ctx->DrawBuffer->Visual.depthBits > 0) {
-      dsa->depth.enabled = 1;
-      dsa->depth.writemask = ctx->Depth.Mask;
-      dsa->depth.func = st_compare_func_to_pipe(ctx->Depth.Func);
-   }
-
-   if (ctx->Stencil.Enabled && ctx->DrawBuffer->Visual.stencilBits > 0) {
-      dsa->stencil[0].enabled = 1;
-      dsa->stencil[0].func = st_compare_func_to_pipe(ctx->Stencil.Function[0]);
-      dsa->stencil[0].fail_op = gl_stencil_op_to_pipe(ctx->Stencil.FailFunc[0]);
-      dsa->stencil[0].zfail_op = gl_stencil_op_to_pipe(ctx->Stencil.ZFailFunc[0]);
-      dsa->stencil[0].zpass_op = gl_stencil_op_to_pipe(ctx->Stencil.ZPassFunc[0]);
-      dsa->stencil[0].valuemask = ctx->Stencil.ValueMask[0] & 0xff;
-      dsa->stencil[0].writemask = ctx->Stencil.WriteMask[0] & 0xff;
-      sr.ref_value[0] = ctx->Stencil.Ref[0] & 0xff;
-
-      if (ctx->Stencil._TestTwoSide) {
-         const GLuint back = ctx->Stencil._BackFace;
-         dsa->stencil[1].enabled = 1;
-         dsa->stencil[1].func = st_compare_func_to_pipe(ctx->Stencil.Function[back]);
-         dsa->stencil[1].fail_op = gl_stencil_op_to_pipe(ctx->Stencil.FailFunc[back]);
-         dsa->stencil[1].zfail_op = gl_stencil_op_to_pipe(ctx->Stencil.ZFailFunc[back]);
-         dsa->stencil[1].zpass_op = gl_stencil_op_to_pipe(ctx->Stencil.ZPassFunc[back]);
-         dsa->stencil[1].valuemask = ctx->Stencil.ValueMask[back] & 0xff;
-         dsa->stencil[1].writemask = ctx->Stencil.WriteMask[back] & 0xff;
-         sr.ref_value[1] = ctx->Stencil.Ref[back] & 0xff;
-      }
-      else {
-         /* This should be unnecessary. Drivers must not expect this to
-          * contain valid data, except the enabled bit
-          */
-         dsa->stencil[1] = dsa->stencil[0];
-         dsa->stencil[1].enabled = 0;
-         sr.ref_value[1] = sr.ref_value[0];
-      }
-   }
-
-   if (ctx->Color.AlphaEnabled) {
-      dsa->alpha.enabled = 1;
-      dsa->alpha.func = st_compare_func_to_pipe(ctx->Color.AlphaFunc);
-      dsa->alpha.ref_value = ctx->Color.AlphaRef;
-   }
-
-   cso_set_depth_stencil_alpha(st->cso_context, dsa);
-   cso_set_stencil_ref(st->cso_context, &sr);
-}
-
-
-const struct st_tracked_state st_update_depth_stencil_alpha = {
-   "st_update_depth_stencil",				/* name */
-   {							/* dirty */
-      (_NEW_DEPTH|_NEW_STENCIL|_NEW_COLOR),		/* mesa */
-      0,						/* st */
-   },
-   update_depth_stencil_alpha				/* update */
-};
+/**************************************************************************
+ * 
+ * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * 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"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ * 
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * 
+ **************************************************************************/
+
+ /*
+  * Authors:
+  *   Keith Whitwell <keith@tungstengraphics.com>
+  *   Brian Paul
+  *   Zack  Rusin
+  */
+ 
+
+#include <assert.h>
+
+#include "st_context.h"
+#include "st_atom.h"
+#include "pipe/p_context.h"
+#include "pipe/p_defines.h"
+#include "cso_cache/cso_context.h"
+
+
+/**
+ * Convert an OpenGL compare mode to a pipe tokens.
+ */
+GLuint
+st_compare_func_to_pipe(GLenum func)
+{
+   /* Same values, just biased */
+   assert(PIPE_FUNC_NEVER == GL_NEVER - GL_NEVER);
+   assert(PIPE_FUNC_LESS == GL_LESS - GL_NEVER);
+   assert(PIPE_FUNC_EQUAL == GL_EQUAL - GL_NEVER);
+   assert(PIPE_FUNC_LEQUAL == GL_LEQUAL - GL_NEVER);
+   assert(PIPE_FUNC_GREATER == GL_GREATER - GL_NEVER);
+   assert(PIPE_FUNC_NOTEQUAL == GL_NOTEQUAL - GL_NEVER);
+   assert(PIPE_FUNC_GEQUAL == GL_GEQUAL - GL_NEVER);
+   assert(PIPE_FUNC_ALWAYS == GL_ALWAYS - GL_NEVER);
+   assert(func >= GL_NEVER);
+   assert(func <= GL_ALWAYS);
+   return func - GL_NEVER;
+}
+
+
+/**
+ * Convert GLenum stencil op tokens to pipe tokens.
+ */
+static GLuint
+gl_stencil_op_to_pipe(GLenum func)
+{
+   switch (func) {
+   case GL_KEEP:
+      return PIPE_STENCIL_OP_KEEP;
+   case GL_ZERO:
+      return PIPE_STENCIL_OP_ZERO;
+   case GL_REPLACE:
+      return PIPE_STENCIL_OP_REPLACE;
+   case GL_INCR:
+      return PIPE_STENCIL_OP_INCR;
+   case GL_DECR:
+      return PIPE_STENCIL_OP_DECR;
+   case GL_INCR_WRAP:
+      return PIPE_STENCIL_OP_INCR_WRAP;
+   case GL_DECR_WRAP:
+      return PIPE_STENCIL_OP_DECR_WRAP;
+   case GL_INVERT:
+      return PIPE_STENCIL_OP_INVERT;
+   default:
+      assert("invalid GL token in gl_stencil_op_to_pipe()" == NULL);
+      return 0;
+   }
+}
+
+static void
+update_depth_stencil_alpha(struct st_context *st)
+{
+   struct pipe_depth_stencil_alpha_state *dsa = &st->state.depth_stencil;
+   struct pipe_stencil_ref sr;
+   struct gl_context *ctx = st->ctx;
+
+   memset(dsa, 0, sizeof(*dsa));
+   memset(&sr, 0, sizeof(sr));
+
+   if (ctx->Depth.Test && ctx->DrawBuffer->Visual.depthBits > 0) {
+      dsa->depth.enabled = 1;
+      dsa->depth.writemask = ctx->Depth.Mask;
+      dsa->depth.func = st_compare_func_to_pipe(ctx->Depth.Func);
+   }
+
+   if (ctx->Stencil.Enabled && ctx->DrawBuffer->Visual.stencilBits > 0) {
+      dsa->stencil[0].enabled = 1;
+      dsa->stencil[0].func = st_compare_func_to_pipe(ctx->Stencil.Function[0]);
+      dsa->stencil[0].fail_op = gl_stencil_op_to_pipe(ctx->Stencil.FailFunc[0]);
+      dsa->stencil[0].zfail_op = gl_stencil_op_to_pipe(ctx->Stencil.ZFailFunc[0]);
+      dsa->stencil[0].zpass_op = gl_stencil_op_to_pipe(ctx->Stencil.ZPassFunc[0]);
+      dsa->stencil[0].valuemask = ctx->Stencil.ValueMask[0] & 0xff;
+      dsa->stencil[0].writemask = ctx->Stencil.WriteMask[0] & 0xff;
+      sr.ref_value[0] = ctx->Stencil.Ref[0] & 0xff;
+
+      if (ctx->Stencil._TestTwoSide) {
+         const GLuint back = ctx->Stencil._BackFace;
+         dsa->stencil[1].enabled = 1;
+         dsa->stencil[1].func = st_compare_func_to_pipe(ctx->Stencil.Function[back]);
+         dsa->stencil[1].fail_op = gl_stencil_op_to_pipe(ctx->Stencil.FailFunc[back]);
+         dsa->stencil[1].zfail_op = gl_stencil_op_to_pipe(ctx->Stencil.ZFailFunc[back]);
+         dsa->stencil[1].zpass_op = gl_stencil_op_to_pipe(ctx->Stencil.ZPassFunc[back]);
+         dsa->stencil[1].valuemask = ctx->Stencil.ValueMask[back] & 0xff;
+         dsa->stencil[1].writemask = ctx->Stencil.WriteMask[back] & 0xff;
+         sr.ref_value[1] = ctx->Stencil.Ref[back] & 0xff;
+      }
+      else {
+         /* This should be unnecessary. Drivers must not expect this to
+          * contain valid data, except the enabled bit
+          */
+         dsa->stencil[1] = dsa->stencil[0];
+         dsa->stencil[1].enabled = 0;
+         sr.ref_value[1] = sr.ref_value[0];
+      }
+   }
+
+   if (ctx->Color.AlphaEnabled) {
+      dsa->alpha.enabled = 1;
+      dsa->alpha.func = st_compare_func_to_pipe(ctx->Color.AlphaFunc);
+      dsa->alpha.ref_value = ctx->Color.AlphaRefUnclamped;
+   }
+
+   cso_set_depth_stencil_alpha(st->cso_context, dsa);
+   cso_set_stencil_ref(st->cso_context, &sr);
+}
+
+
+const struct st_tracked_state st_update_depth_stencil_alpha = {
+   "st_update_depth_stencil",				/* name */
+   {							/* dirty */
+      (_NEW_DEPTH|_NEW_STENCIL|_NEW_COLOR),		/* mesa */
+      0,						/* st */
+   },
+   update_depth_stencil_alpha				/* update */
+};
diff --git a/mesalib/src/mesa/state_tracker/st_atom_rasterizer.c b/mesalib/src/mesa/state_tracker/st_atom_rasterizer.c
index 4fad1f297..250cbb226 100644
--- a/mesalib/src/mesa/state_tracker/st_atom_rasterizer.c
+++ b/mesalib/src/mesa/state_tracker/st_atom_rasterizer.c
@@ -1,274 +1,280 @@
-/**************************************************************************
- * 
- * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
- * 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"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- * 
- **************************************************************************/
-
- /*
-  * Authors:
-  *   Keith Whitwell <keith@tungstengraphics.com>
-  */
- 
-#include "main/macros.h"
-#include "st_context.h"
-#include "st_atom.h"
-#include "pipe/p_context.h"
-#include "pipe/p_defines.h"
-#include "cso_cache/cso_context.h"
-
-
-static GLuint translate_fill( GLenum mode )
-{
-   switch (mode) {
-   case GL_POINT:
-      return PIPE_POLYGON_MODE_POINT;
-   case GL_LINE:
-      return PIPE_POLYGON_MODE_LINE;
-   case GL_FILL:
-      return PIPE_POLYGON_MODE_FILL;
-   default:
-      assert(0);
-      return 0;
-   }
-}
-
-
-
-static void update_raster_state( struct st_context *st )
-{
-   struct gl_context *ctx = st->ctx;
-   struct pipe_rasterizer_state *raster = &st->state.rasterizer;
-   const struct gl_vertex_program *vertProg = ctx->VertexProgram._Current;
-   const struct gl_fragment_program *fragProg = ctx->FragmentProgram._Current;
-   uint i;
-
-   memset(raster, 0, sizeof(*raster));
-
-   /* _NEW_POLYGON, _NEW_BUFFERS
-    */
-   {
-      raster->front_ccw = (ctx->Polygon.FrontFace == GL_CCW);
-
-      /*
-       * Gallium's surfaces are Y=0=TOP orientation.  OpenGL is the
-       * opposite.  Window system surfaces are Y=0=TOP.  Mesa's FBOs
-       * must match OpenGL conventions so FBOs use Y=0=BOTTOM.  In that
-       * case, we must invert Y and flip the notion of front vs. back.
-       */
-      if (st_fb_orientation(ctx->DrawBuffer) == Y_0_BOTTOM) {
-         /* Drawing to an FBO.  The viewport will be inverted. */
-         raster->front_ccw ^= 1;
-      }
-   }
-
-   /* _NEW_LIGHT
-    */
-   if (ctx->Light.ShadeModel == GL_FLAT)
-      raster->flatshade = 1;
-
-   if (ctx->Light.ProvokingVertex == GL_FIRST_VERTEX_CONVENTION_EXT)
-      raster->flatshade_first = 1;
-
-   /* _NEW_LIGHT | _NEW_PROGRAM
-    *
-    * Back-face colors can come from traditional lighting (when
-    * GL_LIGHT_MODEL_TWO_SIDE is set) or from vertex programs/shaders (when
-    * GL_VERTEX_PROGRAM_TWO_SIDE is set).  Note the logic here.
-    */
-   if (ctx->VertexProgram._Current) {
-      if (ctx->VertexProgram._Enabled ||
-          (ctx->Shader.CurrentVertexProgram &&
-           ctx->Shader.CurrentVertexProgram->LinkStatus)) {
-         /* user-defined vertex program or shader */
-         raster->light_twoside = ctx->VertexProgram.TwoSideEnabled;
-      }
-      else {
-         /* TNL-generated program */
-         raster->light_twoside = ctx->Light.Enabled && ctx->Light.Model.TwoSide;
-      }
-   }
-   else if (ctx->Light.Enabled && ctx->Light.Model.TwoSide) {
-      raster->light_twoside = 1;
-   }
-
-   /* _NEW_POLYGON
-    */
-   if (ctx->Polygon.CullFlag) {
-      switch (ctx->Polygon.CullFaceMode) {
-      case GL_FRONT:
-	 raster->cull_face = PIPE_FACE_FRONT;
-         break;
-      case GL_BACK:
-	 raster->cull_face = PIPE_FACE_BACK;
-         break;
-      case GL_FRONT_AND_BACK:
-	 raster->cull_face = PIPE_FACE_FRONT_AND_BACK;
-         break;
-      }
-   }
-   else {
-      raster->cull_face = PIPE_FACE_NONE;
-   }
-
-   /* _NEW_POLYGON
-    */
-   {
-      raster->fill_front = translate_fill( ctx->Polygon.FrontMode );
-      raster->fill_back = translate_fill( ctx->Polygon.BackMode );
-
-      /* Simplify when culling is active:
-       */
-      if (raster->cull_face & PIPE_FACE_FRONT) {
-	 raster->fill_front = raster->fill_back;
-      }
-      
-      if (raster->cull_face & PIPE_FACE_BACK) {
-	 raster->fill_back = raster->fill_front;
-      }
-   }
-
-   /* _NEW_POLYGON 
-    */
-   if (ctx->Polygon.OffsetUnits != 0.0 ||
-       ctx->Polygon.OffsetFactor != 0.0) {
-      raster->offset_point = ctx->Polygon.OffsetPoint;
-      raster->offset_line = ctx->Polygon.OffsetLine;
-      raster->offset_tri = ctx->Polygon.OffsetFill;
-   }
-
-   if (ctx->Polygon.OffsetPoint ||
-       ctx->Polygon.OffsetLine ||
-       ctx->Polygon.OffsetFill) {
-      raster->offset_units = ctx->Polygon.OffsetUnits;
-      raster->offset_scale = ctx->Polygon.OffsetFactor;
-   }
-
-   if (ctx->Polygon.SmoothFlag)
-      raster->poly_smooth = 1;
-
-   if (ctx->Polygon.StippleFlag)
-      raster->poly_stipple_enable = 1;
-
-   /* _NEW_POINT
-    */
-   raster->point_size = ctx->Point.Size;
-
-   if (!ctx->Point.PointSprite && ctx->Point.SmoothFlag)
-      raster->point_smooth = 1;
-
-   /* _NEW_POINT | _NEW_PROGRAM
-    */
-   if (ctx->Point.PointSprite) {
-      /* origin */
-      if ((ctx->Point.SpriteOrigin == GL_UPPER_LEFT) ^
-          (st_fb_orientation(ctx->DrawBuffer) == Y_0_BOTTOM))
-         raster->sprite_coord_mode = PIPE_SPRITE_COORD_UPPER_LEFT;
-      else 
-         raster->sprite_coord_mode = PIPE_SPRITE_COORD_LOWER_LEFT;
-
-      /* Coord replacement flags.  If bit 'k' is set that means
-       * that we need to replace GENERIC[k] attrib with an automatically
-       * computed texture coord.
-       */
-      for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) {
-         if (ctx->Point.CoordReplace[i]) {
-            raster->sprite_coord_enable |= 1 << i;
-         }
-      }
-      if (fragProg->Base.InputsRead & FRAG_BIT_PNTC) {
-         raster->sprite_coord_enable |=
-            1 << (FRAG_ATTRIB_PNTC - FRAG_ATTRIB_TEX0);
-      }
-
-      raster->point_quad_rasterization = 1;
-   }
-
-   /* ST_NEW_VERTEX_PROGRAM
-    */
-   if (vertProg) {
-      if (vertProg->Base.Id == 0) {
-         if (vertProg->Base.OutputsWritten & BITFIELD64_BIT(VERT_RESULT_PSIZ)) {
-            /* generated program which emits point size */
-            raster->point_size_per_vertex = TRUE;
-         }
-      }
-      else if (ctx->VertexProgram.PointSizeEnabled) {
-         /* user-defined program and GL_VERTEX_PROGRAM_POINT_SIZE set */
-         raster->point_size_per_vertex = ctx->VertexProgram.PointSizeEnabled;
-      }
-   }
-   if (!raster->point_size_per_vertex) {
-      /* clamp size now */
-      raster->point_size = CLAMP(ctx->Point.Size,
-                                 ctx->Point.MinSize,
-                                 ctx->Point.MaxSize);
-   }
-
-   /* _NEW_LINE
-    */
-   raster->line_smooth = ctx->Line.SmoothFlag;
-   if (ctx->Line.SmoothFlag) {
-      raster->line_width = CLAMP(ctx->Line.Width,
-                                ctx->Const.MinLineWidthAA,
-                                ctx->Const.MaxLineWidthAA);
-   }
-   else {
-      raster->line_width = CLAMP(ctx->Line.Width,
-                                ctx->Const.MinLineWidth,
-                                ctx->Const.MaxLineWidth);
-   }
-
-   raster->line_stipple_enable = ctx->Line.StippleFlag;
-   raster->line_stipple_pattern = ctx->Line.StipplePattern;
-   /* GL stipple factor is in [1,256], remap to [0, 255] here */
-   raster->line_stipple_factor = ctx->Line.StippleFactor - 1;
-
-   /* _NEW_MULTISAMPLE */
-   if (ctx->Multisample._Enabled || st->force_msaa)
-      raster->multisample = 1;
-
-   /* _NEW_SCISSOR */
-   if (ctx->Scissor.Enabled)
-      raster->scissor = 1;
-
-   raster->gl_rasterization_rules = 1;
-
-   cso_set_rasterizer(st->cso_context, raster);
-}
-
-const struct st_tracked_state st_update_rasterizer = {
-   "st_update_rasterizer",    /* name */
-   {
-      (_NEW_BUFFERS |
-       _NEW_LIGHT |
-       _NEW_LINE |
-       _NEW_MULTISAMPLE |
-       _NEW_POINT |
-       _NEW_POLYGON |
-       _NEW_PROGRAM |
-       _NEW_SCISSOR),      /* mesa state dependencies*/
-      ST_NEW_VERTEX_PROGRAM,  /* state tracker dependencies */
-   },
-   update_raster_state     /* update function */
-};
+/**************************************************************************
+ * 
+ * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * 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"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ * 
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * 
+ **************************************************************************/
+
+ /*
+  * Authors:
+  *   Keith Whitwell <keith@tungstengraphics.com>
+  */
+ 
+#include "main/macros.h"
+#include "st_context.h"
+#include "st_atom.h"
+#include "pipe/p_context.h"
+#include "pipe/p_defines.h"
+#include "cso_cache/cso_context.h"
+
+
+static GLuint translate_fill( GLenum mode )
+{
+   switch (mode) {
+   case GL_POINT:
+      return PIPE_POLYGON_MODE_POINT;
+   case GL_LINE:
+      return PIPE_POLYGON_MODE_LINE;
+   case GL_FILL:
+      return PIPE_POLYGON_MODE_FILL;
+   default:
+      assert(0);
+      return 0;
+   }
+}
+
+
+
+static void update_raster_state( struct st_context *st )
+{
+   struct gl_context *ctx = st->ctx;
+   struct pipe_rasterizer_state *raster = &st->state.rasterizer;
+   const struct gl_vertex_program *vertProg = ctx->VertexProgram._Current;
+   const struct gl_fragment_program *fragProg = ctx->FragmentProgram._Current;
+   uint i;
+
+   memset(raster, 0, sizeof(*raster));
+
+   /* _NEW_POLYGON, _NEW_BUFFERS
+    */
+   {
+      raster->front_ccw = (ctx->Polygon.FrontFace == GL_CCW);
+
+      /*
+       * Gallium's surfaces are Y=0=TOP orientation.  OpenGL is the
+       * opposite.  Window system surfaces are Y=0=TOP.  Mesa's FBOs
+       * must match OpenGL conventions so FBOs use Y=0=BOTTOM.  In that
+       * case, we must invert Y and flip the notion of front vs. back.
+       */
+      if (st_fb_orientation(ctx->DrawBuffer) == Y_0_BOTTOM) {
+         /* Drawing to an FBO.  The viewport will be inverted. */
+         raster->front_ccw ^= 1;
+      }
+   }
+
+   /* _NEW_LIGHT
+    */
+   if (ctx->Light.ShadeModel == GL_FLAT)
+      raster->flatshade = 1;
+
+   if (ctx->Light.ProvokingVertex == GL_FIRST_VERTEX_CONVENTION_EXT)
+      raster->flatshade_first = 1;
+
+   /* _NEW_LIGHT | _NEW_PROGRAM
+    *
+    * Back-face colors can come from traditional lighting (when
+    * GL_LIGHT_MODEL_TWO_SIDE is set) or from vertex programs/shaders (when
+    * GL_VERTEX_PROGRAM_TWO_SIDE is set).  Note the logic here.
+    */
+   if (ctx->VertexProgram._Current) {
+      if (ctx->VertexProgram._Enabled ||
+          (ctx->Shader.CurrentVertexProgram &&
+           ctx->Shader.CurrentVertexProgram->LinkStatus)) {
+         /* user-defined vertex program or shader */
+         raster->light_twoside = ctx->VertexProgram.TwoSideEnabled;
+      }
+      else {
+         /* TNL-generated program */
+         raster->light_twoside = ctx->Light.Enabled && ctx->Light.Model.TwoSide;
+      }
+   }
+   else if (ctx->Light.Enabled && ctx->Light.Model.TwoSide) {
+      raster->light_twoside = 1;
+   }
+
+   raster->clamp_vertex_color = ctx->Light._ClampVertexColor;
+
+   /* _NEW_POLYGON
+    */
+   if (ctx->Polygon.CullFlag) {
+      switch (ctx->Polygon.CullFaceMode) {
+      case GL_FRONT:
+	 raster->cull_face = PIPE_FACE_FRONT;
+         break;
+      case GL_BACK:
+	 raster->cull_face = PIPE_FACE_BACK;
+         break;
+      case GL_FRONT_AND_BACK:
+	 raster->cull_face = PIPE_FACE_FRONT_AND_BACK;
+         break;
+      }
+   }
+   else {
+      raster->cull_face = PIPE_FACE_NONE;
+   }
+
+   /* _NEW_POLYGON
+    */
+   {
+      raster->fill_front = translate_fill( ctx->Polygon.FrontMode );
+      raster->fill_back = translate_fill( ctx->Polygon.BackMode );
+
+      /* Simplify when culling is active:
+       */
+      if (raster->cull_face & PIPE_FACE_FRONT) {
+	 raster->fill_front = raster->fill_back;
+      }
+      
+      if (raster->cull_face & PIPE_FACE_BACK) {
+	 raster->fill_back = raster->fill_front;
+      }
+   }
+
+   /* _NEW_POLYGON 
+    */
+   if (ctx->Polygon.OffsetUnits != 0.0 ||
+       ctx->Polygon.OffsetFactor != 0.0) {
+      raster->offset_point = ctx->Polygon.OffsetPoint;
+      raster->offset_line = ctx->Polygon.OffsetLine;
+      raster->offset_tri = ctx->Polygon.OffsetFill;
+   }
+
+   if (ctx->Polygon.OffsetPoint ||
+       ctx->Polygon.OffsetLine ||
+       ctx->Polygon.OffsetFill) {
+      raster->offset_units = ctx->Polygon.OffsetUnits;
+      raster->offset_scale = ctx->Polygon.OffsetFactor;
+   }
+
+   if (ctx->Polygon.SmoothFlag)
+      raster->poly_smooth = 1;
+
+   if (ctx->Polygon.StippleFlag)
+      raster->poly_stipple_enable = 1;
+
+   /* _NEW_POINT
+    */
+   raster->point_size = ctx->Point.Size;
+
+   if (!ctx->Point.PointSprite && ctx->Point.SmoothFlag)
+      raster->point_smooth = 1;
+
+   /* _NEW_POINT | _NEW_PROGRAM
+    */
+   if (ctx->Point.PointSprite) {
+      /* origin */
+      if ((ctx->Point.SpriteOrigin == GL_UPPER_LEFT) ^
+          (st_fb_orientation(ctx->DrawBuffer) == Y_0_BOTTOM))
+         raster->sprite_coord_mode = PIPE_SPRITE_COORD_UPPER_LEFT;
+      else 
+         raster->sprite_coord_mode = PIPE_SPRITE_COORD_LOWER_LEFT;
+
+      /* Coord replacement flags.  If bit 'k' is set that means
+       * that we need to replace GENERIC[k] attrib with an automatically
+       * computed texture coord.
+       */
+      for (i = 0; i < MAX_TEXTURE_COORD_UNITS; i++) {
+         if (ctx->Point.CoordReplace[i]) {
+            raster->sprite_coord_enable |= 1 << i;
+         }
+      }
+      if (fragProg->Base.InputsRead & FRAG_BIT_PNTC) {
+         raster->sprite_coord_enable |=
+            1 << (FRAG_ATTRIB_PNTC - FRAG_ATTRIB_TEX0);
+      }
+
+      raster->point_quad_rasterization = 1;
+   }
+
+   /* ST_NEW_VERTEX_PROGRAM
+    */
+   if (vertProg) {
+      if (vertProg->Base.Id == 0) {
+         if (vertProg->Base.OutputsWritten & BITFIELD64_BIT(VERT_RESULT_PSIZ)) {
+            /* generated program which emits point size */
+            raster->point_size_per_vertex = TRUE;
+         }
+      }
+      else if (ctx->VertexProgram.PointSizeEnabled) {
+         /* user-defined program and GL_VERTEX_PROGRAM_POINT_SIZE set */
+         raster->point_size_per_vertex = ctx->VertexProgram.PointSizeEnabled;
+      }
+   }
+   if (!raster->point_size_per_vertex) {
+      /* clamp size now */
+      raster->point_size = CLAMP(ctx->Point.Size,
+                                 ctx->Point.MinSize,
+                                 ctx->Point.MaxSize);
+   }
+
+   /* _NEW_LINE
+    */
+   raster->line_smooth = ctx->Line.SmoothFlag;
+   if (ctx->Line.SmoothFlag) {
+      raster->line_width = CLAMP(ctx->Line.Width,
+                                ctx->Const.MinLineWidthAA,
+                                ctx->Const.MaxLineWidthAA);
+   }
+   else {
+      raster->line_width = CLAMP(ctx->Line.Width,
+                                ctx->Const.MinLineWidth,
+                                ctx->Const.MaxLineWidth);
+   }
+
+   raster->line_stipple_enable = ctx->Line.StippleFlag;
+   raster->line_stipple_pattern = ctx->Line.StipplePattern;
+   /* GL stipple factor is in [1,256], remap to [0, 255] here */
+   raster->line_stipple_factor = ctx->Line.StippleFactor - 1;
+
+   /* _NEW_MULTISAMPLE */
+   if (ctx->Multisample._Enabled || st->force_msaa)
+      raster->multisample = 1;
+
+   /* _NEW_SCISSOR */
+   if (ctx->Scissor.Enabled)
+      raster->scissor = 1;
+
+   /* _NEW_FRAG_CLAMP */
+   raster->clamp_fragment_color = ctx->Color._ClampFragmentColor;
+
+   raster->gl_rasterization_rules = 1;
+
+   cso_set_rasterizer(st->cso_context, raster);
+}
+
+const struct st_tracked_state st_update_rasterizer = {
+   "st_update_rasterizer",    /* name */
+   {
+      (_NEW_BUFFERS |
+       _NEW_LIGHT |
+       _NEW_LINE |
+       _NEW_MULTISAMPLE |
+       _NEW_POINT |
+       _NEW_POLYGON |
+       _NEW_PROGRAM |
+       _NEW_SCISSOR |
+       _NEW_FRAG_CLAMP),      /* mesa state dependencies*/
+      ST_NEW_VERTEX_PROGRAM,  /* state tracker dependencies */
+   },
+   update_raster_state     /* update function */
+};
diff --git a/mesalib/src/mesa/state_tracker/st_cb_clear.c b/mesalib/src/mesa/state_tracker/st_cb_clear.c
index 0130c7a5a..181fedd2b 100644
--- a/mesalib/src/mesa/state_tracker/st_cb_clear.c
+++ b/mesalib/src/mesa/state_tracker/st_cb_clear.c
@@ -1,601 +1,601 @@
-/**************************************************************************
- * 
- * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
- * All Rights Reserved.
- * Copyright 2009 VMware, Inc.  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"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- * 
- **************************************************************************/
-
- /*
-  * Authors:
-  *   Keith Whitwell <keith@tungstengraphics.com>
-  *   Brian Paul
-  *   Michel Dänzer
-  */
-
-#include "main/glheader.h"
-#include "main/formats.h"
-#include "main/macros.h"
-#include "program/prog_instruction.h"
-#include "st_context.h"
-#include "st_atom.h"
-#include "st_cb_accum.h"
-#include "st_cb_clear.h"
-#include "st_cb_fbo.h"
-#include "st_format.h"
-#include "st_program.h"
-
-#include "pipe/p_context.h"
-#include "pipe/p_shader_tokens.h"
-#include "pipe/p_state.h"
-#include "pipe/p_defines.h"
-#include "util/u_format.h"
-#include "util/u_inlines.h"
-#include "util/u_simple_shaders.h"
-#include "util/u_draw_quad.h"
-
-#include "cso_cache/cso_context.h"
-
-
-/**
- * Do per-context initialization for glClear.
- */
-void
-st_init_clear(struct st_context *st)
-{
-   struct pipe_screen *pscreen = st->pipe->screen;
-
-   memset(&st->clear, 0, sizeof(st->clear));
-
-   st->clear.raster.gl_rasterization_rules = 1;
-   st->clear.enable_ds_separate = pscreen->get_param(pscreen, PIPE_CAP_DEPTHSTENCIL_CLEAR_SEPARATE);
-}
-
-
-/**
- * Free per-context state for glClear.
- */
-void
-st_destroy_clear(struct st_context *st)
-{
-   if (st->clear.fs) {
-      cso_delete_fragment_shader(st->cso_context, st->clear.fs);
-      st->clear.fs = NULL;
-   }
-   if (st->clear.vs) {
-      cso_delete_vertex_shader(st->cso_context, st->clear.vs);
-      st->clear.vs = NULL;
-   }
-   if (st->clear.vbuf) {
-      pipe_resource_reference(&st->clear.vbuf, NULL);
-      st->clear.vbuf = NULL;
-   }
-}
-
-
-/**
- * Helper function to set the fragment shaders.
- */
-static INLINE void
-set_fragment_shader(struct st_context *st)
-{
-   if (!st->clear.fs)
-      st->clear.fs = util_make_fragment_passthrough_shader(st->pipe);
-
-   cso_set_fragment_shader_handle(st->cso_context, st->clear.fs);
-}
-
-
-/**
- * Helper function to set the vertex shader.
- */
-static INLINE void
-set_vertex_shader(struct st_context *st)
-{
-   /* vertex shader - still required to provide the linkage between
-    * fragment shader input semantics and vertex_element/buffers.
-    */
-   if (!st->clear.vs)
-   {
-      const uint semantic_names[] = { TGSI_SEMANTIC_POSITION,
-                                      TGSI_SEMANTIC_COLOR };
-      const uint semantic_indexes[] = { 0, 0 };
-      st->clear.vs = util_make_vertex_passthrough_shader(st->pipe, 2,
-                                                         semantic_names,
-                                                         semantic_indexes);
-   }
-
-   cso_set_vertex_shader_handle(st->cso_context, st->clear.vs);
-}
-
-
-/**
- * Draw a screen-aligned quadrilateral.
- * Coords are clip coords with y=0=bottom.
- */
-static void
-draw_quad(struct st_context *st,
-          float x0, float y0, float x1, float y1, GLfloat z,
-          const GLfloat color[4])
-{
-   struct pipe_context *pipe = st->pipe;
-
-   /* XXX: Need to improve buffer_write to allow NO_WAIT (as well as
-    * no_flush) updates to buffers where we know there is no conflict
-    * with previous data.  Currently using max_slots > 1 will cause
-    * synchronous rendering if the driver flushes its command buffers
-    * between one bitmap and the next.  Our flush hook below isn't
-    * sufficient to catch this as the driver doesn't tell us when it
-    * flushes its own command buffers.  Until this gets fixed, pay the
-    * price of allocating a new buffer for each bitmap cache-flush to
-    * avoid synchronous rendering.
-    */
-   const GLuint max_slots = 1; /* 1024 / sizeof(st->clear.vertices); */
-   GLuint i;
-
-   if (st->clear.vbuf_slot >= max_slots) {
-      pipe_resource_reference(&st->clear.vbuf, NULL);
-      st->clear.vbuf_slot = 0;
-   }
-
-   if (!st->clear.vbuf) {
-      st->clear.vbuf = pipe_buffer_create(pipe->screen,
-                                          PIPE_BIND_VERTEX_BUFFER,
-                                          PIPE_USAGE_STREAM,
-                                          max_slots * sizeof(st->clear.vertices));
-   }
-
-   /* positions */
-   st->clear.vertices[0][0][0] = x0;
-   st->clear.vertices[0][0][1] = y0;
-
-   st->clear.vertices[1][0][0] = x1;
-   st->clear.vertices[1][0][1] = y0;
-
-   st->clear.vertices[2][0][0] = x1;
-   st->clear.vertices[2][0][1] = y1;
-
-   st->clear.vertices[3][0][0] = x0;
-   st->clear.vertices[3][0][1] = y1;
-
-   /* same for all verts: */
-   for (i = 0; i < 4; i++) {
-      st->clear.vertices[i][0][2] = z;
-      st->clear.vertices[i][0][3] = 1.0;
-      st->clear.vertices[i][1][0] = color[0];
-      st->clear.vertices[i][1][1] = color[1];
-      st->clear.vertices[i][1][2] = color[2];
-      st->clear.vertices[i][1][3] = color[3];
-   }
-
-   /* put vertex data into vbuf */
-   pipe_buffer_write_nooverlap(st->pipe, st->clear.vbuf,
-                                           st->clear.vbuf_slot
-                                             * sizeof(st->clear.vertices),
-                                           sizeof(st->clear.vertices),
-                                           st->clear.vertices);
-
-   /* draw */
-   util_draw_vertex_buffer(pipe,
-                           st->cso_context,
-                           st->clear.vbuf, 
-                           st->clear.vbuf_slot * sizeof(st->clear.vertices),
-                           PIPE_PRIM_TRIANGLE_FAN,
-                           4,  /* verts */
-                           2); /* attribs/vert */
-
-   /* Increment slot */
-   st->clear.vbuf_slot++;
-}
-
-
-
-/**
- * Do glClear by drawing a quadrilateral.
- * The vertices of the quad will be computed from the
- * ctx->DrawBuffer->_X/Ymin/max fields.
- */
-static void
-clear_with_quad(struct gl_context *ctx,
-                GLboolean color, GLboolean depth, GLboolean stencil)
-{
-   struct st_context *st = st_context(ctx);
-   const struct gl_framebuffer *fb = ctx->DrawBuffer;
-   const GLfloat fb_width = (GLfloat) fb->Width;
-   const GLfloat fb_height = (GLfloat) fb->Height;
-   const GLfloat x0 = (GLfloat) ctx->DrawBuffer->_Xmin / fb_width * 2.0f - 1.0f;
-   const GLfloat x1 = (GLfloat) ctx->DrawBuffer->_Xmax / fb_width * 2.0f - 1.0f;
-   const GLfloat y0 = (GLfloat) ctx->DrawBuffer->_Ymin / fb_height * 2.0f - 1.0f;
-   const GLfloat y1 = (GLfloat) ctx->DrawBuffer->_Ymax / fb_height * 2.0f - 1.0f;
-   float clearColor[4];
-
-   /*
-   printf("%s %s%s%s %f,%f %f,%f\n", __FUNCTION__, 
-	  color ? "color, " : "",
-	  depth ? "depth, " : "",
-	  stencil ? "stencil" : "",
-	  x0, y0,
-	  x1, y1);
-   */
-
-   cso_save_blend(st->cso_context);
-   cso_save_stencil_ref(st->cso_context);
-   cso_save_depth_stencil_alpha(st->cso_context);
-   cso_save_rasterizer(st->cso_context);
-   cso_save_viewport(st->cso_context);
-   cso_save_clip(st->cso_context);
-   cso_save_fragment_shader(st->cso_context);
-   cso_save_vertex_shader(st->cso_context);
-   cso_save_vertex_elements(st->cso_context);
-   cso_save_vertex_buffers(st->cso_context);
-
-   /* blend state: RGBA masking */
-   {
-      struct pipe_blend_state blend;
-      memset(&blend, 0, sizeof(blend));
-      blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ONE;
-      blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE;
-      blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ZERO;
-      blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO;
-      if (color) {
-         if (ctx->Color.ColorMask[0][0])
-            blend.rt[0].colormask |= PIPE_MASK_R;
-         if (ctx->Color.ColorMask[0][1])
-            blend.rt[0].colormask |= PIPE_MASK_G;
-         if (ctx->Color.ColorMask[0][2])
-            blend.rt[0].colormask |= PIPE_MASK_B;
-         if (ctx->Color.ColorMask[0][3])
-            blend.rt[0].colormask |= PIPE_MASK_A;
-         if (st->ctx->Color.DitherFlag)
-            blend.dither = 1;
-      }
-      cso_set_blend(st->cso_context, &blend);
-   }
-
-   /* depth_stencil state: always pass/set to ref value */
-   {
-      struct pipe_depth_stencil_alpha_state depth_stencil;
-      memset(&depth_stencil, 0, sizeof(depth_stencil));
-      if (depth) {
-         depth_stencil.depth.enabled = 1;
-         depth_stencil.depth.writemask = 1;
-         depth_stencil.depth.func = PIPE_FUNC_ALWAYS;
-      }
-
-      if (stencil) {
-         struct pipe_stencil_ref stencil_ref;
-         memset(&stencil_ref, 0, sizeof(stencil_ref));
-         depth_stencil.stencil[0].enabled = 1;
-         depth_stencil.stencil[0].func = PIPE_FUNC_ALWAYS;
-         depth_stencil.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE;
-         depth_stencil.stencil[0].zpass_op = PIPE_STENCIL_OP_REPLACE;
-         depth_stencil.stencil[0].zfail_op = PIPE_STENCIL_OP_REPLACE;
-         depth_stencil.stencil[0].valuemask = 0xff;
-         depth_stencil.stencil[0].writemask = ctx->Stencil.WriteMask[0] & 0xff;
-         stencil_ref.ref_value[0] = ctx->Stencil.Clear;
-         cso_set_stencil_ref(st->cso_context, &stencil_ref);
-      }
-
-      cso_set_depth_stencil_alpha(st->cso_context, &depth_stencil);
-   }
-
-   cso_set_vertex_elements(st->cso_context, 2, st->velems_util_draw);
-
-   cso_set_rasterizer(st->cso_context, &st->clear.raster);
-
-   /* viewport state: viewport matching window dims */
-   {
-      const GLboolean invert = (st_fb_orientation(fb) == Y_0_TOP);
-      struct pipe_viewport_state vp;
-      vp.scale[0] = 0.5f * fb_width;
-      vp.scale[1] = fb_height * (invert ? -0.5f : 0.5f);
-      vp.scale[2] = 1.0f;
-      vp.scale[3] = 1.0f;
-      vp.translate[0] = 0.5f * fb_width;
-      vp.translate[1] = 0.5f * fb_height;
-      vp.translate[2] = 0.0f;
-      vp.translate[3] = 0.0f;
-      cso_set_viewport(st->cso_context, &vp);
-   }
-
-   cso_set_clip(st->cso_context, &st->clear.clip);
-   set_fragment_shader(st);
-   set_vertex_shader(st);
-
-   if (ctx->DrawBuffer->_ColorDrawBuffers[0]) {
-      st_translate_color(ctx->Color.ClearColor,
-                         ctx->DrawBuffer->_ColorDrawBuffers[0]->_BaseFormat,
-                         clearColor);
-   }
-
-   /* draw quad matching scissor rect */
-   draw_quad(st, x0, y0, x1, y1, (GLfloat) ctx->Depth.Clear, clearColor);
-
-   /* Restore pipe state */
-   cso_restore_blend(st->cso_context);
-   cso_restore_stencil_ref(st->cso_context);
-   cso_restore_depth_stencil_alpha(st->cso_context);
-   cso_restore_rasterizer(st->cso_context);
-   cso_restore_viewport(st->cso_context);
-   cso_restore_clip(st->cso_context);
-   cso_restore_fragment_shader(st->cso_context);
-   cso_restore_vertex_shader(st->cso_context);
-   cso_restore_vertex_elements(st->cso_context);
-   cso_restore_vertex_buffers(st->cso_context);
-}
-
-
-/**
- * Determine if we need to clear the depth buffer by drawing a quad.
- */
-static INLINE GLboolean
-check_clear_color_with_quad(struct gl_context *ctx, struct gl_renderbuffer *rb)
-{
-   if (ctx->Scissor.Enabled &&
-       (ctx->Scissor.X != 0 ||
-        ctx->Scissor.Y != 0 ||
-        ctx->Scissor.Width < rb->Width ||
-        ctx->Scissor.Height < rb->Height))
-      return GL_TRUE;
-
-   if (!ctx->Color.ColorMask[0][0] ||
-       !ctx->Color.ColorMask[0][1] ||
-       !ctx->Color.ColorMask[0][2] ||
-       !ctx->Color.ColorMask[0][3])
-      return GL_TRUE;
-
-   return GL_FALSE;
-}
-
-
-/**
- * Determine if we need to clear the combiend depth/stencil buffer by
- * drawing a quad.
- */
-static INLINE GLboolean
-check_clear_depth_stencil_with_quad(struct gl_context *ctx, struct gl_renderbuffer *rb)
-{
-   const GLuint stencilMax = 0xff;
-   GLboolean maskStencil
-      = (ctx->Stencil.WriteMask[0] & stencilMax) != stencilMax;
-
-   assert(rb->Format == MESA_FORMAT_S8 ||
-          rb->Format == MESA_FORMAT_Z24_S8 ||
-          rb->Format == MESA_FORMAT_S8_Z24);
-
-   if (ctx->Scissor.Enabled &&
-       (ctx->Scissor.X != 0 ||
-        ctx->Scissor.Y != 0 ||
-        ctx->Scissor.Width < rb->Width ||
-        ctx->Scissor.Height < rb->Height))
-      return GL_TRUE;
-
-   if (maskStencil)
-      return GL_TRUE;
-
-   return GL_FALSE;
-}
-
-
-/**
- * Determine if we need to clear the depth buffer by drawing a quad.
- */
-static INLINE GLboolean
-check_clear_depth_with_quad(struct gl_context *ctx, struct gl_renderbuffer *rb,
-                            boolean ds_separate)
-{
-   const struct st_renderbuffer *strb = st_renderbuffer(rb);
-   const GLboolean isDS = util_format_is_depth_and_stencil(strb->surface->format);
-
-   if (ctx->Scissor.Enabled &&
-       (ctx->Scissor.X != 0 ||
-        ctx->Scissor.Y != 0 ||
-        ctx->Scissor.Width < rb->Width ||
-        ctx->Scissor.Height < rb->Height))
-      return GL_TRUE;
-
-   if (!ds_separate && isDS && ctx->DrawBuffer->Visual.stencilBits > 0)
-      return GL_TRUE;
-
-   return GL_FALSE;
-}
-
-
-/**
- * Determine if we need to clear the stencil buffer by drawing a quad.
- */
-static INLINE GLboolean
-check_clear_stencil_with_quad(struct gl_context *ctx, struct gl_renderbuffer *rb,
-                              boolean ds_separate)
-{
-   const struct st_renderbuffer *strb = st_renderbuffer(rb);
-   const GLboolean isDS = util_format_is_depth_and_stencil(strb->surface->format);
-   const GLuint stencilMax = 0xff;
-   const GLboolean maskStencil
-      = (ctx->Stencil.WriteMask[0] & stencilMax) != stencilMax;
-
-   assert(rb->Format == MESA_FORMAT_S8 ||
-          rb->Format == MESA_FORMAT_Z24_S8 ||
-          rb->Format == MESA_FORMAT_S8_Z24);
-
-   if (maskStencil) 
-      return GL_TRUE;
-
-   if (ctx->Scissor.Enabled &&
-       (ctx->Scissor.X != 0 ||
-        ctx->Scissor.Y != 0 ||
-        ctx->Scissor.Width < rb->Width ||
-        ctx->Scissor.Height < rb->Height))
-      return GL_TRUE;
-
-   /* This is correct, but it is necessary to look at the depth clear
-    * value held in the surface when it comes time to issue the clear,
-    * rather than taking depth and stencil clear values from the
-    * current state.
-    */
-   if (!ds_separate && isDS && ctx->DrawBuffer->Visual.depthBits > 0)
-      return GL_TRUE;
-
-   return GL_FALSE;
-}
-
-
-
-/**
- * Called when we need to flush.
- */
-void
-st_flush_clear(struct st_context *st)
-{
-   /* Release vertex buffer to avoid synchronous rendering if we were
-    * to map it in the next frame.
-    */
-   pipe_resource_reference(&st->clear.vbuf, NULL);
-   st->clear.vbuf_slot = 0;
-}
- 
-
-
-/**
- * Called via ctx->Driver.Clear()
- */
-static void
-st_Clear(struct gl_context *ctx, GLbitfield mask)
-{
-   static const GLbitfield BUFFER_BITS_DS
-      = (BUFFER_BIT_DEPTH | BUFFER_BIT_STENCIL);
-   struct st_context *st = st_context(ctx);
-   struct gl_renderbuffer *depthRb
-      = ctx->DrawBuffer->Attachment[BUFFER_DEPTH].Renderbuffer;
-   struct gl_renderbuffer *stencilRb
-      = ctx->DrawBuffer->Attachment[BUFFER_STENCIL].Renderbuffer;
-   GLbitfield quad_buffers = 0x0;
-   GLbitfield clear_buffers = 0x0;
-   GLuint i;
-
-   /* This makes sure the pipe has the latest scissor, etc values */
-   st_validate_state( st );
-
-   if (mask & BUFFER_BITS_COLOR) {
-      for (i = 0; i < ctx->DrawBuffer->_NumColorDrawBuffers; i++) {
-         GLuint b = ctx->DrawBuffer->_ColorDrawBufferIndexes[i];
-
-         if (mask & (1 << b)) {
-            struct gl_renderbuffer *rb
-               = ctx->DrawBuffer->Attachment[b].Renderbuffer;
-            struct st_renderbuffer *strb = st_renderbuffer(rb);
-
-            if (!strb || !strb->surface)
-               continue;
-
-            if (check_clear_color_with_quad( ctx, rb ))
-               quad_buffers |= PIPE_CLEAR_COLOR;
-            else
-               clear_buffers |= PIPE_CLEAR_COLOR;
-         }
-      }
-   }
-
-   if ((mask & BUFFER_BITS_DS) == BUFFER_BITS_DS && depthRb == stencilRb) {
-      /* clearing combined depth + stencil */
-      struct st_renderbuffer *strb = st_renderbuffer(depthRb);
-
-      if (strb->surface) {
-         if (check_clear_depth_stencil_with_quad(ctx, depthRb))
-            quad_buffers |= PIPE_CLEAR_DEPTHSTENCIL;
-         else
-            clear_buffers |= PIPE_CLEAR_DEPTHSTENCIL;
-      }
-   }
-   else {
-      /* separate depth/stencil clears */
-      /* I don't think truly separate buffers are actually possible in gallium or hw? */
-      if (mask & BUFFER_BIT_DEPTH) {
-         struct st_renderbuffer *strb = st_renderbuffer(depthRb);
-
-         if (strb->surface) {
-            if (check_clear_depth_with_quad(ctx, depthRb,
-                                            st->clear.enable_ds_separate))
-               quad_buffers |= PIPE_CLEAR_DEPTH;
-            else
-               clear_buffers |= PIPE_CLEAR_DEPTH;
-         }
-      }
-      if (mask & BUFFER_BIT_STENCIL) {
-         struct st_renderbuffer *strb = st_renderbuffer(stencilRb);
-
-         if (strb->surface) {
-            if (check_clear_stencil_with_quad(ctx, stencilRb,
-                                              st->clear.enable_ds_separate))
-               quad_buffers |= PIPE_CLEAR_STENCIL;
-            else
-               clear_buffers |= PIPE_CLEAR_STENCIL;
-         }
-      }
-   }
-
-   /*
-    * If we're going to use clear_with_quad() for any reason, use it for
-    * everything possible.
-    */
-   if (quad_buffers) {
-      quad_buffers |= clear_buffers;
-      clear_with_quad(ctx,
-                      quad_buffers & PIPE_CLEAR_COLOR,
-                      quad_buffers & PIPE_CLEAR_DEPTH,
-                      quad_buffers & PIPE_CLEAR_STENCIL);
-   } else if (clear_buffers) {
-      /* driver cannot know it can clear everything if the buffer
-       * is a combined depth/stencil buffer but this wasn't actually
-       * required from the visual. Hence fix this up to avoid potential
-       * read-modify-write in the driver.
-       */
-      float clearColor[4];
-
-      if ((clear_buffers & PIPE_CLEAR_DEPTHSTENCIL) &&
-          ((clear_buffers & PIPE_CLEAR_DEPTHSTENCIL) != PIPE_CLEAR_DEPTHSTENCIL) &&
-          (depthRb == stencilRb) &&
-          (ctx->DrawBuffer->Visual.depthBits == 0 ||
-           ctx->DrawBuffer->Visual.stencilBits == 0))
-         clear_buffers |= PIPE_CLEAR_DEPTHSTENCIL;
-
-      if (ctx->DrawBuffer->_ColorDrawBuffers[0]) {
-         st_translate_color(ctx->Color.ClearColor,
-                            ctx->DrawBuffer->_ColorDrawBuffers[0]->_BaseFormat,
-                            clearColor);
-      }
-
-      st->pipe->clear(st->pipe, clear_buffers, ctx->Color.ClearColor,
-                      ctx->Depth.Clear, ctx->Stencil.Clear);
-   }
-   if (mask & BUFFER_BIT_ACCUM)
-      st_clear_accum_buffer(ctx,
-                            ctx->DrawBuffer->Attachment[BUFFER_ACCUM].Renderbuffer);
-}
-
-
-void
-st_init_clear_functions(struct dd_function_table *functions)
-{
-   functions->Clear = st_Clear;
-}
+/**************************************************************************
+ * 
+ * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * All Rights Reserved.
+ * Copyright 2009 VMware, Inc.  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"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ * 
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * 
+ **************************************************************************/
+
+ /*
+  * Authors:
+  *   Keith Whitwell <keith@tungstengraphics.com>
+  *   Brian Paul
+  *   Michel Dänzer
+  */
+
+#include "main/glheader.h"
+#include "main/formats.h"
+#include "main/macros.h"
+#include "program/prog_instruction.h"
+#include "st_context.h"
+#include "st_atom.h"
+#include "st_cb_accum.h"
+#include "st_cb_clear.h"
+#include "st_cb_fbo.h"
+#include "st_format.h"
+#include "st_program.h"
+
+#include "pipe/p_context.h"
+#include "pipe/p_shader_tokens.h"
+#include "pipe/p_state.h"
+#include "pipe/p_defines.h"
+#include "util/u_format.h"
+#include "util/u_inlines.h"
+#include "util/u_simple_shaders.h"
+#include "util/u_draw_quad.h"
+
+#include "cso_cache/cso_context.h"
+
+
+/**
+ * Do per-context initialization for glClear.
+ */
+void
+st_init_clear(struct st_context *st)
+{
+   struct pipe_screen *pscreen = st->pipe->screen;
+
+   memset(&st->clear, 0, sizeof(st->clear));
+
+   st->clear.raster.gl_rasterization_rules = 1;
+   st->clear.enable_ds_separate = pscreen->get_param(pscreen, PIPE_CAP_DEPTHSTENCIL_CLEAR_SEPARATE);
+}
+
+
+/**
+ * Free per-context state for glClear.
+ */
+void
+st_destroy_clear(struct st_context *st)
+{
+   if (st->clear.fs) {
+      cso_delete_fragment_shader(st->cso_context, st->clear.fs);
+      st->clear.fs = NULL;
+   }
+   if (st->clear.vs) {
+      cso_delete_vertex_shader(st->cso_context, st->clear.vs);
+      st->clear.vs = NULL;
+   }
+   if (st->clear.vbuf) {
+      pipe_resource_reference(&st->clear.vbuf, NULL);
+      st->clear.vbuf = NULL;
+   }
+}
+
+
+/**
+ * Helper function to set the fragment shaders.
+ */
+static INLINE void
+set_fragment_shader(struct st_context *st)
+{
+   if (!st->clear.fs)
+      st->clear.fs = util_make_fragment_passthrough_shader(st->pipe);
+
+   cso_set_fragment_shader_handle(st->cso_context, st->clear.fs);
+}
+
+
+/**
+ * Helper function to set the vertex shader.
+ */
+static INLINE void
+set_vertex_shader(struct st_context *st)
+{
+   /* vertex shader - still required to provide the linkage between
+    * fragment shader input semantics and vertex_element/buffers.
+    */
+   if (!st->clear.vs)
+   {
+      const uint semantic_names[] = { TGSI_SEMANTIC_POSITION,
+                                      TGSI_SEMANTIC_COLOR };
+      const uint semantic_indexes[] = { 0, 0 };
+      st->clear.vs = util_make_vertex_passthrough_shader(st->pipe, 2,
+                                                         semantic_names,
+                                                         semantic_indexes);
+   }
+
+   cso_set_vertex_shader_handle(st->cso_context, st->clear.vs);
+}
+
+
+/**
+ * Draw a screen-aligned quadrilateral.
+ * Coords are clip coords with y=0=bottom.
+ */
+static void
+draw_quad(struct st_context *st,
+          float x0, float y0, float x1, float y1, GLfloat z,
+          const GLfloat color[4])
+{
+   struct pipe_context *pipe = st->pipe;
+
+   /* XXX: Need to improve buffer_write to allow NO_WAIT (as well as
+    * no_flush) updates to buffers where we know there is no conflict
+    * with previous data.  Currently using max_slots > 1 will cause
+    * synchronous rendering if the driver flushes its command buffers
+    * between one bitmap and the next.  Our flush hook below isn't
+    * sufficient to catch this as the driver doesn't tell us when it
+    * flushes its own command buffers.  Until this gets fixed, pay the
+    * price of allocating a new buffer for each bitmap cache-flush to
+    * avoid synchronous rendering.
+    */
+   const GLuint max_slots = 1; /* 1024 / sizeof(st->clear.vertices); */
+   GLuint i;
+
+   if (st->clear.vbuf_slot >= max_slots) {
+      pipe_resource_reference(&st->clear.vbuf, NULL);
+      st->clear.vbuf_slot = 0;
+   }
+
+   if (!st->clear.vbuf) {
+      st->clear.vbuf = pipe_buffer_create(pipe->screen,
+                                          PIPE_BIND_VERTEX_BUFFER,
+                                          PIPE_USAGE_STREAM,
+                                          max_slots * sizeof(st->clear.vertices));
+   }
+
+   /* positions */
+   st->clear.vertices[0][0][0] = x0;
+   st->clear.vertices[0][0][1] = y0;
+
+   st->clear.vertices[1][0][0] = x1;
+   st->clear.vertices[1][0][1] = y0;
+
+   st->clear.vertices[2][0][0] = x1;
+   st->clear.vertices[2][0][1] = y1;
+
+   st->clear.vertices[3][0][0] = x0;
+   st->clear.vertices[3][0][1] = y1;
+
+   /* same for all verts: */
+   for (i = 0; i < 4; i++) {
+      st->clear.vertices[i][0][2] = z;
+      st->clear.vertices[i][0][3] = 1.0;
+      st->clear.vertices[i][1][0] = color[0];
+      st->clear.vertices[i][1][1] = color[1];
+      st->clear.vertices[i][1][2] = color[2];
+      st->clear.vertices[i][1][3] = color[3];
+   }
+
+   /* put vertex data into vbuf */
+   pipe_buffer_write_nooverlap(st->pipe, st->clear.vbuf,
+                                           st->clear.vbuf_slot
+                                             * sizeof(st->clear.vertices),
+                                           sizeof(st->clear.vertices),
+                                           st->clear.vertices);
+
+   /* draw */
+   util_draw_vertex_buffer(pipe,
+                           st->cso_context,
+                           st->clear.vbuf, 
+                           st->clear.vbuf_slot * sizeof(st->clear.vertices),
+                           PIPE_PRIM_TRIANGLE_FAN,
+                           4,  /* verts */
+                           2); /* attribs/vert */
+
+   /* Increment slot */
+   st->clear.vbuf_slot++;
+}
+
+
+
+/**
+ * Do glClear by drawing a quadrilateral.
+ * The vertices of the quad will be computed from the
+ * ctx->DrawBuffer->_X/Ymin/max fields.
+ */
+static void
+clear_with_quad(struct gl_context *ctx,
+                GLboolean color, GLboolean depth, GLboolean stencil)
+{
+   struct st_context *st = st_context(ctx);
+   const struct gl_framebuffer *fb = ctx->DrawBuffer;
+   const GLfloat fb_width = (GLfloat) fb->Width;
+   const GLfloat fb_height = (GLfloat) fb->Height;
+   const GLfloat x0 = (GLfloat) ctx->DrawBuffer->_Xmin / fb_width * 2.0f - 1.0f;
+   const GLfloat x1 = (GLfloat) ctx->DrawBuffer->_Xmax / fb_width * 2.0f - 1.0f;
+   const GLfloat y0 = (GLfloat) ctx->DrawBuffer->_Ymin / fb_height * 2.0f - 1.0f;
+   const GLfloat y1 = (GLfloat) ctx->DrawBuffer->_Ymax / fb_height * 2.0f - 1.0f;
+   float clearColor[4];
+
+   /*
+   printf("%s %s%s%s %f,%f %f,%f\n", __FUNCTION__, 
+	  color ? "color, " : "",
+	  depth ? "depth, " : "",
+	  stencil ? "stencil" : "",
+	  x0, y0,
+	  x1, y1);
+   */
+
+   cso_save_blend(st->cso_context);
+   cso_save_stencil_ref(st->cso_context);
+   cso_save_depth_stencil_alpha(st->cso_context);
+   cso_save_rasterizer(st->cso_context);
+   cso_save_viewport(st->cso_context);
+   cso_save_clip(st->cso_context);
+   cso_save_fragment_shader(st->cso_context);
+   cso_save_vertex_shader(st->cso_context);
+   cso_save_vertex_elements(st->cso_context);
+   cso_save_vertex_buffers(st->cso_context);
+
+   /* blend state: RGBA masking */
+   {
+      struct pipe_blend_state blend;
+      memset(&blend, 0, sizeof(blend));
+      blend.rt[0].rgb_src_factor = PIPE_BLENDFACTOR_ONE;
+      blend.rt[0].alpha_src_factor = PIPE_BLENDFACTOR_ONE;
+      blend.rt[0].rgb_dst_factor = PIPE_BLENDFACTOR_ZERO;
+      blend.rt[0].alpha_dst_factor = PIPE_BLENDFACTOR_ZERO;
+      if (color) {
+         if (ctx->Color.ColorMask[0][0])
+            blend.rt[0].colormask |= PIPE_MASK_R;
+         if (ctx->Color.ColorMask[0][1])
+            blend.rt[0].colormask |= PIPE_MASK_G;
+         if (ctx->Color.ColorMask[0][2])
+            blend.rt[0].colormask |= PIPE_MASK_B;
+         if (ctx->Color.ColorMask[0][3])
+            blend.rt[0].colormask |= PIPE_MASK_A;
+         if (st->ctx->Color.DitherFlag)
+            blend.dither = 1;
+      }
+      cso_set_blend(st->cso_context, &blend);
+   }
+
+   /* depth_stencil state: always pass/set to ref value */
+   {
+      struct pipe_depth_stencil_alpha_state depth_stencil;
+      memset(&depth_stencil, 0, sizeof(depth_stencil));
+      if (depth) {
+         depth_stencil.depth.enabled = 1;
+         depth_stencil.depth.writemask = 1;
+         depth_stencil.depth.func = PIPE_FUNC_ALWAYS;
+      }
+
+      if (stencil) {
+         struct pipe_stencil_ref stencil_ref;
+         memset(&stencil_ref, 0, sizeof(stencil_ref));
+         depth_stencil.stencil[0].enabled = 1;
+         depth_stencil.stencil[0].func = PIPE_FUNC_ALWAYS;
+         depth_stencil.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE;
+         depth_stencil.stencil[0].zpass_op = PIPE_STENCIL_OP_REPLACE;
+         depth_stencil.stencil[0].zfail_op = PIPE_STENCIL_OP_REPLACE;
+         depth_stencil.stencil[0].valuemask = 0xff;
+         depth_stencil.stencil[0].writemask = ctx->Stencil.WriteMask[0] & 0xff;
+         stencil_ref.ref_value[0] = ctx->Stencil.Clear;
+         cso_set_stencil_ref(st->cso_context, &stencil_ref);
+      }
+
+      cso_set_depth_stencil_alpha(st->cso_context, &depth_stencil);
+   }
+
+   cso_set_vertex_elements(st->cso_context, 2, st->velems_util_draw);
+
+   cso_set_rasterizer(st->cso_context, &st->clear.raster);
+
+   /* viewport state: viewport matching window dims */
+   {
+      const GLboolean invert = (st_fb_orientation(fb) == Y_0_TOP);
+      struct pipe_viewport_state vp;
+      vp.scale[0] = 0.5f * fb_width;
+      vp.scale[1] = fb_height * (invert ? -0.5f : 0.5f);
+      vp.scale[2] = 1.0f;
+      vp.scale[3] = 1.0f;
+      vp.translate[0] = 0.5f * fb_width;
+      vp.translate[1] = 0.5f * fb_height;
+      vp.translate[2] = 0.0f;
+      vp.translate[3] = 0.0f;
+      cso_set_viewport(st->cso_context, &vp);
+   }
+
+   cso_set_clip(st->cso_context, &st->clear.clip);
+   set_fragment_shader(st);
+   set_vertex_shader(st);
+
+   if (ctx->DrawBuffer->_ColorDrawBuffers[0]) {
+      st_translate_color(ctx->Color.ClearColorUnclamped,
+                         ctx->DrawBuffer->_ColorDrawBuffers[0]->_BaseFormat,
+                         clearColor);
+   }
+
+   /* draw quad matching scissor rect */
+   draw_quad(st, x0, y0, x1, y1, (GLfloat) ctx->Depth.Clear, clearColor);
+
+   /* Restore pipe state */
+   cso_restore_blend(st->cso_context);
+   cso_restore_stencil_ref(st->cso_context);
+   cso_restore_depth_stencil_alpha(st->cso_context);
+   cso_restore_rasterizer(st->cso_context);
+   cso_restore_viewport(st->cso_context);
+   cso_restore_clip(st->cso_context);
+   cso_restore_fragment_shader(st->cso_context);
+   cso_restore_vertex_shader(st->cso_context);
+   cso_restore_vertex_elements(st->cso_context);
+   cso_restore_vertex_buffers(st->cso_context);
+}
+
+
+/**
+ * Determine if we need to clear the depth buffer by drawing a quad.
+ */
+static INLINE GLboolean
+check_clear_color_with_quad(struct gl_context *ctx, struct gl_renderbuffer *rb)
+{
+   if (ctx->Scissor.Enabled &&
+       (ctx->Scissor.X != 0 ||
+        ctx->Scissor.Y != 0 ||
+        ctx->Scissor.Width < rb->Width ||
+        ctx->Scissor.Height < rb->Height))
+      return GL_TRUE;
+
+   if (!ctx->Color.ColorMask[0][0] ||
+       !ctx->Color.ColorMask[0][1] ||
+       !ctx->Color.ColorMask[0][2] ||
+       !ctx->Color.ColorMask[0][3])
+      return GL_TRUE;
+
+   return GL_FALSE;
+}
+
+
+/**
+ * Determine if we need to clear the combiend depth/stencil buffer by
+ * drawing a quad.
+ */
+static INLINE GLboolean
+check_clear_depth_stencil_with_quad(struct gl_context *ctx, struct gl_renderbuffer *rb)
+{
+   const GLuint stencilMax = 0xff;
+   GLboolean maskStencil
+      = (ctx->Stencil.WriteMask[0] & stencilMax) != stencilMax;
+
+   assert(rb->Format == MESA_FORMAT_S8 ||
+          rb->Format == MESA_FORMAT_Z24_S8 ||
+          rb->Format == MESA_FORMAT_S8_Z24);
+
+   if (ctx->Scissor.Enabled &&
+       (ctx->Scissor.X != 0 ||
+        ctx->Scissor.Y != 0 ||
+        ctx->Scissor.Width < rb->Width ||
+        ctx->Scissor.Height < rb->Height))
+      return GL_TRUE;
+
+   if (maskStencil)
+      return GL_TRUE;
+
+   return GL_FALSE;
+}
+
+
+/**
+ * Determine if we need to clear the depth buffer by drawing a quad.
+ */
+static INLINE GLboolean
+check_clear_depth_with_quad(struct gl_context *ctx, struct gl_renderbuffer *rb,
+                            boolean ds_separate)
+{
+   const struct st_renderbuffer *strb = st_renderbuffer(rb);
+   const GLboolean isDS = util_format_is_depth_and_stencil(strb->surface->format);
+
+   if (ctx->Scissor.Enabled &&
+       (ctx->Scissor.X != 0 ||
+        ctx->Scissor.Y != 0 ||
+        ctx->Scissor.Width < rb->Width ||
+        ctx->Scissor.Height < rb->Height))
+      return GL_TRUE;
+
+   if (!ds_separate && isDS && ctx->DrawBuffer->Visual.stencilBits > 0)
+      return GL_TRUE;
+
+   return GL_FALSE;
+}
+
+
+/**
+ * Determine if we need to clear the stencil buffer by drawing a quad.
+ */
+static INLINE GLboolean
+check_clear_stencil_with_quad(struct gl_context *ctx, struct gl_renderbuffer *rb,
+                              boolean ds_separate)
+{
+   const struct st_renderbuffer *strb = st_renderbuffer(rb);
+   const GLboolean isDS = util_format_is_depth_and_stencil(strb->surface->format);
+   const GLuint stencilMax = 0xff;
+   const GLboolean maskStencil
+      = (ctx->Stencil.WriteMask[0] & stencilMax) != stencilMax;
+
+   assert(rb->Format == MESA_FORMAT_S8 ||
+          rb->Format == MESA_FORMAT_Z24_S8 ||
+          rb->Format == MESA_FORMAT_S8_Z24);
+
+   if (maskStencil) 
+      return GL_TRUE;
+
+   if (ctx->Scissor.Enabled &&
+       (ctx->Scissor.X != 0 ||
+        ctx->Scissor.Y != 0 ||
+        ctx->Scissor.Width < rb->Width ||
+        ctx->Scissor.Height < rb->Height))
+      return GL_TRUE;
+
+   /* This is correct, but it is necessary to look at the depth clear
+    * value held in the surface when it comes time to issue the clear,
+    * rather than taking depth and stencil clear values from the
+    * current state.
+    */
+   if (!ds_separate && isDS && ctx->DrawBuffer->Visual.depthBits > 0)
+      return GL_TRUE;
+
+   return GL_FALSE;
+}
+
+
+
+/**
+ * Called when we need to flush.
+ */
+void
+st_flush_clear(struct st_context *st)
+{
+   /* Release vertex buffer to avoid synchronous rendering if we were
+    * to map it in the next frame.
+    */
+   pipe_resource_reference(&st->clear.vbuf, NULL);
+   st->clear.vbuf_slot = 0;
+}
+ 
+
+
+/**
+ * Called via ctx->Driver.Clear()
+ */
+static void
+st_Clear(struct gl_context *ctx, GLbitfield mask)
+{
+   static const GLbitfield BUFFER_BITS_DS
+      = (BUFFER_BIT_DEPTH | BUFFER_BIT_STENCIL);
+   struct st_context *st = st_context(ctx);
+   struct gl_renderbuffer *depthRb
+      = ctx->DrawBuffer->Attachment[BUFFER_DEPTH].Renderbuffer;
+   struct gl_renderbuffer *stencilRb
+      = ctx->DrawBuffer->Attachment[BUFFER_STENCIL].Renderbuffer;
+   GLbitfield quad_buffers = 0x0;
+   GLbitfield clear_buffers = 0x0;
+   GLuint i;
+
+   /* This makes sure the pipe has the latest scissor, etc values */
+   st_validate_state( st );
+
+   if (mask & BUFFER_BITS_COLOR) {
+      for (i = 0; i < ctx->DrawBuffer->_NumColorDrawBuffers; i++) {
+         GLuint b = ctx->DrawBuffer->_ColorDrawBufferIndexes[i];
+
+         if (mask & (1 << b)) {
+            struct gl_renderbuffer *rb
+               = ctx->DrawBuffer->Attachment[b].Renderbuffer;
+            struct st_renderbuffer *strb = st_renderbuffer(rb);
+
+            if (!strb || !strb->surface)
+               continue;
+
+            if (check_clear_color_with_quad( ctx, rb ))
+               quad_buffers |= PIPE_CLEAR_COLOR;
+            else
+               clear_buffers |= PIPE_CLEAR_COLOR;
+         }
+      }
+   }
+
+   if ((mask & BUFFER_BITS_DS) == BUFFER_BITS_DS && depthRb == stencilRb) {
+      /* clearing combined depth + stencil */
+      struct st_renderbuffer *strb = st_renderbuffer(depthRb);
+
+      if (strb->surface) {
+         if (check_clear_depth_stencil_with_quad(ctx, depthRb))
+            quad_buffers |= PIPE_CLEAR_DEPTHSTENCIL;
+         else
+            clear_buffers |= PIPE_CLEAR_DEPTHSTENCIL;
+      }
+   }
+   else {
+      /* separate depth/stencil clears */
+      /* I don't think truly separate buffers are actually possible in gallium or hw? */
+      if (mask & BUFFER_BIT_DEPTH) {
+         struct st_renderbuffer *strb = st_renderbuffer(depthRb);
+
+         if (strb->surface) {
+            if (check_clear_depth_with_quad(ctx, depthRb,
+                                            st->clear.enable_ds_separate))
+               quad_buffers |= PIPE_CLEAR_DEPTH;
+            else
+               clear_buffers |= PIPE_CLEAR_DEPTH;
+         }
+      }
+      if (mask & BUFFER_BIT_STENCIL) {
+         struct st_renderbuffer *strb = st_renderbuffer(stencilRb);
+
+         if (strb->surface) {
+            if (check_clear_stencil_with_quad(ctx, stencilRb,
+                                              st->clear.enable_ds_separate))
+               quad_buffers |= PIPE_CLEAR_STENCIL;
+            else
+               clear_buffers |= PIPE_CLEAR_STENCIL;
+         }
+      }
+   }
+
+   /*
+    * If we're going to use clear_with_quad() for any reason, use it for
+    * everything possible.
+    */
+   if (quad_buffers) {
+      quad_buffers |= clear_buffers;
+      clear_with_quad(ctx,
+                      quad_buffers & PIPE_CLEAR_COLOR,
+                      quad_buffers & PIPE_CLEAR_DEPTH,
+                      quad_buffers & PIPE_CLEAR_STENCIL);
+   } else if (clear_buffers) {
+      /* driver cannot know it can clear everything if the buffer
+       * is a combined depth/stencil buffer but this wasn't actually
+       * required from the visual. Hence fix this up to avoid potential
+       * read-modify-write in the driver.
+       */
+      float clearColor[4];
+
+      if ((clear_buffers & PIPE_CLEAR_DEPTHSTENCIL) &&
+          ((clear_buffers & PIPE_CLEAR_DEPTHSTENCIL) != PIPE_CLEAR_DEPTHSTENCIL) &&
+          (depthRb == stencilRb) &&
+          (ctx->DrawBuffer->Visual.depthBits == 0 ||
+           ctx->DrawBuffer->Visual.stencilBits == 0))
+         clear_buffers |= PIPE_CLEAR_DEPTHSTENCIL;
+
+      if (ctx->DrawBuffer->_ColorDrawBuffers[0]) {
+         st_translate_color(ctx->Color.ClearColor,
+                            ctx->DrawBuffer->_ColorDrawBuffers[0]->_BaseFormat,
+                            clearColor);
+      }
+
+      st->pipe->clear(st->pipe, clear_buffers, ctx->Color.ClearColorUnclamped,
+                      ctx->Depth.Clear, ctx->Stencil.Clear);
+   }
+   if (mask & BUFFER_BIT_ACCUM)
+      st_clear_accum_buffer(ctx,
+                            ctx->DrawBuffer->Attachment[BUFFER_ACCUM].Renderbuffer);
+}
+
+
+void
+st_init_clear_functions(struct dd_function_table *functions)
+{
+   functions->Clear = st_Clear;
+}
diff --git a/mesalib/src/mesa/state_tracker/st_cb_drawpixels.c b/mesalib/src/mesa/state_tracker/st_cb_drawpixels.c
index eccc20757..1707f827c 100644
--- a/mesalib/src/mesa/state_tracker/st_cb_drawpixels.c
+++ b/mesalib/src/mesa/state_tracker/st_cb_drawpixels.c
@@ -296,7 +296,7 @@ base_format(GLenum format)
  * of the given format and type.
  */
 static GLenum
-internal_format(GLenum format, GLenum type)
+internal_format(struct gl_context *ctx, GLenum format, GLenum type)
 {
    switch (format) {
    case GL_DEPTH_COMPONENT:
@@ -326,7 +326,53 @@ internal_format(GLenum format, GLenum type)
          }
       }
       else {
-         return GL_RGBA;
+         switch (type) {
+         case GL_UNSIGNED_BYTE:
+         case GL_UNSIGNED_INT_8_8_8_8:
+         case GL_UNSIGNED_INT_8_8_8_8_REV:
+         default:
+            return GL_RGBA8;
+
+         case GL_UNSIGNED_BYTE_3_3_2:
+         case GL_UNSIGNED_BYTE_2_3_3_REV:
+         case GL_UNSIGNED_SHORT_4_4_4_4:
+         case GL_UNSIGNED_SHORT_4_4_4_4_REV:
+            return GL_RGBA4;
+
+         case GL_UNSIGNED_SHORT_5_6_5:
+         case GL_UNSIGNED_SHORT_5_6_5_REV:
+         case GL_UNSIGNED_SHORT_5_5_5_1:
+         case GL_UNSIGNED_SHORT_1_5_5_5_REV:
+            return GL_RGB5_A1;
+
+         case GL_UNSIGNED_INT_10_10_10_2:
+         case GL_UNSIGNED_INT_2_10_10_10_REV:
+            return GL_RGB10_A2;
+
+         case GL_UNSIGNED_SHORT:
+         case GL_UNSIGNED_INT:
+            return GL_RGBA16;
+
+         case GL_BYTE:
+            return
+               ctx->Extensions.EXT_texture_snorm ? GL_RGBA8_SNORM : GL_RGBA8;
+
+         case GL_SHORT:
+         case GL_INT:
+            return
+               ctx->Extensions.EXT_texture_snorm ? GL_RGBA16_SNORM : GL_RGBA16;
+
+         case GL_HALF_FLOAT_ARB:
+            return
+               ctx->Extensions.ARB_texture_float ? GL_RGBA16F :
+               ctx->Extensions.EXT_texture_snorm ? GL_RGBA16_SNORM : GL_RGBA16;
+
+         case GL_FLOAT:
+         case GL_DOUBLE:
+            return
+               ctx->Extensions.ARB_texture_float ? GL_RGBA32F :
+               ctx->Extensions.EXT_texture_snorm ? GL_RGBA16_SNORM : GL_RGBA16;
+         }
       }
    }
 }
@@ -369,7 +415,7 @@ make_texture(struct st_context *st,
    GLenum baseFormat, intFormat;
 
    baseFormat = base_format(format);
-   intFormat = internal_format(format, type);
+   intFormat = internal_format(ctx, format, type);
 
    mformat = st_ChooseTextureFormat_renderable(ctx, intFormat,
                                                format, type, GL_FALSE);
@@ -582,6 +628,7 @@ draw_textured_quad(struct gl_context *ctx, GLint x, GLint y, GLfloat z,
    {
       struct pipe_rasterizer_state rasterizer;
       memset(&rasterizer, 0, sizeof(rasterizer));
+      rasterizer.clamp_fragment_color = ctx->Color._ClampFragmentColor;
       rasterizer.gl_rasterization_rules = 1;
       rasterizer.scissor = ctx->Scissor.Enabled;
       cso_set_rasterizer(cso, &rasterizer);
diff --git a/mesalib/src/mesa/state_tracker/st_cb_readpixels.c b/mesalib/src/mesa/state_tracker/st_cb_readpixels.c
index f8da2a4d1..03f58bf0f 100644
--- a/mesalib/src/mesa/state_tracker/st_cb_readpixels.c
+++ b/mesalib/src/mesa/state_tracker/st_cb_readpixels.c
@@ -331,7 +331,7 @@ st_readpixels(struct gl_context *ctx, GLint x, GLint y, GLsizei width, GLsizei h
    struct st_context *st = st_context(ctx);
    struct pipe_context *pipe = st->pipe;
    GLfloat (*temp)[4];
-   const GLbitfield transferOps = ctx->_ImageTransferState;
+   GLbitfield transferOps = ctx->_ImageTransferState;
    GLsizei i, j;
    GLint yStep, dfStride;
    GLfloat *df;
@@ -391,7 +391,10 @@ st_readpixels(struct gl_context *ctx, GLint x, GLint y, GLsizei width, GLsizei h
       return;
    }
 
-   if (format == GL_RGBA && type == GL_FLOAT) {
+   if(ctx->Color._ClampReadColor)
+      transferOps |= IMAGE_CLAMP_BIT;
+
+   if (format == GL_RGBA && type == GL_FLOAT && !transferOps) {
       /* write tile(row) directly into user's buffer */
       df = (GLfloat *) _mesa_image_address2d(&clippedPacking, dest, width,
                                              height, format, type, 0, 0);
diff --git a/mesalib/src/mesa/state_tracker/st_extensions.c b/mesalib/src/mesa/state_tracker/st_extensions.c
index 2153865cf..e32779044 100644
--- a/mesalib/src/mesa/state_tracker/st_extensions.c
+++ b/mesalib/src/mesa/state_tracker/st_extensions.c
@@ -1,529 +1,564 @@
-/**************************************************************************
- * 
- * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
- * Copyright (c) 2008 VMware, Inc.
- * 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"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- * 
- **************************************************************************/
-
-#include "main/imports.h"
-#include "main/context.h"
-#include "main/macros.h"
-#include "main/mfeatures.h"
-
-#include "pipe/p_context.h"
-#include "pipe/p_defines.h"
-#include "pipe/p_screen.h"
-
-#include "st_context.h"
-#include "st_extensions.h"
-
-
-static int _min(int a, int b)
-{
-   return (a < b) ? a : b;
-}
-
-static float _maxf(float a, float b)
-{
-   return (a > b) ? a : b;
-}
-
-static int _clamp(int a, int min, int max)
-{
-   if (a < min)
-      return min;
-   else if (a > max)
-      return max;
-   else
-      return a;
-}
-
-
-/**
- * Query driver to get implementation limits.
- * Note that we have to limit/clamp against Mesa's internal limits too.
- */
-void st_init_limits(struct st_context *st)
-{
-   struct pipe_screen *screen = st->pipe->screen;
-   struct gl_constants *c = &st->ctx->Const;
-   gl_shader_type sh;
-
-   c->MaxTextureLevels
-      = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS),
-            MAX_TEXTURE_LEVELS);
-
-   c->Max3DTextureLevels
-      = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_3D_LEVELS),
-            MAX_3D_TEXTURE_LEVELS);
-
-   c->MaxCubeTextureLevels
-      = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS),
-            MAX_CUBE_TEXTURE_LEVELS);
-
-   c->MaxTextureRectSize
-      = _min(1 << (c->MaxTextureLevels - 1), MAX_TEXTURE_RECT_SIZE);
-
-   c->MaxTextureImageUnits
-      = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS),
-            MAX_TEXTURE_IMAGE_UNITS);
-
-   c->MaxVertexTextureImageUnits
-      = _min(screen->get_param(screen, PIPE_CAP_MAX_VERTEX_TEXTURE_UNITS),
-             MAX_VERTEX_TEXTURE_IMAGE_UNITS);
-
-   c->MaxCombinedTextureImageUnits
-      = _min(screen->get_param(screen, PIPE_CAP_MAX_COMBINED_SAMPLERS),
-             MAX_COMBINED_TEXTURE_IMAGE_UNITS);
-
-   c->MaxTextureCoordUnits
-      = _min(c->MaxTextureImageUnits, MAX_TEXTURE_COORD_UNITS);
-
-   c->MaxTextureUnits = _min(c->MaxTextureImageUnits, c->MaxTextureCoordUnits);
-
-   c->MaxDrawBuffers
-      = _clamp(screen->get_param(screen, PIPE_CAP_MAX_RENDER_TARGETS),
-              1, MAX_DRAW_BUFFERS);
-
-   c->MaxLineWidth
-      = _maxf(1.0f, screen->get_paramf(screen, PIPE_CAP_MAX_LINE_WIDTH));
-   c->MaxLineWidthAA
-      = _maxf(1.0f, screen->get_paramf(screen, PIPE_CAP_MAX_LINE_WIDTH_AA));
-
-   c->MaxPointSize
-      = _maxf(1.0f, screen->get_paramf(screen, PIPE_CAP_MAX_POINT_WIDTH));
-   c->MaxPointSizeAA
-      = _maxf(1.0f, screen->get_paramf(screen, PIPE_CAP_MAX_POINT_WIDTH_AA));
-   /* called after _mesa_create_context/_mesa_init_point, fix default user
-    * settable max point size up
-    */
-   st->ctx->Point.MaxSize = MAX2(c->MaxPointSize, c->MaxPointSizeAA);
-   /* these are not queryable. Note that GL basically mandates a 1.0 minimum
-    * for non-aa sizes, but we can go down to 0.0 for aa points.
-    */
-   c->MinPointSize = 1.0f;
-   c->MinPointSizeAA = 0.0f;
-
-   c->MaxTextureMaxAnisotropy
-      = _maxf(2.0f, screen->get_paramf(screen, PIPE_CAP_MAX_TEXTURE_ANISOTROPY));
-
-   c->MaxTextureLodBias
-      = screen->get_paramf(screen, PIPE_CAP_MAX_TEXTURE_LOD_BIAS);
-
-   c->MaxDrawBuffers
-      = CLAMP(screen->get_param(screen, PIPE_CAP_MAX_RENDER_TARGETS),
-              1, MAX_DRAW_BUFFERS);
-
-   /* Quads always follow GL provoking rules. */
-   c->QuadsFollowProvokingVertexConvention = GL_FALSE;
-
-   for (sh = 0; sh < MESA_SHADER_TYPES; ++sh) {
-      struct gl_shader_compiler_options *options =
-         &st->ctx->ShaderCompilerOptions[sh];
-      struct gl_program_constants *pc;
-
-      switch (sh) {
-      case PIPE_SHADER_FRAGMENT:
-         pc = &c->FragmentProgram;
-         break;
-      case PIPE_SHADER_VERTEX:
-         pc = &c->VertexProgram;
-         break;
-      case PIPE_SHADER_GEOMETRY:
-         pc = &c->GeometryProgram;
-         break;
-      default:
-         assert(0);
-         continue;
-      }
-
-      pc->MaxNativeInstructions    = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_INSTRUCTIONS);
-      pc->MaxNativeAluInstructions = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS);
-      pc->MaxNativeTexInstructions = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS);
-      pc->MaxNativeTexIndirections = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS);
-      pc->MaxNativeAttribs         = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_INPUTS);
-      pc->MaxNativeTemps           = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_TEMPS);
-      pc->MaxNativeAddressRegs     = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_ADDRS);
-      pc->MaxNativeParameters      = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_CONSTS);
-      pc->MaxUniformComponents     = 4 * MIN2(pc->MaxNativeParameters, MAX_UNIFORMS);
-
-      options->EmitNoNoise = TRUE;
-
-      /* TODO: make these more fine-grained if anyone needs it */
-      options->EmitNoIfs = !screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH);
-      options->EmitNoLoops = !screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH);
-      options->EmitNoFunctions = !screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_SUBROUTINES);
-      options->EmitNoMainReturn = !screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_SUBROUTINES);
-
-      options->EmitNoCont = !screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED);
-
-      options->EmitNoIndirectInput = !screen->get_shader_param(screen, sh,
-                                        PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR);
-      options->EmitNoIndirectOutput = !screen->get_shader_param(screen, sh,
-                                        PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR);
-      options->EmitNoIndirectTemp = !screen->get_shader_param(screen, sh,
-                                        PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR);
-      options->EmitNoIndirectUniform = !screen->get_shader_param(screen, sh,
-                                        PIPE_SHADER_CAP_INDIRECT_CONST_ADDR);
-
-      if(options->EmitNoLoops)
-         options->MaxUnrollIterations = MIN2(screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_INSTRUCTIONS), 65536);
-   }
-
-   /* PIPE_CAP_MAX_FS_INPUTS specifies the number of COLORn + GENERICn inputs
-    * and is set in MaxNativeAttribs. It's always 2 colors + N generic
-    * attributes. The GLSL compiler never uses COLORn for varyings, so we
-    * subtract the 2 colors to get the maximum number of varyings (generic
-    * attributes) supported by a driver. */
-   c->MaxVarying = screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT, PIPE_SHADER_CAP_MAX_INPUTS) - 2;
-   c->MaxVarying = MIN2(c->MaxVarying, MAX_VARYING);
-
-   /* XXX we'll need a better query here someday */
-   if (screen->get_param(screen, PIPE_CAP_GLSL)) {
-      c->GLSLVersion = 120;
-   }
-}
-
-
-/**
- * Use pipe_screen::get_param() to query PIPE_CAP_ values to determine
- * which GL extensions are supported.
- * Quite a few extensions are always supported because they are standard
- * features or can be built on top of other gallium features.
- * Some fine tuning may still be needed.
- */
-void st_init_extensions(struct st_context *st)
-{
-   struct pipe_screen *screen = st->pipe->screen;
-   struct gl_context *ctx = st->ctx;
-
-   /*
-    * Extensions that are supported by all Gallium drivers:
-    */
-   ctx->Extensions.ARB_copy_buffer = GL_TRUE;
-   ctx->Extensions.ARB_draw_elements_base_vertex = GL_TRUE;
-   ctx->Extensions.ARB_fragment_coord_conventions = GL_TRUE;
-   ctx->Extensions.ARB_fragment_program = GL_TRUE;
-   ctx->Extensions.ARB_half_float_pixel = GL_TRUE;
-   ctx->Extensions.ARB_map_buffer_range = GL_TRUE;
-   ctx->Extensions.ARB_multisample = GL_TRUE;
-   ctx->Extensions.ARB_texture_border_clamp = GL_TRUE; /* XXX temp */
-   ctx->Extensions.ARB_texture_compression = GL_TRUE;
-   ctx->Extensions.ARB_texture_cube_map = GL_TRUE;
-   ctx->Extensions.ARB_texture_env_combine = GL_TRUE;
-   ctx->Extensions.ARB_texture_env_crossbar = GL_TRUE;
-   ctx->Extensions.ARB_texture_env_dot3 = GL_TRUE;
-   ctx->Extensions.ARB_vertex_array_object = GL_TRUE;
-   ctx->Extensions.ARB_vertex_buffer_object = GL_TRUE;
-   ctx->Extensions.ARB_vertex_program = GL_TRUE;
-   ctx->Extensions.ARB_window_pos = GL_TRUE;
-
-   ctx->Extensions.EXT_blend_color = GL_TRUE;
-   ctx->Extensions.EXT_blend_func_separate = GL_TRUE;
-   ctx->Extensions.EXT_blend_logic_op = GL_TRUE;
-   ctx->Extensions.EXT_blend_minmax = GL_TRUE;
-   ctx->Extensions.EXT_blend_subtract = GL_TRUE;
-   ctx->Extensions.EXT_framebuffer_blit = GL_TRUE;
-   ctx->Extensions.EXT_framebuffer_object = GL_TRUE;
-   ctx->Extensions.EXT_framebuffer_multisample = GL_TRUE;
-   ctx->Extensions.EXT_fog_coord = GL_TRUE;
-   ctx->Extensions.EXT_gpu_program_parameters = GL_TRUE;
-   ctx->Extensions.EXT_multi_draw_arrays = GL_TRUE;
-   ctx->Extensions.EXT_pixel_buffer_object = GL_TRUE;
-   ctx->Extensions.EXT_point_parameters = GL_TRUE;
-   ctx->Extensions.EXT_provoking_vertex = GL_TRUE;
-   ctx->Extensions.EXT_secondary_color = GL_TRUE;
-   ctx->Extensions.EXT_stencil_wrap = GL_TRUE;
-   ctx->Extensions.EXT_texture_env_add = GL_TRUE;
-   ctx->Extensions.EXT_texture_env_combine = GL_TRUE;
-   ctx->Extensions.EXT_texture_env_dot3 = GL_TRUE;
-   ctx->Extensions.EXT_texture_lod_bias = GL_TRUE;
-   ctx->Extensions.EXT_vertex_array_bgra = GL_TRUE;
-   if (ctx->API == API_OPENGLES || ctx->API == API_OPENGLES2)
-	   ctx->Extensions.EXT_texture_format_BGRA8888 = GL_TRUE;
-
-   ctx->Extensions.APPLE_vertex_array_object = GL_TRUE;
-
-   ctx->Extensions.ATI_texture_env_combine3 = GL_TRUE;
-
-   ctx->Extensions.MESA_pack_invert = GL_TRUE;
-
-   ctx->Extensions.NV_blend_square = GL_TRUE;
-   ctx->Extensions.NV_texgen_reflection = GL_TRUE;
-   ctx->Extensions.NV_texture_env_combine4 = GL_TRUE;
-   ctx->Extensions.NV_texture_rectangle = GL_TRUE;
-#if 0
-   /* possibly could support the following two */
-   ctx->Extensions.NV_vertex_program = GL_TRUE;
-   ctx->Extensions.NV_vertex_program1_1 = GL_TRUE;
-#endif
-
-#if FEATURE_OES_EGL_image
-   ctx->Extensions.OES_EGL_image = GL_TRUE;
-#endif
-#if FEATURE_OES_draw_texture
-   ctx->Extensions.OES_draw_texture = GL_TRUE;
-#endif
-
-   ctx->Extensions.SGIS_generate_mipmap = GL_TRUE;
-
-   /*
-    * Extensions that depend on the driver/hardware:
-    */
-   if (screen->get_param(screen, PIPE_CAP_MAX_RENDER_TARGETS) > 0) {
-      ctx->Extensions.ARB_draw_buffers = GL_TRUE;
-   }
-
-   if (screen->get_param(screen, PIPE_CAP_TEXTURE_SWIZZLE) > 0) {
-      ctx->Extensions.EXT_texture_swizzle = GL_TRUE;
-   }
-
-   if (screen->get_param(screen, PIPE_CAP_GLSL)) {
-      ctx->Extensions.ARB_fragment_shader = GL_TRUE;
-      ctx->Extensions.ARB_vertex_shader = GL_TRUE;
-      ctx->Extensions.ARB_shader_objects = GL_TRUE;
-      ctx->Extensions.ARB_shading_language_100 = GL_TRUE;
-      ctx->Extensions.ARB_explicit_attrib_location = GL_TRUE;
-      ctx->Extensions.EXT_separate_shader_objects = GL_TRUE;
-   }
-
-   if (screen->get_param(screen, PIPE_CAP_TEXTURE_MIRROR_REPEAT) > 0) {
-      ctx->Extensions.ARB_texture_mirrored_repeat = GL_TRUE;
-   }
-
-   if (screen->get_param(screen, PIPE_CAP_BLEND_EQUATION_SEPARATE)) {
-      ctx->Extensions.EXT_blend_equation_separate = GL_TRUE;
-   }
-
-   if (screen->get_param(screen, PIPE_CAP_TEXTURE_MIRROR_CLAMP) > 0) {
-      ctx->Extensions.EXT_texture_mirror_clamp = GL_TRUE;
-      ctx->Extensions.ATI_texture_mirror_once = GL_TRUE;
-   }
-
-   if (screen->get_param(screen, PIPE_CAP_NPOT_TEXTURES)) {
-      ctx->Extensions.ARB_texture_non_power_of_two = GL_TRUE;
-   }
-
-   if (screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS) > 1) {
-      ctx->Extensions.ARB_multitexture = GL_TRUE;
-   }
-
-   if (screen->get_param(screen, PIPE_CAP_TWO_SIDED_STENCIL)) {
-      ctx->Extensions.ATI_separate_stencil = GL_TRUE;
-      ctx->Extensions.EXT_stencil_two_side = GL_TRUE;
-   }
-
-   if (screen->get_param(screen, PIPE_CAP_ANISOTROPIC_FILTER)) {
-      ctx->Extensions.EXT_texture_filter_anisotropic = GL_TRUE;
-   }
-
-   if (screen->get_param(screen, PIPE_CAP_POINT_SPRITE)) {
-      ctx->Extensions.ARB_point_sprite = GL_TRUE;
-      /* GL_NV_point_sprite is not supported by gallium because we don't
-       * support the GL_POINT_SPRITE_R_MODE_NV option.
-       */
-   }
-
-   if (screen->get_param(screen, PIPE_CAP_OCCLUSION_QUERY)) {
-      ctx->Extensions.ARB_occlusion_query = GL_TRUE;
-      ctx->Extensions.ARB_occlusion_query2 = GL_TRUE;
-   }
-   if (screen->get_param(screen, PIPE_CAP_TIMER_QUERY)) {
-     ctx->Extensions.EXT_timer_query = GL_TRUE;
-   }
-
-   if (screen->get_param(screen, PIPE_CAP_TEXTURE_SHADOW_MAP)) {
-      ctx->Extensions.ARB_depth_texture = GL_TRUE;
-      ctx->Extensions.ARB_fragment_program_shadow = GL_TRUE;
-      ctx->Extensions.ARB_shadow = GL_TRUE;
-      ctx->Extensions.EXT_shadow_funcs = GL_TRUE;
-      /*ctx->Extensions.ARB_shadow_ambient = GL_TRUE;*/
-   }
-
-   /* GL_EXT_packed_depth_stencil requires both the ability to render to
-    * a depth/stencil buffer and texture from depth/stencil source.
-    */
-   if (screen->is_format_supported(screen, PIPE_FORMAT_S8_USCALED_Z24_UNORM,
-                                   PIPE_TEXTURE_2D, 0,
-                                   PIPE_BIND_DEPTH_STENCIL) &&
-       screen->is_format_supported(screen, PIPE_FORMAT_S8_USCALED_Z24_UNORM,
-                                   PIPE_TEXTURE_2D, 0,
-                                   PIPE_BIND_SAMPLER_VIEW)) {
-      ctx->Extensions.EXT_packed_depth_stencil = GL_TRUE;
-   }
-   else if (screen->is_format_supported(screen, PIPE_FORMAT_Z24_UNORM_S8_USCALED,
-                                        PIPE_TEXTURE_2D, 0,
-                                        PIPE_BIND_DEPTH_STENCIL) &&
-            screen->is_format_supported(screen, PIPE_FORMAT_Z24_UNORM_S8_USCALED,
-                                        PIPE_TEXTURE_2D, 0,
-                                        PIPE_BIND_SAMPLER_VIEW)) {
-      ctx->Extensions.EXT_packed_depth_stencil = GL_TRUE;
-   }
-
-   /* sRGB support */
-   if (screen->is_format_supported(screen, PIPE_FORMAT_A8B8G8R8_SRGB,
-                                   PIPE_TEXTURE_2D, 0,
-                                   PIPE_BIND_SAMPLER_VIEW) ||
-      screen->is_format_supported(screen, PIPE_FORMAT_B8G8R8A8_SRGB,
-                                   PIPE_TEXTURE_2D, 0,
-                                   PIPE_BIND_SAMPLER_VIEW)) {
-      ctx->Extensions.EXT_texture_sRGB = GL_TRUE;
-      ctx->Extensions.EXT_texture_sRGB_decode = GL_TRUE;
-      if (screen->is_format_supported(screen, PIPE_FORMAT_A8B8G8R8_SRGB,
-                                   PIPE_TEXTURE_2D, 0,
-                                   PIPE_BIND_RENDER_TARGET) ||
-          screen->is_format_supported(screen, PIPE_FORMAT_B8G8R8A8_SRGB,
-                                   PIPE_TEXTURE_2D, 0,
-                                   PIPE_BIND_RENDER_TARGET)) {
-         ctx->Extensions.EXT_framebuffer_sRGB = GL_TRUE;
-         ctx->Const.sRGBCapable = GL_TRUE;
-      }
-   }
-
-   if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8_UNORM,
-                                   PIPE_TEXTURE_2D, 0,
-                                   PIPE_BIND_SAMPLER_VIEW)) {
-      ctx->Extensions.ARB_texture_rg = GL_TRUE;
-   }
-
-   /* s3tc support */
-   if (screen->is_format_supported(screen, PIPE_FORMAT_DXT5_RGBA,
-                                   PIPE_TEXTURE_2D, 0,
-                                   PIPE_BIND_SAMPLER_VIEW) &&
-       ctx->Mesa_DXTn) {
-      ctx->Extensions.EXT_texture_compression_s3tc = GL_TRUE;
-      ctx->Extensions.S3_s3tc = GL_TRUE;
-   }
-
-   if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC1_UNORM,
-                                   PIPE_TEXTURE_2D, 0,
-                                   PIPE_BIND_SAMPLER_VIEW) &&
-       screen->is_format_supported(screen, PIPE_FORMAT_RGTC1_SNORM,
-				   PIPE_TEXTURE_2D, 0,
-                                   PIPE_BIND_SAMPLER_VIEW) &&
-       screen->is_format_supported(screen, PIPE_FORMAT_RGTC2_UNORM,
-                                   PIPE_TEXTURE_2D, 0,
-                                   PIPE_BIND_SAMPLER_VIEW) &&
-       screen->is_format_supported(screen, PIPE_FORMAT_RGTC2_SNORM,
-                                   PIPE_TEXTURE_2D, 0,
-                                   PIPE_BIND_SAMPLER_VIEW)
-       ) {
-     ctx->Extensions.ARB_texture_compression_rgtc = GL_TRUE;
-   }
-
-   if (screen->is_format_supported(screen, PIPE_FORMAT_LATC1_UNORM,
-                                   PIPE_TEXTURE_2D, 0,
-                                   PIPE_BIND_SAMPLER_VIEW) &&
-       screen->is_format_supported(screen, PIPE_FORMAT_LATC1_SNORM,
-                                   PIPE_TEXTURE_2D, 0,
-                                   PIPE_BIND_SAMPLER_VIEW) &&
-       screen->is_format_supported(screen, PIPE_FORMAT_LATC2_UNORM,
-                                   PIPE_TEXTURE_2D, 0,
-                                   PIPE_BIND_SAMPLER_VIEW) &&
-       screen->is_format_supported(screen, PIPE_FORMAT_LATC2_SNORM,
-                                   PIPE_TEXTURE_2D, 0,
-                                   PIPE_BIND_SAMPLER_VIEW)) {
-      ctx->Extensions.EXT_texture_compression_latc = GL_TRUE;
-   }
-
-   if (screen->is_format_supported(screen, PIPE_FORMAT_LATC2_UNORM,
-                                   PIPE_TEXTURE_2D, 0,
-                                   PIPE_BIND_SAMPLER_VIEW)) {
-      ctx->Extensions.ATI_texture_compression_3dc = GL_TRUE;
-   }
-
-   /* ycbcr support */
-   if (screen->is_format_supported(screen, PIPE_FORMAT_UYVY, 
-                                   PIPE_TEXTURE_2D, 0,
-                                   PIPE_BIND_SAMPLER_VIEW) ||
-       screen->is_format_supported(screen, PIPE_FORMAT_YUYV, 
-                                   PIPE_TEXTURE_2D, 0,
-                                   PIPE_BIND_SAMPLER_VIEW)) {
-      ctx->Extensions.MESA_ycbcr_texture = GL_TRUE;
-   }
-
-   /* GL_EXT_texture_array */
-   if (screen->get_param(screen, PIPE_CAP_ARRAY_TEXTURES)) {
-      ctx->Extensions.EXT_texture_array = GL_TRUE;
-      ctx->Extensions.MESA_texture_array = GL_TRUE;
-   }
-
-   /* GL_ARB_framebuffer_object */
-   if (ctx->Extensions.EXT_packed_depth_stencil) {
-      /* we support always support GL_EXT_framebuffer_blit */
-      ctx->Extensions.ARB_framebuffer_object = GL_TRUE;
-   }
-
-   if (st->pipe->render_condition) {
-      ctx->Extensions.NV_conditional_render = GL_TRUE;
-   }
-
-   if (screen->get_param(screen, PIPE_CAP_INDEP_BLEND_ENABLE)) {
-      ctx->Extensions.EXT_draw_buffers2 = GL_TRUE;
-   }
-
-   if (screen->get_param(screen, PIPE_CAP_INDEP_BLEND_FUNC)) {
-      ctx->Extensions.ARB_draw_buffers_blend = GL_TRUE;
-   }
-
-   /* GL_ARB_half_float_vertex */
-   if (screen->is_format_supported(screen, PIPE_FORMAT_R16G16B16A16_FLOAT,
-                                   PIPE_BUFFER, 0,
-                                   PIPE_BIND_VERTEX_BUFFER)) {
-      ctx->Extensions.ARB_half_float_vertex = GL_TRUE;
-   }
-
-   if (screen->get_shader_param(screen, PIPE_SHADER_GEOMETRY, PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0) {
-#if 0 /* XXX re-enable when GLSL compiler again supports geometry shaders */
-      ctx->Extensions.ARB_geometry_shader4 = GL_TRUE;
-#endif
-   }
-
-   if (screen->get_param(screen, PIPE_CAP_PRIMITIVE_RESTART)) {
-      ctx->Extensions.NV_primitive_restart = GL_TRUE;
-   }
-
-   if (screen->get_param(screen, PIPE_CAP_DEPTH_CLAMP)) {
-      ctx->Extensions.ARB_depth_clamp = GL_TRUE;
-   }
-
-   if (screen->get_param(screen, PIPE_CAP_SHADER_STENCIL_EXPORT)) {
-      ctx->Extensions.ARB_shader_stencil_export = GL_TRUE;
-   }
-
-   if (screen->get_param(screen, PIPE_CAP_TGSI_INSTANCEID)) {
-      ctx->Extensions.ARB_draw_instanced = GL_TRUE;
-   }
-   if (screen->get_param(screen, PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR)) {
-      ctx->Extensions.ARB_instanced_arrays = GL_TRUE;
-   }
-
-   if (screen->fence_finish) {
-      ctx->Extensions.ARB_sync = GL_TRUE;
-   }
-
-   if (st->pipe->texture_barrier) {
-      ctx->Extensions.NV_texture_barrier = GL_TRUE;
-   }
-}
+/**************************************************************************
+ * 
+ * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * Copyright (c) 2008 VMware, Inc.
+ * 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"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ * 
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * 
+ **************************************************************************/
+
+#include "main/imports.h"
+#include "main/context.h"
+#include "main/macros.h"
+#include "main/mfeatures.h"
+
+#include "pipe/p_context.h"
+#include "pipe/p_defines.h"
+#include "pipe/p_screen.h"
+
+#include "st_context.h"
+#include "st_extensions.h"
+
+
+static int _min(int a, int b)
+{
+   return (a < b) ? a : b;
+}
+
+static float _maxf(float a, float b)
+{
+   return (a > b) ? a : b;
+}
+
+static int _clamp(int a, int min, int max)
+{
+   if (a < min)
+      return min;
+   else if (a > max)
+      return max;
+   else
+      return a;
+}
+
+
+/**
+ * Query driver to get implementation limits.
+ * Note that we have to limit/clamp against Mesa's internal limits too.
+ */
+void st_init_limits(struct st_context *st)
+{
+   struct pipe_screen *screen = st->pipe->screen;
+   struct gl_constants *c = &st->ctx->Const;
+   gl_shader_type sh;
+
+   c->MaxTextureLevels
+      = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_2D_LEVELS),
+            MAX_TEXTURE_LEVELS);
+
+   c->Max3DTextureLevels
+      = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_3D_LEVELS),
+            MAX_3D_TEXTURE_LEVELS);
+
+   c->MaxCubeTextureLevels
+      = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_CUBE_LEVELS),
+            MAX_CUBE_TEXTURE_LEVELS);
+
+   c->MaxTextureRectSize
+      = _min(1 << (c->MaxTextureLevels - 1), MAX_TEXTURE_RECT_SIZE);
+
+   c->MaxTextureImageUnits
+      = _min(screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS),
+            MAX_TEXTURE_IMAGE_UNITS);
+
+   c->MaxVertexTextureImageUnits
+      = _min(screen->get_param(screen, PIPE_CAP_MAX_VERTEX_TEXTURE_UNITS),
+             MAX_VERTEX_TEXTURE_IMAGE_UNITS);
+
+   c->MaxCombinedTextureImageUnits
+      = _min(screen->get_param(screen, PIPE_CAP_MAX_COMBINED_SAMPLERS),
+             MAX_COMBINED_TEXTURE_IMAGE_UNITS);
+
+   c->MaxTextureCoordUnits
+      = _min(c->MaxTextureImageUnits, MAX_TEXTURE_COORD_UNITS);
+
+   c->MaxTextureUnits = _min(c->MaxTextureImageUnits, c->MaxTextureCoordUnits);
+
+   c->MaxDrawBuffers
+      = _clamp(screen->get_param(screen, PIPE_CAP_MAX_RENDER_TARGETS),
+              1, MAX_DRAW_BUFFERS);
+
+   c->MaxLineWidth
+      = _maxf(1.0f, screen->get_paramf(screen, PIPE_CAP_MAX_LINE_WIDTH));
+   c->MaxLineWidthAA
+      = _maxf(1.0f, screen->get_paramf(screen, PIPE_CAP_MAX_LINE_WIDTH_AA));
+
+   c->MaxPointSize
+      = _maxf(1.0f, screen->get_paramf(screen, PIPE_CAP_MAX_POINT_WIDTH));
+   c->MaxPointSizeAA
+      = _maxf(1.0f, screen->get_paramf(screen, PIPE_CAP_MAX_POINT_WIDTH_AA));
+   /* called after _mesa_create_context/_mesa_init_point, fix default user
+    * settable max point size up
+    */
+   st->ctx->Point.MaxSize = MAX2(c->MaxPointSize, c->MaxPointSizeAA);
+   /* these are not queryable. Note that GL basically mandates a 1.0 minimum
+    * for non-aa sizes, but we can go down to 0.0 for aa points.
+    */
+   c->MinPointSize = 1.0f;
+   c->MinPointSizeAA = 0.0f;
+
+   c->MaxTextureMaxAnisotropy
+      = _maxf(2.0f, screen->get_paramf(screen, PIPE_CAP_MAX_TEXTURE_ANISOTROPY));
+
+   c->MaxTextureLodBias
+      = screen->get_paramf(screen, PIPE_CAP_MAX_TEXTURE_LOD_BIAS);
+
+   c->MaxDrawBuffers
+      = CLAMP(screen->get_param(screen, PIPE_CAP_MAX_RENDER_TARGETS),
+              1, MAX_DRAW_BUFFERS);
+
+   /* Quads always follow GL provoking rules. */
+   c->QuadsFollowProvokingVertexConvention = GL_FALSE;
+
+   for (sh = 0; sh < MESA_SHADER_TYPES; ++sh) {
+      struct gl_shader_compiler_options *options =
+         &st->ctx->ShaderCompilerOptions[sh];
+      struct gl_program_constants *pc;
+
+      switch (sh) {
+      case PIPE_SHADER_FRAGMENT:
+         pc = &c->FragmentProgram;
+         break;
+      case PIPE_SHADER_VERTEX:
+         pc = &c->VertexProgram;
+         break;
+      case PIPE_SHADER_GEOMETRY:
+         pc = &c->GeometryProgram;
+         break;
+      default:
+         assert(0);
+         continue;
+      }
+
+      pc->MaxNativeInstructions    = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_INSTRUCTIONS);
+      pc->MaxNativeAluInstructions = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_ALU_INSTRUCTIONS);
+      pc->MaxNativeTexInstructions = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_TEX_INSTRUCTIONS);
+      pc->MaxNativeTexIndirections = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_TEX_INDIRECTIONS);
+      pc->MaxNativeAttribs         = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_INPUTS);
+      pc->MaxNativeTemps           = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_TEMPS);
+      pc->MaxNativeAddressRegs     = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_ADDRS);
+      pc->MaxNativeParameters      = screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_CONSTS);
+      pc->MaxUniformComponents     = 4 * MIN2(pc->MaxNativeParameters, MAX_UNIFORMS);
+
+      options->EmitNoNoise = TRUE;
+
+      /* TODO: make these more fine-grained if anyone needs it */
+      options->EmitNoIfs = !screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH);
+      options->EmitNoLoops = !screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_CONTROL_FLOW_DEPTH);
+      options->EmitNoFunctions = !screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_SUBROUTINES);
+      options->EmitNoMainReturn = !screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_SUBROUTINES);
+
+      options->EmitNoCont = !screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_TGSI_CONT_SUPPORTED);
+
+      options->EmitNoIndirectInput = !screen->get_shader_param(screen, sh,
+                                        PIPE_SHADER_CAP_INDIRECT_INPUT_ADDR);
+      options->EmitNoIndirectOutput = !screen->get_shader_param(screen, sh,
+                                        PIPE_SHADER_CAP_INDIRECT_OUTPUT_ADDR);
+      options->EmitNoIndirectTemp = !screen->get_shader_param(screen, sh,
+                                        PIPE_SHADER_CAP_INDIRECT_TEMP_ADDR);
+      options->EmitNoIndirectUniform = !screen->get_shader_param(screen, sh,
+                                        PIPE_SHADER_CAP_INDIRECT_CONST_ADDR);
+
+      if(options->EmitNoLoops)
+         options->MaxUnrollIterations = MIN2(screen->get_shader_param(screen, sh, PIPE_SHADER_CAP_MAX_INSTRUCTIONS), 65536);
+   }
+
+   /* PIPE_CAP_MAX_FS_INPUTS specifies the number of COLORn + GENERICn inputs
+    * and is set in MaxNativeAttribs. It's always 2 colors + N generic
+    * attributes. The GLSL compiler never uses COLORn for varyings, so we
+    * subtract the 2 colors to get the maximum number of varyings (generic
+    * attributes) supported by a driver. */
+   c->MaxVarying = screen->get_shader_param(screen, PIPE_SHADER_FRAGMENT, PIPE_SHADER_CAP_MAX_INPUTS) - 2;
+   c->MaxVarying = MIN2(c->MaxVarying, MAX_VARYING);
+
+   /* XXX we'll need a better query here someday */
+   if (screen->get_param(screen, PIPE_CAP_GLSL)) {
+      c->GLSLVersion = 120;
+   }
+}
+
+
+/**
+ * Use pipe_screen::get_param() to query PIPE_CAP_ values to determine
+ * which GL extensions are supported.
+ * Quite a few extensions are always supported because they are standard
+ * features or can be built on top of other gallium features.
+ * Some fine tuning may still be needed.
+ */
+void st_init_extensions(struct st_context *st)
+{
+   struct pipe_screen *screen = st->pipe->screen;
+   struct gl_context *ctx = st->ctx;
+
+   /*
+    * Extensions that are supported by all Gallium drivers:
+    */
+   ctx->Extensions.ARB_copy_buffer = GL_TRUE;
+   ctx->Extensions.ARB_draw_elements_base_vertex = GL_TRUE;
+   ctx->Extensions.ARB_fragment_coord_conventions = GL_TRUE;
+   ctx->Extensions.ARB_fragment_program = GL_TRUE;
+   ctx->Extensions.ARB_half_float_pixel = GL_TRUE;
+   ctx->Extensions.ARB_map_buffer_range = GL_TRUE;
+   ctx->Extensions.ARB_multisample = GL_TRUE;
+   ctx->Extensions.ARB_texture_border_clamp = GL_TRUE; /* XXX temp */
+   ctx->Extensions.ARB_texture_compression = GL_TRUE;
+   ctx->Extensions.ARB_texture_cube_map = GL_TRUE;
+   ctx->Extensions.ARB_texture_env_combine = GL_TRUE;
+   ctx->Extensions.ARB_texture_env_crossbar = GL_TRUE;
+   ctx->Extensions.ARB_texture_env_dot3 = GL_TRUE;
+   ctx->Extensions.ARB_vertex_array_object = GL_TRUE;
+   ctx->Extensions.ARB_vertex_buffer_object = GL_TRUE;
+   ctx->Extensions.ARB_vertex_program = GL_TRUE;
+   ctx->Extensions.ARB_window_pos = GL_TRUE;
+
+   ctx->Extensions.EXT_blend_color = GL_TRUE;
+   ctx->Extensions.EXT_blend_func_separate = GL_TRUE;
+   ctx->Extensions.EXT_blend_logic_op = GL_TRUE;
+   ctx->Extensions.EXT_blend_minmax = GL_TRUE;
+   ctx->Extensions.EXT_blend_subtract = GL_TRUE;
+   ctx->Extensions.EXT_framebuffer_blit = GL_TRUE;
+   ctx->Extensions.EXT_framebuffer_object = GL_TRUE;
+   ctx->Extensions.EXT_framebuffer_multisample = GL_TRUE;
+   ctx->Extensions.EXT_fog_coord = GL_TRUE;
+   ctx->Extensions.EXT_gpu_program_parameters = GL_TRUE;
+   ctx->Extensions.EXT_multi_draw_arrays = GL_TRUE;
+   ctx->Extensions.EXT_pixel_buffer_object = GL_TRUE;
+   ctx->Extensions.EXT_point_parameters = GL_TRUE;
+   ctx->Extensions.EXT_provoking_vertex = GL_TRUE;
+   ctx->Extensions.EXT_secondary_color = GL_TRUE;
+   ctx->Extensions.EXT_stencil_wrap = GL_TRUE;
+   ctx->Extensions.EXT_texture_env_add = GL_TRUE;
+   ctx->Extensions.EXT_texture_env_combine = GL_TRUE;
+   ctx->Extensions.EXT_texture_env_dot3 = GL_TRUE;
+   ctx->Extensions.EXT_texture_lod_bias = GL_TRUE;
+   ctx->Extensions.EXT_vertex_array_bgra = GL_TRUE;
+   if (ctx->API == API_OPENGLES || ctx->API == API_OPENGLES2)
+	   ctx->Extensions.EXT_texture_format_BGRA8888 = GL_TRUE;
+
+   ctx->Extensions.APPLE_vertex_array_object = GL_TRUE;
+
+   ctx->Extensions.ATI_texture_env_combine3 = GL_TRUE;
+
+   ctx->Extensions.MESA_pack_invert = GL_TRUE;
+
+   ctx->Extensions.NV_blend_square = GL_TRUE;
+   ctx->Extensions.NV_texgen_reflection = GL_TRUE;
+   ctx->Extensions.NV_texture_env_combine4 = GL_TRUE;
+   ctx->Extensions.NV_texture_rectangle = GL_TRUE;
+#if 0
+   /* possibly could support the following two */
+   ctx->Extensions.NV_vertex_program = GL_TRUE;
+   ctx->Extensions.NV_vertex_program1_1 = GL_TRUE;
+#endif
+
+#if FEATURE_OES_EGL_image
+   ctx->Extensions.OES_EGL_image = GL_TRUE;
+#endif
+#if FEATURE_OES_draw_texture
+   ctx->Extensions.OES_draw_texture = GL_TRUE;
+#endif
+
+   ctx->Extensions.SGIS_generate_mipmap = GL_TRUE;
+
+   /*
+    * Extensions that depend on the driver/hardware:
+    */
+   if (screen->get_param(screen, PIPE_CAP_MAX_RENDER_TARGETS) > 0) {
+      ctx->Extensions.ARB_draw_buffers = GL_TRUE;
+   }
+
+   if (screen->get_param(screen, PIPE_CAP_TEXTURE_SWIZZLE) > 0) {
+      ctx->Extensions.EXT_texture_swizzle = GL_TRUE;
+   }
+
+   if (screen->get_param(screen, PIPE_CAP_GLSL)) {
+      ctx->Extensions.ARB_fragment_shader = GL_TRUE;
+      ctx->Extensions.ARB_vertex_shader = GL_TRUE;
+      ctx->Extensions.ARB_shader_objects = GL_TRUE;
+      ctx->Extensions.ARB_shading_language_100 = GL_TRUE;
+      ctx->Extensions.ARB_explicit_attrib_location = GL_TRUE;
+      ctx->Extensions.EXT_separate_shader_objects = GL_TRUE;
+   }
+
+   if (screen->get_param(screen, PIPE_CAP_TEXTURE_MIRROR_REPEAT) > 0) {
+      ctx->Extensions.ARB_texture_mirrored_repeat = GL_TRUE;
+   }
+
+   if (screen->get_param(screen, PIPE_CAP_BLEND_EQUATION_SEPARATE)) {
+      ctx->Extensions.EXT_blend_equation_separate = GL_TRUE;
+   }
+
+   if (screen->get_param(screen, PIPE_CAP_TEXTURE_MIRROR_CLAMP) > 0) {
+      ctx->Extensions.EXT_texture_mirror_clamp = GL_TRUE;
+      ctx->Extensions.ATI_texture_mirror_once = GL_TRUE;
+   }
+
+   if (screen->get_param(screen, PIPE_CAP_NPOT_TEXTURES)) {
+      ctx->Extensions.ARB_texture_non_power_of_two = GL_TRUE;
+   }
+
+   if (screen->get_param(screen, PIPE_CAP_MAX_TEXTURE_IMAGE_UNITS) > 1) {
+      ctx->Extensions.ARB_multitexture = GL_TRUE;
+   }
+
+   if (screen->get_param(screen, PIPE_CAP_TWO_SIDED_STENCIL)) {
+      ctx->Extensions.ATI_separate_stencil = GL_TRUE;
+      ctx->Extensions.EXT_stencil_two_side = GL_TRUE;
+   }
+
+   if (screen->get_param(screen, PIPE_CAP_ANISOTROPIC_FILTER)) {
+      ctx->Extensions.EXT_texture_filter_anisotropic = GL_TRUE;
+   }
+
+   if (screen->get_param(screen, PIPE_CAP_POINT_SPRITE)) {
+      ctx->Extensions.ARB_point_sprite = GL_TRUE;
+      /* GL_NV_point_sprite is not supported by gallium because we don't
+       * support the GL_POINT_SPRITE_R_MODE_NV option.
+       */
+   }
+
+   if (screen->get_param(screen, PIPE_CAP_OCCLUSION_QUERY)) {
+      ctx->Extensions.ARB_occlusion_query = GL_TRUE;
+      ctx->Extensions.ARB_occlusion_query2 = GL_TRUE;
+   }
+   if (screen->get_param(screen, PIPE_CAP_TIMER_QUERY)) {
+     ctx->Extensions.EXT_timer_query = GL_TRUE;
+   }
+
+   if (screen->get_param(screen, PIPE_CAP_TEXTURE_SHADOW_MAP)) {
+      ctx->Extensions.ARB_depth_texture = GL_TRUE;
+      ctx->Extensions.ARB_fragment_program_shadow = GL_TRUE;
+      ctx->Extensions.ARB_shadow = GL_TRUE;
+      ctx->Extensions.EXT_shadow_funcs = GL_TRUE;
+      /*ctx->Extensions.ARB_shadow_ambient = GL_TRUE;*/
+   }
+
+   /* GL_EXT_packed_depth_stencil requires both the ability to render to
+    * a depth/stencil buffer and texture from depth/stencil source.
+    */
+   if (screen->is_format_supported(screen, PIPE_FORMAT_S8_USCALED_Z24_UNORM,
+                                   PIPE_TEXTURE_2D, 0,
+                                   PIPE_BIND_DEPTH_STENCIL) &&
+       screen->is_format_supported(screen, PIPE_FORMAT_S8_USCALED_Z24_UNORM,
+                                   PIPE_TEXTURE_2D, 0,
+                                   PIPE_BIND_SAMPLER_VIEW)) {
+      ctx->Extensions.EXT_packed_depth_stencil = GL_TRUE;
+   }
+   else if (screen->is_format_supported(screen, PIPE_FORMAT_Z24_UNORM_S8_USCALED,
+                                        PIPE_TEXTURE_2D, 0,
+                                        PIPE_BIND_DEPTH_STENCIL) &&
+            screen->is_format_supported(screen, PIPE_FORMAT_Z24_UNORM_S8_USCALED,
+                                        PIPE_TEXTURE_2D, 0,
+                                        PIPE_BIND_SAMPLER_VIEW)) {
+      ctx->Extensions.EXT_packed_depth_stencil = GL_TRUE;
+   }
+
+   /* sRGB support */
+   if (screen->is_format_supported(screen, PIPE_FORMAT_A8B8G8R8_SRGB,
+                                   PIPE_TEXTURE_2D, 0,
+                                   PIPE_BIND_SAMPLER_VIEW) ||
+      screen->is_format_supported(screen, PIPE_FORMAT_B8G8R8A8_SRGB,
+                                   PIPE_TEXTURE_2D, 0,
+                                   PIPE_BIND_SAMPLER_VIEW)) {
+      ctx->Extensions.EXT_texture_sRGB = GL_TRUE;
+      ctx->Extensions.EXT_texture_sRGB_decode = GL_TRUE;
+      if (screen->is_format_supported(screen, PIPE_FORMAT_A8B8G8R8_SRGB,
+                                   PIPE_TEXTURE_2D, 0,
+                                   PIPE_BIND_RENDER_TARGET) ||
+          screen->is_format_supported(screen, PIPE_FORMAT_B8G8R8A8_SRGB,
+                                   PIPE_TEXTURE_2D, 0,
+                                   PIPE_BIND_RENDER_TARGET)) {
+         ctx->Extensions.EXT_framebuffer_sRGB = GL_TRUE;
+         ctx->Const.sRGBCapable = GL_TRUE;
+      }
+   }
+
+   if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8_UNORM,
+                                   PIPE_TEXTURE_2D, 0,
+                                   PIPE_BIND_SAMPLER_VIEW)) {
+      ctx->Extensions.ARB_texture_rg = GL_TRUE;
+   }
+
+   /* s3tc support */
+   if (screen->is_format_supported(screen, PIPE_FORMAT_DXT5_RGBA,
+                                   PIPE_TEXTURE_2D, 0,
+                                   PIPE_BIND_SAMPLER_VIEW) &&
+       ctx->Mesa_DXTn) {
+      ctx->Extensions.EXT_texture_compression_s3tc = GL_TRUE;
+      ctx->Extensions.S3_s3tc = GL_TRUE;
+   }
+
+   if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC1_UNORM,
+                                   PIPE_TEXTURE_2D, 0,
+                                   PIPE_BIND_SAMPLER_VIEW) &&
+       screen->is_format_supported(screen, PIPE_FORMAT_RGTC1_SNORM,
+				   PIPE_TEXTURE_2D, 0,
+                                   PIPE_BIND_SAMPLER_VIEW) &&
+       screen->is_format_supported(screen, PIPE_FORMAT_RGTC2_UNORM,
+                                   PIPE_TEXTURE_2D, 0,
+                                   PIPE_BIND_SAMPLER_VIEW) &&
+       screen->is_format_supported(screen, PIPE_FORMAT_RGTC2_SNORM,
+                                   PIPE_TEXTURE_2D, 0,
+                                   PIPE_BIND_SAMPLER_VIEW)
+       ) {
+     ctx->Extensions.ARB_texture_compression_rgtc = GL_TRUE;
+   }
+
+   if (screen->is_format_supported(screen, PIPE_FORMAT_LATC1_UNORM,
+                                   PIPE_TEXTURE_2D, 0,
+                                   PIPE_BIND_SAMPLER_VIEW) &&
+       screen->is_format_supported(screen, PIPE_FORMAT_LATC1_SNORM,
+                                   PIPE_TEXTURE_2D, 0,
+                                   PIPE_BIND_SAMPLER_VIEW) &&
+       screen->is_format_supported(screen, PIPE_FORMAT_LATC2_UNORM,
+                                   PIPE_TEXTURE_2D, 0,
+                                   PIPE_BIND_SAMPLER_VIEW) &&
+       screen->is_format_supported(screen, PIPE_FORMAT_LATC2_SNORM,
+                                   PIPE_TEXTURE_2D, 0,
+                                   PIPE_BIND_SAMPLER_VIEW)) {
+      ctx->Extensions.EXT_texture_compression_latc = GL_TRUE;
+   }
+
+   if (screen->is_format_supported(screen, PIPE_FORMAT_LATC2_UNORM,
+                                   PIPE_TEXTURE_2D, 0,
+                                   PIPE_BIND_SAMPLER_VIEW)) {
+      ctx->Extensions.ATI_texture_compression_3dc = GL_TRUE;
+   }
+
+   if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8B8A8_SNORM,
+                                   PIPE_TEXTURE_2D, 0,
+                                   PIPE_BIND_SAMPLER_VIEW)) {
+      ctx->Extensions.EXT_texture_snorm = GL_TRUE;
+   }
+
+   /* ycbcr support */
+   if (screen->is_format_supported(screen, PIPE_FORMAT_UYVY, 
+                                   PIPE_TEXTURE_2D, 0,
+                                   PIPE_BIND_SAMPLER_VIEW) ||
+       screen->is_format_supported(screen, PIPE_FORMAT_YUYV, 
+                                   PIPE_TEXTURE_2D, 0,
+                                   PIPE_BIND_SAMPLER_VIEW)) {
+      ctx->Extensions.MESA_ycbcr_texture = GL_TRUE;
+   }
+
+   /* GL_EXT_texture_array */
+   if (screen->get_param(screen, PIPE_CAP_ARRAY_TEXTURES)) {
+      ctx->Extensions.EXT_texture_array = GL_TRUE;
+      ctx->Extensions.MESA_texture_array = GL_TRUE;
+   }
+
+   /* GL_ARB_framebuffer_object */
+   if (ctx->Extensions.EXT_packed_depth_stencil) {
+      /* we support always support GL_EXT_framebuffer_blit */
+      ctx->Extensions.ARB_framebuffer_object = GL_TRUE;
+   }
+
+   if (st->pipe->render_condition) {
+      ctx->Extensions.NV_conditional_render = GL_TRUE;
+   }
+
+   if (screen->get_param(screen, PIPE_CAP_INDEP_BLEND_ENABLE)) {
+      ctx->Extensions.EXT_draw_buffers2 = GL_TRUE;
+   }
+
+   if (screen->get_param(screen, PIPE_CAP_INDEP_BLEND_FUNC)) {
+      ctx->Extensions.ARB_draw_buffers_blend = GL_TRUE;
+   }
+
+   /* GL_ARB_half_float_vertex */
+   if (screen->is_format_supported(screen, PIPE_FORMAT_R16G16B16A16_FLOAT,
+                                   PIPE_BUFFER, 0,
+                                   PIPE_BIND_VERTEX_BUFFER)) {
+      ctx->Extensions.ARB_half_float_vertex = GL_TRUE;
+   }
+
+   if (screen->get_shader_param(screen, PIPE_SHADER_GEOMETRY, PIPE_SHADER_CAP_MAX_INSTRUCTIONS) > 0) {
+#if 0 /* XXX re-enable when GLSL compiler again supports geometry shaders */
+      ctx->Extensions.ARB_geometry_shader4 = GL_TRUE;
+#endif
+   }
+
+   if (screen->get_param(screen, PIPE_CAP_PRIMITIVE_RESTART)) {
+      ctx->Extensions.NV_primitive_restart = GL_TRUE;
+   }
+
+   if (screen->get_param(screen, PIPE_CAP_DEPTH_CLAMP)) {
+      ctx->Extensions.ARB_depth_clamp = GL_TRUE;
+   }
+
+   /* This extension does not actually require support of floating point
+    * render targets, just clamping controls.
+    * Advertise this extension if either fragment color clamping is supported
+    * or no render targets having color values outside of the range [0, 1]
+    * are supported, in which case the fragment color clamping has no effect
+    * on rendering.
+    */
+   if (screen->get_param(screen, PIPE_CAP_FRAGMENT_COLOR_CLAMP_CONTROL) ||
+       (!screen->is_format_supported(screen, PIPE_FORMAT_R8G8B8A8_SNORM,
+                                     PIPE_TEXTURE_2D, 0,
+                                     PIPE_BIND_RENDER_TARGET) &&
+        !screen->is_format_supported(screen, PIPE_FORMAT_R16G16B16A16_SNORM,
+                                             PIPE_TEXTURE_2D, 0,
+                                             PIPE_BIND_RENDER_TARGET) &&
+        !screen->is_format_supported(screen, PIPE_FORMAT_R16G16B16A16_FLOAT,
+                                     PIPE_TEXTURE_2D, 0,
+                                     PIPE_BIND_RENDER_TARGET) &&
+        !screen->is_format_supported(screen, PIPE_FORMAT_R32G32B32A32_FLOAT,
+                                     PIPE_TEXTURE_2D, 0,
+                                     PIPE_BIND_RENDER_TARGET) &&
+        !screen->is_format_supported(screen, PIPE_FORMAT_R11G11B10_FLOAT,
+                                     PIPE_TEXTURE_2D, 0,
+                                     PIPE_BIND_RENDER_TARGET) &&
+        !screen->is_format_supported(screen, PIPE_FORMAT_R9G9B9E5_FLOAT,
+                                     PIPE_TEXTURE_2D, 0,
+                                     PIPE_BIND_RENDER_TARGET))) {
+      ctx->Extensions.ARB_color_buffer_float = GL_TRUE;
+   }
+
+   if (screen->get_param(screen, PIPE_CAP_SHADER_STENCIL_EXPORT)) {
+      ctx->Extensions.ARB_shader_stencil_export = GL_TRUE;
+   }
+
+   if (screen->get_param(screen, PIPE_CAP_TGSI_INSTANCEID)) {
+      ctx->Extensions.ARB_draw_instanced = GL_TRUE;
+   }
+   if (screen->get_param(screen, PIPE_CAP_VERTEX_ELEMENT_INSTANCE_DIVISOR)) {
+      ctx->Extensions.ARB_instanced_arrays = GL_TRUE;
+   }
+
+   if (screen->fence_finish) {
+      ctx->Extensions.ARB_sync = GL_TRUE;
+   }
+
+   if (st->pipe->texture_barrier) {
+      ctx->Extensions.NV_texture_barrier = GL_TRUE;
+   }
+}
diff --git a/mesalib/src/mesa/state_tracker/st_format.c b/mesalib/src/mesa/state_tracker/st_format.c
index 0e67a6bc2..957a06c08 100644
--- a/mesalib/src/mesa/state_tracker/st_format.c
+++ b/mesalib/src/mesa/state_tracker/st_format.c
@@ -1,1184 +1,1412 @@
-/**************************************************************************
- * 
- * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
- * Copyright (c) 2008-2010 VMware, Inc.
- * 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"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sub license, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- * 
- * The above copyright notice and this permission notice (including the
- * next paragraph) shall be included in all copies or substantial portions
- * of the Software.
- * 
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
- * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
- * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- * 
- **************************************************************************/
-
-
-/**
- * Mesa / Gallium format conversion and format selection code.
- * \author Brian Paul
- */
-
-#include "main/imports.h"
-#include "main/context.h"
-#include "main/texstore.h"
-#include "main/image.h"
-#include "main/macros.h"
-#include "main/mfeatures.h"
-
-#include "pipe/p_context.h"
-#include "pipe/p_defines.h"
-#include "pipe/p_screen.h"
-#include "util/u_format.h"
-#include "st_context.h"
-#include "st_format.h"
-
-
-static GLuint
-format_max_bits(enum pipe_format format)
-{
-   GLuint size = util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 0);
-
-   size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 1));
-   size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 2));
-   size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 3));
-   size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 0));
-   size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 1));
-   return size;
-}
-
-
-/**
- * Return basic GL datatype for the given gallium format.
- */
-GLenum
-st_format_datatype(enum pipe_format format)
-{
-   const struct util_format_description *desc;
-
-   desc = util_format_description(format);
-   assert(desc);
-
-   if (desc->layout == UTIL_FORMAT_LAYOUT_PLAIN) {
-      if (format == PIPE_FORMAT_B5G5R5A1_UNORM ||
-          format == PIPE_FORMAT_B5G6R5_UNORM) {
-         return GL_UNSIGNED_SHORT;
-      }
-      else if (format == PIPE_FORMAT_Z24_UNORM_S8_USCALED ||
-               format == PIPE_FORMAT_S8_USCALED_Z24_UNORM ||
-               format == PIPE_FORMAT_Z24X8_UNORM ||
-               format == PIPE_FORMAT_X8Z24_UNORM) {
-         return GL_UNSIGNED_INT_24_8;
-      }
-      else {
-         const GLuint size = format_max_bits(format);
-         if (size == 8) {
-            if (desc->channel[0].type == UTIL_FORMAT_TYPE_UNSIGNED)
-               return GL_UNSIGNED_BYTE;
-            else
-               return GL_BYTE;
-         }
-         else if (size == 16) {
-            if (desc->channel[0].type == UTIL_FORMAT_TYPE_UNSIGNED)
-               return GL_UNSIGNED_SHORT;
-            else
-               return GL_SHORT;
-         }
-         else {
-            assert( size <= 32 );
-            if (desc->channel[0].type == UTIL_FORMAT_TYPE_UNSIGNED)
-               return GL_UNSIGNED_INT;
-            else
-               return GL_INT;
-         }
-      }
-   }
-   else if (format == PIPE_FORMAT_UYVY) {
-      return GL_UNSIGNED_SHORT;
-   }
-   else if (format == PIPE_FORMAT_YUYV) {
-      return GL_UNSIGNED_SHORT;
-   }
-   else {
-      /* probably a compressed format, unsupported anyway */
-      return GL_NONE;
-   }
-}
-
-
-/**
- * Translate Mesa format to Gallium format.
- */
-enum pipe_format
-st_mesa_format_to_pipe_format(gl_format mesaFormat)
-{
-   switch (mesaFormat) {
-   case MESA_FORMAT_RGBA8888:
-      return PIPE_FORMAT_A8B8G8R8_UNORM;
-   case MESA_FORMAT_RGBA8888_REV:
-      return PIPE_FORMAT_R8G8B8A8_UNORM;
-   case MESA_FORMAT_ARGB8888:
-      return PIPE_FORMAT_B8G8R8A8_UNORM;
-   case MESA_FORMAT_ARGB8888_REV:
-      return PIPE_FORMAT_A8R8G8B8_UNORM;
-   case MESA_FORMAT_XRGB8888:
-      return PIPE_FORMAT_B8G8R8X8_UNORM;
-   case MESA_FORMAT_XRGB8888_REV:
-      return PIPE_FORMAT_X8R8G8B8_UNORM;
-   case MESA_FORMAT_ARGB1555:
-      return PIPE_FORMAT_B5G5R5A1_UNORM;
-   case MESA_FORMAT_ARGB4444:
-      return PIPE_FORMAT_B4G4R4A4_UNORM;
-   case MESA_FORMAT_RGB565:
-      return PIPE_FORMAT_B5G6R5_UNORM;
-   case MESA_FORMAT_RGB332:
-      return PIPE_FORMAT_B2G3R3_UNORM;
-   case MESA_FORMAT_ARGB2101010:
-      return PIPE_FORMAT_B10G10R10A2_UNORM;
-   case MESA_FORMAT_AL44:
-      return PIPE_FORMAT_L4A4_UNORM;
-   case MESA_FORMAT_AL88:
-      return PIPE_FORMAT_L8A8_UNORM;
-   case MESA_FORMAT_AL1616:
-      return PIPE_FORMAT_L16A16_UNORM;
-   case MESA_FORMAT_A8:
-      return PIPE_FORMAT_A8_UNORM;
-   case MESA_FORMAT_A16:
-      return PIPE_FORMAT_A16_UNORM;
-   case MESA_FORMAT_L8:
-      return PIPE_FORMAT_L8_UNORM;
-   case MESA_FORMAT_L16:
-      return PIPE_FORMAT_L16_UNORM;
-   case MESA_FORMAT_I8:
-      return PIPE_FORMAT_I8_UNORM;
-   case MESA_FORMAT_I16:
-      return PIPE_FORMAT_I16_UNORM;
-   case MESA_FORMAT_Z16:
-      return PIPE_FORMAT_Z16_UNORM;
-   case MESA_FORMAT_Z32:
-      return PIPE_FORMAT_Z32_UNORM;
-   case MESA_FORMAT_Z24_S8:
-      return PIPE_FORMAT_S8_USCALED_Z24_UNORM;
-   case MESA_FORMAT_S8_Z24:
-      return PIPE_FORMAT_Z24_UNORM_S8_USCALED;
-   case MESA_FORMAT_Z24_X8:
-      return PIPE_FORMAT_X8Z24_UNORM;
-   case MESA_FORMAT_X8_Z24:
-      return PIPE_FORMAT_Z24X8_UNORM;
-   case MESA_FORMAT_S8:
-      return PIPE_FORMAT_S8_USCALED;
-   case MESA_FORMAT_YCBCR:
-      return PIPE_FORMAT_UYVY;
-#if FEATURE_texture_s3tc
-   case MESA_FORMAT_RGB_DXT1:
-      return PIPE_FORMAT_DXT1_RGB;
-   case MESA_FORMAT_RGBA_DXT1:
-      return PIPE_FORMAT_DXT1_RGBA;
-   case MESA_FORMAT_RGBA_DXT3:
-      return PIPE_FORMAT_DXT3_RGBA;
-   case MESA_FORMAT_RGBA_DXT5:
-      return PIPE_FORMAT_DXT5_RGBA;
-#if FEATURE_EXT_texture_sRGB
-   case MESA_FORMAT_SRGB_DXT1:
-      return PIPE_FORMAT_DXT1_SRGB;
-   case MESA_FORMAT_SRGBA_DXT1:
-      return PIPE_FORMAT_DXT1_SRGBA;
-   case MESA_FORMAT_SRGBA_DXT3:
-      return PIPE_FORMAT_DXT3_SRGBA;
-   case MESA_FORMAT_SRGBA_DXT5:
-      return PIPE_FORMAT_DXT5_SRGBA;
-#endif
-#endif
-#if FEATURE_EXT_texture_sRGB
-   case MESA_FORMAT_SLA8:
-      return PIPE_FORMAT_L8A8_SRGB;
-   case MESA_FORMAT_SL8:
-      return PIPE_FORMAT_L8_SRGB;
-   case MESA_FORMAT_SRGB8:
-      return PIPE_FORMAT_R8G8B8_SRGB;
-   case MESA_FORMAT_SRGBA8:
-      return PIPE_FORMAT_A8B8G8R8_SRGB;
-   case MESA_FORMAT_SARGB8:
-      return PIPE_FORMAT_B8G8R8A8_SRGB;
-#endif
-   case MESA_FORMAT_R8:
-      return PIPE_FORMAT_R8_UNORM;
-   case MESA_FORMAT_R16:
-      return PIPE_FORMAT_R16_UNORM;
-   case MESA_FORMAT_RG88:
-      return PIPE_FORMAT_R8G8_UNORM;
-   case MESA_FORMAT_RG1616:
-      return PIPE_FORMAT_R16G16_UNORM;
-   case MESA_FORMAT_RGBA_16:
-      return PIPE_FORMAT_R16G16B16A16_UNORM;
-
-   /* signed int formats */
-   case MESA_FORMAT_RGBA_INT8:
-      return PIPE_FORMAT_R8G8B8A8_SSCALED;
-   case MESA_FORMAT_RGBA_INT16:
-      return PIPE_FORMAT_R16G16B16A16_SSCALED;
-   case MESA_FORMAT_RGBA_INT32:
-      return PIPE_FORMAT_R32G32B32A32_SSCALED;
-
-   /* unsigned int formats */
-   case MESA_FORMAT_RGBA_UINT8:
-      return PIPE_FORMAT_R8G8B8A8_USCALED;
-   case MESA_FORMAT_RGBA_UINT16:
-      return PIPE_FORMAT_R16G16B16A16_USCALED;
-   case MESA_FORMAT_RGBA_UINT32:
-      return PIPE_FORMAT_R32G32B32A32_USCALED;
-
-   case MESA_FORMAT_RED_RGTC1:
-      return PIPE_FORMAT_RGTC1_UNORM;
-   case MESA_FORMAT_SIGNED_RED_RGTC1:
-      return PIPE_FORMAT_RGTC1_SNORM;
-   case MESA_FORMAT_RG_RGTC2:
-      return PIPE_FORMAT_RGTC2_UNORM;
-   case MESA_FORMAT_SIGNED_RG_RGTC2:
-      return PIPE_FORMAT_RGTC2_SNORM;
-
-   case MESA_FORMAT_L_LATC1:
-      return PIPE_FORMAT_LATC1_UNORM;
-   case MESA_FORMAT_SIGNED_L_LATC1:
-      return PIPE_FORMAT_LATC1_SNORM;
-   case MESA_FORMAT_LA_LATC2:
-      return PIPE_FORMAT_LATC2_UNORM;
-   case MESA_FORMAT_SIGNED_LA_LATC2:
-      return PIPE_FORMAT_LATC2_SNORM;
-
-   default:
-      assert(0);
-      return PIPE_FORMAT_NONE;
-   }
-}
-
-
-/**
- * Translate Gallium format to Mesa format.
- */
-gl_format
-st_pipe_format_to_mesa_format(enum pipe_format format)
-{
-   switch (format) {
-   case PIPE_FORMAT_A8B8G8R8_UNORM:
-      return MESA_FORMAT_RGBA8888;
-   case PIPE_FORMAT_R8G8B8A8_UNORM:
-      return MESA_FORMAT_RGBA8888_REV;
-   case PIPE_FORMAT_B8G8R8A8_UNORM:
-      return MESA_FORMAT_ARGB8888;
-   case PIPE_FORMAT_A8R8G8B8_UNORM:
-      return MESA_FORMAT_ARGB8888_REV;
-   case PIPE_FORMAT_B8G8R8X8_UNORM:
-      return MESA_FORMAT_XRGB8888;
-   case PIPE_FORMAT_X8R8G8B8_UNORM:
-      return MESA_FORMAT_XRGB8888_REV;
-   case PIPE_FORMAT_B5G5R5A1_UNORM:
-      return MESA_FORMAT_ARGB1555;
-   case PIPE_FORMAT_B4G4R4A4_UNORM:
-      return MESA_FORMAT_ARGB4444;
-   case PIPE_FORMAT_B5G6R5_UNORM:
-      return MESA_FORMAT_RGB565;
-   case PIPE_FORMAT_B2G3R3_UNORM:
-      return MESA_FORMAT_RGB332;
-   case PIPE_FORMAT_B10G10R10A2_UNORM:
-      return MESA_FORMAT_ARGB2101010;
-   case PIPE_FORMAT_L4A4_UNORM:
-      return MESA_FORMAT_AL44;
-   case PIPE_FORMAT_L8A8_UNORM:
-      return MESA_FORMAT_AL88;
-   case PIPE_FORMAT_L16A16_UNORM:
-      return MESA_FORMAT_AL1616;
-   case PIPE_FORMAT_A8_UNORM:
-      return MESA_FORMAT_A8;
-   case PIPE_FORMAT_A16_UNORM:
-      return MESA_FORMAT_A16;
-   case PIPE_FORMAT_L8_UNORM:
-      return MESA_FORMAT_L8;
-   case PIPE_FORMAT_L16_UNORM:
-      return MESA_FORMAT_L16;
-   case PIPE_FORMAT_I8_UNORM:
-      return MESA_FORMAT_I8;
-   case PIPE_FORMAT_I16_UNORM:
-      return MESA_FORMAT_I16;
-   case PIPE_FORMAT_S8_USCALED:
-      return MESA_FORMAT_S8;
-
-   case PIPE_FORMAT_R16G16B16A16_UNORM:
-      return MESA_FORMAT_RGBA_16;
-   case PIPE_FORMAT_R16G16B16A16_SNORM:
-      return MESA_FORMAT_SIGNED_RGBA_16;
-
-   case PIPE_FORMAT_Z16_UNORM:
-      return MESA_FORMAT_Z16;
-   case PIPE_FORMAT_Z32_UNORM:
-      return MESA_FORMAT_Z32;
-   case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
-      return MESA_FORMAT_Z24_S8;
-   case PIPE_FORMAT_X8Z24_UNORM:
-      return MESA_FORMAT_Z24_X8;
-   case PIPE_FORMAT_Z24X8_UNORM:
-      return MESA_FORMAT_X8_Z24;
-   case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
-      return MESA_FORMAT_S8_Z24;
-
-   case PIPE_FORMAT_UYVY:
-      return MESA_FORMAT_YCBCR;
-   case PIPE_FORMAT_YUYV:
-      return MESA_FORMAT_YCBCR_REV;
-
-#if FEATURE_texture_s3tc
-   case PIPE_FORMAT_DXT1_RGB:
-      return MESA_FORMAT_RGB_DXT1;
-   case PIPE_FORMAT_DXT1_RGBA:
-      return MESA_FORMAT_RGBA_DXT1;
-   case PIPE_FORMAT_DXT3_RGBA:
-      return MESA_FORMAT_RGBA_DXT3;
-   case PIPE_FORMAT_DXT5_RGBA:
-      return MESA_FORMAT_RGBA_DXT5;
-#if FEATURE_EXT_texture_sRGB
-   case PIPE_FORMAT_DXT1_SRGB:
-      return MESA_FORMAT_SRGB_DXT1;
-   case PIPE_FORMAT_DXT1_SRGBA:
-      return MESA_FORMAT_SRGBA_DXT1;
-   case PIPE_FORMAT_DXT3_SRGBA:
-      return MESA_FORMAT_SRGBA_DXT3;
-   case PIPE_FORMAT_DXT5_SRGBA:
-      return MESA_FORMAT_SRGBA_DXT5;
-#endif
-#endif
-
-#if FEATURE_EXT_texture_sRGB
-   case PIPE_FORMAT_L8A8_SRGB:
-      return MESA_FORMAT_SLA8;
-   case PIPE_FORMAT_L8_SRGB:
-      return MESA_FORMAT_SL8;
-   case PIPE_FORMAT_R8G8B8_SRGB:
-      return MESA_FORMAT_SRGB8;
-   case PIPE_FORMAT_A8B8G8R8_SRGB:
-      return MESA_FORMAT_SRGBA8;
-   case PIPE_FORMAT_B8G8R8A8_SRGB:
-      return MESA_FORMAT_SARGB8;
-#endif
-
-   case PIPE_FORMAT_R8_UNORM:
-      return MESA_FORMAT_R8;
-   case PIPE_FORMAT_R16_UNORM:
-      return MESA_FORMAT_R16;
-   case PIPE_FORMAT_R8G8_UNORM:
-      return MESA_FORMAT_RG88;
-   case PIPE_FORMAT_R16G16_UNORM:
-      return MESA_FORMAT_RG1616;
-
-   /* signed int formats */
-   case PIPE_FORMAT_R8G8B8A8_SSCALED:
-      return MESA_FORMAT_RGBA_INT8;
-   case PIPE_FORMAT_R16G16B16A16_SSCALED:
-      return MESA_FORMAT_RGBA_INT16;
-   case PIPE_FORMAT_R32G32B32A32_SSCALED:
-      return MESA_FORMAT_RGBA_INT32;
-
-   /* unsigned int formats */
-   case PIPE_FORMAT_R8G8B8A8_USCALED:
-      return MESA_FORMAT_RGBA_UINT8;
-   case PIPE_FORMAT_R16G16B16A16_USCALED:
-      return MESA_FORMAT_RGBA_UINT16;
-   case PIPE_FORMAT_R32G32B32A32_USCALED:
-      return MESA_FORMAT_RGBA_UINT32;
-
-   case PIPE_FORMAT_RGTC1_UNORM:
-      return MESA_FORMAT_RED_RGTC1;
-   case PIPE_FORMAT_RGTC1_SNORM:
-      return MESA_FORMAT_SIGNED_RED_RGTC1;
-   case PIPE_FORMAT_RGTC2_UNORM:
-      return MESA_FORMAT_RG_RGTC2;
-   case PIPE_FORMAT_RGTC2_SNORM:
-      return MESA_FORMAT_SIGNED_RG_RGTC2;
-
-   case PIPE_FORMAT_LATC1_UNORM:
-      return MESA_FORMAT_L_LATC1;
-   case PIPE_FORMAT_LATC1_SNORM:
-      return MESA_FORMAT_SIGNED_L_LATC1;
-   case PIPE_FORMAT_LATC2_UNORM:
-      return MESA_FORMAT_LA_LATC2;
-   case PIPE_FORMAT_LATC2_SNORM:
-      return MESA_FORMAT_SIGNED_LA_LATC2;
-
-   default:
-      assert(0);
-      return MESA_FORMAT_NONE;
-   }
-}
-
-
-/**
- * Return first supported format from the given list.
- */
-static enum pipe_format
-find_supported_format(struct pipe_screen *screen, 
-                      const enum pipe_format formats[],
-                      uint num_formats,
-                      enum pipe_texture_target target,
-                      unsigned sample_count,
-                      unsigned tex_usage)
-{
-   uint i;
-   for (i = 0; i < num_formats; i++) {
-      if (screen->is_format_supported(screen, formats[i], target,
-                                      sample_count, tex_usage)) {
-         return formats[i];
-      }
-   }
-   return PIPE_FORMAT_NONE;
-}
-
-
-/**
- * Find an RGBA format supported by the context/winsys.
- */
-static enum pipe_format
-default_rgba_format(struct pipe_screen *screen, 
-                    enum pipe_texture_target target,
-                    unsigned sample_count,
-                    unsigned tex_usage)
-{
-   static const enum pipe_format colorFormats[] = {
-      PIPE_FORMAT_B8G8R8A8_UNORM,
-      PIPE_FORMAT_A8R8G8B8_UNORM,
-      PIPE_FORMAT_A8B8G8R8_UNORM,
-      PIPE_FORMAT_B5G6R5_UNORM
-   };
-   return find_supported_format(screen, colorFormats, Elements(colorFormats),
-                                target, sample_count, tex_usage);
-}
-
-
-/**
- * Find an RGB format supported by the context/winsys.
- */
-static enum pipe_format
-default_rgb_format(struct pipe_screen *screen, 
-                   enum pipe_texture_target target,
-                   unsigned sample_count,
-                   unsigned tex_usage)
-{
-   static const enum pipe_format colorFormats[] = {
-      PIPE_FORMAT_B8G8R8X8_UNORM,
-      PIPE_FORMAT_X8R8G8B8_UNORM,
-      PIPE_FORMAT_X8B8G8R8_UNORM,
-      PIPE_FORMAT_B8G8R8A8_UNORM,
-      PIPE_FORMAT_A8R8G8B8_UNORM,
-      PIPE_FORMAT_A8B8G8R8_UNORM,
-      PIPE_FORMAT_B5G6R5_UNORM
-   };
-   return find_supported_format(screen, colorFormats, Elements(colorFormats),
-                                target, sample_count, tex_usage);
-}
-
-/**
- * Find an sRGBA format supported by the context/winsys.
- */
-static enum pipe_format
-default_srgba_format(struct pipe_screen *screen, 
-                    enum pipe_texture_target target,
-                    unsigned sample_count,
-                    unsigned tex_usage)
-{
-   static const enum pipe_format colorFormats[] = {
-      PIPE_FORMAT_B8G8R8A8_SRGB,
-      PIPE_FORMAT_A8R8G8B8_SRGB,
-      PIPE_FORMAT_A8B8G8R8_SRGB,
-   };
-   return find_supported_format(screen, colorFormats, Elements(colorFormats),
-                                target, sample_count, tex_usage);
-}
-
-
-/**
- * Given an OpenGL internalFormat value for a texture or surface, return
- * the best matching PIPE_FORMAT_x, or PIPE_FORMAT_NONE if there's no match.
- * This is called during glTexImage2D, for example.
- *
- * The bindings parameter typically has PIPE_BIND_SAMPLER_VIEW set, plus
- * either PIPE_BINDING_RENDER_TARGET or PIPE_BINDING_DEPTH_STENCIL if
- * we want render-to-texture ability.
- *
- * \param internalFormat  the user value passed to glTexImage2D
- * \param target  one of PIPE_TEXTURE_x
- * \param bindings  bitmask of PIPE_BIND_x flags.
- */
-enum pipe_format
-st_choose_format(struct pipe_screen *screen, GLenum internalFormat,
-                 enum pipe_texture_target target, unsigned sample_count,
-                 unsigned bindings)
-{
-
-   switch (internalFormat) {
-   case GL_RGB10:
-   case GL_RGB10_A2:
-      if (screen->is_format_supported( screen, PIPE_FORMAT_B10G10R10A2_UNORM,
-                                       target, sample_count, bindings))
-         return PIPE_FORMAT_B10G10R10A2_UNORM;
-      /* Pass through. */
-   case 4:
-   case GL_RGBA:
-   case GL_RGBA8:
-      return default_rgba_format( screen, target, sample_count, bindings);
-
-   case GL_BGRA:
-      if (screen->is_format_supported( screen, PIPE_FORMAT_B8G8R8A8_UNORM,
-                                       target, sample_count, bindings))
-         return PIPE_FORMAT_B8G8R8A8_UNORM;
-      return default_rgba_format( screen, target, sample_count, bindings);
-
-   case 3:
-   case GL_RGB:
-   case GL_RGB8:
-      return default_rgb_format( screen, target, sample_count, bindings);
-
-   case GL_RGB12:
-   case GL_RGB16:
-   case GL_RGBA12:
-   case GL_RGBA16:
-      if (screen->is_format_supported( screen, PIPE_FORMAT_R16G16B16A16_UNORM,
-                                             target, sample_count, bindings))
-         return PIPE_FORMAT_R16G16B16A16_UNORM;
-      return default_rgba_format( screen, target, sample_count, bindings);
-
-   case GL_RGBA4:
-   case GL_RGBA2:
-      if (screen->is_format_supported( screen, PIPE_FORMAT_B4G4R4A4_UNORM,
-                                       target, sample_count, bindings))
-         return PIPE_FORMAT_B4G4R4A4_UNORM;
-      return default_rgba_format( screen, target, sample_count, bindings);
-
-   case GL_RGB5_A1:
-      if (screen->is_format_supported( screen, PIPE_FORMAT_B5G5R5A1_UNORM,
-                                       target, sample_count, bindings))
-         return PIPE_FORMAT_B5G5R5A1_UNORM;
-      return default_rgba_format( screen, target, sample_count, bindings);
-
-   case GL_R3_G3_B2:
-      if (screen->is_format_supported( screen, PIPE_FORMAT_B2G3R3_UNORM,
-                                       target, sample_count, bindings))
-         return PIPE_FORMAT_B2G3R3_UNORM;
-      /* Pass through. */
-   case GL_RGB5:
-   case GL_RGB4:
-      if (screen->is_format_supported( screen, PIPE_FORMAT_B5G6R5_UNORM,
-                                       target, sample_count, bindings))
-         return PIPE_FORMAT_B5G6R5_UNORM;
-      if (screen->is_format_supported( screen, PIPE_FORMAT_B5G5R5A1_UNORM,
-                                       target, sample_count, bindings))
-         return PIPE_FORMAT_B5G5R5A1_UNORM;
-      return default_rgba_format( screen, target, sample_count, bindings);
-
-   case GL_ALPHA12:
-   case GL_ALPHA16:
-      if (screen->is_format_supported( screen, PIPE_FORMAT_A16_UNORM, target,
-                                       sample_count, bindings))
-         return PIPE_FORMAT_A16_UNORM;
-      /* Pass through. */
-   case GL_ALPHA:
-   case GL_ALPHA4:
-   case GL_ALPHA8:
-   case GL_COMPRESSED_ALPHA:
-      if (screen->is_format_supported( screen, PIPE_FORMAT_A8_UNORM, target,
-                                       sample_count, bindings))
-         return PIPE_FORMAT_A8_UNORM;
-      return default_rgba_format( screen, target, sample_count, bindings);
-
-   case GL_LUMINANCE12:
-   case GL_LUMINANCE16:
-      if (screen->is_format_supported( screen, PIPE_FORMAT_L16_UNORM, target,
-                                       sample_count, bindings))
-         return PIPE_FORMAT_L16_UNORM;
-      /* Pass through. */
-   case 1:
-   case GL_LUMINANCE:
-   case GL_LUMINANCE4:
-   case GL_LUMINANCE8:
-      if (screen->is_format_supported( screen, PIPE_FORMAT_L8_UNORM, target,
-                                       sample_count, bindings))
-         return PIPE_FORMAT_L8_UNORM;
-      return default_rgba_format( screen, target, sample_count, bindings);
-
-   case GL_LUMINANCE12_ALPHA4:
-   case GL_LUMINANCE12_ALPHA12:
-   case GL_LUMINANCE16_ALPHA16:
-      if (screen->is_format_supported( screen, PIPE_FORMAT_L16A16_UNORM, target,
-                                       sample_count, bindings))
-         return PIPE_FORMAT_L16A16_UNORM;
-      /* Pass through. */
-   case 2:
-   case GL_LUMINANCE_ALPHA:
-   case GL_LUMINANCE6_ALPHA2:
-   case GL_LUMINANCE8_ALPHA8:
-      if (screen->is_format_supported( screen, PIPE_FORMAT_L8A8_UNORM, target,
-                                       sample_count, bindings))
-         return PIPE_FORMAT_L8A8_UNORM;
-      return default_rgba_format( screen, target, sample_count, bindings);
-
-   case GL_LUMINANCE4_ALPHA4:
-      if (screen->is_format_supported( screen, PIPE_FORMAT_L4A4_UNORM, target,
-                                       sample_count, bindings))
-         return PIPE_FORMAT_L4A4_UNORM;
-      if (screen->is_format_supported( screen, PIPE_FORMAT_L8A8_UNORM, target,
-                                       sample_count, bindings))
-         return PIPE_FORMAT_L8A8_UNORM;
-      return default_rgba_format( screen, target, sample_count, bindings);
-
-   case GL_INTENSITY12:
-   case GL_INTENSITY16:
-      if (screen->is_format_supported( screen, PIPE_FORMAT_I16_UNORM, target,
-                                       sample_count, bindings))
-         return PIPE_FORMAT_I16_UNORM;
-      /* Pass through. */
-   case GL_INTENSITY:
-   case GL_INTENSITY4:
-   case GL_INTENSITY8:
-   case GL_COMPRESSED_INTENSITY:
-      if (screen->is_format_supported( screen, PIPE_FORMAT_I8_UNORM, target,
-                                       sample_count, bindings))
-         return PIPE_FORMAT_I8_UNORM;
-      return default_rgba_format( screen, target, sample_count, bindings);
-
-   case GL_YCBCR_MESA:
-      if (screen->is_format_supported(screen, PIPE_FORMAT_UYVY, target,
-                                      sample_count, bindings)) {
-         return PIPE_FORMAT_UYVY;
-      }
-      if (screen->is_format_supported(screen, PIPE_FORMAT_YUYV, target,
-                                      sample_count, bindings)) {
-         return PIPE_FORMAT_YUYV;
-      }
-      return PIPE_FORMAT_NONE;
-
-   case GL_COMPRESSED_RGB:
-      /* can only sample from compressed formats */
-      if (bindings & ~PIPE_BIND_SAMPLER_VIEW)
-         return PIPE_FORMAT_NONE;
-      else if (screen->is_format_supported(screen, PIPE_FORMAT_DXT1_RGB,
-                                           target, sample_count, bindings))
-         return PIPE_FORMAT_DXT1_RGB;
-      else
-         return default_rgb_format(screen, target, sample_count, bindings);
-
-   case GL_COMPRESSED_RGBA:
-      /* can only sample from compressed formats */
-      if (bindings & ~PIPE_BIND_SAMPLER_VIEW)
-         return PIPE_FORMAT_NONE;
-      else if (screen->is_format_supported(screen, PIPE_FORMAT_DXT3_RGBA,
-                                           target, sample_count, bindings))
-         return PIPE_FORMAT_DXT3_RGBA;
-      else
-         return default_rgba_format(screen, target, sample_count, bindings);
-
-   case GL_RGB_S3TC:
-   case GL_RGB4_S3TC:
-   case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
-      if (screen->is_format_supported(screen, PIPE_FORMAT_DXT1_RGB,
-                                      target, sample_count, bindings))
-         return PIPE_FORMAT_DXT1_RGB;
-      else
-         return PIPE_FORMAT_NONE;
-
-   case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
-      if (screen->is_format_supported(screen, PIPE_FORMAT_DXT1_RGBA,
-                                      target, sample_count, bindings))
-         return PIPE_FORMAT_DXT1_RGBA;
-      else
-         return PIPE_FORMAT_NONE;
-
-   case GL_RGBA_S3TC:
-   case GL_RGBA4_S3TC:
-   case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
-      if (screen->is_format_supported(screen, PIPE_FORMAT_DXT3_RGBA,
-                                      target, sample_count, bindings))
-         return PIPE_FORMAT_DXT3_RGBA;
-      else
-         return PIPE_FORMAT_NONE;
-
-   case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
-      if (screen->is_format_supported(screen, PIPE_FORMAT_DXT5_RGBA,
-                                      target, sample_count, bindings))
-         return PIPE_FORMAT_DXT5_RGBA;
-      else
-         return PIPE_FORMAT_NONE;
-
-#if 0
-   case GL_COMPRESSED_RGB_FXT1_3DFX:
-      return PIPE_FORMAT_RGB_FXT1;
-   case GL_COMPRESSED_RGBA_FXT1_3DFX:
-      return PIPE_FORMAT_RGB_FXT1;
-#endif
-
-   case GL_DEPTH_COMPONENT16:
-      if (screen->is_format_supported(screen, PIPE_FORMAT_Z16_UNORM, target,
-                                      sample_count, bindings))
-         return PIPE_FORMAT_Z16_UNORM;
-      /* fall-through */
-   case GL_DEPTH_COMPONENT24:
-      if (screen->is_format_supported(screen, PIPE_FORMAT_Z24_UNORM_S8_USCALED,
-                                      target, sample_count, bindings))
-         return PIPE_FORMAT_Z24_UNORM_S8_USCALED;
-      if (screen->is_format_supported(screen, PIPE_FORMAT_S8_USCALED_Z24_UNORM,
-                                      target, sample_count, bindings))
-         return PIPE_FORMAT_S8_USCALED_Z24_UNORM;
-      /* fall-through */
-   case GL_DEPTH_COMPONENT32:
-      if (screen->is_format_supported(screen, PIPE_FORMAT_Z32_UNORM, target,
-                                      sample_count, bindings))
-         return PIPE_FORMAT_Z32_UNORM;
-      /* fall-through */
-   case GL_DEPTH_COMPONENT:
-      {
-         static const enum pipe_format formats[] = {
-            PIPE_FORMAT_Z32_UNORM,
-            PIPE_FORMAT_Z24_UNORM_S8_USCALED,
-            PIPE_FORMAT_S8_USCALED_Z24_UNORM,
-            PIPE_FORMAT_Z16_UNORM
-         };
-         return find_supported_format(screen, formats, Elements(formats),
-                                      target, sample_count, bindings);
-      }
-
-   case GL_STENCIL_INDEX:
-   case GL_STENCIL_INDEX1_EXT:
-   case GL_STENCIL_INDEX4_EXT:
-   case GL_STENCIL_INDEX8_EXT:
-   case GL_STENCIL_INDEX16_EXT:
-      {
-         static const enum pipe_format formats[] = {
-            PIPE_FORMAT_S8_USCALED,
-            PIPE_FORMAT_Z24_UNORM_S8_USCALED,
-            PIPE_FORMAT_S8_USCALED_Z24_UNORM
-         };
-         return find_supported_format(screen, formats, Elements(formats),
-                                      target, sample_count, bindings);
-      }
-
-   case GL_DEPTH_STENCIL_EXT:
-   case GL_DEPTH24_STENCIL8_EXT:
-      {
-         static const enum pipe_format formats[] = {
-            PIPE_FORMAT_Z24_UNORM_S8_USCALED,
-            PIPE_FORMAT_S8_USCALED_Z24_UNORM
-         };
-         return find_supported_format(screen, formats, Elements(formats),
-                                      target, sample_count, bindings);
-      }
-
-   case GL_SRGB_EXT:
-   case GL_SRGB8_EXT:
-   case GL_SRGB_ALPHA_EXT:
-   case GL_SRGB8_ALPHA8_EXT:
-      return default_srgba_format( screen, target, sample_count, bindings);
-
-   case GL_COMPRESSED_SRGB_EXT:
-   case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
-      if (screen->is_format_supported(screen, PIPE_FORMAT_DXT1_SRGB, target,
-                                      sample_count, bindings))
-         return PIPE_FORMAT_DXT1_SRGB;
-      return default_srgba_format( screen, target, sample_count, bindings);
-
-   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
-      return PIPE_FORMAT_DXT1_SRGBA;
-
-   case GL_COMPRESSED_SRGB_ALPHA_EXT:
-   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
-      if (screen->is_format_supported(screen, PIPE_FORMAT_DXT3_SRGBA, target,
-                                      sample_count, bindings))
-         return PIPE_FORMAT_DXT3_SRGBA;
-      return default_srgba_format( screen, target, sample_count, bindings);
-
-   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
-      return PIPE_FORMAT_DXT5_SRGBA;
-
-   case GL_SLUMINANCE_ALPHA_EXT:
-   case GL_SLUMINANCE8_ALPHA8_EXT:
-   case GL_COMPRESSED_SLUMINANCE_EXT:
-   case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
-      if (screen->is_format_supported(screen, PIPE_FORMAT_L8A8_SRGB, target,
-                                      sample_count, bindings))
-         return PIPE_FORMAT_L8A8_SRGB;
-      return default_srgba_format( screen, target, sample_count, bindings);
-
-   case GL_SLUMINANCE_EXT:
-   case GL_SLUMINANCE8_EXT:
-      if (screen->is_format_supported(screen, PIPE_FORMAT_L8_SRGB, target,
-                                      sample_count, bindings))
-         return PIPE_FORMAT_L8_SRGB;
-      return default_srgba_format( screen, target, sample_count, bindings);
-
-   case GL_RED:
-   case GL_R8:
-      if (screen->is_format_supported(screen, PIPE_FORMAT_R8_UNORM, target,
-                                      sample_count, bindings))
-	      return PIPE_FORMAT_R8_UNORM;
-      return PIPE_FORMAT_NONE;
-   case GL_RG:
-   case GL_RG8:
-      if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8_UNORM, target,
-                                      sample_count, bindings))
-	      return PIPE_FORMAT_R8G8_UNORM;
-      return PIPE_FORMAT_NONE;
-
-   case GL_R16:
-      if (screen->is_format_supported(screen, PIPE_FORMAT_R16_UNORM, target,
-                                      sample_count, bindings))
-	      return PIPE_FORMAT_R16_UNORM;
-      return PIPE_FORMAT_NONE;
-
-   case GL_RG16:
-      if (screen->is_format_supported(screen, PIPE_FORMAT_R16G16_UNORM, target,
-                                      sample_count, bindings))
-	      return PIPE_FORMAT_R16G16_UNORM;
-      return PIPE_FORMAT_NONE;
-
-   case GL_COMPRESSED_RED:
-   case GL_COMPRESSED_RED_RGTC1:
-      if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC1_UNORM, target,
-                                      sample_count, bindings))
-	      return PIPE_FORMAT_RGTC1_UNORM;
-      if (screen->is_format_supported(screen, PIPE_FORMAT_R8_UNORM, target,
-                                      sample_count, bindings))
-	      return PIPE_FORMAT_R8_UNORM;
-      return PIPE_FORMAT_NONE;
-
-   case GL_COMPRESSED_SIGNED_RED_RGTC1:
-      if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC1_SNORM, target,
-                                      sample_count, bindings))
-	      return PIPE_FORMAT_RGTC1_SNORM;
-      return PIPE_FORMAT_NONE;
-
-   case GL_COMPRESSED_RG:
-   case GL_COMPRESSED_RG_RGTC2:
-      if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC2_UNORM, target,
-                                      sample_count, bindings))
-	      return PIPE_FORMAT_RGTC2_UNORM;
-      if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8_UNORM, target,
-                                      sample_count, bindings))
-	      return PIPE_FORMAT_R8G8_UNORM;
-      return PIPE_FORMAT_NONE;
-
-   case GL_COMPRESSED_SIGNED_RG_RGTC2:
-      if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC2_SNORM, target,
-                                      sample_count, bindings))
-	      return PIPE_FORMAT_RGTC2_SNORM;
-      return PIPE_FORMAT_NONE;
-
-   case GL_COMPRESSED_LUMINANCE:
-   case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
-      if (screen->is_format_supported(screen, PIPE_FORMAT_LATC1_UNORM, target,
-                                      sample_count, bindings))
-              return PIPE_FORMAT_LATC1_UNORM;
-      if (screen->is_format_supported(screen, PIPE_FORMAT_L8_UNORM, target,
-                                      sample_count, bindings))
-              return PIPE_FORMAT_L8_UNORM;
-      return PIPE_FORMAT_NONE;
-
-   case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
-      if (screen->is_format_supported(screen, PIPE_FORMAT_LATC1_SNORM, target,
-                                      sample_count, bindings))
-              return PIPE_FORMAT_LATC1_SNORM;
-      return PIPE_FORMAT_NONE;
-
-   case GL_COMPRESSED_LUMINANCE_ALPHA:
-   case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
-   case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
-      if (screen->is_format_supported(screen, PIPE_FORMAT_LATC2_UNORM, target,
-                                      sample_count, bindings))
-              return PIPE_FORMAT_LATC2_UNORM;
-      if (screen->is_format_supported(screen, PIPE_FORMAT_L8A8_UNORM, target,
-                                      sample_count, bindings))
-              return PIPE_FORMAT_L8A8_UNORM;
-      return PIPE_FORMAT_NONE;
-
-   case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
-      if (screen->is_format_supported(screen, PIPE_FORMAT_LATC2_SNORM, target,
-                                      sample_count, bindings))
-              return PIPE_FORMAT_LATC2_SNORM;
-      return PIPE_FORMAT_NONE;
-
-   /* signed/unsigned integer formats.
-    * XXX Mesa only has formats for RGBA signed/unsigned integer formats.
-    * If/when new formats are added this code should be updated.
-    */
-   case GL_RED_INTEGER_EXT:
-   case GL_GREEN_INTEGER_EXT:
-   case GL_BLUE_INTEGER_EXT:
-   case GL_ALPHA_INTEGER_EXT:
-   case GL_RGB_INTEGER_EXT:
-   case GL_RGBA_INTEGER_EXT:
-   case GL_BGR_INTEGER_EXT:
-   case GL_BGRA_INTEGER_EXT:
-   case GL_LUMINANCE_INTEGER_EXT:
-   case GL_LUMINANCE_ALPHA_INTEGER_EXT:
-      /* fall-through */
-   case GL_RGBA8I_EXT:
-   case GL_RGB8I_EXT:
-   case GL_ALPHA8I_EXT:
-   case GL_INTENSITY8I_EXT:
-   case GL_LUMINANCE8I_EXT:
-   case GL_LUMINANCE_ALPHA8I_EXT:
-      if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8B8A8_SSCALED,
-                                      target,
-                                      sample_count, bindings))
-         return PIPE_FORMAT_R8G8B8A8_SSCALED;
-      return PIPE_FORMAT_NONE;
-   case GL_RGBA16I_EXT:
-   case GL_RGB16I_EXT:
-   case GL_ALPHA16I_EXT:
-   case GL_INTENSITY16I_EXT:
-   case GL_LUMINANCE16I_EXT:
-   case GL_LUMINANCE_ALPHA16I_EXT:
-      if (screen->is_format_supported(screen, PIPE_FORMAT_R16G16B16A16_SSCALED,
-                                      target,
-                                      sample_count, bindings))
-         return PIPE_FORMAT_R16G16B16A16_SSCALED;
-      return PIPE_FORMAT_NONE;
-   case GL_RGBA32I_EXT:
-   case GL_RGB32I_EXT:
-   case GL_ALPHA32I_EXT:
-   case GL_INTENSITY32I_EXT:
-   case GL_LUMINANCE32I_EXT:
-   case GL_LUMINANCE_ALPHA32I_EXT:
-      /* xxx */
-      if (screen->is_format_supported(screen, PIPE_FORMAT_R32G32B32A32_SSCALED,
-                                      target,
-                                      sample_count, bindings))
-         return PIPE_FORMAT_R32G32B32A32_SSCALED;
-      return PIPE_FORMAT_NONE;
-
-   case GL_RGBA8UI_EXT:
-   case GL_RGB8UI_EXT:
-   case GL_ALPHA8UI_EXT:
-   case GL_INTENSITY8UI_EXT:
-   case GL_LUMINANCE8UI_EXT:
-   case GL_LUMINANCE_ALPHA8UI_EXT:
-      if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8B8A8_USCALED,
-                                      target,
-                                      sample_count, bindings))
-         return PIPE_FORMAT_R8G8B8A8_USCALED;
-      return PIPE_FORMAT_NONE;
-
-   case GL_RGBA16UI_EXT:
-   case GL_RGB16UI_EXT:
-   case GL_ALPHA16UI_EXT:
-   case GL_INTENSITY16UI_EXT:
-   case GL_LUMINANCE16UI_EXT:
-   case GL_LUMINANCE_ALPHA16UI_EXT:
-      if (screen->is_format_supported(screen, PIPE_FORMAT_R16G16B16A16_USCALED,
-                                      target,
-                                      sample_count, bindings))
-         return PIPE_FORMAT_R16G16B16A16_USCALED;
-      return PIPE_FORMAT_NONE;
-
-   case GL_RGBA32UI_EXT:
-   case GL_RGB32UI_EXT:
-   case GL_ALPHA32UI_EXT:
-   case GL_INTENSITY32UI_EXT:
-   case GL_LUMINANCE32UI_EXT:
-   case GL_LUMINANCE_ALPHA32UI_EXT:
-      if (screen->is_format_supported(screen, PIPE_FORMAT_R32G32B32A32_USCALED,
-                                      target,
-                                      sample_count, bindings))
-         return PIPE_FORMAT_R32G32B32A32_USCALED;
-      return PIPE_FORMAT_NONE;
-
-   default:
-      return PIPE_FORMAT_NONE;
-   }
-}
-
-
-/**
- * Called by FBO code to choose a PIPE_FORMAT_ for drawing surfaces.
- */
-enum pipe_format
-st_choose_renderbuffer_format(struct pipe_screen *screen,
-                              GLenum internalFormat, unsigned sample_count)
-{
-   uint usage;
-   if (_mesa_is_depth_or_stencil_format(internalFormat))
-      usage = PIPE_BIND_DEPTH_STENCIL;
-   else
-      usage = PIPE_BIND_RENDER_TARGET;
-   return st_choose_format(screen, internalFormat, PIPE_TEXTURE_2D,
-                           sample_count, usage);
-}
-
-
-/**
- * Called via ctx->Driver.chooseTextureFormat().
- */
-gl_format
-st_ChooseTextureFormat_renderable(struct gl_context *ctx, GLint internalFormat,
-				  GLenum format, GLenum type, GLboolean renderable)
-{
-   struct pipe_screen *screen = st_context(ctx)->pipe->screen;
-   enum pipe_format pFormat;
-   uint bindings;
-
-   (void) format;
-   (void) type;
-
-   /* GL textures may wind up being render targets, but we don't know
-    * that in advance.  Specify potential render target flags now.
-    */
-   bindings = PIPE_BIND_SAMPLER_VIEW;
-   if (renderable == GL_TRUE) {
-      if (_mesa_is_depth_format(internalFormat) ||
-	  _mesa_is_depth_or_stencil_format(internalFormat))
-	 bindings |= PIPE_BIND_DEPTH_STENCIL;
-      else 
-	 bindings |= PIPE_BIND_RENDER_TARGET;
-   }
-
-   pFormat = st_choose_format(screen, internalFormat,
-                              PIPE_TEXTURE_2D, 0, bindings);
-
-   if (pFormat == PIPE_FORMAT_NONE) {
-      /* try choosing format again, this time without render target bindings */
-      pFormat = st_choose_format(screen, internalFormat,
-                                 PIPE_TEXTURE_2D, 0, PIPE_BIND_SAMPLER_VIEW);
-   }
-
-   if (pFormat == PIPE_FORMAT_NONE) {
-      /* no luck at all */
-      return MESA_FORMAT_NONE;
-   }
-
-   return st_pipe_format_to_mesa_format(pFormat);
-}
-
-gl_format
-st_ChooseTextureFormat(struct gl_context *ctx, GLint internalFormat,
-                       GLenum format, GLenum type)
-{
-   boolean want_renderable =
-      internalFormat == 3 || internalFormat == 4 ||
-      internalFormat == GL_RGB || internalFormat == GL_RGBA ||
-      internalFormat == GL_RGB8 || internalFormat == GL_RGBA8 ||
-      internalFormat == GL_BGRA;
-
-   return st_ChooseTextureFormat_renderable(ctx, internalFormat,
-					    format, type, want_renderable);
-}
-
-/**
- * Test if a gallium format is equivalent to a GL format/type.
- */
-GLboolean
-st_equal_formats(enum pipe_format pFormat, GLenum format, GLenum type)
-{
-   switch (pFormat) {
-   case PIPE_FORMAT_A8B8G8R8_UNORM:
-      return format == GL_RGBA && type == GL_UNSIGNED_BYTE;
-   case PIPE_FORMAT_A8R8G8B8_UNORM:
-      return format == GL_BGRA && type == GL_UNSIGNED_BYTE;
-   case PIPE_FORMAT_B5G6R5_UNORM:
-      return format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5;
-   /* XXX more combos... */
-   default:
-      return GL_FALSE;
-   }
-}
-
-GLboolean
-st_sampler_compat_formats(enum pipe_format format1, enum pipe_format format2)
-{
-   if (format1 == format2)
-      return GL_TRUE;
-
-   if (format1 == PIPE_FORMAT_B8G8R8A8_UNORM &&
-       format2 == PIPE_FORMAT_B8G8R8X8_UNORM)
-      return GL_TRUE;
-
-   if (format1 == PIPE_FORMAT_B8G8R8X8_UNORM &&
-       format2 == PIPE_FORMAT_B8G8R8A8_UNORM)
-      return GL_TRUE;
-
-   if (format1 == PIPE_FORMAT_A8B8G8R8_UNORM &&
-       format2 == PIPE_FORMAT_X8B8G8R8_UNORM)
-      return GL_TRUE;
-
-   if (format1 == PIPE_FORMAT_X8B8G8R8_UNORM &&
-       format2 == PIPE_FORMAT_A8B8G8R8_UNORM)
-      return GL_TRUE;
-
-   if (format1 == PIPE_FORMAT_A8R8G8B8_UNORM &&
-       format2 == PIPE_FORMAT_X8R8G8B8_UNORM)
-      return GL_TRUE;
-
-   if (format1 == PIPE_FORMAT_X8R8G8B8_UNORM &&
-       format2 == PIPE_FORMAT_A8R8G8B8_UNORM)
-      return GL_TRUE;
-
-   return GL_FALSE;
-}
-
-
-
-/**
- * This is used for translating texture border color and the clear
- * color.  For example, the clear color is interpreted according to
- * the renderbuffer's base format.  For example, if clearing a
- * GL_LUMINANCE buffer, ClearColor[0] = luminance and ClearColor[1] =
- * alpha.  Similarly for texture border colors.
- */
-void
-st_translate_color(const GLfloat colorIn[4], GLenum baseFormat,
-                   GLfloat colorOut[4])
-{
-   switch (baseFormat) {
-   case GL_RED:
-      colorOut[0] = colorIn[0];
-      colorOut[1] = 0.0F;
-      colorOut[2] = 0.0F;
-      colorOut[3] = 1.0F;
-      break;
-   case GL_RG:
-      colorOut[0] = colorIn[0];
-      colorOut[1] = colorIn[1];
-      colorOut[2] = 0.0F;
-      colorOut[3] = 1.0F;
-      break;
-   case GL_RGB:
-      colorOut[0] = colorIn[0];
-      colorOut[1] = colorIn[1];
-      colorOut[2] = colorIn[2];
-      colorOut[3] = 1.0F;
-      break;
-   case GL_ALPHA:
-      colorOut[0] = colorOut[1] = colorOut[2] = 0.0;
-      colorOut[3] = colorIn[3];
-      break;
-   case GL_LUMINANCE:
-      colorOut[0] = colorOut[1] = colorOut[2] = colorIn[0];
-      colorOut[3] = 1.0;
-      break;
-   case GL_LUMINANCE_ALPHA:
-      colorOut[0] = colorOut[1] = colorOut[2] = colorIn[0];
-      colorOut[3] = colorIn[3];
-      break;
-   case GL_INTENSITY:
-      colorOut[0] = colorOut[1] = colorOut[2] = colorOut[3] = colorIn[0];
-      break;
-   default:
-      COPY_4V(colorOut, colorIn);
-   }
-}
+/**************************************************************************
+ * 
+ * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
+ * Copyright (c) 2008-2010 VMware, Inc.
+ * 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"), to deal in the Software without restriction, including
+ * without limitation the rights to use, copy, modify, merge, publish,
+ * distribute, sub license, and/or sell copies of the Software, and to
+ * permit persons to whom the Software is furnished to do so, subject to
+ * the following conditions:
+ * 
+ * The above copyright notice and this permission notice (including the
+ * next paragraph) shall be included in all copies or substantial portions
+ * of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
+ * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+ * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ * 
+ **************************************************************************/
+
+
+/**
+ * Mesa / Gallium format conversion and format selection code.
+ * \author Brian Paul
+ */
+
+#include "main/imports.h"
+#include "main/context.h"
+#include "main/texstore.h"
+#include "main/image.h"
+#include "main/macros.h"
+#include "main/mfeatures.h"
+
+#include "pipe/p_context.h"
+#include "pipe/p_defines.h"
+#include "pipe/p_screen.h"
+#include "util/u_format.h"
+#include "st_context.h"
+#include "st_format.h"
+
+
+static GLuint
+format_max_bits(enum pipe_format format)
+{
+   GLuint size = util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 0);
+
+   size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 1));
+   size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 2));
+   size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_RGB, 3));
+   size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 0));
+   size = MAX2(size, util_format_get_component_bits(format, UTIL_FORMAT_COLORSPACE_ZS, 1));
+   return size;
+}
+
+
+/**
+ * Return basic GL datatype for the given gallium format.
+ */
+GLenum
+st_format_datatype(enum pipe_format format)
+{
+   const struct util_format_description *desc;
+
+   desc = util_format_description(format);
+   assert(desc);
+
+   if (desc->layout == UTIL_FORMAT_LAYOUT_PLAIN) {
+      if (format == PIPE_FORMAT_B5G5R5A1_UNORM ||
+          format == PIPE_FORMAT_B5G6R5_UNORM) {
+         return GL_UNSIGNED_SHORT;
+      }
+      else if (format == PIPE_FORMAT_Z24_UNORM_S8_USCALED ||
+               format == PIPE_FORMAT_S8_USCALED_Z24_UNORM ||
+               format == PIPE_FORMAT_Z24X8_UNORM ||
+               format == PIPE_FORMAT_X8Z24_UNORM) {
+         return GL_UNSIGNED_INT_24_8;
+      }
+      else {
+         const GLuint size = format_max_bits(format);
+         if (size == 8) {
+            if (desc->channel[0].type == UTIL_FORMAT_TYPE_UNSIGNED)
+               return GL_UNSIGNED_BYTE;
+            else
+               return GL_BYTE;
+         }
+         else if (size == 16) {
+            if (desc->channel[0].type == UTIL_FORMAT_TYPE_UNSIGNED)
+               return GL_UNSIGNED_SHORT;
+            else
+               return GL_SHORT;
+         }
+         else {
+            assert( size <= 32 );
+            if (desc->channel[0].type == UTIL_FORMAT_TYPE_UNSIGNED)
+               return GL_UNSIGNED_INT;
+            else
+               return GL_INT;
+         }
+      }
+   }
+   else if (format == PIPE_FORMAT_UYVY) {
+      return GL_UNSIGNED_SHORT;
+   }
+   else if (format == PIPE_FORMAT_YUYV) {
+      return GL_UNSIGNED_SHORT;
+   }
+   else {
+      /* probably a compressed format, unsupported anyway */
+      return GL_NONE;
+   }
+}
+
+
+/**
+ * Translate Mesa format to Gallium format.
+ */
+enum pipe_format
+st_mesa_format_to_pipe_format(gl_format mesaFormat)
+{
+   switch (mesaFormat) {
+   case MESA_FORMAT_RGBA8888:
+      return PIPE_FORMAT_A8B8G8R8_UNORM;
+   case MESA_FORMAT_RGBA8888_REV:
+      return PIPE_FORMAT_R8G8B8A8_UNORM;
+   case MESA_FORMAT_ARGB8888:
+      return PIPE_FORMAT_B8G8R8A8_UNORM;
+   case MESA_FORMAT_ARGB8888_REV:
+      return PIPE_FORMAT_A8R8G8B8_UNORM;
+   case MESA_FORMAT_XRGB8888:
+      return PIPE_FORMAT_B8G8R8X8_UNORM;
+   case MESA_FORMAT_XRGB8888_REV:
+      return PIPE_FORMAT_X8R8G8B8_UNORM;
+   case MESA_FORMAT_ARGB1555:
+      return PIPE_FORMAT_B5G5R5A1_UNORM;
+   case MESA_FORMAT_ARGB4444:
+      return PIPE_FORMAT_B4G4R4A4_UNORM;
+   case MESA_FORMAT_RGB565:
+      return PIPE_FORMAT_B5G6R5_UNORM;
+   case MESA_FORMAT_RGB332:
+      return PIPE_FORMAT_B2G3R3_UNORM;
+   case MESA_FORMAT_ARGB2101010:
+      return PIPE_FORMAT_B10G10R10A2_UNORM;
+   case MESA_FORMAT_AL44:
+      return PIPE_FORMAT_L4A4_UNORM;
+   case MESA_FORMAT_AL88:
+      return PIPE_FORMAT_L8A8_UNORM;
+   case MESA_FORMAT_AL1616:
+      return PIPE_FORMAT_L16A16_UNORM;
+   case MESA_FORMAT_A8:
+      return PIPE_FORMAT_A8_UNORM;
+   case MESA_FORMAT_A16:
+      return PIPE_FORMAT_A16_UNORM;
+   case MESA_FORMAT_L8:
+      return PIPE_FORMAT_L8_UNORM;
+   case MESA_FORMAT_L16:
+      return PIPE_FORMAT_L16_UNORM;
+   case MESA_FORMAT_I8:
+      return PIPE_FORMAT_I8_UNORM;
+   case MESA_FORMAT_I16:
+      return PIPE_FORMAT_I16_UNORM;
+   case MESA_FORMAT_Z16:
+      return PIPE_FORMAT_Z16_UNORM;
+   case MESA_FORMAT_Z32:
+      return PIPE_FORMAT_Z32_UNORM;
+   case MESA_FORMAT_Z24_S8:
+      return PIPE_FORMAT_S8_USCALED_Z24_UNORM;
+   case MESA_FORMAT_S8_Z24:
+      return PIPE_FORMAT_Z24_UNORM_S8_USCALED;
+   case MESA_FORMAT_Z24_X8:
+      return PIPE_FORMAT_X8Z24_UNORM;
+   case MESA_FORMAT_X8_Z24:
+      return PIPE_FORMAT_Z24X8_UNORM;
+   case MESA_FORMAT_S8:
+      return PIPE_FORMAT_S8_USCALED;
+   case MESA_FORMAT_YCBCR:
+      return PIPE_FORMAT_UYVY;
+#if FEATURE_texture_s3tc
+   case MESA_FORMAT_RGB_DXT1:
+      return PIPE_FORMAT_DXT1_RGB;
+   case MESA_FORMAT_RGBA_DXT1:
+      return PIPE_FORMAT_DXT1_RGBA;
+   case MESA_FORMAT_RGBA_DXT3:
+      return PIPE_FORMAT_DXT3_RGBA;
+   case MESA_FORMAT_RGBA_DXT5:
+      return PIPE_FORMAT_DXT5_RGBA;
+#if FEATURE_EXT_texture_sRGB
+   case MESA_FORMAT_SRGB_DXT1:
+      return PIPE_FORMAT_DXT1_SRGB;
+   case MESA_FORMAT_SRGBA_DXT1:
+      return PIPE_FORMAT_DXT1_SRGBA;
+   case MESA_FORMAT_SRGBA_DXT3:
+      return PIPE_FORMAT_DXT3_SRGBA;
+   case MESA_FORMAT_SRGBA_DXT5:
+      return PIPE_FORMAT_DXT5_SRGBA;
+#endif
+#endif
+#if FEATURE_EXT_texture_sRGB
+   case MESA_FORMAT_SLA8:
+      return PIPE_FORMAT_L8A8_SRGB;
+   case MESA_FORMAT_SL8:
+      return PIPE_FORMAT_L8_SRGB;
+   case MESA_FORMAT_SRGB8:
+      return PIPE_FORMAT_R8G8B8_SRGB;
+   case MESA_FORMAT_SRGBA8:
+      return PIPE_FORMAT_A8B8G8R8_SRGB;
+   case MESA_FORMAT_SARGB8:
+      return PIPE_FORMAT_B8G8R8A8_SRGB;
+#endif
+   case MESA_FORMAT_R8:
+      return PIPE_FORMAT_R8_UNORM;
+   case MESA_FORMAT_R16:
+      return PIPE_FORMAT_R16_UNORM;
+   case MESA_FORMAT_RG88:
+      return PIPE_FORMAT_R8G8_UNORM;
+   case MESA_FORMAT_RG1616:
+      return PIPE_FORMAT_R16G16_UNORM;
+   case MESA_FORMAT_RGBA_16:
+      return PIPE_FORMAT_R16G16B16A16_UNORM;
+
+   /* signed int formats */
+   case MESA_FORMAT_RGBA_INT8:
+      return PIPE_FORMAT_R8G8B8A8_SSCALED;
+   case MESA_FORMAT_RGBA_INT16:
+      return PIPE_FORMAT_R16G16B16A16_SSCALED;
+   case MESA_FORMAT_RGBA_INT32:
+      return PIPE_FORMAT_R32G32B32A32_SSCALED;
+
+   /* unsigned int formats */
+   case MESA_FORMAT_RGBA_UINT8:
+      return PIPE_FORMAT_R8G8B8A8_USCALED;
+   case MESA_FORMAT_RGBA_UINT16:
+      return PIPE_FORMAT_R16G16B16A16_USCALED;
+   case MESA_FORMAT_RGBA_UINT32:
+      return PIPE_FORMAT_R32G32B32A32_USCALED;
+
+   case MESA_FORMAT_RED_RGTC1:
+      return PIPE_FORMAT_RGTC1_UNORM;
+   case MESA_FORMAT_SIGNED_RED_RGTC1:
+      return PIPE_FORMAT_RGTC1_SNORM;
+   case MESA_FORMAT_RG_RGTC2:
+      return PIPE_FORMAT_RGTC2_UNORM;
+   case MESA_FORMAT_SIGNED_RG_RGTC2:
+      return PIPE_FORMAT_RGTC2_SNORM;
+
+   case MESA_FORMAT_L_LATC1:
+      return PIPE_FORMAT_LATC1_UNORM;
+   case MESA_FORMAT_SIGNED_L_LATC1:
+      return PIPE_FORMAT_LATC1_SNORM;
+   case MESA_FORMAT_LA_LATC2:
+      return PIPE_FORMAT_LATC2_UNORM;
+   case MESA_FORMAT_SIGNED_LA_LATC2:
+      return PIPE_FORMAT_LATC2_SNORM;
+
+   /* signed normalized formats */
+   case MESA_FORMAT_SIGNED_R8:
+      return PIPE_FORMAT_R8_SNORM;
+   case MESA_FORMAT_SIGNED_RG88_REV:
+      return PIPE_FORMAT_R8G8_SNORM;
+   case MESA_FORMAT_SIGNED_RGBA8888_REV:
+      return PIPE_FORMAT_R8G8B8A8_SNORM;
+
+   case MESA_FORMAT_SIGNED_A8:
+      return PIPE_FORMAT_A8_SNORM;
+   case MESA_FORMAT_SIGNED_L8:
+      return PIPE_FORMAT_L8_SNORM;
+   case MESA_FORMAT_SIGNED_AL88:
+      return PIPE_FORMAT_L8A8_SNORM;
+   case MESA_FORMAT_SIGNED_I8:
+      return PIPE_FORMAT_I8_SNORM;
+
+   case MESA_FORMAT_SIGNED_R16:
+      return PIPE_FORMAT_R16_SNORM;
+   case MESA_FORMAT_SIGNED_GR1616:
+      return PIPE_FORMAT_R16G16_SNORM;
+   case MESA_FORMAT_SIGNED_RGBA_16:
+      return PIPE_FORMAT_R16G16B16A16_SNORM;
+
+   case MESA_FORMAT_SIGNED_A16:
+      return PIPE_FORMAT_A16_SNORM;
+   case MESA_FORMAT_SIGNED_L16:
+      return PIPE_FORMAT_L16_SNORM;
+   case MESA_FORMAT_SIGNED_AL1616:
+      return PIPE_FORMAT_L16A16_SNORM;
+   case MESA_FORMAT_SIGNED_I16:
+      return PIPE_FORMAT_I16_SNORM;
+
+   default:
+      assert(0);
+      return PIPE_FORMAT_NONE;
+   }
+}
+
+
+/**
+ * Translate Gallium format to Mesa format.
+ */
+gl_format
+st_pipe_format_to_mesa_format(enum pipe_format format)
+{
+   switch (format) {
+   case PIPE_FORMAT_A8B8G8R8_UNORM:
+      return MESA_FORMAT_RGBA8888;
+   case PIPE_FORMAT_R8G8B8A8_UNORM:
+      return MESA_FORMAT_RGBA8888_REV;
+   case PIPE_FORMAT_B8G8R8A8_UNORM:
+      return MESA_FORMAT_ARGB8888;
+   case PIPE_FORMAT_A8R8G8B8_UNORM:
+      return MESA_FORMAT_ARGB8888_REV;
+   case PIPE_FORMAT_B8G8R8X8_UNORM:
+      return MESA_FORMAT_XRGB8888;
+   case PIPE_FORMAT_X8R8G8B8_UNORM:
+      return MESA_FORMAT_XRGB8888_REV;
+   case PIPE_FORMAT_B5G5R5A1_UNORM:
+      return MESA_FORMAT_ARGB1555;
+   case PIPE_FORMAT_B4G4R4A4_UNORM:
+      return MESA_FORMAT_ARGB4444;
+   case PIPE_FORMAT_B5G6R5_UNORM:
+      return MESA_FORMAT_RGB565;
+   case PIPE_FORMAT_B2G3R3_UNORM:
+      return MESA_FORMAT_RGB332;
+   case PIPE_FORMAT_B10G10R10A2_UNORM:
+      return MESA_FORMAT_ARGB2101010;
+   case PIPE_FORMAT_L4A4_UNORM:
+      return MESA_FORMAT_AL44;
+   case PIPE_FORMAT_L8A8_UNORM:
+      return MESA_FORMAT_AL88;
+   case PIPE_FORMAT_L16A16_UNORM:
+      return MESA_FORMAT_AL1616;
+   case PIPE_FORMAT_A8_UNORM:
+      return MESA_FORMAT_A8;
+   case PIPE_FORMAT_A16_UNORM:
+      return MESA_FORMAT_A16;
+   case PIPE_FORMAT_L8_UNORM:
+      return MESA_FORMAT_L8;
+   case PIPE_FORMAT_L16_UNORM:
+      return MESA_FORMAT_L16;
+   case PIPE_FORMAT_I8_UNORM:
+      return MESA_FORMAT_I8;
+   case PIPE_FORMAT_I16_UNORM:
+      return MESA_FORMAT_I16;
+   case PIPE_FORMAT_S8_USCALED:
+      return MESA_FORMAT_S8;
+
+   case PIPE_FORMAT_R16G16B16A16_UNORM:
+      return MESA_FORMAT_RGBA_16;
+
+   case PIPE_FORMAT_Z16_UNORM:
+      return MESA_FORMAT_Z16;
+   case PIPE_FORMAT_Z32_UNORM:
+      return MESA_FORMAT_Z32;
+   case PIPE_FORMAT_S8_USCALED_Z24_UNORM:
+      return MESA_FORMAT_Z24_S8;
+   case PIPE_FORMAT_X8Z24_UNORM:
+      return MESA_FORMAT_Z24_X8;
+   case PIPE_FORMAT_Z24X8_UNORM:
+      return MESA_FORMAT_X8_Z24;
+   case PIPE_FORMAT_Z24_UNORM_S8_USCALED:
+      return MESA_FORMAT_S8_Z24;
+
+   case PIPE_FORMAT_UYVY:
+      return MESA_FORMAT_YCBCR;
+   case PIPE_FORMAT_YUYV:
+      return MESA_FORMAT_YCBCR_REV;
+
+#if FEATURE_texture_s3tc
+   case PIPE_FORMAT_DXT1_RGB:
+      return MESA_FORMAT_RGB_DXT1;
+   case PIPE_FORMAT_DXT1_RGBA:
+      return MESA_FORMAT_RGBA_DXT1;
+   case PIPE_FORMAT_DXT3_RGBA:
+      return MESA_FORMAT_RGBA_DXT3;
+   case PIPE_FORMAT_DXT5_RGBA:
+      return MESA_FORMAT_RGBA_DXT5;
+#if FEATURE_EXT_texture_sRGB
+   case PIPE_FORMAT_DXT1_SRGB:
+      return MESA_FORMAT_SRGB_DXT1;
+   case PIPE_FORMAT_DXT1_SRGBA:
+      return MESA_FORMAT_SRGBA_DXT1;
+   case PIPE_FORMAT_DXT3_SRGBA:
+      return MESA_FORMAT_SRGBA_DXT3;
+   case PIPE_FORMAT_DXT5_SRGBA:
+      return MESA_FORMAT_SRGBA_DXT5;
+#endif
+#endif
+
+#if FEATURE_EXT_texture_sRGB
+   case PIPE_FORMAT_L8A8_SRGB:
+      return MESA_FORMAT_SLA8;
+   case PIPE_FORMAT_L8_SRGB:
+      return MESA_FORMAT_SL8;
+   case PIPE_FORMAT_R8G8B8_SRGB:
+      return MESA_FORMAT_SRGB8;
+   case PIPE_FORMAT_A8B8G8R8_SRGB:
+      return MESA_FORMAT_SRGBA8;
+   case PIPE_FORMAT_B8G8R8A8_SRGB:
+      return MESA_FORMAT_SARGB8;
+#endif
+
+   case PIPE_FORMAT_R8_UNORM:
+      return MESA_FORMAT_R8;
+   case PIPE_FORMAT_R16_UNORM:
+      return MESA_FORMAT_R16;
+   case PIPE_FORMAT_R8G8_UNORM:
+      return MESA_FORMAT_RG88;
+   case PIPE_FORMAT_R16G16_UNORM:
+      return MESA_FORMAT_RG1616;
+
+   /* signed int formats */
+   case PIPE_FORMAT_R8G8B8A8_SSCALED:
+      return MESA_FORMAT_RGBA_INT8;
+   case PIPE_FORMAT_R16G16B16A16_SSCALED:
+      return MESA_FORMAT_RGBA_INT16;
+   case PIPE_FORMAT_R32G32B32A32_SSCALED:
+      return MESA_FORMAT_RGBA_INT32;
+
+   /* unsigned int formats */
+   case PIPE_FORMAT_R8G8B8A8_USCALED:
+      return MESA_FORMAT_RGBA_UINT8;
+   case PIPE_FORMAT_R16G16B16A16_USCALED:
+      return MESA_FORMAT_RGBA_UINT16;
+   case PIPE_FORMAT_R32G32B32A32_USCALED:
+      return MESA_FORMAT_RGBA_UINT32;
+
+   case PIPE_FORMAT_RGTC1_UNORM:
+      return MESA_FORMAT_RED_RGTC1;
+   case PIPE_FORMAT_RGTC1_SNORM:
+      return MESA_FORMAT_SIGNED_RED_RGTC1;
+   case PIPE_FORMAT_RGTC2_UNORM:
+      return MESA_FORMAT_RG_RGTC2;
+   case PIPE_FORMAT_RGTC2_SNORM:
+      return MESA_FORMAT_SIGNED_RG_RGTC2;
+
+   case PIPE_FORMAT_LATC1_UNORM:
+      return MESA_FORMAT_L_LATC1;
+   case PIPE_FORMAT_LATC1_SNORM:
+      return MESA_FORMAT_SIGNED_L_LATC1;
+   case PIPE_FORMAT_LATC2_UNORM:
+      return MESA_FORMAT_LA_LATC2;
+   case PIPE_FORMAT_LATC2_SNORM:
+      return MESA_FORMAT_SIGNED_LA_LATC2;
+
+   /* signed normalized formats */
+   case PIPE_FORMAT_R8_SNORM:
+      return MESA_FORMAT_SIGNED_R8;
+   case PIPE_FORMAT_R8G8_SNORM:
+      return MESA_FORMAT_SIGNED_RG88_REV;
+   case PIPE_FORMAT_R8G8B8A8_SNORM:
+      return MESA_FORMAT_SIGNED_RGBA8888_REV;
+
+   case PIPE_FORMAT_A8_SNORM:
+      return MESA_FORMAT_SIGNED_A8;
+   case PIPE_FORMAT_L8_SNORM:
+      return MESA_FORMAT_SIGNED_L8;
+   case PIPE_FORMAT_L8A8_SNORM:
+      return MESA_FORMAT_SIGNED_AL88;
+   case PIPE_FORMAT_I8_SNORM:
+      return MESA_FORMAT_SIGNED_I8;
+
+   case PIPE_FORMAT_R16_SNORM:
+      return MESA_FORMAT_SIGNED_R16;
+   case PIPE_FORMAT_R16G16_SNORM:
+      return MESA_FORMAT_SIGNED_GR1616;
+   case PIPE_FORMAT_R16G16B16A16_SNORM:
+      return MESA_FORMAT_SIGNED_RGBA_16;
+
+   case PIPE_FORMAT_A16_SNORM:
+      return MESA_FORMAT_SIGNED_A16;
+   case PIPE_FORMAT_L16_SNORM:
+      return MESA_FORMAT_SIGNED_L16;
+   case PIPE_FORMAT_L16A16_SNORM:
+      return MESA_FORMAT_SIGNED_AL1616;
+   case PIPE_FORMAT_I16_SNORM:
+      return MESA_FORMAT_SIGNED_I16;
+
+   default:
+      assert(0);
+      return MESA_FORMAT_NONE;
+   }
+}
+
+
+/**
+ * Return first supported format from the given list.
+ */
+static enum pipe_format
+find_supported_format(struct pipe_screen *screen, 
+                      const enum pipe_format formats[],
+                      uint num_formats,
+                      enum pipe_texture_target target,
+                      unsigned sample_count,
+                      unsigned tex_usage)
+{
+   uint i;
+   for (i = 0; i < num_formats; i++) {
+      if (screen->is_format_supported(screen, formats[i], target,
+                                      sample_count, tex_usage)) {
+         return formats[i];
+      }
+   }
+   return PIPE_FORMAT_NONE;
+}
+
+
+/**
+ * Find an RGBA format supported by the context/winsys.
+ */
+static enum pipe_format
+default_rgba_format(struct pipe_screen *screen, 
+                    enum pipe_texture_target target,
+                    unsigned sample_count,
+                    unsigned tex_usage)
+{
+   static const enum pipe_format colorFormats[] = {
+      PIPE_FORMAT_B8G8R8A8_UNORM,
+      PIPE_FORMAT_A8R8G8B8_UNORM,
+      PIPE_FORMAT_A8B8G8R8_UNORM,
+      PIPE_FORMAT_B5G6R5_UNORM
+   };
+   return find_supported_format(screen, colorFormats, Elements(colorFormats),
+                                target, sample_count, tex_usage);
+}
+
+
+/**
+ * Find an RGB format supported by the context/winsys.
+ */
+static enum pipe_format
+default_rgb_format(struct pipe_screen *screen, 
+                   enum pipe_texture_target target,
+                   unsigned sample_count,
+                   unsigned tex_usage)
+{
+   static const enum pipe_format colorFormats[] = {
+      PIPE_FORMAT_B8G8R8X8_UNORM,
+      PIPE_FORMAT_X8R8G8B8_UNORM,
+      PIPE_FORMAT_X8B8G8R8_UNORM,
+      PIPE_FORMAT_B8G8R8A8_UNORM,
+      PIPE_FORMAT_A8R8G8B8_UNORM,
+      PIPE_FORMAT_A8B8G8R8_UNORM,
+      PIPE_FORMAT_B5G6R5_UNORM
+   };
+   return find_supported_format(screen, colorFormats, Elements(colorFormats),
+                                target, sample_count, tex_usage);
+}
+
+/**
+ * Find an sRGBA format supported by the context/winsys.
+ */
+static enum pipe_format
+default_srgba_format(struct pipe_screen *screen, 
+                    enum pipe_texture_target target,
+                    unsigned sample_count,
+                    unsigned tex_usage)
+{
+   static const enum pipe_format colorFormats[] = {
+      PIPE_FORMAT_B8G8R8A8_SRGB,
+      PIPE_FORMAT_A8R8G8B8_SRGB,
+      PIPE_FORMAT_A8B8G8R8_SRGB,
+   };
+   return find_supported_format(screen, colorFormats, Elements(colorFormats),
+                                target, sample_count, tex_usage);
+}
+
+
+/**
+ * Given an OpenGL internalFormat value for a texture or surface, return
+ * the best matching PIPE_FORMAT_x, or PIPE_FORMAT_NONE if there's no match.
+ * This is called during glTexImage2D, for example.
+ *
+ * The bindings parameter typically has PIPE_BIND_SAMPLER_VIEW set, plus
+ * either PIPE_BINDING_RENDER_TARGET or PIPE_BINDING_DEPTH_STENCIL if
+ * we want render-to-texture ability.
+ *
+ * \param internalFormat  the user value passed to glTexImage2D
+ * \param target  one of PIPE_TEXTURE_x
+ * \param bindings  bitmask of PIPE_BIND_x flags.
+ */
+enum pipe_format
+st_choose_format(struct pipe_screen *screen, GLenum internalFormat,
+                 enum pipe_texture_target target, unsigned sample_count,
+                 unsigned bindings)
+{
+
+   switch (internalFormat) {
+   case GL_RGB10:
+   case GL_RGB10_A2:
+      if (screen->is_format_supported( screen, PIPE_FORMAT_B10G10R10A2_UNORM,
+                                       target, sample_count, bindings))
+         return PIPE_FORMAT_B10G10R10A2_UNORM;
+      /* Pass through. */
+   case 4:
+   case GL_RGBA:
+   case GL_RGBA8:
+      return default_rgba_format( screen, target, sample_count, bindings);
+
+   case GL_BGRA:
+      if (screen->is_format_supported( screen, PIPE_FORMAT_B8G8R8A8_UNORM,
+                                       target, sample_count, bindings))
+         return PIPE_FORMAT_B8G8R8A8_UNORM;
+      return default_rgba_format( screen, target, sample_count, bindings);
+
+   case 3:
+   case GL_RGB:
+   case GL_RGB8:
+      return default_rgb_format( screen, target, sample_count, bindings);
+
+   case GL_RGB12:
+   case GL_RGB16:
+   case GL_RGBA12:
+   case GL_RGBA16:
+      if (screen->is_format_supported( screen, PIPE_FORMAT_R16G16B16A16_UNORM,
+                                             target, sample_count, bindings))
+         return PIPE_FORMAT_R16G16B16A16_UNORM;
+      return default_rgba_format( screen, target, sample_count, bindings);
+
+   case GL_RGBA4:
+   case GL_RGBA2:
+      if (screen->is_format_supported( screen, PIPE_FORMAT_B4G4R4A4_UNORM,
+                                       target, sample_count, bindings))
+         return PIPE_FORMAT_B4G4R4A4_UNORM;
+      return default_rgba_format( screen, target, sample_count, bindings);
+
+   case GL_RGB5_A1:
+      if (screen->is_format_supported( screen, PIPE_FORMAT_B5G5R5A1_UNORM,
+                                       target, sample_count, bindings))
+         return PIPE_FORMAT_B5G5R5A1_UNORM;
+      return default_rgba_format( screen, target, sample_count, bindings);
+
+   case GL_R3_G3_B2:
+      if (screen->is_format_supported( screen, PIPE_FORMAT_B2G3R3_UNORM,
+                                       target, sample_count, bindings))
+         return PIPE_FORMAT_B2G3R3_UNORM;
+      /* Pass through. */
+   case GL_RGB5:
+   case GL_RGB4:
+      if (screen->is_format_supported( screen, PIPE_FORMAT_B5G6R5_UNORM,
+                                       target, sample_count, bindings))
+         return PIPE_FORMAT_B5G6R5_UNORM;
+      if (screen->is_format_supported( screen, PIPE_FORMAT_B5G5R5A1_UNORM,
+                                       target, sample_count, bindings))
+         return PIPE_FORMAT_B5G5R5A1_UNORM;
+      return default_rgba_format( screen, target, sample_count, bindings);
+
+   case GL_ALPHA12:
+   case GL_ALPHA16:
+      if (screen->is_format_supported( screen, PIPE_FORMAT_A16_UNORM, target,
+                                       sample_count, bindings))
+         return PIPE_FORMAT_A16_UNORM;
+      /* Pass through. */
+   case GL_ALPHA:
+   case GL_ALPHA4:
+   case GL_ALPHA8:
+   case GL_COMPRESSED_ALPHA:
+      if (screen->is_format_supported( screen, PIPE_FORMAT_A8_UNORM, target,
+                                       sample_count, bindings))
+         return PIPE_FORMAT_A8_UNORM;
+      return default_rgba_format( screen, target, sample_count, bindings);
+
+   case GL_LUMINANCE12:
+   case GL_LUMINANCE16:
+      if (screen->is_format_supported( screen, PIPE_FORMAT_L16_UNORM, target,
+                                       sample_count, bindings))
+         return PIPE_FORMAT_L16_UNORM;
+      /* Pass through. */
+   case 1:
+   case GL_LUMINANCE:
+   case GL_LUMINANCE4:
+   case GL_LUMINANCE8:
+      if (screen->is_format_supported( screen, PIPE_FORMAT_L8_UNORM, target,
+                                       sample_count, bindings))
+         return PIPE_FORMAT_L8_UNORM;
+      return default_rgba_format( screen, target, sample_count, bindings);
+
+   case GL_LUMINANCE12_ALPHA4:
+   case GL_LUMINANCE12_ALPHA12:
+   case GL_LUMINANCE16_ALPHA16:
+      if (screen->is_format_supported( screen, PIPE_FORMAT_L16A16_UNORM, target,
+                                       sample_count, bindings))
+         return PIPE_FORMAT_L16A16_UNORM;
+      /* Pass through. */
+   case 2:
+   case GL_LUMINANCE_ALPHA:
+   case GL_LUMINANCE6_ALPHA2:
+   case GL_LUMINANCE8_ALPHA8:
+      if (screen->is_format_supported( screen, PIPE_FORMAT_L8A8_UNORM, target,
+                                       sample_count, bindings))
+         return PIPE_FORMAT_L8A8_UNORM;
+      return default_rgba_format( screen, target, sample_count, bindings);
+
+   case GL_LUMINANCE4_ALPHA4:
+      if (screen->is_format_supported( screen, PIPE_FORMAT_L4A4_UNORM, target,
+                                       sample_count, bindings))
+         return PIPE_FORMAT_L4A4_UNORM;
+      if (screen->is_format_supported( screen, PIPE_FORMAT_L8A8_UNORM, target,
+                                       sample_count, bindings))
+         return PIPE_FORMAT_L8A8_UNORM;
+      return default_rgba_format( screen, target, sample_count, bindings);
+
+   case GL_INTENSITY12:
+   case GL_INTENSITY16:
+      if (screen->is_format_supported( screen, PIPE_FORMAT_I16_UNORM, target,
+                                       sample_count, bindings))
+         return PIPE_FORMAT_I16_UNORM;
+      /* Pass through. */
+   case GL_INTENSITY:
+   case GL_INTENSITY4:
+   case GL_INTENSITY8:
+   case GL_COMPRESSED_INTENSITY:
+      if (screen->is_format_supported( screen, PIPE_FORMAT_I8_UNORM, target,
+                                       sample_count, bindings))
+         return PIPE_FORMAT_I8_UNORM;
+      return default_rgba_format( screen, target, sample_count, bindings);
+
+   case GL_YCBCR_MESA:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_UYVY, target,
+                                      sample_count, bindings)) {
+         return PIPE_FORMAT_UYVY;
+      }
+      if (screen->is_format_supported(screen, PIPE_FORMAT_YUYV, target,
+                                      sample_count, bindings)) {
+         return PIPE_FORMAT_YUYV;
+      }
+      return PIPE_FORMAT_NONE;
+
+   case GL_COMPRESSED_RGB:
+      /* can only sample from compressed formats */
+      if (bindings & ~PIPE_BIND_SAMPLER_VIEW)
+         return PIPE_FORMAT_NONE;
+      else if (screen->is_format_supported(screen, PIPE_FORMAT_DXT1_RGB,
+                                           target, sample_count, bindings))
+         return PIPE_FORMAT_DXT1_RGB;
+      else
+         return default_rgb_format(screen, target, sample_count, bindings);
+
+   case GL_COMPRESSED_RGBA:
+      /* can only sample from compressed formats */
+      if (bindings & ~PIPE_BIND_SAMPLER_VIEW)
+         return PIPE_FORMAT_NONE;
+      else if (screen->is_format_supported(screen, PIPE_FORMAT_DXT3_RGBA,
+                                           target, sample_count, bindings))
+         return PIPE_FORMAT_DXT3_RGBA;
+      else
+         return default_rgba_format(screen, target, sample_count, bindings);
+
+   case GL_RGB_S3TC:
+   case GL_RGB4_S3TC:
+   case GL_COMPRESSED_RGB_S3TC_DXT1_EXT:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_DXT1_RGB,
+                                      target, sample_count, bindings))
+         return PIPE_FORMAT_DXT1_RGB;
+      else
+         return PIPE_FORMAT_NONE;
+
+   case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_DXT1_RGBA,
+                                      target, sample_count, bindings))
+         return PIPE_FORMAT_DXT1_RGBA;
+      else
+         return PIPE_FORMAT_NONE;
+
+   case GL_RGBA_S3TC:
+   case GL_RGBA4_S3TC:
+   case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_DXT3_RGBA,
+                                      target, sample_count, bindings))
+         return PIPE_FORMAT_DXT3_RGBA;
+      else
+         return PIPE_FORMAT_NONE;
+
+   case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_DXT5_RGBA,
+                                      target, sample_count, bindings))
+         return PIPE_FORMAT_DXT5_RGBA;
+      else
+         return PIPE_FORMAT_NONE;
+
+#if 0
+   case GL_COMPRESSED_RGB_FXT1_3DFX:
+      return PIPE_FORMAT_RGB_FXT1;
+   case GL_COMPRESSED_RGBA_FXT1_3DFX:
+      return PIPE_FORMAT_RGB_FXT1;
+#endif
+
+   case GL_DEPTH_COMPONENT16:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_Z16_UNORM, target,
+                                      sample_count, bindings))
+         return PIPE_FORMAT_Z16_UNORM;
+      /* fall-through */
+   case GL_DEPTH_COMPONENT24:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_Z24_UNORM_S8_USCALED,
+                                      target, sample_count, bindings))
+         return PIPE_FORMAT_Z24_UNORM_S8_USCALED;
+      if (screen->is_format_supported(screen, PIPE_FORMAT_S8_USCALED_Z24_UNORM,
+                                      target, sample_count, bindings))
+         return PIPE_FORMAT_S8_USCALED_Z24_UNORM;
+      /* fall-through */
+   case GL_DEPTH_COMPONENT32:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_Z32_UNORM, target,
+                                      sample_count, bindings))
+         return PIPE_FORMAT_Z32_UNORM;
+      /* fall-through */
+   case GL_DEPTH_COMPONENT:
+      {
+         static const enum pipe_format formats[] = {
+            PIPE_FORMAT_Z32_UNORM,
+            PIPE_FORMAT_Z24_UNORM_S8_USCALED,
+            PIPE_FORMAT_S8_USCALED_Z24_UNORM,
+            PIPE_FORMAT_Z16_UNORM
+         };
+         return find_supported_format(screen, formats, Elements(formats),
+                                      target, sample_count, bindings);
+      }
+
+   case GL_STENCIL_INDEX:
+   case GL_STENCIL_INDEX1_EXT:
+   case GL_STENCIL_INDEX4_EXT:
+   case GL_STENCIL_INDEX8_EXT:
+   case GL_STENCIL_INDEX16_EXT:
+      {
+         static const enum pipe_format formats[] = {
+            PIPE_FORMAT_S8_USCALED,
+            PIPE_FORMAT_Z24_UNORM_S8_USCALED,
+            PIPE_FORMAT_S8_USCALED_Z24_UNORM
+         };
+         return find_supported_format(screen, formats, Elements(formats),
+                                      target, sample_count, bindings);
+      }
+
+   case GL_DEPTH_STENCIL_EXT:
+   case GL_DEPTH24_STENCIL8_EXT:
+      {
+         static const enum pipe_format formats[] = {
+            PIPE_FORMAT_Z24_UNORM_S8_USCALED,
+            PIPE_FORMAT_S8_USCALED_Z24_UNORM
+         };
+         return find_supported_format(screen, formats, Elements(formats),
+                                      target, sample_count, bindings);
+      }
+
+   case GL_SRGB_EXT:
+   case GL_SRGB8_EXT:
+   case GL_SRGB_ALPHA_EXT:
+   case GL_SRGB8_ALPHA8_EXT:
+      return default_srgba_format( screen, target, sample_count, bindings);
+
+   case GL_COMPRESSED_SRGB_EXT:
+   case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_DXT1_SRGB, target,
+                                      sample_count, bindings))
+         return PIPE_FORMAT_DXT1_SRGB;
+      return default_srgba_format( screen, target, sample_count, bindings);
+
+   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT:
+      return PIPE_FORMAT_DXT1_SRGBA;
+
+   case GL_COMPRESSED_SRGB_ALPHA_EXT:
+   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_DXT3_SRGBA, target,
+                                      sample_count, bindings))
+         return PIPE_FORMAT_DXT3_SRGBA;
+      return default_srgba_format( screen, target, sample_count, bindings);
+
+   case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT:
+      return PIPE_FORMAT_DXT5_SRGBA;
+
+   case GL_SLUMINANCE_ALPHA_EXT:
+   case GL_SLUMINANCE8_ALPHA8_EXT:
+   case GL_COMPRESSED_SLUMINANCE_EXT:
+   case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_L8A8_SRGB, target,
+                                      sample_count, bindings))
+         return PIPE_FORMAT_L8A8_SRGB;
+      return default_srgba_format( screen, target, sample_count, bindings);
+
+   case GL_SLUMINANCE_EXT:
+   case GL_SLUMINANCE8_EXT:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_L8_SRGB, target,
+                                      sample_count, bindings))
+         return PIPE_FORMAT_L8_SRGB;
+      return default_srgba_format( screen, target, sample_count, bindings);
+
+   case GL_RED:
+   case GL_R8:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_R8_UNORM, target,
+                                      sample_count, bindings))
+	      return PIPE_FORMAT_R8_UNORM;
+      return PIPE_FORMAT_NONE;
+   case GL_RG:
+   case GL_RG8:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8_UNORM, target,
+                                      sample_count, bindings))
+	      return PIPE_FORMAT_R8G8_UNORM;
+      return PIPE_FORMAT_NONE;
+
+   case GL_R16:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_R16_UNORM, target,
+                                      sample_count, bindings))
+	      return PIPE_FORMAT_R16_UNORM;
+      return PIPE_FORMAT_NONE;
+
+   case GL_RG16:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_R16G16_UNORM, target,
+                                      sample_count, bindings))
+	      return PIPE_FORMAT_R16G16_UNORM;
+      return PIPE_FORMAT_NONE;
+
+   case GL_COMPRESSED_RED:
+   case GL_COMPRESSED_RED_RGTC1:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC1_UNORM, target,
+                                      sample_count, bindings))
+	      return PIPE_FORMAT_RGTC1_UNORM;
+      if (screen->is_format_supported(screen, PIPE_FORMAT_R8_UNORM, target,
+                                      sample_count, bindings))
+	      return PIPE_FORMAT_R8_UNORM;
+      return PIPE_FORMAT_NONE;
+
+   case GL_COMPRESSED_SIGNED_RED_RGTC1:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC1_SNORM, target,
+                                      sample_count, bindings))
+	      return PIPE_FORMAT_RGTC1_SNORM;
+      return PIPE_FORMAT_NONE;
+
+   case GL_COMPRESSED_RG:
+   case GL_COMPRESSED_RG_RGTC2:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC2_UNORM, target,
+                                      sample_count, bindings))
+	      return PIPE_FORMAT_RGTC2_UNORM;
+      if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8_UNORM, target,
+                                      sample_count, bindings))
+	      return PIPE_FORMAT_R8G8_UNORM;
+      return PIPE_FORMAT_NONE;
+
+   case GL_COMPRESSED_SIGNED_RG_RGTC2:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_RGTC2_SNORM, target,
+                                      sample_count, bindings))
+	      return PIPE_FORMAT_RGTC2_SNORM;
+      return PIPE_FORMAT_NONE;
+
+   case GL_COMPRESSED_LUMINANCE:
+   case GL_COMPRESSED_LUMINANCE_LATC1_EXT:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_LATC1_UNORM, target,
+                                      sample_count, bindings))
+              return PIPE_FORMAT_LATC1_UNORM;
+      if (screen->is_format_supported(screen, PIPE_FORMAT_L8_UNORM, target,
+                                      sample_count, bindings))
+              return PIPE_FORMAT_L8_UNORM;
+      return PIPE_FORMAT_NONE;
+
+   case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_LATC1_SNORM, target,
+                                      sample_count, bindings))
+              return PIPE_FORMAT_LATC1_SNORM;
+      return PIPE_FORMAT_NONE;
+
+   case GL_COMPRESSED_LUMINANCE_ALPHA:
+   case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT:
+   case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_LATC2_UNORM, target,
+                                      sample_count, bindings))
+              return PIPE_FORMAT_LATC2_UNORM;
+      if (screen->is_format_supported(screen, PIPE_FORMAT_L8A8_UNORM, target,
+                                      sample_count, bindings))
+              return PIPE_FORMAT_L8A8_UNORM;
+      return PIPE_FORMAT_NONE;
+
+   case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_LATC2_SNORM, target,
+                                      sample_count, bindings))
+              return PIPE_FORMAT_LATC2_SNORM;
+      return PIPE_FORMAT_NONE;
+
+   /* signed/unsigned integer formats.
+    * XXX Mesa only has formats for RGBA signed/unsigned integer formats.
+    * If/when new formats are added this code should be updated.
+    */
+   case GL_RED_INTEGER_EXT:
+   case GL_GREEN_INTEGER_EXT:
+   case GL_BLUE_INTEGER_EXT:
+   case GL_ALPHA_INTEGER_EXT:
+   case GL_RGB_INTEGER_EXT:
+   case GL_RGBA_INTEGER_EXT:
+   case GL_BGR_INTEGER_EXT:
+   case GL_BGRA_INTEGER_EXT:
+   case GL_LUMINANCE_INTEGER_EXT:
+   case GL_LUMINANCE_ALPHA_INTEGER_EXT:
+      /* fall-through */
+   case GL_RGBA8I_EXT:
+   case GL_RGB8I_EXT:
+   case GL_ALPHA8I_EXT:
+   case GL_INTENSITY8I_EXT:
+   case GL_LUMINANCE8I_EXT:
+   case GL_LUMINANCE_ALPHA8I_EXT:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8B8A8_SSCALED,
+                                      target,
+                                      sample_count, bindings))
+         return PIPE_FORMAT_R8G8B8A8_SSCALED;
+      return PIPE_FORMAT_NONE;
+   case GL_RGBA16I_EXT:
+   case GL_RGB16I_EXT:
+   case GL_ALPHA16I_EXT:
+   case GL_INTENSITY16I_EXT:
+   case GL_LUMINANCE16I_EXT:
+   case GL_LUMINANCE_ALPHA16I_EXT:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_R16G16B16A16_SSCALED,
+                                      target,
+                                      sample_count, bindings))
+         return PIPE_FORMAT_R16G16B16A16_SSCALED;
+      return PIPE_FORMAT_NONE;
+   case GL_RGBA32I_EXT:
+   case GL_RGB32I_EXT:
+   case GL_ALPHA32I_EXT:
+   case GL_INTENSITY32I_EXT:
+   case GL_LUMINANCE32I_EXT:
+   case GL_LUMINANCE_ALPHA32I_EXT:
+      /* xxx */
+      if (screen->is_format_supported(screen, PIPE_FORMAT_R32G32B32A32_SSCALED,
+                                      target,
+                                      sample_count, bindings))
+         return PIPE_FORMAT_R32G32B32A32_SSCALED;
+      return PIPE_FORMAT_NONE;
+
+   case GL_RGBA8UI_EXT:
+   case GL_RGB8UI_EXT:
+   case GL_ALPHA8UI_EXT:
+   case GL_INTENSITY8UI_EXT:
+   case GL_LUMINANCE8UI_EXT:
+   case GL_LUMINANCE_ALPHA8UI_EXT:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8B8A8_USCALED,
+                                      target,
+                                      sample_count, bindings))
+         return PIPE_FORMAT_R8G8B8A8_USCALED;
+      return PIPE_FORMAT_NONE;
+
+   case GL_RGBA16UI_EXT:
+   case GL_RGB16UI_EXT:
+   case GL_ALPHA16UI_EXT:
+   case GL_INTENSITY16UI_EXT:
+   case GL_LUMINANCE16UI_EXT:
+   case GL_LUMINANCE_ALPHA16UI_EXT:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_R16G16B16A16_USCALED,
+                                      target,
+                                      sample_count, bindings))
+         return PIPE_FORMAT_R16G16B16A16_USCALED;
+      return PIPE_FORMAT_NONE;
+
+   case GL_RGBA32UI_EXT:
+   case GL_RGB32UI_EXT:
+   case GL_ALPHA32UI_EXT:
+   case GL_INTENSITY32UI_EXT:
+   case GL_LUMINANCE32UI_EXT:
+   case GL_LUMINANCE_ALPHA32UI_EXT:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_R32G32B32A32_USCALED,
+                                      target,
+                                      sample_count, bindings))
+         return PIPE_FORMAT_R32G32B32A32_USCALED;
+      return PIPE_FORMAT_NONE;
+
+   /* signed normalized formats */
+   case GL_RED_SNORM:
+   case GL_R8_SNORM:
+      {
+         static const enum pipe_format formats[] = {
+            PIPE_FORMAT_R8_SNORM,
+            PIPE_FORMAT_R8G8_SNORM,
+            PIPE_FORMAT_R8G8B8A8_SNORM,
+         };
+         return find_supported_format(screen, formats, Elements(formats),
+               target, sample_count, bindings);
+      }
+
+   case GL_R16_SNORM:
+      {
+         static const enum pipe_format formats[] = {
+            PIPE_FORMAT_R16_SNORM,
+            PIPE_FORMAT_R16G16_SNORM,
+            PIPE_FORMAT_R16G16B16A16_SNORM,
+            PIPE_FORMAT_R8_SNORM,
+            PIPE_FORMAT_R8G8_SNORM,
+            PIPE_FORMAT_R8G8B8A8_SNORM,
+         };
+         return find_supported_format(screen, formats, Elements(formats),
+               target, sample_count, bindings);
+      }
+
+   case GL_RG_SNORM:
+   case GL_RG8_SNORM:
+      {
+         static const enum pipe_format formats[] = {
+            PIPE_FORMAT_R8G8_SNORM,
+            PIPE_FORMAT_R8G8B8A8_SNORM,
+         };
+         return find_supported_format(screen, formats, Elements(formats),
+               target, sample_count, bindings);
+      }
+
+   case GL_RG16_SNORM:
+      {
+         static const enum pipe_format formats[] = {
+            PIPE_FORMAT_R16G16_SNORM,
+            PIPE_FORMAT_R16G16B16A16_SNORM,
+            PIPE_FORMAT_R8G8_SNORM,
+            PIPE_FORMAT_R8G8B8A8_SNORM,
+         };
+         return find_supported_format(screen, formats, Elements(formats),
+               target, sample_count, bindings);
+      }
+
+   case GL_RGB_SNORM:
+   case GL_RGB8_SNORM:
+   case GL_RGBA_SNORM:
+   case GL_RGBA8_SNORM:
+      if (screen->is_format_supported(screen, PIPE_FORMAT_R8G8B8A8_SNORM,
+                                      target,
+                                      sample_count, bindings))
+         return PIPE_FORMAT_R8G8B8A8_SNORM;
+      return PIPE_FORMAT_NONE;
+
+   case GL_RGB16_SNORM:
+   case GL_RGBA16_SNORM:
+      {
+         static const enum pipe_format formats[] = {
+            PIPE_FORMAT_R16G16B16A16_SNORM,
+            PIPE_FORMAT_R8G8B8A8_SNORM,
+         };
+         return find_supported_format(screen, formats, Elements(formats),
+               target, sample_count, bindings);
+      }
+
+
+   case GL_ALPHA_SNORM:
+   case GL_ALPHA8_SNORM:
+      {
+         static const enum pipe_format formats[] = {
+            PIPE_FORMAT_A8_SNORM,
+            PIPE_FORMAT_R8G8B8A8_SNORM,
+         };
+         return find_supported_format(screen, formats, Elements(formats),
+               target, sample_count, bindings);
+      }
+
+   case GL_ALPHA16_SNORM:
+      {
+         static const enum pipe_format formats[] = {
+            PIPE_FORMAT_A16_SNORM,
+            PIPE_FORMAT_R16G16B16A16_SNORM,
+            PIPE_FORMAT_A8_SNORM,
+            PIPE_FORMAT_R8G8B8A8_SNORM,
+         };
+         return find_supported_format(screen, formats, Elements(formats),
+               target, sample_count, bindings);
+      }
+
+   case GL_LUMINANCE_SNORM:
+   case GL_LUMINANCE8_SNORM:
+      {
+         static const enum pipe_format formats[] = {
+            PIPE_FORMAT_L8_SNORM,
+            PIPE_FORMAT_R8G8B8A8_SNORM,
+         };
+         return find_supported_format(screen, formats, Elements(formats),
+               target, sample_count, bindings);
+      }
+
+   case GL_LUMINANCE16_SNORM:
+      {
+         static const enum pipe_format formats[] = {
+            PIPE_FORMAT_L16_SNORM,
+            PIPE_FORMAT_R16G16B16A16_SNORM,
+            PIPE_FORMAT_L8_SNORM,
+            PIPE_FORMAT_R8G8B8A8_SNORM,
+         };
+         return find_supported_format(screen, formats, Elements(formats),
+               target, sample_count, bindings);
+      }
+
+   case GL_LUMINANCE_ALPHA_SNORM:
+   case GL_LUMINANCE8_ALPHA8_SNORM:
+      {
+         static const enum pipe_format formats[] = {
+            PIPE_FORMAT_L8A8_SNORM,
+            PIPE_FORMAT_R8G8B8A8_SNORM,
+         };
+         return find_supported_format(screen, formats, Elements(formats),
+               target, sample_count, bindings);
+      }
+
+   case GL_LUMINANCE16_ALPHA16_SNORM:
+      {
+         static const enum pipe_format formats[] = {
+            PIPE_FORMAT_L16A16_SNORM,
+            PIPE_FORMAT_R16G16B16A16_SNORM,
+            PIPE_FORMAT_L8A8_SNORM,
+            PIPE_FORMAT_R8G8B8A8_SNORM,
+         };
+         return find_supported_format(screen, formats, Elements(formats),
+               target, sample_count, bindings);
+      }
+
+   case GL_INTENSITY_SNORM:
+   case GL_INTENSITY8_SNORM:
+      {
+         static const enum pipe_format formats[] = {
+            PIPE_FORMAT_I8_SNORM,
+            PIPE_FORMAT_R8G8B8A8_SNORM,
+         };
+         return find_supported_format(screen, formats, Elements(formats),
+               target, sample_count, bindings);
+      }
+
+   case GL_INTENSITY16_SNORM:
+      {
+         static const enum pipe_format formats[] = {
+            PIPE_FORMAT_I16_SNORM,
+            PIPE_FORMAT_R16G16B16A16_SNORM,
+            PIPE_FORMAT_I8_SNORM,
+            PIPE_FORMAT_R8G8B8A8_SNORM,
+         };
+         return find_supported_format(screen, formats, Elements(formats),
+               target, sample_count, bindings);
+      }
+
+   default:
+      return PIPE_FORMAT_NONE;
+   }
+}
+
+
+/**
+ * Called by FBO code to choose a PIPE_FORMAT_ for drawing surfaces.
+ */
+enum pipe_format
+st_choose_renderbuffer_format(struct pipe_screen *screen,
+                              GLenum internalFormat, unsigned sample_count)
+{
+   uint usage;
+   if (_mesa_is_depth_or_stencil_format(internalFormat))
+      usage = PIPE_BIND_DEPTH_STENCIL;
+   else
+      usage = PIPE_BIND_RENDER_TARGET;
+   return st_choose_format(screen, internalFormat, PIPE_TEXTURE_2D,
+                           sample_count, usage);
+}
+
+
+/**
+ * Called via ctx->Driver.chooseTextureFormat().
+ */
+gl_format
+st_ChooseTextureFormat_renderable(struct gl_context *ctx, GLint internalFormat,
+				  GLenum format, GLenum type, GLboolean renderable)
+{
+   struct pipe_screen *screen = st_context(ctx)->pipe->screen;
+   enum pipe_format pFormat;
+   uint bindings;
+
+   (void) format;
+   (void) type;
+
+   /* GL textures may wind up being render targets, but we don't know
+    * that in advance.  Specify potential render target flags now.
+    */
+   bindings = PIPE_BIND_SAMPLER_VIEW;
+   if (renderable == GL_TRUE) {
+      if (_mesa_is_depth_format(internalFormat) ||
+	  _mesa_is_depth_or_stencil_format(internalFormat))
+	 bindings |= PIPE_BIND_DEPTH_STENCIL;
+      else 
+	 bindings |= PIPE_BIND_RENDER_TARGET;
+   }
+
+   pFormat = st_choose_format(screen, internalFormat,
+                              PIPE_TEXTURE_2D, 0, bindings);
+
+   if (pFormat == PIPE_FORMAT_NONE) {
+      /* try choosing format again, this time without render target bindings */
+      pFormat = st_choose_format(screen, internalFormat,
+                                 PIPE_TEXTURE_2D, 0, PIPE_BIND_SAMPLER_VIEW);
+   }
+
+   if (pFormat == PIPE_FORMAT_NONE) {
+      /* no luck at all */
+      return MESA_FORMAT_NONE;
+   }
+
+   return st_pipe_format_to_mesa_format(pFormat);
+}
+
+gl_format
+st_ChooseTextureFormat(struct gl_context *ctx, GLint internalFormat,
+                       GLenum format, GLenum type)
+{
+   boolean want_renderable =
+      internalFormat == 3 || internalFormat == 4 ||
+      internalFormat == GL_RGB || internalFormat == GL_RGBA ||
+      internalFormat == GL_RGB8 || internalFormat == GL_RGBA8 ||
+      internalFormat == GL_BGRA;
+
+   return st_ChooseTextureFormat_renderable(ctx, internalFormat,
+					    format, type, want_renderable);
+}
+
+/**
+ * Test if a gallium format is equivalent to a GL format/type.
+ */
+GLboolean
+st_equal_formats(enum pipe_format pFormat, GLenum format, GLenum type)
+{
+   switch (pFormat) {
+   case PIPE_FORMAT_A8B8G8R8_UNORM:
+      return format == GL_RGBA && type == GL_UNSIGNED_BYTE;
+   case PIPE_FORMAT_A8R8G8B8_UNORM:
+      return format == GL_BGRA && type == GL_UNSIGNED_BYTE;
+   case PIPE_FORMAT_B5G6R5_UNORM:
+      return format == GL_RGB && type == GL_UNSIGNED_SHORT_5_6_5;
+   /* XXX more combos... */
+   default:
+      return GL_FALSE;
+   }
+}
+
+GLboolean
+st_sampler_compat_formats(enum pipe_format format1, enum pipe_format format2)
+{
+   if (format1 == format2)
+      return GL_TRUE;
+
+   if (format1 == PIPE_FORMAT_B8G8R8A8_UNORM &&
+       format2 == PIPE_FORMAT_B8G8R8X8_UNORM)
+      return GL_TRUE;
+
+   if (format1 == PIPE_FORMAT_B8G8R8X8_UNORM &&
+       format2 == PIPE_FORMAT_B8G8R8A8_UNORM)
+      return GL_TRUE;
+
+   if (format1 == PIPE_FORMAT_A8B8G8R8_UNORM &&
+       format2 == PIPE_FORMAT_X8B8G8R8_UNORM)
+      return GL_TRUE;
+
+   if (format1 == PIPE_FORMAT_X8B8G8R8_UNORM &&
+       format2 == PIPE_FORMAT_A8B8G8R8_UNORM)
+      return GL_TRUE;
+
+   if (format1 == PIPE_FORMAT_A8R8G8B8_UNORM &&
+       format2 == PIPE_FORMAT_X8R8G8B8_UNORM)
+      return GL_TRUE;
+
+   if (format1 == PIPE_FORMAT_X8R8G8B8_UNORM &&
+       format2 == PIPE_FORMAT_A8R8G8B8_UNORM)
+      return GL_TRUE;
+
+   return GL_FALSE;
+}
+
+
+
+/**
+ * This is used for translating texture border color and the clear
+ * color.  For example, the clear color is interpreted according to
+ * the renderbuffer's base format.  For example, if clearing a
+ * GL_LUMINANCE buffer, ClearColor[0] = luminance and ClearColor[1] =
+ * alpha.  Similarly for texture border colors.
+ */
+void
+st_translate_color(const GLfloat colorIn[4], GLenum baseFormat,
+                   GLfloat colorOut[4])
+{
+   switch (baseFormat) {
+   case GL_RED:
+      colorOut[0] = colorIn[0];
+      colorOut[1] = 0.0F;
+      colorOut[2] = 0.0F;
+      colorOut[3] = 1.0F;
+      break;
+   case GL_RG:
+      colorOut[0] = colorIn[0];
+      colorOut[1] = colorIn[1];
+      colorOut[2] = 0.0F;
+      colorOut[3] = 1.0F;
+      break;
+   case GL_RGB:
+      colorOut[0] = colorIn[0];
+      colorOut[1] = colorIn[1];
+      colorOut[2] = colorIn[2];
+      colorOut[3] = 1.0F;
+      break;
+   case GL_ALPHA:
+      colorOut[0] = colorOut[1] = colorOut[2] = 0.0;
+      colorOut[3] = colorIn[3];
+      break;
+   case GL_LUMINANCE:
+      colorOut[0] = colorOut[1] = colorOut[2] = colorIn[0];
+      colorOut[3] = 1.0;
+      break;
+   case GL_LUMINANCE_ALPHA:
+      colorOut[0] = colorOut[1] = colorOut[2] = colorIn[0];
+      colorOut[3] = colorIn[3];
+      break;
+   case GL_INTENSITY:
+      colorOut[0] = colorOut[1] = colorOut[2] = colorOut[3] = colorIn[0];
+      break;
+   default:
+      COPY_4V(colorOut, colorIn);
+   }
+}
-- 
cgit v1.2.3