summaryrefslogtreecommitdiff
path: root/togl/linuxwin/glmgrbasics.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /togl/linuxwin/glmgrbasics.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'togl/linuxwin/glmgrbasics.cpp')
-rw-r--r--togl/linuxwin/glmgrbasics.cpp4684
1 files changed, 4684 insertions, 0 deletions
diff --git a/togl/linuxwin/glmgrbasics.cpp b/togl/linuxwin/glmgrbasics.cpp
new file mode 100644
index 0000000..5a19ccc
--- /dev/null
+++ b/togl/linuxwin/glmgrbasics.cpp
@@ -0,0 +1,4684 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+// TOGL CODE LICENSE
+//
+// Copyright 2011-2014 Valve Corporation
+// 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 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.
+//
+// glmgrbasics.cpp
+//
+//===============================================================================
+
+#include "togl/rendermechanism.h"
+
+#include "tier0/icommandline.h"
+#include "tier1/utlhash.h"
+#include "tier1/utlmap.h"
+#include "tier0/vprof.h"
+
+#ifdef OSX
+#include <OpenGL/OpenGL.h>
+#ifdef CGLPROFILER_ENABLE
+#include <OpenGL/CGLProfilerFunctionEnum.h>
+#endif
+#endif
+
+#include "tier0/valve_minmax_off.h"
+#include <algorithm>
+
+// memdbgon -must- be the last include file in a .cpp file.
+#include "tier0/memdbgon.h"
+
+//===============================================================================
+// decoding tables for debug
+
+typedef struct
+{
+ unsigned long value;
+ const char *name;
+} GLMValueEntry_t;
+
+#define TERMVALUE 0x31415926
+ // terminator for value tables
+
+#define VE( x ) { x, #x }
+ // "value entry"
+
+const GLMValueEntry_t g_d3d_devtypes[] =
+{
+ VE( D3DDEVTYPE_HAL ),
+ VE( D3DDEVTYPE_REF ),
+
+ VE( TERMVALUE )
+};
+
+const GLMValueEntry_t g_d3d_formats[] =
+{
+ VE( D3DFMT_INDEX16 ),
+ VE( D3DFMT_D16 ),
+ VE( D3DFMT_D24S8 ),
+ VE( D3DFMT_A8R8G8B8 ),
+ VE( D3DFMT_A4R4G4B4 ),
+ VE( D3DFMT_X8R8G8B8 ),
+ VE( D3DFMT_R5G6R5 ),
+ VE( D3DFMT_X1R5G5B5 ),
+ VE( D3DFMT_A1R5G5B5 ),
+ VE( D3DFMT_L8 ),
+ VE( D3DFMT_A8L8 ),
+ VE( D3DFMT_A ),
+ VE( D3DFMT_DXT1 ),
+ VE( D3DFMT_DXT3 ),
+ VE( D3DFMT_DXT5 ),
+ VE( D3DFMT_V8U8 ),
+ VE( D3DFMT_Q8W8V8U8 ),
+ VE( D3DFMT_X8L8V8U8 ),
+ VE( D3DFMT_A16B16G16R16F ),
+ VE( D3DFMT_A16B16G16R16 ),
+ VE( D3DFMT_R32F ),
+ VE( D3DFMT_A32B32G32R32F ),
+ VE( D3DFMT_R8G8B8 ),
+ VE( D3DFMT_D24X4S4 ),
+ VE( D3DFMT_A8 ),
+ VE( D3DFMT_R5G6B5 ),
+ VE( D3DFMT_D15S1 ),
+ VE( D3DFMT_D24X8 ),
+ VE( D3DFMT_VERTEXDATA ),
+ VE( D3DFMT_INDEX32 ),
+
+ // vendor specific formats (fourcc's)
+ VE( D3DFMT_NV_INTZ ),
+ VE( D3DFMT_NV_RAWZ ),
+ VE( D3DFMT_NV_NULL ),
+ VE( D3DFMT_ATI_D16 ),
+ VE( D3DFMT_ATI_D24S8 ),
+ VE( D3DFMT_ATI_2N ),
+ VE( D3DFMT_ATI_1N ),
+
+ VE( D3DFMT_UNKNOWN ),
+
+ VE( TERMVALUE )
+};
+
+const GLMValueEntry_t g_d3d_rtypes[] =
+{
+ VE( D3DRTYPE_SURFACE ),
+ VE( D3DRTYPE_TEXTURE ),
+ VE( D3DRTYPE_VOLUMETEXTURE ),
+ VE( D3DRTYPE_CUBETEXTURE ),
+ VE( D3DRTYPE_VERTEXBUFFER ),
+ VE( D3DRTYPE_INDEXBUFFER ),
+
+ VE( TERMVALUE )
+};
+
+const GLMValueEntry_t g_d3d_usages[] =
+{
+ VE( D3DUSAGE_RENDERTARGET ),
+ VE( D3DUSAGE_DEPTHSTENCIL ),
+ VE( D3DUSAGE_DYNAMIC ),
+ VE( D3DUSAGE_AUTOGENMIPMAP ),
+ //VE( D3DUSAGE_DMAP ),
+ //VE( D3DUSAGE_QUERY_LEGACYBUMPMAP ),
+ VE( D3DUSAGE_QUERY_SRGBREAD ),
+ VE( D3DUSAGE_QUERY_FILTER ),
+ VE( D3DUSAGE_QUERY_SRGBWRITE ),
+ VE( D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING ),
+ VE( D3DUSAGE_QUERY_VERTEXTEXTURE ),
+ //VE( D3DUSAGE_QUERY_WRAPANDMIP ),
+ VE( D3DUSAGE_WRITEONLY ),
+ VE( D3DUSAGE_SOFTWAREPROCESSING ),
+ VE( D3DUSAGE_DONOTCLIP ),
+ VE( D3DUSAGE_POINTS ),
+ VE( D3DUSAGE_RTPATCHES ),
+ VE( D3DUSAGE_NPATCHES ),
+
+ VE( TERMVALUE )
+};
+
+const GLMValueEntry_t g_d3d_rstates[] =
+{
+ VE( D3DRS_ZENABLE ),
+ VE( D3DRS_FILLMODE ),
+ VE( D3DRS_SHADEMODE ),
+ VE( D3DRS_ZWRITEENABLE ),
+ VE( D3DRS_ALPHATESTENABLE ),
+ VE( D3DRS_LASTPIXEL ),
+ VE( D3DRS_SRCBLEND ),
+ VE( D3DRS_DESTBLEND ),
+ VE( D3DRS_CULLMODE ),
+ VE( D3DRS_ZFUNC ),
+ VE( D3DRS_ALPHAREF ),
+ VE( D3DRS_ALPHAFUNC ),
+ VE( D3DRS_DITHERENABLE ),
+ VE( D3DRS_ALPHABLENDENABLE ),
+ VE( D3DRS_FOGENABLE ),
+ VE( D3DRS_SPECULARENABLE ),
+ VE( D3DRS_FOGCOLOR ),
+ VE( D3DRS_FOGTABLEMODE ),
+ VE( D3DRS_FOGSTART ),
+ VE( D3DRS_FOGEND ),
+ VE( D3DRS_FOGDENSITY ),
+ VE( D3DRS_RANGEFOGENABLE ),
+ VE( D3DRS_STENCILENABLE ),
+ VE( D3DRS_STENCILFAIL ),
+ VE( D3DRS_STENCILZFAIL ),
+ VE( D3DRS_STENCILPASS ),
+ VE( D3DRS_STENCILFUNC ),
+ VE( D3DRS_STENCILREF ),
+ VE( D3DRS_STENCILMASK ),
+ VE( D3DRS_STENCILWRITEMASK ),
+ VE( D3DRS_TEXTUREFACTOR ),
+ VE( D3DRS_WRAP0 ),
+ VE( D3DRS_WRAP1 ),
+ VE( D3DRS_WRAP2 ),
+ VE( D3DRS_WRAP3 ),
+ VE( D3DRS_WRAP4 ),
+ VE( D3DRS_WRAP5 ),
+ VE( D3DRS_WRAP6 ),
+ VE( D3DRS_WRAP7 ),
+ VE( D3DRS_CLIPPING ),
+ VE( D3DRS_LIGHTING ),
+ VE( D3DRS_AMBIENT ),
+ VE( D3DRS_FOGVERTEXMODE ),
+ VE( D3DRS_COLORVERTEX ),
+ VE( D3DRS_LOCALVIEWER ),
+ VE( D3DRS_NORMALIZENORMALS ),
+ VE( D3DRS_DIFFUSEMATERIALSOURCE ),
+ VE( D3DRS_SPECULARMATERIALSOURCE ),
+ VE( D3DRS_AMBIENTMATERIALSOURCE ),
+ VE( D3DRS_EMISSIVEMATERIALSOURCE ),
+ VE( D3DRS_VERTEXBLEND ),
+ VE( D3DRS_CLIPPLANEENABLE ),
+ VE( D3DRS_POINTSIZE ),
+ VE( D3DRS_POINTSIZE_MIN ),
+ VE( D3DRS_POINTSPRITEENABLE ),
+ VE( D3DRS_POINTSCALEENABLE ),
+ VE( D3DRS_POINTSCALE_A ),
+ VE( D3DRS_POINTSCALE_B ),
+ VE( D3DRS_POINTSCALE_C ),
+ VE( D3DRS_MULTISAMPLEANTIALIAS ),
+ VE( D3DRS_MULTISAMPLEMASK ),
+ VE( D3DRS_PATCHEDGESTYLE ),
+ VE( D3DRS_DEBUGMONITORTOKEN ),
+ VE( D3DRS_POINTSIZE_MAX ),
+ VE( D3DRS_INDEXEDVERTEXBLENDENABLE ),
+ VE( D3DRS_COLORWRITEENABLE ),
+ VE( D3DRS_TWEENFACTOR ),
+ VE( D3DRS_BLENDOP ),
+ VE( D3DRS_POSITIONDEGREE ),
+ VE( D3DRS_NORMALDEGREE ),
+ VE( D3DRS_SCISSORTESTENABLE ),
+ VE( D3DRS_SLOPESCALEDEPTHBIAS ),
+ VE( D3DRS_ANTIALIASEDLINEENABLE ),
+ VE( D3DRS_MINTESSELLATIONLEVEL ),
+ VE( D3DRS_MAXTESSELLATIONLEVEL ),
+ VE( D3DRS_ADAPTIVETESS_X ),
+ VE( D3DRS_ADAPTIVETESS_Y ),
+ VE( D3DRS_ADAPTIVETESS_Z ),
+ VE( D3DRS_ADAPTIVETESS_W ),
+ VE( D3DRS_ENABLEADAPTIVETESSELLATION ),
+ VE( D3DRS_TWOSIDEDSTENCILMODE ),
+ VE( D3DRS_CCW_STENCILFAIL ),
+ VE( D3DRS_CCW_STENCILZFAIL ),
+ VE( D3DRS_CCW_STENCILPASS ),
+ VE( D3DRS_CCW_STENCILFUNC ),
+ VE( D3DRS_COLORWRITEENABLE1 ),
+ VE( D3DRS_COLORWRITEENABLE2 ),
+ VE( D3DRS_COLORWRITEENABLE3 ),
+ VE( D3DRS_BLENDFACTOR ),
+ VE( D3DRS_SRGBWRITEENABLE ),
+ VE( D3DRS_DEPTHBIAS ),
+ VE( D3DRS_WRAP8 ),
+ VE( D3DRS_WRAP9 ),
+ VE( D3DRS_WRAP10 ),
+ VE( D3DRS_WRAP11 ),
+ VE( D3DRS_WRAP12 ),
+ VE( D3DRS_WRAP13 ),
+ VE( D3DRS_WRAP14 ),
+ VE( D3DRS_WRAP15 ),
+ VE( D3DRS_SEPARATEALPHABLENDENABLE ),
+ VE( D3DRS_SRCBLENDALPHA ),
+ VE( D3DRS_DESTBLENDALPHA ),
+ VE( D3DRS_BLENDOPALPHA ),
+
+ VE( TERMVALUE )
+};
+
+const GLMValueEntry_t g_d3d_opcodes[] =
+{
+ VE( D3DSIO_NOP ),
+ VE( D3DSIO_PHASE ),
+ VE( D3DSIO_RET ),
+ VE( D3DSIO_ELSE ),
+ VE( D3DSIO_ENDIF ),
+ VE( D3DSIO_ENDLOOP ),
+ VE( D3DSIO_ENDREP ),
+ VE( D3DSIO_BREAK ),
+ VE( D3DSIO_TEXDEPTH ),
+ VE( D3DSIO_TEXKILL ),
+ VE( D3DSIO_BEM ),
+ VE( D3DSIO_TEXBEM ),
+ VE( D3DSIO_TEXBEML ),
+ VE( D3DSIO_TEXDP3 ),
+ VE( D3DSIO_TEXDP3TEX ),
+ VE( D3DSIO_TEXM3x2DEPTH ),
+ VE( D3DSIO_TEXM3x2TEX ),
+ VE( D3DSIO_TEXM3x3 ),
+ VE( D3DSIO_TEXM3x3PAD ),
+ VE( D3DSIO_TEXM3x3TEX ),
+ VE( D3DSIO_TEXM3x3VSPEC ),
+ VE( D3DSIO_TEXREG2AR ),
+ VE( D3DSIO_TEXREG2GB ),
+ VE( D3DSIO_TEXREG2RGB ),
+ VE( D3DSIO_LABEL ),
+ VE( D3DSIO_CALL ),
+ VE( D3DSIO_IF ),
+ VE( D3DSIO_LOOP ),
+ VE( D3DSIO_REP ),
+ VE( D3DSIO_BREAKP ),
+ VE( D3DSIO_DSX ),
+ VE( D3DSIO_DSY ),
+ VE( D3DSIO_NRM ),
+ VE( D3DSIO_MOVA ),
+ VE( D3DSIO_MOV ),
+ VE( D3DSIO_RCP ),
+ VE( D3DSIO_RSQ ),
+ VE( D3DSIO_EXP ),
+ VE( D3DSIO_EXPP ),
+ VE( D3DSIO_LOG ),
+ VE( D3DSIO_LOGP ),
+ VE( D3DSIO_FRC ),
+ VE( D3DSIO_LIT ),
+ VE( D3DSIO_ABS ),
+ VE( D3DSIO_TEXM3x3SPEC ),
+ VE( D3DSIO_M4x4 ),
+ VE( D3DSIO_M4x3 ),
+ VE( D3DSIO_M3x4 ),
+ VE( D3DSIO_M3x3 ),
+ VE( D3DSIO_M3x2 ),
+ VE( D3DSIO_CALLNZ ),
+ VE( D3DSIO_IFC ),
+ VE( D3DSIO_BREAKC ),
+ VE( D3DSIO_SETP ),
+ VE( D3DSIO_TEXLDL ),
+ VE( D3DSIO_ADD ),
+ VE( D3DSIO_SUB ),
+ VE( D3DSIO_MUL ),
+ VE( D3DSIO_DP3 ),
+ VE( D3DSIO_DP4 ),
+ VE( D3DSIO_MIN ),
+ VE( D3DSIO_MAX ),
+ VE( D3DSIO_DST ),
+ VE( D3DSIO_SLT ),
+ VE( D3DSIO_SGE ),
+ VE( D3DSIO_CRS ),
+ VE( D3DSIO_POW ),
+ VE( D3DSIO_DP2ADD ),
+ VE( D3DSIO_LRP ),
+ VE( D3DSIO_SGN ),
+ VE( D3DSIO_CND ),
+ VE( D3DSIO_CMP ),
+ VE( D3DSIO_SINCOS ),
+ VE( D3DSIO_MAD ),
+ VE( D3DSIO_TEXLDD ),
+ VE( D3DSIO_TEXCOORD ),
+ VE( D3DSIO_TEX ),
+ VE( D3DSIO_DCL ),
+ VE( D3DSTT_UNKNOWN ),
+ VE( D3DSTT_2D ),
+ VE( D3DSTT_CUBE ),
+ VE( D3DSTT_VOLUME ),
+ VE( D3DSIO_DEFB ),
+ VE( D3DSIO_DEFI ),
+ VE( D3DSIO_DEF ),
+ VE( D3DSIO_COMMENT ),
+ VE( D3DSIO_END ),
+};
+
+
+const GLMValueEntry_t g_d3d_vtxdeclusages[] =
+{
+ { D3DDECLUSAGE_POSITION ,"POSN" }, // P
+ { D3DDECLUSAGE_BLENDWEIGHT ,"BLWT" }, // W
+ { D3DDECLUSAGE_BLENDINDICES ,"BLIX" }, // I
+ { D3DDECLUSAGE_NORMAL ,"NORM" }, // N
+ { D3DDECLUSAGE_PSIZE ,"PSIZ" }, // S
+ { D3DDECLUSAGE_TEXCOORD ,"TEXC" }, // T
+ { D3DDECLUSAGE_TANGENT ,"TANG" }, // G
+ { D3DDECLUSAGE_BINORMAL ,"BINO" }, // B
+ { D3DDECLUSAGE_TESSFACTOR ,"TESS" }, // S
+ { D3DDECLUSAGE_PLUGH ,"????" }, // ?
+ { D3DDECLUSAGE_COLOR ,"COLR" }, // C
+ { D3DDECLUSAGE_FOG ,"FOG " }, // F
+ { D3DDECLUSAGE_DEPTH ,"DEPT" }, // D
+ { D3DDECLUSAGE_SAMPLE ,"SAMP" } // M
+};
+
+const GLMValueEntry_t g_d3d_vtxdeclusages_short[] =
+{
+ { D3DDECLUSAGE_POSITION ,"P" },
+ { D3DDECLUSAGE_BLENDWEIGHT ,"W" },
+ { D3DDECLUSAGE_BLENDINDICES ,"I" },
+ { D3DDECLUSAGE_NORMAL ,"N" },
+ { D3DDECLUSAGE_PSIZE ,"S" },
+ { D3DDECLUSAGE_TEXCOORD ,"T" },
+ { D3DDECLUSAGE_TANGENT ,"G" },
+ { D3DDECLUSAGE_BINORMAL ,"B" },
+ { D3DDECLUSAGE_TESSFACTOR ,"S" },
+ { D3DDECLUSAGE_PLUGH ,"?" },
+ { D3DDECLUSAGE_COLOR ,"C" },
+ { D3DDECLUSAGE_FOG ,"F" },
+ { D3DDECLUSAGE_DEPTH ,"D" },
+ { D3DDECLUSAGE_SAMPLE ,"M" }
+};
+
+const GLMValueEntry_t g_cgl_rendids[] = // need to mask with 0xFFFFFF00 to match on these (ex: 8800GT == 0x00022608
+{
+#ifdef OSX
+ VE( kCGLRendererGenericID ),
+ VE( kCGLRendererGenericFloatID ),
+ VE( kCGLRendererAppleSWID ),
+ VE( kCGLRendererATIRage128ID ),
+ VE( kCGLRendererATIRadeonID ),
+ VE( kCGLRendererATIRageProID ),
+ VE( kCGLRendererATIRadeon8500ID ),
+ VE( kCGLRendererATIRadeon9700ID ),
+ VE( kCGLRendererATIRadeonX1000ID ),
+ VE( kCGLRendererATIRadeonX2000ID ),
+ VE( kCGLRendererGeForce2MXID ),
+ VE( kCGLRendererGeForce3ID ),
+ VE( kCGLRendererGeForceFXID ), // also for GF6 and GF7
+ VE( kCGLRendererGeForce8xxxID ),
+ VE( kCGLRendererVTBladeXP2ID ),
+ VE( kCGLRendererIntel900ID ),
+ VE( kCGLRendererMesa3DFXID ),
+#endif
+ VE( TERMVALUE )
+};
+
+const GLMValueEntry_t g_gl_errors[] =
+{
+ VE( GL_INVALID_ENUM ),
+ VE( GL_INVALID_VALUE ),
+ VE( GL_INVALID_OPERATION ),
+ VE( GL_STACK_OVERFLOW ),
+ VE( GL_STACK_UNDERFLOW ),
+ VE( GL_OUT_OF_MEMORY ),
+ VE( GL_INVALID_FRAMEBUFFER_OPERATION_EXT ),
+ VE( GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT ),
+ VE( GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT ),
+ VE( GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT ),
+ VE( GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT ),
+ VE( GL_FRAMEBUFFER_UNSUPPORTED_EXT ),
+ VE( GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT ),
+ VE( GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT )
+};
+
+// there are some ARB/EXT dupes in this table but that doesn't matter too much
+const GLMValueEntry_t g_gl_enums[] =
+{
+ { 0x0000, "GL_ZERO" },
+ { 0x0001, "GL_ONE" },
+ { 0x0004, "GL_TRIANGLES" },
+ { 0x0005, "GL_TRIANGLE_STRIP" },
+ { 0x0006, "GL_TRIANGLE_FAN" },
+ { 0x0007, "GL_QUADS" },
+ { 0x0008, "GL_QUAD_STRIP" },
+ { 0x0009, "GL_POLYGON" },
+ { 0x0200, "GL_NEVER" },
+ { 0x0201, "GL_LESS" },
+ { 0x0202, "GL_EQUAL" },
+ { 0x0203, "GL_LEQUAL" },
+ { 0x0204, "GL_GREATER" },
+ { 0x0205, "GL_NOTEQUAL" },
+ { 0x0206, "GL_GEQUAL" },
+ { 0x0207, "GL_ALWAYS" },
+ { 0x0300, "GL_SRC_COLOR" },
+ { 0x0301, "GL_ONE_MINUS_SRC_COLOR" },
+ { 0x0302, "GL_SRC_ALPHA" },
+ { 0x0303, "GL_ONE_MINUS_SRC_ALPHA" },
+ { 0x0304, "GL_DST_ALPHA" },
+ { 0x0305, "GL_ONE_MINUS_DST_ALPHA" },
+ { 0x0306, "GL_DST_COLOR" },
+ { 0x0307, "GL_ONE_MINUS_DST_COLOR" },
+ { 0x0308, "GL_SRC_ALPHA_SATURATE" },
+ { 0x0400, "GL_FRONT_LEFT" },
+ { 0x0401, "GL_FRONT_RIGHT" },
+ { 0x0402, "GL_BACK_LEFT" },
+ { 0x0403, "GL_BACK_RIGHT" },
+ { 0x0404, "GL_FRONT" },
+ { 0x0405, "GL_BACK" },
+ { 0x0406, "GL_LEFT" },
+ { 0x0407, "GL_RIGHT" },
+ { 0x0408, "GL_FRONT_AND_BACK" },
+ { 0x0409, "GL_AUX0" },
+ { 0x040A, "GL_AUX1" },
+ { 0x040B, "GL_AUX2" },
+ { 0x040C, "GL_AUX3" },
+ { 0x0500, "GL_INVALID_ENUM" },
+ { 0x0501, "GL_INVALID_VALUE" },
+ { 0x0502, "GL_INVALID_OPERATION" },
+ { 0x0503, "GL_STACK_OVERFLOW" },
+ { 0x0504, "GL_STACK_UNDERFLOW" },
+ { 0x0505, "GL_OUT_OF_MEMORY" },
+ { 0x0506, "GL_INVALID_FRAMEBUFFER_OPERATION" },
+ { 0x0600, "GL_2D" },
+ { 0x0601, "GL_3D" },
+ { 0x0602, "GL_3D_COLOR" },
+ { 0x0603, "GL_3D_COLOR_TEXTURE" },
+ { 0x0604, "GL_4D_COLOR_TEXTURE" },
+ { 0x0700, "GL_PASS_THROUGH_TOKEN" },
+ { 0x0701, "GL_POINT_TOKEN" },
+ { 0x0702, "GL_LINE_TOKEN" },
+ { 0x0703, "GL_POLYGON_TOKEN" },
+ { 0x0704, "GL_BITMAP_TOKEN" },
+ { 0x0705, "GL_DRAW_PIXEL_TOKEN" },
+ { 0x0706, "GL_COPY_PIXEL_TOKEN" },
+ { 0x0707, "GL_LINE_RESET_TOKEN" },
+ { 0x0800, "GL_EXP" },
+ { 0x0801, "GL_EXP2" },
+ { 0x0900, "GL_CW" },
+ { 0x0901, "GL_CCW" },
+ { 0x0A00, "GL_COEFF" },
+ { 0x0A01, "GL_ORDER" },
+ { 0x0A02, "GL_DOMAIN" },
+ { 0x0B00, "GL_CURRENT_COLOR" },
+ { 0x0B01, "GL_CURRENT_INDEX" },
+ { 0x0B02, "GL_CURRENT_NORMAL" },
+ { 0x0B03, "GL_CURRENT_TEXTURE_COORDS" },
+ { 0x0B04, "GL_CURRENT_RASTER_COLOR" },
+ { 0x0B05, "GL_CURRENT_RASTER_INDEX" },
+ { 0x0B06, "GL_CURRENT_RASTER_TEXTURE_COORDS" },
+ { 0x0B07, "GL_CURRENT_RASTER_POSITION" },
+ { 0x0B08, "GL_CURRENT_RASTER_POSITION_VALID" },
+ { 0x0B09, "GL_CURRENT_RASTER_DISTANCE" },
+ { 0x0B10, "GL_POINT_SMOOTH" },
+ { 0x0B11, "GL_POINT_SIZE" },
+ { 0x0B12, "GL_POINT_SIZE_RANGE" },
+ { 0x0B12, "GL_SMOOTH_POINT_SIZE_RANGE" },
+ { 0x0B13, "GL_POINT_SIZE_GRANULARITY" },
+ { 0x0B13, "GL_SMOOTH_POINT_SIZE_GRANULARITY" },
+ { 0x0B20, "GL_LINE_SMOOTH" },
+ { 0x0B21, "GL_LINE_WIDTH" },
+ { 0x0B22, "GL_LINE_WIDTH_RANGE" },
+ { 0x0B22, "GL_SMOOTH_LINE_WIDTH_RANGE" },
+ { 0x0B23, "GL_LINE_WIDTH_GRANULARITY" },
+ { 0x0B23, "GL_SMOOTH_LINE_WIDTH_GRANULARITY" },
+ { 0x0B24, "GL_LINE_STIPPLE" },
+ { 0x0B25, "GL_LINE_STIPPLE_PATTERN" },
+ { 0x0B26, "GL_LINE_STIPPLE_REPEAT" },
+ { 0x0B30, "GL_LIST_MODE" },
+ { 0x0B31, "GL_MAX_LIST_NESTING" },
+ { 0x0B32, "GL_LIST_BASE" },
+ { 0x0B33, "GL_LIST_INDEX" },
+ { 0x0B40, "GL_POLYGON_MODE" },
+ { 0x0B41, "GL_POLYGON_SMOOTH" },
+ { 0x0B42, "GL_POLYGON_STIPPLE" },
+ { 0x0B43, "GL_EDGE_FLAG" },
+ { 0x0B44, "GL_CULL_FACE" },
+ { 0x0B45, "GL_CULL_FACE_MODE" },
+ { 0x0B46, "GL_FRONT_FACE" },
+ { 0x0B50, "GL_LIGHTING" },
+ { 0x0B51, "GL_LIGHT_MODEL_LOCAL_VIEWER" },
+ { 0x0B52, "GL_LIGHT_MODEL_TWO_SIDE" },
+ { 0x0B53, "GL_LIGHT_MODEL_AMBIENT" },
+ { 0x0B54, "GL_SHADE_MODEL" },
+ { 0x0B55, "GL_COLOR_MATERIAL_FACE" },
+ { 0x0B56, "GL_COLOR_MATERIAL_PARAMETER" },
+ { 0x0B57, "GL_COLOR_MATERIAL" },
+ { 0x0B60, "GL_FOG" },
+ { 0x0B61, "GL_FOG_INDEX" },
+ { 0x0B62, "GL_FOG_DENSITY" },
+ { 0x0B63, "GL_FOG_START" },
+ { 0x0B64, "GL_FOG_END" },
+ { 0x0B65, "GL_FOG_MODE" },
+ { 0x0B66, "GL_FOG_COLOR" },
+ { 0x0B70, "GL_DEPTH_RANGE" },
+ { 0x0B71, "GL_DEPTH_TEST" },
+ { 0x0B72, "GL_DEPTH_WRITEMASK" },
+ { 0x0B73, "GL_DEPTH_CLEAR_VALUE" },
+ { 0x0B74, "GL_DEPTH_FUNC" },
+ { 0x0B80, "GL_ACCUM_CLEAR_VALUE" },
+ { 0x0B90, "GL_STENCIL_TEST" },
+ { 0x0B91, "GL_STENCIL_CLEAR_VALUE" },
+ { 0x0B92, "GL_STENCIL_FUNC" },
+ { 0x0B93, "GL_STENCIL_VALUE_MASK" },
+ { 0x0B94, "GL_STENCIL_FAIL" },
+ { 0x0B95, "GL_STENCIL_PASS_DEPTH_FAIL" },
+ { 0x0B96, "GL_STENCIL_PASS_DEPTH_PASS" },
+ { 0x0B97, "GL_STENCIL_REF" },
+ { 0x0B98, "GL_STENCIL_WRITEMASK" },
+ { 0x0BA0, "GL_MATRIX_MODE" },
+ { 0x0BA1, "GL_NORMALIZE" },
+ { 0x0BA2, "GL_VIEWPORT" },
+ { 0x0BA3, "GL_MODELVIEW_STACK_DEPTH" },
+ { 0x0BA4, "GL_PROJECTION_STACK_DEPTH" },
+ { 0x0BA5, "GL_TEXTURE_STACK_DEPTH" },
+ { 0x0BA6, "GL_MODELVIEW_MATRIX" },
+ { 0x0BA7, "GL_PROJECTION_MATRIX" },
+ { 0x0BA8, "GL_TEXTURE_MATRIX" },
+ { 0x0BB0, "GL_ATTRIB_STACK_DEPTH" },
+ { 0x0BB1, "GL_CLIENT_ATTRIB_STACK_DEPTH" },
+ { 0x0BC0, "GL_ALPHA_TEST" },
+ { 0x0BC1, "GL_ALPHA_TEST_FUNC" },
+ { 0x0BC2, "GL_ALPHA_TEST_REF" },
+ { 0x0BD0, "GL_DITHER" },
+ { 0x0BE0, "GL_BLEND_DST" },
+ { 0x0BE1, "GL_BLEND_SRC" },
+ { 0x0BE2, "GL_BLEND" },
+ { 0x0BF0, "GL_LOGIC_OP_MODE" },
+ { 0x0BF1, "GL_INDEX_LOGIC_OP" },
+ { 0x0BF2, "GL_COLOR_LOGIC_OP" },
+ { 0x0C00, "GL_AUX_BUFFERS" },
+ { 0x0C01, "GL_DRAW_BUFFER" },
+ { 0x0C02, "GL_READ_BUFFER" },
+ { 0x0C10, "GL_SCISSOR_BOX" },
+ { 0x0C11, "GL_SCISSOR_TEST" },
+ { 0x0C20, "GL_INDEX_CLEAR_VALUE" },
+ { 0x0C21, "GL_INDEX_WRITEMASK" },
+ { 0x0C22, "GL_COLOR_CLEAR_VALUE" },
+ { 0x0C23, "GL_COLOR_WRITEMASK" },
+ { 0x0C30, "GL_INDEX_MODE" },
+ { 0x0C31, "GL_RGBA_MODE" },
+ { 0x0C32, "GL_DOUBLEBUFFER" },
+ { 0x0C33, "GL_STEREO" },
+ { 0x0C40, "GL_RENDER_MODE" },
+ { 0x0C50, "GL_PERSPECTIVE_CORRECTION_HINT" },
+ { 0x0C51, "GL_POINT_SMOOTH_HINT" },
+ { 0x0C52, "GL_LINE_SMOOTH_HINT" },
+ { 0x0C53, "GL_POLYGON_SMOOTH_HINT" },
+ { 0x0C54, "GL_FOG_HINT" },
+ { 0x0C60, "GL_TEXTURE_GEN_S" },
+ { 0x0C61, "GL_TEXTURE_GEN_T" },
+ { 0x0C62, "GL_TEXTURE_GEN_R" },
+ { 0x0C63, "GL_TEXTURE_GEN_Q" },
+ { 0x0C70, "GL_PIXEL_MAP_I_TO_I" },
+ { 0x0C71, "GL_PIXEL_MAP_S_TO_S" },
+ { 0x0C72, "GL_PIXEL_MAP_I_TO_R" },
+ { 0x0C73, "GL_PIXEL_MAP_I_TO_G" },
+ { 0x0C74, "GL_PIXEL_MAP_I_TO_B" },
+ { 0x0C75, "GL_PIXEL_MAP_I_TO_A" },
+ { 0x0C76, "GL_PIXEL_MAP_R_TO_R" },
+ { 0x0C77, "GL_PIXEL_MAP_G_TO_G" },
+ { 0x0C78, "GL_PIXEL_MAP_B_TO_B" },
+ { 0x0C79, "GL_PIXEL_MAP_A_TO_A" },
+ { 0x0CB0, "GL_PIXEL_MAP_I_TO_I_SIZE" },
+ { 0x0CB1, "GL_PIXEL_MAP_S_TO_S_SIZE" },
+ { 0x0CB2, "GL_PIXEL_MAP_I_TO_R_SIZE" },
+ { 0x0CB3, "GL_PIXEL_MAP_I_TO_G_SIZE" },
+ { 0x0CB4, "GL_PIXEL_MAP_I_TO_B_SIZE" },
+ { 0x0CB5, "GL_PIXEL_MAP_I_TO_A_SIZE" },
+ { 0x0CB6, "GL_PIXEL_MAP_R_TO_R_SIZE" },
+ { 0x0CB7, "GL_PIXEL_MAP_G_TO_G_SIZE" },
+ { 0x0CB8, "GL_PIXEL_MAP_B_TO_B_SIZE" },
+ { 0x0CB9, "GL_PIXEL_MAP_A_TO_A_SIZE" },
+ { 0x0CF0, "GL_UNPACK_SWAP_BYTES" },
+ { 0x0CF1, "GL_UNPACK_LSB_FIRST" },
+ { 0x0CF2, "GL_UNPACK_ROW_LENGTH" },
+ { 0x0CF3, "GL_UNPACK_SKIP_ROWS" },
+ { 0x0CF4, "GL_UNPACK_SKIP_PIXELS" },
+ { 0x0CF5, "GL_UNPACK_ALIGNMENT" },
+ { 0x0D00, "GL_PACK_SWAP_BYTES" },
+ { 0x0D01, "GL_PACK_LSB_FIRST" },
+ { 0x0D02, "GL_PACK_ROW_LENGTH" },
+ { 0x0D03, "GL_PACK_SKIP_ROWS" },
+ { 0x0D04, "GL_PACK_SKIP_PIXELS" },
+ { 0x0D05, "GL_PACK_ALIGNMENT" },
+ { 0x0D10, "GL_MAP_COLOR" },
+ { 0x0D11, "GL_MAP_STENCIL" },
+ { 0x0D12, "GL_INDEX_SHIFT" },
+ { 0x0D13, "GL_INDEX_OFFSET" },
+ { 0x0D14, "GL_RED_SCALE" },
+ { 0x0D15, "GL_RED_BIAS" },
+ { 0x0D16, "GL_ZOOM_X" },
+ { 0x0D17, "GL_ZOOM_Y" },
+ { 0x0D18, "GL_GREEN_SCALE" },
+ { 0x0D19, "GL_GREEN_BIAS" },
+ { 0x0D1A, "GL_BLUE_SCALE" },
+ { 0x0D1B, "GL_BLUE_BIAS" },
+ { 0x0D1C, "GL_ALPHA_SCALE" },
+ { 0x0D1D, "GL_ALPHA_BIAS" },
+ { 0x0D1E, "GL_DEPTH_SCALE" },
+ { 0x0D1F, "GL_DEPTH_BIAS" },
+ { 0x0D30, "GL_MAX_EVAL_ORDER" },
+ { 0x0D31, "GL_MAX_LIGHTS" },
+ { 0x0D32, "GL_MAX_CLIP_PLANES" },
+ { 0x0D33, "GL_MAX_TEXTURE_SIZE" },
+ { 0x0D34, "GL_MAX_PIXEL_MAP_TABLE" },
+ { 0x0D35, "GL_MAX_ATTRIB_STACK_DEPTH" },
+ { 0x0D36, "GL_MAX_MODELVIEW_STACK_DEPTH" },
+ { 0x0D37, "GL_MAX_NAME_STACK_DEPTH" },
+ { 0x0D38, "GL_MAX_PROJECTION_STACK_DEPTH" },
+ { 0x0D39, "GL_MAX_TEXTURE_STACK_DEPTH" },
+ { 0x0D3A, "GL_MAX_VIEWPORT_DIMS" },
+ { 0x0D3B, "GL_MAX_CLIENT_ATTRIB_STACK_DEPTH" },
+ { 0x0D50, "GL_SUBPIXEL_BITS" },
+ { 0x0D51, "GL_INDEX_BITS" },
+ { 0x0D52, "GL_RED_BITS" },
+ { 0x0D53, "GL_GREEN_BITS" },
+ { 0x0D54, "GL_BLUE_BITS" },
+ { 0x0D55, "GL_ALPHA_BITS" },
+ { 0x0D56, "GL_DEPTH_BITS" },
+ { 0x0D57, "GL_STENCIL_BITS" },
+ { 0x0D58, "GL_ACCUM_RED_BITS" },
+ { 0x0D59, "GL_ACCUM_GREEN_BITS" },
+ { 0x0D5A, "GL_ACCUM_BLUE_BITS" },
+ { 0x0D5B, "GL_ACCUM_ALPHA_BITS" },
+ { 0x0D70, "GL_NAME_STACK_DEPTH" },
+ { 0x0D80, "GL_AUTO_NORMAL" },
+ { 0x0D90, "GL_MAP1_COLOR_4" },
+ { 0x0D91, "GL_MAP1_INDEX" },
+ { 0x0D92, "GL_MAP1_NORMAL" },
+ { 0x0D93, "GL_MAP1_TEXTURE_COORD_1" },
+ { 0x0D94, "GL_MAP1_TEXTURE_COORD_2" },
+ { 0x0D95, "GL_MAP1_TEXTURE_COORD_3" },
+ { 0x0D96, "GL_MAP1_TEXTURE_COORD_4" },
+ { 0x0D97, "GL_MAP1_VERTEX_3" },
+ { 0x0D98, "GL_MAP1_VERTEX_4" },
+ { 0x0DB0, "GL_MAP2_COLOR_4" },
+ { 0x0DB1, "GL_MAP2_INDEX" },
+ { 0x0DB2, "GL_MAP2_NORMAL" },
+ { 0x0DB3, "GL_MAP2_TEXTURE_COORD_1" },
+ { 0x0DB4, "GL_MAP2_TEXTURE_COORD_2" },
+ { 0x0DB5, "GL_MAP2_TEXTURE_COORD_3" },
+ { 0x0DB6, "GL_MAP2_TEXTURE_COORD_4" },
+ { 0x0DB7, "GL_MAP2_VERTEX_3" },
+ { 0x0DB8, "GL_MAP2_VERTEX_4" },
+ { 0x0DD0, "GL_MAP1_GRID_DOMAIN" },
+ { 0x0DD1, "GL_MAP1_GRID_SEGMENTS" },
+ { 0x0DD2, "GL_MAP2_GRID_DOMAIN" },
+ { 0x0DD3, "GL_MAP2_GRID_SEGMENTS" },
+ { 0x0DE0, "GL_TEXTURE_1D" },
+ { 0x0DE1, "GL_TEXTURE_2D" },
+ { 0x0DF0, "GL_FEEDBACK_BUFFER_POINTER" },
+ { 0x0DF1, "GL_FEEDBACK_BUFFER_SIZE" },
+ { 0x0DF2, "GL_FEEDBACK_BUFFER_TYPE" },
+ { 0x0DF3, "GL_SELECTION_BUFFER_POINTER" },
+ { 0x0DF4, "GL_SELECTION_BUFFER_SIZE" },
+ { 0x1000, "GL_TEXTURE_WIDTH" },
+ { 0x1001, "GL_TEXTURE_HEIGHT" },
+ { 0x1003, "GL_TEXTURE_INTERNAL_FORMAT" },
+ { 0x1004, "GL_TEXTURE_BORDER_COLOR" },
+ { 0x1005, "GL_TEXTURE_BORDER" },
+ { 0x1100, "GL_DONT_CARE" },
+ { 0x1101, "GL_FASTEST" },
+ { 0x1102, "GL_NICEST" },
+ { 0x1200, "GL_AMBIENT" },
+ { 0x1201, "GL_DIFFUSE" },
+ { 0x1202, "GL_SPECULAR" },
+ { 0x1203, "GL_POSITION" },
+ { 0x1204, "GL_SPOT_DIRECTION" },
+ { 0x1205, "GL_SPOT_EXPONENT" },
+ { 0x1206, "GL_SPOT_CUTOFF" },
+ { 0x1207, "GL_CONSTANT_ATTENUATION" },
+ { 0x1208, "GL_LINEAR_ATTENUATION" },
+ { 0x1209, "GL_QUADRATIC_ATTENUATION" },
+ { 0x1300, "GL_COMPILE" },
+ { 0x1301, "GL_COMPILE_AND_EXECUTE" },
+ { 0x1400, "GL_BYTE " },
+ { 0x1401, "GL_UBYTE" },
+ { 0x1402, "GL_SHORT" },
+ { 0x1403, "GL_USHRT" },
+ { 0x1404, "GL_INT " },
+ { 0x1405, "GL_UINT " },
+ { 0x1406, "GL_FLOAT" },
+ { 0x1407, "GL_2_BYTES" },
+ { 0x1408, "GL_3_BYTES" },
+ { 0x1409, "GL_4_BYTES" },
+ { 0x140A, "GL_DOUBLE" },
+ { 0x140B, "GL_HALF_FLOAT" },
+ { 0x1500, "GL_CLEAR" },
+ { 0x1501, "GL_AND" },
+ { 0x1502, "GL_AND_REVERSE" },
+ { 0x1503, "GL_COPY" },
+ { 0x1504, "GL_AND_INVERTED" },
+ { 0x1505, "GL_NOOP" },
+ { 0x1506, "GL_XOR" },
+ { 0x1507, "GL_OR" },
+ { 0x1508, "GL_NOR" },
+ { 0x1509, "GL_EQUIV" },
+ { 0x150A, "GL_INVERT" },
+ { 0x150B, "GL_OR_REVERSE" },
+ { 0x150C, "GL_COPY_INVERTED" },
+ { 0x150D, "GL_OR_INVERTED" },
+ { 0x150E, "GL_NAND" },
+ { 0x150F, "GL_SET" },
+ { 0x1600, "GL_EMISSION" },
+ { 0x1601, "GL_SHININESS" },
+ { 0x1602, "GL_AMBIENT_AND_DIFFUSE" },
+ { 0x1603, "GL_COLOR_INDEXES" },
+ { 0x1700, "GL_MODELVIEW" },
+ { 0x1700, "GL_MODELVIEW0_ARB" },
+ { 0x1701, "GL_PROJECTION" },
+ { 0x1702, "GL_TEXTURE" },
+ { 0x1800, "GL_COLOR" },
+ { 0x1801, "GL_DEPTH" },
+ { 0x1802, "GL_STENCIL" },
+ { 0x1900, "GL_COLOR_INDEX" },
+ { 0x1901, "GL_STENCIL_INDEX" },
+ { 0x1902, "GL_DEPTH_COMPONENT" },
+ { 0x1903, "GL_RED" },
+ { 0x1904, "GL_GREEN" },
+ { 0x1905, "GL_BLUE" },
+ { 0x1906, "GL_ALPHA" },
+ { 0x1907, "GL_RGB" },
+ { 0x1908, "GL_RGBA" },
+ { 0x1909, "GL_LUMINANCE" },
+ { 0x190A, "GL_LUMINANCE_ALPHA" },
+ { 0x1A00, "GL_BITMAP" },
+ { 0x1B00, "GL_POINT" },
+ { 0x1B01, "GL_LINE" },
+ { 0x1B02, "GL_FILL" },
+ { 0x1C00, "GL_RENDER" },
+ { 0x1C01, "GL_FEEDBACK" },
+ { 0x1C02, "GL_SELECT" },
+ { 0x1D00, "GL_FLAT" },
+ { 0x1D01, "GL_SMOOTH" },
+ { 0x1E00, "GL_KEEP" },
+ { 0x1E01, "GL_REPLACE" },
+ { 0x1E02, "GL_INCR" },
+ { 0x1E03, "GL_DECR" },
+ { 0x1F00, "GL_VENDOR" },
+ { 0x1F01, "GL_RENDERER" },
+ { 0x1F02, "GL_VERSION" },
+ { 0x1F03, "GL_EXTENSIONS" },
+ { 0x2000, "GL_S" },
+ { 0x2001, "GL_T" },
+ { 0x2002, "GL_R" },
+ { 0x2003, "GL_Q" },
+ { 0x2100, "GL_MODULATE" },
+ { 0x2101, "GL_DECAL" },
+ { 0x2200, "GL_TEXTURE_ENV_MODE" },
+ { 0x2201, "GL_TEXTURE_ENV_COLOR" },
+ { 0x2300, "GL_TEXTURE_ENV" },
+ { 0x2400, "GL_EYE_LINEAR" },
+ { 0x2401, "GL_OBJECT_LINEAR" },
+ { 0x2402, "GL_SPHERE_MAP" },
+ { 0x2500, "GL_TEXTURE_GEN_MODE" },
+ { 0x2501, "GL_OBJECT_PLANE" },
+ { 0x2502, "GL_EYE_PLANE" },
+ { 0x2600, "GL_NEAREST" },
+ { 0x2601, "GL_LINEAR" },
+ { 0x2700, "GL_NEAREST_MIPMAP_NEAREST" },
+ { 0x2701, "GL_LINEAR_MIPMAP_NEAREST" },
+ { 0x2702, "GL_NEAREST_MIPMAP_LINEAR" },
+ { 0x2703, "GL_LINEAR_MIPMAP_LINEAR" },
+ { 0x2800, "GL_TEXTURE_MAG_FILTER" },
+ { 0x2801, "GL_TEXTURE_MIN_FILTER" },
+ { 0x2802, "GL_TEXTURE_WRAP_S" },
+ { 0x2803, "GL_TEXTURE_WRAP_T" },
+ { 0x2900, "GL_CLAMP" },
+ { 0x2901, "GL_REPEAT" },
+ { 0x2A00, "GL_POLYGON_OFFSET_UNITS" },
+ { 0x2A01, "GL_POLYGON_OFFSET_POINT" },
+ { 0x2A02, "GL_POLYGON_OFFSET_LINE" },
+ { 0x2A10, "GL_R3_G3_B2" },
+ { 0x2A20, "GL_V2F" },
+ { 0x2A21, "GL_V3F" },
+ { 0x2A22, "GL_C4UB_V2F" },
+ { 0x2A23, "GL_C4UB_V3F" },
+ { 0x2A24, "GL_C3F_V3F" },
+ { 0x2A25, "GL_N3F_V3F" },
+ { 0x2A26, "GL_C4F_N3F_V3F" },
+ { 0x2A27, "GL_T2F_V3F" },
+ { 0x2A28, "GL_T4F_V4F" },
+ { 0x2A29, "GL_T2F_C4UB_V3F" },
+ { 0x2A2A, "GL_T2F_C3F_V3F" },
+ { 0x2A2B, "GL_T2F_N3F_V3F" },
+ { 0x2A2C, "GL_T2F_C4F_N3F_V3F" },
+ { 0x2A2D, "GL_T4F_C4F_N3F_V4F" },
+ { 0x3000, "GL_CLIP_PLANE0" },
+ { 0x3001, "GL_CLIP_PLANE1" },
+ { 0x3002, "GL_CLIP_PLANE2" },
+ { 0x3003, "GL_CLIP_PLANE3" },
+ { 0x3004, "GL_CLIP_PLANE4" },
+ { 0x3005, "GL_CLIP_PLANE5" },
+ { 0x4000, "GL_LIGHT0" },
+ { 0x4001, "GL_LIGHT1" },
+ { 0x4002, "GL_LIGHT2" },
+ { 0x4003, "GL_LIGHT3" },
+ { 0x4004, "GL_LIGHT4" },
+ { 0x4005, "GL_LIGHT5" },
+ { 0x4006, "GL_LIGHT6" },
+ { 0x4007, "GL_LIGHT7" },
+ { 0x8000, "GL_ABGR_EXT" },
+ { 0x8001, "GL_CONSTANT_COLOR" },
+ { 0x8002, "GL_ONE_MINUS_CONSTANT_COLOR" },
+ { 0x8003, "GL_CONSTANT_ALPHA" },
+ { 0x8004, "GL_ONE_MINUS_CONSTANT_ALPHA" },
+ { 0x8005, "GL_BLEND_COLOR" },
+ { 0x8006, "GL_FUNC_ADD" },
+ { 0x8007, "GL_MIN" },
+ { 0x8008, "GL_MAX" },
+ { 0x8009, "GL_BLEND_EQUATION_RGB" },
+ { 0x8009, "GL_BLEND_EQUATION" },
+ { 0x800A, "GL_FUNC_SUBTRACT" },
+ { 0x800B, "GL_FUNC_REVERSE_SUBTRACT" },
+ { 0x8010, "GL_CONVOLUTION_1D" },
+ { 0x8011, "GL_CONVOLUTION_2D" },
+ { 0x8012, "GL_SEPARABLE_2D" },
+ { 0x8013, "GL_CONVOLUTION_BORDER_MODE" },
+ { 0x8014, "GL_CONVOLUTION_FILTER_SCALE" },
+ { 0x8015, "GL_CONVOLUTION_FILTER_BIAS" },
+ { 0x8016, "GL_REDUCE" },
+ { 0x8017, "GL_CONVOLUTION_FORMAT" },
+ { 0x8018, "GL_CONVOLUTION_WIDTH" },
+ { 0x8019, "GL_CONVOLUTION_HEIGHT" },
+ { 0x801A, "GL_MAX_CONVOLUTION_WIDTH" },
+ { 0x801B, "GL_MAX_CONVOLUTION_HEIGHT" },
+ { 0x801C, "GL_POST_CONVOLUTION_RED_SCALE" },
+ { 0x801D, "GL_POST_CONVOLUTION_GREEN_SCALE" },
+ { 0x801E, "GL_POST_CONVOLUTION_BLUE_SCALE" },
+ { 0x801F, "GL_POST_CONVOLUTION_ALPHA_SCALE" },
+ { 0x8020, "GL_POST_CONVOLUTION_RED_BIAS" },
+ { 0x8021, "GL_POST_CONVOLUTION_GREEN_BIAS" },
+ { 0x8022, "GL_POST_CONVOLUTION_BLUE_BIAS" },
+ { 0x8023, "GL_POST_CONVOLUTION_ALPHA_BIAS" },
+ { 0x8024, "GL_HISTOGRAM" },
+ { 0x8025, "GL_PROXY_HISTOGRAM" },
+ { 0x8026, "GL_HISTOGRAM_WIDTH" },
+ { 0x8027, "GL_HISTOGRAM_FORMAT" },
+ { 0x8028, "GL_HISTOGRAM_RED_SIZE" },
+ { 0x8029, "GL_HISTOGRAM_GREEN_SIZE" },
+ { 0x802A, "GL_HISTOGRAM_BLUE_SIZE" },
+ { 0x802B, "GL_HISTOGRAM_ALPHA_SIZE" },
+ { 0x802C, "GL_HISTOGRAM_LUMINANCE_SIZE" },
+ { 0x802D, "GL_HISTOGRAM_SINK" },
+ { 0x802E, "GL_MINMAX" },
+ { 0x802F, "GL_MINMAX_FORMAT" },
+ { 0x8030, "GL_MINMAX_SINK" },
+ { 0x8031, "GL_TABLE_TOO_LARGE" },
+ { 0x8032, "GL_UNSIGNED_BYTE_3_3_2" },
+ { 0x8033, "GL_UNSIGNED_SHORT_4_4_4_4" },
+ { 0x8034, "GL_UNSIGNED_SHORT_5_5_5_1" },
+ { 0x8035, "GL_UNSIGNED_INT_8_8_8_8" },
+ { 0x8036, "GL_UNSIGNED_INT_10_10_10_2" },
+ { 0x8037, "GL_POLYGON_OFFSET_FILL" },
+ { 0x8038, "GL_POLYGON_OFFSET_FACTOR" },
+ { 0x803A, "GL_RESCALE_NORMAL" },
+ { 0x803B, "GL_ALPHA4" },
+ { 0x803C, "GL_ALPHA8" },
+ { 0x803D, "GL_ALPHA12" },
+ { 0x803E, "GL_ALPHA16" },
+ { 0x803F, "GL_LUMINANCE4" },
+ { 0x8040, "GL_LUMINANCE8" },
+ { 0x8041, "GL_LUMINANCE12" },
+ { 0x8042, "GL_LUMINANCE16" },
+ { 0x8043, "GL_LUMINANCE4_ALPHA4" },
+ { 0x8044, "GL_LUMINANCE6_ALPHA2" },
+ { 0x8045, "GL_LUMINANCE8_ALPHA8" },
+ { 0x8046, "GL_LUMINANCE12_ALPHA4" },
+ { 0x8047, "GL_LUMINANCE12_ALPHA12" },
+ { 0x8048, "GL_LUMINANCE16_ALPHA16" },
+ { 0x8049, "GL_INTENSITY" },
+ { 0x804A, "GL_INTENSITY4" },
+ { 0x804B, "GL_INTENSITY8" },
+ { 0x804C, "GL_INTENSITY12" },
+ { 0x804D, "GL_INTENSITY16" },
+ { 0x804F, "GL_RGB4" },
+ { 0x8050, "GL_RGB5" },
+ { 0x8051, "GL_RGB8" },
+ { 0x8052, "GL_RGB10" },
+ { 0x8053, "GL_RGB12" },
+ { 0x8054, "GL_RGB16" },
+ { 0x8055, "GL_RGBA2" },
+ { 0x8056, "GL_RGBA4" },
+ { 0x8057, "GL_RGB5_A1" },
+ { 0x8058, "GL_RGBA8" },
+ { 0x8059, "GL_RGB10_A2" },
+ { 0x805A, "GL_RGBA12" },
+ { 0x805B, "GL_RGBA16" },
+ { 0x805C, "GL_TEXTURE_RED_SIZE" },
+ { 0x805D, "GL_TEXTURE_GREEN_SIZE" },
+ { 0x805E, "GL_TEXTURE_BLUE_SIZE" },
+ { 0x805F, "GL_TEXTURE_ALPHA_SIZE" },
+ { 0x8060, "GL_TEXTURE_LUMINANCE_SIZE" },
+ { 0x8061, "GL_TEXTURE_INTENSITY_SIZE" },
+ { 0x8063, "GL_PROXY_TEXTURE_1D" },
+ { 0x8064, "GL_PROXY_TEXTURE_2D" },
+ { 0x8066, "GL_TEXTURE_PRIORITY" },
+ { 0x8067, "GL_TEXTURE_RESIDENT" },
+ { 0x8068, "GL_TEXTURE_BINDING_1D" },
+ { 0x8069, "GL_TEXTURE_BINDING_2D" },
+ { 0x806A, "GL_TEXTURE_BINDING_3D" },
+ { 0x806B, "GL_PACK_SKIP_IMAGES" },
+ { 0x806C, "GL_PACK_IMAGE_HEIGHT" },
+ { 0x806D, "GL_UNPACK_SKIP_IMAGES" },
+ { 0x806E, "GL_UNPACK_IMAGE_HEIGHT" },
+ { 0x806F, "GL_TEXTURE_3D" },
+ { 0x8070, "GL_PROXY_TEXTURE_3D" },
+ { 0x8071, "GL_TEXTURE_DEPTH" },
+ { 0x8072, "GL_TEXTURE_WRAP_R" },
+ { 0x8073, "GL_MAX_3D_TEXTURE_SIZE" },
+ { 0x8074, "GL_VERTEX_ARRAY" },
+ { 0x8075, "GL_NORMAL_ARRAY" },
+ { 0x8076, "GL_COLOR_ARRAY" },
+ { 0x8077, "GL_INDEX_ARRAY" },
+ { 0x8078, "GL_TEXTURE_COORD_ARRAY" },
+ { 0x8079, "GL_EDGE_FLAG_ARRAY" },
+ { 0x807A, "GL_VERTEX_ARRAY_SIZE" },
+ { 0x807B, "GL_VERTEX_ARRAY_TYPE" },
+ { 0x807C, "GL_VERTEX_ARRAY_STRIDE" },
+ { 0x807E, "GL_NORMAL_ARRAY_TYPE" },
+ { 0x807F, "GL_NORMAL_ARRAY_STRIDE" },
+ { 0x8081, "GL_COLOR_ARRAY_SIZE" },
+ { 0x8082, "GL_COLOR_ARRAY_TYPE" },
+ { 0x8083, "GL_COLOR_ARRAY_STRIDE" },
+ { 0x8085, "GL_INDEX_ARRAY_TYPE" },
+ { 0x8086, "GL_INDEX_ARRAY_STRIDE" },
+ { 0x8088, "GL_TEXTURE_COORD_ARRAY_SIZE" },
+ { 0x8089, "GL_TEXTURE_COORD_ARRAY_TYPE" },
+ { 0x808A, "GL_TEXTURE_COORD_ARRAY_STRIDE" },
+ { 0x808C, "GL_EDGE_FLAG_ARRAY_STRIDE" },
+ { 0x808E, "GL_VERTEX_ARRAY_POINTER" },
+ { 0x808F, "GL_NORMAL_ARRAY_POINTER" },
+ { 0x8090, "GL_COLOR_ARRAY_POINTER" },
+ { 0x8091, "GL_INDEX_ARRAY_POINTER" },
+ { 0x8092, "GL_TEXTURE_COORD_ARRAY_POINTER" },
+ { 0x8093, "GL_EDGE_FLAG_ARRAY_POINTER" },
+ { 0x809D, "GL_MULTISAMPLE_ARB" },
+ { 0x809D, "GL_MULTISAMPLE" },
+ { 0x809E, "GL_SAMPLE_ALPHA_TO_COVERAGE_ARB" },
+ { 0x809E, "GL_SAMPLE_ALPHA_TO_COVERAGE" },
+ { 0x809F, "GL_SAMPLE_ALPHA_TO_ONE_ARB" },
+ { 0x809F, "GL_SAMPLE_ALPHA_TO_ONE" },
+ { 0x80A0, "GL_SAMPLE_COVERAGE_ARB" },
+ { 0x80A0, "GL_SAMPLE_COVERAGE" },
+ { 0x80A0, "GL_SAMPLE_MASK_EXT" },
+ { 0x80A1, "GL_1PASS_EXT" },
+ { 0x80A2, "GL_2PASS_0_EXT" },
+ { 0x80A3, "GL_2PASS_1_EXT" },
+ { 0x80A4, "GL_4PASS_0_EXT" },
+ { 0x80A5, "GL_4PASS_1_EXT" },
+ { 0x80A6, "GL_4PASS_2_EXT" },
+ { 0x80A7, "GL_4PASS_3_EXT" },
+ { 0x80A8, "GL_SAMPLE_BUFFERS" },
+ { 0x80A9, "GL_SAMPLES" },
+ { 0x80AA, "GL_SAMPLE_COVERAGE_VALUE" },
+ { 0x80AB, "GL_SAMPLE_COVERAGE_INVERT" },
+ { 0x80AC, "GL_SAMPLE_PATTERN_EXT" },
+ { 0x80B1, "GL_COLOR_MATRIX" },
+ { 0x80B2, "GL_COLOR_MATRIX_STACK_DEPTH" },
+ { 0x80B3, "GL_MAX_COLOR_MATRIX_STACK_DEPTH" },
+ { 0x80B4, "GL_POST_COLOR_MATRIX_RED_SCALE" },
+ { 0x80B5, "GL_POST_COLOR_MATRIX_GREEN_SCALE" },
+ { 0x80B6, "GL_POST_COLOR_MATRIX_BLUE_SCALE" },
+ { 0x80B7, "GL_POST_COLOR_MATRIX_ALPHA_SCALE" },
+ { 0x80B8, "GL_POST_COLOR_MATRIX_RED_BIAS" },
+ { 0x80B9, "GL_POST_COLOR_MATRIX_GREEN_BIAS" },
+ { 0x80BA, "GL_POST_COLOR_MATRIX_BLUE_BIAS" },
+ { 0x80BB, "GL_POST_COLOR_MATRIX_ALPHA_BIAS" },
+ { 0x80BF, "GL_TEXTURE_COMPARE_FAIL_VALUE_ARB" },
+ { 0x80C8, "GL_BLEND_DST_RGB" },
+ { 0x80C9, "GL_BLEND_SRC_RGB" },
+ { 0x80CA, "GL_BLEND_DST_ALPHA" },
+ { 0x80CB, "GL_BLEND_SRC_ALPHA" },
+ { 0x80CC, "GL_422_EXT" },
+ { 0x80CD, "GL_422_REV_EXT" },
+ { 0x80CE, "GL_422_AVERAGE_EXT" },
+ { 0x80CF, "GL_422_REV_AVERAGE_EXT" },
+ { 0x80D0, "GL_COLOR_TABLE" },
+ { 0x80D1, "GL_POST_CONVOLUTION_COLOR_TABLE" },
+ { 0x80D2, "GL_POST_COLOR_MATRIX_COLOR_TABLE" },
+ { 0x80D3, "GL_PROXY_COLOR_TABLE" },
+ { 0x80D4, "GL_PROXY_POST_CONVOLUTION_COLOR_TABLE" },
+ { 0x80D5, "GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE" },
+ { 0x80D6, "GL_COLOR_TABLE_SCALE" },
+ { 0x80D7, "GL_COLOR_TABLE_BIAS" },
+ { 0x80D8, "GL_COLOR_TABLE_FORMAT" },
+ { 0x80D9, "GL_COLOR_TABLE_WIDTH" },
+ { 0x80DA, "GL_COLOR_TABLE_RED_SIZE" },
+ { 0x80DB, "GL_COLOR_TABLE_GREEN_SIZE" },
+ { 0x80DC, "GL_COLOR_TABLE_BLUE_SIZE" },
+ { 0x80DD, "GL_COLOR_TABLE_ALPHA_SIZE" },
+ { 0x80DE, "GL_COLOR_TABLE_LUMINANCE_SIZE" },
+ { 0x80DF, "GL_COLOR_TABLE_INTENSITY_SIZE" },
+ { 0x80E0, "GL_BGR_EXT" },
+ { 0x80E0, "GL_BGR" },
+ { 0x80E1, "GL_BGRA_EXT" },
+ { 0x80E1, "GL_BGRA" },
+ { 0x80E1, "GL_BGRA" },
+ { 0x80E2, "GL_COLOR_INDEX1_EXT" },
+ { 0x80E3, "GL_COLOR_INDEX2_EXT" },
+ { 0x80E4, "GL_COLOR_INDEX4_EXT" },
+ { 0x80E5, "GL_COLOR_INDEX8_EXT" },
+ { 0x80E6, "GL_COLOR_INDEX12_EXT" },
+ { 0x80E7, "GL_COLOR_INDEX16_EXT" },
+ { 0x80E8, "GL_MAX_ELEMENTS_VERTICES_EXT" },
+ { 0x80E8, "GL_MAX_ELEMENTS_VERTICES" },
+ { 0x80E9, "GL_MAX_ELEMENTS_INDICES_EXT" },
+ { 0x80E9, "GL_MAX_ELEMENTS_INDICES" },
+ { 0x80ED, "GL_TEXTURE_INDEX_SIZE_EXT" },
+ { 0x80F0, "GL_CLIP_VOLUME_CLIPPING_HINT_EXT" },
+ { 0x8126, "GL_POINT_SIZE_MIN_ARB" },
+ { 0x8126, "GL_POINT_SIZE_MIN" },
+ { 0x8127, "GL_POINT_SIZE_MAX_ARB" },
+ { 0x8127, "GL_POINT_SIZE_MAX" },
+ { 0x8128, "GL_POINT_FADE_THRESHOLD_SIZE_ARB" },
+ { 0x8128, "GL_POINT_FADE_THRESHOLD_SIZE" },
+ { 0x8129, "GL_POINT_DISTANCE_ATTENUATION_ARB" },
+ { 0x8129, "GL_POINT_DISTANCE_ATTENUATION" },
+ { 0x812D, "GL_CLAMP_TO_BORDER_ARB" },
+ { 0x812D, "GL_CLAMP_TO_BORDER" },
+ { 0x812F, "GL_CLAMP_TO_EDGE" },
+ { 0x813A, "GL_TEXTURE_MIN_LOD" },
+ { 0x813B, "GL_TEXTURE_MAX_LOD" },
+ { 0x813C, "GL_TEXTURE_BASE_LEVEL" },
+ { 0x813D, "GL_TEXTURE_MAX_LEVEL" },
+ { 0x8151, "GL_CONSTANT_BORDER" },
+ { 0x8153, "GL_REPLICATE_BORDER" },
+ { 0x8154, "GL_CONVOLUTION_BORDER_COLOR" },
+ { 0x8191, "GL_GENERATE_MIPMAP" },
+ { 0x8192, "GL_GENERATE_MIPMAP_HINT" },
+ { 0x81A5, "GL_DEPTH_COMPONENT16_ARB" },
+ { 0x81A5, "GL_DEPTH_COMPONENT16" },
+ { 0x81A6, "GL_DEPTH_COMPONENT24_ARB" },
+ { 0x81A6, "GL_DEPTH_COMPONENT24" },
+ { 0x81A7, "GL_DEPTH_COMPONENT32_ARB" },
+ { 0x81A7, "GL_DEPTH_COMPONENT32" },
+ { 0x81A8, "GL_ARRAY_ELEMENT_LOCK_FIRST_EXT" },
+ { 0x81A9, "GL_ARRAY_ELEMENT_LOCK_COUNT_EXT" },
+ { 0x81AA, "GL_CULL_VERTEX_EXT" },
+ { 0x81AB, "GL_CULL_VERTEX_EYE_POSITION_EXT" },
+ { 0x81AC, "GL_CULL_VERTEX_OBJECT_POSITION_EXT" },
+ { 0x81AD, "GL_IUI_V2F_EXT" },
+ { 0x81AE, "GL_IUI_V3F_EXT" },
+ { 0x81AF, "GL_IUI_N3F_V2F_EXT" },
+ { 0x81B0, "GL_IUI_N3F_V3F_EXT" },
+ { 0x81B1, "GL_T2F_IUI_V2F_EXT" },
+ { 0x81B2, "GL_T2F_IUI_V3F_EXT" },
+ { 0x81B3, "GL_T2F_IUI_N3F_V2F_EXT" },
+ { 0x81B4, "GL_T2F_IUI_N3F_V3F_EXT" },
+ { 0x81B5, "GL_INDEX_TEST_EXT" },
+ { 0x81B6, "GL_INDEX_TEST_FUNC_EXT" },
+ { 0x81B7, "GL_INDEX_TEST_REF_EXT" },
+ { 0x81B8, "GL_INDEX_MATERIAL_EXT" },
+ { 0x81B9, "GL_INDEX_MATERIAL_PARAMETER_EXT" },
+ { 0x81BA, "GL_INDEX_MATERIAL_FACE_EXT" },
+ { 0x81F8, "GL_LIGHT_MODEL_COLOR_CONTROL_EXT" },
+ { 0x81F8, "GL_LIGHT_MODEL_COLOR_CONTROL" },
+ { 0x81F9, "GL_SINGLE_COLOR_EXT" },
+ { 0x81F9, "GL_SINGLE_COLOR" },
+ { 0x81FA, "GL_SEPARATE_SPECULAR_COLOR_EXT" },
+ { 0x81FA, "GL_SEPARATE_SPECULAR_COLOR" },
+ { 0x81FB, "GL_SHARED_TEXTURE_PALETTE_EXT" },
+ { 0x8210, "GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING" },
+ { 0x8211, "GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE" },
+ { 0x8212, "GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE" },
+ { 0x8213, "GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE" },
+ { 0x8214, "GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE" },
+ { 0x8215, "GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE" },
+ { 0x8216, "GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE" },
+ { 0x8217, "GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE" },
+ { 0x8218, "GL_FRAMEBUFFER_DEFAULT" },
+ { 0x8219, "GL_FRAMEBUFFER_UNDEFINED" },
+ { 0x821A, "GL_DEPTH_STENCIL_ATTACHMENT" },
+ { 0x8225, "GL_COMPRESSED_RED" },
+ { 0x8226, "GL_COMPRESSED_RG" },
+ { 0x8227, "GL_RG" },
+ { 0x8228, "GL_RG_INTEGER" },
+ { 0x8229, "GL_R8" },
+ { 0x822A, "GL_R16" },
+ { 0x822B, "GL_RG8" },
+ { 0x822C, "GL_RG16" },
+ { 0x822D, "GL_R16F" },
+ { 0x822E, "GL_R32F" },
+ { 0x822F, "GL_RG16F" },
+ { 0x8230, "GL_RG32F" },
+ { 0x8231, "GL_R8I" },
+ { 0x8232, "GL_R8UI" },
+ { 0x8233, "GL_R16I" },
+ { 0x8234, "GL_R16UI" },
+ { 0x8235, "GL_R32I" },
+ { 0x8236, "GL_R32UI" },
+ { 0x8237, "GL_RG8I" },
+ { 0x8238, "GL_RG8UI" },
+ { 0x8239, "GL_RG16I" },
+ { 0x823A, "GL_RG16UI" },
+ { 0x823B, "GL_RG32I" },
+ { 0x823C, "GL_RG32UI" },
+ { 0x8330, "GL_PIXEL_TRANSFORM_2D_EXT" },
+ { 0x8331, "GL_PIXEL_MAG_FILTER_EXT" },
+ { 0x8332, "GL_PIXEL_MIN_FILTER_EXT" },
+ { 0x8333, "GL_PIXEL_CUBIC_WEIGHT_EXT" },
+ { 0x8334, "GL_CUBIC_EXT" },
+ { 0x8335, "GL_AVERAGE_EXT" },
+ { 0x8336, "GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT" },
+ { 0x8337, "GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT" },
+ { 0x8338, "GL_PIXEL_TRANSFORM_2D_MATRIX_EXT" },
+ { 0x8349, "GL_FRAGMENT_MATERIAL_EXT" },
+ { 0x834A, "GL_FRAGMENT_NORMAL_EXT" },
+ { 0x834C, "GL_FRAGMENT_COLOR_EXT" },
+ { 0x834D, "GL_ATTENUATION_EXT" },
+ { 0x834E, "GL_SHADOW_ATTENUATION_EXT" },
+ { 0x834F, "GL_TEXTURE_APPLICATION_MODE_EXT" },
+ { 0x8350, "GL_TEXTURE_LIGHT_EXT" },
+ { 0x8351, "GL_TEXTURE_MATERIAL_FACE_EXT" },
+ { 0x8352, "GL_TEXTURE_MATERIAL_PARAMETER_EXT" },
+ { 0x8362, "GL_UNSIGNED_BYTE_2_3_3_REV" },
+ { 0x8363, "GL_UNSIGNED_SHORT_5_6_5" },
+ { 0x8364, "GL_UNSIGNED_SHORT_5_6_5_REV" },
+ { 0x8365, "GL_UNSIGNED_SHORT_4_4_4_4_REV" },
+ { 0x8366, "GL_UNSIGNED_SHORT_1_5_5_5_REV" },
+ { 0x8367, "GL_UNSIGNED_INT_8_8_8_8_REV" },
+ { 0x8368, "GL_UNSIGNED_INT_2_10_10_10_REV" },
+ { 0x8370, "GL_MIRRORED_REPEAT_ARB" },
+ { 0x8370, "GL_MIRRORED_REPEAT" },
+ { 0x83F0, "GL_COMPRESSED_RGB_S3TC_DXT1_EXT" },
+ { 0x83F1, "GL_COMPRESSED_RGBA_S3TC_DXT1_EXT" },
+ { 0x83F2, "GL_COMPRESSED_RGBA_S3TC_DXT3_EXT" },
+ { 0x83F3, "GL_COMPRESSED_RGBA_S3TC_DXT5_EXT" },
+ { 0x8439, "GL_TANGENT_ARRAY_EXT" },
+ { 0x843A, "GL_BINORMAL_ARRAY_EXT" },
+ { 0x843B, "GL_CURRENT_TANGENT_EXT" },
+ { 0x843C, "GL_CURRENT_BINORMAL_EXT" },
+ { 0x843E, "GL_TANGENT_ARRAY_TYPE_EXT" },
+ { 0x843F, "GL_TANGENT_ARRAY_STRIDE_EXT" },
+ { 0x8440, "GL_BINORMAL_ARRAY_TYPE_EXT" },
+ { 0x8441, "GL_BINORMAL_ARRAY_STRIDE_EXT" },
+ { 0x8442, "GL_TANGENT_ARRAY_POINTER_EXT" },
+ { 0x8443, "GL_BINORMAL_ARRAY_POINTER_EXT" },
+ { 0x8444, "GL_MAP1_TANGENT_EXT" },
+ { 0x8445, "GL_MAP2_TANGENT_EXT" },
+ { 0x8446, "GL_MAP1_BINORMAL_EXT" },
+ { 0x8447, "GL_MAP2_BINORMAL_EXT" },
+ { 0x8450, "GL_FOG_COORD_SRC" },
+ { 0x8450, "GL_FOG_COORDINATE_SOURCE_EXT" },
+ { 0x8450, "GL_FOG_COORDINATE_SOURCE" },
+ { 0x8451, "GL_FOG_COORD" },
+ { 0x8451, "GL_FOG_COORDINATE_EXT" },
+ { 0x8451, "GL_FOG_COORDINATE" },
+ { 0x8452, "GL_FRAGMENT_DEPTH_EXT" },
+ { 0x8452, "GL_FRAGMENT_DEPTH" },
+ { 0x8453 , "GL_CURRENT_FOG_COORD" },
+ { 0x8453 , "GL_CURRENT_FOG_COORDINATE" },
+ { 0x8453, "GL_CURRENT_FOG_COORDINATE_EXT" },
+ { 0x8454, "GL_FOG_COORD_ARRAY_TYPE" },
+ { 0x8454, "GL_FOG_COORDINATE_ARRAY_TYPE_EXT" },
+ { 0x8454, "GL_FOG_COORDINATE_ARRAY_TYPE" },
+ { 0x8455, "GL_FOG_COORD_ARRAY_STRIDE" },
+ { 0x8455, "GL_FOG_COORDINATE_ARRAY_STRIDE_EXT" },
+ { 0x8455, "GL_FOG_COORDINATE_ARRAY_STRIDE" },
+ { 0x8456, "GL_FOG_COORD_ARRAY_POINTER" },
+ { 0x8456, "GL_FOG_COORDINATE_ARRAY_POINTER_EXT" },
+ { 0x8456, "GL_FOG_COORDINATE_ARRAY_POINTER" },
+ { 0x8457, "GL_FOG_COORD_ARRAY" },
+ { 0x8457, "GL_FOG_COORDINATE_ARRAY_EXT" },
+ { 0x8457, "GL_FOG_COORDINATE_ARRAY" },
+ { 0x8458, "GL_COLOR_SUM_ARB" },
+ { 0x8458, "GL_COLOR_SUM_EXT" },
+ { 0x8458, "GL_COLOR_SUM" },
+ { 0x8459, "GL_CURRENT_SECONDARY_COLOR_EXT" },
+ { 0x8459, "GL_CURRENT_SECONDARY_COLOR" },
+ { 0x845A, "GL_SECONDARY_COLOR_ARRAY_SIZE_EXT" },
+ { 0x845A, "GL_SECONDARY_COLOR_ARRAY_SIZE" },
+ { 0x845B, "GL_SECONDARY_COLOR_ARRAY_TYPE_EXT" },
+ { 0x845B, "GL_SECONDARY_COLOR_ARRAY_TYPE" },
+ { 0x845C, "GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT" },
+ { 0x845C, "GL_SECONDARY_COLOR_ARRAY_STRIDE" },
+ { 0x845D, "GL_SECONDARY_COLOR_ARRAY_POINTER_EXT" },
+ { 0x845D, "GL_SECONDARY_COLOR_ARRAY_POINTER" },
+ { 0x845E, "GL_SECONDARY_COLOR_ARRAY_EXT" },
+ { 0x845E, "GL_SECONDARY_COLOR_ARRAY" },
+ { 0x845F, "GL_CURRENT_RASTER_SECONDARY_COLOR" },
+ { 0x846D, "GL_ALIASED_POINT_SIZE_RANGE" },
+ { 0x846E, "GL_ALIASED_LINE_WIDTH_RANGE" },
+ { 0x84C0, "GL_TEXTURE0" },
+ { 0x84C1, "GL_TEXTURE1" },
+ { 0x84C2, "GL_TEXTURE2" },
+ { 0x84C3, "GL_TEXTURE3" },
+ { 0x84C4, "GL_TEXTURE4" },
+ { 0x84C5, "GL_TEXTURE5" },
+ { 0x84C6, "GL_TEXTURE6" },
+ { 0x84C7, "GL_TEXTURE7" },
+ { 0x84C8, "GL_TEXTURE8" },
+ { 0x84C9, "GL_TEXTURE9" },
+ { 0x84CA, "GL_TEXTURE10" },
+ { 0x84CB, "GL_TEXTURE11" },
+ { 0x84CC, "GL_TEXTURE12" },
+ { 0x84CD, "GL_TEXTURE13" },
+ { 0x84CE, "GL_TEXTURE14" },
+ { 0x84CF, "GL_TEXTURE15" },
+ { 0x84D0, "GL_TEXTURE16" },
+ { 0x84D1, "GL_TEXTURE17" },
+ { 0x84D2, "GL_TEXTURE18" },
+ { 0x84D3, "GL_TEXTURE19" },
+ { 0x84D4, "GL_TEXTURE20" },
+ { 0x84D5, "GL_TEXTURE21" },
+ { 0x84D6, "GL_TEXTURE22" },
+ { 0x84D7, "GL_TEXTURE23" },
+ { 0x84D8, "GL_TEXTURE24" },
+ { 0x84D9, "GL_TEXTURE25" },
+ { 0x84DA, "GL_TEXTURE26" },
+ { 0x84DB, "GL_TEXTURE27" },
+ { 0x84DC, "GL_TEXTURE28" },
+ { 0x84DD, "GL_TEXTURE29" },
+ { 0x84DE, "GL_TEXTURE30" },
+ { 0x84DF, "GL_TEXTURE31" },
+ { 0x84E0, "GL_ACTIVE_TEXTURE" },
+ { 0x84E1, "GL_CLIENT_ACTIVE_TEXTURE" },
+ { 0x84E2, "GL_MAX_TEXTURE_UNITS" },
+ { 0x84E3, "GL_TRANSPOSE_MODELVIEW_MATRIX" },
+ { 0x84E4, "GL_TRANSPOSE_PROJECTION_MATRIX" },
+ { 0x84E5, "GL_TRANSPOSE_TEXTURE_MATRIX" },
+ { 0x84E6, "GL_TRANSPOSE_COLOR_MATRIX" },
+ { 0x84E7, "GL_SUBTRACT" },
+ { 0x84E8, "GL_MAX_RENDERBUFFER_SIZE" },
+ { 0x84E9, "GL_COMPRESSED_ALPHA" },
+ { 0x84EA, "GL_COMPRESSED_LUMINANCE" },
+ { 0x84EB, "GL_COMPRESSED_LUMINANCE_ALPHA" },
+ { 0x84EC, "GL_COMPRESSED_INTENSITY" },
+ { 0x84ED, "GL_COMPRESSED_RGB" },
+ { 0x84EE, "GL_COMPRESSED_RGBA" },
+ { 0x84EF, "GL_TEXTURE_COMPRESSION_HINT" },
+ { 0x84F5, "GL_TEXTURE_RECTANGLE_EXT" },
+ { 0x84F6, "GL_TEXTURE_BINDING_RECTANGLE_EXT" },
+ { 0x84F7, "GL_PROXY_TEXTURE_RECTANGLE_EXT" },
+ { 0x84F8, "GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT" },
+ { 0x84F9, "GL_DEPTH_STENCIL" },
+ { 0x84FA, "GL_UNSIGNED_INT_24_8" },
+ { 0x84FD, "GL_MAX_TEXTURE_LOD_BIAS" },
+ { 0x84FE, "GL_TEXTURE_MAX_ANISOTROPY_EXT" },
+ { 0x84FF, "GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT" },
+ { 0x8500, "GL_TEXTURE_FILTER_CONTROL" },
+ { 0x8501, "GL_TEXTURE_LOD_BIAS" },
+ { 0x8502, "GL_MODELVIEW1_STACK_DEPTH_EXT" },
+ { 0x8506, "GL_MODELVIEW_MATRIX1_EXT" },
+ { 0x8507, "GL_INCR_WRAP" },
+ { 0x8508, "GL_DECR_WRAP" },
+ { 0x8509, "GL_VERTEX_WEIGHTING_EXT" },
+ { 0x850A, "GL_MODELVIEW1_ARB" },
+ { 0x850B, "GL_CURRENT_VERTEX_WEIGHT_EXT" },
+ { 0x850C, "GL_VERTEX_WEIGHT_ARRAY_EXT" },
+ { 0x850D, "GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT" },
+ { 0x850E, "GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT" },
+ { 0x850F, "GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT" },
+ { 0x8510, "GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT" },
+ { 0x8511, "GL_NORMAL_MAP_ARB" },
+ { 0x8511, "GL_NORMAL_MAP_EXT" },
+ { 0x8511, "GL_NORMAL_MAP" },
+ { 0x8512, "GL_REFLECTION_MAP_ARB" },
+ { 0x8512, "GL_REFLECTION_MAP_EXT" },
+ { 0x8512, "GL_REFLECTION_MAP" },
+ { 0x8513, "GL_TEXTURE_CUBE_MAP_ARB" },
+ { 0x8513, "GL_TEXTURE_CUBE_MAP_EXT" },
+ { 0x8513, "GL_TEXTURE_CUBE_MAP" },
+ { 0x8514, "GL_TEXTURE_BINDING_CUBE_MAP_ARB" },
+ { 0x8514, "GL_TEXTURE_BINDING_CUBE_MAP_EXT" },
+ { 0x8514, "GL_TEXTURE_BINDING_CUBE_MAP" },
+ { 0x8515, "GL_TEXTURE_CUBE_MAP_POSITIVE_X" },
+ { 0x8516, "GL_TEXTURE_CUBE_MAP_NEGATIVE_X" },
+ { 0x8517, "GL_TEXTURE_CUBE_MAP_POSITIVE_Y" },
+ { 0x8518, "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y" },
+ { 0x8519, "GL_TEXTURE_CUBE_MAP_POSITIVE_Z" },
+ { 0x851A, "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z" },
+ { 0x851B, "GL_PROXY_TEXTURE_CUBE_MAP" },
+ { 0x851C, "GL_MAX_CUBE_MAP_TEXTURE_SIZE" },
+ { 0x851D, "GL_VERTEX_ARRAY_RANGE_APPLE" },
+ { 0x851E, "GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE" },
+ { 0x851F, "GL_VERTEX_ARRAY_STORAGE_HINT_APPLE" },
+ { 0x8520, "GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_APPLE" },
+ { 0x8521, "GL_VERTEX_ARRAY_RANGE_POINTER_APPLE" },
+ { 0x8570, "GL_COMBINE_ARB" },
+ { 0x8570, "GL_COMBINE_EXT" },
+ { 0x8570, "GL_COMBINE" },
+ { 0x8571, "GL_COMBINE_RGB_ARB" },
+ { 0x8571, "GL_COMBINE_RGB_EXT" },
+ { 0x8571, "GL_COMBINE_RGB" },
+ { 0x8572, "GL_COMBINE_ALPHA_ARB" },
+ { 0x8572, "GL_COMBINE_ALPHA_EXT" },
+ { 0x8572, "GL_COMBINE_ALPHA" },
+ { 0x8573, "GL_RGB_SCALE_ARB" },
+ { 0x8573, "GL_RGB_SCALE_EXT" },
+ { 0x8573, "GL_RGB_SCALE" },
+ { 0x8574, "GL_ADD_SIGNED_ARB" },
+ { 0x8574, "GL_ADD_SIGNED_EXT" },
+ { 0x8574, "GL_ADD_SIGNED" },
+ { 0x8575, "GL_INTERPOLATE_ARB" },
+ { 0x8575, "GL_INTERPOLATE_EXT" },
+ { 0x8575, "GL_INTERPOLATE" },
+ { 0x8576, "GL_CONSTANT_ARB" },
+ { 0x8576, "GL_CONSTANT_EXT" },
+ { 0x8576, "GL_CONSTANT" },
+ { 0x8577, "GL_PRIMARY_COLOR_ARB" },
+ { 0x8577, "GL_PRIMARY_COLOR_EXT" },
+ { 0x8577, "GL_PRIMARY_COLOR" },
+ { 0x8578, "GL_PREVIOUS_ARB" },
+ { 0x8578, "GL_PREVIOUS_EXT" },
+ { 0x8578, "GL_PREVIOUS" },
+ { 0x8580, "GL_SOURCE0_RGB_ARB" },
+ { 0x8580, "GL_SOURCE0_RGB_EXT" },
+ { 0x8580, "GL_SOURCE0_RGB" },
+ { 0x8580, "GL_SRC0_RGB" },
+ { 0x8581, "GL_SOURCE1_RGB_ARB" },
+ { 0x8581, "GL_SOURCE1_RGB_EXT" },
+ { 0x8581, "GL_SOURCE1_RGB" },
+ { 0x8581, "GL_SRC1_RGB" },
+ { 0x8582, "GL_SOURCE2_RGB_ARB" },
+ { 0x8582, "GL_SOURCE2_RGB_EXT" },
+ { 0x8582, "GL_SOURCE2_RGB" },
+ { 0x8582, "GL_SRC2_RGB" },
+ { 0x8583, "GL_SOURCE3_RGB_ARB" },
+ { 0x8583, "GL_SOURCE3_RGB_EXT" },
+ { 0x8583, "GL_SOURCE3_RGB" },
+ { 0x8583, "GL_SRC3_RGB" },
+ { 0x8584, "GL_SOURCE4_RGB_ARB" },
+ { 0x8584, "GL_SOURCE4_RGB_EXT" },
+ { 0x8584, "GL_SOURCE4_RGB" },
+ { 0x8584, "GL_SRC4_RGB" },
+ { 0x8585, "GL_SOURCE5_RGB_ARB" },
+ { 0x8585, "GL_SOURCE5_RGB_EXT" },
+ { 0x8585, "GL_SOURCE5_RGB" },
+ { 0x8585, "GL_SRC5_RGB" },
+ { 0x8586, "GL_SOURCE6_RGB_ARB" },
+ { 0x8586, "GL_SOURCE6_RGB_EXT" },
+ { 0x8586, "GL_SOURCE6_RGB" },
+ { 0x8586, "GL_SRC6_RGB" },
+ { 0x8587, "GL_SOURCE7_RGB_ARB" },
+ { 0x8587, "GL_SOURCE7_RGB_EXT" },
+ { 0x8587, "GL_SOURCE7_RGB" },
+ { 0x8587, "GL_SRC7_RGB" },
+ { 0x8588, "GL_SOURCE0_ALPHA_ARB" },
+ { 0x8588, "GL_SOURCE0_ALPHA_EXT" },
+ { 0x8588, "GL_SOURCE0_ALPHA" },
+ { 0x8588, "GL_SRC0_ALPHA" },
+ { 0x8589, "GL_SOURCE1_ALPHA_ARB" },
+ { 0x8589, "GL_SOURCE1_ALPHA_EXT" },
+ { 0x8589, "GL_SOURCE1_ALPHA" },
+ { 0x8589, "GL_SRC1_ALPHA" },
+ { 0x858A, "GL_SOURCE2_ALPHA_ARB" },
+ { 0x858A, "GL_SOURCE2_ALPHA_EXT" },
+ { 0x858A, "GL_SOURCE2_ALPHA" },
+ { 0x858A, "GL_SRC2_ALPHA" },
+ { 0x858B, "GL_SOURCE3_ALPHA_ARB" },
+ { 0x858B, "GL_SOURCE3_ALPHA_EXT" },
+ { 0x858B, "GL_SOURCE3_ALPHA" },
+ { 0x858B, "GL_SRC3_ALPHA" },
+ { 0x858C, "GL_SOURCE4_ALPHA_ARB" },
+ { 0x858C, "GL_SOURCE4_ALPHA_EXT" },
+ { 0x858C, "GL_SOURCE4_ALPHA" },
+ { 0x858C, "GL_SRC4_ALPHA" },
+ { 0x858D, "GL_SOURCE5_ALPHA_ARB" },
+ { 0x858D, "GL_SOURCE5_ALPHA_EXT" },
+ { 0x858D, "GL_SOURCE5_ALPHA" },
+ { 0x858D, "GL_SRC5_ALPHA" },
+ { 0x858E, "GL_SOURCE6_ALPHA_ARB" },
+ { 0x858E, "GL_SOURCE6_ALPHA_EXT" },
+ { 0x858E, "GL_SOURCE6_ALPHA" },
+ { 0x858E, "GL_SRC6_ALPHA" },
+ { 0x858F, "GL_SOURCE7_ALPHA_ARB" },
+ { 0x858F, "GL_SOURCE7_ALPHA_EXT" },
+ { 0x858F, "GL_SOURCE7_ALPHA" },
+ { 0x858F, "GL_SRC7_ALPHA" },
+ { 0x8590, "GL_OPERAND0_RGB_ARB" },
+ { 0x8590, "GL_OPERAND0_RGB_EXT" },
+ { 0x8590, "GL_OPERAND0_RGB" },
+ { 0x8591, "GL_OPERAND1_RGB_ARB" },
+ { 0x8591, "GL_OPERAND1_RGB_EXT" },
+ { 0x8591, "GL_OPERAND1_RGB" },
+ { 0x8592, "GL_OPERAND2_RGB_ARB" },
+ { 0x8592, "GL_OPERAND2_RGB_EXT" },
+ { 0x8592, "GL_OPERAND2_RGB" },
+ { 0x8593, "GL_OPERAND3_RGB_ARB" },
+ { 0x8593, "GL_OPERAND3_RGB_EXT" },
+ { 0x8593, "GL_OPERAND3_RGB" },
+ { 0x8594, "GL_OPERAND4_RGB_ARB" },
+ { 0x8594, "GL_OPERAND4_RGB_EXT" },
+ { 0x8594, "GL_OPERAND4_RGB" },
+ { 0x8595, "GL_OPERAND5_RGB_ARB" },
+ { 0x8595, "GL_OPERAND5_RGB_EXT" },
+ { 0x8595, "GL_OPERAND5_RGB" },
+ { 0x8596, "GL_OPERAND6_RGB_ARB" },
+ { 0x8596, "GL_OPERAND6_RGB_EXT" },
+ { 0x8596, "GL_OPERAND6_RGB" },
+ { 0x8597, "GL_OPERAND7_RGB_ARB" },
+ { 0x8597, "GL_OPERAND7_RGB_EXT" },
+ { 0x8597, "GL_OPERAND7_RGB" },
+ { 0x8598, "GL_OPERAND0_ALPHA_ARB" },
+ { 0x8598, "GL_OPERAND0_ALPHA_EXT" },
+ { 0x8598, "GL_OPERAND0_ALPHA" },
+ { 0x8599, "GL_OPERAND1_ALPHA_ARB" },
+ { 0x8599, "GL_OPERAND1_ALPHA_EXT" },
+ { 0x8599, "GL_OPERAND1_ALPHA" },
+ { 0x859A, "GL_OPERAND2_ALPHA_ARB" },
+ { 0x859A, "GL_OPERAND2_ALPHA_EXT" },
+ { 0x859A, "GL_OPERAND2_ALPHA" },
+ { 0x859B, "GL_OPERAND3_ALPHA_ARB" },
+ { 0x859B, "GL_OPERAND3_ALPHA_EXT" },
+ { 0x859B, "GL_OPERAND3_ALPHA" },
+ { 0x859C, "GL_OPERAND4_ALPHA_ARB" },
+ { 0x859C, "GL_OPERAND4_ALPHA_EXT" },
+ { 0x859C, "GL_OPERAND4_ALPHA" },
+ { 0x859D, "GL_OPERAND5_ALPHA_ARB" },
+ { 0x859D, "GL_OPERAND5_ALPHA_EXT" },
+ { 0x859D, "GL_OPERAND5_ALPHA" },
+ { 0x859E, "GL_OPERAND6_ALPHA_ARB" },
+ { 0x859E, "GL_OPERAND6_ALPHA_EXT" },
+ { 0x859E, "GL_OPERAND6_ALPHA" },
+ { 0x859F, "GL_OPERAND7_ALPHA_ARB" },
+ { 0x859F, "GL_OPERAND7_ALPHA_EXT" },
+ { 0x859F, "GL_OPERAND7_ALPHA" },
+ { 0x85AE, "GL_PERTURB_EXT" },
+ { 0x85AF, "GL_TEXTURE_NORMAL_EXT" },
+ { 0x85B4, "GL_STORAGE_CLIENT_APPLE" },
+ { 0x85B5, "GL_VERTEX_ARRAY_BINDING_APPLE" },
+ { 0x85BD, "GL_STORAGE_PRIVATE_APPLE" },
+ { 0x85BE, "GL_STORAGE_CACHED_APPLE" },
+ { 0x85BF, "GL_STORAGE_SHARED_APPLE" },
+ { 0x8620, "GL_VERTEX_PROGRAM_ARB" },
+ { 0x8620, "GL_VERTEX_PROGRAM_NV" },
+ { 0x8621, "GL_VERTEX_STATE_PROGRAM_NV" },
+ { 0x8622, "GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB" },
+ { 0x8622, "GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB" },
+ { 0x8622, "GL_VERTEX_ATTRIB_ARRAY_ENABLED" },
+ { 0x8623, "GL_ATTRIB_ARRAY_SIZE_NV" },
+ { 0x8623, "GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB" },
+ { 0x8623, "GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB" },
+ { 0x8623, "GL_VERTEX_ATTRIB_ARRAY_SIZE" },
+ { 0x8624, "GL_ATTRIB_ARRAY_STRIDE_NV" },
+ { 0x8624, "GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB" },
+ { 0x8624, "GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB" },
+ { 0x8624, "GL_VERTEX_ATTRIB_ARRAY_STRIDE" },
+ { 0x8625, "GL_ATTRIB_ARRAY_TYPE_NV" },
+ { 0x8625, "GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB" },
+ { 0x8625, "GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB" },
+ { 0x8625, "GL_VERTEX_ATTRIB_ARRAY_TYPE" },
+ { 0x8626, "GL_CURRENT_ATTRIB_NV" },
+ { 0x8626, "GL_CURRENT_VERTEX_ATTRIB_ARB" },
+ { 0x8626, "GL_CURRENT_VERTEX_ATTRIB_ARB" },
+ { 0x8626, "GL_CURRENT_VERTEX_ATTRIB" },
+ { 0x8627, "GL_PROGRAM_LENGTH_ARB" },
+ { 0x8627, "GL_PROGRAM_LENGTH_NV" },
+ { 0x8628, "GL_PROGRAM_STRING_ARB" },
+ { 0x8628, "GL_PROGRAM_STRING_NV" },
+ { 0x8629, "GL_MODELVIEW_PROJECTION_NV" },
+ { 0x862A, "GL_IDENTITY_NV" },
+ { 0x862B, "GL_INVERSE_NV" },
+ { 0x862C, "GL_TRANSPOSE_NV" },
+ { 0x862D, "GL_INVERSE_TRANSPOSE_NV" },
+ { 0x862E, "GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB" },
+ { 0x862E, "GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV" },
+ { 0x862F, "GL_MAX_PROGRAM_MATRICES_ARB" },
+ { 0x862F, "GL_MAX_TRACK_MATRICES_NV" },
+ { 0x8630, "GL_MATRIX0_NV" },
+ { 0x8631, "GL_MATRIX1_NV" },
+ { 0x8632, "GL_MATRIX2_NV" },
+ { 0x8633, "GL_MATRIX3_NV" },
+ { 0x8634, "GL_MATRIX4_NV" },
+ { 0x8635, "GL_MATRIX5_NV" },
+ { 0x8636, "GL_MATRIX6_NV" },
+ { 0x8637, "GL_MATRIX7_NV" },
+ { 0x8640, "GL_CURRENT_MATRIX_STACK_DEPTH_ARB" },
+ { 0x8640, "GL_CURRENT_MATRIX_STACK_DEPTH_NV" },
+ { 0x8641, "GL_CURRENT_MATRIX_ARB" },
+ { 0x8641, "GL_CURRENT_MATRIX_NV" },
+ { 0x8642, "GL_PROGRAM_POINT_SIZE_EXT" },
+ { 0x8642, "GL_VERTEX_PROGRAM_POINT_SIZE_ARB" },
+ { 0x8642, "GL_VERTEX_PROGRAM_POINT_SIZE_ARB" },
+ { 0x8642, "GL_VERTEX_PROGRAM_POINT_SIZE_NV" },
+ { 0x8642, "GL_VERTEX_PROGRAM_POINT_SIZE" },
+ { 0x8643, "GL_VERTEX_PROGRAM_TWO_SIDE_ARB" },
+ { 0x8643, "GL_VERTEX_PROGRAM_TWO_SIDE_ARB" },
+ { 0x8643, "GL_VERTEX_PROGRAM_TWO_SIDE_NV" },
+ { 0x8643, "GL_VERTEX_PROGRAM_TWO_SIDE" },
+ { 0x8644, "GL_PROGRAM_PARAMETER_NV" },
+ { 0x8645, "GL_ATTRIB_ARRAY_POINTER_NV" },
+ { 0x8645, "GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB" },
+ { 0x8645, "GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB" },
+ { 0x8645, "GL_VERTEX_ATTRIB_ARRAY_POINTER" },
+ { 0x8646, "GL_PROGRAM_TARGET_NV" },
+ { 0x8647, "GL_PROGRAM_RESIDENT_NV" },
+ { 0x8648, "GL_TRACK_MATRIX_NV" },
+ { 0x8649, "GL_TRACK_MATRIX_TRANSFORM_NV" },
+ { 0x864A, "GL_VERTEX_PROGRAM_BINDING_NV" },
+ { 0x864B, "GL_PROGRAM_ERROR_POSITION_ARB" },
+ { 0x864B, "GL_PROGRAM_ERROR_POSITION_NV" },
+ { 0x8650, "GL_VERTEX_ATTRIB_ARRAY0_NV" },
+ { 0x8651, "GL_VERTEX_ATTRIB_ARRAY1_NV" },
+ { 0x8652, "GL_VERTEX_ATTRIB_ARRAY2_NV" },
+ { 0x8653, "GL_VERTEX_ATTRIB_ARRAY3_NV" },
+ { 0x8654, "GL_VERTEX_ATTRIB_ARRAY4_NV" },
+ { 0x8655, "GL_VERTEX_ATTRIB_ARRAY5_NV" },
+ { 0x8656, "GL_VERTEX_ATTRIB_ARRAY6_NV" },
+ { 0x8657, "GL_VERTEX_ATTRIB_ARRAY7_NV" },
+ { 0x8658, "GL_VERTEX_ATTRIB_ARRAY8_NV" },
+ { 0x8659, "GL_VERTEX_ATTRIB_ARRAY9_NV" },
+ { 0x865A, "GL_VERTEX_ATTRIB_ARRAY10_NV" },
+ { 0x865B, "GL_VERTEX_ATTRIB_ARRAY11_NV" },
+ { 0x865C, "GL_VERTEX_ATTRIB_ARRAY12_NV" },
+ { 0x865D, "GL_VERTEX_ATTRIB_ARRAY13_NV" },
+ { 0x865E, "GL_VERTEX_ATTRIB_ARRAY14_NV" },
+ { 0x865F, "GL_VERTEX_ATTRIB_ARRAY15_NV" },
+ { 0x8660, "GL_MAP1_VERTEX_ATTRIB0_4_NV" },
+ { 0x8661, "GL_MAP1_VERTEX_ATTRIB1_4_NV" },
+ { 0x8662, "GL_MAP1_VERTEX_ATTRIB2_4_NV" },
+ { 0x8663, "GL_MAP1_VERTEX_ATTRIB3_4_NV" },
+ { 0x8664, "GL_MAP1_VERTEX_ATTRIB4_4_NV" },
+ { 0x8665, "GL_MAP1_VERTEX_ATTRIB5_4_NV" },
+ { 0x8666, "GL_MAP1_VERTEX_ATTRIB6_4_NV" },
+ { 0x8667, "GL_MAP1_VERTEX_ATTRIB7_4_NV" },
+ { 0x8668, "GL_MAP1_VERTEX_ATTRIB8_4_NV" },
+ { 0x8669, "GL_MAP1_VERTEX_ATTRIB9_4_NV" },
+ { 0x866A, "GL_MAP1_VERTEX_ATTRIB10_4_NV" },
+ { 0x866B, "GL_MAP1_VERTEX_ATTRIB11_4_NV" },
+ { 0x866C, "GL_MAP1_VERTEX_ATTRIB12_4_NV" },
+ { 0x866D, "GL_MAP1_VERTEX_ATTRIB13_4_NV" },
+ { 0x866E, "GL_MAP1_VERTEX_ATTRIB14_4_NV" },
+ { 0x866F, "GL_MAP1_VERTEX_ATTRIB15_4_NV" },
+ { 0x8670, "GL_MAP2_VERTEX_ATTRIB0_4_NV" },
+ { 0x8671, "GL_MAP2_VERTEX_ATTRIB1_4_NV" },
+ { 0x8672, "GL_MAP2_VERTEX_ATTRIB2_4_NV" },
+ { 0x8673, "GL_MAP2_VERTEX_ATTRIB3_4_NV" },
+ { 0x8674, "GL_MAP2_VERTEX_ATTRIB4_4_NV" },
+ { 0x8675, "GL_MAP2_VERTEX_ATTRIB5_4_NV" },
+ { 0x8676, "GL_MAP2_VERTEX_ATTRIB6_4_NV" },
+ { 0x8677, "GL_MAP2_VERTEX_ATTRIB7_4_NV" },
+ { 0x8677, "GL_PROGRAM_BINDING_ARB" },
+ { 0x8677, "GL_PROGRAM_NAME_ARB" },
+ { 0x8678, "GL_MAP2_VERTEX_ATTRIB8_4_NV" },
+ { 0x8679, "GL_MAP2_VERTEX_ATTRIB9_4_NV" },
+ { 0x867A, "GL_MAP2_VERTEX_ATTRIB10_4_NV" },
+ { 0x867B, "GL_MAP2_VERTEX_ATTRIB11_4_NV" },
+ { 0x867C, "GL_MAP2_VERTEX_ATTRIB12_4_NV" },
+ { 0x867D, "GL_MAP2_VERTEX_ATTRIB13_4_NV" },
+ { 0x867E, "GL_MAP2_VERTEX_ATTRIB14_4_NV" },
+ { 0x867F, "GL_MAP2_VERTEX_ATTRIB15_4_NV" },
+ { 0x86A0, "GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB" },
+ { 0x86A0, "GL_TEXTURE_COMPRESSED_IMAGE_SIZE" },
+ { 0x86A1, "GL_TEXTURE_COMPRESSED_ARB" },
+ { 0x86A1, "GL_TEXTURE_COMPRESSED" },
+ { 0x86A2, "GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB" },
+ { 0x86A2, "GL_NUM_COMPRESSED_TEXTURE_FORMATS" },
+ { 0x86A3, "GL_COMPRESSED_TEXTURE_FORMATS_ARB" },
+ { 0x86A3, "GL_COMPRESSED_TEXTURE_FORMATS" },
+ { 0x86A4, "GL_MAX_VERTEX_UNITS_ARB" },
+ { 0x86A5, "GL_ACTIVE_VERTEX_UNITS_ARB" },
+ { 0x86A6, "GL_WEIGHT_SUM_UNITY_ARB" },
+ { 0x86A7, "GL_VERTEX_BLEND_ARB" },
+ { 0x86A8, "GL_CURRENT_WEIGHT_ARB" },
+ { 0x86A9, "GL_WEIGHT_ARRAY_TYPE_ARB" },
+ { 0x86AA, "GL_WEIGHT_ARRAY_STRIDE_ARB" },
+ { 0x86AB, "GL_WEIGHT_ARRAY_SIZE_ARB" },
+ { 0x86AC, "GL_WEIGHT_ARRAY_POINTER_ARB" },
+ { 0x86AD, "GL_WEIGHT_ARRAY_ARB" },
+ { 0x86AE, "GL_DOT3_RGB_ARB" },
+ { 0x86AE, "GL_DOT3_RGB" },
+ { 0x86AF, "GL_DOT3_RGBA_ARB" },
+ { 0x86AF, "GL_DOT3_RGBA" },
+ { 0x8722, "GL_MODELVIEW2_ARB" },
+ { 0x8723, "GL_MODELVIEW3_ARB" },
+ { 0x8724, "GL_MODELVIEW4_ARB" },
+ { 0x8725, "GL_MODELVIEW5_ARB" },
+ { 0x8726, "GL_MODELVIEW6_ARB" },
+ { 0x8727, "GL_MODELVIEW7_ARB" },
+ { 0x8728, "GL_MODELVIEW8_ARB" },
+ { 0x8729, "GL_MODELVIEW9_ARB" },
+ { 0x872A, "GL_MODELVIEW10_ARB" },
+ { 0x872B, "GL_MODELVIEW11_ARB" },
+ { 0x872C, "GL_MODELVIEW12_ARB" },
+ { 0x872D, "GL_MODELVIEW13_ARB" },
+ { 0x872E, "GL_MODELVIEW14_ARB" },
+ { 0x872F, "GL_MODELVIEW15_ARB" },
+ { 0x8730, "GL_MODELVIEW16_ARB" },
+ { 0x8731, "GL_MODELVIEW17_ARB" },
+ { 0x8732, "GL_MODELVIEW18_ARB" },
+ { 0x8733, "GL_MODELVIEW19_ARB" },
+ { 0x8734, "GL_MODELVIEW20_ARB" },
+ { 0x8735, "GL_MODELVIEW21_ARB" },
+ { 0x8736, "GL_MODELVIEW22_ARB" },
+ { 0x8737, "GL_MODELVIEW23_ARB" },
+ { 0x8738, "GL_MODELVIEW24_ARB" },
+ { 0x8739, "GL_MODELVIEW25_ARB" },
+ { 0x873A, "GL_MODELVIEW26_ARB" },
+ { 0x873B, "GL_MODELVIEW27_ARB" },
+ { 0x873C, "GL_MODELVIEW28_ARB" },
+ { 0x873D, "GL_MODELVIEW29_ARB" },
+ { 0x873E, "GL_MODELVIEW30_ARB" },
+ { 0x873F, "GL_MODELVIEW31_ARB" },
+ { 0x8742, "GL_MIRROR_CLAMP_EXT" },
+ { 0x8743, "GL_MIRROR_CLAMP_TO_EDGE_EXT" },
+ { 0x8764, "GL_BUFFER_SIZE_ARB" },
+ { 0x8764, "GL_BUFFER_SIZE" },
+ { 0x8765, "GL_BUFFER_USAGE_ARB" },
+ { 0x8765, "GL_BUFFER_USAGE" },
+ { 0x8780, "GL_VERTEX_SHADER_EXT" },
+ { 0x8781, "GL_VERTEX_SHADER_BINDING_EXT" },
+ { 0x8782, "GL_OP_INDEX_EXT" },
+ { 0x8783, "GL_OP_NEGATE_EXT" },
+ { 0x8784, "GL_OP_DOT3_EXT" },
+ { 0x8785, "GL_OP_DOT4_EXT" },
+ { 0x8786, "GL_OP_MUL_EXT" },
+ { 0x8787, "GL_OP_ADD_EXT" },
+ { 0x8788, "GL_OP_MADD_EXT" },
+ { 0x8789, "GL_OP_FRAC_EXT" },
+ { 0x878A, "GL_OP_MAX_EXT" },
+ { 0x878B, "GL_OP_MIN_EXT" },
+ { 0x878C, "GL_OP_SET_GE_EXT" },
+ { 0x878D, "GL_OP_SET_LT_EXT" },
+ { 0x878E, "GL_OP_CLAMP_EXT" },
+ { 0x878F, "GL_OP_FLOOR_EXT" },
+ { 0x8790, "GL_OP_ROUND_EXT" },
+ { 0x8791, "GL_OP_EXP_BASE_2_EXT" },
+ { 0x8792, "GL_OP_LOG_BASE_2_EXT" },
+ { 0x8793, "GL_OP_POWER_EXT" },
+ { 0x8794, "GL_OP_RECIP_EXT" },
+ { 0x8795, "GL_OP_RECIP_SQRT_EXT" },
+ { 0x8796, "GL_OP_SUB_EXT" },
+ { 0x8797, "GL_OP_CROSS_PRODUCT_EXT" },
+ { 0x8798, "GL_OP_MULTIPLY_MATRIX_EXT" },
+ { 0x8799, "GL_OP_MOV_EXT" },
+ { 0x879A, "GL_OUTPUT_VERTEX_EXT" },
+ { 0x879B, "GL_OUTPUT_COLOR0_EXT" },
+ { 0x879C, "GL_OUTPUT_COLOR1_EXT" },
+ { 0x879D, "GL_OUTPUT_TEXTURE_COORD0_EXT" },
+ { 0x879E, "GL_OUTPUT_TEXTURE_COORD1_EXT" },
+ { 0x879F, "GL_OUTPUT_TEXTURE_COORD2_EXT" },
+ { 0x87A0, "GL_OUTPUT_TEXTURE_COORD3_EXT" },
+ { 0x87A1, "GL_OUTPUT_TEXTURE_COORD4_EXT" },
+ { 0x87A2, "GL_OUTPUT_TEXTURE_COORD5_EXT" },
+ { 0x87A3, "GL_OUTPUT_TEXTURE_COORD6_EXT" },
+ { 0x87A4, "GL_OUTPUT_TEXTURE_COORD7_EXT" },
+ { 0x87A5, "GL_OUTPUT_TEXTURE_COORD8_EXT" },
+ { 0x87A6, "GL_OUTPUT_TEXTURE_COORD9_EXT" },
+ { 0x87A7, "GL_OUTPUT_TEXTURE_COORD10_EXT" },
+ { 0x87A8, "GL_OUTPUT_TEXTURE_COORD11_EXT" },
+ { 0x87A9, "GL_OUTPUT_TEXTURE_COORD12_EXT" },
+ { 0x87AA, "GL_OUTPUT_TEXTURE_COORD13_EXT" },
+ { 0x87AB, "GL_OUTPUT_TEXTURE_COORD14_EXT" },
+ { 0x87AC, "GL_OUTPUT_TEXTURE_COORD15_EXT" },
+ { 0x87AD, "GL_OUTPUT_TEXTURE_COORD16_EXT" },
+ { 0x87AE, "GL_OUTPUT_TEXTURE_COORD17_EXT" },
+ { 0x87AF, "GL_OUTPUT_TEXTURE_COORD18_EXT" },
+ { 0x87B0, "GL_OUTPUT_TEXTURE_COORD19_EXT" },
+ { 0x87B1, "GL_OUTPUT_TEXTURE_COORD20_EXT" },
+ { 0x87B2, "GL_OUTPUT_TEXTURE_COORD21_EXT" },
+ { 0x87B3, "GL_OUTPUT_TEXTURE_COORD22_EXT" },
+ { 0x87B4, "GL_OUTPUT_TEXTURE_COORD23_EXT" },
+ { 0x87B5, "GL_OUTPUT_TEXTURE_COORD24_EXT" },
+ { 0x87B6, "GL_OUTPUT_TEXTURE_COORD25_EXT" },
+ { 0x87B7, "GL_OUTPUT_TEXTURE_COORD26_EXT" },
+ { 0x87B8, "GL_OUTPUT_TEXTURE_COORD27_EXT" },
+ { 0x87B9, "GL_OUTPUT_TEXTURE_COORD28_EXT" },
+ { 0x87BA, "GL_OUTPUT_TEXTURE_COORD29_EXT" },
+ { 0x87BB, "GL_OUTPUT_TEXTURE_COORD30_EXT" },
+ { 0x87BC, "GL_OUTPUT_TEXTURE_COORD31_EXT" },
+ { 0x87BD, "GL_OUTPUT_FOG_EXT" },
+ { 0x87BE, "GL_SCALAR_EXT" },
+ { 0x87BF, "GL_VECTOR_EXT" },
+ { 0x87C0, "GL_MATRIX_EXT" },
+ { 0x87C1, "GL_VARIANT_EXT" },
+ { 0x87C2, "GL_INVARIANT_EXT" },
+ { 0x87C3, "GL_LOCAL_CONSTANT_EXT" },
+ { 0x87C4, "GL_LOCAL_EXT" },
+ { 0x87C5, "GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT" },
+ { 0x87C6, "GL_MAX_VERTEX_SHADER_VARIANTS_EXT" },
+ { 0x87C7, "GL_MAX_VERTEX_SHADER_INVARIANTS_EXT" },
+ { 0x87C8, "GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT" },
+ { 0x87C9, "GL_MAX_VERTEX_SHADER_LOCALS_EXT" },
+ { 0x87CA, "GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT" },
+ { 0x87CB, "GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT" },
+ { 0x87CC, "GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT" },
+ { 0x87CD, "GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT" },
+ { 0x87CE, "GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT" },
+ { 0x87CF, "GL_VERTEX_SHADER_INSTRUCTIONS_EXT" },
+ { 0x87D0, "GL_VERTEX_SHADER_VARIANTS_EXT" },
+ { 0x87D1, "GL_VERTEX_SHADER_INVARIANTS_EXT" },
+ { 0x87D2, "GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT" },
+ { 0x87D3, "GL_VERTEX_SHADER_LOCALS_EXT" },
+ { 0x87D4, "GL_VERTEX_SHADER_OPTIMIZED_EXT" },
+ { 0x87D5, "GL_X_EXT" },
+ { 0x87D6, "GL_Y_EXT" },
+ { 0x87D7, "GL_Z_EXT" },
+ { 0x87D8, "GL_W_EXT" },
+ { 0x87D9, "GL_NEGATIVE_X_EXT" },
+ { 0x87DA, "GL_NEGATIVE_Y_EXT" },
+ { 0x87DB, "GL_NEGATIVE_Z_EXT" },
+ { 0x87DC, "GL_NEGATIVE_W_EXT" },
+ { 0x87DF, "GL_NEGATIVE_ONE_EXT" },
+ { 0x87E0, "GL_NORMALIZED_RANGE_EXT" },
+ { 0x87E1, "GL_FULL_RANGE_EXT" },
+ { 0x87E2, "GL_CURRENT_VERTEX_EXT" },
+ { 0x87E3, "GL_MVP_MATRIX_EXT" },
+ { 0x87E4, "GL_VARIANT_VALUE_EXT" },
+ { 0x87E5, "GL_VARIANT_DATATYPE_EXT" },
+ { 0x87E6, "GL_VARIANT_ARRAY_STRIDE_EXT" },
+ { 0x87E7, "GL_VARIANT_ARRAY_TYPE_EXT" },
+ { 0x87E8, "GL_VARIANT_ARRAY_EXT" },
+ { 0x87E9, "GL_VARIANT_ARRAY_POINTER_EXT" },
+ { 0x87EA, "GL_INVARIANT_VALUE_EXT" },
+ { 0x87EB, "GL_INVARIANT_DATATYPE_EXT" },
+ { 0x87EC, "GL_LOCAL_CONSTANT_VALUE_EXT" },
+ { 0x87Ed, "GL_LOCAL_CONSTANT_DATATYPE_EXT" },
+ { 0x8800, "GL_STENCIL_BACK_FUNC_ATI" },
+ { 0x8800, "GL_STENCIL_BACK_FUNC" },
+ { 0x8801, "GL_STENCIL_BACK_FAIL_ATI" },
+ { 0x8801, "GL_STENCIL_BACK_FAIL" },
+ { 0x8802, "GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI" },
+ { 0x8802, "GL_STENCIL_BACK_PASS_DEPTH_FAIL" },
+ { 0x8803, "GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI" },
+ { 0x8803, "GL_STENCIL_BACK_PASS_DEPTH_PASS" },
+ { 0x8804, "GL_FRAGMENT_PROGRAM_ARB" },
+ { 0x8805, "GL_PROGRAM_ALU_INSTRUCTIONS_ARB" },
+ { 0x8806, "GL_PROGRAM_TEX_INSTRUCTIONS_ARB" },
+ { 0x8807, "GL_PROGRAM_TEX_INDIRECTIONS_ARB" },
+ { 0x8808, "GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB" },
+ { 0x8809, "GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB" },
+ { 0x880A, "GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB" },
+ { 0x880B, "GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB" },
+ { 0x880C, "GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB" },
+ { 0x880D, "GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB" },
+ { 0x880E, "GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB" },
+ { 0x880F, "GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB" },
+ { 0x8810, "GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB" },
+ { 0x8814, "GL_RGBA_FLOAT32_APPLE" },
+ { 0x8814, "GL_RGBA_FLOAT32_ATI" },
+ { 0x8814, "GL_RGBA32F_ARB" },
+ { 0x8815, "GL_RGB_FLOAT32_APPLE" },
+ { 0x8815, "GL_RGB_FLOAT32_ATI" },
+ { 0x8815, "GL_RGB32F_ARB" },
+ { 0x8816, "GL_ALPHA_FLOAT32_APPLE" },
+ { 0x8816, "GL_ALPHA_FLOAT32_ATI" },
+ { 0x8816, "GL_ALPHA32F_ARB" },
+ { 0x8817, "GL_INTENSITY_FLOAT32_APPLE" },
+ { 0x8817, "GL_INTENSITY_FLOAT32_ATI" },
+ { 0x8817, "GL_INTENSITY32F_ARB" },
+ { 0x8818, "GL_LUMINANCE_FLOAT32_APPLE" },
+ { 0x8818, "GL_LUMINANCE_FLOAT32_ATI" },
+ { 0x8818, "GL_LUMINANCE32F_ARB" },
+ { 0x8819, "GL_LUMINANCE_ALPHA_FLOAT32_APPLE" },
+ { 0x8819, "GL_LUMINANCE_ALPHA_FLOAT32_ATI" },
+ { 0x8819, "GL_LUMINANCE_ALPHA32F_ARB" },
+ { 0x881A, "GL_RGBA_FLOAT16_APPLE" },
+ { 0x881A, "GL_RGBA_FLOAT16_ATI" },
+ { 0x881A, "GL_RGBA16F_ARB" },
+ { 0x881B, "GL_RGB_FLOAT16_APPLE" },
+ { 0x881B, "GL_RGB_FLOAT16_ATI" },
+ { 0x881B, "GL_RGB16F_ARB" },
+ { 0x881C, "GL_ALPHA_FLOAT16_APPLE" },
+ { 0x881C, "GL_ALPHA_FLOAT16_ATI" },
+ { 0x881C, "GL_ALPHA16F_ARB" },
+ { 0x881D, "GL_INTENSITY_FLOAT16_APPLE" },
+ { 0x881D, "GL_INTENSITY_FLOAT16_ATI" },
+ { 0x881D, "GL_INTENSITY16F_ARB" },
+ { 0x881E, "GL_LUMINANCE_FLOAT16_APPLE" },
+ { 0x881E, "GL_LUMINANCE_FLOAT16_ATI" },
+ { 0x881E, "GL_LUMINANCE16F_ARB" },
+ { 0x881F, "GL_LUMINANCE_ALPHA_FLOAT16_APPLE" },
+ { 0x881F, "GL_LUMINANCE_ALPHA_FLOAT16_ATI" },
+ { 0x881F, "GL_LUMINANCE_ALPHA16F_ARB" },
+ { 0x8820, "GL_RGBA_FLOAT_MODE_ARB" },
+ { 0x8824, "GL_MAX_DRAW_BUFFERS_ARB" },
+ { 0x8824, "GL_MAX_DRAW_BUFFERS" },
+ { 0x8825, "GL_DRAW_BUFFER0_ARB" },
+ { 0x8825, "GL_DRAW_BUFFER0" },
+ { 0x8826, "GL_DRAW_BUFFER1_ARB" },
+ { 0x8826, "GL_DRAW_BUFFER1" },
+ { 0x8827, "GL_DRAW_BUFFER2_ARB" },
+ { 0x8827, "GL_DRAW_BUFFER2" },
+ { 0x8828, "GL_DRAW_BUFFER3_ARB" },
+ { 0x8828, "GL_DRAW_BUFFER3" },
+ { 0x8829, "GL_DRAW_BUFFER4_ARB" },
+ { 0x8829, "GL_DRAW_BUFFER4" },
+ { 0x882A, "GL_DRAW_BUFFER5_ARB" },
+ { 0x882A, "GL_DRAW_BUFFER5" },
+ { 0x882B, "GL_DRAW_BUFFER6_ARB" },
+ { 0x882B, "GL_DRAW_BUFFER6" },
+ { 0x882C, "GL_DRAW_BUFFER7_ARB" },
+ { 0x882C, "GL_DRAW_BUFFER7" },
+ { 0x882D, "GL_DRAW_BUFFER8_ARB" },
+ { 0x882D, "GL_DRAW_BUFFER8" },
+ { 0x882E, "GL_DRAW_BUFFER9_ARB" },
+ { 0x882E, "GL_DRAW_BUFFER9" },
+ { 0x882F, "GL_DRAW_BUFFER10_ARB" },
+ { 0x882F, "GL_DRAW_BUFFER10" },
+ { 0x8830, "GL_DRAW_BUFFER11_ARB" },
+ { 0x8830, "GL_DRAW_BUFFER11" },
+ { 0x8831, "GL_DRAW_BUFFER12_ARB" },
+ { 0x8831, "GL_DRAW_BUFFER12" },
+ { 0x8832, "GL_DRAW_BUFFER13_ARB" },
+ { 0x8832, "GL_DRAW_BUFFER13" },
+ { 0x8833, "GL_DRAW_BUFFER14_ARB" },
+ { 0x8833, "GL_DRAW_BUFFER14" },
+ { 0x8834, "GL_DRAW_BUFFER15_ARB" },
+ { 0x8834, "GL_DRAW_BUFFER15" },
+ { 0x883D, "GL_ALPHA_BLEND_EQUATION_ATI" },
+ { 0x883D, "GL_BLEND_EQUATION_ALPHA_EXT" },
+ { 0x883D, "GL_BLEND_EQUATION_ALPHA" },
+ { 0x884A, "GL_TEXTURE_DEPTH_SIZE_ARB" },
+ { 0x884A, "GL_TEXTURE_DEPTH_SIZE" },
+ { 0x884B, "GL_DEPTH_TEXTURE_MODE_ARB" },
+ { 0x884B, "GL_DEPTH_TEXTURE_MODE" },
+ { 0x884C, "GL_TEXTURE_COMPARE_MODE_ARB" },
+ { 0x884C, "GL_TEXTURE_COMPARE_MODE" },
+ { 0x884D, "GL_TEXTURE_COMPARE_FUNC_ARB" },
+ { 0x884D, "GL_TEXTURE_COMPARE_FUNC" },
+ { 0x884E, "GL_COMPARE_R_TO_TEXTURE_ARB" },
+ { 0x884E, "GL_COMPARE_R_TO_TEXTURE" },
+ { 0x884E, "GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT" },
+ { 0x8861, "GL_POINT_SPRITE_ARB" },
+ { 0x8861, "GL_POINT_SPRITE" },
+ { 0x8862, "GL_COORD_REPLACE_ARB" },
+ { 0x8862, "GL_COORD_REPLACE" },
+ { 0x8864, "GL_QUERY_COUNTER_BITS_ARB" },
+ { 0x8864, "GL_QUERY_COUNTER_BITS" },
+ { 0x8865, "GL_CURRENT_QUERY_ARB" },
+ { 0x8865, "GL_CURRENT_QUERY" },
+ { 0x8866, "GL_QUERY_RESULT_ARB" },
+ { 0x8866, "GL_QUERY_RESULT" },
+ { 0x8867, "GL_QUERY_RESULT_AVAILABLE_ARB" },
+ { 0x8867, "GL_QUERY_RESULT_AVAILABLE" },
+ { 0x8869, "GL_MAX_VERTEX_ATTRIBS_ARB" },
+ { 0x8869, "GL_MAX_VERTEX_ATTRIBS_ARB" },
+ { 0x8869, "GL_MAX_VERTEX_ATTRIBS" },
+ { 0x886A, "GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB" },
+ { 0x886A, "GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB" },
+ { 0x886A, "GL_VERTEX_ATTRIB_ARRAY_NORMALIZED" },
+ { 0x8871, "GL_MAX_TEXTURE_COORDS_ARB" },
+ { 0x8871, "GL_MAX_TEXTURE_COORDS_ARB" },
+ { 0x8871, "GL_MAX_TEXTURE_COORDS_ARB" },
+ { 0x8871, "GL_MAX_TEXTURE_COORDS" },
+ { 0x8872, "GL_MAX_TEXTURE_IMAGE_UNITS_ARB" },
+ { 0x8872, "GL_MAX_TEXTURE_IMAGE_UNITS_ARB" },
+ { 0x8872, "GL_MAX_TEXTURE_IMAGE_UNITS_ARB" },
+ { 0x8872, "GL_MAX_TEXTURE_IMAGE_UNITS" },
+ { 0x8874, "GL_PROGRAM_ERROR_STRING_ARB" },
+ { 0x8875, "GL_PROGRAM_FORMAT_ASCII_ARB" },
+ { 0x8876, "GL_PROGRAM_FORMAT_ARB" },
+ { 0x8890, "GL_DEPTH_BOUNDS_TEST_EXT" },
+ { 0x8891, "GL_DEPTH_BOUNDS_EXT" },
+ { 0x8892, "GL_ARRAY_BUFFER_ARB" },
+ { 0x8892, "GL_ARRAY_BUFFER" },
+ { 0x8893, "GL_ELEMENT_ARRAY_BUFFER_ARB" },
+ { 0x8893, "GL_ELEMENT_ARRAY_BUFFER" },
+ { 0x8894, "GL_ARRAY_BUFFER_BINDING_ARB" },
+ { 0x8894, "GL_ARRAY_BUFFER_BINDING" },
+ { 0x8895, "GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB" },
+ { 0x8895, "GL_ELEMENT_ARRAY_BUFFER_BINDING" },
+ { 0x8896, "GL_VERTEX_ARRAY_BUFFER_BINDING_ARB" },
+ { 0x8896, "GL_VERTEX_ARRAY_BUFFER_BINDING" },
+ { 0x8897, "GL_NORMAL_ARRAY_BUFFER_BINDING_ARB" },
+ { 0x8897, "GL_NORMAL_ARRAY_BUFFER_BINDING" },
+ { 0x8898, "GL_COLOR_ARRAY_BUFFER_BINDING_ARB" },
+ { 0x8898, "GL_COLOR_ARRAY_BUFFER_BINDING" },
+ { 0x8899, "GL_INDEX_ARRAY_BUFFER_BINDING_ARB" },
+ { 0x8899, "GL_INDEX_ARRAY_BUFFER_BINDING" },
+ { 0x889A, "GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB" },
+ { 0x889A, "GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING" },
+ { 0x889B, "GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB" },
+ { 0x889B, "GL_EDGE_FLAG_ARRAY_BUFFER_BINDING" },
+ { 0x889C, "GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB" },
+ { 0x889C, "GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING" },
+ { 0x889D, "GL_FOG_COORD_ARRAY_BUFFER_BINDING_ARB" },
+ { 0x889D, "GL_FOG_COORD_ARRAY_BUFFER_BINDING" },
+ { 0x889D, "GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB" },
+ { 0x889D, "GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING" },
+ { 0x889E, "GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB" },
+ { 0x889E, "GL_WEIGHT_ARRAY_BUFFER_BINDING" },
+ { 0x889F, "GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB" },
+ { 0x889F, "GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING" },
+ { 0x88A0, "GL_PROGRAM_INSTRUCTIONS_ARB" },
+ { 0x88A1, "GL_MAX_PROGRAM_INSTRUCTIONS_ARB" },
+ { 0x88A2, "GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB" },
+ { 0x88A3, "GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB" },
+ { 0x88A4, "GL_PROGRAM_TEMPORARIES_ARB" },
+ { 0x88A5, "GL_MAX_PROGRAM_TEMPORARIES_ARB" },
+ { 0x88A6, "GL_PROGRAM_NATIVE_TEMPORARIES_ARB" },
+ { 0x88A7, "GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB" },
+ { 0x88A8, "GL_PROGRAM_PARAMETERS_ARB" },
+ { 0x88A9, "GL_MAX_PROGRAM_PARAMETERS_ARB" },
+ { 0x88AA, "GL_PROGRAM_NATIVE_PARAMETERS_ARB" },
+ { 0x88AB, "GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB" },
+ { 0x88AC, "GL_PROGRAM_ATTRIBS_ARB" },
+ { 0x88AD, "GL_MAX_PROGRAM_ATTRIBS_ARB" },
+ { 0x88AE, "GL_PROGRAM_NATIVE_ATTRIBS_ARB" },
+ { 0x88AF, "GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB" },
+ { 0x88B0, "GL_PROGRAM_ADDRESS_REGISTERS_ARB" },
+ { 0x88B1, "GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB" },
+ { 0x88B2, "GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB" },
+ { 0x88B3, "GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB" },
+ { 0x88B4, "GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB" },
+ { 0x88B5, "GL_MAX_PROGRAM_ENV_PARAMETERS_ARB" },
+ { 0x88B6, "GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB" },
+ { 0x88B7, "GL_TRANSPOSE_CURRENT_MATRIX_ARB" },
+ { 0x88B8, "GL_READ_ONLY_ARB" },
+ { 0x88B8, "GL_READ_ONLY" },
+ { 0x88B9, "GL_WRITE_ONLY_ARB" },
+ { 0x88B9, "GL_WRITE_ONLY" },
+ { 0x88BA, "GL_READ_WRITE_ARB" },
+ { 0x88BA, "GL_READ_WRITE" },
+ { 0x88BB, "GL_BUFFER_ACCESS_ARB" },
+ { 0x88BB, "GL_BUFFER_ACCESS" },
+ { 0x88BC, "GL_BUFFER_MAPPED_ARB" },
+ { 0x88BC, "GL_BUFFER_MAPPED" },
+ { 0x88BD, "GL_BUFFER_MAP_POINTER_ARB" },
+ { 0x88BD, "GL_BUFFER_MAP_POINTER" },
+ { 0x88C0, "GL_MATRIX0_ARB" },
+ { 0x88C1, "GL_MATRIX1_ARB" },
+ { 0x88C2, "GL_MATRIX2_ARB" },
+ { 0x88C3, "GL_MATRIX3_ARB" },
+ { 0x88C4, "GL_MATRIX4_ARB" },
+ { 0x88C5, "GL_MATRIX5_ARB" },
+ { 0x88C6, "GL_MATRIX6_ARB" },
+ { 0x88C7, "GL_MATRIX7_ARB" },
+ { 0x88C8, "GL_MATRIX8_ARB" },
+ { 0x88C9, "GL_MATRIX9_ARB" },
+ { 0x88CA, "GL_MATRIX10_ARB" },
+ { 0x88CB, "GL_MATRIX11_ARB" },
+ { 0x88CC, "GL_MATRIX12_ARB" },
+ { 0x88CD, "GL_MATRIX13_ARB" },
+ { 0x88CE, "GL_MATRIX14_ARB" },
+ { 0x88CF, "GL_MATRIX15_ARB" },
+ { 0x88D0, "GL_MATRIX16_ARB" },
+ { 0x88D1, "GL_MATRIX17_ARB" },
+ { 0x88D2, "GL_MATRIX18_ARB" },
+ { 0x88D3, "GL_MATRIX19_ARB" },
+ { 0x88D4, "GL_MATRIX20_ARB" },
+ { 0x88D5, "GL_MATRIX21_ARB" },
+ { 0x88D6, "GL_MATRIX22_ARB" },
+ { 0x88D7, "GL_MATRIX23_ARB" },
+ { 0x88D8, "GL_MATRIX24_ARB" },
+ { 0x88D9, "GL_MATRIX25_ARB" },
+ { 0x88DA, "GL_MATRIX26_ARB" },
+ { 0x88DB, "GL_MATRIX27_ARB" },
+ { 0x88DC, "GL_MATRIX28_ARB" },
+ { 0x88DD, "GL_MATRIX29_ARB" },
+ { 0x88DE, "GL_MATRIX30_ARB" },
+ { 0x88DF, "GL_MATRIX31_ARB" },
+ { 0x88E0, "GL_STREAM_DRAW_ARB" },
+ { 0x88E0, "GL_STREAM_DRAW" },
+ { 0x88E1, "GL_STREAM_READ_ARB" },
+ { 0x88E1, "GL_STREAM_READ" },
+ { 0x88E2, "GL_STREAM_COPY_ARB" },
+ { 0x88E2, "GL_STREAM_COPY" },
+ { 0x88E4, "GL_STATIC_DRAW_ARB" },
+ { 0x88E4, "GL_STATIC_DRAW" },
+ { 0x88E5, "GL_STATIC_READ_ARB" },
+ { 0x88E5, "GL_STATIC_READ" },
+ { 0x88E6, "GL_STATIC_COPY_ARB" },
+ { 0x88E6, "GL_STATIC_COPY" },
+ { 0x88E8, "GL_DYNAMIC_DRAW_ARB" },
+ { 0x88E8, "GL_DYNAMIC_DRAW" },
+ { 0x88E9, "GL_DYNAMIC_READ_ARB" },
+ { 0x88E9, "GL_DYNAMIC_READ" },
+ { 0x88EA, "GL_DYNAMIC_COPY_ARB" },
+ { 0x88EA, "GL_DYNAMIC_COPY" },
+ { 0x88EB, "GL_PIXEL_PACK_BUFFER_ARB" },
+ { 0x88EB, "GL_PIXEL_PACK_BUFFER" },
+ { 0x88EC, "GL_PIXEL_UNPACK_BUFFER_ARB" },
+ { 0x88EC, "GL_PIXEL_UNPACK_BUFFER" },
+ { 0x88ED, "GL_PIXEL_PACK_BUFFER_BINDING_ARB" },
+ { 0x88ED, "GL_PIXEL_PACK_BUFFER_BINDING" },
+ { 0x88EF, "GL_PIXEL_UNPACK_BUFFER_BINDING_ARB" },
+ { 0x88EF, "GL_PIXEL_UNPACK_BUFFER_BINDING" },
+ { 0x88F0, "GL_DEPTH24_STENCIL8_EXT" },
+ { 0x88F0, "GL_DEPTH24_STENCIL8" },
+ { 0x88F1, "GL_TEXTURE_STENCIL_SIZE_EXT" },
+ { 0x88F1, "GL_TEXTURE_STENCIL_SIZE" },
+ { 0x88FD, "GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT" },
+ { 0x88FE, "GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB" },
+ { 0x88FF, "GL_MAX_ARRAY_TEXTURE_LAYERS_EXT" },
+ { 0x8904, "GL_MIN_PROGRAM_TEXEL_OFFSET_EXT" },
+ { 0x8905, "GL_MAX_PROGRAM_TEXEL_OFFSET_EXT" },
+ { 0x8910, "GL_STENCIL_TEST_TWO_SIDE_EXT" },
+ { 0x8911, "GL_ACTIVE_STENCIL_FACE_EXT" },
+ { 0x8912, "GL_MIRROR_CLAMP_TO_BORDER_EXT" },
+ { 0x8914, "GL_SAMPLES_PASSED_ARB" },
+ { 0x8914, "GL_SAMPLES_PASSED" },
+ { 0x891A, "GL_CLAMP_VERTEX_COLOR_ARB" },
+ { 0x891B, "GL_CLAMP_FRAGMENT_COLOR_ARB" },
+ { 0x891C, "GL_CLAMP_READ_COLOR_ARB" },
+ { 0x891D, "GL_FIXED_ONLY_ARB" },
+ { 0x8920, "GL_FRAGMENT_SHADER_EXT" },
+ { 0x896D, "GL_SECONDARY_INTERPOLATOR_EXT" },
+ { 0x896E, "GL_NUM_FRAGMENT_REGISTERS_EXT" },
+ { 0x896F, "GL_NUM_FRAGMENT_CONSTANTS_EXT" },
+ { 0x8A0C, "GL_ELEMENT_ARRAY_APPLE" },
+ { 0x8A0D, "GL_ELEMENT_ARRAY_TYPE_APPLE" },
+ { 0x8A0E, "GL_ELEMENT_ARRAY_POINTER_APPLE" },
+ { 0x8A0F, "GL_COLOR_FLOAT_APPLE" },
+ { 0x8A11, "GL_UNIFORM_BUFFER" },
+ { 0x8A28, "GL_UNIFORM_BUFFER_BINDING" },
+ { 0x8A29, "GL_UNIFORM_BUFFER_START" },
+ { 0x8A2A, "GL_UNIFORM_BUFFER_SIZE" },
+ { 0x8A2B, "GL_MAX_VERTEX_UNIFORM_BLOCKS" },
+ { 0x8A2C, "GL_MAX_GEOMETRY_UNIFORM_BLOCKS" },
+ { 0x8A2D, "GL_MAX_FRAGMENT_UNIFORM_BLOCKS" },
+ { 0x8A2E, "GL_MAX_COMBINED_UNIFORM_BLOCKS" },
+ { 0x8A2F, "GL_MAX_UNIFORM_BUFFER_BINDINGS" },
+ { 0x8A30, "GL_MAX_UNIFORM_BLOCK_SIZE" },
+ { 0x8A31, "GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS" },
+ { 0x8A32, "GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS" },
+ { 0x8A33, "GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS" },
+ { 0x8A34, "GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT" },
+ { 0x8A35, "GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH" },
+ { 0x8A36, "GL_ACTIVE_UNIFORM_BLOCKS" },
+ { 0x8A37, "GL_UNIFORM_TYPE" },
+ { 0x8A38, "GL_UNIFORM_SIZE" },
+ { 0x8A39, "GL_UNIFORM_NAME_LENGTH" },
+ { 0x8A3A, "GL_UNIFORM_BLOCK_INDEX" },
+ { 0x8A3B, "GL_UNIFORM_OFFSET" },
+ { 0x8A3C, "GL_UNIFORM_ARRAY_STRIDE" },
+ { 0x8A3D, "GL_UNIFORM_MATRIX_STRIDE" },
+ { 0x8A3E, "GL_UNIFORM_IS_ROW_MAJOR" },
+ { 0x8A3F, "GL_UNIFORM_BLOCK_BINDING" },
+ { 0x8A40, "GL_UNIFORM_BLOCK_DATA_SIZE" },
+ { 0x8A41, "GL_UNIFORM_BLOCK_NAME_LENGTH" },
+ { 0x8A42, "GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS" },
+ { 0x8A43, "GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES" },
+ { 0x8A44, "GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER" },
+ { 0x8A45, "GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER" },
+ { 0x8A46, "GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER" },
+ { 0x8B30, "GL_FRAGMENT_SHADER_ARB" },
+ { 0x8B30, "GL_FRAGMENT_SHADER" },
+ { 0x8B31, "GL_VERTEX_SHADER_ARB" },
+ { 0x8B31, "GL_VERTEX_SHADER" },
+ { 0x8B40, "GL_PROGRAM_OBJECT_ARB" },
+ { 0x8B48, "GL_SHADER_OBJECT_ARB" },
+ { 0x8B49, "GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB" },
+ { 0x8B49, "GL_MAX_FRAGMENT_UNIFORM_COMPONENTS" },
+ { 0x8B4A, "GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB" },
+ { 0x8B4A, "GL_MAX_VERTEX_UNIFORM_COMPONENTS" },
+ { 0x8B4B, "GL_MAX_VARYING_COMPONENTS_EXT" },
+ { 0x8B4B, "GL_MAX_VARYING_FLOATS_ARB" },
+ { 0x8B4B, "GL_MAX_VARYING_FLOATS" },
+ { 0x8B4C, "GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB" },
+ { 0x8B4C, "GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS" },
+ { 0x8B4D, "GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB" },
+ { 0x8B4D, "GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS" },
+ { 0x8B4E, "GL_OBJECT_TYPE_ARB" },
+ { 0x8B4F, "GL_OBJECT_SUBTYPE_ARB" },
+ { 0x8B4F, "GL_SHADER_TYPE" },
+ { 0x8B50, "GL_FLOAT_VEC2_ARB" },
+ { 0x8B50, "GL_FLOAT_VEC2" },
+ { 0x8B51, "GL_FLOAT_VEC3_ARB" },
+ { 0x8B51, "GL_FLOAT_VEC3" },
+ { 0x8B52, "GL_FLOAT_VEC4_ARB" },
+ { 0x8B52, "GL_FLOAT_VEC4" },
+ { 0x8B53, "GL_INT_VEC2_ARB" },
+ { 0x8B53, "GL_INT_VEC2" },
+ { 0x8B54, "GL_INT_VEC3_ARB" },
+ { 0x8B54, "GL_INT_VEC3" },
+ { 0x8B55, "GL_INT_VEC4_ARB" },
+ { 0x8B55, "GL_INT_VEC4" },
+ { 0x8B56, "GL_BOOL_ARB" },
+ { 0x8B56, "GL_BOOL" },
+ { 0x8B57, "GL_BOOL_VEC2_ARB" },
+ { 0x8B57, "GL_BOOL_VEC2" },
+ { 0x8B58, "GL_BOOL_VEC3_ARB" },
+ { 0x8B58, "GL_BOOL_VEC3" },
+ { 0x8B59, "GL_BOOL_VEC4_ARB" },
+ { 0x8B59, "GL_BOOL_VEC4" },
+ { 0x8B5A, "GL_FLOAT_MAT2_ARB" },
+ { 0x8B5A, "GL_FLOAT_MAT2" },
+ { 0x8B5B, "GL_FLOAT_MAT3_ARB" },
+ { 0x8B5B, "GL_FLOAT_MAT3" },
+ { 0x8B5C, "GL_FLOAT_MAT4_ARB" },
+ { 0x8B5C, "GL_FLOAT_MAT4" },
+ { 0x8B5D, "GL_SAMPLER_1D_ARB" },
+ { 0x8B5D, "GL_SAMPLER_1D" },
+ { 0x8B5E, "GL_SAMPLER_2D_ARB" },
+ { 0x8B5E, "GL_SAMPLER_2D" },
+ { 0x8B5F, "GL_SAMPLER_3D_ARB" },
+ { 0x8B5F, "GL_SAMPLER_3D" },
+ { 0x8B60, "GL_SAMPLER_CUBE_ARB" },
+ { 0x8B60, "GL_SAMPLER_CUBE" },
+ { 0x8B61, "GL_SAMPLER_1D_SHADOW_ARB" },
+ { 0x8B61, "GL_SAMPLER_1D_SHADOW" },
+ { 0x8B62, "GL_SAMPLER_2D_SHADOW_ARB" },
+ { 0x8B62, "GL_SAMPLER_2D_SHADOW" },
+ { 0x8B63, "GL_SAMPLER_2D_RECT_ARB" },
+ { 0x8B64, "GL_SAMPLER_2D_RECT_SHADOW_ARB" },
+ { 0x8B65, "GL_FLOAT_MAT2x3" },
+ { 0x8B66, "GL_FLOAT_MAT2x4" },
+ { 0x8B67, "GL_FLOAT_MAT3x2" },
+ { 0x8B68, "GL_FLOAT_MAT3x4" },
+ { 0x8B69, "GL_FLOAT_MAT4x2" },
+ { 0x8B6A, "GL_FLOAT_MAT4x3" },
+ { 0x8B80, "GL_DELETE_STATUS" },
+ { 0x8B80, "GL_OBJECT_DELETE_STATUS_ARB" },
+ { 0x8B81, "GL_COMPILE_STATUS" },
+ { 0x8B81, "GL_OBJECT_COMPILE_STATUS_ARB" },
+ { 0x8B82, "GL_LINK_STATUS" },
+ { 0x8B82, "GL_OBJECT_LINK_STATUS_ARB" },
+ { 0x8B83, "GL_OBJECT_VALIDATE_STATUS_ARB" },
+ { 0x8B83, "GL_VALIDATE_STATUS" },
+ { 0x8B84, "GL_INFO_LOG_LENGTH" },
+ { 0x8B84, "GL_OBJECT_INFO_LOG_LENGTH_ARB" },
+ { 0x8B85, "GL_ATTACHED_SHADERS" },
+ { 0x8B85, "GL_OBJECT_ATTACHED_OBJECTS_ARB" },
+ { 0x8B86, "GL_ACTIVE_UNIFORMS" },
+ { 0x8B86, "GL_OBJECT_ACTIVE_UNIFORMS_ARB" },
+ { 0x8B87, "GL_ACTIVE_UNIFORM_MAX_LENGTH" },
+ { 0x8B87, "GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB" },
+ { 0x8B88, "GL_OBJECT_SHADER_SOURCE_LENGTH_ARB" },
+ { 0x8B88, "GL_SHADER_SOURCE_LENGTH" },
+ { 0x8B89, "GL_ACTIVE_ATTRIBUTES" },
+ { 0x8B89, "GL_OBJECT_ACTIVE_ATTRIBUTES_ARB" },
+ { 0x8B8A, "GL_ACTIVE_ATTRIBUTE_MAX_LENGTH" },
+ { 0x8B8A, "GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB" },
+ { 0x8B8B, "GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB" },
+ { 0x8B8B, "GL_FRAGMENT_SHADER_DERIVATIVE_HINT" },
+ { 0x8B8C, "GL_SHADING_LANGUAGE_VERSION_ARB" },
+ { 0x8B8C, "GL_SHADING_LANGUAGE_VERSION" },
+ { 0x8B8D, "GL_CURRENT_PROGRAM" },
+ { 0x8C10, "GL_TEXTURE_RED_TYPE_ARB" },
+ { 0x8C10, "GL_TEXTURE_RED_TYPE" },
+ { 0x8C11, "GL_TEXTURE_GREEN_TYPE_ARB" },
+ { 0x8C11, "GL_TEXTURE_GREEN_TYPE" },
+ { 0x8C12, "GL_TEXTURE_BLUE_TYPE_ARB" },
+ { 0x8C12, "GL_TEXTURE_BLUE_TYPE" },
+ { 0x8C13, "GL_TEXTURE_ALPHA_TYPE_ARB" },
+ { 0x8C13, "GL_TEXTURE_ALPHA_TYPE" },
+ { 0x8C14, "GL_TEXTURE_LUMINANCE_TYPE_ARB" },
+ { 0x8C15, "GL_TEXTURE_INTENSITY_TYPE_ARB" },
+ { 0x8C16, "GL_TEXTURE_DEPTH_TYPE_ARB" },
+ { 0x8C16, "GL_TEXTURE_DEPTH_TYPE" },
+ { 0x8C17, "GL_UNSIGNED_NORMALIZED_ARB" },
+ { 0x8C17, "GL_UNSIGNED_NORMALIZED" },
+ { 0x8C18, "GL_TEXTURE_1D_ARRAY_EXT" },
+ { 0x8C19, "GL_PROXY_TEXTURE_1D_ARRAY_EXT" },
+ { 0x8C1A, "GL_TEXTURE_2D_ARRAY_EXT" },
+ { 0x8C1B, "GL_PROXY_TEXTURE_2D_ARRAY_EXT" },
+ { 0x8C1C, "GL_TEXTURE_BINDING_1D_ARRAY_EXT" },
+ { 0x8C1D, "GL_TEXTURE_BINDING_2D_ARRAY_EXT" },
+ { 0x8C29, "GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT" },
+ { 0x8C3A, "GL_R11F_G11F_B10F_EXT" },
+ { 0x8C3B, "GL_UNSIGNED_INT_10F_11F_11F_REV_EXT" },
+ { 0x8C3C, "GL_RGBA_SIGNED_COMPONENTS_EXT" },
+ { 0x8C3D, "GL_RGB9_E5_EXT" },
+ { 0x8C3E, "GL_UNSIGNED_INT_5_9_9_9_REV_EXT" },
+ { 0x8C3F, "GL_TEXTURE_SHARED_SIZE_EXT" },
+ { 0x8C40, "GL_SRGB_EXT" },
+ { 0x8C40, "GL_SRGB" },
+ { 0x8C41, "GL_SRGB8_EXT" },
+ { 0x8C41, "GL_SRGB8" },
+ { 0x8C42, "GL_SRGB_ALPHA_EXT" },
+ { 0x8C42, "GL_SRGB_ALPHA" },
+ { 0x8C43, "GL_SRGB8_ALPHA8_EXT" },
+ { 0x8C43, "GL_SRGB8_ALPHA8" },
+ { 0x8C44, "GL_SLUMINANCE_ALPHA_EXT" },
+ { 0x8C44, "GL_SLUMINANCE_ALPHA" },
+ { 0x8C45, "GL_SLUMINANCE8_ALPHA8_EXT" },
+ { 0x8C45, "GL_SLUMINANCE8_ALPHA8" },
+ { 0x8C46, "GL_SLUMINANCE_EXT" },
+ { 0x8C46, "GL_SLUMINANCE" },
+ { 0x8C47, "GL_SLUMINANCE8_EXT" },
+ { 0x8C47, "GL_SLUMINANCE8" },
+ { 0x8C48, "GL_COMPRESSED_SRGB_EXT" },
+ { 0x8C48, "GL_COMPRESSED_SRGB" },
+ { 0x8C49, "GL_COMPRESSED_SRGB_ALPHA_EXT" },
+ { 0x8C49, "GL_COMPRESSED_SRGB_ALPHA" },
+ { 0x8C4A, "GL_COMPRESSED_SLUMINANCE_EXT" },
+ { 0x8C4A, "GL_COMPRESSED_SLUMINANCE" },
+ { 0x8C4B, "GL_COMPRESSED_SLUMINANCE_ALPHA_EXT" },
+ { 0x8C4B, "GL_COMPRESSED_SLUMINANCE_ALPHA" },
+ { 0x8C4C, "GL_COMPRESSED_SRGB_S3TC_DXT1_EXT" },
+ { 0x8C4D, "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT" },
+ { 0x8C4E, "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT" },
+ { 0x8C4F, "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT" },
+ { 0x8C76, "GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT" },
+ { 0x8C7F, "GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT" },
+ { 0x8C80, "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT" },
+ { 0x8C83, "GL_TRANSFORM_FEEDBACK_VARYINGS_EXT" },
+ { 0x8C84, "GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT" },
+ { 0x8C85, "GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT" },
+ { 0x8C87, "GL_PRIMITIVES_GENERATED_EXT" },
+ { 0x8C88, "GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT" },
+ { 0x8C89, "GL_RASTERIZER_DISCARD_EXT" },
+ { 0x8C8A, "GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT" },
+ { 0x8C8B, "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT" },
+ { 0x8C8C, "GL_INTERLEAVED_ATTRIBS_EXT" },
+ { 0x8C8D, "GL_SEPARATE_ATTRIBS_EXT" },
+ { 0x8C8E, "GL_TRANSFORM_FEEDBACK_BUFFER_EXT" },
+ { 0x8C8F, "GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT" },
+ { 0x8CA0, "GL_POINT_SPRITE_COORD_ORIGIN" },
+ { 0x8CA1, "GL_LOWER_LEFT" },
+ { 0x8CA2, "GL_UPPER_LEFT" },
+ { 0x8CA3, "GL_STENCIL_BACK_REF" },
+ { 0x8CA4, "GL_STENCIL_BACK_VALUE_MASK" },
+ { 0x8CA5, "GL_STENCIL_BACK_WRITEMASK" },
+ { 0x8CA6, "GL_DRAW_FRAMEBUFFER_BINDING_EXT" },
+ { 0x8CA6, "GL_FRAMEBUFFER_BINDING_EXT" },
+ { 0x8CA6, "GL_FRAMEBUFFER_BINDING" },
+ { 0x8CA7, "GL_RENDERBUFFER_BINDING_EXT" },
+ { 0x8CA7, "GL_RENDERBUFFER_BINDING" },
+ { 0x8CA8, "GL_READ_FRAMEBUFFER_EXT" },
+ { 0x8CA8, "GL_READ_FRAMEBUFFER" },
+ { 0x8CA9, "GL_DRAW_FRAMEBUFFER_EXT" },
+ { 0x8CA9, "GL_DRAW_FRAMEBUFFER" },
+ { 0x8CAA, "GL_READ_FRAMEBUFFER_BINDING_EXT" },
+ { 0x8CAA, "GL_READ_FRAMEBUFFER_BINDING" },
+ { 0x8CAB, "GL_RENDERBUFFER_SAMPLES_EXT" },
+ { 0x8CAB, "GL_RENDERBUFFER_SAMPLES" },
+ { 0x8CAC, "GL_DEPTH_COMPONENT32F" },
+ { 0x8CAD, "GL_DEPTH32F_STENCIL8" },
+ { 0x8CD0, "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT" },
+ { 0x8CD0, "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE" },
+ { 0x8CD1, "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT" },
+ { 0x8CD1, "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME" },
+ { 0x8CD2, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT" },
+ { 0x8CD2, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL" },
+ { 0x8CD3, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT" },
+ { 0x8CD3, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE" },
+ { 0x8CD4, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT" },
+ { 0x8CD4, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT" },
+ { 0x8CD4, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER" },
+ { 0x8CD5, "GL_FRAMEBUFFER_COMPLETE_EXT" },
+ { 0x8CD5, "GL_FRAMEBUFFER_COMPLETE" },
+ { 0x8CD6, "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT" },
+ { 0x8CD6, "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT" },
+ { 0x8CD7, "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT" },
+ { 0x8CD7, "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT" },
+ { 0x8CD9, "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT" },
+ { 0x8CDA, "GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT" },
+ { 0x8CDB, "GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT" },
+ { 0x8CDB, "GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER" },
+ { 0x8CDC, "GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT" },
+ { 0x8CDC, "GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER" },
+ { 0x8CDD, "GL_FRAMEBUFFER_UNSUPPORTED_EXT" },
+ { 0x8CDD, "GL_FRAMEBUFFER_UNSUPPORTED" },
+ { 0x8CDF, "GL_MAX_COLOR_ATTACHMENTS_EXT" },
+ { 0x8CDF, "GL_MAX_COLOR_ATTACHMENTS" },
+ { 0x8CE0, "GL_COLOR_ATTACHMENT0_EXT" },
+ { 0x8CE0, "GL_COLOR_ATTACHMENT0" },
+ { 0x8CE1, "GL_COLOR_ATTACHMENT1_EXT" },
+ { 0x8CE1, "GL_COLOR_ATTACHMENT1" },
+ { 0x8CE2, "GL_COLOR_ATTACHMENT2_EXT" },
+ { 0x8CE2, "GL_COLOR_ATTACHMENT2" },
+ { 0x8CE3, "GL_COLOR_ATTACHMENT3_EXT" },
+ { 0x8CE3, "GL_COLOR_ATTACHMENT3" },
+ { 0x8CE4, "GL_COLOR_ATTACHMENT4_EXT" },
+ { 0x8CE4, "GL_COLOR_ATTACHMENT4" },
+ { 0x8CE5, "GL_COLOR_ATTACHMENT5_EXT" },
+ { 0x8CE5, "GL_COLOR_ATTACHMENT5" },
+ { 0x8CE6, "GL_COLOR_ATTACHMENT6_EXT" },
+ { 0x8CE6, "GL_COLOR_ATTACHMENT6" },
+ { 0x8CE7, "GL_COLOR_ATTACHMENT7_EXT" },
+ { 0x8CE7, "GL_COLOR_ATTACHMENT7" },
+ { 0x8CE8, "GL_COLOR_ATTACHMENT8_EXT" },
+ { 0x8CE8, "GL_COLOR_ATTACHMENT8" },
+ { 0x8CE9, "GL_COLOR_ATTACHMENT9_EXT" },
+ { 0x8CE9, "GL_COLOR_ATTACHMENT9" },
+ { 0x8CEA, "GL_COLOR_ATTACHMENT10_EXT" },
+ { 0x8CEA, "GL_COLOR_ATTACHMENT10" },
+ { 0x8CEB, "GL_COLOR_ATTACHMENT11_EXT" },
+ { 0x8CEB, "GL_COLOR_ATTACHMENT11" },
+ { 0x8CEC, "GL_COLOR_ATTACHMENT12_EXT" },
+ { 0x8CEC, "GL_COLOR_ATTACHMENT12" },
+ { 0x8CED, "GL_COLOR_ATTACHMENT13_EXT" },
+ { 0x8CED, "GL_COLOR_ATTACHMENT13" },
+ { 0x8CEE, "GL_COLOR_ATTACHMENT14_EXT" },
+ { 0x8CEE, "GL_COLOR_ATTACHMENT14" },
+ { 0x8CEF, "GL_COLOR_ATTACHMENT15_EXT" },
+ { 0x8CEF, "GL_COLOR_ATTACHMENT15" },
+ { 0x8D00, "GL_DEPTH_ATTACHMENT_EXT" },
+ { 0x8D00, "GL_DEPTH_ATTACHMENT" },
+ { 0x8D20, "GL_STENCIL_ATTACHMENT_EXT" },
+ { 0x8D20, "GL_STENCIL_ATTACHMENT" },
+ { 0x8D40, "GL_FRAMEBUFFER_EXT" },
+ { 0x8D40, "GL_FRAMEBUFFER" },
+ { 0x8D41, "GL_RENDERBUFFER_EXT" },
+ { 0x8D41, "GL_RENDERBUFFER" },
+ { 0x8D42, "GL_RENDERBUFFER_WIDTH_EXT" },
+ { 0x8D42, "GL_RENDERBUFFER_WIDTH" },
+ { 0x8D43, "GL_RENDERBUFFER_HEIGHT_EXT" },
+ { 0x8D43, "GL_RENDERBUFFER_HEIGHT" },
+ { 0x8D44, "GL_RENDERBUFFER_INTERNAL_FORMAT_EXT" },
+ { 0x8D44, "GL_RENDERBUFFER_INTERNAL_FORMAT" },
+ { 0x8D46, "GL_STENCIL_INDEX1_EXT" },
+ { 0x8D46, "GL_STENCIL_INDEX1" },
+ { 0x8D47, "GL_STENCIL_INDEX4_EXT" },
+ { 0x8D47, "GL_STENCIL_INDEX4" },
+ { 0x8D48, "GL_STENCIL_INDEX8_EXT" },
+ { 0x8D48, "GL_STENCIL_INDEX8" },
+ { 0x8D49, "GL_STENCIL_INDEX16_EXT" },
+ { 0x8D49, "GL_STENCIL_INDEX16" },
+ { 0x8D50, "GL_RENDERBUFFER_RED_SIZE_EXT" },
+ { 0x8D50, "GL_RENDERBUFFER_RED_SIZE" },
+ { 0x8D51, "GL_RENDERBUFFER_GREEN_SIZE_EXT" },
+ { 0x8D51, "GL_RENDERBUFFER_GREEN_SIZE" },
+ { 0x8D52, "GL_RENDERBUFFER_BLUE_SIZE_EXT" },
+ { 0x8D52, "GL_RENDERBUFFER_BLUE_SIZE" },
+ { 0x8D53, "GL_RENDERBUFFER_ALPHA_SIZE_EXT" },
+ { 0x8D53, "GL_RENDERBUFFER_ALPHA_SIZE" },
+ { 0x8D54, "GL_RENDERBUFFER_DEPTH_SIZE_EXT" },
+ { 0x8D54, "GL_RENDERBUFFER_DEPTH_SIZE" },
+ { 0x8D55, "GL_RENDERBUFFER_STENCIL_SIZE_EXT" },
+ { 0x8D55, "GL_RENDERBUFFER_STENCIL_SIZE" },
+ { 0x8D56, "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT" },
+ { 0x8D56, "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE" },
+ { 0x8D57, "GL_MAX_SAMPLES_EXT" },
+ { 0x8D57, "GL_MAX_SAMPLES" },
+ { 0x8D70, "GL_RGBA32UI_EXT" },
+ { 0x8D71, "GL_RGB32UI_EXT" },
+ { 0x8D72, "GL_ALPHA32UI_EXT" },
+ { 0x8D73, "GL_INTENSITY32UI_EXT" },
+ { 0x8D74, "GL_LUMINANCE32UI_EXT" },
+ { 0x8D75, "GL_LUMINANCE_ALPHA32UI_EXT" },
+ { 0x8D76, "GL_RGBA16UI_EXT" },
+ { 0x8D77, "GL_RGB16UI_EXT" },
+ { 0x8D78, "GL_ALPHA16UI_EXT" },
+ { 0x8D79, "GL_INTENSITY16UI_EXT" },
+ { 0x8D7A, "GL_LUMINANCE16UI_EXT" },
+ { 0x8D7B, "GL_LUMINANCE_ALPHA16UI_EXT" },
+ { 0x8D7C, "GL_RGBA8UI_EXT" },
+ { 0x8D7D, "GL_RGB8UI_EXT" },
+ { 0x8D7E, "GL_ALPHA8UI_EXT" },
+ { 0x8D7F, "GL_INTENSITY8UI_EXT" },
+ { 0x8D80, "GL_LUMINANCE8UI_EXT" },
+ { 0x8D81, "GL_LUMINANCE_ALPHA8UI_EXT" },
+ { 0x8D82, "GL_RGBA32I_EXT" },
+ { 0x8D83, "GL_RGB32I_EXT" },
+ { 0x8D84, "GL_ALPHA32I_EXT" },
+ { 0x8D85, "GL_INTENSITY32I_EXT" },
+ { 0x8D86, "GL_LUMINANCE32I_EXT" },
+ { 0x8D87, "GL_LUMINANCE_ALPHA32I_EXT" },
+ { 0x8D88, "GL_RGBA16I_EXT" },
+ { 0x8D89, "GL_RGB16I_EXT" },
+ { 0x8D8A, "GL_ALPHA16I_EXT" },
+ { 0x8D8B, "GL_INTENSITY16I_EXT" },
+ { 0x8D8C, "GL_LUMINANCE16I_EXT" },
+ { 0x8D8D, "GL_LUMINANCE_ALPHA16I_EXT" },
+ { 0x8D8E, "GL_RGBA8I_EXT" },
+ { 0x8D8F, "GL_RGB8I_EXT" },
+ { 0x8D90, "GL_ALPHA8I_EXT" },
+ { 0x8D91, "GL_INTENSITY8I_EXT" },
+ { 0x8D92, "GL_LUMINANCE8I_EXT" },
+ { 0x8D93, "GL_LUMINANCE_ALPHA8I_EXT" },
+ { 0x8D94, "GL_RED_INTEGER_EXT" },
+ { 0x8D95, "GL_GREEN_INTEGER_EXT" },
+ { 0x8D96, "GL_BLUE_INTEGER_EXT" },
+ { 0x8D97, "GL_ALPHA_INTEGER_EXT" },
+ { 0x8D98, "GL_RGB_INTEGER_EXT" },
+ { 0x8D99, "GL_RGBA_INTEGER_EXT" },
+ { 0x8D9A, "GL_BGR_INTEGER_EXT" },
+ { 0x8D9B, "GL_BGRA_INTEGER_EXT" },
+ { 0x8D9C, "GL_LUMINANCE_INTEGER_EXT" },
+ { 0x8D9D, "GL_LUMINANCE_ALPHA_INTEGER_EXT" },
+ { 0x8D9E, "GL_RGBA_INTEGER_MODE_EXT" },
+ { 0x8DA7, "GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT" },
+ { 0x8DA8, "GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT" },
+ { 0x8DA9, "GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT" },
+ { 0x8DAD, "GL_FLOAT_32_UNSIGNED_INT_24_8_REV" },
+ { 0x8DB9, "GL_FRAMEBUFFER_SRGB_EXT" },
+ { 0x8DBA, "GL_FRAMEBUFFER_SRGB_CAPABLE_EXT" },
+ { 0x8DBB, "GL_COMPRESSED_RED_RGTC1" },
+ { 0x8DBC, "GL_COMPRESSED_SIGNED_RED_RGTC1" },
+ { 0x8DBD, "GL_COMPRESSED_RG_RGTC2" },
+ { 0x8DBE, "GL_COMPRESSED_SIGNED_RG_RGTC2" },
+ { 0x8DC0, "GL_SAMPLER_1D_ARRAY_EXT" },
+ { 0x8DC1, "GL_SAMPLER_2D_ARRAY_EXT" },
+ { 0x8DC2, "GL_SAMPLER_BUFFER_EXT" },
+ { 0x8DC3, "GL_SAMPLER_1D_ARRAY_SHADOW_EXT" },
+ { 0x8DC4, "GL_SAMPLER_2D_ARRAY_SHADOW_EXT" },
+ { 0x8DC5, "GL_SAMPLER_CUBE_SHADOW_EXT" },
+ { 0x8DC6, "GL_UNSIGNED_INT_VEC2_EXT" },
+ { 0x8DC7, "GL_UNSIGNED_INT_VEC3_EXT" },
+ { 0x8DC8, "GL_UNSIGNED_INT_VEC4_EXT" },
+ { 0x8DC9, "GL_INT_SAMPLER_1D_EXT" },
+ { 0x8DCA, "GL_INT_SAMPLER_2D_EXT" },
+ { 0x8DCB, "GL_INT_SAMPLER_3D_EXT" },
+ { 0x8DCC, "GL_INT_SAMPLER_CUBE_EXT" },
+ { 0x8DCD, "GL_INT_SAMPLER_2D_RECT_EXT" },
+ { 0x8DCE, "GL_INT_SAMPLER_1D_ARRAY_EXT" },
+ { 0x8DCF, "GL_INT_SAMPLER_2D_ARRAY_EXT" },
+ { 0x8DD0, "GL_INT_SAMPLER_BUFFER_EXT" },
+ { 0x8DD1, "GL_UNSIGNED_INT_SAMPLER_1D_EXT" },
+ { 0x8DD2, "GL_UNSIGNED_INT_SAMPLER_2D_EXT" },
+ { 0x8DD3, "GL_UNSIGNED_INT_SAMPLER_3D_EXT" },
+ { 0x8DD4, "GL_UNSIGNED_INT_SAMPLER_CUBE_EXT" },
+ { 0x8DD5, "GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT" },
+ { 0x8DD6, "GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT" },
+ { 0x8DD7, "GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT" },
+ { 0x8DD8, "GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT" },
+ { 0x8DD9, "GL_GEOMETRY_SHADER_EXT" },
+ { 0x8DDA, "GL_GEOMETRY_VERTICES_OUT_EXT" },
+ { 0x8DDB, "GL_GEOMETRY_INPUT_TYPE_EXT" },
+ { 0x8DDC, "GL_GEOMETRY_OUTPUT_TYPE_EXT" },
+ { 0x8DDD, "GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT" },
+ { 0x8DDE, "GL_MAX_VERTEX_VARYING_COMPONENTS_EXT" },
+ { 0x8DDF, "GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT" },
+ { 0x8DE0, "GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT" },
+ { 0x8DE1, "GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT" },
+ { 0x8DE2, "GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT" },
+ { 0x8DE3, "GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT" },
+ { 0x8DE4, "GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT" },
+ { 0x8DED, "GL_MAX_BINDABLE_UNIFORM_SIZE_EXT" },
+ { 0x8DEE, "GL_UNIFORM_BUFFER_EXT" },
+ { 0x8DEF, "GL_UNIFORM_BUFFER_BINDING_EXT" },
+ { 0x8E4C, "GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT" },
+ { 0x8E4D, "GL_FIRST_VERTEX_CONVENTION_EXT" },
+ { 0x8E4E, "GL_LAST_VERTEX_CONVENTION_EXT" },
+ { 0x8E4F, "GL_PROVOKING_VERTEX_EXT" },
+
+ VE( TERMVALUE )
+};
+
+const GLMValueEntry_t g_gl_renderers[] =
+{
+ { 0x00020200, "Generic" },
+ { 0x00020400, "GenericFloat" },
+ { 0x00020600, "AppleSW" },
+ { 0x00021000, "ATIRage128" },
+ { 0x00021200, "ATIRadeon" },
+ { 0x00021400, "ATIRagePro" },
+ { 0x00021600, "ATIRadeon8500" },
+ { 0x00021800, "ATIRadeon9700" },
+ { 0x00021900, "ATIRadeonX1000" },
+ { 0x00021A00, "ATIRadeonX2000" },
+ { 0x00022000, "NVGeForce2MX" },
+ { 0x00022200, "NVGeForce3" },
+ { 0x00022400, "NVGeForceFX" },
+ { 0x00022600, "NVGeForce8xxx" },
+ { 0x00023000, "VTBladeXP2" },
+ { 0x00024000, "Intel900" },
+ { 0x00024200, "IntelX3100" },
+ { 0x00040000, "Mesa3DFX" },
+
+ VE( TERMVALUE )
+};
+
+
+//===============================================================================
+// decode helper funcs
+
+char s_glmStrScratch[65536];
+int s_glmStrCursor = 0;
+
+const char * GLMDecode( GLMThing_t thingtype, unsigned long value )
+{
+ const GLMValueEntry_t *table = NULL;
+ //char isflags = 0;
+
+ switch( thingtype )
+ {
+ case eD3D_DEVTYPE: table = g_d3d_devtypes;
+ break;
+
+ case eD3D_FORMAT: table = g_d3d_formats;
+ break;
+
+ case eD3D_RTYPE: table = g_d3d_rtypes;
+ break;
+
+ case eD3D_USAGE: table = g_d3d_usages;
+ break;
+
+ case eD3D_RSTATE: table = g_d3d_rstates;
+ break;
+
+ case eD3D_SIO: table = g_d3d_opcodes;
+ break;
+
+ case eD3D_VTXDECLUSAGE: table = g_d3d_vtxdeclusages;
+ break;
+
+ case eCGL_RENDID: table = g_cgl_rendids;
+ break;
+
+ case eGL_ERROR: table = g_gl_errors;
+ break;
+
+ case eGL_ENUM: table = g_gl_enums;
+ break;
+
+ case eGL_RENDERER: table = g_gl_renderers;
+ break;
+
+ default:
+ GLMStop();
+ return "UNKNOWNTYPE";
+ break;
+ }
+
+ if (table)
+ {
+ while( table->value != TERMVALUE )
+ {
+ if (table->value == value)
+ {
+ return table->name;
+ }
+ table++;
+ }
+ }
+ return "UNKNOWN";
+}
+
+const char *GLMDecodeMask( GLMThing_t kind, unsigned long value )
+{
+ // if cursor to scratch buffer is within 1K of EOB, rewind
+ // nobody is going to decode 63K of flag string values in a single call..
+
+ // this means that strings returned by this function have a short lifetime.. print them and do not save the pointer..
+
+ if ( (sizeof(s_glmStrScratch) - s_glmStrCursor) < 1000 )
+ {
+ s_glmStrCursor = 0;
+ }
+
+ char *start = &s_glmStrScratch[ s_glmStrCursor ];
+ char *dest = start;
+ char first = 1;
+
+ DWORD mask = static_cast<DWORD>(1L<<31);
+ while(mask)
+ {
+ if (mask & value)
+ {
+ sprintf(dest,"%s%s", (first) ? "" : "|", GLMDecode( kind, value&mask ) );
+ first = 0;
+
+ dest += strlen(dest); // leaves dest pointing at the end null
+ }
+ mask >>= 1;
+ }
+ s_glmStrCursor = (dest - s_glmStrScratch) + 1; // +1 so the next decoded flag set doesn't land on the ending null
+ return start;
+
+}
+
+#undef VE
+#undef TERMVALUE
+
+//===============================================================================
+
+bool GLMDetectOGLP( void )
+{
+ bool result = false;
+#if defined( OSX ) && defined( CGLPROFILER_ENABLE )
+ GLint forceFlush;
+ CGLError error = CGLGetParameter(CGLGetCurrentContext(), kCGLCPEnableForceFlush, &forceFlush);
+ result = error == 0;
+ if (result)
+ {
+ // enable a breakpoint on color4sv
+ int oglp_bkpt[3] = { kCGLFEglColor4sv, kCGLProfBreakBefore, 1 };
+
+ CGLSetOption( kCGLGOEnableBreakpoint, (GLint)oglp_bkpt );
+ }
+
+#endif
+ return result;
+}
+
+
+// from http://blog.timac.org/?p=190
+
+#ifndef _WIN32
+ #include <stdbool.h>
+#endif
+#include <sys/types.h>
+#ifndef _WIN32
+ #include <unistd.h>
+ #include <sys/sysctl.h>
+#endif
+
+// From Technical Q&A QA1361
+// Returns true if the current process
+// is being debugged (either running
+// under the debugger or has a debugger
+// attached post facto).
+
+bool GLMDetectGDB( void ) // aka AmIBeingDebugged()
+{
+#ifdef OSX
+ bool result;
+ int junk;
+ int mib[4];
+ struct kinfo_proc info;
+ size_t size;
+
+ // Initialize the flags so that,
+ // if sysctl fails for some bizarre
+ // reason, we get a predictable result.
+
+ info.kp_proc.p_flag = 0;
+
+ // Initialize mib, which tells sysctl the info
+ // we want, in this case we're looking for
+ // information about a specific process ID.
+
+ mib[0] = CTL_KERN;
+ mib[1] = KERN_PROC;
+ mib[2] = KERN_PROC_PID;
+ mib[3] = getpid();
+
+ // Call sysctl.
+
+ size = sizeof(info);
+ junk = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0);
+
+ assert(junk == 0);
+
+ // We're being debugged if the P_TRACED
+ // flag is set.
+
+ result = ( (info.kp_proc.p_flag & P_TRACED) != 0 );
+ return result;
+#else
+ return Sys_IsDebuggerPresent();
+#endif
+}
+
+
+static uint g_glmDebugChannelMask = 0; // which output channels are available (can be more than one)
+static uint g_glmDebugFlavorMask = 0; // which message flavors are enabled for output (can be more than one)
+
+uint GLMDetectAvailableChannels( void )
+{
+ uint result = 0;
+
+ // printf is always available (except maybe in release... ?)
+ result |= (1 << ePrintf);
+
+ // gdb
+ if (GLMDetectGDB())
+ {
+ result |= (1 << eDebugger);
+ printf("\n############# GDB Detected");
+ }
+
+ // oglp
+ if (GLMDetectOGLP())
+ {
+ result |= (1 << eGLProfiler);
+ printf("\n############# OGLP Detected");
+ }
+
+ return result;
+}
+
+
+static bool g_debugInitDone = false;
+
+#if GLMDEBUG
+
+ // following funcs vanish if GLMDEBUG not set
+
+void GLMDebugInitialize( bool forceReinit )
+{
+ if ( !g_debugInitDone || forceReinit )
+ {
+ // detect channels
+ uint channelMask = GLMDetectAvailableChannels();
+
+ // see if there are any prohibitions on the commandline
+ // (also add any other desired reasons, release build say)..
+
+ if ( CommandLine()->FindParm("-noprintconsole") )
+ {
+ channelMask &= ~(1<<ePrintf);
+ }
+
+ if ( CommandLine()->FindParm("-noprintdebugger") )
+ {
+ channelMask &= ~(1<<eDebugger);
+ }
+
+ if ( CommandLine()->FindParm("-noprintoglp") )
+ {
+ channelMask &= ~(1<<eGLProfiler);
+ }
+
+ // finally, disable all of them if commandline did not say "enable spew"
+ if (!CommandLine()->FindParm("-glmspew"))
+ {
+ channelMask = 0;
+ }
+
+ // set the output channel mask
+ GLMDebugChannelMask( &channelMask );
+
+ // if any channels are enabled, enable some output
+ if ( channelMask )
+ {
+ // start mostly quiet unless the -glmbootspew option is there
+ if ( CommandLine()->FindParm( "-glmbootspew" ) )
+ {
+ g_glmDebugFlavorMask = 0xFFFFFFFF;
+ }
+ else
+ {
+ g_glmDebugFlavorMask =
+ (1<<eAllFlavors)
+ | (1<<eDebugDump) // -D- stuff
+ // | (1<<eFrameBufData) // -F-
+ // | (1<<eDXStuff) // -X-
+ // | (1<<eTenure) // > <
+ // | (1<<eAllocations) // -A-
+ | (1<<eSlowness) // -Z-
+ | (1<<eDefaultFlavor); // adjust to suit
+ }
+ }
+ else
+ {
+ g_glmDebugFlavorMask = 0;
+ }
+ }
+}
+
+uint GLMDebugChannelMask( uint *newValue )
+{
+ if (newValue)
+ {
+ g_glmDebugChannelMask = *newValue;
+ }
+
+ uint result = g_glmDebugChannelMask;
+
+ // leave space for any override / mute mechanism we might want to inject here
+
+ return result;
+}
+
+uint GLMDebugFlavorMask( uint *newValue )
+{
+ if (newValue)
+ {
+ g_glmDebugFlavorMask = *newValue;
+ }
+
+ uint result = g_glmDebugFlavorMask;
+
+ // leave space for any override / mute mechanism we might want to inject here
+
+ return result;
+}
+
+#endif
+
+//===============================================================================
+void GLMEnableTrace( bool on )
+{
+#if GLMDEBUG
+#if defined( OSX ) && defined( CGLPROFILER_ENABLE )
+ if ( GLMDebugChannelMask() & (1<<eGLProfiler) )
+ {
+ CGLSetOption(kCGLGOEnableFunctionTrace, on ? GL_TRUE : GL_FALSE );
+ }
+#endif
+#endif
+}
+
+//===============================================================================
+
+#if GLMDEBUG
+ // following funcs vanish if GLMDEBUG not set
+
+void GLMStringOut( char *string )
+{
+ if ( GLMDebugChannelMask() & ( (1<<ePrintf) | (1<<eDebugger) ) )
+ {
+#ifdef WIN32
+ OutputDebugStringA( string );
+ OutputDebugStringA( "\n");
+#else
+ puts( string );
+#endif
+ }
+
+#if defined( OSX ) && defined( CGLPROFILER_ENABLE )
+ if ( GLMDebugChannelMask() & (1<<eGLProfiler) )
+ {
+ CGLSetOption( kCGLGOComment, (GLint)string );
+ }
+#endif
+
+ if ( GLMDebugChannelMask() & (1<<eGLProfiler) )
+ {
+ if (gGL->m_bHave_GL_GREMEDY_string_marker)
+ {
+ gGL->glStringMarkerGREMEDY(0, string);
+ }
+ }
+}
+
+int g_glm_indent = 0;
+int g_glm_indent_max = 40; // 40 tabs max
+
+#ifndef OSX
+const char *strnstr( const char *haystack, const char *needle, int len )
+{
+ return strstr( haystack, needle );
+}
+#endif
+
+EGLMDebugFlavor GLMAssessFlavor( char *str )
+{
+ EGLMDebugFlavor flavor = eDefaultFlavor;
+
+ if (strnstr(str, "-D-", 4))
+ {
+ // debug dump
+ flavor = eDebugDump;
+ }
+ else if (strnstr(str, "-M-", 4))
+ {
+ // matrix data
+ flavor = eMatrixData;
+ }
+ else if (strnstr(str, "-S-", 4))
+ {
+ // shader data
+ flavor = eShaderData;
+ }
+ else if (strnstr(str, "-F-", 4))
+ {
+ // framebuf data
+ flavor = eFrameBufData;
+ }
+ else if (strnstr(str, "-X-", 4))
+ {
+ // DirectX data
+ flavor = eDXStuff;
+ }
+ else if (strnstr(str, "-A-", 4))
+ {
+ // allocation data
+ flavor = eAllocations;
+ }
+ else if (strnstr(str, "-Z-", 4))
+ {
+ // allocation data
+ flavor = eSlowness;
+ }
+ else if (str[0] == '<' || str[0] == '>')
+ {
+ // entry/exit (aka tenure)
+ flavor = eTenure;
+ }
+ else if (strnstr(str, "---", 4)) // note we check four chars worth so you can do >-M- and it will indent and be filterable
+ {
+ // comment
+ flavor = eComment;
+ }
+
+ return flavor;
+}
+
+void GLMPrintfVA( const char *fmt, va_list vargs )
+{
+ // if no channels open, return
+ uint channelMask = GLMDebugChannelMask();
+ if (!channelMask)
+ return;
+
+ // if "all flavors" is off, return
+ uint flavorMask = GLMDebugFlavorMask();
+ if (! ( flavorMask & (1<<eAllFlavors) ) )
+ return;
+
+ // characterize the flavor of the string
+ // if flavor hits against the flavor mask, print it
+ EGLMDebugFlavor flavor = GLMAssessFlavor( (char *)fmt );
+ if ( !(flavorMask & (1<<flavor)) )
+ return;
+
+ // print the formatted string, with indenting
+ // if first char is a '>' - raise indent level after print.
+ // if first char is a '<' - lower indent level before print.
+
+ char buf[100000];
+
+ if (fmt[0] == '<')
+ {
+ GLMIncIndent( -1 );
+ }
+
+ memset( buf, '\t', g_glm_indent );
+ vsprintf( buf+g_glm_indent, fmt, vargs );
+ GLMStringOut( buf );
+
+ if (fmt[0] == '>')
+ {
+ GLMIncIndent( 1 );
+ }
+}
+
+void GLMPrintf( const char *fmt, ... )
+{
+ // if no channels open, return
+ uint channelMask = GLMDebugChannelMask();
+ if (!channelMask)
+ return;
+
+ // if "all flavors" is off, return
+ uint flavorMask = GLMDebugFlavorMask();
+ if (! ( flavorMask & (1<<eAllFlavors) ) )
+ return;
+
+ va_list vargs;
+ va_start(vargs, fmt);
+ GLMPrintfVA( fmt, vargs );
+ va_end( vargs );
+}
+
+void GLMPrintStr( const char *str, EGLMDebugFlavor flavor ) // will indent
+{
+ // if no channels open, return
+ uint channelMask = GLMDebugChannelMask();
+ if (!channelMask)
+ return;
+
+ // if "all flavors" is off, return
+ uint flavorMask = GLMDebugFlavorMask();
+ if (! ( flavorMask & (1<<eAllFlavors) ) )
+ return;
+
+ // if flavor argument hits against the flavor mask, print it
+ if ( !(flavorMask & (1<<flavor)) )
+ return;
+
+ // just print the plain string, with indenting
+ // if first char is a '>' - raise indent level after print.
+ // if first char is a '<' - lower indent level before print.
+
+ char buf[64000];
+
+ if (str[0] == '<')
+ {
+ GLMIncIndent( -1 );
+ }
+
+ memset( buf, '\t', g_glm_indent );
+
+ if (strlen(str) < sizeof(buf)-g_glm_indent-1)
+ {
+ strcpy( buf + g_glm_indent, str );
+ }
+ else
+ {
+ DXABSTRACT_BREAK_ON_ERROR();
+ }
+
+
+ GLMStringOut( buf ); // single string out with indenting
+
+ if (str[0] == '>')
+ {
+ GLMIncIndent( 1 );
+ }
+}
+
+
+void GLMPrintText( const char *str, EGLMDebugFlavor flavor, uint options )
+{
+ // if no channels open, return
+ uint channelMask = GLMDebugChannelMask();
+ if (!channelMask)
+ return;
+
+ // if "all flavors" is off, return
+ uint flavorMask = GLMDebugFlavorMask();
+ if (! ( flavorMask & (1<<eAllFlavors) ) )
+ return;
+
+ // if flavor argument hits against the flavor mask, print it
+ if ( !(flavorMask & (1<<flavor)) )
+ return;
+
+ char buf[64000];
+ char lineout[64000];
+ int linenum = 1;
+
+ V_strncpy( buf, str, sizeof(buf) );
+
+ // walk the text and treat each newline as an indentation opportunity..
+ const char *mark = buf;
+ const char *end = mark + strlen(buf);
+ //const char *next = NULL;
+
+ while(mark < end)
+ {
+ // starting at mark, see if there is a newline between there and end
+ char *next = (char*)strchr( mark, '\n' );
+ const char *printfrom = mark;
+ if (next)
+ {
+ // print text from mark up through next. move next to char after newline.
+ *next = 0;
+ mark = next+1;
+ }
+ else
+ {
+ // print all text after mark and stop
+ mark = end;
+ }
+ if (options & GLMPRINTTEXT_NUMBEREDLINES)
+ {
+ sprintf( lineout, "%-5d| %s", linenum, printfrom );
+ GLMPrintStr( lineout, flavor );
+ linenum++;
+ }
+ else
+ {
+ GLMPrintStr( printfrom, flavor );
+ }
+ }
+}
+
+int GLMIncIndent( int indentDelta )
+{
+ g_glm_indent += indentDelta;
+
+ if (indentDelta>0)
+ {
+ if (g_glm_indent > g_glm_indent_max)
+ {
+ g_glm_indent = g_glm_indent_max;
+ }
+ }
+ else
+ {
+ if (g_glm_indent < 0)
+ {
+ g_glm_indent = 0;
+ }
+ }
+ return g_glm_indent;
+}
+
+int GLMGetIndent( void )
+{
+ return g_glm_indent;
+}
+
+void GLMSetIndent( int indent )
+{
+ g_glm_indent = indent;
+}
+
+#endif
+
+// PIX tracking - you can call these outside of GLMDEBUG=true
+char sg_pPIXName[128];
+
+
+#ifndef OSX
+ConVar gl_telemetry_gpu_pipeline_flushing( "gl_telemetry_gpu_pipeline_flushing", "0" );
+
+class CGPUTimestampManager
+{
+ CGPUTimestampManager( const CGPUTimestampManager & );
+ CGPUTimestampManager& operator= ( CGPUTimestampManager & );
+
+public:
+ CGPUTimestampManager() :
+ m_bInitialized( false ),
+ m_nCurFrame( 0 ),
+ m_flGPUToCPUOffsetInS( 0 ),
+ m_flGPUToS( 0 ),
+ m_flRdtscToS( 0 ),
+ m_flSToRdtsc( 0 ),
+ m_nFreeQueryPoolSize( 0 ),
+ m_nOutstandingQueriesHead( 0 ),
+ m_nOutstandingQueriesTail( 0 ),
+ m_nNumOutstandingQueryZones( 0 ),
+ m_nQueryZoneStackSize( 0 ),
+ m_nNumFinishedZones( 0 ),
+ m_nTotalSpanWorkCount( 0 )
+ {
+ memset( m_FreeQueryPool, 0, sizeof( m_FreeQueryPool ) ) ;
+ memset( m_QueryZoneStack, 0, sizeof( m_QueryZoneStack ) );
+ memset( m_OutstandingQueryZones, 0, sizeof( m_OutstandingQueryZones ) );
+ memset( m_FinishedZones, 0, sizeof( m_FinishedZones ) );
+ }
+
+ ~CGPUTimestampManager()
+ {
+ Deinit();
+ }
+
+ inline bool IsInitialized() const { return m_bInitialized; }
+ inline uint GetCurFrame() const { return m_nCurFrame; }
+
+ void Init()
+ {
+ Deinit();
+
+ memset( m_FreeQueryPool, 0, sizeof( m_FreeQueryPool ) ) ;
+ memset( m_QueryZoneStack, 0, sizeof( m_QueryZoneStack ) );
+ memset( m_OutstandingQueryZones, 0, sizeof( m_OutstandingQueryZones ) );
+ memset( m_FinishedZones, 0, sizeof( m_FinishedZones ) );
+
+ InitRdtsc();
+
+ m_nCurFrame = 0;
+
+ gGL->glGenQueries( cFreeQueryPoolSize, m_FreeQueryPool );
+ m_nFreeQueryPoolSize = cFreeQueryPoolSize;
+
+ m_nOutstandingQueriesHead = 0;
+ m_nOutstandingQueriesTail = 0;
+ m_nNumOutstandingQueryZones = 0;
+
+ m_nQueryZoneStackSize = 0;
+ m_nNumFinishedZones = 0;
+
+ m_bInitialized = true;
+
+ m_nTotalSpanWorkCount = 0;
+
+ Calibrate();
+ }
+
+ void Calibrate()
+ {
+ if ( !m_bInitialized )
+ return;
+
+ PipelineFlush();
+
+ m_flGPUToS = 1.0 / 1000000000.0;
+
+ //0.99997541250006794;
+ //0.99997530000006662;
+ // Correction factor to prevent excessive drift, only calibrated on my system, we need a better way of computing/recording this.
+ double flGPURatio = 0.99997425000007034000;
+
+ const uint NT = 1;
+ for ( uint nTrial = 0; nTrial < NT; nTrial++ )
+ {
+ const uint R = 16;
+ double flClockOffsetsInS[R];
+ for ( uint q = 0; q < R; q++)
+ {
+ uint64 nBestTotalCPUTimestamp = (uint64)-1;
+ uint64 nBestCPUTimestamp = 0;
+ GLuint64 nBestGPUTimestamp = 0;
+
+ for ( uint i = 0; i < 10; i++)
+ {
+ const uint64 nStartCPUTimestamp = Plat_Rdtsc();
+
+ gGL->glQueryCounter( m_FreeQueryPool[0], GL_TIMESTAMP);
+ PipelineFlush();
+
+ const uint64 nEndCPUTimestamp = Plat_Rdtsc();
+
+ GLint nAvailable;
+ do
+ {
+ gGL->glGetQueryObjectiv( m_FreeQueryPool[0], GL_QUERY_RESULT_AVAILABLE, &nAvailable );
+ } while ( !nAvailable );
+
+ GLuint64 nGPUTimestamp;
+ gGL->glGetQueryObjectui64v( m_FreeQueryPool[0], GL_QUERY_RESULT, &nGPUTimestamp );
+
+ const uint64 nTotalCPUTimestamp = nEndCPUTimestamp - nStartCPUTimestamp;
+ if ( nTotalCPUTimestamp < nBestTotalCPUTimestamp )
+ {
+ nBestTotalCPUTimestamp = nTotalCPUTimestamp;
+ nBestCPUTimestamp = nStartCPUTimestamp;
+ nBestGPUTimestamp = nGPUTimestamp;
+ }
+ }
+
+ double flCPUTimestampTimeInSeconds = nBestCPUTimestamp * m_flRdtscToS;
+ double flGPUTimestampTimeInSeconds = nBestGPUTimestamp * m_flGPUToS * flGPURatio;
+
+ flClockOffsetsInS[q] = flCPUTimestampTimeInSeconds - flGPUTimestampTimeInSeconds;
+
+ ThreadSleep(100);
+
+ DbgPrintf("%f %f %1.20f\n", flCPUTimestampTimeInSeconds, flGPUTimestampTimeInSeconds, flClockOffsetsInS[q] );
+ }
+
+ m_flGPUToCPUOffsetInS = 0.0f;
+ for ( uint i = 0; i < R; i++ )
+ m_flGPUToCPUOffsetInS += flClockOffsetsInS[i];
+ m_flGPUToCPUOffsetInS /= R;
+
+ if ( NT > 1 )
+ {
+ DbgPrintf("------- Ratio: %2.20f\n", flGPURatio );
+
+ double flDelta = flClockOffsetsInS[0] - flClockOffsetsInS[R - 1];
+
+ DbgPrintf("------- %1.20f\n", flDelta );
+
+#if 1
+ if ( flDelta < 0.0000005f )
+ {
+ flGPURatio += .000000125f;
+ }
+ else if ( flDelta > 0.0000005f )
+ {
+ flGPURatio -= .000000125f;
+ }
+#else
+ if ( flDelta < 0.0000005f )
+ {
+ flGPURatio += .0000000125f;
+ }
+ else if ( flDelta > 0.0000005f )
+ {
+ flGPURatio -= .0000000125f;
+ }
+#endif
+ }
+ }
+
+ m_flGPUToS *= flGPURatio;
+
+#if 0
+ // dump drift over time to debugger output
+ double flLatency = 0;
+ for ( ; ; )
+ {
+ // test
+ const uint64 nStartCPUTime = Plat_Rdtsc();
+
+ gGL->glQueryCounter( m_FreeQueryPool[0], GL_TIMESTAMP);
+
+ PipelineFlush();
+
+ GLint nAvailable;
+ do
+ {
+ gGL->glGetQueryObjectiv( m_FreeQueryPool[0], GL_QUERY_RESULT_AVAILABLE, &nAvailable );
+ } while ( !nAvailable );
+
+ GLuint64 nGPUTime;
+ gGL->glGetQueryObjectui64v( m_FreeQueryPool[0], GL_QUERY_RESULT, &nGPUTime );
+
+ double flStartGPUTime = ( ( nGPUTime * m_flGPUToS ) + m_flGPUToCPUOffsetInS );
+
+ flLatency = flStartGPUTime - nStartCPUTime * m_flRdtscToS;
+ DbgPrintf("%f\n", flLatency );
+ }
+#endif
+ }
+
+ void Deinit()
+ {
+ if ( !m_bInitialized )
+ return;
+
+ if ( m_nFreeQueryPoolSize )
+ {
+ gGL->glDeleteQueries( m_nFreeQueryPoolSize, m_FreeQueryPool );
+ }
+ m_nFreeQueryPoolSize = 0;
+
+ for ( uint i = 0; i < m_nNumOutstandingQueryZones; i++ )
+ {
+ QueryZone_t &query = m_OutstandingQueryZones[ ( m_nOutstandingQueriesHead + i ) % cMaxQueryZones ];
+ if ( query.m_nBeginQuery )
+ {
+ gGL->glDeleteQueries( 1, &query.m_nBeginQuery );
+ }
+ if ( query.m_nEndQuery )
+ {
+ gGL->glDeleteQueries( 1, &query.m_nEndQuery );
+ }
+ }
+ m_nOutstandingQueriesHead = 0;
+ m_nOutstandingQueriesTail = 0;
+ m_nNumOutstandingQueryZones = 0;
+
+ for ( uint i = 0; i < m_nQueryZoneStackSize; i++ )
+ {
+ QueryZone_t &query = m_QueryZoneStack[i];
+ if ( query.m_nBeginQuery )
+ {
+ gGL->glDeleteQueries( 1, &query.m_nBeginQuery );
+ }
+ if ( query.m_nEndQuery )
+ {
+ gGL->glDeleteQueries( 1, &query.m_nEndQuery );
+ }
+ }
+ m_nQueryZoneStackSize = 0;
+
+ m_flGPUToCPUOffsetInS = 0;
+ m_flGPUToS = 0;
+ m_flRdtscToS = 0;
+ m_flSToRdtsc = 0;
+
+ m_bInitialized = false;
+ }
+
+ // pName is assumed to be a telemetry dynamic string!
+ void BeginZone( const char *pName )
+ {
+ if ( !m_bInitialized )
+ return;
+
+ if ( m_nQueryZoneStackSize >= cMaxQueryZoneStackSize )
+ {
+ Panic( "Increase cMaxQueryZoneStackSize!" );
+ }
+
+ QueryZone_t &zone = m_QueryZoneStack[m_nQueryZoneStackSize];
+
+ zone.m_pName = pName;
+
+ zone.m_nBeginQuery = AllocQueryHandle();
+ zone.m_nEndQuery = 0;
+ zone.m_nStackLevel = m_nQueryZoneStackSize;
+
+ zone.m_nTotalGPUWorkCount = g_nTotalDrawsOrClears;
+#if GL_TELEMETRY_GPU_ZONES
+ zone.m_nTotalGPUWorkCount += g_TelemetryGPUStats.GetTotal();
+#endif
+
+ gGL->glQueryCounter( m_QueryZoneStack[m_nQueryZoneStackSize].m_nBeginQuery, GL_TIMESTAMP );
+
+ m_nQueryZoneStackSize++;
+ }
+
+ void EndZone()
+ {
+ if ( !m_bInitialized )
+ return;
+
+ if ( ( !m_nQueryZoneStackSize ) || ( m_nNumOutstandingQueryZones == cMaxQueryZones ) )
+ {
+ Panic( "Query zone error!" );
+ }
+
+ m_nQueryZoneStackSize--;
+
+ uint nCurGPUWorkCount = g_nTotalDrawsOrClears;
+#if GL_TELEMETRY_GPU_ZONES
+ nCurGPUWorkCount += g_TelemetryGPUStats.GetTotal();
+#endif
+
+ uint nTotalDraws = nCurGPUWorkCount - m_QueryZoneStack[m_nQueryZoneStackSize].m_nTotalGPUWorkCount;
+
+ m_QueryZoneStack[m_nQueryZoneStackSize].m_nEndQuery = AllocQueryHandle();
+ gGL->glQueryCounter( m_QueryZoneStack[m_nQueryZoneStackSize].m_nEndQuery, GL_TIMESTAMP );
+ m_QueryZoneStack[m_nQueryZoneStackSize].m_nTotalGPUWorkCount = nTotalDraws;
+
+ m_OutstandingQueryZones[m_nOutstandingQueriesHead] = m_QueryZoneStack[m_nQueryZoneStackSize];
+ m_nOutstandingQueriesHead = ( m_nOutstandingQueriesHead + 1 ) % cMaxQueryZones;
+ m_nNumOutstandingQueryZones++;
+
+ COMPILE_TIME_ASSERT( ( int )cMaxQueryZones > ( int )cMaxQueryZoneStackSize );
+ if ( m_nNumOutstandingQueryZones >= ( cMaxQueryZones - cMaxQueryZoneStackSize ) )
+ {
+ tmMessage( TELEMETRY_LEVEL2, TMMF_ICON_NOTE | TMMF_SEVERITY_WARNING, "CGPUTimestampManager::EndZone: Too many outstanding query zones - forcing a pipeline flush! This is probably expensive." );
+
+ FlushOutstandingQueries( true );
+ }
+
+ if ( gl_telemetry_gpu_pipeline_flushing.GetBool() )
+ {
+ PipelineFlush();
+ }
+ }
+
+ void Tick()
+ {
+ m_nCurFrame++;
+
+ if ( !m_bInitialized )
+ return;
+
+ if ( m_nQueryZoneStackSize > 0 )
+ {
+ Panic( "Zone stack is not empty!" );
+ }
+
+ FlushOutstandingQueries( false );
+
+ tmMessage( TELEMETRY_LEVEL2, 0, "Total PIX timespan GPU work count: %u", m_nTotalSpanWorkCount );
+
+ m_nTotalSpanWorkCount = 0;
+ }
+
+ void FlushOutstandingQueries( bool bForce )
+ {
+ tmZone( TELEMETRY_LEVEL2, 0, "FlushOutstandingQueries: %u", m_nNumOutstandingQueryZones );
+
+ if ( bForce )
+ {
+ PipelineFlush();
+ }
+
+ while ( m_nNumOutstandingQueryZones )
+ {
+ QueryZone_t &zone = m_OutstandingQueryZones[m_nOutstandingQueriesTail];
+
+ GLint nEndAvailable = 0;
+ do
+ {
+ gGL->glGetQueryObjectiv( zone.m_nEndQuery, GL_QUERY_RESULT_AVAILABLE, &nEndAvailable );
+
+ } while ( ( bForce ) && ( nEndAvailable == 0 ) );
+
+ if ( !nEndAvailable )
+ {
+ if ( bForce )
+ {
+ Panic( "Query results not available after a full pipeline flush!" );
+ }
+ break;
+ }
+
+ GLuint64 nBeginGPUTime, nEndGPUTime;
+ gGL->glGetQueryObjectui64v( zone.m_nBeginQuery, GL_QUERY_RESULT, &nBeginGPUTime );
+ gGL->glGetQueryObjectui64v( zone.m_nEndQuery, GL_QUERY_RESULT, &nEndGPUTime );
+
+ ReleaseQueryHandle( zone.m_nBeginQuery );
+ zone.m_nBeginQuery = 0;
+
+ ReleaseQueryHandle( zone.m_nEndQuery );
+ zone.m_nEndQuery = 0;
+
+ if ( m_nNumFinishedZones >= cMaxQueryZones )
+ {
+ Panic( "Too many finished zones!" );
+ }
+
+ FinishedQueryZone_t &finishedZone = m_FinishedZones[m_nNumFinishedZones];
+ finishedZone.m_pName = zone.m_pName;
+ finishedZone.m_nBeginGPUTime = nBeginGPUTime;
+ finishedZone.m_nEndGPUTime = nEndGPUTime;
+ finishedZone.m_nStackLevel = zone.m_nStackLevel;
+ finishedZone.m_nTotalGPUWorkCount = zone.m_nTotalGPUWorkCount;
+ m_nNumFinishedZones++;
+
+ if ( !zone.m_nStackLevel )
+ {
+ std::sort( m_FinishedZones, m_FinishedZones + m_nNumFinishedZones );
+ FlushFinishedZones();
+ m_nNumFinishedZones = 0;
+ }
+
+ m_nOutstandingQueriesTail = ( m_nOutstandingQueriesTail + 1 ) % cMaxQueryZones;
+ m_nNumOutstandingQueryZones--;
+ }
+ }
+
+private:
+ bool m_bInitialized;
+ uint m_nCurFrame;
+
+ double m_flGPUToCPUOffsetInS;
+ double m_flGPUToS;
+ double m_flRdtscToS;
+ double m_flSToRdtsc;
+
+ enum { cMaxQueryZones = 4096, cFreeQueryPoolSize = cMaxQueryZones * 2 };
+ GLuint m_FreeQueryPool[cFreeQueryPoolSize ];
+ uint m_nFreeQueryPoolSize;
+
+ GLuint AllocQueryHandle()
+ {
+ if ( !m_nFreeQueryPoolSize )
+ {
+ Panic( "Out of query handles!");
+ }
+ return m_FreeQueryPool[--m_nFreeQueryPoolSize];
+ }
+
+ void ReleaseQueryHandle( GLuint nHandle )
+ {
+ if ( m_nFreeQueryPoolSize >= cFreeQueryPoolSize )
+ {
+ Panic( "Query handle error!" );
+ }
+ m_FreeQueryPool[m_nFreeQueryPoolSize++] = nHandle;
+ }
+
+ struct QueryZone_t
+ {
+ const char *m_pName;
+ GLuint m_nBeginQuery;
+ GLuint m_nEndQuery;
+ uint m_nStackLevel;
+ uint m_nTotalGPUWorkCount;
+ };
+
+ QueryZone_t m_OutstandingQueryZones[cMaxQueryZones];
+ uint m_nOutstandingQueriesHead; // index of first outstanding query (oldest)
+ uint m_nOutstandingQueriesTail; // index where next query goes (newest)
+ uint m_nNumOutstandingQueryZones;
+
+ enum { cMaxQueryZoneStackSize = 256 };
+ QueryZone_t m_QueryZoneStack[cMaxQueryZoneStackSize];
+ uint m_nQueryZoneStackSize;
+
+ struct FinishedQueryZone_t
+ {
+ const char *m_pName;
+ GLuint64 m_nBeginGPUTime;
+ GLuint64 m_nEndGPUTime;
+ uint m_nStackLevel;
+ uint m_nTotalGPUWorkCount;
+
+ inline bool operator< ( const FinishedQueryZone_t &rhs ) const
+ {
+ if ( m_nBeginGPUTime == rhs.m_nBeginGPUTime)
+ return m_nStackLevel < rhs.m_nStackLevel;
+
+ return m_nBeginGPUTime < rhs.m_nBeginGPUTime;
+ }
+ };
+
+ FinishedQueryZone_t m_FinishedZones[cMaxQueryZones];
+ uint m_nNumFinishedZones;
+
+ uint m_nTotalSpanWorkCount;
+
+ void InitRdtsc()
+ {
+ m_flRdtscToS = 0.0f;
+ m_flSToRdtsc = 0.0f;
+
+ for ( uint i = 0; i < 10; i++ )
+ {
+ uint64 t0 = Plat_Rdtsc();
+ double d0 = Plat_FloatTime();
+
+ ThreadSleep( 250 );
+
+ uint64 t1 = Plat_Rdtsc();
+ double d1 = Plat_FloatTime();
+
+ double flRdtscToS = ( d1 - d0 ) / ( t1 - t0 );
+ double flSToRdtsc = ( t1 - t0 ) / ( d1 - d0 );
+ if ( flSToRdtsc > m_flSToRdtsc )
+ {
+ m_flRdtscToS = flRdtscToS;
+ m_flSToRdtsc = flSToRdtsc;
+ }
+ }
+ }
+
+ void PipelineFlush()
+ {
+#ifdef HAVE_GL_ARB_SYNC
+ GLsync nSyncObj = gGL->glFenceSync( GL_SYNC_GPU_COMMANDS_COMPLETE, 0 );
+ if ( nSyncObj )
+ {
+ gGL->glClientWaitSync( nSyncObj, GL_SYNC_FLUSH_COMMANDS_BIT, 300000000000ULL );
+ gGL->glDeleteSync( nSyncObj );
+ }
+#endif
+ }
+
+ inline void NewTimeSpan( uint64 nStartGPUTime, uint64 nEndGPUTime, const char *pName, uint nTotalDraws )
+ {
+ // apparently we must use level0 for timespans?
+ tmBeginTimeSpanAt( TELEMETRY_LEVEL0, 1, 0, nStartGPUTime, "%s [C:%u]", pName ? pName : "", nTotalDraws );
+ tmEndTimeSpanAt( TELEMETRY_LEVEL0, 1, 0, nEndGPUTime, "%s [C:%u]", pName ? pName : "", nTotalDraws );
+ }
+
+ void FlushFinishedZones()
+ {
+ for ( uint i = 0; i < m_nNumFinishedZones; i++ )
+ {
+ FinishedQueryZone_t &zone = m_FinishedZones[i];
+ if ( !zone.m_nTotalGPUWorkCount )
+ continue;
+
+ bool bEmit = false;
+ if ( i == ( m_nNumFinishedZones - 1 ) )
+ bEmit = true;
+ else
+ {
+ FinishedQueryZone_t &nextZone = m_FinishedZones[i + 1];
+ bEmit = zone.m_nEndGPUTime <= nextZone.m_nBeginGPUTime;
+ }
+
+ if ( bEmit )
+ {
+ uint64 nStartGPUTime = ( ( zone.m_nBeginGPUTime * m_flGPUToS ) + m_flGPUToCPUOffsetInS ) * m_flSToRdtsc;
+ uint64 nEndGPUTime = ( ( zone.m_nEndGPUTime * m_flGPUToS ) + m_flGPUToCPUOffsetInS ) * m_flSToRdtsc;
+
+ NewTimeSpan( nStartGPUTime, nEndGPUTime, zone.m_pName, zone.m_nTotalGPUWorkCount );
+
+ m_nTotalSpanWorkCount += zone.m_nTotalGPUWorkCount;
+ }
+ }
+ }
+
+ void Panic( const char *pMsg )
+ {
+ DXABSTRACT_BREAK_ON_ERROR();
+ Error( "%s", pMsg );
+ }
+
+ static void DbgPrintf( const char *pFmt, ... )
+ {
+ va_list vargs;
+ va_start( vargs, pFmt );
+ char buf[1024];
+ V_vsnprintf( buf, sizeof( buf ), pFmt, vargs );
+
+#ifdef WIN32
+ OutputDebugStringA( buf );
+#else
+ printf( "%s", buf );
+#endif
+
+ va_end( vargs );
+ }
+};
+
+
+static CGPUTimestampManager g_GPUTimestampManager;
+
+void GLMGPUTimestampManagerInit()
+{
+ g_GPUTimestampManager.Init();
+}
+
+void GLMGPUTimestampManagerDeinit()
+{
+ g_GPUTimestampManager.Deinit();
+}
+
+ConVar gl_telemetry_gpu( "gl_telemetry_gpu", "0" );
+static bool g_bPrevTelemetryGPU;
+
+void GLMGPUTimestampManagerTick()
+{
+ if ( g_bPrevTelemetryGPU != gl_telemetry_gpu.GetBool() )
+ {
+ if ( !gl_telemetry_gpu.GetBool() )
+ g_GPUTimestampManager.Deinit();
+ else
+ {
+#if !PIX_ENABLE || !GL_TELEMETRY_GPU_ZONES
+ ConMsg( "Must define PIX_ENABLE and GL_TELEMETRY_GPU_ZONES to use this feature" );
+#else
+ g_GPUTimestampManager.Init();
+#endif
+ }
+
+ g_bPrevTelemetryGPU = gl_telemetry_gpu.GetBool();
+ }
+
+ g_GPUTimestampManager.Tick();
+}
+
+#endif // !OSX
+
+static uint g_nPIXEventIndex;
+
+void GLMBeginPIXEvent( const char *str )
+{
+#ifndef OSX
+ char szName[1024];
+ V_snprintf( szName, sizeof( szName ), "[ID:%u FR:%u] %s", g_nPIXEventIndex, g_GPUTimestampManager.GetCurFrame(), str );
+ const char *p = tmDynamicString( TELEMETRY_LEVEL2, szName ); //p can be null if tm is getting shut down
+ tmEnter( TELEMETRY_LEVEL2, TMZF_NONE, "PIX %s", p ? p : "" );
+
+ g_nPIXEventIndex++;
+
+ g_GPUTimestampManager.BeginZone( p );
+#endif // !OSX
+ V_strncpy( sg_pPIXName, str, 128 );
+
+#if defined( OSX ) && defined( CGLPROFILER_ENABLE )
+ CGLSetOption( kCGLGOComment, (GLint)sg_pPIXName );
+#endif
+
+ if ( gGL->m_bHave_GL_GREMEDY_string_marker )
+ {
+ gGL->glStringMarkerGREMEDY( 0, sg_pPIXName );
+ }
+}
+
+void GLMEndPIXEvent( void )
+{
+#ifndef OSX
+ g_GPUTimestampManager.EndZone();
+#endif
+
+#if defined( OSX ) && defined( CGLPROFILER_ENABLE )
+ CGLSetOption( kCGLGOComment, (GLint)sg_pPIXName );
+#endif
+
+ if ( gGL->m_bHave_GL_GREMEDY_string_marker )
+ {
+ gGL->glStringMarkerGREMEDY( 0, sg_pPIXName );
+ }
+
+ sg_pPIXName[0] = '\0';
+
+ tmLeave( TELEMETRY_LEVEL2 );
+}
+
+//===============================================================================
+
+// Knob - hash table mapping string names to float values
+
+
+struct GLMKnobKey
+{
+ char *m_knobName;
+};
+
+struct GLMKnobValue
+{
+ float m_value;
+};
+
+bool LessFunc_GLMKnobKey( const GLMKnobKey &a, const GLMKnobKey &b )
+{
+ // Umm, what should this really be?
+ //return strcmp( a.m_knobName, b.m_knobName );
+ return strcmp( a.m_knobName, b.m_knobName ) < 0;
+}
+
+CUtlMap< GLMKnobKey, GLMKnobValue* > *g_knobMap = NULL;
+
+// add some special knob-names that just read mod keys
+extern "C" uint GetCurrentKeyModifiers( void );
+
+enum ECarbonModKeyIndex
+{
+ EcmdKeyBit = 8, /* command key down?*/
+ EshiftKeyBit = 9, /* shift key down?*/
+ EalphaLockBit = 10, /* alpha lock down?*/
+ EoptionKeyBit = 11, /* option key down?*/
+ EcontrolKeyBit = 12 /* control key down?*/
+};
+
+enum ECarbonModKeyMask
+{
+ EcmdKey = 1 << EcmdKeyBit,
+ EshiftKey = 1 << EshiftKeyBit,
+ EalphaLock = 1 << EalphaLockBit,
+ EoptionKey = 1 << EoptionKeyBit,
+ EcontrolKey = 1 << EcontrolKeyBit
+};
+
+float GLMKnob( char *knobname, float *setvalue )
+{
+#if GLMDEBUG
+ float result = 0.0f;
+
+ if (!g_knobMap)
+ {
+ g_knobMap = new CUtlMap< GLMKnobKey, GLMKnobValue* >;
+ g_knobMap->SetLessFunc( LessFunc_GLMKnobKey );
+ }
+
+#ifdef OSX
+ uint mods = GetCurrentKeyModifiers();
+#else
+ uint mods = 0;
+#endif
+ // is it a special key name ?
+ if (!strcmp(knobname,"caps-key"))
+ {
+ return (mods & (EalphaLock)) ? 1.0 : 0.0;
+ }
+ else if (!strcmp(knobname,"control-key"))
+ {
+ return (mods & (EcontrolKey)) ? 1.0 : 0.0;
+ }
+ else if (!strcmp(knobname,"shift-key"))
+ {
+ return (mods & (EshiftKey)) ? 1.0 : 0.0;
+ }
+ else if (!strcmp(knobname,"option-key"))
+ {
+ return (mods & (EoptionKey)) ? 1.0 : 0.0;
+ }
+ else
+ {
+ // does the key exist in the map ?
+ GLMKnobKey key;
+ key.m_knobName = knobname;
+
+ GLMKnobValue *knob = NULL;
+
+ unsigned short index = g_knobMap->Find( key );
+ if (index != g_knobMap->InvalidIndex())
+ {
+ // found it
+ knob = (*g_knobMap)[ index ];
+
+ if (setvalue)
+ {
+ knob->m_value = *setvalue;
+ }
+
+ result = knob->m_value;
+ }
+ else
+ {
+ // need to make a new one
+ knob = new GLMKnobValue;
+
+ knob->m_value = (setvalue) ? *setvalue : 0.0f;
+
+ g_knobMap->Insert( key, knob );
+ }
+
+ return knob->m_value;
+ }
+
+#else
+ // GLM knobs just return 0.0 all the time when no GLMDEBUG
+ return 0.0f;
+#endif
+}
+
+// for boolean knobs..
+float GLMKnobToggle( char *knobname )
+{
+ // if not 0.0, make it 0.0
+ // if 0.0, make it 1.0
+
+ float newValue = 0.0; // assume falling edge
+ float curValue = GLMKnob( knobname, NULL );
+ if (curValue == 0.0)
+ {
+ newValue = 1.0;
+ }
+
+ return GLMKnob( knobname, &newValue );
+}
+
+
+//===============================================================================
+
+// helpers for CGLSetOption - no op if no profiler
+void GLMProfilerClearTrace( void )
+{
+#if defined( OSX ) && defined( CGLPROFILER_ENABLE )
+ CGLSetOption( kCGLGOResetFunctionTrace, 0 );
+#else
+ Assert( !"impl me" );
+#endif
+}
+
+void GLMProfilerEnableTrace( bool enable )
+{
+#if defined( OSX ) && defined( CGLPROFILER_ENABLE )
+ CGLSetOption( kCGLGOEnableFunctionTrace, enable ? GL_TRUE : GL_FALSE );
+#else
+ Assert( !"impl me" );
+#endif
+}
+
+// helpers for CGLSetParameter - no op if no profiler
+void GLMProfilerDumpState( void )
+{
+#if defined( OSX ) && defined( CGLPROFILER_ENABLE )
+ CGLContextObj curr = CGLGetCurrentContext();
+ CGLSetParameter( curr, kCGLCPDumpState, (const GLint*)1 );
+#else
+ Assert( !"impl me" );
+#endif
+}
+
+
+//===============================================================================
+
+CGLMFileMirror::CGLMFileMirror( char *fullpath )
+{
+ m_path = strdup( fullpath );
+ m_data = (char *)malloc(1);
+ m_size = 0;
+ UpdateStatInfo();
+ if (m_exists)
+ {
+ ReadFile();
+ }
+}
+
+CGLMFileMirror::~CGLMFileMirror( )
+{
+ if (m_path)
+ {
+ free (m_path);
+ m_path = NULL;
+ }
+
+ if (m_data)
+ {
+ free (m_data);
+ m_data = NULL;
+ }
+}
+
+bool CGLMFileMirror::HasData( void )
+{
+ return (m_size != 0);
+}
+
+
+// return direct pointer to buffer. Will be invalidated if file is re-loaded or if data is written to
+void CGLMFileMirror::GetData( char **dataPtr, uint *dataSizePtr )
+{
+ *dataPtr = m_data;
+ *dataSizePtr = m_size;
+}
+
+
+void CGLMFileMirror::SetData( char *data, uint dataSize )
+{
+ if (m_data)
+ {
+ free( m_data );
+ m_data = NULL;
+ }
+
+ m_size = dataSize;
+
+ m_data = (char *)malloc( m_size +1 );
+ m_data[ m_size ] = 0; // extra NULL terminator, no charge
+
+ memcpy( m_data, data, m_size ); // copy data in
+
+ WriteFile(); // keep disk copy sync'd
+}
+
+static bool stat_diff( struct stat *a, struct stat *b )
+{
+ if (a->st_size != b->st_size)
+ {
+ return true;
+ }
+
+#ifdef OSX
+ if (memcmp( &a->st_mtimespec, &b->st_mtimespec, sizeof( struct timespec ) ) )
+#else
+ if (memcmp( &a->st_mtime, &b->st_mtime, sizeof( time_t ) ) )
+#endif
+ {
+ return true;
+ }
+
+ return false;
+}
+
+bool CGLMFileMirror::PollForChanges( void )
+{
+ // snapshot old stat
+ //bool old_exists = m_exists;
+ struct stat old_stat = m_stat;
+
+ UpdateStatInfo();
+
+ if (m_exists)
+ {
+ if ( stat_diff( &old_stat, &m_stat ) )
+ {
+ // initial difference detected. continue to poll at 0.1s intervals until it stops changing, then read it.
+ int stablecount = 0;
+ do
+ {
+ ThreadSleep(100000);
+
+ struct stat last_stat = m_stat;
+ UpdateStatInfo();
+
+ if (stat_diff( &last_stat, &m_stat ))
+ {
+ stablecount = 0;
+ }
+ else
+ {
+ stablecount++;
+ }
+ } while(stablecount<3);
+
+ // changes have settled down, now re-read it
+ ReadFile();
+ return true;
+ }
+ else
+ {
+ return false; // no change
+ }
+ }
+ else
+ {
+ // file does not exist. remake it. not considered to be a change.
+ WriteFile();
+ return false;
+ }
+}
+
+
+
+void CGLMFileMirror::UpdateStatInfo( void )
+{
+ // stat the path
+ struct stat newstat;
+ memset (&newstat, 0, sizeof(newstat) );
+ int result = stat( m_path, &newstat );
+
+ if (!result)
+ {
+ m_exists = true;
+ m_stat = newstat;
+ }
+ else
+ {
+ m_exists = false;
+ memset( &m_stat, 0, sizeof( m_stat ) );
+ }
+}
+
+
+void CGLMFileMirror::ReadFile( void )
+{
+ // unconditional - we discard any old buffer, make a new one,
+ UpdateStatInfo();
+
+ if (m_data)
+ {
+ free( m_data );
+ m_data = NULL;
+ }
+
+ if (m_exists)
+ {
+ FILE *infile = fopen( m_path, "rb" );
+ if (infile)
+ {
+ // get size from stat
+ m_size = m_stat.st_size;
+
+ m_data = (char *)malloc( m_size +1 );
+ m_data[ m_size ] = 0; // extra NULL terminator, no charge
+
+ fread( m_data, 1, m_size, infile );
+
+ fclose( infile );
+ }
+ else
+ {
+ GLMDebugger(); // ouch
+ }
+
+ }
+ else
+ {
+ // hmmmmmm
+ m_data = (char *)malloc(1);
+ m_data[0] = 0;
+ m_size = 0;
+ }
+}
+
+
+void CGLMFileMirror::WriteFile( void )
+{
+ FILE *outfile = fopen( m_path, "wb" );
+
+ if (outfile)
+ {
+ fwrite( m_data, 1, m_size, outfile );
+ fclose( outfile );
+
+ UpdateStatInfo(); // sets m_stat and m_exists
+ }
+ else
+ {
+ GLMDebugger(); // ouch
+ }
+}
+
+void CGLMFileMirror::OpenInEditor( bool foreground )
+{
+ char temp[64000];
+
+ // pass -b if no desire to bring editor to foreground
+ sprintf(temp,"/usr/bin/bbedit %s %s", foreground ? "" : "-b", m_path );
+ system( temp );
+}
+
+
+
+CGLMEditableTextItem::CGLMEditableTextItem( char *text, uint size, bool forceOverwrite, char *prefix, char *suffix )
+{
+ // clone input text (exact size copy)
+ m_origSize = size;
+ m_origText = (char *)malloc( m_origSize );
+ memcpy( m_origText, text, m_origSize );
+
+ // null out munged form til we generate it
+ m_mungedSize = 0;
+ m_mungedText = NULL;
+
+ // null out mirror until we create it
+ m_mirrorBaseName = NULL;
+ m_mirrorFullPath = NULL;
+ m_mirror = NULL;
+
+ GenHashOfOrigText(); // will fill out m_origDigest
+ GenMungedText( false );
+ GenBaseNameAndFullPath( prefix, suffix ); // figure out where the mirror will go
+
+ if (!strcmp(m_mirrorBaseName, "96c7e9d2faf76b1148f7274afd684d4b.fsh"))
+ {
+ printf("\nhello there\n");
+ }
+
+ // make the mirror from the filename.
+ // see if there was any content on disk
+ // if so, honor that content *unless* the force-option is set.
+ m_mirror = new CGLMFileMirror( m_mirrorFullPath );
+
+ // the logic is simple.
+ // the only time we will choose the copy on disk, is if
+ // a - forceOverwrite is false
+ // AND b - the copy on disk is bigger than 10 bytes.
+
+ bool replaceDiskCopy = true;
+
+ char *mirrorData = NULL;
+ uint mirrorSize = 0;
+
+ if (!forceOverwrite)
+ {
+ if (m_mirror->HasData())
+ {
+ // peek at it, and use it if it is more than some minimum number of bytes.
+ m_mirror->GetData( &mirrorData, &mirrorSize );
+ if (mirrorSize > 10)
+ {
+ replaceDiskCopy = false;
+ }
+ }
+ }
+
+ if (replaceDiskCopy)
+ {
+ // push our generated data to the mirror - disk copy is overwritten
+ m_mirror->SetData( m_mungedText, m_mungedSize );
+ }
+ else
+ {
+ GenMungedText( true );
+ }
+
+}
+
+CGLMEditableTextItem::~CGLMEditableTextItem( )
+{
+ if (m_origText)
+ {
+ free (m_origText);
+ }
+
+ if (m_mungedText)
+ {
+ free (m_mungedText);
+ }
+
+ if (m_mirrorBaseName)
+ {
+ free (m_mirrorBaseName);
+ }
+
+ if (m_mirrorFullPath)
+ {
+ free (m_mirrorFullPath);
+ }
+
+ if (m_mirror)
+ {
+ free( m_mirror );
+ }
+}
+
+bool CGLMEditableTextItem::HasData( void )
+{
+ return m_mirror->HasData();
+}
+
+bool CGLMEditableTextItem::PollForChanges( void )
+{
+ bool changed = m_mirror->PollForChanges();
+ if (changed)
+ {
+ // re-gen munged text from mirror (means "copy")
+ GenMungedText( true );
+ }
+ return changed;
+}
+
+void CGLMEditableTextItem::GetCurrentText( char **textOut, uint *sizeOut )
+{
+ if (!m_mungedText) GLMDebugger();
+
+ *textOut = m_mungedText;
+ *sizeOut = m_mungedSize;
+}
+
+void CGLMEditableTextItem::OpenInEditor( bool foreground )
+{
+ m_mirror->OpenInEditor( foreground );
+}
+
+
+void CGLMEditableTextItem::GenHashOfOrigText( void )
+{
+ MD5Context_t md5ctx;
+ MD5Init( &md5ctx );
+ MD5Update( &md5ctx, (unsigned char*)m_origText, m_origSize );
+ MD5Final( m_origDigest, &md5ctx );
+}
+
+
+void CGLMEditableTextItem::GenBaseNameAndFullPath( char *prefix, char *suffix )
+{
+ // base name is hash digest in hex, plus the suffix.
+ char temp[5000];
+
+ Q_binarytohex( m_origDigest, sizeof(m_origDigest), temp, sizeof( temp ) );
+ if (suffix)
+ {
+ strcat( temp, suffix );
+ }
+ if (m_mirrorBaseName) free(m_mirrorBaseName);
+ m_mirrorBaseName = strdup( temp );
+
+ sprintf( temp, "%s%s", prefix, m_mirrorBaseName );
+ if (m_mirrorFullPath) free(m_mirrorFullPath);
+ m_mirrorFullPath = strdup( temp );
+}
+
+
+void CGLMEditableTextItem::GenMungedText( bool fromMirror )
+{
+ if (fromMirror)
+ {
+ // just import the text as is from the mirror file.
+
+ char *mirrorData = NULL;
+ uint mirrorSize = 0;
+
+ if (m_mirror->HasData())
+ {
+ // peek at it, and use it if it is more than some minimum number of bytes.
+ m_mirror->GetData( &mirrorData, &mirrorSize );
+
+ if (m_mungedText)
+ {
+ free( m_mungedText );
+ m_mungedText = NULL;
+ }
+
+ m_mungedText = (char *)malloc( mirrorSize+1 );
+ m_mungedText[ mirrorSize ] = 0;
+ memcpy( m_mungedText, mirrorData, mirrorSize );
+
+ m_mungedSize = mirrorSize;
+ }
+ else
+ {
+ GLMDebugger();
+ }
+ }
+ else
+ {
+ #if 1
+ // we don't actually clone/munge any more.
+ if (m_mungedText)
+ {
+ free( m_mungedText );
+ m_mungedText = NULL;
+ }
+
+ m_mungedText = (char *)malloc( m_origSize+1 );
+ m_mungedText[ m_origSize ] = 0;
+ memcpy( m_mungedText, m_origText, m_origSize );
+
+ m_mungedSize = m_origSize;
+
+ #else
+ // take pure 'orig' text that came in from the engine, and clone it
+ // do not clone the first line
+ char temp[100000];
+ char *dst = temp;
+ char *lim = &temp[ sizeof(temp) ];
+
+ // zero temp
+ memset( temp, 0, sizeof(temp) );
+
+ // write orig text to temp
+ if (m_origSize >= (sizeof(temp)/2) )
+ {
+ GLMDebugger();
+ }
+
+ memcpy( dst, m_origText, m_origSize );
+ dst += m_origSize;
+
+ // add a newline if the last character wasn't
+ if ( (*(dst-1)) != '\n' )
+ {
+ *dst++ = '\n';
+ }
+
+ // walk orig text again and copy it over, with these caveats
+ // don't copy the first line
+ // insert a # before all the other lines.
+ char *src = temp;
+
+ // walk to end of first line
+ char *firstNewline = strchr( src, '\n' );
+ if (!firstNewline)
+ {
+ GLMDebugger();
+ }
+ else
+ {
+ // advance 'src' to that newline- we're not copying the !! line
+ src = firstNewline;
+ }
+
+
+ // now walk the rest - insert a # after each newline
+ while( (dst < lim) && ((src-temp) < m_origSize) )
+ {
+ switch( *src )
+ {
+ case '\n':
+ *dst++ = *src++;
+ *dst++ = '#';
+ break;
+
+ default:
+ *dst++ = *src++;
+ }
+ }
+ if (dst >= lim)
+ {
+ GLMDebugger();
+ }
+
+ // final newline
+ *dst++ = '\n';
+
+ // copyout
+ if (m_mungedText)
+ {
+ free( m_mungedText );
+ m_mungedText = NULL;
+ }
+
+ m_mungedSize = dst - temp;
+ m_mungedText = (char *)malloc( m_mungedSize );
+ memcpy( m_mungedText, temp, m_mungedSize );
+ #endif
+ }
+}
+
+//===============================================================================
+
+// class for cracking multi-part text blobs
+// sections are demarcated by beginning-of-line markers submitted in a table by the caller
+// typically
+// asm flavors have first-line rules so we use those tags as is
+// !!ARBvp (etc)
+// !!ARBfp (etc)
+// //!!GLSLF // slashes required
+// //!GLSLV
+
+// maybe also introduce "present but disabled" markers like these
+// -!!ARBvp (etc)
+// -!!ARBfp (etc)
+// -//!!GLSLF
+// -//!GLSLV
+
+// resolved. there is no default section for text that doesn't have a marker in front of it. mark it or miss it.
+
+CGLMTextSectioner::CGLMTextSectioner( char *text, int textLength, const char **markers )
+{
+ // find lines
+ // for each line, see if it starts with a marker
+ // if so, open a new section based at that line
+
+ GLMTextSection *curSection = NULL; // no current section until we see a marker
+
+ char *cursor = text;
+ char *textLimit = text+textLength;
+
+ int foundMarker;
+ const char **markerCursor;
+ while( cursor < textLimit )
+ {
+ // top of loop. cursor points to start of a line.
+ // find the end of the line and keep that handy.
+ char *eol = strchr( cursor, '\n' );
+ int charsInLine = (eol) ? (eol-cursor)+1 : strlen(cursor);
+
+ //see if any of the marker strings is located here.
+ foundMarker = -1;
+ markerCursor = markers;
+
+ while( (foundMarker<0) && (*markerCursor!=NULL) )
+ {
+ // see if the n'th marker is a hit
+ int markerLen = strlen(*markerCursor);
+
+ if (!strncmp( cursor, *markerCursor, markerLen ) )
+ {
+ // hit
+ foundMarker = markerCursor - markers;
+ }
+ markerCursor++;
+ }
+
+ // outcome is either "marker spotted" or "no".
+ // if marker seen, open new section using that marker.
+ // else, grow active section if underway.
+ // then, move cursor to next line.
+
+ if (foundMarker >= 0)
+ {
+ // found marker. start new section.
+ // no need to do anything special with prior section - it was up to date before seeing this marker.
+ int index = m_sectionTable.AddToTail();
+ curSection = &m_sectionTable[ index ];
+
+ curSection->m_markerIndex = foundMarker;
+ curSection->m_textOffset = cursor - text; // text includes the marker
+ curSection->m_textLength = charsInLine; // this line goes in the tally, later lines add to it
+ }
+ else
+ {
+ // add this line to current section if live
+ if (curSection)
+ {
+ curSection->m_textLength += charsInLine;
+ }
+ }
+ cursor += charsInLine;
+ }
+}
+
+CGLMTextSectioner::~CGLMTextSectioner( )
+{
+ // not much to do.
+}
+
+
+int CGLMTextSectioner::Count( void )
+{
+ return m_sectionTable.Count();
+}
+
+void CGLMTextSectioner::GetSection( int index, uint *offsetOut, uint *lengthOut, int *markerIndexOut )
+{
+ Assert( index < m_sectionTable.Count() );
+
+ GLMTextSection *section = &m_sectionTable[ index ];
+
+ *offsetOut = section->m_textOffset;
+ *lengthOut = section->m_textLength;
+ *markerIndexOut = section->m_markerIndex;
+}
+
+//===============================================================================
+
+// how to make a compiled-in font:
+// a. type in a matrix of characters in your fav editor
+// b. take a screen shot of the characters (128x128 pixels in this case)
+// c. export as TIFF raw.
+// d. hex dump it
+// e. column-copy just the hex data
+// f. find and replace: chop out all the spaces and line feeds, change FFFFFF and 000000 to your marker chars of choice.
+// g. wrap each line with quotes and a comma.
+
+unsigned char g_glmDebugFontMap[ 128 * 128 ] =
+{
+" * "
+" * * * * * "
+" * * * * * *** * * ** * * * * * "
+" * * * ***** * * * * * * * * * * * * * * * * "
+" * * * * * * * * * * * * * *** * * "
+" * ***** *** * * * * * * * ***** ***** * "
+" * * * * * * * * * * * * * * * "
+" * * * * * * * * * * * ** ** * "
+" * *** * * ** * * * ** ** * "
+" * * * * * "
+" * "
+" "
+" "
+" *** * *** *** * ***** *** ***** *** *** * * *** "
+"* * ** * * * * ** * * * * * * * ** ** * * * * "
+"* ** * * * * * **** **** * * * * * ** ** * ***** * * "
+"* * * * * ** * * * * * * *** * * * * * "
+"** * * * * ***** * * * * * * **** * ***** * * "
+"* * * * * * * * * * * * * * * ** ** * * "
+" *** * ***** *** * *** *** * *** *** ** ** * * * "
+" * "
+" * "
+" "
+" *** "
+"* * *** **** *** **** ***** ***** *** * * * * * * * * * * * *** "
+"* * * * * * * * * * * * * * * * * * * * * ** ** ** * * * "
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * * "
+"*** * ***** **** * * * **** **** * ** ***** * * ** * * * * ** * * "
+"* ** * * * * * * * * * * * * * * * * * * * * * * * * * "
+"* * * * * * * * * * * * * * * * * * * * * * * * * * * "
+"* * * * **** *** **** ***** * *** * * * *** * * ***** * * * * *** "
+" *** "
+" "
+" * "
+" ** * ** * "
+"**** *** **** *** ***** * * * * * * * * * * ***** * * * * * "
+"* * * * * * * * * * * * * * * * * * * * * * * * * "
+"* * * * * * * * * * * * * * * * * * * * * "
+"**** * * **** *** * * * * * * * * * * * * * * "
+"* * * * * * * * * * * * * * * * * * * * "
+"* * * * * * * * * * * ** ** * * * * * * * "
+"* *** * * *** * *** * * * * * * ***** * * * ****** "
+" * ** * ** "
+" "
+" "
+" * "
+" * * * ** * * * * * "
+" * * * * * * * "
+" **** **** *** **** *** *** **** **** * * * * * **** * ** *** "
+" * * * * * * * * * * * * * * * * * * * * * * * ** * * * "
+" * * * * * * * ***** * * * * * * * *** * * * * * * * * "
+" * ** * * * * * * * * * * * * * * * * * * * * * * * "
+" ** * **** **** **** **** * **** * * * * * * ** * * * * * *** "
+" * * "
+" *** ** "
+" * "
+" ** * ** "
+" * * * * ** * "
+" * * * * * ** *** "
+"**** **** * ** **** **** * * * * * * * * * * * ***** * * * ***** "
+"* * * * ** * * * * * * * * * * * * * * * ** * ** ***** "
+"* * * * * *** * * * * * * * * * * * * * * * ***** "
+"* * * * * * * * ** * * * * * * * * * * * * * *** "
+"**** **** * **** ** ** * * * * * * **** ***** * * * "
+"* * * ** * ** "
+"* * *** * "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+" "
+};
+
+
+
+
+
+
+
+