Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

4684 lines
148 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. // TOGL CODE LICENSE
  3. //
  4. // Copyright 2011-2014 Valve Corporation
  5. // All Rights Reserved.
  6. //
  7. // Permission is hereby granted, free of charge, to any person obtaining a copy
  8. // of this software and associated documentation files (the "Software"), to deal
  9. // in the Software without restriction, including without limitation the rights
  10. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  11. // copies of the Software, and to permit persons to whom the Software is
  12. // furnished to do so, subject to the following conditions:
  13. //
  14. // The above copyright notice and this permission notice shall be included in
  15. // all copies or substantial portions of the Software.
  16. //
  17. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  18. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  19. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  20. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  21. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  22. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  23. // THE SOFTWARE.
  24. //
  25. // glmgrbasics.cpp
  26. //
  27. //===============================================================================
  28. #include "togl/rendermechanism.h"
  29. #include "tier0/icommandline.h"
  30. #include "tier1/utlhash.h"
  31. #include "tier1/utlmap.h"
  32. #include "tier0/vprof.h"
  33. #ifdef OSX
  34. #include <OpenGL/OpenGL.h>
  35. #ifdef CGLPROFILER_ENABLE
  36. #include <OpenGL/CGLProfilerFunctionEnum.h>
  37. #endif
  38. #endif
  39. #include "tier0/valve_minmax_off.h"
  40. #include <algorithm>
  41. // memdbgon -must- be the last include file in a .cpp file.
  42. #include "tier0/memdbgon.h"
  43. //===============================================================================
  44. // decoding tables for debug
  45. typedef struct
  46. {
  47. unsigned long value;
  48. const char *name;
  49. } GLMValueEntry_t;
  50. #define TERMVALUE 0x31415926
  51. // terminator for value tables
  52. #define VE( x ) { x, #x }
  53. // "value entry"
  54. const GLMValueEntry_t g_d3d_devtypes[] =
  55. {
  56. VE( D3DDEVTYPE_HAL ),
  57. VE( D3DDEVTYPE_REF ),
  58. VE( TERMVALUE )
  59. };
  60. const GLMValueEntry_t g_d3d_formats[] =
  61. {
  62. VE( D3DFMT_INDEX16 ),
  63. VE( D3DFMT_D16 ),
  64. VE( D3DFMT_D24S8 ),
  65. VE( D3DFMT_A8R8G8B8 ),
  66. VE( D3DFMT_A4R4G4B4 ),
  67. VE( D3DFMT_X8R8G8B8 ),
  68. VE( D3DFMT_R5G6R5 ),
  69. VE( D3DFMT_X1R5G5B5 ),
  70. VE( D3DFMT_A1R5G5B5 ),
  71. VE( D3DFMT_L8 ),
  72. VE( D3DFMT_A8L8 ),
  73. VE( D3DFMT_A ),
  74. VE( D3DFMT_DXT1 ),
  75. VE( D3DFMT_DXT3 ),
  76. VE( D3DFMT_DXT5 ),
  77. VE( D3DFMT_V8U8 ),
  78. VE( D3DFMT_Q8W8V8U8 ),
  79. VE( D3DFMT_X8L8V8U8 ),
  80. VE( D3DFMT_A16B16G16R16F ),
  81. VE( D3DFMT_A16B16G16R16 ),
  82. VE( D3DFMT_R32F ),
  83. VE( D3DFMT_A32B32G32R32F ),
  84. VE( D3DFMT_R8G8B8 ),
  85. VE( D3DFMT_D24X4S4 ),
  86. VE( D3DFMT_A8 ),
  87. VE( D3DFMT_R5G6B5 ),
  88. VE( D3DFMT_D15S1 ),
  89. VE( D3DFMT_D24X8 ),
  90. VE( D3DFMT_VERTEXDATA ),
  91. VE( D3DFMT_INDEX32 ),
  92. // vendor specific formats (fourcc's)
  93. VE( D3DFMT_NV_INTZ ),
  94. VE( D3DFMT_NV_RAWZ ),
  95. VE( D3DFMT_NV_NULL ),
  96. VE( D3DFMT_ATI_D16 ),
  97. VE( D3DFMT_ATI_D24S8 ),
  98. VE( D3DFMT_ATI_2N ),
  99. VE( D3DFMT_ATI_1N ),
  100. VE( D3DFMT_UNKNOWN ),
  101. VE( TERMVALUE )
  102. };
  103. const GLMValueEntry_t g_d3d_rtypes[] =
  104. {
  105. VE( D3DRTYPE_SURFACE ),
  106. VE( D3DRTYPE_TEXTURE ),
  107. VE( D3DRTYPE_VOLUMETEXTURE ),
  108. VE( D3DRTYPE_CUBETEXTURE ),
  109. VE( D3DRTYPE_VERTEXBUFFER ),
  110. VE( D3DRTYPE_INDEXBUFFER ),
  111. VE( TERMVALUE )
  112. };
  113. const GLMValueEntry_t g_d3d_usages[] =
  114. {
  115. VE( D3DUSAGE_RENDERTARGET ),
  116. VE( D3DUSAGE_DEPTHSTENCIL ),
  117. VE( D3DUSAGE_DYNAMIC ),
  118. VE( D3DUSAGE_AUTOGENMIPMAP ),
  119. //VE( D3DUSAGE_DMAP ),
  120. //VE( D3DUSAGE_QUERY_LEGACYBUMPMAP ),
  121. VE( D3DUSAGE_QUERY_SRGBREAD ),
  122. VE( D3DUSAGE_QUERY_FILTER ),
  123. VE( D3DUSAGE_QUERY_SRGBWRITE ),
  124. VE( D3DUSAGE_QUERY_POSTPIXELSHADER_BLENDING ),
  125. VE( D3DUSAGE_QUERY_VERTEXTEXTURE ),
  126. //VE( D3DUSAGE_QUERY_WRAPANDMIP ),
  127. VE( D3DUSAGE_WRITEONLY ),
  128. VE( D3DUSAGE_SOFTWAREPROCESSING ),
  129. VE( D3DUSAGE_DONOTCLIP ),
  130. VE( D3DUSAGE_POINTS ),
  131. VE( D3DUSAGE_RTPATCHES ),
  132. VE( D3DUSAGE_NPATCHES ),
  133. VE( TERMVALUE )
  134. };
  135. const GLMValueEntry_t g_d3d_rstates[] =
  136. {
  137. VE( D3DRS_ZENABLE ),
  138. VE( D3DRS_FILLMODE ),
  139. VE( D3DRS_SHADEMODE ),
  140. VE( D3DRS_ZWRITEENABLE ),
  141. VE( D3DRS_ALPHATESTENABLE ),
  142. VE( D3DRS_LASTPIXEL ),
  143. VE( D3DRS_SRCBLEND ),
  144. VE( D3DRS_DESTBLEND ),
  145. VE( D3DRS_CULLMODE ),
  146. VE( D3DRS_ZFUNC ),
  147. VE( D3DRS_ALPHAREF ),
  148. VE( D3DRS_ALPHAFUNC ),
  149. VE( D3DRS_DITHERENABLE ),
  150. VE( D3DRS_ALPHABLENDENABLE ),
  151. VE( D3DRS_FOGENABLE ),
  152. VE( D3DRS_SPECULARENABLE ),
  153. VE( D3DRS_FOGCOLOR ),
  154. VE( D3DRS_FOGTABLEMODE ),
  155. VE( D3DRS_FOGSTART ),
  156. VE( D3DRS_FOGEND ),
  157. VE( D3DRS_FOGDENSITY ),
  158. VE( D3DRS_RANGEFOGENABLE ),
  159. VE( D3DRS_STENCILENABLE ),
  160. VE( D3DRS_STENCILFAIL ),
  161. VE( D3DRS_STENCILZFAIL ),
  162. VE( D3DRS_STENCILPASS ),
  163. VE( D3DRS_STENCILFUNC ),
  164. VE( D3DRS_STENCILREF ),
  165. VE( D3DRS_STENCILMASK ),
  166. VE( D3DRS_STENCILWRITEMASK ),
  167. VE( D3DRS_TEXTUREFACTOR ),
  168. VE( D3DRS_WRAP0 ),
  169. VE( D3DRS_WRAP1 ),
  170. VE( D3DRS_WRAP2 ),
  171. VE( D3DRS_WRAP3 ),
  172. VE( D3DRS_WRAP4 ),
  173. VE( D3DRS_WRAP5 ),
  174. VE( D3DRS_WRAP6 ),
  175. VE( D3DRS_WRAP7 ),
  176. VE( D3DRS_CLIPPING ),
  177. VE( D3DRS_LIGHTING ),
  178. VE( D3DRS_AMBIENT ),
  179. VE( D3DRS_FOGVERTEXMODE ),
  180. VE( D3DRS_COLORVERTEX ),
  181. VE( D3DRS_LOCALVIEWER ),
  182. VE( D3DRS_NORMALIZENORMALS ),
  183. VE( D3DRS_DIFFUSEMATERIALSOURCE ),
  184. VE( D3DRS_SPECULARMATERIALSOURCE ),
  185. VE( D3DRS_AMBIENTMATERIALSOURCE ),
  186. VE( D3DRS_EMISSIVEMATERIALSOURCE ),
  187. VE( D3DRS_VERTEXBLEND ),
  188. VE( D3DRS_CLIPPLANEENABLE ),
  189. VE( D3DRS_POINTSIZE ),
  190. VE( D3DRS_POINTSIZE_MIN ),
  191. VE( D3DRS_POINTSPRITEENABLE ),
  192. VE( D3DRS_POINTSCALEENABLE ),
  193. VE( D3DRS_POINTSCALE_A ),
  194. VE( D3DRS_POINTSCALE_B ),
  195. VE( D3DRS_POINTSCALE_C ),
  196. VE( D3DRS_MULTISAMPLEANTIALIAS ),
  197. VE( D3DRS_MULTISAMPLEMASK ),
  198. VE( D3DRS_PATCHEDGESTYLE ),
  199. VE( D3DRS_DEBUGMONITORTOKEN ),
  200. VE( D3DRS_POINTSIZE_MAX ),
  201. VE( D3DRS_INDEXEDVERTEXBLENDENABLE ),
  202. VE( D3DRS_COLORWRITEENABLE ),
  203. VE( D3DRS_TWEENFACTOR ),
  204. VE( D3DRS_BLENDOP ),
  205. VE( D3DRS_POSITIONDEGREE ),
  206. VE( D3DRS_NORMALDEGREE ),
  207. VE( D3DRS_SCISSORTESTENABLE ),
  208. VE( D3DRS_SLOPESCALEDEPTHBIAS ),
  209. VE( D3DRS_ANTIALIASEDLINEENABLE ),
  210. VE( D3DRS_MINTESSELLATIONLEVEL ),
  211. VE( D3DRS_MAXTESSELLATIONLEVEL ),
  212. VE( D3DRS_ADAPTIVETESS_X ),
  213. VE( D3DRS_ADAPTIVETESS_Y ),
  214. VE( D3DRS_ADAPTIVETESS_Z ),
  215. VE( D3DRS_ADAPTIVETESS_W ),
  216. VE( D3DRS_ENABLEADAPTIVETESSELLATION ),
  217. VE( D3DRS_TWOSIDEDSTENCILMODE ),
  218. VE( D3DRS_CCW_STENCILFAIL ),
  219. VE( D3DRS_CCW_STENCILZFAIL ),
  220. VE( D3DRS_CCW_STENCILPASS ),
  221. VE( D3DRS_CCW_STENCILFUNC ),
  222. VE( D3DRS_COLORWRITEENABLE1 ),
  223. VE( D3DRS_COLORWRITEENABLE2 ),
  224. VE( D3DRS_COLORWRITEENABLE3 ),
  225. VE( D3DRS_BLENDFACTOR ),
  226. VE( D3DRS_SRGBWRITEENABLE ),
  227. VE( D3DRS_DEPTHBIAS ),
  228. VE( D3DRS_WRAP8 ),
  229. VE( D3DRS_WRAP9 ),
  230. VE( D3DRS_WRAP10 ),
  231. VE( D3DRS_WRAP11 ),
  232. VE( D3DRS_WRAP12 ),
  233. VE( D3DRS_WRAP13 ),
  234. VE( D3DRS_WRAP14 ),
  235. VE( D3DRS_WRAP15 ),
  236. VE( D3DRS_SEPARATEALPHABLENDENABLE ),
  237. VE( D3DRS_SRCBLENDALPHA ),
  238. VE( D3DRS_DESTBLENDALPHA ),
  239. VE( D3DRS_BLENDOPALPHA ),
  240. VE( TERMVALUE )
  241. };
  242. const GLMValueEntry_t g_d3d_opcodes[] =
  243. {
  244. VE( D3DSIO_NOP ),
  245. VE( D3DSIO_PHASE ),
  246. VE( D3DSIO_RET ),
  247. VE( D3DSIO_ELSE ),
  248. VE( D3DSIO_ENDIF ),
  249. VE( D3DSIO_ENDLOOP ),
  250. VE( D3DSIO_ENDREP ),
  251. VE( D3DSIO_BREAK ),
  252. VE( D3DSIO_TEXDEPTH ),
  253. VE( D3DSIO_TEXKILL ),
  254. VE( D3DSIO_BEM ),
  255. VE( D3DSIO_TEXBEM ),
  256. VE( D3DSIO_TEXBEML ),
  257. VE( D3DSIO_TEXDP3 ),
  258. VE( D3DSIO_TEXDP3TEX ),
  259. VE( D3DSIO_TEXM3x2DEPTH ),
  260. VE( D3DSIO_TEXM3x2TEX ),
  261. VE( D3DSIO_TEXM3x3 ),
  262. VE( D3DSIO_TEXM3x3PAD ),
  263. VE( D3DSIO_TEXM3x3TEX ),
  264. VE( D3DSIO_TEXM3x3VSPEC ),
  265. VE( D3DSIO_TEXREG2AR ),
  266. VE( D3DSIO_TEXREG2GB ),
  267. VE( D3DSIO_TEXREG2RGB ),
  268. VE( D3DSIO_LABEL ),
  269. VE( D3DSIO_CALL ),
  270. VE( D3DSIO_IF ),
  271. VE( D3DSIO_LOOP ),
  272. VE( D3DSIO_REP ),
  273. VE( D3DSIO_BREAKP ),
  274. VE( D3DSIO_DSX ),
  275. VE( D3DSIO_DSY ),
  276. VE( D3DSIO_NRM ),
  277. VE( D3DSIO_MOVA ),
  278. VE( D3DSIO_MOV ),
  279. VE( D3DSIO_RCP ),
  280. VE( D3DSIO_RSQ ),
  281. VE( D3DSIO_EXP ),
  282. VE( D3DSIO_EXPP ),
  283. VE( D3DSIO_LOG ),
  284. VE( D3DSIO_LOGP ),
  285. VE( D3DSIO_FRC ),
  286. VE( D3DSIO_LIT ),
  287. VE( D3DSIO_ABS ),
  288. VE( D3DSIO_TEXM3x3SPEC ),
  289. VE( D3DSIO_M4x4 ),
  290. VE( D3DSIO_M4x3 ),
  291. VE( D3DSIO_M3x4 ),
  292. VE( D3DSIO_M3x3 ),
  293. VE( D3DSIO_M3x2 ),
  294. VE( D3DSIO_CALLNZ ),
  295. VE( D3DSIO_IFC ),
  296. VE( D3DSIO_BREAKC ),
  297. VE( D3DSIO_SETP ),
  298. VE( D3DSIO_TEXLDL ),
  299. VE( D3DSIO_ADD ),
  300. VE( D3DSIO_SUB ),
  301. VE( D3DSIO_MUL ),
  302. VE( D3DSIO_DP3 ),
  303. VE( D3DSIO_DP4 ),
  304. VE( D3DSIO_MIN ),
  305. VE( D3DSIO_MAX ),
  306. VE( D3DSIO_DST ),
  307. VE( D3DSIO_SLT ),
  308. VE( D3DSIO_SGE ),
  309. VE( D3DSIO_CRS ),
  310. VE( D3DSIO_POW ),
  311. VE( D3DSIO_DP2ADD ),
  312. VE( D3DSIO_LRP ),
  313. VE( D3DSIO_SGN ),
  314. VE( D3DSIO_CND ),
  315. VE( D3DSIO_CMP ),
  316. VE( D3DSIO_SINCOS ),
  317. VE( D3DSIO_MAD ),
  318. VE( D3DSIO_TEXLDD ),
  319. VE( D3DSIO_TEXCOORD ),
  320. VE( D3DSIO_TEX ),
  321. VE( D3DSIO_DCL ),
  322. VE( D3DSTT_UNKNOWN ),
  323. VE( D3DSTT_2D ),
  324. VE( D3DSTT_CUBE ),
  325. VE( D3DSTT_VOLUME ),
  326. VE( D3DSIO_DEFB ),
  327. VE( D3DSIO_DEFI ),
  328. VE( D3DSIO_DEF ),
  329. VE( D3DSIO_COMMENT ),
  330. VE( D3DSIO_END ),
  331. };
  332. const GLMValueEntry_t g_d3d_vtxdeclusages[] =
  333. {
  334. { D3DDECLUSAGE_POSITION ,"POSN" }, // P
  335. { D3DDECLUSAGE_BLENDWEIGHT ,"BLWT" }, // W
  336. { D3DDECLUSAGE_BLENDINDICES ,"BLIX" }, // I
  337. { D3DDECLUSAGE_NORMAL ,"NORM" }, // N
  338. { D3DDECLUSAGE_PSIZE ,"PSIZ" }, // S
  339. { D3DDECLUSAGE_TEXCOORD ,"TEXC" }, // T
  340. { D3DDECLUSAGE_TANGENT ,"TANG" }, // G
  341. { D3DDECLUSAGE_BINORMAL ,"BINO" }, // B
  342. { D3DDECLUSAGE_TESSFACTOR ,"TESS" }, // S
  343. { D3DDECLUSAGE_PLUGH ,"????" }, // ?
  344. { D3DDECLUSAGE_COLOR ,"COLR" }, // C
  345. { D3DDECLUSAGE_FOG ,"FOG " }, // F
  346. { D3DDECLUSAGE_DEPTH ,"DEPT" }, // D
  347. { D3DDECLUSAGE_SAMPLE ,"SAMP" } // M
  348. };
  349. const GLMValueEntry_t g_d3d_vtxdeclusages_short[] =
  350. {
  351. { D3DDECLUSAGE_POSITION ,"P" },
  352. { D3DDECLUSAGE_BLENDWEIGHT ,"W" },
  353. { D3DDECLUSAGE_BLENDINDICES ,"I" },
  354. { D3DDECLUSAGE_NORMAL ,"N" },
  355. { D3DDECLUSAGE_PSIZE ,"S" },
  356. { D3DDECLUSAGE_TEXCOORD ,"T" },
  357. { D3DDECLUSAGE_TANGENT ,"G" },
  358. { D3DDECLUSAGE_BINORMAL ,"B" },
  359. { D3DDECLUSAGE_TESSFACTOR ,"S" },
  360. { D3DDECLUSAGE_PLUGH ,"?" },
  361. { D3DDECLUSAGE_COLOR ,"C" },
  362. { D3DDECLUSAGE_FOG ,"F" },
  363. { D3DDECLUSAGE_DEPTH ,"D" },
  364. { D3DDECLUSAGE_SAMPLE ,"M" }
  365. };
  366. const GLMValueEntry_t g_cgl_rendids[] = // need to mask with 0xFFFFFF00 to match on these (ex: 8800GT == 0x00022608
  367. {
  368. #ifdef OSX
  369. VE( kCGLRendererGenericID ),
  370. VE( kCGLRendererGenericFloatID ),
  371. VE( kCGLRendererAppleSWID ),
  372. VE( kCGLRendererATIRage128ID ),
  373. VE( kCGLRendererATIRadeonID ),
  374. VE( kCGLRendererATIRageProID ),
  375. VE( kCGLRendererATIRadeon8500ID ),
  376. VE( kCGLRendererATIRadeon9700ID ),
  377. VE( kCGLRendererATIRadeonX1000ID ),
  378. VE( kCGLRendererATIRadeonX2000ID ),
  379. VE( kCGLRendererGeForce2MXID ),
  380. VE( kCGLRendererGeForce3ID ),
  381. VE( kCGLRendererGeForceFXID ), // also for GF6 and GF7
  382. VE( kCGLRendererGeForce8xxxID ),
  383. VE( kCGLRendererVTBladeXP2ID ),
  384. VE( kCGLRendererIntel900ID ),
  385. VE( kCGLRendererMesa3DFXID ),
  386. #endif
  387. VE( TERMVALUE )
  388. };
  389. const GLMValueEntry_t g_gl_errors[] =
  390. {
  391. VE( GL_INVALID_ENUM ),
  392. VE( GL_INVALID_VALUE ),
  393. VE( GL_INVALID_OPERATION ),
  394. VE( GL_STACK_OVERFLOW ),
  395. VE( GL_STACK_UNDERFLOW ),
  396. VE( GL_OUT_OF_MEMORY ),
  397. VE( GL_INVALID_FRAMEBUFFER_OPERATION_EXT ),
  398. VE( GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT ),
  399. VE( GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT ),
  400. VE( GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT ),
  401. VE( GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT ),
  402. VE( GL_FRAMEBUFFER_UNSUPPORTED_EXT ),
  403. VE( GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT ),
  404. VE( GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT )
  405. };
  406. // there are some ARB/EXT dupes in this table but that doesn't matter too much
  407. const GLMValueEntry_t g_gl_enums[] =
  408. {
  409. { 0x0000, "GL_ZERO" },
  410. { 0x0001, "GL_ONE" },
  411. { 0x0004, "GL_TRIANGLES" },
  412. { 0x0005, "GL_TRIANGLE_STRIP" },
  413. { 0x0006, "GL_TRIANGLE_FAN" },
  414. { 0x0007, "GL_QUADS" },
  415. { 0x0008, "GL_QUAD_STRIP" },
  416. { 0x0009, "GL_POLYGON" },
  417. { 0x0200, "GL_NEVER" },
  418. { 0x0201, "GL_LESS" },
  419. { 0x0202, "GL_EQUAL" },
  420. { 0x0203, "GL_LEQUAL" },
  421. { 0x0204, "GL_GREATER" },
  422. { 0x0205, "GL_NOTEQUAL" },
  423. { 0x0206, "GL_GEQUAL" },
  424. { 0x0207, "GL_ALWAYS" },
  425. { 0x0300, "GL_SRC_COLOR" },
  426. { 0x0301, "GL_ONE_MINUS_SRC_COLOR" },
  427. { 0x0302, "GL_SRC_ALPHA" },
  428. { 0x0303, "GL_ONE_MINUS_SRC_ALPHA" },
  429. { 0x0304, "GL_DST_ALPHA" },
  430. { 0x0305, "GL_ONE_MINUS_DST_ALPHA" },
  431. { 0x0306, "GL_DST_COLOR" },
  432. { 0x0307, "GL_ONE_MINUS_DST_COLOR" },
  433. { 0x0308, "GL_SRC_ALPHA_SATURATE" },
  434. { 0x0400, "GL_FRONT_LEFT" },
  435. { 0x0401, "GL_FRONT_RIGHT" },
  436. { 0x0402, "GL_BACK_LEFT" },
  437. { 0x0403, "GL_BACK_RIGHT" },
  438. { 0x0404, "GL_FRONT" },
  439. { 0x0405, "GL_BACK" },
  440. { 0x0406, "GL_LEFT" },
  441. { 0x0407, "GL_RIGHT" },
  442. { 0x0408, "GL_FRONT_AND_BACK" },
  443. { 0x0409, "GL_AUX0" },
  444. { 0x040A, "GL_AUX1" },
  445. { 0x040B, "GL_AUX2" },
  446. { 0x040C, "GL_AUX3" },
  447. { 0x0500, "GL_INVALID_ENUM" },
  448. { 0x0501, "GL_INVALID_VALUE" },
  449. { 0x0502, "GL_INVALID_OPERATION" },
  450. { 0x0503, "GL_STACK_OVERFLOW" },
  451. { 0x0504, "GL_STACK_UNDERFLOW" },
  452. { 0x0505, "GL_OUT_OF_MEMORY" },
  453. { 0x0506, "GL_INVALID_FRAMEBUFFER_OPERATION" },
  454. { 0x0600, "GL_2D" },
  455. { 0x0601, "GL_3D" },
  456. { 0x0602, "GL_3D_COLOR" },
  457. { 0x0603, "GL_3D_COLOR_TEXTURE" },
  458. { 0x0604, "GL_4D_COLOR_TEXTURE" },
  459. { 0x0700, "GL_PASS_THROUGH_TOKEN" },
  460. { 0x0701, "GL_POINT_TOKEN" },
  461. { 0x0702, "GL_LINE_TOKEN" },
  462. { 0x0703, "GL_POLYGON_TOKEN" },
  463. { 0x0704, "GL_BITMAP_TOKEN" },
  464. { 0x0705, "GL_DRAW_PIXEL_TOKEN" },
  465. { 0x0706, "GL_COPY_PIXEL_TOKEN" },
  466. { 0x0707, "GL_LINE_RESET_TOKEN" },
  467. { 0x0800, "GL_EXP" },
  468. { 0x0801, "GL_EXP2" },
  469. { 0x0900, "GL_CW" },
  470. { 0x0901, "GL_CCW" },
  471. { 0x0A00, "GL_COEFF" },
  472. { 0x0A01, "GL_ORDER" },
  473. { 0x0A02, "GL_DOMAIN" },
  474. { 0x0B00, "GL_CURRENT_COLOR" },
  475. { 0x0B01, "GL_CURRENT_INDEX" },
  476. { 0x0B02, "GL_CURRENT_NORMAL" },
  477. { 0x0B03, "GL_CURRENT_TEXTURE_COORDS" },
  478. { 0x0B04, "GL_CURRENT_RASTER_COLOR" },
  479. { 0x0B05, "GL_CURRENT_RASTER_INDEX" },
  480. { 0x0B06, "GL_CURRENT_RASTER_TEXTURE_COORDS" },
  481. { 0x0B07, "GL_CURRENT_RASTER_POSITION" },
  482. { 0x0B08, "GL_CURRENT_RASTER_POSITION_VALID" },
  483. { 0x0B09, "GL_CURRENT_RASTER_DISTANCE" },
  484. { 0x0B10, "GL_POINT_SMOOTH" },
  485. { 0x0B11, "GL_POINT_SIZE" },
  486. { 0x0B12, "GL_POINT_SIZE_RANGE" },
  487. { 0x0B12, "GL_SMOOTH_POINT_SIZE_RANGE" },
  488. { 0x0B13, "GL_POINT_SIZE_GRANULARITY" },
  489. { 0x0B13, "GL_SMOOTH_POINT_SIZE_GRANULARITY" },
  490. { 0x0B20, "GL_LINE_SMOOTH" },
  491. { 0x0B21, "GL_LINE_WIDTH" },
  492. { 0x0B22, "GL_LINE_WIDTH_RANGE" },
  493. { 0x0B22, "GL_SMOOTH_LINE_WIDTH_RANGE" },
  494. { 0x0B23, "GL_LINE_WIDTH_GRANULARITY" },
  495. { 0x0B23, "GL_SMOOTH_LINE_WIDTH_GRANULARITY" },
  496. { 0x0B24, "GL_LINE_STIPPLE" },
  497. { 0x0B25, "GL_LINE_STIPPLE_PATTERN" },
  498. { 0x0B26, "GL_LINE_STIPPLE_REPEAT" },
  499. { 0x0B30, "GL_LIST_MODE" },
  500. { 0x0B31, "GL_MAX_LIST_NESTING" },
  501. { 0x0B32, "GL_LIST_BASE" },
  502. { 0x0B33, "GL_LIST_INDEX" },
  503. { 0x0B40, "GL_POLYGON_MODE" },
  504. { 0x0B41, "GL_POLYGON_SMOOTH" },
  505. { 0x0B42, "GL_POLYGON_STIPPLE" },
  506. { 0x0B43, "GL_EDGE_FLAG" },
  507. { 0x0B44, "GL_CULL_FACE" },
  508. { 0x0B45, "GL_CULL_FACE_MODE" },
  509. { 0x0B46, "GL_FRONT_FACE" },
  510. { 0x0B50, "GL_LIGHTING" },
  511. { 0x0B51, "GL_LIGHT_MODEL_LOCAL_VIEWER" },
  512. { 0x0B52, "GL_LIGHT_MODEL_TWO_SIDE" },
  513. { 0x0B53, "GL_LIGHT_MODEL_AMBIENT" },
  514. { 0x0B54, "GL_SHADE_MODEL" },
  515. { 0x0B55, "GL_COLOR_MATERIAL_FACE" },
  516. { 0x0B56, "GL_COLOR_MATERIAL_PARAMETER" },
  517. { 0x0B57, "GL_COLOR_MATERIAL" },
  518. { 0x0B60, "GL_FOG" },
  519. { 0x0B61, "GL_FOG_INDEX" },
  520. { 0x0B62, "GL_FOG_DENSITY" },
  521. { 0x0B63, "GL_FOG_START" },
  522. { 0x0B64, "GL_FOG_END" },
  523. { 0x0B65, "GL_FOG_MODE" },
  524. { 0x0B66, "GL_FOG_COLOR" },
  525. { 0x0B70, "GL_DEPTH_RANGE" },
  526. { 0x0B71, "GL_DEPTH_TEST" },
  527. { 0x0B72, "GL_DEPTH_WRITEMASK" },
  528. { 0x0B73, "GL_DEPTH_CLEAR_VALUE" },
  529. { 0x0B74, "GL_DEPTH_FUNC" },
  530. { 0x0B80, "GL_ACCUM_CLEAR_VALUE" },
  531. { 0x0B90, "GL_STENCIL_TEST" },
  532. { 0x0B91, "GL_STENCIL_CLEAR_VALUE" },
  533. { 0x0B92, "GL_STENCIL_FUNC" },
  534. { 0x0B93, "GL_STENCIL_VALUE_MASK" },
  535. { 0x0B94, "GL_STENCIL_FAIL" },
  536. { 0x0B95, "GL_STENCIL_PASS_DEPTH_FAIL" },
  537. { 0x0B96, "GL_STENCIL_PASS_DEPTH_PASS" },
  538. { 0x0B97, "GL_STENCIL_REF" },
  539. { 0x0B98, "GL_STENCIL_WRITEMASK" },
  540. { 0x0BA0, "GL_MATRIX_MODE" },
  541. { 0x0BA1, "GL_NORMALIZE" },
  542. { 0x0BA2, "GL_VIEWPORT" },
  543. { 0x0BA3, "GL_MODELVIEW_STACK_DEPTH" },
  544. { 0x0BA4, "GL_PROJECTION_STACK_DEPTH" },
  545. { 0x0BA5, "GL_TEXTURE_STACK_DEPTH" },
  546. { 0x0BA6, "GL_MODELVIEW_MATRIX" },
  547. { 0x0BA7, "GL_PROJECTION_MATRIX" },
  548. { 0x0BA8, "GL_TEXTURE_MATRIX" },
  549. { 0x0BB0, "GL_ATTRIB_STACK_DEPTH" },
  550. { 0x0BB1, "GL_CLIENT_ATTRIB_STACK_DEPTH" },
  551. { 0x0BC0, "GL_ALPHA_TEST" },
  552. { 0x0BC1, "GL_ALPHA_TEST_FUNC" },
  553. { 0x0BC2, "GL_ALPHA_TEST_REF" },
  554. { 0x0BD0, "GL_DITHER" },
  555. { 0x0BE0, "GL_BLEND_DST" },
  556. { 0x0BE1, "GL_BLEND_SRC" },
  557. { 0x0BE2, "GL_BLEND" },
  558. { 0x0BF0, "GL_LOGIC_OP_MODE" },
  559. { 0x0BF1, "GL_INDEX_LOGIC_OP" },
  560. { 0x0BF2, "GL_COLOR_LOGIC_OP" },
  561. { 0x0C00, "GL_AUX_BUFFERS" },
  562. { 0x0C01, "GL_DRAW_BUFFER" },
  563. { 0x0C02, "GL_READ_BUFFER" },
  564. { 0x0C10, "GL_SCISSOR_BOX" },
  565. { 0x0C11, "GL_SCISSOR_TEST" },
  566. { 0x0C20, "GL_INDEX_CLEAR_VALUE" },
  567. { 0x0C21, "GL_INDEX_WRITEMASK" },
  568. { 0x0C22, "GL_COLOR_CLEAR_VALUE" },
  569. { 0x0C23, "GL_COLOR_WRITEMASK" },
  570. { 0x0C30, "GL_INDEX_MODE" },
  571. { 0x0C31, "GL_RGBA_MODE" },
  572. { 0x0C32, "GL_DOUBLEBUFFER" },
  573. { 0x0C33, "GL_STEREO" },
  574. { 0x0C40, "GL_RENDER_MODE" },
  575. { 0x0C50, "GL_PERSPECTIVE_CORRECTION_HINT" },
  576. { 0x0C51, "GL_POINT_SMOOTH_HINT" },
  577. { 0x0C52, "GL_LINE_SMOOTH_HINT" },
  578. { 0x0C53, "GL_POLYGON_SMOOTH_HINT" },
  579. { 0x0C54, "GL_FOG_HINT" },
  580. { 0x0C60, "GL_TEXTURE_GEN_S" },
  581. { 0x0C61, "GL_TEXTURE_GEN_T" },
  582. { 0x0C62, "GL_TEXTURE_GEN_R" },
  583. { 0x0C63, "GL_TEXTURE_GEN_Q" },
  584. { 0x0C70, "GL_PIXEL_MAP_I_TO_I" },
  585. { 0x0C71, "GL_PIXEL_MAP_S_TO_S" },
  586. { 0x0C72, "GL_PIXEL_MAP_I_TO_R" },
  587. { 0x0C73, "GL_PIXEL_MAP_I_TO_G" },
  588. { 0x0C74, "GL_PIXEL_MAP_I_TO_B" },
  589. { 0x0C75, "GL_PIXEL_MAP_I_TO_A" },
  590. { 0x0C76, "GL_PIXEL_MAP_R_TO_R" },
  591. { 0x0C77, "GL_PIXEL_MAP_G_TO_G" },
  592. { 0x0C78, "GL_PIXEL_MAP_B_TO_B" },
  593. { 0x0C79, "GL_PIXEL_MAP_A_TO_A" },
  594. { 0x0CB0, "GL_PIXEL_MAP_I_TO_I_SIZE" },
  595. { 0x0CB1, "GL_PIXEL_MAP_S_TO_S_SIZE" },
  596. { 0x0CB2, "GL_PIXEL_MAP_I_TO_R_SIZE" },
  597. { 0x0CB3, "GL_PIXEL_MAP_I_TO_G_SIZE" },
  598. { 0x0CB4, "GL_PIXEL_MAP_I_TO_B_SIZE" },
  599. { 0x0CB5, "GL_PIXEL_MAP_I_TO_A_SIZE" },
  600. { 0x0CB6, "GL_PIXEL_MAP_R_TO_R_SIZE" },
  601. { 0x0CB7, "GL_PIXEL_MAP_G_TO_G_SIZE" },
  602. { 0x0CB8, "GL_PIXEL_MAP_B_TO_B_SIZE" },
  603. { 0x0CB9, "GL_PIXEL_MAP_A_TO_A_SIZE" },
  604. { 0x0CF0, "GL_UNPACK_SWAP_BYTES" },
  605. { 0x0CF1, "GL_UNPACK_LSB_FIRST" },
  606. { 0x0CF2, "GL_UNPACK_ROW_LENGTH" },
  607. { 0x0CF3, "GL_UNPACK_SKIP_ROWS" },
  608. { 0x0CF4, "GL_UNPACK_SKIP_PIXELS" },
  609. { 0x0CF5, "GL_UNPACK_ALIGNMENT" },
  610. { 0x0D00, "GL_PACK_SWAP_BYTES" },
  611. { 0x0D01, "GL_PACK_LSB_FIRST" },
  612. { 0x0D02, "GL_PACK_ROW_LENGTH" },
  613. { 0x0D03, "GL_PACK_SKIP_ROWS" },
  614. { 0x0D04, "GL_PACK_SKIP_PIXELS" },
  615. { 0x0D05, "GL_PACK_ALIGNMENT" },
  616. { 0x0D10, "GL_MAP_COLOR" },
  617. { 0x0D11, "GL_MAP_STENCIL" },
  618. { 0x0D12, "GL_INDEX_SHIFT" },
  619. { 0x0D13, "GL_INDEX_OFFSET" },
  620. { 0x0D14, "GL_RED_SCALE" },
  621. { 0x0D15, "GL_RED_BIAS" },
  622. { 0x0D16, "GL_ZOOM_X" },
  623. { 0x0D17, "GL_ZOOM_Y" },
  624. { 0x0D18, "GL_GREEN_SCALE" },
  625. { 0x0D19, "GL_GREEN_BIAS" },
  626. { 0x0D1A, "GL_BLUE_SCALE" },
  627. { 0x0D1B, "GL_BLUE_BIAS" },
  628. { 0x0D1C, "GL_ALPHA_SCALE" },
  629. { 0x0D1D, "GL_ALPHA_BIAS" },
  630. { 0x0D1E, "GL_DEPTH_SCALE" },
  631. { 0x0D1F, "GL_DEPTH_BIAS" },
  632. { 0x0D30, "GL_MAX_EVAL_ORDER" },
  633. { 0x0D31, "GL_MAX_LIGHTS" },
  634. { 0x0D32, "GL_MAX_CLIP_PLANES" },
  635. { 0x0D33, "GL_MAX_TEXTURE_SIZE" },
  636. { 0x0D34, "GL_MAX_PIXEL_MAP_TABLE" },
  637. { 0x0D35, "GL_MAX_ATTRIB_STACK_DEPTH" },
  638. { 0x0D36, "GL_MAX_MODELVIEW_STACK_DEPTH" },
  639. { 0x0D37, "GL_MAX_NAME_STACK_DEPTH" },
  640. { 0x0D38, "GL_MAX_PROJECTION_STACK_DEPTH" },
  641. { 0x0D39, "GL_MAX_TEXTURE_STACK_DEPTH" },
  642. { 0x0D3A, "GL_MAX_VIEWPORT_DIMS" },
  643. { 0x0D3B, "GL_MAX_CLIENT_ATTRIB_STACK_DEPTH" },
  644. { 0x0D50, "GL_SUBPIXEL_BITS" },
  645. { 0x0D51, "GL_INDEX_BITS" },
  646. { 0x0D52, "GL_RED_BITS" },
  647. { 0x0D53, "GL_GREEN_BITS" },
  648. { 0x0D54, "GL_BLUE_BITS" },
  649. { 0x0D55, "GL_ALPHA_BITS" },
  650. { 0x0D56, "GL_DEPTH_BITS" },
  651. { 0x0D57, "GL_STENCIL_BITS" },
  652. { 0x0D58, "GL_ACCUM_RED_BITS" },
  653. { 0x0D59, "GL_ACCUM_GREEN_BITS" },
  654. { 0x0D5A, "GL_ACCUM_BLUE_BITS" },
  655. { 0x0D5B, "GL_ACCUM_ALPHA_BITS" },
  656. { 0x0D70, "GL_NAME_STACK_DEPTH" },
  657. { 0x0D80, "GL_AUTO_NORMAL" },
  658. { 0x0D90, "GL_MAP1_COLOR_4" },
  659. { 0x0D91, "GL_MAP1_INDEX" },
  660. { 0x0D92, "GL_MAP1_NORMAL" },
  661. { 0x0D93, "GL_MAP1_TEXTURE_COORD_1" },
  662. { 0x0D94, "GL_MAP1_TEXTURE_COORD_2" },
  663. { 0x0D95, "GL_MAP1_TEXTURE_COORD_3" },
  664. { 0x0D96, "GL_MAP1_TEXTURE_COORD_4" },
  665. { 0x0D97, "GL_MAP1_VERTEX_3" },
  666. { 0x0D98, "GL_MAP1_VERTEX_4" },
  667. { 0x0DB0, "GL_MAP2_COLOR_4" },
  668. { 0x0DB1, "GL_MAP2_INDEX" },
  669. { 0x0DB2, "GL_MAP2_NORMAL" },
  670. { 0x0DB3, "GL_MAP2_TEXTURE_COORD_1" },
  671. { 0x0DB4, "GL_MAP2_TEXTURE_COORD_2" },
  672. { 0x0DB5, "GL_MAP2_TEXTURE_COORD_3" },
  673. { 0x0DB6, "GL_MAP2_TEXTURE_COORD_4" },
  674. { 0x0DB7, "GL_MAP2_VERTEX_3" },
  675. { 0x0DB8, "GL_MAP2_VERTEX_4" },
  676. { 0x0DD0, "GL_MAP1_GRID_DOMAIN" },
  677. { 0x0DD1, "GL_MAP1_GRID_SEGMENTS" },
  678. { 0x0DD2, "GL_MAP2_GRID_DOMAIN" },
  679. { 0x0DD3, "GL_MAP2_GRID_SEGMENTS" },
  680. { 0x0DE0, "GL_TEXTURE_1D" },
  681. { 0x0DE1, "GL_TEXTURE_2D" },
  682. { 0x0DF0, "GL_FEEDBACK_BUFFER_POINTER" },
  683. { 0x0DF1, "GL_FEEDBACK_BUFFER_SIZE" },
  684. { 0x0DF2, "GL_FEEDBACK_BUFFER_TYPE" },
  685. { 0x0DF3, "GL_SELECTION_BUFFER_POINTER" },
  686. { 0x0DF4, "GL_SELECTION_BUFFER_SIZE" },
  687. { 0x1000, "GL_TEXTURE_WIDTH" },
  688. { 0x1001, "GL_TEXTURE_HEIGHT" },
  689. { 0x1003, "GL_TEXTURE_INTERNAL_FORMAT" },
  690. { 0x1004, "GL_TEXTURE_BORDER_COLOR" },
  691. { 0x1005, "GL_TEXTURE_BORDER" },
  692. { 0x1100, "GL_DONT_CARE" },
  693. { 0x1101, "GL_FASTEST" },
  694. { 0x1102, "GL_NICEST" },
  695. { 0x1200, "GL_AMBIENT" },
  696. { 0x1201, "GL_DIFFUSE" },
  697. { 0x1202, "GL_SPECULAR" },
  698. { 0x1203, "GL_POSITION" },
  699. { 0x1204, "GL_SPOT_DIRECTION" },
  700. { 0x1205, "GL_SPOT_EXPONENT" },
  701. { 0x1206, "GL_SPOT_CUTOFF" },
  702. { 0x1207, "GL_CONSTANT_ATTENUATION" },
  703. { 0x1208, "GL_LINEAR_ATTENUATION" },
  704. { 0x1209, "GL_QUADRATIC_ATTENUATION" },
  705. { 0x1300, "GL_COMPILE" },
  706. { 0x1301, "GL_COMPILE_AND_EXECUTE" },
  707. { 0x1400, "GL_BYTE " },
  708. { 0x1401, "GL_UBYTE" },
  709. { 0x1402, "GL_SHORT" },
  710. { 0x1403, "GL_USHRT" },
  711. { 0x1404, "GL_INT " },
  712. { 0x1405, "GL_UINT " },
  713. { 0x1406, "GL_FLOAT" },
  714. { 0x1407, "GL_2_BYTES" },
  715. { 0x1408, "GL_3_BYTES" },
  716. { 0x1409, "GL_4_BYTES" },
  717. { 0x140A, "GL_DOUBLE" },
  718. { 0x140B, "GL_HALF_FLOAT" },
  719. { 0x1500, "GL_CLEAR" },
  720. { 0x1501, "GL_AND" },
  721. { 0x1502, "GL_AND_REVERSE" },
  722. { 0x1503, "GL_COPY" },
  723. { 0x1504, "GL_AND_INVERTED" },
  724. { 0x1505, "GL_NOOP" },
  725. { 0x1506, "GL_XOR" },
  726. { 0x1507, "GL_OR" },
  727. { 0x1508, "GL_NOR" },
  728. { 0x1509, "GL_EQUIV" },
  729. { 0x150A, "GL_INVERT" },
  730. { 0x150B, "GL_OR_REVERSE" },
  731. { 0x150C, "GL_COPY_INVERTED" },
  732. { 0x150D, "GL_OR_INVERTED" },
  733. { 0x150E, "GL_NAND" },
  734. { 0x150F, "GL_SET" },
  735. { 0x1600, "GL_EMISSION" },
  736. { 0x1601, "GL_SHININESS" },
  737. { 0x1602, "GL_AMBIENT_AND_DIFFUSE" },
  738. { 0x1603, "GL_COLOR_INDEXES" },
  739. { 0x1700, "GL_MODELVIEW" },
  740. { 0x1700, "GL_MODELVIEW0_ARB" },
  741. { 0x1701, "GL_PROJECTION" },
  742. { 0x1702, "GL_TEXTURE" },
  743. { 0x1800, "GL_COLOR" },
  744. { 0x1801, "GL_DEPTH" },
  745. { 0x1802, "GL_STENCIL" },
  746. { 0x1900, "GL_COLOR_INDEX" },
  747. { 0x1901, "GL_STENCIL_INDEX" },
  748. { 0x1902, "GL_DEPTH_COMPONENT" },
  749. { 0x1903, "GL_RED" },
  750. { 0x1904, "GL_GREEN" },
  751. { 0x1905, "GL_BLUE" },
  752. { 0x1906, "GL_ALPHA" },
  753. { 0x1907, "GL_RGB" },
  754. { 0x1908, "GL_RGBA" },
  755. { 0x1909, "GL_LUMINANCE" },
  756. { 0x190A, "GL_LUMINANCE_ALPHA" },
  757. { 0x1A00, "GL_BITMAP" },
  758. { 0x1B00, "GL_POINT" },
  759. { 0x1B01, "GL_LINE" },
  760. { 0x1B02, "GL_FILL" },
  761. { 0x1C00, "GL_RENDER" },
  762. { 0x1C01, "GL_FEEDBACK" },
  763. { 0x1C02, "GL_SELECT" },
  764. { 0x1D00, "GL_FLAT" },
  765. { 0x1D01, "GL_SMOOTH" },
  766. { 0x1E00, "GL_KEEP" },
  767. { 0x1E01, "GL_REPLACE" },
  768. { 0x1E02, "GL_INCR" },
  769. { 0x1E03, "GL_DECR" },
  770. { 0x1F00, "GL_VENDOR" },
  771. { 0x1F01, "GL_RENDERER" },
  772. { 0x1F02, "GL_VERSION" },
  773. { 0x1F03, "GL_EXTENSIONS" },
  774. { 0x2000, "GL_S" },
  775. { 0x2001, "GL_T" },
  776. { 0x2002, "GL_R" },
  777. { 0x2003, "GL_Q" },
  778. { 0x2100, "GL_MODULATE" },
  779. { 0x2101, "GL_DECAL" },
  780. { 0x2200, "GL_TEXTURE_ENV_MODE" },
  781. { 0x2201, "GL_TEXTURE_ENV_COLOR" },
  782. { 0x2300, "GL_TEXTURE_ENV" },
  783. { 0x2400, "GL_EYE_LINEAR" },
  784. { 0x2401, "GL_OBJECT_LINEAR" },
  785. { 0x2402, "GL_SPHERE_MAP" },
  786. { 0x2500, "GL_TEXTURE_GEN_MODE" },
  787. { 0x2501, "GL_OBJECT_PLANE" },
  788. { 0x2502, "GL_EYE_PLANE" },
  789. { 0x2600, "GL_NEAREST" },
  790. { 0x2601, "GL_LINEAR" },
  791. { 0x2700, "GL_NEAREST_MIPMAP_NEAREST" },
  792. { 0x2701, "GL_LINEAR_MIPMAP_NEAREST" },
  793. { 0x2702, "GL_NEAREST_MIPMAP_LINEAR" },
  794. { 0x2703, "GL_LINEAR_MIPMAP_LINEAR" },
  795. { 0x2800, "GL_TEXTURE_MAG_FILTER" },
  796. { 0x2801, "GL_TEXTURE_MIN_FILTER" },
  797. { 0x2802, "GL_TEXTURE_WRAP_S" },
  798. { 0x2803, "GL_TEXTURE_WRAP_T" },
  799. { 0x2900, "GL_CLAMP" },
  800. { 0x2901, "GL_REPEAT" },
  801. { 0x2A00, "GL_POLYGON_OFFSET_UNITS" },
  802. { 0x2A01, "GL_POLYGON_OFFSET_POINT" },
  803. { 0x2A02, "GL_POLYGON_OFFSET_LINE" },
  804. { 0x2A10, "GL_R3_G3_B2" },
  805. { 0x2A20, "GL_V2F" },
  806. { 0x2A21, "GL_V3F" },
  807. { 0x2A22, "GL_C4UB_V2F" },
  808. { 0x2A23, "GL_C4UB_V3F" },
  809. { 0x2A24, "GL_C3F_V3F" },
  810. { 0x2A25, "GL_N3F_V3F" },
  811. { 0x2A26, "GL_C4F_N3F_V3F" },
  812. { 0x2A27, "GL_T2F_V3F" },
  813. { 0x2A28, "GL_T4F_V4F" },
  814. { 0x2A29, "GL_T2F_C4UB_V3F" },
  815. { 0x2A2A, "GL_T2F_C3F_V3F" },
  816. { 0x2A2B, "GL_T2F_N3F_V3F" },
  817. { 0x2A2C, "GL_T2F_C4F_N3F_V3F" },
  818. { 0x2A2D, "GL_T4F_C4F_N3F_V4F" },
  819. { 0x3000, "GL_CLIP_PLANE0" },
  820. { 0x3001, "GL_CLIP_PLANE1" },
  821. { 0x3002, "GL_CLIP_PLANE2" },
  822. { 0x3003, "GL_CLIP_PLANE3" },
  823. { 0x3004, "GL_CLIP_PLANE4" },
  824. { 0x3005, "GL_CLIP_PLANE5" },
  825. { 0x4000, "GL_LIGHT0" },
  826. { 0x4001, "GL_LIGHT1" },
  827. { 0x4002, "GL_LIGHT2" },
  828. { 0x4003, "GL_LIGHT3" },
  829. { 0x4004, "GL_LIGHT4" },
  830. { 0x4005, "GL_LIGHT5" },
  831. { 0x4006, "GL_LIGHT6" },
  832. { 0x4007, "GL_LIGHT7" },
  833. { 0x8000, "GL_ABGR_EXT" },
  834. { 0x8001, "GL_CONSTANT_COLOR" },
  835. { 0x8002, "GL_ONE_MINUS_CONSTANT_COLOR" },
  836. { 0x8003, "GL_CONSTANT_ALPHA" },
  837. { 0x8004, "GL_ONE_MINUS_CONSTANT_ALPHA" },
  838. { 0x8005, "GL_BLEND_COLOR" },
  839. { 0x8006, "GL_FUNC_ADD" },
  840. { 0x8007, "GL_MIN" },
  841. { 0x8008, "GL_MAX" },
  842. { 0x8009, "GL_BLEND_EQUATION_RGB" },
  843. { 0x8009, "GL_BLEND_EQUATION" },
  844. { 0x800A, "GL_FUNC_SUBTRACT" },
  845. { 0x800B, "GL_FUNC_REVERSE_SUBTRACT" },
  846. { 0x8010, "GL_CONVOLUTION_1D" },
  847. { 0x8011, "GL_CONVOLUTION_2D" },
  848. { 0x8012, "GL_SEPARABLE_2D" },
  849. { 0x8013, "GL_CONVOLUTION_BORDER_MODE" },
  850. { 0x8014, "GL_CONVOLUTION_FILTER_SCALE" },
  851. { 0x8015, "GL_CONVOLUTION_FILTER_BIAS" },
  852. { 0x8016, "GL_REDUCE" },
  853. { 0x8017, "GL_CONVOLUTION_FORMAT" },
  854. { 0x8018, "GL_CONVOLUTION_WIDTH" },
  855. { 0x8019, "GL_CONVOLUTION_HEIGHT" },
  856. { 0x801A, "GL_MAX_CONVOLUTION_WIDTH" },
  857. { 0x801B, "GL_MAX_CONVOLUTION_HEIGHT" },
  858. { 0x801C, "GL_POST_CONVOLUTION_RED_SCALE" },
  859. { 0x801D, "GL_POST_CONVOLUTION_GREEN_SCALE" },
  860. { 0x801E, "GL_POST_CONVOLUTION_BLUE_SCALE" },
  861. { 0x801F, "GL_POST_CONVOLUTION_ALPHA_SCALE" },
  862. { 0x8020, "GL_POST_CONVOLUTION_RED_BIAS" },
  863. { 0x8021, "GL_POST_CONVOLUTION_GREEN_BIAS" },
  864. { 0x8022, "GL_POST_CONVOLUTION_BLUE_BIAS" },
  865. { 0x8023, "GL_POST_CONVOLUTION_ALPHA_BIAS" },
  866. { 0x8024, "GL_HISTOGRAM" },
  867. { 0x8025, "GL_PROXY_HISTOGRAM" },
  868. { 0x8026, "GL_HISTOGRAM_WIDTH" },
  869. { 0x8027, "GL_HISTOGRAM_FORMAT" },
  870. { 0x8028, "GL_HISTOGRAM_RED_SIZE" },
  871. { 0x8029, "GL_HISTOGRAM_GREEN_SIZE" },
  872. { 0x802A, "GL_HISTOGRAM_BLUE_SIZE" },
  873. { 0x802B, "GL_HISTOGRAM_ALPHA_SIZE" },
  874. { 0x802C, "GL_HISTOGRAM_LUMINANCE_SIZE" },
  875. { 0x802D, "GL_HISTOGRAM_SINK" },
  876. { 0x802E, "GL_MINMAX" },
  877. { 0x802F, "GL_MINMAX_FORMAT" },
  878. { 0x8030, "GL_MINMAX_SINK" },
  879. { 0x8031, "GL_TABLE_TOO_LARGE" },
  880. { 0x8032, "GL_UNSIGNED_BYTE_3_3_2" },
  881. { 0x8033, "GL_UNSIGNED_SHORT_4_4_4_4" },
  882. { 0x8034, "GL_UNSIGNED_SHORT_5_5_5_1" },
  883. { 0x8035, "GL_UNSIGNED_INT_8_8_8_8" },
  884. { 0x8036, "GL_UNSIGNED_INT_10_10_10_2" },
  885. { 0x8037, "GL_POLYGON_OFFSET_FILL" },
  886. { 0x8038, "GL_POLYGON_OFFSET_FACTOR" },
  887. { 0x803A, "GL_RESCALE_NORMAL" },
  888. { 0x803B, "GL_ALPHA4" },
  889. { 0x803C, "GL_ALPHA8" },
  890. { 0x803D, "GL_ALPHA12" },
  891. { 0x803E, "GL_ALPHA16" },
  892. { 0x803F, "GL_LUMINANCE4" },
  893. { 0x8040, "GL_LUMINANCE8" },
  894. { 0x8041, "GL_LUMINANCE12" },
  895. { 0x8042, "GL_LUMINANCE16" },
  896. { 0x8043, "GL_LUMINANCE4_ALPHA4" },
  897. { 0x8044, "GL_LUMINANCE6_ALPHA2" },
  898. { 0x8045, "GL_LUMINANCE8_ALPHA8" },
  899. { 0x8046, "GL_LUMINANCE12_ALPHA4" },
  900. { 0x8047, "GL_LUMINANCE12_ALPHA12" },
  901. { 0x8048, "GL_LUMINANCE16_ALPHA16" },
  902. { 0x8049, "GL_INTENSITY" },
  903. { 0x804A, "GL_INTENSITY4" },
  904. { 0x804B, "GL_INTENSITY8" },
  905. { 0x804C, "GL_INTENSITY12" },
  906. { 0x804D, "GL_INTENSITY16" },
  907. { 0x804F, "GL_RGB4" },
  908. { 0x8050, "GL_RGB5" },
  909. { 0x8051, "GL_RGB8" },
  910. { 0x8052, "GL_RGB10" },
  911. { 0x8053, "GL_RGB12" },
  912. { 0x8054, "GL_RGB16" },
  913. { 0x8055, "GL_RGBA2" },
  914. { 0x8056, "GL_RGBA4" },
  915. { 0x8057, "GL_RGB5_A1" },
  916. { 0x8058, "GL_RGBA8" },
  917. { 0x8059, "GL_RGB10_A2" },
  918. { 0x805A, "GL_RGBA12" },
  919. { 0x805B, "GL_RGBA16" },
  920. { 0x805C, "GL_TEXTURE_RED_SIZE" },
  921. { 0x805D, "GL_TEXTURE_GREEN_SIZE" },
  922. { 0x805E, "GL_TEXTURE_BLUE_SIZE" },
  923. { 0x805F, "GL_TEXTURE_ALPHA_SIZE" },
  924. { 0x8060, "GL_TEXTURE_LUMINANCE_SIZE" },
  925. { 0x8061, "GL_TEXTURE_INTENSITY_SIZE" },
  926. { 0x8063, "GL_PROXY_TEXTURE_1D" },
  927. { 0x8064, "GL_PROXY_TEXTURE_2D" },
  928. { 0x8066, "GL_TEXTURE_PRIORITY" },
  929. { 0x8067, "GL_TEXTURE_RESIDENT" },
  930. { 0x8068, "GL_TEXTURE_BINDING_1D" },
  931. { 0x8069, "GL_TEXTURE_BINDING_2D" },
  932. { 0x806A, "GL_TEXTURE_BINDING_3D" },
  933. { 0x806B, "GL_PACK_SKIP_IMAGES" },
  934. { 0x806C, "GL_PACK_IMAGE_HEIGHT" },
  935. { 0x806D, "GL_UNPACK_SKIP_IMAGES" },
  936. { 0x806E, "GL_UNPACK_IMAGE_HEIGHT" },
  937. { 0x806F, "GL_TEXTURE_3D" },
  938. { 0x8070, "GL_PROXY_TEXTURE_3D" },
  939. { 0x8071, "GL_TEXTURE_DEPTH" },
  940. { 0x8072, "GL_TEXTURE_WRAP_R" },
  941. { 0x8073, "GL_MAX_3D_TEXTURE_SIZE" },
  942. { 0x8074, "GL_VERTEX_ARRAY" },
  943. { 0x8075, "GL_NORMAL_ARRAY" },
  944. { 0x8076, "GL_COLOR_ARRAY" },
  945. { 0x8077, "GL_INDEX_ARRAY" },
  946. { 0x8078, "GL_TEXTURE_COORD_ARRAY" },
  947. { 0x8079, "GL_EDGE_FLAG_ARRAY" },
  948. { 0x807A, "GL_VERTEX_ARRAY_SIZE" },
  949. { 0x807B, "GL_VERTEX_ARRAY_TYPE" },
  950. { 0x807C, "GL_VERTEX_ARRAY_STRIDE" },
  951. { 0x807E, "GL_NORMAL_ARRAY_TYPE" },
  952. { 0x807F, "GL_NORMAL_ARRAY_STRIDE" },
  953. { 0x8081, "GL_COLOR_ARRAY_SIZE" },
  954. { 0x8082, "GL_COLOR_ARRAY_TYPE" },
  955. { 0x8083, "GL_COLOR_ARRAY_STRIDE" },
  956. { 0x8085, "GL_INDEX_ARRAY_TYPE" },
  957. { 0x8086, "GL_INDEX_ARRAY_STRIDE" },
  958. { 0x8088, "GL_TEXTURE_COORD_ARRAY_SIZE" },
  959. { 0x8089, "GL_TEXTURE_COORD_ARRAY_TYPE" },
  960. { 0x808A, "GL_TEXTURE_COORD_ARRAY_STRIDE" },
  961. { 0x808C, "GL_EDGE_FLAG_ARRAY_STRIDE" },
  962. { 0x808E, "GL_VERTEX_ARRAY_POINTER" },
  963. { 0x808F, "GL_NORMAL_ARRAY_POINTER" },
  964. { 0x8090, "GL_COLOR_ARRAY_POINTER" },
  965. { 0x8091, "GL_INDEX_ARRAY_POINTER" },
  966. { 0x8092, "GL_TEXTURE_COORD_ARRAY_POINTER" },
  967. { 0x8093, "GL_EDGE_FLAG_ARRAY_POINTER" },
  968. { 0x809D, "GL_MULTISAMPLE_ARB" },
  969. { 0x809D, "GL_MULTISAMPLE" },
  970. { 0x809E, "GL_SAMPLE_ALPHA_TO_COVERAGE_ARB" },
  971. { 0x809E, "GL_SAMPLE_ALPHA_TO_COVERAGE" },
  972. { 0x809F, "GL_SAMPLE_ALPHA_TO_ONE_ARB" },
  973. { 0x809F, "GL_SAMPLE_ALPHA_TO_ONE" },
  974. { 0x80A0, "GL_SAMPLE_COVERAGE_ARB" },
  975. { 0x80A0, "GL_SAMPLE_COVERAGE" },
  976. { 0x80A0, "GL_SAMPLE_MASK_EXT" },
  977. { 0x80A1, "GL_1PASS_EXT" },
  978. { 0x80A2, "GL_2PASS_0_EXT" },
  979. { 0x80A3, "GL_2PASS_1_EXT" },
  980. { 0x80A4, "GL_4PASS_0_EXT" },
  981. { 0x80A5, "GL_4PASS_1_EXT" },
  982. { 0x80A6, "GL_4PASS_2_EXT" },
  983. { 0x80A7, "GL_4PASS_3_EXT" },
  984. { 0x80A8, "GL_SAMPLE_BUFFERS" },
  985. { 0x80A9, "GL_SAMPLES" },
  986. { 0x80AA, "GL_SAMPLE_COVERAGE_VALUE" },
  987. { 0x80AB, "GL_SAMPLE_COVERAGE_INVERT" },
  988. { 0x80AC, "GL_SAMPLE_PATTERN_EXT" },
  989. { 0x80B1, "GL_COLOR_MATRIX" },
  990. { 0x80B2, "GL_COLOR_MATRIX_STACK_DEPTH" },
  991. { 0x80B3, "GL_MAX_COLOR_MATRIX_STACK_DEPTH" },
  992. { 0x80B4, "GL_POST_COLOR_MATRIX_RED_SCALE" },
  993. { 0x80B5, "GL_POST_COLOR_MATRIX_GREEN_SCALE" },
  994. { 0x80B6, "GL_POST_COLOR_MATRIX_BLUE_SCALE" },
  995. { 0x80B7, "GL_POST_COLOR_MATRIX_ALPHA_SCALE" },
  996. { 0x80B8, "GL_POST_COLOR_MATRIX_RED_BIAS" },
  997. { 0x80B9, "GL_POST_COLOR_MATRIX_GREEN_BIAS" },
  998. { 0x80BA, "GL_POST_COLOR_MATRIX_BLUE_BIAS" },
  999. { 0x80BB, "GL_POST_COLOR_MATRIX_ALPHA_BIAS" },
  1000. { 0x80BF, "GL_TEXTURE_COMPARE_FAIL_VALUE_ARB" },
  1001. { 0x80C8, "GL_BLEND_DST_RGB" },
  1002. { 0x80C9, "GL_BLEND_SRC_RGB" },
  1003. { 0x80CA, "GL_BLEND_DST_ALPHA" },
  1004. { 0x80CB, "GL_BLEND_SRC_ALPHA" },
  1005. { 0x80CC, "GL_422_EXT" },
  1006. { 0x80CD, "GL_422_REV_EXT" },
  1007. { 0x80CE, "GL_422_AVERAGE_EXT" },
  1008. { 0x80CF, "GL_422_REV_AVERAGE_EXT" },
  1009. { 0x80D0, "GL_COLOR_TABLE" },
  1010. { 0x80D1, "GL_POST_CONVOLUTION_COLOR_TABLE" },
  1011. { 0x80D2, "GL_POST_COLOR_MATRIX_COLOR_TABLE" },
  1012. { 0x80D3, "GL_PROXY_COLOR_TABLE" },
  1013. { 0x80D4, "GL_PROXY_POST_CONVOLUTION_COLOR_TABLE" },
  1014. { 0x80D5, "GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE" },
  1015. { 0x80D6, "GL_COLOR_TABLE_SCALE" },
  1016. { 0x80D7, "GL_COLOR_TABLE_BIAS" },
  1017. { 0x80D8, "GL_COLOR_TABLE_FORMAT" },
  1018. { 0x80D9, "GL_COLOR_TABLE_WIDTH" },
  1019. { 0x80DA, "GL_COLOR_TABLE_RED_SIZE" },
  1020. { 0x80DB, "GL_COLOR_TABLE_GREEN_SIZE" },
  1021. { 0x80DC, "GL_COLOR_TABLE_BLUE_SIZE" },
  1022. { 0x80DD, "GL_COLOR_TABLE_ALPHA_SIZE" },
  1023. { 0x80DE, "GL_COLOR_TABLE_LUMINANCE_SIZE" },
  1024. { 0x80DF, "GL_COLOR_TABLE_INTENSITY_SIZE" },
  1025. { 0x80E0, "GL_BGR_EXT" },
  1026. { 0x80E0, "GL_BGR" },
  1027. { 0x80E1, "GL_BGRA_EXT" },
  1028. { 0x80E1, "GL_BGRA" },
  1029. { 0x80E1, "GL_BGRA" },
  1030. { 0x80E2, "GL_COLOR_INDEX1_EXT" },
  1031. { 0x80E3, "GL_COLOR_INDEX2_EXT" },
  1032. { 0x80E4, "GL_COLOR_INDEX4_EXT" },
  1033. { 0x80E5, "GL_COLOR_INDEX8_EXT" },
  1034. { 0x80E6, "GL_COLOR_INDEX12_EXT" },
  1035. { 0x80E7, "GL_COLOR_INDEX16_EXT" },
  1036. { 0x80E8, "GL_MAX_ELEMENTS_VERTICES_EXT" },
  1037. { 0x80E8, "GL_MAX_ELEMENTS_VERTICES" },
  1038. { 0x80E9, "GL_MAX_ELEMENTS_INDICES_EXT" },
  1039. { 0x80E9, "GL_MAX_ELEMENTS_INDICES" },
  1040. { 0x80ED, "GL_TEXTURE_INDEX_SIZE_EXT" },
  1041. { 0x80F0, "GL_CLIP_VOLUME_CLIPPING_HINT_EXT" },
  1042. { 0x8126, "GL_POINT_SIZE_MIN_ARB" },
  1043. { 0x8126, "GL_POINT_SIZE_MIN" },
  1044. { 0x8127, "GL_POINT_SIZE_MAX_ARB" },
  1045. { 0x8127, "GL_POINT_SIZE_MAX" },
  1046. { 0x8128, "GL_POINT_FADE_THRESHOLD_SIZE_ARB" },
  1047. { 0x8128, "GL_POINT_FADE_THRESHOLD_SIZE" },
  1048. { 0x8129, "GL_POINT_DISTANCE_ATTENUATION_ARB" },
  1049. { 0x8129, "GL_POINT_DISTANCE_ATTENUATION" },
  1050. { 0x812D, "GL_CLAMP_TO_BORDER_ARB" },
  1051. { 0x812D, "GL_CLAMP_TO_BORDER" },
  1052. { 0x812F, "GL_CLAMP_TO_EDGE" },
  1053. { 0x813A, "GL_TEXTURE_MIN_LOD" },
  1054. { 0x813B, "GL_TEXTURE_MAX_LOD" },
  1055. { 0x813C, "GL_TEXTURE_BASE_LEVEL" },
  1056. { 0x813D, "GL_TEXTURE_MAX_LEVEL" },
  1057. { 0x8151, "GL_CONSTANT_BORDER" },
  1058. { 0x8153, "GL_REPLICATE_BORDER" },
  1059. { 0x8154, "GL_CONVOLUTION_BORDER_COLOR" },
  1060. { 0x8191, "GL_GENERATE_MIPMAP" },
  1061. { 0x8192, "GL_GENERATE_MIPMAP_HINT" },
  1062. { 0x81A5, "GL_DEPTH_COMPONENT16_ARB" },
  1063. { 0x81A5, "GL_DEPTH_COMPONENT16" },
  1064. { 0x81A6, "GL_DEPTH_COMPONENT24_ARB" },
  1065. { 0x81A6, "GL_DEPTH_COMPONENT24" },
  1066. { 0x81A7, "GL_DEPTH_COMPONENT32_ARB" },
  1067. { 0x81A7, "GL_DEPTH_COMPONENT32" },
  1068. { 0x81A8, "GL_ARRAY_ELEMENT_LOCK_FIRST_EXT" },
  1069. { 0x81A9, "GL_ARRAY_ELEMENT_LOCK_COUNT_EXT" },
  1070. { 0x81AA, "GL_CULL_VERTEX_EXT" },
  1071. { 0x81AB, "GL_CULL_VERTEX_EYE_POSITION_EXT" },
  1072. { 0x81AC, "GL_CULL_VERTEX_OBJECT_POSITION_EXT" },
  1073. { 0x81AD, "GL_IUI_V2F_EXT" },
  1074. { 0x81AE, "GL_IUI_V3F_EXT" },
  1075. { 0x81AF, "GL_IUI_N3F_V2F_EXT" },
  1076. { 0x81B0, "GL_IUI_N3F_V3F_EXT" },
  1077. { 0x81B1, "GL_T2F_IUI_V2F_EXT" },
  1078. { 0x81B2, "GL_T2F_IUI_V3F_EXT" },
  1079. { 0x81B3, "GL_T2F_IUI_N3F_V2F_EXT" },
  1080. { 0x81B4, "GL_T2F_IUI_N3F_V3F_EXT" },
  1081. { 0x81B5, "GL_INDEX_TEST_EXT" },
  1082. { 0x81B6, "GL_INDEX_TEST_FUNC_EXT" },
  1083. { 0x81B7, "GL_INDEX_TEST_REF_EXT" },
  1084. { 0x81B8, "GL_INDEX_MATERIAL_EXT" },
  1085. { 0x81B9, "GL_INDEX_MATERIAL_PARAMETER_EXT" },
  1086. { 0x81BA, "GL_INDEX_MATERIAL_FACE_EXT" },
  1087. { 0x81F8, "GL_LIGHT_MODEL_COLOR_CONTROL_EXT" },
  1088. { 0x81F8, "GL_LIGHT_MODEL_COLOR_CONTROL" },
  1089. { 0x81F9, "GL_SINGLE_COLOR_EXT" },
  1090. { 0x81F9, "GL_SINGLE_COLOR" },
  1091. { 0x81FA, "GL_SEPARATE_SPECULAR_COLOR_EXT" },
  1092. { 0x81FA, "GL_SEPARATE_SPECULAR_COLOR" },
  1093. { 0x81FB, "GL_SHARED_TEXTURE_PALETTE_EXT" },
  1094. { 0x8210, "GL_FRAMEBUFFER_ATTACHMENT_COLOR_ENCODING" },
  1095. { 0x8211, "GL_FRAMEBUFFER_ATTACHMENT_COMPONENT_TYPE" },
  1096. { 0x8212, "GL_FRAMEBUFFER_ATTACHMENT_RED_SIZE" },
  1097. { 0x8213, "GL_FRAMEBUFFER_ATTACHMENT_GREEN_SIZE" },
  1098. { 0x8214, "GL_FRAMEBUFFER_ATTACHMENT_BLUE_SIZE" },
  1099. { 0x8215, "GL_FRAMEBUFFER_ATTACHMENT_ALPHA_SIZE" },
  1100. { 0x8216, "GL_FRAMEBUFFER_ATTACHMENT_DEPTH_SIZE" },
  1101. { 0x8217, "GL_FRAMEBUFFER_ATTACHMENT_STENCIL_SIZE" },
  1102. { 0x8218, "GL_FRAMEBUFFER_DEFAULT" },
  1103. { 0x8219, "GL_FRAMEBUFFER_UNDEFINED" },
  1104. { 0x821A, "GL_DEPTH_STENCIL_ATTACHMENT" },
  1105. { 0x8225, "GL_COMPRESSED_RED" },
  1106. { 0x8226, "GL_COMPRESSED_RG" },
  1107. { 0x8227, "GL_RG" },
  1108. { 0x8228, "GL_RG_INTEGER" },
  1109. { 0x8229, "GL_R8" },
  1110. { 0x822A, "GL_R16" },
  1111. { 0x822B, "GL_RG8" },
  1112. { 0x822C, "GL_RG16" },
  1113. { 0x822D, "GL_R16F" },
  1114. { 0x822E, "GL_R32F" },
  1115. { 0x822F, "GL_RG16F" },
  1116. { 0x8230, "GL_RG32F" },
  1117. { 0x8231, "GL_R8I" },
  1118. { 0x8232, "GL_R8UI" },
  1119. { 0x8233, "GL_R16I" },
  1120. { 0x8234, "GL_R16UI" },
  1121. { 0x8235, "GL_R32I" },
  1122. { 0x8236, "GL_R32UI" },
  1123. { 0x8237, "GL_RG8I" },
  1124. { 0x8238, "GL_RG8UI" },
  1125. { 0x8239, "GL_RG16I" },
  1126. { 0x823A, "GL_RG16UI" },
  1127. { 0x823B, "GL_RG32I" },
  1128. { 0x823C, "GL_RG32UI" },
  1129. { 0x8330, "GL_PIXEL_TRANSFORM_2D_EXT" },
  1130. { 0x8331, "GL_PIXEL_MAG_FILTER_EXT" },
  1131. { 0x8332, "GL_PIXEL_MIN_FILTER_EXT" },
  1132. { 0x8333, "GL_PIXEL_CUBIC_WEIGHT_EXT" },
  1133. { 0x8334, "GL_CUBIC_EXT" },
  1134. { 0x8335, "GL_AVERAGE_EXT" },
  1135. { 0x8336, "GL_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT" },
  1136. { 0x8337, "GL_MAX_PIXEL_TRANSFORM_2D_STACK_DEPTH_EXT" },
  1137. { 0x8338, "GL_PIXEL_TRANSFORM_2D_MATRIX_EXT" },
  1138. { 0x8349, "GL_FRAGMENT_MATERIAL_EXT" },
  1139. { 0x834A, "GL_FRAGMENT_NORMAL_EXT" },
  1140. { 0x834C, "GL_FRAGMENT_COLOR_EXT" },
  1141. { 0x834D, "GL_ATTENUATION_EXT" },
  1142. { 0x834E, "GL_SHADOW_ATTENUATION_EXT" },
  1143. { 0x834F, "GL_TEXTURE_APPLICATION_MODE_EXT" },
  1144. { 0x8350, "GL_TEXTURE_LIGHT_EXT" },
  1145. { 0x8351, "GL_TEXTURE_MATERIAL_FACE_EXT" },
  1146. { 0x8352, "GL_TEXTURE_MATERIAL_PARAMETER_EXT" },
  1147. { 0x8362, "GL_UNSIGNED_BYTE_2_3_3_REV" },
  1148. { 0x8363, "GL_UNSIGNED_SHORT_5_6_5" },
  1149. { 0x8364, "GL_UNSIGNED_SHORT_5_6_5_REV" },
  1150. { 0x8365, "GL_UNSIGNED_SHORT_4_4_4_4_REV" },
  1151. { 0x8366, "GL_UNSIGNED_SHORT_1_5_5_5_REV" },
  1152. { 0x8367, "GL_UNSIGNED_INT_8_8_8_8_REV" },
  1153. { 0x8368, "GL_UNSIGNED_INT_2_10_10_10_REV" },
  1154. { 0x8370, "GL_MIRRORED_REPEAT_ARB" },
  1155. { 0x8370, "GL_MIRRORED_REPEAT" },
  1156. { 0x83F0, "GL_COMPRESSED_RGB_S3TC_DXT1_EXT" },
  1157. { 0x83F1, "GL_COMPRESSED_RGBA_S3TC_DXT1_EXT" },
  1158. { 0x83F2, "GL_COMPRESSED_RGBA_S3TC_DXT3_EXT" },
  1159. { 0x83F3, "GL_COMPRESSED_RGBA_S3TC_DXT5_EXT" },
  1160. { 0x8439, "GL_TANGENT_ARRAY_EXT" },
  1161. { 0x843A, "GL_BINORMAL_ARRAY_EXT" },
  1162. { 0x843B, "GL_CURRENT_TANGENT_EXT" },
  1163. { 0x843C, "GL_CURRENT_BINORMAL_EXT" },
  1164. { 0x843E, "GL_TANGENT_ARRAY_TYPE_EXT" },
  1165. { 0x843F, "GL_TANGENT_ARRAY_STRIDE_EXT" },
  1166. { 0x8440, "GL_BINORMAL_ARRAY_TYPE_EXT" },
  1167. { 0x8441, "GL_BINORMAL_ARRAY_STRIDE_EXT" },
  1168. { 0x8442, "GL_TANGENT_ARRAY_POINTER_EXT" },
  1169. { 0x8443, "GL_BINORMAL_ARRAY_POINTER_EXT" },
  1170. { 0x8444, "GL_MAP1_TANGENT_EXT" },
  1171. { 0x8445, "GL_MAP2_TANGENT_EXT" },
  1172. { 0x8446, "GL_MAP1_BINORMAL_EXT" },
  1173. { 0x8447, "GL_MAP2_BINORMAL_EXT" },
  1174. { 0x8450, "GL_FOG_COORD_SRC" },
  1175. { 0x8450, "GL_FOG_COORDINATE_SOURCE_EXT" },
  1176. { 0x8450, "GL_FOG_COORDINATE_SOURCE" },
  1177. { 0x8451, "GL_FOG_COORD" },
  1178. { 0x8451, "GL_FOG_COORDINATE_EXT" },
  1179. { 0x8451, "GL_FOG_COORDINATE" },
  1180. { 0x8452, "GL_FRAGMENT_DEPTH_EXT" },
  1181. { 0x8452, "GL_FRAGMENT_DEPTH" },
  1182. { 0x8453 , "GL_CURRENT_FOG_COORD" },
  1183. { 0x8453 , "GL_CURRENT_FOG_COORDINATE" },
  1184. { 0x8453, "GL_CURRENT_FOG_COORDINATE_EXT" },
  1185. { 0x8454, "GL_FOG_COORD_ARRAY_TYPE" },
  1186. { 0x8454, "GL_FOG_COORDINATE_ARRAY_TYPE_EXT" },
  1187. { 0x8454, "GL_FOG_COORDINATE_ARRAY_TYPE" },
  1188. { 0x8455, "GL_FOG_COORD_ARRAY_STRIDE" },
  1189. { 0x8455, "GL_FOG_COORDINATE_ARRAY_STRIDE_EXT" },
  1190. { 0x8455, "GL_FOG_COORDINATE_ARRAY_STRIDE" },
  1191. { 0x8456, "GL_FOG_COORD_ARRAY_POINTER" },
  1192. { 0x8456, "GL_FOG_COORDINATE_ARRAY_POINTER_EXT" },
  1193. { 0x8456, "GL_FOG_COORDINATE_ARRAY_POINTER" },
  1194. { 0x8457, "GL_FOG_COORD_ARRAY" },
  1195. { 0x8457, "GL_FOG_COORDINATE_ARRAY_EXT" },
  1196. { 0x8457, "GL_FOG_COORDINATE_ARRAY" },
  1197. { 0x8458, "GL_COLOR_SUM_ARB" },
  1198. { 0x8458, "GL_COLOR_SUM_EXT" },
  1199. { 0x8458, "GL_COLOR_SUM" },
  1200. { 0x8459, "GL_CURRENT_SECONDARY_COLOR_EXT" },
  1201. { 0x8459, "GL_CURRENT_SECONDARY_COLOR" },
  1202. { 0x845A, "GL_SECONDARY_COLOR_ARRAY_SIZE_EXT" },
  1203. { 0x845A, "GL_SECONDARY_COLOR_ARRAY_SIZE" },
  1204. { 0x845B, "GL_SECONDARY_COLOR_ARRAY_TYPE_EXT" },
  1205. { 0x845B, "GL_SECONDARY_COLOR_ARRAY_TYPE" },
  1206. { 0x845C, "GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT" },
  1207. { 0x845C, "GL_SECONDARY_COLOR_ARRAY_STRIDE" },
  1208. { 0x845D, "GL_SECONDARY_COLOR_ARRAY_POINTER_EXT" },
  1209. { 0x845D, "GL_SECONDARY_COLOR_ARRAY_POINTER" },
  1210. { 0x845E, "GL_SECONDARY_COLOR_ARRAY_EXT" },
  1211. { 0x845E, "GL_SECONDARY_COLOR_ARRAY" },
  1212. { 0x845F, "GL_CURRENT_RASTER_SECONDARY_COLOR" },
  1213. { 0x846D, "GL_ALIASED_POINT_SIZE_RANGE" },
  1214. { 0x846E, "GL_ALIASED_LINE_WIDTH_RANGE" },
  1215. { 0x84C0, "GL_TEXTURE0" },
  1216. { 0x84C1, "GL_TEXTURE1" },
  1217. { 0x84C2, "GL_TEXTURE2" },
  1218. { 0x84C3, "GL_TEXTURE3" },
  1219. { 0x84C4, "GL_TEXTURE4" },
  1220. { 0x84C5, "GL_TEXTURE5" },
  1221. { 0x84C6, "GL_TEXTURE6" },
  1222. { 0x84C7, "GL_TEXTURE7" },
  1223. { 0x84C8, "GL_TEXTURE8" },
  1224. { 0x84C9, "GL_TEXTURE9" },
  1225. { 0x84CA, "GL_TEXTURE10" },
  1226. { 0x84CB, "GL_TEXTURE11" },
  1227. { 0x84CC, "GL_TEXTURE12" },
  1228. { 0x84CD, "GL_TEXTURE13" },
  1229. { 0x84CE, "GL_TEXTURE14" },
  1230. { 0x84CF, "GL_TEXTURE15" },
  1231. { 0x84D0, "GL_TEXTURE16" },
  1232. { 0x84D1, "GL_TEXTURE17" },
  1233. { 0x84D2, "GL_TEXTURE18" },
  1234. { 0x84D3, "GL_TEXTURE19" },
  1235. { 0x84D4, "GL_TEXTURE20" },
  1236. { 0x84D5, "GL_TEXTURE21" },
  1237. { 0x84D6, "GL_TEXTURE22" },
  1238. { 0x84D7, "GL_TEXTURE23" },
  1239. { 0x84D8, "GL_TEXTURE24" },
  1240. { 0x84D9, "GL_TEXTURE25" },
  1241. { 0x84DA, "GL_TEXTURE26" },
  1242. { 0x84DB, "GL_TEXTURE27" },
  1243. { 0x84DC, "GL_TEXTURE28" },
  1244. { 0x84DD, "GL_TEXTURE29" },
  1245. { 0x84DE, "GL_TEXTURE30" },
  1246. { 0x84DF, "GL_TEXTURE31" },
  1247. { 0x84E0, "GL_ACTIVE_TEXTURE" },
  1248. { 0x84E1, "GL_CLIENT_ACTIVE_TEXTURE" },
  1249. { 0x84E2, "GL_MAX_TEXTURE_UNITS" },
  1250. { 0x84E3, "GL_TRANSPOSE_MODELVIEW_MATRIX" },
  1251. { 0x84E4, "GL_TRANSPOSE_PROJECTION_MATRIX" },
  1252. { 0x84E5, "GL_TRANSPOSE_TEXTURE_MATRIX" },
  1253. { 0x84E6, "GL_TRANSPOSE_COLOR_MATRIX" },
  1254. { 0x84E7, "GL_SUBTRACT" },
  1255. { 0x84E8, "GL_MAX_RENDERBUFFER_SIZE" },
  1256. { 0x84E9, "GL_COMPRESSED_ALPHA" },
  1257. { 0x84EA, "GL_COMPRESSED_LUMINANCE" },
  1258. { 0x84EB, "GL_COMPRESSED_LUMINANCE_ALPHA" },
  1259. { 0x84EC, "GL_COMPRESSED_INTENSITY" },
  1260. { 0x84ED, "GL_COMPRESSED_RGB" },
  1261. { 0x84EE, "GL_COMPRESSED_RGBA" },
  1262. { 0x84EF, "GL_TEXTURE_COMPRESSION_HINT" },
  1263. { 0x84F5, "GL_TEXTURE_RECTANGLE_EXT" },
  1264. { 0x84F6, "GL_TEXTURE_BINDING_RECTANGLE_EXT" },
  1265. { 0x84F7, "GL_PROXY_TEXTURE_RECTANGLE_EXT" },
  1266. { 0x84F8, "GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT" },
  1267. { 0x84F9, "GL_DEPTH_STENCIL" },
  1268. { 0x84FA, "GL_UNSIGNED_INT_24_8" },
  1269. { 0x84FD, "GL_MAX_TEXTURE_LOD_BIAS" },
  1270. { 0x84FE, "GL_TEXTURE_MAX_ANISOTROPY_EXT" },
  1271. { 0x84FF, "GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT" },
  1272. { 0x8500, "GL_TEXTURE_FILTER_CONTROL" },
  1273. { 0x8501, "GL_TEXTURE_LOD_BIAS" },
  1274. { 0x8502, "GL_MODELVIEW1_STACK_DEPTH_EXT" },
  1275. { 0x8506, "GL_MODELVIEW_MATRIX1_EXT" },
  1276. { 0x8507, "GL_INCR_WRAP" },
  1277. { 0x8508, "GL_DECR_WRAP" },
  1278. { 0x8509, "GL_VERTEX_WEIGHTING_EXT" },
  1279. { 0x850A, "GL_MODELVIEW1_ARB" },
  1280. { 0x850B, "GL_CURRENT_VERTEX_WEIGHT_EXT" },
  1281. { 0x850C, "GL_VERTEX_WEIGHT_ARRAY_EXT" },
  1282. { 0x850D, "GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT" },
  1283. { 0x850E, "GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT" },
  1284. { 0x850F, "GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT" },
  1285. { 0x8510, "GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT" },
  1286. { 0x8511, "GL_NORMAL_MAP_ARB" },
  1287. { 0x8511, "GL_NORMAL_MAP_EXT" },
  1288. { 0x8511, "GL_NORMAL_MAP" },
  1289. { 0x8512, "GL_REFLECTION_MAP_ARB" },
  1290. { 0x8512, "GL_REFLECTION_MAP_EXT" },
  1291. { 0x8512, "GL_REFLECTION_MAP" },
  1292. { 0x8513, "GL_TEXTURE_CUBE_MAP_ARB" },
  1293. { 0x8513, "GL_TEXTURE_CUBE_MAP_EXT" },
  1294. { 0x8513, "GL_TEXTURE_CUBE_MAP" },
  1295. { 0x8514, "GL_TEXTURE_BINDING_CUBE_MAP_ARB" },
  1296. { 0x8514, "GL_TEXTURE_BINDING_CUBE_MAP_EXT" },
  1297. { 0x8514, "GL_TEXTURE_BINDING_CUBE_MAP" },
  1298. { 0x8515, "GL_TEXTURE_CUBE_MAP_POSITIVE_X" },
  1299. { 0x8516, "GL_TEXTURE_CUBE_MAP_NEGATIVE_X" },
  1300. { 0x8517, "GL_TEXTURE_CUBE_MAP_POSITIVE_Y" },
  1301. { 0x8518, "GL_TEXTURE_CUBE_MAP_NEGATIVE_Y" },
  1302. { 0x8519, "GL_TEXTURE_CUBE_MAP_POSITIVE_Z" },
  1303. { 0x851A, "GL_TEXTURE_CUBE_MAP_NEGATIVE_Z" },
  1304. { 0x851B, "GL_PROXY_TEXTURE_CUBE_MAP" },
  1305. { 0x851C, "GL_MAX_CUBE_MAP_TEXTURE_SIZE" },
  1306. { 0x851D, "GL_VERTEX_ARRAY_RANGE_APPLE" },
  1307. { 0x851E, "GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE" },
  1308. { 0x851F, "GL_VERTEX_ARRAY_STORAGE_HINT_APPLE" },
  1309. { 0x8520, "GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_APPLE" },
  1310. { 0x8521, "GL_VERTEX_ARRAY_RANGE_POINTER_APPLE" },
  1311. { 0x8570, "GL_COMBINE_ARB" },
  1312. { 0x8570, "GL_COMBINE_EXT" },
  1313. { 0x8570, "GL_COMBINE" },
  1314. { 0x8571, "GL_COMBINE_RGB_ARB" },
  1315. { 0x8571, "GL_COMBINE_RGB_EXT" },
  1316. { 0x8571, "GL_COMBINE_RGB" },
  1317. { 0x8572, "GL_COMBINE_ALPHA_ARB" },
  1318. { 0x8572, "GL_COMBINE_ALPHA_EXT" },
  1319. { 0x8572, "GL_COMBINE_ALPHA" },
  1320. { 0x8573, "GL_RGB_SCALE_ARB" },
  1321. { 0x8573, "GL_RGB_SCALE_EXT" },
  1322. { 0x8573, "GL_RGB_SCALE" },
  1323. { 0x8574, "GL_ADD_SIGNED_ARB" },
  1324. { 0x8574, "GL_ADD_SIGNED_EXT" },
  1325. { 0x8574, "GL_ADD_SIGNED" },
  1326. { 0x8575, "GL_INTERPOLATE_ARB" },
  1327. { 0x8575, "GL_INTERPOLATE_EXT" },
  1328. { 0x8575, "GL_INTERPOLATE" },
  1329. { 0x8576, "GL_CONSTANT_ARB" },
  1330. { 0x8576, "GL_CONSTANT_EXT" },
  1331. { 0x8576, "GL_CONSTANT" },
  1332. { 0x8577, "GL_PRIMARY_COLOR_ARB" },
  1333. { 0x8577, "GL_PRIMARY_COLOR_EXT" },
  1334. { 0x8577, "GL_PRIMARY_COLOR" },
  1335. { 0x8578, "GL_PREVIOUS_ARB" },
  1336. { 0x8578, "GL_PREVIOUS_EXT" },
  1337. { 0x8578, "GL_PREVIOUS" },
  1338. { 0x8580, "GL_SOURCE0_RGB_ARB" },
  1339. { 0x8580, "GL_SOURCE0_RGB_EXT" },
  1340. { 0x8580, "GL_SOURCE0_RGB" },
  1341. { 0x8580, "GL_SRC0_RGB" },
  1342. { 0x8581, "GL_SOURCE1_RGB_ARB" },
  1343. { 0x8581, "GL_SOURCE1_RGB_EXT" },
  1344. { 0x8581, "GL_SOURCE1_RGB" },
  1345. { 0x8581, "GL_SRC1_RGB" },
  1346. { 0x8582, "GL_SOURCE2_RGB_ARB" },
  1347. { 0x8582, "GL_SOURCE2_RGB_EXT" },
  1348. { 0x8582, "GL_SOURCE2_RGB" },
  1349. { 0x8582, "GL_SRC2_RGB" },
  1350. { 0x8583, "GL_SOURCE3_RGB_ARB" },
  1351. { 0x8583, "GL_SOURCE3_RGB_EXT" },
  1352. { 0x8583, "GL_SOURCE3_RGB" },
  1353. { 0x8583, "GL_SRC3_RGB" },
  1354. { 0x8584, "GL_SOURCE4_RGB_ARB" },
  1355. { 0x8584, "GL_SOURCE4_RGB_EXT" },
  1356. { 0x8584, "GL_SOURCE4_RGB" },
  1357. { 0x8584, "GL_SRC4_RGB" },
  1358. { 0x8585, "GL_SOURCE5_RGB_ARB" },
  1359. { 0x8585, "GL_SOURCE5_RGB_EXT" },
  1360. { 0x8585, "GL_SOURCE5_RGB" },
  1361. { 0x8585, "GL_SRC5_RGB" },
  1362. { 0x8586, "GL_SOURCE6_RGB_ARB" },
  1363. { 0x8586, "GL_SOURCE6_RGB_EXT" },
  1364. { 0x8586, "GL_SOURCE6_RGB" },
  1365. { 0x8586, "GL_SRC6_RGB" },
  1366. { 0x8587, "GL_SOURCE7_RGB_ARB" },
  1367. { 0x8587, "GL_SOURCE7_RGB_EXT" },
  1368. { 0x8587, "GL_SOURCE7_RGB" },
  1369. { 0x8587, "GL_SRC7_RGB" },
  1370. { 0x8588, "GL_SOURCE0_ALPHA_ARB" },
  1371. { 0x8588, "GL_SOURCE0_ALPHA_EXT" },
  1372. { 0x8588, "GL_SOURCE0_ALPHA" },
  1373. { 0x8588, "GL_SRC0_ALPHA" },
  1374. { 0x8589, "GL_SOURCE1_ALPHA_ARB" },
  1375. { 0x8589, "GL_SOURCE1_ALPHA_EXT" },
  1376. { 0x8589, "GL_SOURCE1_ALPHA" },
  1377. { 0x8589, "GL_SRC1_ALPHA" },
  1378. { 0x858A, "GL_SOURCE2_ALPHA_ARB" },
  1379. { 0x858A, "GL_SOURCE2_ALPHA_EXT" },
  1380. { 0x858A, "GL_SOURCE2_ALPHA" },
  1381. { 0x858A, "GL_SRC2_ALPHA" },
  1382. { 0x858B, "GL_SOURCE3_ALPHA_ARB" },
  1383. { 0x858B, "GL_SOURCE3_ALPHA_EXT" },
  1384. { 0x858B, "GL_SOURCE3_ALPHA" },
  1385. { 0x858B, "GL_SRC3_ALPHA" },
  1386. { 0x858C, "GL_SOURCE4_ALPHA_ARB" },
  1387. { 0x858C, "GL_SOURCE4_ALPHA_EXT" },
  1388. { 0x858C, "GL_SOURCE4_ALPHA" },
  1389. { 0x858C, "GL_SRC4_ALPHA" },
  1390. { 0x858D, "GL_SOURCE5_ALPHA_ARB" },
  1391. { 0x858D, "GL_SOURCE5_ALPHA_EXT" },
  1392. { 0x858D, "GL_SOURCE5_ALPHA" },
  1393. { 0x858D, "GL_SRC5_ALPHA" },
  1394. { 0x858E, "GL_SOURCE6_ALPHA_ARB" },
  1395. { 0x858E, "GL_SOURCE6_ALPHA_EXT" },
  1396. { 0x858E, "GL_SOURCE6_ALPHA" },
  1397. { 0x858E, "GL_SRC6_ALPHA" },
  1398. { 0x858F, "GL_SOURCE7_ALPHA_ARB" },
  1399. { 0x858F, "GL_SOURCE7_ALPHA_EXT" },
  1400. { 0x858F, "GL_SOURCE7_ALPHA" },
  1401. { 0x858F, "GL_SRC7_ALPHA" },
  1402. { 0x8590, "GL_OPERAND0_RGB_ARB" },
  1403. { 0x8590, "GL_OPERAND0_RGB_EXT" },
  1404. { 0x8590, "GL_OPERAND0_RGB" },
  1405. { 0x8591, "GL_OPERAND1_RGB_ARB" },
  1406. { 0x8591, "GL_OPERAND1_RGB_EXT" },
  1407. { 0x8591, "GL_OPERAND1_RGB" },
  1408. { 0x8592, "GL_OPERAND2_RGB_ARB" },
  1409. { 0x8592, "GL_OPERAND2_RGB_EXT" },
  1410. { 0x8592, "GL_OPERAND2_RGB" },
  1411. { 0x8593, "GL_OPERAND3_RGB_ARB" },
  1412. { 0x8593, "GL_OPERAND3_RGB_EXT" },
  1413. { 0x8593, "GL_OPERAND3_RGB" },
  1414. { 0x8594, "GL_OPERAND4_RGB_ARB" },
  1415. { 0x8594, "GL_OPERAND4_RGB_EXT" },
  1416. { 0x8594, "GL_OPERAND4_RGB" },
  1417. { 0x8595, "GL_OPERAND5_RGB_ARB" },
  1418. { 0x8595, "GL_OPERAND5_RGB_EXT" },
  1419. { 0x8595, "GL_OPERAND5_RGB" },
  1420. { 0x8596, "GL_OPERAND6_RGB_ARB" },
  1421. { 0x8596, "GL_OPERAND6_RGB_EXT" },
  1422. { 0x8596, "GL_OPERAND6_RGB" },
  1423. { 0x8597, "GL_OPERAND7_RGB_ARB" },
  1424. { 0x8597, "GL_OPERAND7_RGB_EXT" },
  1425. { 0x8597, "GL_OPERAND7_RGB" },
  1426. { 0x8598, "GL_OPERAND0_ALPHA_ARB" },
  1427. { 0x8598, "GL_OPERAND0_ALPHA_EXT" },
  1428. { 0x8598, "GL_OPERAND0_ALPHA" },
  1429. { 0x8599, "GL_OPERAND1_ALPHA_ARB" },
  1430. { 0x8599, "GL_OPERAND1_ALPHA_EXT" },
  1431. { 0x8599, "GL_OPERAND1_ALPHA" },
  1432. { 0x859A, "GL_OPERAND2_ALPHA_ARB" },
  1433. { 0x859A, "GL_OPERAND2_ALPHA_EXT" },
  1434. { 0x859A, "GL_OPERAND2_ALPHA" },
  1435. { 0x859B, "GL_OPERAND3_ALPHA_ARB" },
  1436. { 0x859B, "GL_OPERAND3_ALPHA_EXT" },
  1437. { 0x859B, "GL_OPERAND3_ALPHA" },
  1438. { 0x859C, "GL_OPERAND4_ALPHA_ARB" },
  1439. { 0x859C, "GL_OPERAND4_ALPHA_EXT" },
  1440. { 0x859C, "GL_OPERAND4_ALPHA" },
  1441. { 0x859D, "GL_OPERAND5_ALPHA_ARB" },
  1442. { 0x859D, "GL_OPERAND5_ALPHA_EXT" },
  1443. { 0x859D, "GL_OPERAND5_ALPHA" },
  1444. { 0x859E, "GL_OPERAND6_ALPHA_ARB" },
  1445. { 0x859E, "GL_OPERAND6_ALPHA_EXT" },
  1446. { 0x859E, "GL_OPERAND6_ALPHA" },
  1447. { 0x859F, "GL_OPERAND7_ALPHA_ARB" },
  1448. { 0x859F, "GL_OPERAND7_ALPHA_EXT" },
  1449. { 0x859F, "GL_OPERAND7_ALPHA" },
  1450. { 0x85AE, "GL_PERTURB_EXT" },
  1451. { 0x85AF, "GL_TEXTURE_NORMAL_EXT" },
  1452. { 0x85B4, "GL_STORAGE_CLIENT_APPLE" },
  1453. { 0x85B5, "GL_VERTEX_ARRAY_BINDING_APPLE" },
  1454. { 0x85BD, "GL_STORAGE_PRIVATE_APPLE" },
  1455. { 0x85BE, "GL_STORAGE_CACHED_APPLE" },
  1456. { 0x85BF, "GL_STORAGE_SHARED_APPLE" },
  1457. { 0x8620, "GL_VERTEX_PROGRAM_ARB" },
  1458. { 0x8620, "GL_VERTEX_PROGRAM_NV" },
  1459. { 0x8621, "GL_VERTEX_STATE_PROGRAM_NV" },
  1460. { 0x8622, "GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB" },
  1461. { 0x8622, "GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB" },
  1462. { 0x8622, "GL_VERTEX_ATTRIB_ARRAY_ENABLED" },
  1463. { 0x8623, "GL_ATTRIB_ARRAY_SIZE_NV" },
  1464. { 0x8623, "GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB" },
  1465. { 0x8623, "GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB" },
  1466. { 0x8623, "GL_VERTEX_ATTRIB_ARRAY_SIZE" },
  1467. { 0x8624, "GL_ATTRIB_ARRAY_STRIDE_NV" },
  1468. { 0x8624, "GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB" },
  1469. { 0x8624, "GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB" },
  1470. { 0x8624, "GL_VERTEX_ATTRIB_ARRAY_STRIDE" },
  1471. { 0x8625, "GL_ATTRIB_ARRAY_TYPE_NV" },
  1472. { 0x8625, "GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB" },
  1473. { 0x8625, "GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB" },
  1474. { 0x8625, "GL_VERTEX_ATTRIB_ARRAY_TYPE" },
  1475. { 0x8626, "GL_CURRENT_ATTRIB_NV" },
  1476. { 0x8626, "GL_CURRENT_VERTEX_ATTRIB_ARB" },
  1477. { 0x8626, "GL_CURRENT_VERTEX_ATTRIB_ARB" },
  1478. { 0x8626, "GL_CURRENT_VERTEX_ATTRIB" },
  1479. { 0x8627, "GL_PROGRAM_LENGTH_ARB" },
  1480. { 0x8627, "GL_PROGRAM_LENGTH_NV" },
  1481. { 0x8628, "GL_PROGRAM_STRING_ARB" },
  1482. { 0x8628, "GL_PROGRAM_STRING_NV" },
  1483. { 0x8629, "GL_MODELVIEW_PROJECTION_NV" },
  1484. { 0x862A, "GL_IDENTITY_NV" },
  1485. { 0x862B, "GL_INVERSE_NV" },
  1486. { 0x862C, "GL_TRANSPOSE_NV" },
  1487. { 0x862D, "GL_INVERSE_TRANSPOSE_NV" },
  1488. { 0x862E, "GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB" },
  1489. { 0x862E, "GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV" },
  1490. { 0x862F, "GL_MAX_PROGRAM_MATRICES_ARB" },
  1491. { 0x862F, "GL_MAX_TRACK_MATRICES_NV" },
  1492. { 0x8630, "GL_MATRIX0_NV" },
  1493. { 0x8631, "GL_MATRIX1_NV" },
  1494. { 0x8632, "GL_MATRIX2_NV" },
  1495. { 0x8633, "GL_MATRIX3_NV" },
  1496. { 0x8634, "GL_MATRIX4_NV" },
  1497. { 0x8635, "GL_MATRIX5_NV" },
  1498. { 0x8636, "GL_MATRIX6_NV" },
  1499. { 0x8637, "GL_MATRIX7_NV" },
  1500. { 0x8640, "GL_CURRENT_MATRIX_STACK_DEPTH_ARB" },
  1501. { 0x8640, "GL_CURRENT_MATRIX_STACK_DEPTH_NV" },
  1502. { 0x8641, "GL_CURRENT_MATRIX_ARB" },
  1503. { 0x8641, "GL_CURRENT_MATRIX_NV" },
  1504. { 0x8642, "GL_PROGRAM_POINT_SIZE_EXT" },
  1505. { 0x8642, "GL_VERTEX_PROGRAM_POINT_SIZE_ARB" },
  1506. { 0x8642, "GL_VERTEX_PROGRAM_POINT_SIZE_ARB" },
  1507. { 0x8642, "GL_VERTEX_PROGRAM_POINT_SIZE_NV" },
  1508. { 0x8642, "GL_VERTEX_PROGRAM_POINT_SIZE" },
  1509. { 0x8643, "GL_VERTEX_PROGRAM_TWO_SIDE_ARB" },
  1510. { 0x8643, "GL_VERTEX_PROGRAM_TWO_SIDE_ARB" },
  1511. { 0x8643, "GL_VERTEX_PROGRAM_TWO_SIDE_NV" },
  1512. { 0x8643, "GL_VERTEX_PROGRAM_TWO_SIDE" },
  1513. { 0x8644, "GL_PROGRAM_PARAMETER_NV" },
  1514. { 0x8645, "GL_ATTRIB_ARRAY_POINTER_NV" },
  1515. { 0x8645, "GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB" },
  1516. { 0x8645, "GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB" },
  1517. { 0x8645, "GL_VERTEX_ATTRIB_ARRAY_POINTER" },
  1518. { 0x8646, "GL_PROGRAM_TARGET_NV" },
  1519. { 0x8647, "GL_PROGRAM_RESIDENT_NV" },
  1520. { 0x8648, "GL_TRACK_MATRIX_NV" },
  1521. { 0x8649, "GL_TRACK_MATRIX_TRANSFORM_NV" },
  1522. { 0x864A, "GL_VERTEX_PROGRAM_BINDING_NV" },
  1523. { 0x864B, "GL_PROGRAM_ERROR_POSITION_ARB" },
  1524. { 0x864B, "GL_PROGRAM_ERROR_POSITION_NV" },
  1525. { 0x8650, "GL_VERTEX_ATTRIB_ARRAY0_NV" },
  1526. { 0x8651, "GL_VERTEX_ATTRIB_ARRAY1_NV" },
  1527. { 0x8652, "GL_VERTEX_ATTRIB_ARRAY2_NV" },
  1528. { 0x8653, "GL_VERTEX_ATTRIB_ARRAY3_NV" },
  1529. { 0x8654, "GL_VERTEX_ATTRIB_ARRAY4_NV" },
  1530. { 0x8655, "GL_VERTEX_ATTRIB_ARRAY5_NV" },
  1531. { 0x8656, "GL_VERTEX_ATTRIB_ARRAY6_NV" },
  1532. { 0x8657, "GL_VERTEX_ATTRIB_ARRAY7_NV" },
  1533. { 0x8658, "GL_VERTEX_ATTRIB_ARRAY8_NV" },
  1534. { 0x8659, "GL_VERTEX_ATTRIB_ARRAY9_NV" },
  1535. { 0x865A, "GL_VERTEX_ATTRIB_ARRAY10_NV" },
  1536. { 0x865B, "GL_VERTEX_ATTRIB_ARRAY11_NV" },
  1537. { 0x865C, "GL_VERTEX_ATTRIB_ARRAY12_NV" },
  1538. { 0x865D, "GL_VERTEX_ATTRIB_ARRAY13_NV" },
  1539. { 0x865E, "GL_VERTEX_ATTRIB_ARRAY14_NV" },
  1540. { 0x865F, "GL_VERTEX_ATTRIB_ARRAY15_NV" },
  1541. { 0x8660, "GL_MAP1_VERTEX_ATTRIB0_4_NV" },
  1542. { 0x8661, "GL_MAP1_VERTEX_ATTRIB1_4_NV" },
  1543. { 0x8662, "GL_MAP1_VERTEX_ATTRIB2_4_NV" },
  1544. { 0x8663, "GL_MAP1_VERTEX_ATTRIB3_4_NV" },
  1545. { 0x8664, "GL_MAP1_VERTEX_ATTRIB4_4_NV" },
  1546. { 0x8665, "GL_MAP1_VERTEX_ATTRIB5_4_NV" },
  1547. { 0x8666, "GL_MAP1_VERTEX_ATTRIB6_4_NV" },
  1548. { 0x8667, "GL_MAP1_VERTEX_ATTRIB7_4_NV" },
  1549. { 0x8668, "GL_MAP1_VERTEX_ATTRIB8_4_NV" },
  1550. { 0x8669, "GL_MAP1_VERTEX_ATTRIB9_4_NV" },
  1551. { 0x866A, "GL_MAP1_VERTEX_ATTRIB10_4_NV" },
  1552. { 0x866B, "GL_MAP1_VERTEX_ATTRIB11_4_NV" },
  1553. { 0x866C, "GL_MAP1_VERTEX_ATTRIB12_4_NV" },
  1554. { 0x866D, "GL_MAP1_VERTEX_ATTRIB13_4_NV" },
  1555. { 0x866E, "GL_MAP1_VERTEX_ATTRIB14_4_NV" },
  1556. { 0x866F, "GL_MAP1_VERTEX_ATTRIB15_4_NV" },
  1557. { 0x8670, "GL_MAP2_VERTEX_ATTRIB0_4_NV" },
  1558. { 0x8671, "GL_MAP2_VERTEX_ATTRIB1_4_NV" },
  1559. { 0x8672, "GL_MAP2_VERTEX_ATTRIB2_4_NV" },
  1560. { 0x8673, "GL_MAP2_VERTEX_ATTRIB3_4_NV" },
  1561. { 0x8674, "GL_MAP2_VERTEX_ATTRIB4_4_NV" },
  1562. { 0x8675, "GL_MAP2_VERTEX_ATTRIB5_4_NV" },
  1563. { 0x8676, "GL_MAP2_VERTEX_ATTRIB6_4_NV" },
  1564. { 0x8677, "GL_MAP2_VERTEX_ATTRIB7_4_NV" },
  1565. { 0x8677, "GL_PROGRAM_BINDING_ARB" },
  1566. { 0x8677, "GL_PROGRAM_NAME_ARB" },
  1567. { 0x8678, "GL_MAP2_VERTEX_ATTRIB8_4_NV" },
  1568. { 0x8679, "GL_MAP2_VERTEX_ATTRIB9_4_NV" },
  1569. { 0x867A, "GL_MAP2_VERTEX_ATTRIB10_4_NV" },
  1570. { 0x867B, "GL_MAP2_VERTEX_ATTRIB11_4_NV" },
  1571. { 0x867C, "GL_MAP2_VERTEX_ATTRIB12_4_NV" },
  1572. { 0x867D, "GL_MAP2_VERTEX_ATTRIB13_4_NV" },
  1573. { 0x867E, "GL_MAP2_VERTEX_ATTRIB14_4_NV" },
  1574. { 0x867F, "GL_MAP2_VERTEX_ATTRIB15_4_NV" },
  1575. { 0x86A0, "GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB" },
  1576. { 0x86A0, "GL_TEXTURE_COMPRESSED_IMAGE_SIZE" },
  1577. { 0x86A1, "GL_TEXTURE_COMPRESSED_ARB" },
  1578. { 0x86A1, "GL_TEXTURE_COMPRESSED" },
  1579. { 0x86A2, "GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB" },
  1580. { 0x86A2, "GL_NUM_COMPRESSED_TEXTURE_FORMATS" },
  1581. { 0x86A3, "GL_COMPRESSED_TEXTURE_FORMATS_ARB" },
  1582. { 0x86A3, "GL_COMPRESSED_TEXTURE_FORMATS" },
  1583. { 0x86A4, "GL_MAX_VERTEX_UNITS_ARB" },
  1584. { 0x86A5, "GL_ACTIVE_VERTEX_UNITS_ARB" },
  1585. { 0x86A6, "GL_WEIGHT_SUM_UNITY_ARB" },
  1586. { 0x86A7, "GL_VERTEX_BLEND_ARB" },
  1587. { 0x86A8, "GL_CURRENT_WEIGHT_ARB" },
  1588. { 0x86A9, "GL_WEIGHT_ARRAY_TYPE_ARB" },
  1589. { 0x86AA, "GL_WEIGHT_ARRAY_STRIDE_ARB" },
  1590. { 0x86AB, "GL_WEIGHT_ARRAY_SIZE_ARB" },
  1591. { 0x86AC, "GL_WEIGHT_ARRAY_POINTER_ARB" },
  1592. { 0x86AD, "GL_WEIGHT_ARRAY_ARB" },
  1593. { 0x86AE, "GL_DOT3_RGB_ARB" },
  1594. { 0x86AE, "GL_DOT3_RGB" },
  1595. { 0x86AF, "GL_DOT3_RGBA_ARB" },
  1596. { 0x86AF, "GL_DOT3_RGBA" },
  1597. { 0x8722, "GL_MODELVIEW2_ARB" },
  1598. { 0x8723, "GL_MODELVIEW3_ARB" },
  1599. { 0x8724, "GL_MODELVIEW4_ARB" },
  1600. { 0x8725, "GL_MODELVIEW5_ARB" },
  1601. { 0x8726, "GL_MODELVIEW6_ARB" },
  1602. { 0x8727, "GL_MODELVIEW7_ARB" },
  1603. { 0x8728, "GL_MODELVIEW8_ARB" },
  1604. { 0x8729, "GL_MODELVIEW9_ARB" },
  1605. { 0x872A, "GL_MODELVIEW10_ARB" },
  1606. { 0x872B, "GL_MODELVIEW11_ARB" },
  1607. { 0x872C, "GL_MODELVIEW12_ARB" },
  1608. { 0x872D, "GL_MODELVIEW13_ARB" },
  1609. { 0x872E, "GL_MODELVIEW14_ARB" },
  1610. { 0x872F, "GL_MODELVIEW15_ARB" },
  1611. { 0x8730, "GL_MODELVIEW16_ARB" },
  1612. { 0x8731, "GL_MODELVIEW17_ARB" },
  1613. { 0x8732, "GL_MODELVIEW18_ARB" },
  1614. { 0x8733, "GL_MODELVIEW19_ARB" },
  1615. { 0x8734, "GL_MODELVIEW20_ARB" },
  1616. { 0x8735, "GL_MODELVIEW21_ARB" },
  1617. { 0x8736, "GL_MODELVIEW22_ARB" },
  1618. { 0x8737, "GL_MODELVIEW23_ARB" },
  1619. { 0x8738, "GL_MODELVIEW24_ARB" },
  1620. { 0x8739, "GL_MODELVIEW25_ARB" },
  1621. { 0x873A, "GL_MODELVIEW26_ARB" },
  1622. { 0x873B, "GL_MODELVIEW27_ARB" },
  1623. { 0x873C, "GL_MODELVIEW28_ARB" },
  1624. { 0x873D, "GL_MODELVIEW29_ARB" },
  1625. { 0x873E, "GL_MODELVIEW30_ARB" },
  1626. { 0x873F, "GL_MODELVIEW31_ARB" },
  1627. { 0x8742, "GL_MIRROR_CLAMP_EXT" },
  1628. { 0x8743, "GL_MIRROR_CLAMP_TO_EDGE_EXT" },
  1629. { 0x8764, "GL_BUFFER_SIZE_ARB" },
  1630. { 0x8764, "GL_BUFFER_SIZE" },
  1631. { 0x8765, "GL_BUFFER_USAGE_ARB" },
  1632. { 0x8765, "GL_BUFFER_USAGE" },
  1633. { 0x8780, "GL_VERTEX_SHADER_EXT" },
  1634. { 0x8781, "GL_VERTEX_SHADER_BINDING_EXT" },
  1635. { 0x8782, "GL_OP_INDEX_EXT" },
  1636. { 0x8783, "GL_OP_NEGATE_EXT" },
  1637. { 0x8784, "GL_OP_DOT3_EXT" },
  1638. { 0x8785, "GL_OP_DOT4_EXT" },
  1639. { 0x8786, "GL_OP_MUL_EXT" },
  1640. { 0x8787, "GL_OP_ADD_EXT" },
  1641. { 0x8788, "GL_OP_MADD_EXT" },
  1642. { 0x8789, "GL_OP_FRAC_EXT" },
  1643. { 0x878A, "GL_OP_MAX_EXT" },
  1644. { 0x878B, "GL_OP_MIN_EXT" },
  1645. { 0x878C, "GL_OP_SET_GE_EXT" },
  1646. { 0x878D, "GL_OP_SET_LT_EXT" },
  1647. { 0x878E, "GL_OP_CLAMP_EXT" },
  1648. { 0x878F, "GL_OP_FLOOR_EXT" },
  1649. { 0x8790, "GL_OP_ROUND_EXT" },
  1650. { 0x8791, "GL_OP_EXP_BASE_2_EXT" },
  1651. { 0x8792, "GL_OP_LOG_BASE_2_EXT" },
  1652. { 0x8793, "GL_OP_POWER_EXT" },
  1653. { 0x8794, "GL_OP_RECIP_EXT" },
  1654. { 0x8795, "GL_OP_RECIP_SQRT_EXT" },
  1655. { 0x8796, "GL_OP_SUB_EXT" },
  1656. { 0x8797, "GL_OP_CROSS_PRODUCT_EXT" },
  1657. { 0x8798, "GL_OP_MULTIPLY_MATRIX_EXT" },
  1658. { 0x8799, "GL_OP_MOV_EXT" },
  1659. { 0x879A, "GL_OUTPUT_VERTEX_EXT" },
  1660. { 0x879B, "GL_OUTPUT_COLOR0_EXT" },
  1661. { 0x879C, "GL_OUTPUT_COLOR1_EXT" },
  1662. { 0x879D, "GL_OUTPUT_TEXTURE_COORD0_EXT" },
  1663. { 0x879E, "GL_OUTPUT_TEXTURE_COORD1_EXT" },
  1664. { 0x879F, "GL_OUTPUT_TEXTURE_COORD2_EXT" },
  1665. { 0x87A0, "GL_OUTPUT_TEXTURE_COORD3_EXT" },
  1666. { 0x87A1, "GL_OUTPUT_TEXTURE_COORD4_EXT" },
  1667. { 0x87A2, "GL_OUTPUT_TEXTURE_COORD5_EXT" },
  1668. { 0x87A3, "GL_OUTPUT_TEXTURE_COORD6_EXT" },
  1669. { 0x87A4, "GL_OUTPUT_TEXTURE_COORD7_EXT" },
  1670. { 0x87A5, "GL_OUTPUT_TEXTURE_COORD8_EXT" },
  1671. { 0x87A6, "GL_OUTPUT_TEXTURE_COORD9_EXT" },
  1672. { 0x87A7, "GL_OUTPUT_TEXTURE_COORD10_EXT" },
  1673. { 0x87A8, "GL_OUTPUT_TEXTURE_COORD11_EXT" },
  1674. { 0x87A9, "GL_OUTPUT_TEXTURE_COORD12_EXT" },
  1675. { 0x87AA, "GL_OUTPUT_TEXTURE_COORD13_EXT" },
  1676. { 0x87AB, "GL_OUTPUT_TEXTURE_COORD14_EXT" },
  1677. { 0x87AC, "GL_OUTPUT_TEXTURE_COORD15_EXT" },
  1678. { 0x87AD, "GL_OUTPUT_TEXTURE_COORD16_EXT" },
  1679. { 0x87AE, "GL_OUTPUT_TEXTURE_COORD17_EXT" },
  1680. { 0x87AF, "GL_OUTPUT_TEXTURE_COORD18_EXT" },
  1681. { 0x87B0, "GL_OUTPUT_TEXTURE_COORD19_EXT" },
  1682. { 0x87B1, "GL_OUTPUT_TEXTURE_COORD20_EXT" },
  1683. { 0x87B2, "GL_OUTPUT_TEXTURE_COORD21_EXT" },
  1684. { 0x87B3, "GL_OUTPUT_TEXTURE_COORD22_EXT" },
  1685. { 0x87B4, "GL_OUTPUT_TEXTURE_COORD23_EXT" },
  1686. { 0x87B5, "GL_OUTPUT_TEXTURE_COORD24_EXT" },
  1687. { 0x87B6, "GL_OUTPUT_TEXTURE_COORD25_EXT" },
  1688. { 0x87B7, "GL_OUTPUT_TEXTURE_COORD26_EXT" },
  1689. { 0x87B8, "GL_OUTPUT_TEXTURE_COORD27_EXT" },
  1690. { 0x87B9, "GL_OUTPUT_TEXTURE_COORD28_EXT" },
  1691. { 0x87BA, "GL_OUTPUT_TEXTURE_COORD29_EXT" },
  1692. { 0x87BB, "GL_OUTPUT_TEXTURE_COORD30_EXT" },
  1693. { 0x87BC, "GL_OUTPUT_TEXTURE_COORD31_EXT" },
  1694. { 0x87BD, "GL_OUTPUT_FOG_EXT" },
  1695. { 0x87BE, "GL_SCALAR_EXT" },
  1696. { 0x87BF, "GL_VECTOR_EXT" },
  1697. { 0x87C0, "GL_MATRIX_EXT" },
  1698. { 0x87C1, "GL_VARIANT_EXT" },
  1699. { 0x87C2, "GL_INVARIANT_EXT" },
  1700. { 0x87C3, "GL_LOCAL_CONSTANT_EXT" },
  1701. { 0x87C4, "GL_LOCAL_EXT" },
  1702. { 0x87C5, "GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT" },
  1703. { 0x87C6, "GL_MAX_VERTEX_SHADER_VARIANTS_EXT" },
  1704. { 0x87C7, "GL_MAX_VERTEX_SHADER_INVARIANTS_EXT" },
  1705. { 0x87C8, "GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT" },
  1706. { 0x87C9, "GL_MAX_VERTEX_SHADER_LOCALS_EXT" },
  1707. { 0x87CA, "GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT" },
  1708. { 0x87CB, "GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT" },
  1709. { 0x87CC, "GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT" },
  1710. { 0x87CD, "GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT" },
  1711. { 0x87CE, "GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT" },
  1712. { 0x87CF, "GL_VERTEX_SHADER_INSTRUCTIONS_EXT" },
  1713. { 0x87D0, "GL_VERTEX_SHADER_VARIANTS_EXT" },
  1714. { 0x87D1, "GL_VERTEX_SHADER_INVARIANTS_EXT" },
  1715. { 0x87D2, "GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT" },
  1716. { 0x87D3, "GL_VERTEX_SHADER_LOCALS_EXT" },
  1717. { 0x87D4, "GL_VERTEX_SHADER_OPTIMIZED_EXT" },
  1718. { 0x87D5, "GL_X_EXT" },
  1719. { 0x87D6, "GL_Y_EXT" },
  1720. { 0x87D7, "GL_Z_EXT" },
  1721. { 0x87D8, "GL_W_EXT" },
  1722. { 0x87D9, "GL_NEGATIVE_X_EXT" },
  1723. { 0x87DA, "GL_NEGATIVE_Y_EXT" },
  1724. { 0x87DB, "GL_NEGATIVE_Z_EXT" },
  1725. { 0x87DC, "GL_NEGATIVE_W_EXT" },
  1726. { 0x87DF, "GL_NEGATIVE_ONE_EXT" },
  1727. { 0x87E0, "GL_NORMALIZED_RANGE_EXT" },
  1728. { 0x87E1, "GL_FULL_RANGE_EXT" },
  1729. { 0x87E2, "GL_CURRENT_VERTEX_EXT" },
  1730. { 0x87E3, "GL_MVP_MATRIX_EXT" },
  1731. { 0x87E4, "GL_VARIANT_VALUE_EXT" },
  1732. { 0x87E5, "GL_VARIANT_DATATYPE_EXT" },
  1733. { 0x87E6, "GL_VARIANT_ARRAY_STRIDE_EXT" },
  1734. { 0x87E7, "GL_VARIANT_ARRAY_TYPE_EXT" },
  1735. { 0x87E8, "GL_VARIANT_ARRAY_EXT" },
  1736. { 0x87E9, "GL_VARIANT_ARRAY_POINTER_EXT" },
  1737. { 0x87EA, "GL_INVARIANT_VALUE_EXT" },
  1738. { 0x87EB, "GL_INVARIANT_DATATYPE_EXT" },
  1739. { 0x87EC, "GL_LOCAL_CONSTANT_VALUE_EXT" },
  1740. { 0x87Ed, "GL_LOCAL_CONSTANT_DATATYPE_EXT" },
  1741. { 0x8800, "GL_STENCIL_BACK_FUNC_ATI" },
  1742. { 0x8800, "GL_STENCIL_BACK_FUNC" },
  1743. { 0x8801, "GL_STENCIL_BACK_FAIL_ATI" },
  1744. { 0x8801, "GL_STENCIL_BACK_FAIL" },
  1745. { 0x8802, "GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI" },
  1746. { 0x8802, "GL_STENCIL_BACK_PASS_DEPTH_FAIL" },
  1747. { 0x8803, "GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI" },
  1748. { 0x8803, "GL_STENCIL_BACK_PASS_DEPTH_PASS" },
  1749. { 0x8804, "GL_FRAGMENT_PROGRAM_ARB" },
  1750. { 0x8805, "GL_PROGRAM_ALU_INSTRUCTIONS_ARB" },
  1751. { 0x8806, "GL_PROGRAM_TEX_INSTRUCTIONS_ARB" },
  1752. { 0x8807, "GL_PROGRAM_TEX_INDIRECTIONS_ARB" },
  1753. { 0x8808, "GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB" },
  1754. { 0x8809, "GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB" },
  1755. { 0x880A, "GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB" },
  1756. { 0x880B, "GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB" },
  1757. { 0x880C, "GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB" },
  1758. { 0x880D, "GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB" },
  1759. { 0x880E, "GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB" },
  1760. { 0x880F, "GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB" },
  1761. { 0x8810, "GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB" },
  1762. { 0x8814, "GL_RGBA_FLOAT32_APPLE" },
  1763. { 0x8814, "GL_RGBA_FLOAT32_ATI" },
  1764. { 0x8814, "GL_RGBA32F_ARB" },
  1765. { 0x8815, "GL_RGB_FLOAT32_APPLE" },
  1766. { 0x8815, "GL_RGB_FLOAT32_ATI" },
  1767. { 0x8815, "GL_RGB32F_ARB" },
  1768. { 0x8816, "GL_ALPHA_FLOAT32_APPLE" },
  1769. { 0x8816, "GL_ALPHA_FLOAT32_ATI" },
  1770. { 0x8816, "GL_ALPHA32F_ARB" },
  1771. { 0x8817, "GL_INTENSITY_FLOAT32_APPLE" },
  1772. { 0x8817, "GL_INTENSITY_FLOAT32_ATI" },
  1773. { 0x8817, "GL_INTENSITY32F_ARB" },
  1774. { 0x8818, "GL_LUMINANCE_FLOAT32_APPLE" },
  1775. { 0x8818, "GL_LUMINANCE_FLOAT32_ATI" },
  1776. { 0x8818, "GL_LUMINANCE32F_ARB" },
  1777. { 0x8819, "GL_LUMINANCE_ALPHA_FLOAT32_APPLE" },
  1778. { 0x8819, "GL_LUMINANCE_ALPHA_FLOAT32_ATI" },
  1779. { 0x8819, "GL_LUMINANCE_ALPHA32F_ARB" },
  1780. { 0x881A, "GL_RGBA_FLOAT16_APPLE" },
  1781. { 0x881A, "GL_RGBA_FLOAT16_ATI" },
  1782. { 0x881A, "GL_RGBA16F_ARB" },
  1783. { 0x881B, "GL_RGB_FLOAT16_APPLE" },
  1784. { 0x881B, "GL_RGB_FLOAT16_ATI" },
  1785. { 0x881B, "GL_RGB16F_ARB" },
  1786. { 0x881C, "GL_ALPHA_FLOAT16_APPLE" },
  1787. { 0x881C, "GL_ALPHA_FLOAT16_ATI" },
  1788. { 0x881C, "GL_ALPHA16F_ARB" },
  1789. { 0x881D, "GL_INTENSITY_FLOAT16_APPLE" },
  1790. { 0x881D, "GL_INTENSITY_FLOAT16_ATI" },
  1791. { 0x881D, "GL_INTENSITY16F_ARB" },
  1792. { 0x881E, "GL_LUMINANCE_FLOAT16_APPLE" },
  1793. { 0x881E, "GL_LUMINANCE_FLOAT16_ATI" },
  1794. { 0x881E, "GL_LUMINANCE16F_ARB" },
  1795. { 0x881F, "GL_LUMINANCE_ALPHA_FLOAT16_APPLE" },
  1796. { 0x881F, "GL_LUMINANCE_ALPHA_FLOAT16_ATI" },
  1797. { 0x881F, "GL_LUMINANCE_ALPHA16F_ARB" },
  1798. { 0x8820, "GL_RGBA_FLOAT_MODE_ARB" },
  1799. { 0x8824, "GL_MAX_DRAW_BUFFERS_ARB" },
  1800. { 0x8824, "GL_MAX_DRAW_BUFFERS" },
  1801. { 0x8825, "GL_DRAW_BUFFER0_ARB" },
  1802. { 0x8825, "GL_DRAW_BUFFER0" },
  1803. { 0x8826, "GL_DRAW_BUFFER1_ARB" },
  1804. { 0x8826, "GL_DRAW_BUFFER1" },
  1805. { 0x8827, "GL_DRAW_BUFFER2_ARB" },
  1806. { 0x8827, "GL_DRAW_BUFFER2" },
  1807. { 0x8828, "GL_DRAW_BUFFER3_ARB" },
  1808. { 0x8828, "GL_DRAW_BUFFER3" },
  1809. { 0x8829, "GL_DRAW_BUFFER4_ARB" },
  1810. { 0x8829, "GL_DRAW_BUFFER4" },
  1811. { 0x882A, "GL_DRAW_BUFFER5_ARB" },
  1812. { 0x882A, "GL_DRAW_BUFFER5" },
  1813. { 0x882B, "GL_DRAW_BUFFER6_ARB" },
  1814. { 0x882B, "GL_DRAW_BUFFER6" },
  1815. { 0x882C, "GL_DRAW_BUFFER7_ARB" },
  1816. { 0x882C, "GL_DRAW_BUFFER7" },
  1817. { 0x882D, "GL_DRAW_BUFFER8_ARB" },
  1818. { 0x882D, "GL_DRAW_BUFFER8" },
  1819. { 0x882E, "GL_DRAW_BUFFER9_ARB" },
  1820. { 0x882E, "GL_DRAW_BUFFER9" },
  1821. { 0x882F, "GL_DRAW_BUFFER10_ARB" },
  1822. { 0x882F, "GL_DRAW_BUFFER10" },
  1823. { 0x8830, "GL_DRAW_BUFFER11_ARB" },
  1824. { 0x8830, "GL_DRAW_BUFFER11" },
  1825. { 0x8831, "GL_DRAW_BUFFER12_ARB" },
  1826. { 0x8831, "GL_DRAW_BUFFER12" },
  1827. { 0x8832, "GL_DRAW_BUFFER13_ARB" },
  1828. { 0x8832, "GL_DRAW_BUFFER13" },
  1829. { 0x8833, "GL_DRAW_BUFFER14_ARB" },
  1830. { 0x8833, "GL_DRAW_BUFFER14" },
  1831. { 0x8834, "GL_DRAW_BUFFER15_ARB" },
  1832. { 0x8834, "GL_DRAW_BUFFER15" },
  1833. { 0x883D, "GL_ALPHA_BLEND_EQUATION_ATI" },
  1834. { 0x883D, "GL_BLEND_EQUATION_ALPHA_EXT" },
  1835. { 0x883D, "GL_BLEND_EQUATION_ALPHA" },
  1836. { 0x884A, "GL_TEXTURE_DEPTH_SIZE_ARB" },
  1837. { 0x884A, "GL_TEXTURE_DEPTH_SIZE" },
  1838. { 0x884B, "GL_DEPTH_TEXTURE_MODE_ARB" },
  1839. { 0x884B, "GL_DEPTH_TEXTURE_MODE" },
  1840. { 0x884C, "GL_TEXTURE_COMPARE_MODE_ARB" },
  1841. { 0x884C, "GL_TEXTURE_COMPARE_MODE" },
  1842. { 0x884D, "GL_TEXTURE_COMPARE_FUNC_ARB" },
  1843. { 0x884D, "GL_TEXTURE_COMPARE_FUNC" },
  1844. { 0x884E, "GL_COMPARE_R_TO_TEXTURE_ARB" },
  1845. { 0x884E, "GL_COMPARE_R_TO_TEXTURE" },
  1846. { 0x884E, "GL_COMPARE_REF_DEPTH_TO_TEXTURE_EXT" },
  1847. { 0x8861, "GL_POINT_SPRITE_ARB" },
  1848. { 0x8861, "GL_POINT_SPRITE" },
  1849. { 0x8862, "GL_COORD_REPLACE_ARB" },
  1850. { 0x8862, "GL_COORD_REPLACE" },
  1851. { 0x8864, "GL_QUERY_COUNTER_BITS_ARB" },
  1852. { 0x8864, "GL_QUERY_COUNTER_BITS" },
  1853. { 0x8865, "GL_CURRENT_QUERY_ARB" },
  1854. { 0x8865, "GL_CURRENT_QUERY" },
  1855. { 0x8866, "GL_QUERY_RESULT_ARB" },
  1856. { 0x8866, "GL_QUERY_RESULT" },
  1857. { 0x8867, "GL_QUERY_RESULT_AVAILABLE_ARB" },
  1858. { 0x8867, "GL_QUERY_RESULT_AVAILABLE" },
  1859. { 0x8869, "GL_MAX_VERTEX_ATTRIBS_ARB" },
  1860. { 0x8869, "GL_MAX_VERTEX_ATTRIBS_ARB" },
  1861. { 0x8869, "GL_MAX_VERTEX_ATTRIBS" },
  1862. { 0x886A, "GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB" },
  1863. { 0x886A, "GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB" },
  1864. { 0x886A, "GL_VERTEX_ATTRIB_ARRAY_NORMALIZED" },
  1865. { 0x8871, "GL_MAX_TEXTURE_COORDS_ARB" },
  1866. { 0x8871, "GL_MAX_TEXTURE_COORDS_ARB" },
  1867. { 0x8871, "GL_MAX_TEXTURE_COORDS_ARB" },
  1868. { 0x8871, "GL_MAX_TEXTURE_COORDS" },
  1869. { 0x8872, "GL_MAX_TEXTURE_IMAGE_UNITS_ARB" },
  1870. { 0x8872, "GL_MAX_TEXTURE_IMAGE_UNITS_ARB" },
  1871. { 0x8872, "GL_MAX_TEXTURE_IMAGE_UNITS_ARB" },
  1872. { 0x8872, "GL_MAX_TEXTURE_IMAGE_UNITS" },
  1873. { 0x8874, "GL_PROGRAM_ERROR_STRING_ARB" },
  1874. { 0x8875, "GL_PROGRAM_FORMAT_ASCII_ARB" },
  1875. { 0x8876, "GL_PROGRAM_FORMAT_ARB" },
  1876. { 0x8890, "GL_DEPTH_BOUNDS_TEST_EXT" },
  1877. { 0x8891, "GL_DEPTH_BOUNDS_EXT" },
  1878. { 0x8892, "GL_ARRAY_BUFFER_ARB" },
  1879. { 0x8892, "GL_ARRAY_BUFFER" },
  1880. { 0x8893, "GL_ELEMENT_ARRAY_BUFFER_ARB" },
  1881. { 0x8893, "GL_ELEMENT_ARRAY_BUFFER" },
  1882. { 0x8894, "GL_ARRAY_BUFFER_BINDING_ARB" },
  1883. { 0x8894, "GL_ARRAY_BUFFER_BINDING" },
  1884. { 0x8895, "GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB" },
  1885. { 0x8895, "GL_ELEMENT_ARRAY_BUFFER_BINDING" },
  1886. { 0x8896, "GL_VERTEX_ARRAY_BUFFER_BINDING_ARB" },
  1887. { 0x8896, "GL_VERTEX_ARRAY_BUFFER_BINDING" },
  1888. { 0x8897, "GL_NORMAL_ARRAY_BUFFER_BINDING_ARB" },
  1889. { 0x8897, "GL_NORMAL_ARRAY_BUFFER_BINDING" },
  1890. { 0x8898, "GL_COLOR_ARRAY_BUFFER_BINDING_ARB" },
  1891. { 0x8898, "GL_COLOR_ARRAY_BUFFER_BINDING" },
  1892. { 0x8899, "GL_INDEX_ARRAY_BUFFER_BINDING_ARB" },
  1893. { 0x8899, "GL_INDEX_ARRAY_BUFFER_BINDING" },
  1894. { 0x889A, "GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB" },
  1895. { 0x889A, "GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING" },
  1896. { 0x889B, "GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB" },
  1897. { 0x889B, "GL_EDGE_FLAG_ARRAY_BUFFER_BINDING" },
  1898. { 0x889C, "GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB" },
  1899. { 0x889C, "GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING" },
  1900. { 0x889D, "GL_FOG_COORD_ARRAY_BUFFER_BINDING_ARB" },
  1901. { 0x889D, "GL_FOG_COORD_ARRAY_BUFFER_BINDING" },
  1902. { 0x889D, "GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB" },
  1903. { 0x889D, "GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING" },
  1904. { 0x889E, "GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB" },
  1905. { 0x889E, "GL_WEIGHT_ARRAY_BUFFER_BINDING" },
  1906. { 0x889F, "GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB" },
  1907. { 0x889F, "GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING" },
  1908. { 0x88A0, "GL_PROGRAM_INSTRUCTIONS_ARB" },
  1909. { 0x88A1, "GL_MAX_PROGRAM_INSTRUCTIONS_ARB" },
  1910. { 0x88A2, "GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB" },
  1911. { 0x88A3, "GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB" },
  1912. { 0x88A4, "GL_PROGRAM_TEMPORARIES_ARB" },
  1913. { 0x88A5, "GL_MAX_PROGRAM_TEMPORARIES_ARB" },
  1914. { 0x88A6, "GL_PROGRAM_NATIVE_TEMPORARIES_ARB" },
  1915. { 0x88A7, "GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB" },
  1916. { 0x88A8, "GL_PROGRAM_PARAMETERS_ARB" },
  1917. { 0x88A9, "GL_MAX_PROGRAM_PARAMETERS_ARB" },
  1918. { 0x88AA, "GL_PROGRAM_NATIVE_PARAMETERS_ARB" },
  1919. { 0x88AB, "GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB" },
  1920. { 0x88AC, "GL_PROGRAM_ATTRIBS_ARB" },
  1921. { 0x88AD, "GL_MAX_PROGRAM_ATTRIBS_ARB" },
  1922. { 0x88AE, "GL_PROGRAM_NATIVE_ATTRIBS_ARB" },
  1923. { 0x88AF, "GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB" },
  1924. { 0x88B0, "GL_PROGRAM_ADDRESS_REGISTERS_ARB" },
  1925. { 0x88B1, "GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB" },
  1926. { 0x88B2, "GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB" },
  1927. { 0x88B3, "GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB" },
  1928. { 0x88B4, "GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB" },
  1929. { 0x88B5, "GL_MAX_PROGRAM_ENV_PARAMETERS_ARB" },
  1930. { 0x88B6, "GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB" },
  1931. { 0x88B7, "GL_TRANSPOSE_CURRENT_MATRIX_ARB" },
  1932. { 0x88B8, "GL_READ_ONLY_ARB" },
  1933. { 0x88B8, "GL_READ_ONLY" },
  1934. { 0x88B9, "GL_WRITE_ONLY_ARB" },
  1935. { 0x88B9, "GL_WRITE_ONLY" },
  1936. { 0x88BA, "GL_READ_WRITE_ARB" },
  1937. { 0x88BA, "GL_READ_WRITE" },
  1938. { 0x88BB, "GL_BUFFER_ACCESS_ARB" },
  1939. { 0x88BB, "GL_BUFFER_ACCESS" },
  1940. { 0x88BC, "GL_BUFFER_MAPPED_ARB" },
  1941. { 0x88BC, "GL_BUFFER_MAPPED" },
  1942. { 0x88BD, "GL_BUFFER_MAP_POINTER_ARB" },
  1943. { 0x88BD, "GL_BUFFER_MAP_POINTER" },
  1944. { 0x88C0, "GL_MATRIX0_ARB" },
  1945. { 0x88C1, "GL_MATRIX1_ARB" },
  1946. { 0x88C2, "GL_MATRIX2_ARB" },
  1947. { 0x88C3, "GL_MATRIX3_ARB" },
  1948. { 0x88C4, "GL_MATRIX4_ARB" },
  1949. { 0x88C5, "GL_MATRIX5_ARB" },
  1950. { 0x88C6, "GL_MATRIX6_ARB" },
  1951. { 0x88C7, "GL_MATRIX7_ARB" },
  1952. { 0x88C8, "GL_MATRIX8_ARB" },
  1953. { 0x88C9, "GL_MATRIX9_ARB" },
  1954. { 0x88CA, "GL_MATRIX10_ARB" },
  1955. { 0x88CB, "GL_MATRIX11_ARB" },
  1956. { 0x88CC, "GL_MATRIX12_ARB" },
  1957. { 0x88CD, "GL_MATRIX13_ARB" },
  1958. { 0x88CE, "GL_MATRIX14_ARB" },
  1959. { 0x88CF, "GL_MATRIX15_ARB" },
  1960. { 0x88D0, "GL_MATRIX16_ARB" },
  1961. { 0x88D1, "GL_MATRIX17_ARB" },
  1962. { 0x88D2, "GL_MATRIX18_ARB" },
  1963. { 0x88D3, "GL_MATRIX19_ARB" },
  1964. { 0x88D4, "GL_MATRIX20_ARB" },
  1965. { 0x88D5, "GL_MATRIX21_ARB" },
  1966. { 0x88D6, "GL_MATRIX22_ARB" },
  1967. { 0x88D7, "GL_MATRIX23_ARB" },
  1968. { 0x88D8, "GL_MATRIX24_ARB" },
  1969. { 0x88D9, "GL_MATRIX25_ARB" },
  1970. { 0x88DA, "GL_MATRIX26_ARB" },
  1971. { 0x88DB, "GL_MATRIX27_ARB" },
  1972. { 0x88DC, "GL_MATRIX28_ARB" },
  1973. { 0x88DD, "GL_MATRIX29_ARB" },
  1974. { 0x88DE, "GL_MATRIX30_ARB" },
  1975. { 0x88DF, "GL_MATRIX31_ARB" },
  1976. { 0x88E0, "GL_STREAM_DRAW_ARB" },
  1977. { 0x88E0, "GL_STREAM_DRAW" },
  1978. { 0x88E1, "GL_STREAM_READ_ARB" },
  1979. { 0x88E1, "GL_STREAM_READ" },
  1980. { 0x88E2, "GL_STREAM_COPY_ARB" },
  1981. { 0x88E2, "GL_STREAM_COPY" },
  1982. { 0x88E4, "GL_STATIC_DRAW_ARB" },
  1983. { 0x88E4, "GL_STATIC_DRAW" },
  1984. { 0x88E5, "GL_STATIC_READ_ARB" },
  1985. { 0x88E5, "GL_STATIC_READ" },
  1986. { 0x88E6, "GL_STATIC_COPY_ARB" },
  1987. { 0x88E6, "GL_STATIC_COPY" },
  1988. { 0x88E8, "GL_DYNAMIC_DRAW_ARB" },
  1989. { 0x88E8, "GL_DYNAMIC_DRAW" },
  1990. { 0x88E9, "GL_DYNAMIC_READ_ARB" },
  1991. { 0x88E9, "GL_DYNAMIC_READ" },
  1992. { 0x88EA, "GL_DYNAMIC_COPY_ARB" },
  1993. { 0x88EA, "GL_DYNAMIC_COPY" },
  1994. { 0x88EB, "GL_PIXEL_PACK_BUFFER_ARB" },
  1995. { 0x88EB, "GL_PIXEL_PACK_BUFFER" },
  1996. { 0x88EC, "GL_PIXEL_UNPACK_BUFFER_ARB" },
  1997. { 0x88EC, "GL_PIXEL_UNPACK_BUFFER" },
  1998. { 0x88ED, "GL_PIXEL_PACK_BUFFER_BINDING_ARB" },
  1999. { 0x88ED, "GL_PIXEL_PACK_BUFFER_BINDING" },
  2000. { 0x88EF, "GL_PIXEL_UNPACK_BUFFER_BINDING_ARB" },
  2001. { 0x88EF, "GL_PIXEL_UNPACK_BUFFER_BINDING" },
  2002. { 0x88F0, "GL_DEPTH24_STENCIL8_EXT" },
  2003. { 0x88F0, "GL_DEPTH24_STENCIL8" },
  2004. { 0x88F1, "GL_TEXTURE_STENCIL_SIZE_EXT" },
  2005. { 0x88F1, "GL_TEXTURE_STENCIL_SIZE" },
  2006. { 0x88FD, "GL_VERTEX_ATTRIB_ARRAY_INTEGER_EXT" },
  2007. { 0x88FE, "GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB" },
  2008. { 0x88FF, "GL_MAX_ARRAY_TEXTURE_LAYERS_EXT" },
  2009. { 0x8904, "GL_MIN_PROGRAM_TEXEL_OFFSET_EXT" },
  2010. { 0x8905, "GL_MAX_PROGRAM_TEXEL_OFFSET_EXT" },
  2011. { 0x8910, "GL_STENCIL_TEST_TWO_SIDE_EXT" },
  2012. { 0x8911, "GL_ACTIVE_STENCIL_FACE_EXT" },
  2013. { 0x8912, "GL_MIRROR_CLAMP_TO_BORDER_EXT" },
  2014. { 0x8914, "GL_SAMPLES_PASSED_ARB" },
  2015. { 0x8914, "GL_SAMPLES_PASSED" },
  2016. { 0x891A, "GL_CLAMP_VERTEX_COLOR_ARB" },
  2017. { 0x891B, "GL_CLAMP_FRAGMENT_COLOR_ARB" },
  2018. { 0x891C, "GL_CLAMP_READ_COLOR_ARB" },
  2019. { 0x891D, "GL_FIXED_ONLY_ARB" },
  2020. { 0x8920, "GL_FRAGMENT_SHADER_EXT" },
  2021. { 0x896D, "GL_SECONDARY_INTERPOLATOR_EXT" },
  2022. { 0x896E, "GL_NUM_FRAGMENT_REGISTERS_EXT" },
  2023. { 0x896F, "GL_NUM_FRAGMENT_CONSTANTS_EXT" },
  2024. { 0x8A0C, "GL_ELEMENT_ARRAY_APPLE" },
  2025. { 0x8A0D, "GL_ELEMENT_ARRAY_TYPE_APPLE" },
  2026. { 0x8A0E, "GL_ELEMENT_ARRAY_POINTER_APPLE" },
  2027. { 0x8A0F, "GL_COLOR_FLOAT_APPLE" },
  2028. { 0x8A11, "GL_UNIFORM_BUFFER" },
  2029. { 0x8A28, "GL_UNIFORM_BUFFER_BINDING" },
  2030. { 0x8A29, "GL_UNIFORM_BUFFER_START" },
  2031. { 0x8A2A, "GL_UNIFORM_BUFFER_SIZE" },
  2032. { 0x8A2B, "GL_MAX_VERTEX_UNIFORM_BLOCKS" },
  2033. { 0x8A2C, "GL_MAX_GEOMETRY_UNIFORM_BLOCKS" },
  2034. { 0x8A2D, "GL_MAX_FRAGMENT_UNIFORM_BLOCKS" },
  2035. { 0x8A2E, "GL_MAX_COMBINED_UNIFORM_BLOCKS" },
  2036. { 0x8A2F, "GL_MAX_UNIFORM_BUFFER_BINDINGS" },
  2037. { 0x8A30, "GL_MAX_UNIFORM_BLOCK_SIZE" },
  2038. { 0x8A31, "GL_MAX_COMBINED_VERTEX_UNIFORM_COMPONENTS" },
  2039. { 0x8A32, "GL_MAX_COMBINED_GEOMETRY_UNIFORM_COMPONENTS" },
  2040. { 0x8A33, "GL_MAX_COMBINED_FRAGMENT_UNIFORM_COMPONENTS" },
  2041. { 0x8A34, "GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT" },
  2042. { 0x8A35, "GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH" },
  2043. { 0x8A36, "GL_ACTIVE_UNIFORM_BLOCKS" },
  2044. { 0x8A37, "GL_UNIFORM_TYPE" },
  2045. { 0x8A38, "GL_UNIFORM_SIZE" },
  2046. { 0x8A39, "GL_UNIFORM_NAME_LENGTH" },
  2047. { 0x8A3A, "GL_UNIFORM_BLOCK_INDEX" },
  2048. { 0x8A3B, "GL_UNIFORM_OFFSET" },
  2049. { 0x8A3C, "GL_UNIFORM_ARRAY_STRIDE" },
  2050. { 0x8A3D, "GL_UNIFORM_MATRIX_STRIDE" },
  2051. { 0x8A3E, "GL_UNIFORM_IS_ROW_MAJOR" },
  2052. { 0x8A3F, "GL_UNIFORM_BLOCK_BINDING" },
  2053. { 0x8A40, "GL_UNIFORM_BLOCK_DATA_SIZE" },
  2054. { 0x8A41, "GL_UNIFORM_BLOCK_NAME_LENGTH" },
  2055. { 0x8A42, "GL_UNIFORM_BLOCK_ACTIVE_UNIFORMS" },
  2056. { 0x8A43, "GL_UNIFORM_BLOCK_ACTIVE_UNIFORM_INDICES" },
  2057. { 0x8A44, "GL_UNIFORM_BLOCK_REFERENCED_BY_VERTEX_SHADER" },
  2058. { 0x8A45, "GL_UNIFORM_BLOCK_REFERENCED_BY_GEOMETRY_SHADER" },
  2059. { 0x8A46, "GL_UNIFORM_BLOCK_REFERENCED_BY_FRAGMENT_SHADER" },
  2060. { 0x8B30, "GL_FRAGMENT_SHADER_ARB" },
  2061. { 0x8B30, "GL_FRAGMENT_SHADER" },
  2062. { 0x8B31, "GL_VERTEX_SHADER_ARB" },
  2063. { 0x8B31, "GL_VERTEX_SHADER" },
  2064. { 0x8B40, "GL_PROGRAM_OBJECT_ARB" },
  2065. { 0x8B48, "GL_SHADER_OBJECT_ARB" },
  2066. { 0x8B49, "GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB" },
  2067. { 0x8B49, "GL_MAX_FRAGMENT_UNIFORM_COMPONENTS" },
  2068. { 0x8B4A, "GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB" },
  2069. { 0x8B4A, "GL_MAX_VERTEX_UNIFORM_COMPONENTS" },
  2070. { 0x8B4B, "GL_MAX_VARYING_COMPONENTS_EXT" },
  2071. { 0x8B4B, "GL_MAX_VARYING_FLOATS_ARB" },
  2072. { 0x8B4B, "GL_MAX_VARYING_FLOATS" },
  2073. { 0x8B4C, "GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB" },
  2074. { 0x8B4C, "GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS" },
  2075. { 0x8B4D, "GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB" },
  2076. { 0x8B4D, "GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS" },
  2077. { 0x8B4E, "GL_OBJECT_TYPE_ARB" },
  2078. { 0x8B4F, "GL_OBJECT_SUBTYPE_ARB" },
  2079. { 0x8B4F, "GL_SHADER_TYPE" },
  2080. { 0x8B50, "GL_FLOAT_VEC2_ARB" },
  2081. { 0x8B50, "GL_FLOAT_VEC2" },
  2082. { 0x8B51, "GL_FLOAT_VEC3_ARB" },
  2083. { 0x8B51, "GL_FLOAT_VEC3" },
  2084. { 0x8B52, "GL_FLOAT_VEC4_ARB" },
  2085. { 0x8B52, "GL_FLOAT_VEC4" },
  2086. { 0x8B53, "GL_INT_VEC2_ARB" },
  2087. { 0x8B53, "GL_INT_VEC2" },
  2088. { 0x8B54, "GL_INT_VEC3_ARB" },
  2089. { 0x8B54, "GL_INT_VEC3" },
  2090. { 0x8B55, "GL_INT_VEC4_ARB" },
  2091. { 0x8B55, "GL_INT_VEC4" },
  2092. { 0x8B56, "GL_BOOL_ARB" },
  2093. { 0x8B56, "GL_BOOL" },
  2094. { 0x8B57, "GL_BOOL_VEC2_ARB" },
  2095. { 0x8B57, "GL_BOOL_VEC2" },
  2096. { 0x8B58, "GL_BOOL_VEC3_ARB" },
  2097. { 0x8B58, "GL_BOOL_VEC3" },
  2098. { 0x8B59, "GL_BOOL_VEC4_ARB" },
  2099. { 0x8B59, "GL_BOOL_VEC4" },
  2100. { 0x8B5A, "GL_FLOAT_MAT2_ARB" },
  2101. { 0x8B5A, "GL_FLOAT_MAT2" },
  2102. { 0x8B5B, "GL_FLOAT_MAT3_ARB" },
  2103. { 0x8B5B, "GL_FLOAT_MAT3" },
  2104. { 0x8B5C, "GL_FLOAT_MAT4_ARB" },
  2105. { 0x8B5C, "GL_FLOAT_MAT4" },
  2106. { 0x8B5D, "GL_SAMPLER_1D_ARB" },
  2107. { 0x8B5D, "GL_SAMPLER_1D" },
  2108. { 0x8B5E, "GL_SAMPLER_2D_ARB" },
  2109. { 0x8B5E, "GL_SAMPLER_2D" },
  2110. { 0x8B5F, "GL_SAMPLER_3D_ARB" },
  2111. { 0x8B5F, "GL_SAMPLER_3D" },
  2112. { 0x8B60, "GL_SAMPLER_CUBE_ARB" },
  2113. { 0x8B60, "GL_SAMPLER_CUBE" },
  2114. { 0x8B61, "GL_SAMPLER_1D_SHADOW_ARB" },
  2115. { 0x8B61, "GL_SAMPLER_1D_SHADOW" },
  2116. { 0x8B62, "GL_SAMPLER_2D_SHADOW_ARB" },
  2117. { 0x8B62, "GL_SAMPLER_2D_SHADOW" },
  2118. { 0x8B63, "GL_SAMPLER_2D_RECT_ARB" },
  2119. { 0x8B64, "GL_SAMPLER_2D_RECT_SHADOW_ARB" },
  2120. { 0x8B65, "GL_FLOAT_MAT2x3" },
  2121. { 0x8B66, "GL_FLOAT_MAT2x4" },
  2122. { 0x8B67, "GL_FLOAT_MAT3x2" },
  2123. { 0x8B68, "GL_FLOAT_MAT3x4" },
  2124. { 0x8B69, "GL_FLOAT_MAT4x2" },
  2125. { 0x8B6A, "GL_FLOAT_MAT4x3" },
  2126. { 0x8B80, "GL_DELETE_STATUS" },
  2127. { 0x8B80, "GL_OBJECT_DELETE_STATUS_ARB" },
  2128. { 0x8B81, "GL_COMPILE_STATUS" },
  2129. { 0x8B81, "GL_OBJECT_COMPILE_STATUS_ARB" },
  2130. { 0x8B82, "GL_LINK_STATUS" },
  2131. { 0x8B82, "GL_OBJECT_LINK_STATUS_ARB" },
  2132. { 0x8B83, "GL_OBJECT_VALIDATE_STATUS_ARB" },
  2133. { 0x8B83, "GL_VALIDATE_STATUS" },
  2134. { 0x8B84, "GL_INFO_LOG_LENGTH" },
  2135. { 0x8B84, "GL_OBJECT_INFO_LOG_LENGTH_ARB" },
  2136. { 0x8B85, "GL_ATTACHED_SHADERS" },
  2137. { 0x8B85, "GL_OBJECT_ATTACHED_OBJECTS_ARB" },
  2138. { 0x8B86, "GL_ACTIVE_UNIFORMS" },
  2139. { 0x8B86, "GL_OBJECT_ACTIVE_UNIFORMS_ARB" },
  2140. { 0x8B87, "GL_ACTIVE_UNIFORM_MAX_LENGTH" },
  2141. { 0x8B87, "GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB" },
  2142. { 0x8B88, "GL_OBJECT_SHADER_SOURCE_LENGTH_ARB" },
  2143. { 0x8B88, "GL_SHADER_SOURCE_LENGTH" },
  2144. { 0x8B89, "GL_ACTIVE_ATTRIBUTES" },
  2145. { 0x8B89, "GL_OBJECT_ACTIVE_ATTRIBUTES_ARB" },
  2146. { 0x8B8A, "GL_ACTIVE_ATTRIBUTE_MAX_LENGTH" },
  2147. { 0x8B8A, "GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB" },
  2148. { 0x8B8B, "GL_FRAGMENT_SHADER_DERIVATIVE_HINT_ARB" },
  2149. { 0x8B8B, "GL_FRAGMENT_SHADER_DERIVATIVE_HINT" },
  2150. { 0x8B8C, "GL_SHADING_LANGUAGE_VERSION_ARB" },
  2151. { 0x8B8C, "GL_SHADING_LANGUAGE_VERSION" },
  2152. { 0x8B8D, "GL_CURRENT_PROGRAM" },
  2153. { 0x8C10, "GL_TEXTURE_RED_TYPE_ARB" },
  2154. { 0x8C10, "GL_TEXTURE_RED_TYPE" },
  2155. { 0x8C11, "GL_TEXTURE_GREEN_TYPE_ARB" },
  2156. { 0x8C11, "GL_TEXTURE_GREEN_TYPE" },
  2157. { 0x8C12, "GL_TEXTURE_BLUE_TYPE_ARB" },
  2158. { 0x8C12, "GL_TEXTURE_BLUE_TYPE" },
  2159. { 0x8C13, "GL_TEXTURE_ALPHA_TYPE_ARB" },
  2160. { 0x8C13, "GL_TEXTURE_ALPHA_TYPE" },
  2161. { 0x8C14, "GL_TEXTURE_LUMINANCE_TYPE_ARB" },
  2162. { 0x8C15, "GL_TEXTURE_INTENSITY_TYPE_ARB" },
  2163. { 0x8C16, "GL_TEXTURE_DEPTH_TYPE_ARB" },
  2164. { 0x8C16, "GL_TEXTURE_DEPTH_TYPE" },
  2165. { 0x8C17, "GL_UNSIGNED_NORMALIZED_ARB" },
  2166. { 0x8C17, "GL_UNSIGNED_NORMALIZED" },
  2167. { 0x8C18, "GL_TEXTURE_1D_ARRAY_EXT" },
  2168. { 0x8C19, "GL_PROXY_TEXTURE_1D_ARRAY_EXT" },
  2169. { 0x8C1A, "GL_TEXTURE_2D_ARRAY_EXT" },
  2170. { 0x8C1B, "GL_PROXY_TEXTURE_2D_ARRAY_EXT" },
  2171. { 0x8C1C, "GL_TEXTURE_BINDING_1D_ARRAY_EXT" },
  2172. { 0x8C1D, "GL_TEXTURE_BINDING_2D_ARRAY_EXT" },
  2173. { 0x8C29, "GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_EXT" },
  2174. { 0x8C3A, "GL_R11F_G11F_B10F_EXT" },
  2175. { 0x8C3B, "GL_UNSIGNED_INT_10F_11F_11F_REV_EXT" },
  2176. { 0x8C3C, "GL_RGBA_SIGNED_COMPONENTS_EXT" },
  2177. { 0x8C3D, "GL_RGB9_E5_EXT" },
  2178. { 0x8C3E, "GL_UNSIGNED_INT_5_9_9_9_REV_EXT" },
  2179. { 0x8C3F, "GL_TEXTURE_SHARED_SIZE_EXT" },
  2180. { 0x8C40, "GL_SRGB_EXT" },
  2181. { 0x8C40, "GL_SRGB" },
  2182. { 0x8C41, "GL_SRGB8_EXT" },
  2183. { 0x8C41, "GL_SRGB8" },
  2184. { 0x8C42, "GL_SRGB_ALPHA_EXT" },
  2185. { 0x8C42, "GL_SRGB_ALPHA" },
  2186. { 0x8C43, "GL_SRGB8_ALPHA8_EXT" },
  2187. { 0x8C43, "GL_SRGB8_ALPHA8" },
  2188. { 0x8C44, "GL_SLUMINANCE_ALPHA_EXT" },
  2189. { 0x8C44, "GL_SLUMINANCE_ALPHA" },
  2190. { 0x8C45, "GL_SLUMINANCE8_ALPHA8_EXT" },
  2191. { 0x8C45, "GL_SLUMINANCE8_ALPHA8" },
  2192. { 0x8C46, "GL_SLUMINANCE_EXT" },
  2193. { 0x8C46, "GL_SLUMINANCE" },
  2194. { 0x8C47, "GL_SLUMINANCE8_EXT" },
  2195. { 0x8C47, "GL_SLUMINANCE8" },
  2196. { 0x8C48, "GL_COMPRESSED_SRGB_EXT" },
  2197. { 0x8C48, "GL_COMPRESSED_SRGB" },
  2198. { 0x8C49, "GL_COMPRESSED_SRGB_ALPHA_EXT" },
  2199. { 0x8C49, "GL_COMPRESSED_SRGB_ALPHA" },
  2200. { 0x8C4A, "GL_COMPRESSED_SLUMINANCE_EXT" },
  2201. { 0x8C4A, "GL_COMPRESSED_SLUMINANCE" },
  2202. { 0x8C4B, "GL_COMPRESSED_SLUMINANCE_ALPHA_EXT" },
  2203. { 0x8C4B, "GL_COMPRESSED_SLUMINANCE_ALPHA" },
  2204. { 0x8C4C, "GL_COMPRESSED_SRGB_S3TC_DXT1_EXT" },
  2205. { 0x8C4D, "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT" },
  2206. { 0x8C4E, "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT" },
  2207. { 0x8C4F, "GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT" },
  2208. { 0x8C76, "GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH_EXT" },
  2209. { 0x8C7F, "GL_TRANSFORM_FEEDBACK_BUFFER_MODE_EXT" },
  2210. { 0x8C80, "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS_EXT" },
  2211. { 0x8C83, "GL_TRANSFORM_FEEDBACK_VARYINGS_EXT" },
  2212. { 0x8C84, "GL_TRANSFORM_FEEDBACK_BUFFER_START_EXT" },
  2213. { 0x8C85, "GL_TRANSFORM_FEEDBACK_BUFFER_SIZE_EXT" },
  2214. { 0x8C87, "GL_PRIMITIVES_GENERATED_EXT" },
  2215. { 0x8C88, "GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN_EXT" },
  2216. { 0x8C89, "GL_RASTERIZER_DISCARD_EXT" },
  2217. { 0x8C8A, "GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS_EXT" },
  2218. { 0x8C8B, "GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS_EXT" },
  2219. { 0x8C8C, "GL_INTERLEAVED_ATTRIBS_EXT" },
  2220. { 0x8C8D, "GL_SEPARATE_ATTRIBS_EXT" },
  2221. { 0x8C8E, "GL_TRANSFORM_FEEDBACK_BUFFER_EXT" },
  2222. { 0x8C8F, "GL_TRANSFORM_FEEDBACK_BUFFER_BINDING_EXT" },
  2223. { 0x8CA0, "GL_POINT_SPRITE_COORD_ORIGIN" },
  2224. { 0x8CA1, "GL_LOWER_LEFT" },
  2225. { 0x8CA2, "GL_UPPER_LEFT" },
  2226. { 0x8CA3, "GL_STENCIL_BACK_REF" },
  2227. { 0x8CA4, "GL_STENCIL_BACK_VALUE_MASK" },
  2228. { 0x8CA5, "GL_STENCIL_BACK_WRITEMASK" },
  2229. { 0x8CA6, "GL_DRAW_FRAMEBUFFER_BINDING_EXT" },
  2230. { 0x8CA6, "GL_FRAMEBUFFER_BINDING_EXT" },
  2231. { 0x8CA6, "GL_FRAMEBUFFER_BINDING" },
  2232. { 0x8CA7, "GL_RENDERBUFFER_BINDING_EXT" },
  2233. { 0x8CA7, "GL_RENDERBUFFER_BINDING" },
  2234. { 0x8CA8, "GL_READ_FRAMEBUFFER_EXT" },
  2235. { 0x8CA8, "GL_READ_FRAMEBUFFER" },
  2236. { 0x8CA9, "GL_DRAW_FRAMEBUFFER_EXT" },
  2237. { 0x8CA9, "GL_DRAW_FRAMEBUFFER" },
  2238. { 0x8CAA, "GL_READ_FRAMEBUFFER_BINDING_EXT" },
  2239. { 0x8CAA, "GL_READ_FRAMEBUFFER_BINDING" },
  2240. { 0x8CAB, "GL_RENDERBUFFER_SAMPLES_EXT" },
  2241. { 0x8CAB, "GL_RENDERBUFFER_SAMPLES" },
  2242. { 0x8CAC, "GL_DEPTH_COMPONENT32F" },
  2243. { 0x8CAD, "GL_DEPTH32F_STENCIL8" },
  2244. { 0x8CD0, "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT" },
  2245. { 0x8CD0, "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE" },
  2246. { 0x8CD1, "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT" },
  2247. { 0x8CD1, "GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME" },
  2248. { 0x8CD2, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT" },
  2249. { 0x8CD2, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL" },
  2250. { 0x8CD3, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT" },
  2251. { 0x8CD3, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE" },
  2252. { 0x8CD4, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT" },
  2253. { 0x8CD4, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER_EXT" },
  2254. { 0x8CD4, "GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LAYER" },
  2255. { 0x8CD5, "GL_FRAMEBUFFER_COMPLETE_EXT" },
  2256. { 0x8CD5, "GL_FRAMEBUFFER_COMPLETE" },
  2257. { 0x8CD6, "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT" },
  2258. { 0x8CD6, "GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT" },
  2259. { 0x8CD7, "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT" },
  2260. { 0x8CD7, "GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT" },
  2261. { 0x8CD9, "GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT" },
  2262. { 0x8CDA, "GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT" },
  2263. { 0x8CDB, "GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT" },
  2264. { 0x8CDB, "GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER" },
  2265. { 0x8CDC, "GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT" },
  2266. { 0x8CDC, "GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER" },
  2267. { 0x8CDD, "GL_FRAMEBUFFER_UNSUPPORTED_EXT" },
  2268. { 0x8CDD, "GL_FRAMEBUFFER_UNSUPPORTED" },
  2269. { 0x8CDF, "GL_MAX_COLOR_ATTACHMENTS_EXT" },
  2270. { 0x8CDF, "GL_MAX_COLOR_ATTACHMENTS" },
  2271. { 0x8CE0, "GL_COLOR_ATTACHMENT0_EXT" },
  2272. { 0x8CE0, "GL_COLOR_ATTACHMENT0" },
  2273. { 0x8CE1, "GL_COLOR_ATTACHMENT1_EXT" },
  2274. { 0x8CE1, "GL_COLOR_ATTACHMENT1" },
  2275. { 0x8CE2, "GL_COLOR_ATTACHMENT2_EXT" },
  2276. { 0x8CE2, "GL_COLOR_ATTACHMENT2" },
  2277. { 0x8CE3, "GL_COLOR_ATTACHMENT3_EXT" },
  2278. { 0x8CE3, "GL_COLOR_ATTACHMENT3" },
  2279. { 0x8CE4, "GL_COLOR_ATTACHMENT4_EXT" },
  2280. { 0x8CE4, "GL_COLOR_ATTACHMENT4" },
  2281. { 0x8CE5, "GL_COLOR_ATTACHMENT5_EXT" },
  2282. { 0x8CE5, "GL_COLOR_ATTACHMENT5" },
  2283. { 0x8CE6, "GL_COLOR_ATTACHMENT6_EXT" },
  2284. { 0x8CE6, "GL_COLOR_ATTACHMENT6" },
  2285. { 0x8CE7, "GL_COLOR_ATTACHMENT7_EXT" },
  2286. { 0x8CE7, "GL_COLOR_ATTACHMENT7" },
  2287. { 0x8CE8, "GL_COLOR_ATTACHMENT8_EXT" },
  2288. { 0x8CE8, "GL_COLOR_ATTACHMENT8" },
  2289. { 0x8CE9, "GL_COLOR_ATTACHMENT9_EXT" },
  2290. { 0x8CE9, "GL_COLOR_ATTACHMENT9" },
  2291. { 0x8CEA, "GL_COLOR_ATTACHMENT10_EXT" },
  2292. { 0x8CEA, "GL_COLOR_ATTACHMENT10" },
  2293. { 0x8CEB, "GL_COLOR_ATTACHMENT11_EXT" },
  2294. { 0x8CEB, "GL_COLOR_ATTACHMENT11" },
  2295. { 0x8CEC, "GL_COLOR_ATTACHMENT12_EXT" },
  2296. { 0x8CEC, "GL_COLOR_ATTACHMENT12" },
  2297. { 0x8CED, "GL_COLOR_ATTACHMENT13_EXT" },
  2298. { 0x8CED, "GL_COLOR_ATTACHMENT13" },
  2299. { 0x8CEE, "GL_COLOR_ATTACHMENT14_EXT" },
  2300. { 0x8CEE, "GL_COLOR_ATTACHMENT14" },
  2301. { 0x8CEF, "GL_COLOR_ATTACHMENT15_EXT" },
  2302. { 0x8CEF, "GL_COLOR_ATTACHMENT15" },
  2303. { 0x8D00, "GL_DEPTH_ATTACHMENT_EXT" },
  2304. { 0x8D00, "GL_DEPTH_ATTACHMENT" },
  2305. { 0x8D20, "GL_STENCIL_ATTACHMENT_EXT" },
  2306. { 0x8D20, "GL_STENCIL_ATTACHMENT" },
  2307. { 0x8D40, "GL_FRAMEBUFFER_EXT" },
  2308. { 0x8D40, "GL_FRAMEBUFFER" },
  2309. { 0x8D41, "GL_RENDERBUFFER_EXT" },
  2310. { 0x8D41, "GL_RENDERBUFFER" },
  2311. { 0x8D42, "GL_RENDERBUFFER_WIDTH_EXT" },
  2312. { 0x8D42, "GL_RENDERBUFFER_WIDTH" },
  2313. { 0x8D43, "GL_RENDERBUFFER_HEIGHT_EXT" },
  2314. { 0x8D43, "GL_RENDERBUFFER_HEIGHT" },
  2315. { 0x8D44, "GL_RENDERBUFFER_INTERNAL_FORMAT_EXT" },
  2316. { 0x8D44, "GL_RENDERBUFFER_INTERNAL_FORMAT" },
  2317. { 0x8D46, "GL_STENCIL_INDEX1_EXT" },
  2318. { 0x8D46, "GL_STENCIL_INDEX1" },
  2319. { 0x8D47, "GL_STENCIL_INDEX4_EXT" },
  2320. { 0x8D47, "GL_STENCIL_INDEX4" },
  2321. { 0x8D48, "GL_STENCIL_INDEX8_EXT" },
  2322. { 0x8D48, "GL_STENCIL_INDEX8" },
  2323. { 0x8D49, "GL_STENCIL_INDEX16_EXT" },
  2324. { 0x8D49, "GL_STENCIL_INDEX16" },
  2325. { 0x8D50, "GL_RENDERBUFFER_RED_SIZE_EXT" },
  2326. { 0x8D50, "GL_RENDERBUFFER_RED_SIZE" },
  2327. { 0x8D51, "GL_RENDERBUFFER_GREEN_SIZE_EXT" },
  2328. { 0x8D51, "GL_RENDERBUFFER_GREEN_SIZE" },
  2329. { 0x8D52, "GL_RENDERBUFFER_BLUE_SIZE_EXT" },
  2330. { 0x8D52, "GL_RENDERBUFFER_BLUE_SIZE" },
  2331. { 0x8D53, "GL_RENDERBUFFER_ALPHA_SIZE_EXT" },
  2332. { 0x8D53, "GL_RENDERBUFFER_ALPHA_SIZE" },
  2333. { 0x8D54, "GL_RENDERBUFFER_DEPTH_SIZE_EXT" },
  2334. { 0x8D54, "GL_RENDERBUFFER_DEPTH_SIZE" },
  2335. { 0x8D55, "GL_RENDERBUFFER_STENCIL_SIZE_EXT" },
  2336. { 0x8D55, "GL_RENDERBUFFER_STENCIL_SIZE" },
  2337. { 0x8D56, "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE_EXT" },
  2338. { 0x8D56, "GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE" },
  2339. { 0x8D57, "GL_MAX_SAMPLES_EXT" },
  2340. { 0x8D57, "GL_MAX_SAMPLES" },
  2341. { 0x8D70, "GL_RGBA32UI_EXT" },
  2342. { 0x8D71, "GL_RGB32UI_EXT" },
  2343. { 0x8D72, "GL_ALPHA32UI_EXT" },
  2344. { 0x8D73, "GL_INTENSITY32UI_EXT" },
  2345. { 0x8D74, "GL_LUMINANCE32UI_EXT" },
  2346. { 0x8D75, "GL_LUMINANCE_ALPHA32UI_EXT" },
  2347. { 0x8D76, "GL_RGBA16UI_EXT" },
  2348. { 0x8D77, "GL_RGB16UI_EXT" },
  2349. { 0x8D78, "GL_ALPHA16UI_EXT" },
  2350. { 0x8D79, "GL_INTENSITY16UI_EXT" },
  2351. { 0x8D7A, "GL_LUMINANCE16UI_EXT" },
  2352. { 0x8D7B, "GL_LUMINANCE_ALPHA16UI_EXT" },
  2353. { 0x8D7C, "GL_RGBA8UI_EXT" },
  2354. { 0x8D7D, "GL_RGB8UI_EXT" },
  2355. { 0x8D7E, "GL_ALPHA8UI_EXT" },
  2356. { 0x8D7F, "GL_INTENSITY8UI_EXT" },
  2357. { 0x8D80, "GL_LUMINANCE8UI_EXT" },
  2358. { 0x8D81, "GL_LUMINANCE_ALPHA8UI_EXT" },
  2359. { 0x8D82, "GL_RGBA32I_EXT" },
  2360. { 0x8D83, "GL_RGB32I_EXT" },
  2361. { 0x8D84, "GL_ALPHA32I_EXT" },
  2362. { 0x8D85, "GL_INTENSITY32I_EXT" },
  2363. { 0x8D86, "GL_LUMINANCE32I_EXT" },
  2364. { 0x8D87, "GL_LUMINANCE_ALPHA32I_EXT" },
  2365. { 0x8D88, "GL_RGBA16I_EXT" },
  2366. { 0x8D89, "GL_RGB16I_EXT" },
  2367. { 0x8D8A, "GL_ALPHA16I_EXT" },
  2368. { 0x8D8B, "GL_INTENSITY16I_EXT" },
  2369. { 0x8D8C, "GL_LUMINANCE16I_EXT" },
  2370. { 0x8D8D, "GL_LUMINANCE_ALPHA16I_EXT" },
  2371. { 0x8D8E, "GL_RGBA8I_EXT" },
  2372. { 0x8D8F, "GL_RGB8I_EXT" },
  2373. { 0x8D90, "GL_ALPHA8I_EXT" },
  2374. { 0x8D91, "GL_INTENSITY8I_EXT" },
  2375. { 0x8D92, "GL_LUMINANCE8I_EXT" },
  2376. { 0x8D93, "GL_LUMINANCE_ALPHA8I_EXT" },
  2377. { 0x8D94, "GL_RED_INTEGER_EXT" },
  2378. { 0x8D95, "GL_GREEN_INTEGER_EXT" },
  2379. { 0x8D96, "GL_BLUE_INTEGER_EXT" },
  2380. { 0x8D97, "GL_ALPHA_INTEGER_EXT" },
  2381. { 0x8D98, "GL_RGB_INTEGER_EXT" },
  2382. { 0x8D99, "GL_RGBA_INTEGER_EXT" },
  2383. { 0x8D9A, "GL_BGR_INTEGER_EXT" },
  2384. { 0x8D9B, "GL_BGRA_INTEGER_EXT" },
  2385. { 0x8D9C, "GL_LUMINANCE_INTEGER_EXT" },
  2386. { 0x8D9D, "GL_LUMINANCE_ALPHA_INTEGER_EXT" },
  2387. { 0x8D9E, "GL_RGBA_INTEGER_MODE_EXT" },
  2388. { 0x8DA7, "GL_FRAMEBUFFER_ATTACHMENT_LAYERED_EXT" },
  2389. { 0x8DA8, "GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_EXT" },
  2390. { 0x8DA9, "GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_EXT" },
  2391. { 0x8DAD, "GL_FLOAT_32_UNSIGNED_INT_24_8_REV" },
  2392. { 0x8DB9, "GL_FRAMEBUFFER_SRGB_EXT" },
  2393. { 0x8DBA, "GL_FRAMEBUFFER_SRGB_CAPABLE_EXT" },
  2394. { 0x8DBB, "GL_COMPRESSED_RED_RGTC1" },
  2395. { 0x8DBC, "GL_COMPRESSED_SIGNED_RED_RGTC1" },
  2396. { 0x8DBD, "GL_COMPRESSED_RG_RGTC2" },
  2397. { 0x8DBE, "GL_COMPRESSED_SIGNED_RG_RGTC2" },
  2398. { 0x8DC0, "GL_SAMPLER_1D_ARRAY_EXT" },
  2399. { 0x8DC1, "GL_SAMPLER_2D_ARRAY_EXT" },
  2400. { 0x8DC2, "GL_SAMPLER_BUFFER_EXT" },
  2401. { 0x8DC3, "GL_SAMPLER_1D_ARRAY_SHADOW_EXT" },
  2402. { 0x8DC4, "GL_SAMPLER_2D_ARRAY_SHADOW_EXT" },
  2403. { 0x8DC5, "GL_SAMPLER_CUBE_SHADOW_EXT" },
  2404. { 0x8DC6, "GL_UNSIGNED_INT_VEC2_EXT" },
  2405. { 0x8DC7, "GL_UNSIGNED_INT_VEC3_EXT" },
  2406. { 0x8DC8, "GL_UNSIGNED_INT_VEC4_EXT" },
  2407. { 0x8DC9, "GL_INT_SAMPLER_1D_EXT" },
  2408. { 0x8DCA, "GL_INT_SAMPLER_2D_EXT" },
  2409. { 0x8DCB, "GL_INT_SAMPLER_3D_EXT" },
  2410. { 0x8DCC, "GL_INT_SAMPLER_CUBE_EXT" },
  2411. { 0x8DCD, "GL_INT_SAMPLER_2D_RECT_EXT" },
  2412. { 0x8DCE, "GL_INT_SAMPLER_1D_ARRAY_EXT" },
  2413. { 0x8DCF, "GL_INT_SAMPLER_2D_ARRAY_EXT" },
  2414. { 0x8DD0, "GL_INT_SAMPLER_BUFFER_EXT" },
  2415. { 0x8DD1, "GL_UNSIGNED_INT_SAMPLER_1D_EXT" },
  2416. { 0x8DD2, "GL_UNSIGNED_INT_SAMPLER_2D_EXT" },
  2417. { 0x8DD3, "GL_UNSIGNED_INT_SAMPLER_3D_EXT" },
  2418. { 0x8DD4, "GL_UNSIGNED_INT_SAMPLER_CUBE_EXT" },
  2419. { 0x8DD5, "GL_UNSIGNED_INT_SAMPLER_2D_RECT_EXT" },
  2420. { 0x8DD6, "GL_UNSIGNED_INT_SAMPLER_1D_ARRAY_EXT" },
  2421. { 0x8DD7, "GL_UNSIGNED_INT_SAMPLER_2D_ARRAY_EXT" },
  2422. { 0x8DD8, "GL_UNSIGNED_INT_SAMPLER_BUFFER_EXT" },
  2423. { 0x8DD9, "GL_GEOMETRY_SHADER_EXT" },
  2424. { 0x8DDA, "GL_GEOMETRY_VERTICES_OUT_EXT" },
  2425. { 0x8DDB, "GL_GEOMETRY_INPUT_TYPE_EXT" },
  2426. { 0x8DDC, "GL_GEOMETRY_OUTPUT_TYPE_EXT" },
  2427. { 0x8DDD, "GL_MAX_GEOMETRY_VARYING_COMPONENTS_EXT" },
  2428. { 0x8DDE, "GL_MAX_VERTEX_VARYING_COMPONENTS_EXT" },
  2429. { 0x8DDF, "GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_EXT" },
  2430. { 0x8DE0, "GL_MAX_GEOMETRY_OUTPUT_VERTICES_EXT" },
  2431. { 0x8DE1, "GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_EXT" },
  2432. { 0x8DE2, "GL_MAX_VERTEX_BINDABLE_UNIFORMS_EXT" },
  2433. { 0x8DE3, "GL_MAX_FRAGMENT_BINDABLE_UNIFORMS_EXT" },
  2434. { 0x8DE4, "GL_MAX_GEOMETRY_BINDABLE_UNIFORMS_EXT" },
  2435. { 0x8DED, "GL_MAX_BINDABLE_UNIFORM_SIZE_EXT" },
  2436. { 0x8DEE, "GL_UNIFORM_BUFFER_EXT" },
  2437. { 0x8DEF, "GL_UNIFORM_BUFFER_BINDING_EXT" },
  2438. { 0x8E4C, "GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION_EXT" },
  2439. { 0x8E4D, "GL_FIRST_VERTEX_CONVENTION_EXT" },
  2440. { 0x8E4E, "GL_LAST_VERTEX_CONVENTION_EXT" },
  2441. { 0x8E4F, "GL_PROVOKING_VERTEX_EXT" },
  2442. VE( TERMVALUE )
  2443. };
  2444. const GLMValueEntry_t g_gl_renderers[] =
  2445. {
  2446. { 0x00020200, "Generic" },
  2447. { 0x00020400, "GenericFloat" },
  2448. { 0x00020600, "AppleSW" },
  2449. { 0x00021000, "ATIRage128" },
  2450. { 0x00021200, "ATIRadeon" },
  2451. { 0x00021400, "ATIRagePro" },
  2452. { 0x00021600, "ATIRadeon8500" },
  2453. { 0x00021800, "ATIRadeon9700" },
  2454. { 0x00021900, "ATIRadeonX1000" },
  2455. { 0x00021A00, "ATIRadeonX2000" },
  2456. { 0x00022000, "NVGeForce2MX" },
  2457. { 0x00022200, "NVGeForce3" },
  2458. { 0x00022400, "NVGeForceFX" },
  2459. { 0x00022600, "NVGeForce8xxx" },
  2460. { 0x00023000, "VTBladeXP2" },
  2461. { 0x00024000, "Intel900" },
  2462. { 0x00024200, "IntelX3100" },
  2463. { 0x00040000, "Mesa3DFX" },
  2464. VE( TERMVALUE )
  2465. };
  2466. //===============================================================================
  2467. // decode helper funcs
  2468. char s_glmStrScratch[65536];
  2469. int s_glmStrCursor = 0;
  2470. const char * GLMDecode( GLMThing_t thingtype, unsigned long value )
  2471. {
  2472. const GLMValueEntry_t *table = NULL;
  2473. //char isflags = 0;
  2474. switch( thingtype )
  2475. {
  2476. case eD3D_DEVTYPE: table = g_d3d_devtypes;
  2477. break;
  2478. case eD3D_FORMAT: table = g_d3d_formats;
  2479. break;
  2480. case eD3D_RTYPE: table = g_d3d_rtypes;
  2481. break;
  2482. case eD3D_USAGE: table = g_d3d_usages;
  2483. break;
  2484. case eD3D_RSTATE: table = g_d3d_rstates;
  2485. break;
  2486. case eD3D_SIO: table = g_d3d_opcodes;
  2487. break;
  2488. case eD3D_VTXDECLUSAGE: table = g_d3d_vtxdeclusages;
  2489. break;
  2490. case eCGL_RENDID: table = g_cgl_rendids;
  2491. break;
  2492. case eGL_ERROR: table = g_gl_errors;
  2493. break;
  2494. case eGL_ENUM: table = g_gl_enums;
  2495. break;
  2496. case eGL_RENDERER: table = g_gl_renderers;
  2497. break;
  2498. default:
  2499. GLMStop();
  2500. return "UNKNOWNTYPE";
  2501. break;
  2502. }
  2503. if (table)
  2504. {
  2505. while( table->value != TERMVALUE )
  2506. {
  2507. if (table->value == value)
  2508. {
  2509. return table->name;
  2510. }
  2511. table++;
  2512. }
  2513. }
  2514. return "UNKNOWN";
  2515. }
  2516. const char *GLMDecodeMask( GLMThing_t kind, unsigned long value )
  2517. {
  2518. // if cursor to scratch buffer is within 1K of EOB, rewind
  2519. // nobody is going to decode 63K of flag string values in a single call..
  2520. // this means that strings returned by this function have a short lifetime.. print them and do not save the pointer..
  2521. if ( (sizeof(s_glmStrScratch) - s_glmStrCursor) < 1000 )
  2522. {
  2523. s_glmStrCursor = 0;
  2524. }
  2525. char *start = &s_glmStrScratch[ s_glmStrCursor ];
  2526. char *dest = start;
  2527. char first = 1;
  2528. DWORD mask = static_cast<DWORD>(1L<<31);
  2529. while(mask)
  2530. {
  2531. if (mask & value)
  2532. {
  2533. sprintf(dest,"%s%s", (first) ? "" : "|", GLMDecode( kind, value&mask ) );
  2534. first = 0;
  2535. dest += strlen(dest); // leaves dest pointing at the end null
  2536. }
  2537. mask >>= 1;
  2538. }
  2539. s_glmStrCursor = (dest - s_glmStrScratch) + 1; // +1 so the next decoded flag set doesn't land on the ending null
  2540. return start;
  2541. }
  2542. #undef VE
  2543. #undef TERMVALUE
  2544. //===============================================================================
  2545. bool GLMDetectOGLP( void )
  2546. {
  2547. bool result = false;
  2548. #if defined( OSX ) && defined( CGLPROFILER_ENABLE )
  2549. GLint forceFlush;
  2550. CGLError error = CGLGetParameter(CGLGetCurrentContext(), kCGLCPEnableForceFlush, &forceFlush);
  2551. result = error == 0;
  2552. if (result)
  2553. {
  2554. // enable a breakpoint on color4sv
  2555. int oglp_bkpt[3] = { kCGLFEglColor4sv, kCGLProfBreakBefore, 1 };
  2556. CGLSetOption( kCGLGOEnableBreakpoint, (GLint)oglp_bkpt );
  2557. }
  2558. #endif
  2559. return result;
  2560. }
  2561. // from http://blog.timac.org/?p=190
  2562. #ifndef _WIN32
  2563. #include <stdbool.h>
  2564. #endif
  2565. #include <sys/types.h>
  2566. #ifndef _WIN32
  2567. #include <unistd.h>
  2568. #include <sys/sysctl.h>
  2569. #endif
  2570. // From Technical Q&A QA1361
  2571. // Returns true if the current process
  2572. // is being debugged (either running
  2573. // under the debugger or has a debugger
  2574. // attached post facto).
  2575. bool GLMDetectGDB( void ) // aka AmIBeingDebugged()
  2576. {
  2577. #ifdef OSX
  2578. bool result;
  2579. int junk;
  2580. int mib[4];
  2581. struct kinfo_proc info;
  2582. size_t size;
  2583. // Initialize the flags so that,
  2584. // if sysctl fails for some bizarre
  2585. // reason, we get a predictable result.
  2586. info.kp_proc.p_flag = 0;
  2587. // Initialize mib, which tells sysctl the info
  2588. // we want, in this case we're looking for
  2589. // information about a specific process ID.
  2590. mib[0] = CTL_KERN;
  2591. mib[1] = KERN_PROC;
  2592. mib[2] = KERN_PROC_PID;
  2593. mib[3] = getpid();
  2594. // Call sysctl.
  2595. size = sizeof(info);
  2596. junk = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0);
  2597. assert(junk == 0);
  2598. // We're being debugged if the P_TRACED
  2599. // flag is set.
  2600. result = ( (info.kp_proc.p_flag & P_TRACED) != 0 );
  2601. return result;
  2602. #else
  2603. return Sys_IsDebuggerPresent();
  2604. #endif
  2605. }
  2606. static uint g_glmDebugChannelMask = 0; // which output channels are available (can be more than one)
  2607. static uint g_glmDebugFlavorMask = 0; // which message flavors are enabled for output (can be more than one)
  2608. uint GLMDetectAvailableChannels( void )
  2609. {
  2610. uint result = 0;
  2611. // printf is always available (except maybe in release... ?)
  2612. result |= (1 << ePrintf);
  2613. // gdb
  2614. if (GLMDetectGDB())
  2615. {
  2616. result |= (1 << eDebugger);
  2617. printf("\n############# GDB Detected");
  2618. }
  2619. // oglp
  2620. if (GLMDetectOGLP())
  2621. {
  2622. result |= (1 << eGLProfiler);
  2623. printf("\n############# OGLP Detected");
  2624. }
  2625. return result;
  2626. }
  2627. static bool g_debugInitDone = false;
  2628. #if GLMDEBUG
  2629. // following funcs vanish if GLMDEBUG not set
  2630. void GLMDebugInitialize( bool forceReinit )
  2631. {
  2632. if ( !g_debugInitDone || forceReinit )
  2633. {
  2634. // detect channels
  2635. uint channelMask = GLMDetectAvailableChannels();
  2636. // see if there are any prohibitions on the commandline
  2637. // (also add any other desired reasons, release build say)..
  2638. if ( CommandLine()->FindParm("-noprintconsole") )
  2639. {
  2640. channelMask &= ~(1<<ePrintf);
  2641. }
  2642. if ( CommandLine()->FindParm("-noprintdebugger") )
  2643. {
  2644. channelMask &= ~(1<<eDebugger);
  2645. }
  2646. if ( CommandLine()->FindParm("-noprintoglp") )
  2647. {
  2648. channelMask &= ~(1<<eGLProfiler);
  2649. }
  2650. // finally, disable all of them if commandline did not say "enable spew"
  2651. if (!CommandLine()->FindParm("-glmspew"))
  2652. {
  2653. channelMask = 0;
  2654. }
  2655. // set the output channel mask
  2656. GLMDebugChannelMask( &channelMask );
  2657. // if any channels are enabled, enable some output
  2658. if ( channelMask )
  2659. {
  2660. // start mostly quiet unless the -glmbootspew option is there
  2661. if ( CommandLine()->FindParm( "-glmbootspew" ) )
  2662. {
  2663. g_glmDebugFlavorMask = 0xFFFFFFFF;
  2664. }
  2665. else
  2666. {
  2667. g_glmDebugFlavorMask =
  2668. (1<<eAllFlavors)
  2669. | (1<<eDebugDump) // -D- stuff
  2670. // | (1<<eFrameBufData) // -F-
  2671. // | (1<<eDXStuff) // -X-
  2672. // | (1<<eTenure) // > <
  2673. // | (1<<eAllocations) // -A-
  2674. | (1<<eSlowness) // -Z-
  2675. | (1<<eDefaultFlavor); // adjust to suit
  2676. }
  2677. }
  2678. else
  2679. {
  2680. g_glmDebugFlavorMask = 0;
  2681. }
  2682. }
  2683. }
  2684. uint GLMDebugChannelMask( uint *newValue )
  2685. {
  2686. if (newValue)
  2687. {
  2688. g_glmDebugChannelMask = *newValue;
  2689. }
  2690. uint result = g_glmDebugChannelMask;
  2691. // leave space for any override / mute mechanism we might want to inject here
  2692. return result;
  2693. }
  2694. uint GLMDebugFlavorMask( uint *newValue )
  2695. {
  2696. if (newValue)
  2697. {
  2698. g_glmDebugFlavorMask = *newValue;
  2699. }
  2700. uint result = g_glmDebugFlavorMask;
  2701. // leave space for any override / mute mechanism we might want to inject here
  2702. return result;
  2703. }
  2704. #endif
  2705. //===============================================================================
  2706. void GLMEnableTrace( bool on )
  2707. {
  2708. #if GLMDEBUG
  2709. #if defined( OSX ) && defined( CGLPROFILER_ENABLE )
  2710. if ( GLMDebugChannelMask() & (1<<eGLProfiler) )
  2711. {
  2712. CGLSetOption(kCGLGOEnableFunctionTrace, on ? GL_TRUE : GL_FALSE );
  2713. }
  2714. #endif
  2715. #endif
  2716. }
  2717. //===============================================================================
  2718. #if GLMDEBUG
  2719. // following funcs vanish if GLMDEBUG not set
  2720. void GLMStringOut( char *string )
  2721. {
  2722. if ( GLMDebugChannelMask() & ( (1<<ePrintf) | (1<<eDebugger) ) )
  2723. {
  2724. #ifdef WIN32
  2725. OutputDebugStringA( string );
  2726. OutputDebugStringA( "\n");
  2727. #else
  2728. puts( string );
  2729. #endif
  2730. }
  2731. #if defined( OSX ) && defined( CGLPROFILER_ENABLE )
  2732. if ( GLMDebugChannelMask() & (1<<eGLProfiler) )
  2733. {
  2734. CGLSetOption( kCGLGOComment, (GLint)string );
  2735. }
  2736. #endif
  2737. if ( GLMDebugChannelMask() & (1<<eGLProfiler) )
  2738. {
  2739. if (gGL->m_bHave_GL_GREMEDY_string_marker)
  2740. {
  2741. gGL->glStringMarkerGREMEDY(0, string);
  2742. }
  2743. }
  2744. }
  2745. int g_glm_indent = 0;
  2746. int g_glm_indent_max = 40; // 40 tabs max
  2747. #ifndef OSX
  2748. const char *strnstr( const char *haystack, const char *needle, int len )
  2749. {
  2750. return strstr( haystack, needle );
  2751. }
  2752. #endif
  2753. EGLMDebugFlavor GLMAssessFlavor( char *str )
  2754. {
  2755. EGLMDebugFlavor flavor = eDefaultFlavor;
  2756. if (strnstr(str, "-D-", 4))
  2757. {
  2758. // debug dump
  2759. flavor = eDebugDump;
  2760. }
  2761. else if (strnstr(str, "-M-", 4))
  2762. {
  2763. // matrix data
  2764. flavor = eMatrixData;
  2765. }
  2766. else if (strnstr(str, "-S-", 4))
  2767. {
  2768. // shader data
  2769. flavor = eShaderData;
  2770. }
  2771. else if (strnstr(str, "-F-", 4))
  2772. {
  2773. // framebuf data
  2774. flavor = eFrameBufData;
  2775. }
  2776. else if (strnstr(str, "-X-", 4))
  2777. {
  2778. // DirectX data
  2779. flavor = eDXStuff;
  2780. }
  2781. else if (strnstr(str, "-A-", 4))
  2782. {
  2783. // allocation data
  2784. flavor = eAllocations;
  2785. }
  2786. else if (strnstr(str, "-Z-", 4))
  2787. {
  2788. // allocation data
  2789. flavor = eSlowness;
  2790. }
  2791. else if (str[0] == '<' || str[0] == '>')
  2792. {
  2793. // entry/exit (aka tenure)
  2794. flavor = eTenure;
  2795. }
  2796. else if (strnstr(str, "---", 4)) // note we check four chars worth so you can do >-M- and it will indent and be filterable
  2797. {
  2798. // comment
  2799. flavor = eComment;
  2800. }
  2801. return flavor;
  2802. }
  2803. void GLMPrintfVA( const char *fmt, va_list vargs )
  2804. {
  2805. // if no channels open, return
  2806. uint channelMask = GLMDebugChannelMask();
  2807. if (!channelMask)
  2808. return;
  2809. // if "all flavors" is off, return
  2810. uint flavorMask = GLMDebugFlavorMask();
  2811. if (! ( flavorMask & (1<<eAllFlavors) ) )
  2812. return;
  2813. // characterize the flavor of the string
  2814. // if flavor hits against the flavor mask, print it
  2815. EGLMDebugFlavor flavor = GLMAssessFlavor( (char *)fmt );
  2816. if ( !(flavorMask & (1<<flavor)) )
  2817. return;
  2818. // print the formatted string, with indenting
  2819. // if first char is a '>' - raise indent level after print.
  2820. // if first char is a '<' - lower indent level before print.
  2821. char buf[100000];
  2822. if (fmt[0] == '<')
  2823. {
  2824. GLMIncIndent( -1 );
  2825. }
  2826. memset( buf, '\t', g_glm_indent );
  2827. vsprintf( buf+g_glm_indent, fmt, vargs );
  2828. GLMStringOut( buf );
  2829. if (fmt[0] == '>')
  2830. {
  2831. GLMIncIndent( 1 );
  2832. }
  2833. }
  2834. void GLMPrintf( const char *fmt, ... )
  2835. {
  2836. // if no channels open, return
  2837. uint channelMask = GLMDebugChannelMask();
  2838. if (!channelMask)
  2839. return;
  2840. // if "all flavors" is off, return
  2841. uint flavorMask = GLMDebugFlavorMask();
  2842. if (! ( flavorMask & (1<<eAllFlavors) ) )
  2843. return;
  2844. va_list vargs;
  2845. va_start(vargs, fmt);
  2846. GLMPrintfVA( fmt, vargs );
  2847. va_end( vargs );
  2848. }
  2849. void GLMPrintStr( const char *str, EGLMDebugFlavor flavor ) // will indent
  2850. {
  2851. // if no channels open, return
  2852. uint channelMask = GLMDebugChannelMask();
  2853. if (!channelMask)
  2854. return;
  2855. // if "all flavors" is off, return
  2856. uint flavorMask = GLMDebugFlavorMask();
  2857. if (! ( flavorMask & (1<<eAllFlavors) ) )
  2858. return;
  2859. // if flavor argument hits against the flavor mask, print it
  2860. if ( !(flavorMask & (1<<flavor)) )
  2861. return;
  2862. // just print the plain string, with indenting
  2863. // if first char is a '>' - raise indent level after print.
  2864. // if first char is a '<' - lower indent level before print.
  2865. char buf[64000];
  2866. if (str[0] == '<')
  2867. {
  2868. GLMIncIndent( -1 );
  2869. }
  2870. memset( buf, '\t', g_glm_indent );
  2871. if (strlen(str) < sizeof(buf)-g_glm_indent-1)
  2872. {
  2873. strcpy( buf + g_glm_indent, str );
  2874. }
  2875. else
  2876. {
  2877. DXABSTRACT_BREAK_ON_ERROR();
  2878. }
  2879. GLMStringOut( buf ); // single string out with indenting
  2880. if (str[0] == '>')
  2881. {
  2882. GLMIncIndent( 1 );
  2883. }
  2884. }
  2885. void GLMPrintText( const char *str, EGLMDebugFlavor flavor, uint options )
  2886. {
  2887. // if no channels open, return
  2888. uint channelMask = GLMDebugChannelMask();
  2889. if (!channelMask)
  2890. return;
  2891. // if "all flavors" is off, return
  2892. uint flavorMask = GLMDebugFlavorMask();
  2893. if (! ( flavorMask & (1<<eAllFlavors) ) )
  2894. return;
  2895. // if flavor argument hits against the flavor mask, print it
  2896. if ( !(flavorMask & (1<<flavor)) )
  2897. return;
  2898. char buf[64000];
  2899. char lineout[64000];
  2900. int linenum = 1;
  2901. V_strncpy( buf, str, sizeof(buf) );
  2902. // walk the text and treat each newline as an indentation opportunity..
  2903. const char *mark = buf;
  2904. const char *end = mark + strlen(buf);
  2905. //const char *next = NULL;
  2906. while(mark < end)
  2907. {
  2908. // starting at mark, see if there is a newline between there and end
  2909. char *next = (char*)strchr( mark, '\n' );
  2910. const char *printfrom = mark;
  2911. if (next)
  2912. {
  2913. // print text from mark up through next. move next to char after newline.
  2914. *next = 0;
  2915. mark = next+1;
  2916. }
  2917. else
  2918. {
  2919. // print all text after mark and stop
  2920. mark = end;
  2921. }
  2922. if (options & GLMPRINTTEXT_NUMBEREDLINES)
  2923. {
  2924. sprintf( lineout, "%-5d| %s", linenum, printfrom );
  2925. GLMPrintStr( lineout, flavor );
  2926. linenum++;
  2927. }
  2928. else
  2929. {
  2930. GLMPrintStr( printfrom, flavor );
  2931. }
  2932. }
  2933. }
  2934. int GLMIncIndent( int indentDelta )
  2935. {
  2936. g_glm_indent += indentDelta;
  2937. if (indentDelta>0)
  2938. {
  2939. if (g_glm_indent > g_glm_indent_max)
  2940. {
  2941. g_glm_indent = g_glm_indent_max;
  2942. }
  2943. }
  2944. else
  2945. {
  2946. if (g_glm_indent < 0)
  2947. {
  2948. g_glm_indent = 0;
  2949. }
  2950. }
  2951. return g_glm_indent;
  2952. }
  2953. int GLMGetIndent( void )
  2954. {
  2955. return g_glm_indent;
  2956. }
  2957. void GLMSetIndent( int indent )
  2958. {
  2959. g_glm_indent = indent;
  2960. }
  2961. #endif
  2962. // PIX tracking - you can call these outside of GLMDEBUG=true
  2963. char sg_pPIXName[128];
  2964. #ifndef OSX
  2965. ConVar gl_telemetry_gpu_pipeline_flushing( "gl_telemetry_gpu_pipeline_flushing", "0" );
  2966. class CGPUTimestampManager
  2967. {
  2968. CGPUTimestampManager( const CGPUTimestampManager & );
  2969. CGPUTimestampManager& operator= ( CGPUTimestampManager & );
  2970. public:
  2971. CGPUTimestampManager() :
  2972. m_bInitialized( false ),
  2973. m_nCurFrame( 0 ),
  2974. m_flGPUToCPUOffsetInS( 0 ),
  2975. m_flGPUToS( 0 ),
  2976. m_flRdtscToS( 0 ),
  2977. m_flSToRdtsc( 0 ),
  2978. m_nFreeQueryPoolSize( 0 ),
  2979. m_nOutstandingQueriesHead( 0 ),
  2980. m_nOutstandingQueriesTail( 0 ),
  2981. m_nNumOutstandingQueryZones( 0 ),
  2982. m_nQueryZoneStackSize( 0 ),
  2983. m_nNumFinishedZones( 0 ),
  2984. m_nTotalSpanWorkCount( 0 )
  2985. {
  2986. memset( m_FreeQueryPool, 0, sizeof( m_FreeQueryPool ) ) ;
  2987. memset( m_QueryZoneStack, 0, sizeof( m_QueryZoneStack ) );
  2988. memset( m_OutstandingQueryZones, 0, sizeof( m_OutstandingQueryZones ) );
  2989. memset( m_FinishedZones, 0, sizeof( m_FinishedZones ) );
  2990. }
  2991. ~CGPUTimestampManager()
  2992. {
  2993. Deinit();
  2994. }
  2995. inline bool IsInitialized() const { return m_bInitialized; }
  2996. inline uint GetCurFrame() const { return m_nCurFrame; }
  2997. void Init()
  2998. {
  2999. Deinit();
  3000. memset( m_FreeQueryPool, 0, sizeof( m_FreeQueryPool ) ) ;
  3001. memset( m_QueryZoneStack, 0, sizeof( m_QueryZoneStack ) );
  3002. memset( m_OutstandingQueryZones, 0, sizeof( m_OutstandingQueryZones ) );
  3003. memset( m_FinishedZones, 0, sizeof( m_FinishedZones ) );
  3004. InitRdtsc();
  3005. m_nCurFrame = 0;
  3006. gGL->glGenQueries( cFreeQueryPoolSize, m_FreeQueryPool );
  3007. m_nFreeQueryPoolSize = cFreeQueryPoolSize;
  3008. m_nOutstandingQueriesHead = 0;
  3009. m_nOutstandingQueriesTail = 0;
  3010. m_nNumOutstandingQueryZones = 0;
  3011. m_nQueryZoneStackSize = 0;
  3012. m_nNumFinishedZones = 0;
  3013. m_bInitialized = true;
  3014. m_nTotalSpanWorkCount = 0;
  3015. Calibrate();
  3016. }
  3017. void Calibrate()
  3018. {
  3019. if ( !m_bInitialized )
  3020. return;
  3021. PipelineFlush();
  3022. m_flGPUToS = 1.0 / 1000000000.0;
  3023. //0.99997541250006794;
  3024. //0.99997530000006662;
  3025. // Correction factor to prevent excessive drift, only calibrated on my system, we need a better way of computing/recording this.
  3026. double flGPURatio = 0.99997425000007034000;
  3027. const uint NT = 1;
  3028. for ( uint nTrial = 0; nTrial < NT; nTrial++ )
  3029. {
  3030. const uint R = 16;
  3031. double flClockOffsetsInS[R];
  3032. for ( uint q = 0; q < R; q++)
  3033. {
  3034. uint64 nBestTotalCPUTimestamp = (uint64)-1;
  3035. uint64 nBestCPUTimestamp = 0;
  3036. GLuint64 nBestGPUTimestamp = 0;
  3037. for ( uint i = 0; i < 10; i++)
  3038. {
  3039. const uint64 nStartCPUTimestamp = Plat_Rdtsc();
  3040. gGL->glQueryCounter( m_FreeQueryPool[0], GL_TIMESTAMP);
  3041. PipelineFlush();
  3042. const uint64 nEndCPUTimestamp = Plat_Rdtsc();
  3043. GLint nAvailable;
  3044. do
  3045. {
  3046. gGL->glGetQueryObjectiv( m_FreeQueryPool[0], GL_QUERY_RESULT_AVAILABLE, &nAvailable );
  3047. } while ( !nAvailable );
  3048. GLuint64 nGPUTimestamp;
  3049. gGL->glGetQueryObjectui64v( m_FreeQueryPool[0], GL_QUERY_RESULT, &nGPUTimestamp );
  3050. const uint64 nTotalCPUTimestamp = nEndCPUTimestamp - nStartCPUTimestamp;
  3051. if ( nTotalCPUTimestamp < nBestTotalCPUTimestamp )
  3052. {
  3053. nBestTotalCPUTimestamp = nTotalCPUTimestamp;
  3054. nBestCPUTimestamp = nStartCPUTimestamp;
  3055. nBestGPUTimestamp = nGPUTimestamp;
  3056. }
  3057. }
  3058. double flCPUTimestampTimeInSeconds = nBestCPUTimestamp * m_flRdtscToS;
  3059. double flGPUTimestampTimeInSeconds = nBestGPUTimestamp * m_flGPUToS * flGPURatio;
  3060. flClockOffsetsInS[q] = flCPUTimestampTimeInSeconds - flGPUTimestampTimeInSeconds;
  3061. ThreadSleep(100);
  3062. DbgPrintf("%f %f %1.20f\n", flCPUTimestampTimeInSeconds, flGPUTimestampTimeInSeconds, flClockOffsetsInS[q] );
  3063. }
  3064. m_flGPUToCPUOffsetInS = 0.0f;
  3065. for ( uint i = 0; i < R; i++ )
  3066. m_flGPUToCPUOffsetInS += flClockOffsetsInS[i];
  3067. m_flGPUToCPUOffsetInS /= R;
  3068. if ( NT > 1 )
  3069. {
  3070. DbgPrintf("------- Ratio: %2.20f\n", flGPURatio );
  3071. double flDelta = flClockOffsetsInS[0] - flClockOffsetsInS[R - 1];
  3072. DbgPrintf("------- %1.20f\n", flDelta );
  3073. #if 1
  3074. if ( flDelta < 0.0000005f )
  3075. {
  3076. flGPURatio += .000000125f;
  3077. }
  3078. else if ( flDelta > 0.0000005f )
  3079. {
  3080. flGPURatio -= .000000125f;
  3081. }
  3082. #else
  3083. if ( flDelta < 0.0000005f )
  3084. {
  3085. flGPURatio += .0000000125f;
  3086. }
  3087. else if ( flDelta > 0.0000005f )
  3088. {
  3089. flGPURatio -= .0000000125f;
  3090. }
  3091. #endif
  3092. }
  3093. }
  3094. m_flGPUToS *= flGPURatio;
  3095. #if 0
  3096. // dump drift over time to debugger output
  3097. double flLatency = 0;
  3098. for ( ; ; )
  3099. {
  3100. // test
  3101. const uint64 nStartCPUTime = Plat_Rdtsc();
  3102. gGL->glQueryCounter( m_FreeQueryPool[0], GL_TIMESTAMP);
  3103. PipelineFlush();
  3104. GLint nAvailable;
  3105. do
  3106. {
  3107. gGL->glGetQueryObjectiv( m_FreeQueryPool[0], GL_QUERY_RESULT_AVAILABLE, &nAvailable );
  3108. } while ( !nAvailable );
  3109. GLuint64 nGPUTime;
  3110. gGL->glGetQueryObjectui64v( m_FreeQueryPool[0], GL_QUERY_RESULT, &nGPUTime );
  3111. double flStartGPUTime = ( ( nGPUTime * m_flGPUToS ) + m_flGPUToCPUOffsetInS );
  3112. flLatency = flStartGPUTime - nStartCPUTime * m_flRdtscToS;
  3113. DbgPrintf("%f\n", flLatency );
  3114. }
  3115. #endif
  3116. }
  3117. void Deinit()
  3118. {
  3119. if ( !m_bInitialized )
  3120. return;
  3121. if ( m_nFreeQueryPoolSize )
  3122. {
  3123. gGL->glDeleteQueries( m_nFreeQueryPoolSize, m_FreeQueryPool );
  3124. }
  3125. m_nFreeQueryPoolSize = 0;
  3126. for ( uint i = 0; i < m_nNumOutstandingQueryZones; i++ )
  3127. {
  3128. QueryZone_t &query = m_OutstandingQueryZones[ ( m_nOutstandingQueriesHead + i ) % cMaxQueryZones ];
  3129. if ( query.m_nBeginQuery )
  3130. {
  3131. gGL->glDeleteQueries( 1, &query.m_nBeginQuery );
  3132. }
  3133. if ( query.m_nEndQuery )
  3134. {
  3135. gGL->glDeleteQueries( 1, &query.m_nEndQuery );
  3136. }
  3137. }
  3138. m_nOutstandingQueriesHead = 0;
  3139. m_nOutstandingQueriesTail = 0;
  3140. m_nNumOutstandingQueryZones = 0;
  3141. for ( uint i = 0; i < m_nQueryZoneStackSize; i++ )
  3142. {
  3143. QueryZone_t &query = m_QueryZoneStack[i];
  3144. if ( query.m_nBeginQuery )
  3145. {
  3146. gGL->glDeleteQueries( 1, &query.m_nBeginQuery );
  3147. }
  3148. if ( query.m_nEndQuery )
  3149. {
  3150. gGL->glDeleteQueries( 1, &query.m_nEndQuery );
  3151. }
  3152. }
  3153. m_nQueryZoneStackSize = 0;
  3154. m_flGPUToCPUOffsetInS = 0;
  3155. m_flGPUToS = 0;
  3156. m_flRdtscToS = 0;
  3157. m_flSToRdtsc = 0;
  3158. m_bInitialized = false;
  3159. }
  3160. // pName is assumed to be a telemetry dynamic string!
  3161. void BeginZone( const char *pName )
  3162. {
  3163. if ( !m_bInitialized )
  3164. return;
  3165. if ( m_nQueryZoneStackSize >= cMaxQueryZoneStackSize )
  3166. {
  3167. Panic( "Increase cMaxQueryZoneStackSize!" );
  3168. }
  3169. QueryZone_t &zone = m_QueryZoneStack[m_nQueryZoneStackSize];
  3170. zone.m_pName = pName;
  3171. zone.m_nBeginQuery = AllocQueryHandle();
  3172. zone.m_nEndQuery = 0;
  3173. zone.m_nStackLevel = m_nQueryZoneStackSize;
  3174. zone.m_nTotalGPUWorkCount = g_nTotalDrawsOrClears;
  3175. #if GL_TELEMETRY_GPU_ZONES
  3176. zone.m_nTotalGPUWorkCount += g_TelemetryGPUStats.GetTotal();
  3177. #endif
  3178. gGL->glQueryCounter( m_QueryZoneStack[m_nQueryZoneStackSize].m_nBeginQuery, GL_TIMESTAMP );
  3179. m_nQueryZoneStackSize++;
  3180. }
  3181. void EndZone()
  3182. {
  3183. if ( !m_bInitialized )
  3184. return;
  3185. if ( ( !m_nQueryZoneStackSize ) || ( m_nNumOutstandingQueryZones == cMaxQueryZones ) )
  3186. {
  3187. Panic( "Query zone error!" );
  3188. }
  3189. m_nQueryZoneStackSize--;
  3190. uint nCurGPUWorkCount = g_nTotalDrawsOrClears;
  3191. #if GL_TELEMETRY_GPU_ZONES
  3192. nCurGPUWorkCount += g_TelemetryGPUStats.GetTotal();
  3193. #endif
  3194. uint nTotalDraws = nCurGPUWorkCount - m_QueryZoneStack[m_nQueryZoneStackSize].m_nTotalGPUWorkCount;
  3195. m_QueryZoneStack[m_nQueryZoneStackSize].m_nEndQuery = AllocQueryHandle();
  3196. gGL->glQueryCounter( m_QueryZoneStack[m_nQueryZoneStackSize].m_nEndQuery, GL_TIMESTAMP );
  3197. m_QueryZoneStack[m_nQueryZoneStackSize].m_nTotalGPUWorkCount = nTotalDraws;
  3198. m_OutstandingQueryZones[m_nOutstandingQueriesHead] = m_QueryZoneStack[m_nQueryZoneStackSize];
  3199. m_nOutstandingQueriesHead = ( m_nOutstandingQueriesHead + 1 ) % cMaxQueryZones;
  3200. m_nNumOutstandingQueryZones++;
  3201. COMPILE_TIME_ASSERT( ( int )cMaxQueryZones > ( int )cMaxQueryZoneStackSize );
  3202. if ( m_nNumOutstandingQueryZones >= ( cMaxQueryZones - cMaxQueryZoneStackSize ) )
  3203. {
  3204. tmMessage( TELEMETRY_LEVEL2, TMMF_ICON_NOTE | TMMF_SEVERITY_WARNING, "CGPUTimestampManager::EndZone: Too many outstanding query zones - forcing a pipeline flush! This is probably expensive." );
  3205. FlushOutstandingQueries( true );
  3206. }
  3207. if ( gl_telemetry_gpu_pipeline_flushing.GetBool() )
  3208. {
  3209. PipelineFlush();
  3210. }
  3211. }
  3212. void Tick()
  3213. {
  3214. m_nCurFrame++;
  3215. if ( !m_bInitialized )
  3216. return;
  3217. if ( m_nQueryZoneStackSize > 0 )
  3218. {
  3219. Panic( "Zone stack is not empty!" );
  3220. }
  3221. FlushOutstandingQueries( false );
  3222. tmMessage( TELEMETRY_LEVEL2, 0, "Total PIX timespan GPU work count: %u", m_nTotalSpanWorkCount );
  3223. m_nTotalSpanWorkCount = 0;
  3224. }
  3225. void FlushOutstandingQueries( bool bForce )
  3226. {
  3227. tmZone( TELEMETRY_LEVEL2, 0, "FlushOutstandingQueries: %u", m_nNumOutstandingQueryZones );
  3228. if ( bForce )
  3229. {
  3230. PipelineFlush();
  3231. }
  3232. while ( m_nNumOutstandingQueryZones )
  3233. {
  3234. QueryZone_t &zone = m_OutstandingQueryZones[m_nOutstandingQueriesTail];
  3235. GLint nEndAvailable = 0;
  3236. do
  3237. {
  3238. gGL->glGetQueryObjectiv( zone.m_nEndQuery, GL_QUERY_RESULT_AVAILABLE, &nEndAvailable );
  3239. } while ( ( bForce ) && ( nEndAvailable == 0 ) );
  3240. if ( !nEndAvailable )
  3241. {
  3242. if ( bForce )
  3243. {
  3244. Panic( "Query results not available after a full pipeline flush!" );
  3245. }
  3246. break;
  3247. }
  3248. GLuint64 nBeginGPUTime, nEndGPUTime;
  3249. gGL->glGetQueryObjectui64v( zone.m_nBeginQuery, GL_QUERY_RESULT, &nBeginGPUTime );
  3250. gGL->glGetQueryObjectui64v( zone.m_nEndQuery, GL_QUERY_RESULT, &nEndGPUTime );
  3251. ReleaseQueryHandle( zone.m_nBeginQuery );
  3252. zone.m_nBeginQuery = 0;
  3253. ReleaseQueryHandle( zone.m_nEndQuery );
  3254. zone.m_nEndQuery = 0;
  3255. if ( m_nNumFinishedZones >= cMaxQueryZones )
  3256. {
  3257. Panic( "Too many finished zones!" );
  3258. }
  3259. FinishedQueryZone_t &finishedZone = m_FinishedZones[m_nNumFinishedZones];
  3260. finishedZone.m_pName = zone.m_pName;
  3261. finishedZone.m_nBeginGPUTime = nBeginGPUTime;
  3262. finishedZone.m_nEndGPUTime = nEndGPUTime;
  3263. finishedZone.m_nStackLevel = zone.m_nStackLevel;
  3264. finishedZone.m_nTotalGPUWorkCount = zone.m_nTotalGPUWorkCount;
  3265. m_nNumFinishedZones++;
  3266. if ( !zone.m_nStackLevel )
  3267. {
  3268. std::sort( m_FinishedZones, m_FinishedZones + m_nNumFinishedZones );
  3269. FlushFinishedZones();
  3270. m_nNumFinishedZones = 0;
  3271. }
  3272. m_nOutstandingQueriesTail = ( m_nOutstandingQueriesTail + 1 ) % cMaxQueryZones;
  3273. m_nNumOutstandingQueryZones--;
  3274. }
  3275. }
  3276. private:
  3277. bool m_bInitialized;
  3278. uint m_nCurFrame;
  3279. double m_flGPUToCPUOffsetInS;
  3280. double m_flGPUToS;
  3281. double m_flRdtscToS;
  3282. double m_flSToRdtsc;
  3283. enum { cMaxQueryZones = 4096, cFreeQueryPoolSize = cMaxQueryZones * 2 };
  3284. GLuint m_FreeQueryPool[cFreeQueryPoolSize ];
  3285. uint m_nFreeQueryPoolSize;
  3286. GLuint AllocQueryHandle()
  3287. {
  3288. if ( !m_nFreeQueryPoolSize )
  3289. {
  3290. Panic( "Out of query handles!");
  3291. }
  3292. return m_FreeQueryPool[--m_nFreeQueryPoolSize];
  3293. }
  3294. void ReleaseQueryHandle( GLuint nHandle )
  3295. {
  3296. if ( m_nFreeQueryPoolSize >= cFreeQueryPoolSize )
  3297. {
  3298. Panic( "Query handle error!" );
  3299. }
  3300. m_FreeQueryPool[m_nFreeQueryPoolSize++] = nHandle;
  3301. }
  3302. struct QueryZone_t
  3303. {
  3304. const char *m_pName;
  3305. GLuint m_nBeginQuery;
  3306. GLuint m_nEndQuery;
  3307. uint m_nStackLevel;
  3308. uint m_nTotalGPUWorkCount;
  3309. };
  3310. QueryZone_t m_OutstandingQueryZones[cMaxQueryZones];
  3311. uint m_nOutstandingQueriesHead; // index of first outstanding query (oldest)
  3312. uint m_nOutstandingQueriesTail; // index where next query goes (newest)
  3313. uint m_nNumOutstandingQueryZones;
  3314. enum { cMaxQueryZoneStackSize = 256 };
  3315. QueryZone_t m_QueryZoneStack[cMaxQueryZoneStackSize];
  3316. uint m_nQueryZoneStackSize;
  3317. struct FinishedQueryZone_t
  3318. {
  3319. const char *m_pName;
  3320. GLuint64 m_nBeginGPUTime;
  3321. GLuint64 m_nEndGPUTime;
  3322. uint m_nStackLevel;
  3323. uint m_nTotalGPUWorkCount;
  3324. inline bool operator< ( const FinishedQueryZone_t &rhs ) const
  3325. {
  3326. if ( m_nBeginGPUTime == rhs.m_nBeginGPUTime)
  3327. return m_nStackLevel < rhs.m_nStackLevel;
  3328. return m_nBeginGPUTime < rhs.m_nBeginGPUTime;
  3329. }
  3330. };
  3331. FinishedQueryZone_t m_FinishedZones[cMaxQueryZones];
  3332. uint m_nNumFinishedZones;
  3333. uint m_nTotalSpanWorkCount;
  3334. void InitRdtsc()
  3335. {
  3336. m_flRdtscToS = 0.0f;
  3337. m_flSToRdtsc = 0.0f;
  3338. for ( uint i = 0; i < 10; i++ )
  3339. {
  3340. uint64 t0 = Plat_Rdtsc();
  3341. double d0 = Plat_FloatTime();
  3342. ThreadSleep( 250 );
  3343. uint64 t1 = Plat_Rdtsc();
  3344. double d1 = Plat_FloatTime();
  3345. double flRdtscToS = ( d1 - d0 ) / ( t1 - t0 );
  3346. double flSToRdtsc = ( t1 - t0 ) / ( d1 - d0 );
  3347. if ( flSToRdtsc > m_flSToRdtsc )
  3348. {
  3349. m_flRdtscToS = flRdtscToS;
  3350. m_flSToRdtsc = flSToRdtsc;
  3351. }
  3352. }
  3353. }
  3354. void PipelineFlush()
  3355. {
  3356. #ifdef HAVE_GL_ARB_SYNC
  3357. GLsync nSyncObj = gGL->glFenceSync( GL_SYNC_GPU_COMMANDS_COMPLETE, 0 );
  3358. if ( nSyncObj )
  3359. {
  3360. gGL->glClientWaitSync( nSyncObj, GL_SYNC_FLUSH_COMMANDS_BIT, 300000000000ULL );
  3361. gGL->glDeleteSync( nSyncObj );
  3362. }
  3363. #endif
  3364. }
  3365. inline void NewTimeSpan( uint64 nStartGPUTime, uint64 nEndGPUTime, const char *pName, uint nTotalDraws )
  3366. {
  3367. // apparently we must use level0 for timespans?
  3368. tmBeginTimeSpanAt( TELEMETRY_LEVEL0, 1, 0, nStartGPUTime, "%s [C:%u]", pName ? pName : "", nTotalDraws );
  3369. tmEndTimeSpanAt( TELEMETRY_LEVEL0, 1, 0, nEndGPUTime, "%s [C:%u]", pName ? pName : "", nTotalDraws );
  3370. }
  3371. void FlushFinishedZones()
  3372. {
  3373. for ( uint i = 0; i < m_nNumFinishedZones; i++ )
  3374. {
  3375. FinishedQueryZone_t &zone = m_FinishedZones[i];
  3376. if ( !zone.m_nTotalGPUWorkCount )
  3377. continue;
  3378. bool bEmit = false;
  3379. if ( i == ( m_nNumFinishedZones - 1 ) )
  3380. bEmit = true;
  3381. else
  3382. {
  3383. FinishedQueryZone_t &nextZone = m_FinishedZones[i + 1];
  3384. bEmit = zone.m_nEndGPUTime <= nextZone.m_nBeginGPUTime;
  3385. }
  3386. if ( bEmit )
  3387. {
  3388. uint64 nStartGPUTime = ( ( zone.m_nBeginGPUTime * m_flGPUToS ) + m_flGPUToCPUOffsetInS ) * m_flSToRdtsc;
  3389. uint64 nEndGPUTime = ( ( zone.m_nEndGPUTime * m_flGPUToS ) + m_flGPUToCPUOffsetInS ) * m_flSToRdtsc;
  3390. NewTimeSpan( nStartGPUTime, nEndGPUTime, zone.m_pName, zone.m_nTotalGPUWorkCount );
  3391. m_nTotalSpanWorkCount += zone.m_nTotalGPUWorkCount;
  3392. }
  3393. }
  3394. }
  3395. void Panic( const char *pMsg )
  3396. {
  3397. DXABSTRACT_BREAK_ON_ERROR();
  3398. Error( "%s", pMsg );
  3399. }
  3400. static void DbgPrintf( const char *pFmt, ... )
  3401. {
  3402. va_list vargs;
  3403. va_start( vargs, pFmt );
  3404. char buf[1024];
  3405. V_vsnprintf( buf, sizeof( buf ), pFmt, vargs );
  3406. #ifdef WIN32
  3407. OutputDebugStringA( buf );
  3408. #else
  3409. printf( "%s", buf );
  3410. #endif
  3411. va_end( vargs );
  3412. }
  3413. };
  3414. static CGPUTimestampManager g_GPUTimestampManager;
  3415. void GLMGPUTimestampManagerInit()
  3416. {
  3417. g_GPUTimestampManager.Init();
  3418. }
  3419. void GLMGPUTimestampManagerDeinit()
  3420. {
  3421. g_GPUTimestampManager.Deinit();
  3422. }
  3423. ConVar gl_telemetry_gpu( "gl_telemetry_gpu", "0" );
  3424. static bool g_bPrevTelemetryGPU;
  3425. void GLMGPUTimestampManagerTick()
  3426. {
  3427. if ( g_bPrevTelemetryGPU != gl_telemetry_gpu.GetBool() )
  3428. {
  3429. if ( !gl_telemetry_gpu.GetBool() )
  3430. g_GPUTimestampManager.Deinit();
  3431. else
  3432. {
  3433. #if !PIX_ENABLE || !GL_TELEMETRY_GPU_ZONES
  3434. ConMsg( "Must define PIX_ENABLE and GL_TELEMETRY_GPU_ZONES to use this feature" );
  3435. #else
  3436. g_GPUTimestampManager.Init();
  3437. #endif
  3438. }
  3439. g_bPrevTelemetryGPU = gl_telemetry_gpu.GetBool();
  3440. }
  3441. g_GPUTimestampManager.Tick();
  3442. }
  3443. #endif // !OSX
  3444. static uint g_nPIXEventIndex;
  3445. void GLMBeginPIXEvent( const char *str )
  3446. {
  3447. #ifndef OSX
  3448. char szName[1024];
  3449. V_snprintf( szName, sizeof( szName ), "[ID:%u FR:%u] %s", g_nPIXEventIndex, g_GPUTimestampManager.GetCurFrame(), str );
  3450. const char *p = tmDynamicString( TELEMETRY_LEVEL2, szName ); //p can be null if tm is getting shut down
  3451. tmEnter( TELEMETRY_LEVEL2, TMZF_NONE, "PIX %s", p ? p : "" );
  3452. g_nPIXEventIndex++;
  3453. g_GPUTimestampManager.BeginZone( p );
  3454. #endif // !OSX
  3455. V_strncpy( sg_pPIXName, str, 128 );
  3456. #if defined( OSX ) && defined( CGLPROFILER_ENABLE )
  3457. CGLSetOption( kCGLGOComment, (GLint)sg_pPIXName );
  3458. #endif
  3459. if ( gGL->m_bHave_GL_GREMEDY_string_marker )
  3460. {
  3461. gGL->glStringMarkerGREMEDY( 0, sg_pPIXName );
  3462. }
  3463. }
  3464. void GLMEndPIXEvent( void )
  3465. {
  3466. #ifndef OSX
  3467. g_GPUTimestampManager.EndZone();
  3468. #endif
  3469. #if defined( OSX ) && defined( CGLPROFILER_ENABLE )
  3470. CGLSetOption( kCGLGOComment, (GLint)sg_pPIXName );
  3471. #endif
  3472. if ( gGL->m_bHave_GL_GREMEDY_string_marker )
  3473. {
  3474. gGL->glStringMarkerGREMEDY( 0, sg_pPIXName );
  3475. }
  3476. sg_pPIXName[0] = '\0';
  3477. tmLeave( TELEMETRY_LEVEL2 );
  3478. }
  3479. //===============================================================================
  3480. // Knob - hash table mapping string names to float values
  3481. struct GLMKnobKey
  3482. {
  3483. char *m_knobName;
  3484. };
  3485. struct GLMKnobValue
  3486. {
  3487. float m_value;
  3488. };
  3489. bool LessFunc_GLMKnobKey( const GLMKnobKey &a, const GLMKnobKey &b )
  3490. {
  3491. // Umm, what should this really be?
  3492. //return strcmp( a.m_knobName, b.m_knobName );
  3493. return strcmp( a.m_knobName, b.m_knobName ) < 0;
  3494. }
  3495. CUtlMap< GLMKnobKey, GLMKnobValue* > *g_knobMap = NULL;
  3496. // add some special knob-names that just read mod keys
  3497. extern "C" uint GetCurrentKeyModifiers( void );
  3498. enum ECarbonModKeyIndex
  3499. {
  3500. EcmdKeyBit = 8, /* command key down?*/
  3501. EshiftKeyBit = 9, /* shift key down?*/
  3502. EalphaLockBit = 10, /* alpha lock down?*/
  3503. EoptionKeyBit = 11, /* option key down?*/
  3504. EcontrolKeyBit = 12 /* control key down?*/
  3505. };
  3506. enum ECarbonModKeyMask
  3507. {
  3508. EcmdKey = 1 << EcmdKeyBit,
  3509. EshiftKey = 1 << EshiftKeyBit,
  3510. EalphaLock = 1 << EalphaLockBit,
  3511. EoptionKey = 1 << EoptionKeyBit,
  3512. EcontrolKey = 1 << EcontrolKeyBit
  3513. };
  3514. float GLMKnob( char *knobname, float *setvalue )
  3515. {
  3516. #if GLMDEBUG
  3517. float result = 0.0f;
  3518. if (!g_knobMap)
  3519. {
  3520. g_knobMap = new CUtlMap< GLMKnobKey, GLMKnobValue* >;
  3521. g_knobMap->SetLessFunc( LessFunc_GLMKnobKey );
  3522. }
  3523. #ifdef OSX
  3524. uint mods = GetCurrentKeyModifiers();
  3525. #else
  3526. uint mods = 0;
  3527. #endif
  3528. // is it a special key name ?
  3529. if (!strcmp(knobname,"caps-key"))
  3530. {
  3531. return (mods & (EalphaLock)) ? 1.0 : 0.0;
  3532. }
  3533. else if (!strcmp(knobname,"control-key"))
  3534. {
  3535. return (mods & (EcontrolKey)) ? 1.0 : 0.0;
  3536. }
  3537. else if (!strcmp(knobname,"shift-key"))
  3538. {
  3539. return (mods & (EshiftKey)) ? 1.0 : 0.0;
  3540. }
  3541. else if (!strcmp(knobname,"option-key"))
  3542. {
  3543. return (mods & (EoptionKey)) ? 1.0 : 0.0;
  3544. }
  3545. else
  3546. {
  3547. // does the key exist in the map ?
  3548. GLMKnobKey key;
  3549. key.m_knobName = knobname;
  3550. GLMKnobValue *knob = NULL;
  3551. unsigned short index = g_knobMap->Find( key );
  3552. if (index != g_knobMap->InvalidIndex())
  3553. {
  3554. // found it
  3555. knob = (*g_knobMap)[ index ];
  3556. if (setvalue)
  3557. {
  3558. knob->m_value = *setvalue;
  3559. }
  3560. result = knob->m_value;
  3561. }
  3562. else
  3563. {
  3564. // need to make a new one
  3565. knob = new GLMKnobValue;
  3566. knob->m_value = (setvalue) ? *setvalue : 0.0f;
  3567. g_knobMap->Insert( key, knob );
  3568. }
  3569. return knob->m_value;
  3570. }
  3571. #else
  3572. // GLM knobs just return 0.0 all the time when no GLMDEBUG
  3573. return 0.0f;
  3574. #endif
  3575. }
  3576. // for boolean knobs..
  3577. float GLMKnobToggle( char *knobname )
  3578. {
  3579. // if not 0.0, make it 0.0
  3580. // if 0.0, make it 1.0
  3581. float newValue = 0.0; // assume falling edge
  3582. float curValue = GLMKnob( knobname, NULL );
  3583. if (curValue == 0.0)
  3584. {
  3585. newValue = 1.0;
  3586. }
  3587. return GLMKnob( knobname, &newValue );
  3588. }
  3589. //===============================================================================
  3590. // helpers for CGLSetOption - no op if no profiler
  3591. void GLMProfilerClearTrace( void )
  3592. {
  3593. #if defined( OSX ) && defined( CGLPROFILER_ENABLE )
  3594. CGLSetOption( kCGLGOResetFunctionTrace, 0 );
  3595. #else
  3596. Assert( !"impl me" );
  3597. #endif
  3598. }
  3599. void GLMProfilerEnableTrace( bool enable )
  3600. {
  3601. #if defined( OSX ) && defined( CGLPROFILER_ENABLE )
  3602. CGLSetOption( kCGLGOEnableFunctionTrace, enable ? GL_TRUE : GL_FALSE );
  3603. #else
  3604. Assert( !"impl me" );
  3605. #endif
  3606. }
  3607. // helpers for CGLSetParameter - no op if no profiler
  3608. void GLMProfilerDumpState( void )
  3609. {
  3610. #if defined( OSX ) && defined( CGLPROFILER_ENABLE )
  3611. CGLContextObj curr = CGLGetCurrentContext();
  3612. CGLSetParameter( curr, kCGLCPDumpState, (const GLint*)1 );
  3613. #else
  3614. Assert( !"impl me" );
  3615. #endif
  3616. }
  3617. //===============================================================================
  3618. CGLMFileMirror::CGLMFileMirror( char *fullpath )
  3619. {
  3620. m_path = strdup( fullpath );
  3621. m_data = (char *)malloc(1);
  3622. m_size = 0;
  3623. UpdateStatInfo();
  3624. if (m_exists)
  3625. {
  3626. ReadFile();
  3627. }
  3628. }
  3629. CGLMFileMirror::~CGLMFileMirror( )
  3630. {
  3631. if (m_path)
  3632. {
  3633. free (m_path);
  3634. m_path = NULL;
  3635. }
  3636. if (m_data)
  3637. {
  3638. free (m_data);
  3639. m_data = NULL;
  3640. }
  3641. }
  3642. bool CGLMFileMirror::HasData( void )
  3643. {
  3644. return (m_size != 0);
  3645. }
  3646. // return direct pointer to buffer. Will be invalidated if file is re-loaded or if data is written to
  3647. void CGLMFileMirror::GetData( char **dataPtr, uint *dataSizePtr )
  3648. {
  3649. *dataPtr = m_data;
  3650. *dataSizePtr = m_size;
  3651. }
  3652. void CGLMFileMirror::SetData( char *data, uint dataSize )
  3653. {
  3654. if (m_data)
  3655. {
  3656. free( m_data );
  3657. m_data = NULL;
  3658. }
  3659. m_size = dataSize;
  3660. m_data = (char *)malloc( m_size +1 );
  3661. m_data[ m_size ] = 0; // extra NULL terminator, no charge
  3662. memcpy( m_data, data, m_size ); // copy data in
  3663. WriteFile(); // keep disk copy sync'd
  3664. }
  3665. static bool stat_diff( struct stat *a, struct stat *b )
  3666. {
  3667. if (a->st_size != b->st_size)
  3668. {
  3669. return true;
  3670. }
  3671. #ifdef OSX
  3672. if (memcmp( &a->st_mtimespec, &b->st_mtimespec, sizeof( struct timespec ) ) )
  3673. #else
  3674. if (memcmp( &a->st_mtime, &b->st_mtime, sizeof( time_t ) ) )
  3675. #endif
  3676. {
  3677. return true;
  3678. }
  3679. return false;
  3680. }
  3681. bool CGLMFileMirror::PollForChanges( void )
  3682. {
  3683. // snapshot old stat
  3684. //bool old_exists = m_exists;
  3685. struct stat old_stat = m_stat;
  3686. UpdateStatInfo();
  3687. if (m_exists)
  3688. {
  3689. if ( stat_diff( &old_stat, &m_stat ) )
  3690. {
  3691. // initial difference detected. continue to poll at 0.1s intervals until it stops changing, then read it.
  3692. int stablecount = 0;
  3693. do
  3694. {
  3695. ThreadSleep(100000);
  3696. struct stat last_stat = m_stat;
  3697. UpdateStatInfo();
  3698. if (stat_diff( &last_stat, &m_stat ))
  3699. {
  3700. stablecount = 0;
  3701. }
  3702. else
  3703. {
  3704. stablecount++;
  3705. }
  3706. } while(stablecount<3);
  3707. // changes have settled down, now re-read it
  3708. ReadFile();
  3709. return true;
  3710. }
  3711. else
  3712. {
  3713. return false; // no change
  3714. }
  3715. }
  3716. else
  3717. {
  3718. // file does not exist. remake it. not considered to be a change.
  3719. WriteFile();
  3720. return false;
  3721. }
  3722. }
  3723. void CGLMFileMirror::UpdateStatInfo( void )
  3724. {
  3725. // stat the path
  3726. struct stat newstat;
  3727. memset (&newstat, 0, sizeof(newstat) );
  3728. int result = stat( m_path, &newstat );
  3729. if (!result)
  3730. {
  3731. m_exists = true;
  3732. m_stat = newstat;
  3733. }
  3734. else
  3735. {
  3736. m_exists = false;
  3737. memset( &m_stat, 0, sizeof( m_stat ) );
  3738. }
  3739. }
  3740. void CGLMFileMirror::ReadFile( void )
  3741. {
  3742. // unconditional - we discard any old buffer, make a new one,
  3743. UpdateStatInfo();
  3744. if (m_data)
  3745. {
  3746. free( m_data );
  3747. m_data = NULL;
  3748. }
  3749. if (m_exists)
  3750. {
  3751. FILE *infile = fopen( m_path, "rb" );
  3752. if (infile)
  3753. {
  3754. // get size from stat
  3755. m_size = m_stat.st_size;
  3756. m_data = (char *)malloc( m_size +1 );
  3757. m_data[ m_size ] = 0; // extra NULL terminator, no charge
  3758. fread( m_data, 1, m_size, infile );
  3759. fclose( infile );
  3760. }
  3761. else
  3762. {
  3763. GLMDebugger(); // ouch
  3764. }
  3765. }
  3766. else
  3767. {
  3768. // hmmmmmm
  3769. m_data = (char *)malloc(1);
  3770. m_data[0] = 0;
  3771. m_size = 0;
  3772. }
  3773. }
  3774. void CGLMFileMirror::WriteFile( void )
  3775. {
  3776. FILE *outfile = fopen( m_path, "wb" );
  3777. if (outfile)
  3778. {
  3779. fwrite( m_data, 1, m_size, outfile );
  3780. fclose( outfile );
  3781. UpdateStatInfo(); // sets m_stat and m_exists
  3782. }
  3783. else
  3784. {
  3785. GLMDebugger(); // ouch
  3786. }
  3787. }
  3788. void CGLMFileMirror::OpenInEditor( bool foreground )
  3789. {
  3790. char temp[64000];
  3791. // pass -b if no desire to bring editor to foreground
  3792. sprintf(temp,"/usr/bin/bbedit %s %s", foreground ? "" : "-b", m_path );
  3793. system( temp );
  3794. }
  3795. CGLMEditableTextItem::CGLMEditableTextItem( char *text, uint size, bool forceOverwrite, char *prefix, char *suffix )
  3796. {
  3797. // clone input text (exact size copy)
  3798. m_origSize = size;
  3799. m_origText = (char *)malloc( m_origSize );
  3800. memcpy( m_origText, text, m_origSize );
  3801. // null out munged form til we generate it
  3802. m_mungedSize = 0;
  3803. m_mungedText = NULL;
  3804. // null out mirror until we create it
  3805. m_mirrorBaseName = NULL;
  3806. m_mirrorFullPath = NULL;
  3807. m_mirror = NULL;
  3808. GenHashOfOrigText(); // will fill out m_origDigest
  3809. GenMungedText( false );
  3810. GenBaseNameAndFullPath( prefix, suffix ); // figure out where the mirror will go
  3811. if (!strcmp(m_mirrorBaseName, "96c7e9d2faf76b1148f7274afd684d4b.fsh"))
  3812. {
  3813. printf("\nhello there\n");
  3814. }
  3815. // make the mirror from the filename.
  3816. // see if there was any content on disk
  3817. // if so, honor that content *unless* the force-option is set.
  3818. m_mirror = new CGLMFileMirror( m_mirrorFullPath );
  3819. // the logic is simple.
  3820. // the only time we will choose the copy on disk, is if
  3821. // a - forceOverwrite is false
  3822. // AND b - the copy on disk is bigger than 10 bytes.
  3823. bool replaceDiskCopy = true;
  3824. char *mirrorData = NULL;
  3825. uint mirrorSize = 0;
  3826. if (!forceOverwrite)
  3827. {
  3828. if (m_mirror->HasData())
  3829. {
  3830. // peek at it, and use it if it is more than some minimum number of bytes.
  3831. m_mirror->GetData( &mirrorData, &mirrorSize );
  3832. if (mirrorSize > 10)
  3833. {
  3834. replaceDiskCopy = false;
  3835. }
  3836. }
  3837. }
  3838. if (replaceDiskCopy)
  3839. {
  3840. // push our generated data to the mirror - disk copy is overwritten
  3841. m_mirror->SetData( m_mungedText, m_mungedSize );
  3842. }
  3843. else
  3844. {
  3845. GenMungedText( true );
  3846. }
  3847. }
  3848. CGLMEditableTextItem::~CGLMEditableTextItem( )
  3849. {
  3850. if (m_origText)
  3851. {
  3852. free (m_origText);
  3853. }
  3854. if (m_mungedText)
  3855. {
  3856. free (m_mungedText);
  3857. }
  3858. if (m_mirrorBaseName)
  3859. {
  3860. free (m_mirrorBaseName);
  3861. }
  3862. if (m_mirrorFullPath)
  3863. {
  3864. free (m_mirrorFullPath);
  3865. }
  3866. if (m_mirror)
  3867. {
  3868. free( m_mirror );
  3869. }
  3870. }
  3871. bool CGLMEditableTextItem::HasData( void )
  3872. {
  3873. return m_mirror->HasData();
  3874. }
  3875. bool CGLMEditableTextItem::PollForChanges( void )
  3876. {
  3877. bool changed = m_mirror->PollForChanges();
  3878. if (changed)
  3879. {
  3880. // re-gen munged text from mirror (means "copy")
  3881. GenMungedText( true );
  3882. }
  3883. return changed;
  3884. }
  3885. void CGLMEditableTextItem::GetCurrentText( char **textOut, uint *sizeOut )
  3886. {
  3887. if (!m_mungedText) GLMDebugger();
  3888. *textOut = m_mungedText;
  3889. *sizeOut = m_mungedSize;
  3890. }
  3891. void CGLMEditableTextItem::OpenInEditor( bool foreground )
  3892. {
  3893. m_mirror->OpenInEditor( foreground );
  3894. }
  3895. void CGLMEditableTextItem::GenHashOfOrigText( void )
  3896. {
  3897. MD5Context_t md5ctx;
  3898. MD5Init( &md5ctx );
  3899. MD5Update( &md5ctx, (unsigned char*)m_origText, m_origSize );
  3900. MD5Final( m_origDigest, &md5ctx );
  3901. }
  3902. void CGLMEditableTextItem::GenBaseNameAndFullPath( char *prefix, char *suffix )
  3903. {
  3904. // base name is hash digest in hex, plus the suffix.
  3905. char temp[5000];
  3906. Q_binarytohex( m_origDigest, sizeof(m_origDigest), temp, sizeof( temp ) );
  3907. if (suffix)
  3908. {
  3909. strcat( temp, suffix );
  3910. }
  3911. if (m_mirrorBaseName) free(m_mirrorBaseName);
  3912. m_mirrorBaseName = strdup( temp );
  3913. sprintf( temp, "%s%s", prefix, m_mirrorBaseName );
  3914. if (m_mirrorFullPath) free(m_mirrorFullPath);
  3915. m_mirrorFullPath = strdup( temp );
  3916. }
  3917. void CGLMEditableTextItem::GenMungedText( bool fromMirror )
  3918. {
  3919. if (fromMirror)
  3920. {
  3921. // just import the text as is from the mirror file.
  3922. char *mirrorData = NULL;
  3923. uint mirrorSize = 0;
  3924. if (m_mirror->HasData())
  3925. {
  3926. // peek at it, and use it if it is more than some minimum number of bytes.
  3927. m_mirror->GetData( &mirrorData, &mirrorSize );
  3928. if (m_mungedText)
  3929. {
  3930. free( m_mungedText );
  3931. m_mungedText = NULL;
  3932. }
  3933. m_mungedText = (char *)malloc( mirrorSize+1 );
  3934. m_mungedText[ mirrorSize ] = 0;
  3935. memcpy( m_mungedText, mirrorData, mirrorSize );
  3936. m_mungedSize = mirrorSize;
  3937. }
  3938. else
  3939. {
  3940. GLMDebugger();
  3941. }
  3942. }
  3943. else
  3944. {
  3945. #if 1
  3946. // we don't actually clone/munge any more.
  3947. if (m_mungedText)
  3948. {
  3949. free( m_mungedText );
  3950. m_mungedText = NULL;
  3951. }
  3952. m_mungedText = (char *)malloc( m_origSize+1 );
  3953. m_mungedText[ m_origSize ] = 0;
  3954. memcpy( m_mungedText, m_origText, m_origSize );
  3955. m_mungedSize = m_origSize;
  3956. #else
  3957. // take pure 'orig' text that came in from the engine, and clone it
  3958. // do not clone the first line
  3959. char temp[100000];
  3960. char *dst = temp;
  3961. char *lim = &temp[ sizeof(temp) ];
  3962. // zero temp
  3963. memset( temp, 0, sizeof(temp) );
  3964. // write orig text to temp
  3965. if (m_origSize >= (sizeof(temp)/2) )
  3966. {
  3967. GLMDebugger();
  3968. }
  3969. memcpy( dst, m_origText, m_origSize );
  3970. dst += m_origSize;
  3971. // add a newline if the last character wasn't
  3972. if ( (*(dst-1)) != '\n' )
  3973. {
  3974. *dst++ = '\n';
  3975. }
  3976. // walk orig text again and copy it over, with these caveats
  3977. // don't copy the first line
  3978. // insert a # before all the other lines.
  3979. char *src = temp;
  3980. // walk to end of first line
  3981. char *firstNewline = strchr( src, '\n' );
  3982. if (!firstNewline)
  3983. {
  3984. GLMDebugger();
  3985. }
  3986. else
  3987. {
  3988. // advance 'src' to that newline- we're not copying the !! line
  3989. src = firstNewline;
  3990. }
  3991. // now walk the rest - insert a # after each newline
  3992. while( (dst < lim) && ((src-temp) < m_origSize) )
  3993. {
  3994. switch( *src )
  3995. {
  3996. case '\n':
  3997. *dst++ = *src++;
  3998. *dst++ = '#';
  3999. break;
  4000. default:
  4001. *dst++ = *src++;
  4002. }
  4003. }
  4004. if (dst >= lim)
  4005. {
  4006. GLMDebugger();
  4007. }
  4008. // final newline
  4009. *dst++ = '\n';
  4010. // copyout
  4011. if (m_mungedText)
  4012. {
  4013. free( m_mungedText );
  4014. m_mungedText = NULL;
  4015. }
  4016. m_mungedSize = dst - temp;
  4017. m_mungedText = (char *)malloc( m_mungedSize );
  4018. memcpy( m_mungedText, temp, m_mungedSize );
  4019. #endif
  4020. }
  4021. }
  4022. //===============================================================================
  4023. // class for cracking multi-part text blobs
  4024. // sections are demarcated by beginning-of-line markers submitted in a table by the caller
  4025. // typically
  4026. // asm flavors have first-line rules so we use those tags as is
  4027. // !!ARBvp (etc)
  4028. // !!ARBfp (etc)
  4029. // //!!GLSLF // slashes required
  4030. // //!GLSLV
  4031. // maybe also introduce "present but disabled" markers like these
  4032. // -!!ARBvp (etc)
  4033. // -!!ARBfp (etc)
  4034. // -//!!GLSLF
  4035. // -//!GLSLV
  4036. // resolved. there is no default section for text that doesn't have a marker in front of it. mark it or miss it.
  4037. CGLMTextSectioner::CGLMTextSectioner( char *text, int textLength, const char **markers )
  4038. {
  4039. // find lines
  4040. // for each line, see if it starts with a marker
  4041. // if so, open a new section based at that line
  4042. GLMTextSection *curSection = NULL; // no current section until we see a marker
  4043. char *cursor = text;
  4044. char *textLimit = text+textLength;
  4045. int foundMarker;
  4046. const char **markerCursor;
  4047. while( cursor < textLimit )
  4048. {
  4049. // top of loop. cursor points to start of a line.
  4050. // find the end of the line and keep that handy.
  4051. char *eol = strchr( cursor, '\n' );
  4052. int charsInLine = (eol) ? (eol-cursor)+1 : strlen(cursor);
  4053. //see if any of the marker strings is located here.
  4054. foundMarker = -1;
  4055. markerCursor = markers;
  4056. while( (foundMarker<0) && (*markerCursor!=NULL) )
  4057. {
  4058. // see if the n'th marker is a hit
  4059. int markerLen = strlen(*markerCursor);
  4060. if (!strncmp( cursor, *markerCursor, markerLen ) )
  4061. {
  4062. // hit
  4063. foundMarker = markerCursor - markers;
  4064. }
  4065. markerCursor++;
  4066. }
  4067. // outcome is either "marker spotted" or "no".
  4068. // if marker seen, open new section using that marker.
  4069. // else, grow active section if underway.
  4070. // then, move cursor to next line.
  4071. if (foundMarker >= 0)
  4072. {
  4073. // found marker. start new section.
  4074. // no need to do anything special with prior section - it was up to date before seeing this marker.
  4075. int index = m_sectionTable.AddToTail();
  4076. curSection = &m_sectionTable[ index ];
  4077. curSection->m_markerIndex = foundMarker;
  4078. curSection->m_textOffset = cursor - text; // text includes the marker
  4079. curSection->m_textLength = charsInLine; // this line goes in the tally, later lines add to it
  4080. }
  4081. else
  4082. {
  4083. // add this line to current section if live
  4084. if (curSection)
  4085. {
  4086. curSection->m_textLength += charsInLine;
  4087. }
  4088. }
  4089. cursor += charsInLine;
  4090. }
  4091. }
  4092. CGLMTextSectioner::~CGLMTextSectioner( )
  4093. {
  4094. // not much to do.
  4095. }
  4096. int CGLMTextSectioner::Count( void )
  4097. {
  4098. return m_sectionTable.Count();
  4099. }
  4100. void CGLMTextSectioner::GetSection( int index, uint *offsetOut, uint *lengthOut, int *markerIndexOut )
  4101. {
  4102. Assert( index < m_sectionTable.Count() );
  4103. GLMTextSection *section = &m_sectionTable[ index ];
  4104. *offsetOut = section->m_textOffset;
  4105. *lengthOut = section->m_textLength;
  4106. *markerIndexOut = section->m_markerIndex;
  4107. }
  4108. //===============================================================================
  4109. // how to make a compiled-in font:
  4110. // a. type in a matrix of characters in your fav editor
  4111. // b. take a screen shot of the characters (128x128 pixels in this case)
  4112. // c. export as TIFF raw.
  4113. // d. hex dump it
  4114. // e. column-copy just the hex data
  4115. // f. find and replace: chop out all the spaces and line feeds, change FFFFFF and 000000 to your marker chars of choice.
  4116. // g. wrap each line with quotes and a comma.
  4117. unsigned char g_glmDebugFontMap[ 128 * 128 ] =
  4118. {
  4119. " * "
  4120. " * * * * * "
  4121. " * * * * * *** * * ** * * * * * "
  4122. " * * * ***** * * * * * * * * * * * * * * * * "
  4123. " * * * * * * * * * * * * * *** * * "
  4124. " * ***** *** * * * * * * * ***** ***** * "
  4125. " * * * * * * * * * * * * * * * "
  4126. " * * * * * * * * * * * ** ** * "
  4127. " * *** * * ** * * * ** ** * "
  4128. " * * * * * "
  4129. " * "
  4130. " "
  4131. " "
  4132. " *** * *** *** * ***** *** ***** *** *** * * *** "
  4133. "* * ** * * * * ** * * * * * * * ** ** * * * * "
  4134. "* ** * * * * * **** **** * * * * * ** ** * ***** * * "
  4135. "* * * * * ** * * * * * * *** * * * * * "
  4136. "** * * * * ***** * * * * * * **** * ***** * * "
  4137. "* * * * * * * * * * * * * * * ** ** * * "
  4138. " *** * ***** *** * *** *** * *** *** ** ** * * * "
  4139. " * "
  4140. " * "
  4141. " "
  4142. " *** "
  4143. "* * *** **** *** **** ***** ***** *** * * * * * * * * * * * *** "
  4144. "* * * * * * * * * * * * * * * * * * * * * ** ** ** * * * "
  4145. "* * * * * * * * * * * * * * * * * * * * * * * * * * * * "
  4146. "*** * ***** **** * * * **** **** * ** ***** * * ** * * * * ** * * "
  4147. "* ** * * * * * * * * * * * * * * * * * * * * * * * * * "
  4148. "* * * * * * * * * * * * * * * * * * * * * * * * * * * "
  4149. "* * * * **** *** **** ***** * *** * * * *** * * ***** * * * * *** "
  4150. " *** "
  4151. " "
  4152. " * "
  4153. " ** * ** * "
  4154. "**** *** **** *** ***** * * * * * * * * * * ***** * * * * * "
  4155. "* * * * * * * * * * * * * * * * * * * * * * * * * "
  4156. "* * * * * * * * * * * * * * * * * * * * * "
  4157. "**** * * **** *** * * * * * * * * * * * * * * "
  4158. "* * * * * * * * * * * * * * * * * * * * "
  4159. "* * * * * * * * * * * ** ** * * * * * * * "
  4160. "* *** * * *** * *** * * * * * * ***** * * * ****** "
  4161. " * ** * ** "
  4162. " "
  4163. " "
  4164. " * "
  4165. " * * * ** * * * * * "
  4166. " * * * * * * * "
  4167. " **** **** *** **** *** *** **** **** * * * * * **** * ** *** "
  4168. " * * * * * * * * * * * * * * * * * * * * * * * ** * * * "
  4169. " * * * * * * * ***** * * * * * * * *** * * * * * * * * "
  4170. " * ** * * * * * * * * * * * * * * * * * * * * * * * "
  4171. " ** * **** **** **** **** * **** * * * * * * ** * * * * * *** "
  4172. " * * "
  4173. " *** ** "
  4174. " * "
  4175. " ** * ** "
  4176. " * * * * ** * "
  4177. " * * * * * ** *** "
  4178. "**** **** * ** **** **** * * * * * * * * * * * ***** * * * ***** "
  4179. "* * * * ** * * * * * * * * * * * * * * * ** * ** ***** "
  4180. "* * * * * *** * * * * * * * * * * * * * * * ***** "
  4181. "* * * * * * * * ** * * * * * * * * * * * * * *** "
  4182. "**** **** * **** ** ** * * * * * * **** ***** * * * "
  4183. "* * * ** * ** "
  4184. "* * *** * "
  4185. " "
  4186. " "
  4187. " "
  4188. " "
  4189. " "
  4190. " "
  4191. " "
  4192. " "
  4193. " "
  4194. " "
  4195. " "
  4196. " "
  4197. " "
  4198. " "
  4199. " "
  4200. " "
  4201. " "
  4202. " "
  4203. " "
  4204. " "
  4205. " "
  4206. " "
  4207. " "
  4208. " "
  4209. " "
  4210. " "
  4211. " "
  4212. " "
  4213. " "
  4214. " "
  4215. " "
  4216. " "
  4217. " "
  4218. " "
  4219. " "
  4220. " "
  4221. " "
  4222. " "
  4223. " "
  4224. " "
  4225. " "
  4226. " "
  4227. " "
  4228. " "
  4229. " "
  4230. " "
  4231. " "
  4232. " "
  4233. " "
  4234. " "
  4235. " "
  4236. " "
  4237. " "
  4238. " "
  4239. " "
  4240. " "
  4241. " "
  4242. " "
  4243. " "
  4244. " "
  4245. " "
  4246. };