summaryrefslogtreecommitdiffhomepage
path: root/ovr_sdk_win_23.0.0/LibOVRKernel/Src/GL/CAPI_GLE.h
blob: 1e6509b6d592e301d0d79aaea8a39ee3b151834c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
1446
1447
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
1494
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
1531
1532
1533
1534
1535
1536
1537
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
1574
1575
1576
1577
1578
1579
1580
1581
1582
1583
1584
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
1665
1666
1667
1668
1669
1670
1671
1672
1673
1674
1675
1676
1677
1678
1679
1680
1681
1682
1683
1684
1685
1686
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
1713
1714
1715
1716
1717
1718
1719
1720
1721
1722
1723
1724
1725
1726
1727
1728
1729
1730
1731
1732
1733
1734
1735
1736
1737
1738
1739
1740
1741
1742
1743
1744
1745
1746
1747
1748
1749
1750
1751
1752
1753
1754
1755
1756
1757
1758
1759
1760
1761
1762
1763
1764
1765
1766
1767
1768
1769
1770
1771
1772
1773
1774
1775
1776
1777
1778
1779
1780
1781
1782
1783
1784
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
1806
1807
1808
1809
1810
1811
1812
1813
1814
1815
1816
1817
1818
1819
1820
1821
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
1880
1881
1882
1883
1884
1885
1886
1887
1888
1889
1890
1891
1892
1893
1894
1895
1896
1897
1898
1899
1900
1901
1902
1903
1904
1905
1906
1907
1908
1909
1910
1911
1912
1913
1914
1915
1916
1917
1918
1919
1920
1921
1922
1923
1924
1925
1926
1927
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
1946
1947
1948
1949
1950
1951
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975
1976
1977
1978
1979
1980
1981
1982
1983
1984
1985
1986
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
2000
2001
2002
2003
2004
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
2045
2046
2047
2048
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058
2059
2060
2061
2062
2063
2064
2065
2066
2067
2068
2069
2070
2071
2072
2073
2074
2075
2076
2077
2078
2079
2080
2081
2082
2083
2084
2085
2086
2087
2088
2089
2090
2091
2092
2093
2094
2095
2096
2097
2098
2099
2100
2101
2102
2103
2104
2105
2106
2107
2108
2109
2110
2111
2112
2113
2114
2115
2116
2117
2118
2119
2120
2121
2122
2123
2124
2125
2126
2127
2128
2129
2130
2131
2132
2133
2134
2135
2136
2137
2138
2139
2140
2141
2142
2143
2144
2145
2146
2147
2148
2149
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
2178
2179
2180
2181
2182
2183
2184
2185
2186
2187
2188
2189
2190
2191
2192
2193
2194
2195
2196
2197
2198
2199
2200
2201
2202
2203
2204
2205
2206
2207
2208
2209
2210
2211
2212
2213
2214
2215
2216
2217
2218
2219
2220
2221
2222
2223
2224
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234
2235
2236
2237
2238
2239
2240
2241
2242
2243
2244
2245
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256
2257
2258
2259
2260
2261
2262
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293
2294
2295
2296
2297
2298
2299
2300
2301
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314
2315
2316
2317
2318
2319
2320
2321
2322
2323
2324
2325
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2343
2344
2345
2346
2347
2348
2349
2350
2351
2352
2353
2354
2355
2356
2357
2358
2359
2360
2361
2362
2363
2364
2365
2366
2367
2368
2369
2370
2371
2372
2373
2374
2375
2376
2377
2378
2379
2380
2381
2382
2383
2384
2385
2386
2387
2388
2389
2390
2391
2392
2393
2394
2395
2396
2397
2398
2399
2400
2401
2402
2403
2404
2405
2406
2407
2408
2409
2410
2411
2412
2413
2414
2415
2416
2417
2418
2419
2420
2421
2422
2423
2424
2425
2426
2427
2428
2429
2430
2431
2432
2433
2434
2435
2436
2437
2438
2439
2440
2441
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452
2453
2454
2455
2456
2457
2458
2459
2460
2461
2462
2463
2464
2465
2466
2467
2468
2469
2470
2471
2472
2473
2474
2475
2476
2477
2478
2479
2480
2481
2482
2483
2484
2485
2486
2487
2488
2489
2490
2491
2492
2493
2494
2495
2496
2497
2498
2499
2500
2501
2502
2503
2504
2505
2506
2507
2508
2509
2510
2511
2512
2513
2514
2515
2516
2517
2518
2519
2520
2521
2522
2523
2524
2525
2526
2527
2528
2529
2530
2531
2532
2533
2534
2535
2536
2537
2538
2539
2540
2541
2542
2543
2544
2545
2546
2547
2548
2549
2550
2551
2552
2553
2554
2555
2556
2557
2558
2559
2560
2561
2562
2563
2564
2565
2566
2567
2568
2569
2570
2571
2572
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583
2584
2585
2586
2587
2588
2589
2590
2591
2592
2593
2594
2595
2596
2597
2598
2599
2600
2601
2602
2603
2604
2605
2606
2607
2608
2609
2610
2611
2612
2613
2614
2615
2616
2617
2618
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630
2631
2632
2633
2634
2635
2636
2637
2638
2639
2640
2641
2642
2643
2644
2645
2646
2647
2648
2649
2650
2651
2652
2653
2654
2655
2656
2657
2658
2659
2660
2661
2662
2663
2664
2665
2666
2667
2668
2669
2670
2671
2672
2673
2674
2675
2676
2677
2678
2679
2680
2681
2682
2683
2684
2685
2686
2687
2688
2689
2690
2691
2692
2693
2694
2695
2696
2697
2698
2699
2700
2701
2702
2703
2704
2705
2706
2707
2708
2709
2710
2711
2712
2713
2714
2715
2716
2717
2718
2719
2720
2721
2722
2723
2724
2725
2726
2727
2728
2729
2730
2731
2732
2733
/************************************************************************************

Filename    :   CAPI_GLE.h
Content     :   OpenGL extensions support. Implements a stripped down glew-like
                interface with some additional functionality.
Copyright   :   Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

************************************************************************************/

// This file provides functionality similar to a reduced version of GLEW, plus some
// additional functionality that's useful to us, such as function hooking.

#ifndef OVR_CAPI_GLE_h
#define OVR_CAPI_GLE_h

#include "CAPI_GLE_GL.h"
#include "Kernel/OVR_Types.h"

///////////////////////////////////////////////////////////////////////////////
// How to use this functionality
//
// - You #include this header instead of gl.h, glext.h, wglext.h (Windows), gl3.h (Apple), gl3ext.h
// (Apple), glx.h (Unix), and glxext.h (Unix).
//   Currently you still would #include <Windows.h> for the base wgl functions on Windows and
//   OpenGL.h or NSOpenGL for the base Apple cgl functions.
//
// - You call OpenGL functions just like you would if you were directly using OpenGL
//   headers and declarations. The difference is that this module automatically loads
//   extensions on init and so you should never need to use GetProcAddress, wglGetProcAddress, etc.
//
// - OpenGL 1.1 functions can be called unilaterally without checking if they are present,
//   as it's assumed they are always present.
//
// - In order to use an OpenGL 1.2 or later function you can check the GLEContext::WholeVersion
//   variable to tell what version of OpenGL is present and active. Example usage:
//       if(GLEContext::GetCurrentContext()->WholeVersion >= 302) // If OpenGL 3.2 or later...
//
// - In order to use an OpenGL extension, you can check the GLE_ helper macro that exists for each
//   extension. For example, in order to check of the KHR_debug is present you could do this:
//        if(GLE_KHR_debug) ...
//   You cannot check for the presence of extensions by testing the function pointer, because
//   when hooking is enabled then we aren't using function pointers and thus all functions will
//   look like they are present.
//
// - You can test if the OpenGL implementation is OpenGL ES by checking the GLEContext IsGLES
//   member variable. For example: if(GLEContext::GetCurrentContext()->IsGLES) ...
//
// - You can test if the OpenGL implementation is a core profile ES by checking the GLEContext
// IsCoreProfile
//   member variable. For example: if(GLEContext::GetCurrentContext()->IsCoreProfile) ...
//
///////////////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////////////
// How to add support for additional functions to this module.
//
// For an example of how to do this, search the source files for all cases of KHR_Debug and just
// copy the things that it does but for your new extension.
//
//     1) Add the appropriate extension declaration to CAPI_GLE_GL.h, preferably by
//        copying it from the standard header file it normally comes from. If it's
//        platform-specific (e.g. a Windows wgl function) then make sure it's declared
//        within the given platform section. Note that there are potentially #defines, typedefs,
//        function typedefs, and function #defines. There is always a GLE_ macro declared which
//        lets the user know at runtime whether the extension is present.
//        Note that entries are alphabetically sorted in these files.
//        e.g.  #ifndef GL_KHR_debug
//                  #define GL_KHR_debug 1
//                  #define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 etc.
//                  typedef void (GLAPIENTRY * PFNGLPOPDEBUGGROUPPROC) ();
//                  #define glPopDebugGroup GLEGetCurrentFunction(glPopDebugGroup)
//                  #define GLE_KHR_debug GLEGetCurrentVariable(gl_KHR_debug)
//              #endif etc.
//
//     2) Add a hook function for in the hook section of the GLEContext class in this header,
//        ideally in the same order it's declared in the CAPI_GLE_GL.h so it's easily readable.
//        e.g. void glDebugMessageControl_Hook(GLenum source, GLenum type, GLenum severity, GLsizei
//        count, const GLuint* ids, GLboolean enabled); etc.
//
//     3) Add a declaration for each interface function to the GLEContext class in this header.
//        e.g. PFNGLDEBUGMESSAGECALLBACKPROC glDebugMessageCallback_Impl; etc.
//
//     4) Add code to GLEContext::InitExtensionLoad to load the function pointer.
//        e.g. GLELoadProc(glDebugMessageCallback_Impl, glDebugMessageCallback); etc.
//
//     5) Add code to GLEContext::InitExtensionSupport to detect the extension support.
//        On Mac, core profile functions aren't identified as extensions and so in addition
//        to detecting them you need to unilaterally set them as available when using 3.2+
//        by adding them to the section at the bottom of InitExtensionSupport.
//        e.g. { gl_KHR_debug, "GL_KHR_debug" }, etc.
//
//     6) Implement the GLEContext hook function(s) you declared.
//        e.g.  void OVR::GLEContext::glDebugMessageControl_Hook(GLenum source, GLenum type, GLenum
//        severity, GLsizei count, const GLuint* ids, GLboolean enabled)
//              {
//                 if(glDebugMessageControl_Impl)
//                    glDebugMessageControl_Impl(source, type, severity, count, ids, enabled);
//                 PostHook();
//              }
//
// In order to test this, build with GLE_HOOKING_ENABLED defined and not defined.
//
// Note that if the extension is a WGL-, GLX-, or CGL-specific extension, they are handled like
// above but are in their own section below the section for regular OpenGL extensions.
//
// In some cases the given interface may already be present by currently commented out,
// in which case you can simply un-comment it to enable it.
///////////////////////////////////////////////////////////////////////////////

namespace OVR {
// Generic OpenGL GetProcAddress function interface. Maps to platform-specific functionality
// internally. On Windows this is equivalent to wglGetProcAddress as opposed to global
// GetProcAddress.
void* GLEGetProcAddress(const char* name);

// GLEContext
//
// Manages a collection of OpenGL extension interfaces.
// If the application has multiple OpenGL unrelated contexts then you will want to create a
// different instance of this class for each one you intend to use it with.
//
// Example usage:
//     GLEContext gGLEContext;
//
//     GLEContext::SetCurrentContext(&gGLEContext);
//     gGLEContext.PlatformInit(); // Initializes WGL/GLX/etc. platform-specific OpenGL
//     functionality
//
//     if(GLE_WGL_ARB_create_context) // If wglCreateContextAttribsARB is available...
//     {
//         int attribList[] = { WGL_CONTEXT_MAJOR_VERSION_ARB, 3, WGL_CONTEXT_MINOR_VERSION_ARB, 2,
//         WGL_CONTEXT_FLAGS_ARB, WGL_CONTEXT_DEBUG_BIT_ARB, None }; HGLRC h =
//         wglCreateContextAttribsARB(hDC, 0, attribList);
//         [...]
//     }
//
//     gGLEContext.Init(); // Must be called after an OpenGL context has been created.
//
//     if(GLE_WHOLE_VERSION() >= 302) // If OpenGL 3.2 or later
//     {
//         glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, someTexture, 0); // This is an
//         OpenGL 3.2 function.
//         [...]
//     }
//
//     if(GLE_GL_ARB_texture_multisample) // If the GL_ARB_texture_multisample extension is
//     available...
//     {
//         glEnable(GL_SAMPLE_MASK);
//         glSampleMaski(0, 0x1);
//         [...]
//     }
//
//     [...]
//
//     gGLEContext.Shutdown();
//
GLE_CLASS_EXPORT class GLEContext {
 public:
  GLEContext();
  ~GLEContext();

  // Initializes platform-specific functionality (e.g. Windows WGL, Unix GLX, Android EGL, Apple
  // CGL). You would typically call this before creating an OpenGL context and using
  // platform-specific functions.
  void PlatformInit();
  bool IsPlatformInitialized() const;

  // Loads all the extensions from the current OpenGL context. This must be called after an OpenGL
  // context has been created and made current.
  void Init();
  bool IsInitialized() const;

  // Clears all the extensions initialized by PlatformInit and Init.
  void Shutdown();

  void SetEnableHookGetError(bool enabled) {
    EnableHookGetError = enabled;
  }

  // Returns the default instance of this class.
  static GLEContext* GetCurrentContext();

  // Sets the default instance of this class. This should be called after enabling a new OpenGL
  // context. This sets the current GLEContext; it does not set the underlying OpenGL context
  // itself.
  static void SetCurrentContext(GLEContext*);

 public:
  // OpenGL version information
  int MajorVersion; // OpenGL major version
  int MinorVersion; // OpenGL minor version
  int WholeVersion; // Equals ((MajorVersion * 100) + MinorVersion). Example usage:
  // if(glv.WholeVersion >= 302) // If OpenGL v3.02+ ...
  bool IsGLES; // Open GL ES?
  bool IsCoreProfile; // Is the current OpenGL context a core profile context? Its trueness may be a
  // false positive but will never be a false negative.
  bool EnableHookGetError; // If enabled then hook functions call glGetError after making the call.

  int PlatformMajorVersion; // GLX/WGL/EGL/CGL version. Not the same as OpenGL version.
  int PlatformMinorVersion;
  int PlatformWholeVersion;

  void InitVersion(); // Initializes the version information (e.g. MajorVersion). Called by the
  // public Init function.
  void InitExtensionLoad(); // Loads the function addresses into the function pointers.
  void InitExtensionSupport(); // Loads the boolean extension support booleans.

  void InitPlatformVersion();
  void InitPlatformExtensionLoad();
  void InitPlatformExtensionSupport();

 public:
// GL_VERSION_1_1
// Not normally included because all OpenGL 1.1 functionality is always present. But if we have
// hooking enabled then we implement our own version of each function.
#if defined(GLE_HOOKING_ENABLED)
  // void PreHook(const char* functionName);             // Called at the beginning of a hook
  // function.
  void PostHook(const char* functionName); // Called at the end of a hook function.

  void glAccum_Hook(GLenum op, GLfloat value);
  void glAlphaFunc_Hook(GLenum func, GLclampf ref);
  GLboolean glAreTexturesResident_Hook(GLsizei n, const GLuint* textures, GLboolean* residences);
  void glArrayElement_Hook(GLint i);
  void glBegin_Hook(GLenum mode);
  void glBindTexture_Hook(GLenum target, GLuint texture);
  void glBitmap_Hook(
      GLsizei width,
      GLsizei height,
      GLfloat xorig,
      GLfloat yorig,
      GLfloat xmove,
      GLfloat ymove,
      const GLubyte* bitmap);
  void glBlendFunc_Hook(GLenum sfactor, GLenum dfactor);
  void glCallList_Hook(GLuint list);
  void glCallLists_Hook(GLsizei n, GLenum type, const void* lists);
  void glClear_Hook(GLbitfield mask);
  void glClearAccum_Hook(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
  void glClearColor_Hook(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
  void glClearDepth_Hook(GLclampd depth);
  void glClearIndex_Hook(GLfloat c);
  void glClearStencil_Hook(GLint s);
  void glClipPlane_Hook(GLenum plane, const GLdouble* equation);
  void glColor3b_Hook(GLbyte red, GLbyte green, GLbyte blue);
  void glColor3bv_Hook(const GLbyte* v);
  void glColor3d_Hook(GLdouble red, GLdouble green, GLdouble blue);
  void glColor3dv_Hook(const GLdouble* v);
  void glColor3f_Hook(GLfloat red, GLfloat green, GLfloat blue);
  void glColor3fv_Hook(const GLfloat* v);
  void glColor3i_Hook(GLint red, GLint green, GLint blue);
  void glColor3iv_Hook(const GLint* v);
  void glColor3s_Hook(GLshort red, GLshort green, GLshort blue);
  void glColor3sv_Hook(const GLshort* v);
  void glColor3ub_Hook(GLubyte red, GLubyte green, GLubyte blue);
  void glColor3ubv_Hook(const GLubyte* v);
  void glColor3ui_Hook(GLuint red, GLuint green, GLuint blue);
  void glColor3uiv_Hook(const GLuint* v);
  void glColor3us_Hook(GLushort red, GLushort green, GLushort blue);
  void glColor3usv_Hook(const GLushort* v);
  void glColor4b_Hook(GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha);
  void glColor4bv_Hook(const GLbyte* v);
  void glColor4d_Hook(GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha);
  void glColor4dv_Hook(const GLdouble* v);
  void glColor4f_Hook(GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
  void glColor4fv_Hook(const GLfloat* v);
  void glColor4i_Hook(GLint red, GLint green, GLint blue, GLint alpha);
  void glColor4iv_Hook(const GLint* v);
  void glColor4s_Hook(GLshort red, GLshort green, GLshort blue, GLshort alpha);
  void glColor4sv_Hook(const GLshort* v);
  void glColor4ub_Hook(GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha);
  void glColor4ubv_Hook(const GLubyte* v);
  void glColor4ui_Hook(GLuint red, GLuint green, GLuint blue, GLuint alpha);
  void glColor4uiv_Hook(const GLuint* v);
  void glColor4us_Hook(GLushort red, GLushort green, GLushort blue, GLushort alpha);
  void glColor4usv_Hook(const GLushort* v);
  void glColorMask_Hook(GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha);
  void glColorMaterial_Hook(GLenum face, GLenum mode);
  void glColorPointer_Hook(GLint size, GLenum type, GLsizei stride, const void* pointer);
  void glCopyPixels_Hook(GLint x, GLint y, GLsizei width, GLsizei height, GLenum type);
  void glCopyTexImage1D_Hook(
      GLenum target,
      GLint level,
      GLenum internalFormat,
      GLint x,
      GLint y,
      GLsizei width,
      GLint border);
  void glCopyTexImage2D_Hook(
      GLenum target,
      GLint level,
      GLenum internalFormat,
      GLint x,
      GLint y,
      GLsizei width,
      GLsizei height,
      GLint border);
  void glCopyTexSubImage1D_Hook(
      GLenum target,
      GLint level,
      GLint xoffset,
      GLint x,
      GLint y,
      GLsizei width);
  void glCopyTexSubImage2D_Hook(
      GLenum target,
      GLint level,
      GLint xoffset,
      GLint yoffset,
      GLint x,
      GLint y,
      GLsizei width,
      GLsizei height);
  void glCullFace_Hook(GLenum mode);
  void glDeleteLists_Hook(GLuint list, GLsizei range);
  void glDeleteTextures_Hook(GLsizei n, const GLuint* textures);
  void glDepthFunc_Hook(GLenum func);
  void glDepthMask_Hook(GLboolean flag);
  void glDepthRange_Hook(GLclampd zNear, GLclampd zFar);
  void glDisable_Hook(GLenum cap);
  void glDisableClientState_Hook(GLenum array);
  void glDrawArrays_Hook(GLenum mode, GLint first, GLsizei count);
  void glDrawBuffer_Hook(GLenum mode);
  void glDrawElements_Hook(GLenum mode, GLsizei count, GLenum type, const void* indices);
  void
  glDrawPixels_Hook(GLsizei width, GLsizei height, GLenum format, GLenum type, const void* pixels);
  void glEdgeFlag_Hook(GLboolean flag);
  void glEdgeFlagPointer_Hook(GLsizei stride, const void* pointer);
  void glEdgeFlagv_Hook(const GLboolean* flag);
  void glEnable_Hook(GLenum cap);
  void glEnableClientState_Hook(GLenum array);
  void glEnd_Hook(void);
  void glEndList_Hook(void);
  void glEvalCoord1d_Hook(GLdouble u);
  void glEvalCoord1dv_Hook(const GLdouble* u);
  void glEvalCoord1f_Hook(GLfloat u);
  void glEvalCoord1fv_Hook(const GLfloat* u);
  void glEvalCoord2d_Hook(GLdouble u, GLdouble v);
  void glEvalCoord2dv_Hook(const GLdouble* u);
  void glEvalCoord2f_Hook(GLfloat u, GLfloat v);
  void glEvalCoord2fv_Hook(const GLfloat* u);
  void glEvalMesh1_Hook(GLenum mode, GLint i1, GLint i2);
  void glEvalMesh2_Hook(GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2);
  void glEvalPoint1_Hook(GLint i);
  void glEvalPoint2_Hook(GLint i, GLint j);
  void glFeedbackBuffer_Hook(GLsizei size, GLenum type, GLfloat* buffer);
  void glFinish_Hook(void);
  void glFlush_Hook(void);
  void glFogf_Hook(GLenum pname, GLfloat param);
  void glFogfv_Hook(GLenum pname, const GLfloat* params);
  void glFogi_Hook(GLenum pname, GLint param);
  void glFogiv_Hook(GLenum pname, const GLint* params);
  void glFrontFace_Hook(GLenum mode);
  void glFrustum_Hook(
      GLdouble left,
      GLdouble right,
      GLdouble bottom,
      GLdouble top,
      GLdouble zNear,
      GLdouble zFar);
  GLuint glGenLists_Hook(GLsizei range);
  void glGenTextures_Hook(GLsizei n, GLuint* textures);
  void glGetBooleanv_Hook(GLenum pname, GLboolean* params);
  void glGetClipPlane_Hook(GLenum plane, GLdouble* equation);
  void glGetDoublev_Hook(GLenum pname, GLdouble* params);
  GLenum glGetError_Hook(void);
  void glGetFloatv_Hook(GLenum pname, GLfloat* params);
  void glGetIntegerv_Hook(GLenum pname, GLint* params);
  void glGetLightfv_Hook(GLenum light, GLenum pname, GLfloat* params);
  void glGetLightiv_Hook(GLenum light, GLenum pname, GLint* params);
  void glGetMapdv_Hook(GLenum target, GLenum query, GLdouble* v);
  void glGetMapfv_Hook(GLenum target, GLenum query, GLfloat* v);
  void glGetMapiv_Hook(GLenum target, GLenum query, GLint* v);
  void glGetMaterialfv_Hook(GLenum face, GLenum pname, GLfloat* params);
  void glGetMaterialiv_Hook(GLenum face, GLenum pname, GLint* params);
  void glGetPixelMapfv_Hook(GLenum map, GLfloat* values);
  void glGetPixelMapuiv_Hook(GLenum map, GLuint* values);
  void glGetPixelMapusv_Hook(GLenum map, GLushort* values);
  void glGetPointerv_Hook(GLenum pname, void** params);
  void glGetPolygonStipple_Hook(GLubyte* mask);
  const GLubyte* glGetString_Hook(GLenum name);
  void glGetTexEnvfv_Hook(GLenum target, GLenum pname, GLfloat* params);
  void glGetTexEnviv_Hook(GLenum target, GLenum pname, GLint* params);
  void glGetTexGendv_Hook(GLenum coord, GLenum pname, GLdouble* params);
  void glGetTexGenfv_Hook(GLenum coord, GLenum pname, GLfloat* params);
  void glGetTexGeniv_Hook(GLenum coord, GLenum pname, GLint* params);
  void glGetTexImage_Hook(GLenum target, GLint level, GLenum format, GLenum type, void* pixels);
  void glGetTexLevelParameterfv_Hook(GLenum target, GLint level, GLenum pname, GLfloat* params);
  void glGetTexLevelParameteriv_Hook(GLenum target, GLint level, GLenum pname, GLint* params);
  void glGetTexParameterfv_Hook(GLenum target, GLenum pname, GLfloat* params);
  void glGetTexParameteriv_Hook(GLenum target, GLenum pname, GLint* params);
  void glHint_Hook(GLenum target, GLenum mode);
  void glIndexMask_Hook(GLuint mask);
  void glIndexPointer_Hook(GLenum type, GLsizei stride, const void* pointer);
  void glIndexd_Hook(GLdouble c);
  void glIndexdv_Hook(const GLdouble* c);
  void glIndexf_Hook(GLfloat c);
  void glIndexfv_Hook(const GLfloat* c);
  void glIndexi_Hook(GLint c);
  void glIndexiv_Hook(const GLint* c);
  void glIndexs_Hook(GLshort c);
  void glIndexsv_Hook(const GLshort* c);
  void glIndexub_Hook(GLubyte c);
  void glIndexubv_Hook(const GLubyte* c);
  void glInitNames_Hook(void);
  void glInterleavedArrays_Hook(GLenum format, GLsizei stride, const void* pointer);
  GLboolean glIsEnabled_Hook(GLenum cap);
  GLboolean glIsList_Hook(GLuint list);
  GLboolean glIsTexture_Hook(GLuint texture);
  void glLightModelf_Hook(GLenum pname, GLfloat param);
  void glLightModelfv_Hook(GLenum pname, const GLfloat* params);
  void glLightModeli_Hook(GLenum pname, GLint param);
  void glLightModeliv_Hook(GLenum pname, const GLint* params);
  void glLightf_Hook(GLenum light, GLenum pname, GLfloat param);
  void glLightfv_Hook(GLenum light, GLenum pname, const GLfloat* params);
  void glLighti_Hook(GLenum light, GLenum pname, GLint param);
  void glLightiv_Hook(GLenum light, GLenum pname, const GLint* params);
  void glLineStipple_Hook(GLint factor, GLushort pattern);
  void glLineWidth_Hook(GLfloat width);
  void glListBase_Hook(GLuint base);
  void glLoadIdentity_Hook(void);
  void glLoadMatrixd_Hook(const GLdouble* m);
  void glLoadMatrixf_Hook(const GLfloat* m);
  void glLoadName_Hook(GLuint name);
  void glLogicOp_Hook(GLenum opcode);
  void glMap1d_Hook(
      GLenum target,
      GLdouble u1,
      GLdouble u2,
      GLint stride,
      GLint order,
      const GLdouble* points);
  void glMap1f_Hook(
      GLenum target,
      GLfloat u1,
      GLfloat u2,
      GLint stride,
      GLint order,
      const GLfloat* points);
  void glMap2d_Hook(
      GLenum target,
      GLdouble u1,
      GLdouble u2,
      GLint ustride,
      GLint uorder,
      GLdouble v1,
      GLdouble v2,
      GLint vstride,
      GLint vorder,
      const GLdouble* points);
  void glMap2f_Hook(
      GLenum target,
      GLfloat u1,
      GLfloat u2,
      GLint ustride,
      GLint uorder,
      GLfloat v1,
      GLfloat v2,
      GLint vstride,
      GLint vorder,
      const GLfloat* points);
  void glMapGrid1d_Hook(GLint un, GLdouble u1, GLdouble u2);
  void glMapGrid1f_Hook(GLint un, GLfloat u1, GLfloat u2);
  void glMapGrid2d_Hook(GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2);
  void glMapGrid2f_Hook(GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2);
  void glMaterialf_Hook(GLenum face, GLenum pname, GLfloat param);
  void glMaterialfv_Hook(GLenum face, GLenum pname, const GLfloat* params);
  void glMateriali_Hook(GLenum face, GLenum pname, GLint param);
  void glMaterialiv_Hook(GLenum face, GLenum pname, const GLint* params);
  void glMatrixMode_Hook(GLenum mode);
  void glMultMatrixd_Hook(const GLdouble* m);
  void glMultMatrixf_Hook(const GLfloat* m);
  void glNewList_Hook(GLuint list, GLenum mode);
  void glNormal3b_Hook(GLbyte nx, GLbyte ny, GLbyte nz);
  void glNormal3bv_Hook(const GLbyte* v);
  void glNormal3d_Hook(GLdouble nx, GLdouble ny, GLdouble nz);
  void glNormal3dv_Hook(const GLdouble* v);
  void glNormal3f_Hook(GLfloat nx, GLfloat ny, GLfloat nz);
  void glNormal3fv_Hook(const GLfloat* v);
  void glNormal3i_Hook(GLint nx, GLint ny, GLint nz);
  void glNormal3iv_Hook(const GLint* v);
  void glNormal3s_Hook(GLshort nx, GLshort ny, GLshort nz);
  void glNormal3sv_Hook(const GLshort* v);
  void glNormalPointer_Hook(GLenum type, GLsizei stride, const void* pointer);
  void glOrtho_Hook(
      GLdouble left,
      GLdouble right,
      GLdouble bottom,
      GLdouble top,
      GLdouble zNear,
      GLdouble zFar);
  void glPassThrough_Hook(GLfloat token);
  void glPixelMapfv_Hook(GLenum map, GLsizei mapsize, const GLfloat* values);
  void glPixelMapuiv_Hook(GLenum map, GLsizei mapsize, const GLuint* values);
  void glPixelMapusv_Hook(GLenum map, GLsizei mapsize, const GLushort* values);
  void glPixelStoref_Hook(GLenum pname, GLfloat param);
  void glPixelStorei_Hook(GLenum pname, GLint param);
  void glPixelTransferf_Hook(GLenum pname, GLfloat param);
  void glPixelTransferi_Hook(GLenum pname, GLint param);
  void glPixelZoom_Hook(GLfloat xfactor, GLfloat yfactor);
  void glPointSize_Hook(GLfloat size);
  void glPolygonMode_Hook(GLenum face, GLenum mode);
  void glPolygonOffset_Hook(GLfloat factor, GLfloat units);
  void glPolygonStipple_Hook(const GLubyte* mask);
  void glPopAttrib_Hook(void);
  void glPopClientAttrib_Hook(void);
  void glPopMatrix_Hook(void);
  void glPopName_Hook(void);
  void glPrioritizeTextures_Hook(GLsizei n, const GLuint* textures, const GLclampf* priorities);
  void glPushAttrib_Hook(GLbitfield mask);
  void glPushClientAttrib_Hook(GLbitfield mask);
  void glPushMatrix_Hook(void);
  void glPushName_Hook(GLuint name);
  void glRasterPos2d_Hook(GLdouble x, GLdouble y);
  void glRasterPos2dv_Hook(const GLdouble* v);
  void glRasterPos2f_Hook(GLfloat x, GLfloat y);
  void glRasterPos2fv_Hook(const GLfloat* v);
  void glRasterPos2i_Hook(GLint x, GLint y);
  void glRasterPos2iv_Hook(const GLint* v);
  void glRasterPos2s_Hook(GLshort x, GLshort y);
  void glRasterPos2sv_Hook(const GLshort* v);
  void glRasterPos3d_Hook(GLdouble x, GLdouble y, GLdouble z);
  void glRasterPos3dv_Hook(const GLdouble* v);
  void glRasterPos3f_Hook(GLfloat x, GLfloat y, GLfloat z);
  void glRasterPos3fv_Hook(const GLfloat* v);
  void glRasterPos3i_Hook(GLint x, GLint y, GLint z);
  void glRasterPos3iv_Hook(const GLint* v);
  void glRasterPos3s_Hook(GLshort x, GLshort y, GLshort z);
  void glRasterPos3sv_Hook(const GLshort* v);
  void glRasterPos4d_Hook(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
  void glRasterPos4dv_Hook(const GLdouble* v);
  void glRasterPos4f_Hook(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
  void glRasterPos4fv_Hook(const GLfloat* v);
  void glRasterPos4i_Hook(GLint x, GLint y, GLint z, GLint w);
  void glRasterPos4iv_Hook(const GLint* v);
  void glRasterPos4s_Hook(GLshort x, GLshort y, GLshort z, GLshort w);
  void glRasterPos4sv_Hook(const GLshort* v);
  void glReadBuffer_Hook(GLenum mode);
  void glReadPixels_Hook(
      GLint x,
      GLint y,
      GLsizei width,
      GLsizei height,
      GLenum format,
      GLenum type,
      void* pixels);
  void glRectd_Hook(GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2);
  void glRectdv_Hook(const GLdouble* v1, const GLdouble* v2);
  void glRectf_Hook(GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2);
  void glRectfv_Hook(const GLfloat* v1, const GLfloat* v2);
  void glRecti_Hook(GLint x1, GLint y1, GLint x2, GLint y2);
  void glRectiv_Hook(const GLint* v1, const GLint* v2);
  void glRects_Hook(GLshort x1, GLshort y1, GLshort x2, GLshort y2);
  void glRectsv_Hook(const GLshort* v1, const GLshort* v2);
  GLint glRenderMode_Hook(GLenum mode);
  void glRotated_Hook(GLdouble angle, GLdouble x, GLdouble y, GLdouble z);
  void glRotatef_Hook(GLfloat angle, GLfloat x, GLfloat y, GLfloat z);
  void glScaled_Hook(GLdouble x, GLdouble y, GLdouble z);
  void glScalef_Hook(GLfloat x, GLfloat y, GLfloat z);
  void glScissor_Hook(GLint x, GLint y, GLsizei width, GLsizei height);
  void glSelectBuffer_Hook(GLsizei size, GLuint* buffer);
  void glShadeModel_Hook(GLenum mode);
  void glStencilFunc_Hook(GLenum func, GLint ref, GLuint mask);
  void glStencilMask_Hook(GLuint mask);
  void glStencilOp_Hook(GLenum fail, GLenum zfail, GLenum zpass);
  void glTexCoord1d_Hook(GLdouble s);
  void glTexCoord1dv_Hook(const GLdouble* v);
  void glTexCoord1f_Hook(GLfloat s);
  void glTexCoord1fv_Hook(const GLfloat* v);
  void glTexCoord1i_Hook(GLint s);
  void glTexCoord1iv_Hook(const GLint* v);
  void glTexCoord1s_Hook(GLshort s);
  void glTexCoord1sv_Hook(const GLshort* v);
  void glTexCoord2d_Hook(GLdouble s, GLdouble t);
  void glTexCoord2dv_Hook(const GLdouble* v);
  void glTexCoord2f_Hook(GLfloat s, GLfloat t);
  void glTexCoord2fv_Hook(const GLfloat* v);
  void glTexCoord2i_Hook(GLint s, GLint t);
  void glTexCoord2iv_Hook(const GLint* v);
  void glTexCoord2s_Hook(GLshort s, GLshort t);
  void glTexCoord2sv_Hook(const GLshort* v);
  void glTexCoord3d_Hook(GLdouble s, GLdouble t, GLdouble r);
  void glTexCoord3dv_Hook(const GLdouble* v);
  void glTexCoord3f_Hook(GLfloat s, GLfloat t, GLfloat r);
  void glTexCoord3fv_Hook(const GLfloat* v);
  void glTexCoord3i_Hook(GLint s, GLint t, GLint r);
  void glTexCoord3iv_Hook(const GLint* v);
  void glTexCoord3s_Hook(GLshort s, GLshort t, GLshort r);
  void glTexCoord3sv_Hook(const GLshort* v);
  void glTexCoord4d_Hook(GLdouble s, GLdouble t, GLdouble r, GLdouble q);
  void glTexCoord4dv_Hook(const GLdouble* v);
  void glTexCoord4f_Hook(GLfloat s, GLfloat t, GLfloat r, GLfloat q);
  void glTexCoord4fv_Hook(const GLfloat* v);
  void glTexCoord4i_Hook(GLint s, GLint t, GLint r, GLint q);
  void glTexCoord4iv_Hook(const GLint* v);
  void glTexCoord4s_Hook(GLshort s, GLshort t, GLshort r, GLshort q);
  void glTexCoord4sv_Hook(const GLshort* v);
  void glTexCoordPointer_Hook(GLint size, GLenum type, GLsizei stride, const void* pointer);
  void glTexEnvf_Hook(GLenum target, GLenum pname, GLfloat param);
  void glTexEnvfv_Hook(GLenum target, GLenum pname, const GLfloat* params);
  void glTexEnvi_Hook(GLenum target, GLenum pname, GLint param);
  void glTexEnviv_Hook(GLenum target, GLenum pname, const GLint* params);
  void glTexGend_Hook(GLenum coord, GLenum pname, GLdouble param);
  void glTexGendv_Hook(GLenum coord, GLenum pname, const GLdouble* params);
  void glTexGenf_Hook(GLenum coord, GLenum pname, GLfloat param);
  void glTexGenfv_Hook(GLenum coord, GLenum pname, const GLfloat* params);
  void glTexGeni_Hook(GLenum coord, GLenum pname, GLint param);
  void glTexGeniv_Hook(GLenum coord, GLenum pname, const GLint* params);
  void glTexImage1D_Hook(
      GLenum target,
      GLint level,
      GLint internalformat,
      GLsizei width,
      GLint border,
      GLenum format,
      GLenum type,
      const void* pixels);
  void glTexImage2D_Hook(
      GLenum target,
      GLint level,
      GLint internalformat,
      GLsizei width,
      GLsizei height,
      GLint border,
      GLenum format,
      GLenum type,
      const void* pixels);
  void glTexParameterf_Hook(GLenum target, GLenum pname, GLfloat param);
  void glTexParameterfv_Hook(GLenum target, GLenum pname, const GLfloat* params);
  void glTexParameteri_Hook(GLenum target, GLenum pname, GLint param);
  void glTexParameteriv_Hook(GLenum target, GLenum pname, const GLint* params);
  void glTexSubImage1D_Hook(
      GLenum target,
      GLint level,
      GLint xoffset,
      GLsizei width,
      GLenum format,
      GLenum type,
      const void* pixels);
  void glTexSubImage2D_Hook(
      GLenum target,
      GLint level,
      GLint xoffset,
      GLint yoffset,
      GLsizei width,
      GLsizei height,
      GLenum format,
      GLenum type,
      const void* pixels);
  void glTranslated_Hook(GLdouble x, GLdouble y, GLdouble z);
  void glTranslatef_Hook(GLfloat x, GLfloat y, GLfloat z);
  void glVertex2d_Hook(GLdouble x, GLdouble y);
  void glVertex2dv_Hook(const GLdouble* v);
  void glVertex2f_Hook(GLfloat x, GLfloat y);
  void glVertex2fv_Hook(const GLfloat* v);
  void glVertex2i_Hook(GLint x, GLint y);
  void glVertex2iv_Hook(const GLint* v);
  void glVertex2s_Hook(GLshort x, GLshort y);
  void glVertex2sv_Hook(const GLshort* v);
  void glVertex3d_Hook(GLdouble x, GLdouble y, GLdouble z);
  void glVertex3dv_Hook(const GLdouble* v);
  void glVertex3f_Hook(GLfloat x, GLfloat y, GLfloat z);
  void glVertex3fv_Hook(const GLfloat* v);
  void glVertex3i_Hook(GLint x, GLint y, GLint z);
  void glVertex3iv_Hook(const GLint* v);
  void glVertex3s_Hook(GLshort x, GLshort y, GLshort z);
  void glVertex3sv_Hook(const GLshort* v);
  void glVertex4d_Hook(GLdouble x, GLdouble y, GLdouble z, GLdouble w);
  void glVertex4dv_Hook(const GLdouble* v);
  void glVertex4f_Hook(GLfloat x, GLfloat y, GLfloat z, GLfloat w);
  void glVertex4fv_Hook(const GLfloat* v);
  void glVertex4i_Hook(GLint x, GLint y, GLint z, GLint w);
  void glVertex4iv_Hook(const GLint* v);
  void glVertex4s_Hook(GLshort x, GLshort y, GLshort z, GLshort w);
  void glVertex4sv_Hook(const GLshort* v);
  void glVertexPointer_Hook(GLint size, GLenum type, GLsizei stride, const void* pointer);
  void glViewport_Hook(GLint x, GLint y, GLsizei width, GLsizei height);

  // GL_VERSION_1_2
  void glBlendColor_Hook(GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha);
  void glBlendEquation_Hook(GLenum mode);
  void glDrawRangeElements_Hook(
      GLenum mode,
      GLuint start,
      GLuint end,
      GLsizei count,
      GLenum type,
      const GLvoid* indices);
  void glTexImage3D_Hook(
      GLenum target,
      GLint level,
      GLint internalformat,
      GLsizei width,
      GLsizei height,
      GLsizei depth,
      GLint border,
      GLenum format,
      GLenum type,
      const GLvoid* pixels);
  void glTexSubImage3D_Hook(
      GLenum target,
      GLint level,
      GLint xoffset,
      GLint yoffset,
      GLint zoffset,
      GLsizei width,
      GLsizei height,
      GLsizei depth,
      GLenum format,
      GLenum type,
      const GLvoid* pixels);
  void glCopyTexSubImage3D_Hook(
      GLenum target,
      GLint level,
      GLint xoffset,
      GLint yoffset,
      GLint zoffset,
      GLint x,
      GLint y,
      GLsizei width,
      GLsizei height);

  // GL_VERSION_1_2 deprecated functions
  /* Not currently supported
  void glColorTable_Hook(GLenum target, GLenum internalformat, GLsizei width,
                          GLenum format, GLenum type, const GLvoid *table);
  void glColorTableParameterfv_Hook(GLenum target, GLenum pname, const GLfloat *params);
  void glColorTableParameteriv_Hook(GLenum target, GLenum pname, const GLint *params);
  void glCopyColorTable_Hook(GLenum target, GLenum internalformat, GLint x, GLint y, GLsizei width);
  void glGetColorTable_Hook(GLenum target, GLenum format, GLenum type, GLvoid *table);
  void glGetColorTableParameterfv_Hook(GLenum target, GLenum pname, GLfloat *params);
  void glGetColorTableParameteriv_Hook(GLenum target, GLenum pname, GLint *params);
  void glColorSubTable_Hook(GLenum target, GLsizei start, GLsizei count, GLenum format, GLenum type,
                            const GLvoid *data);
  void glCopyColorSubTable_Hook(GLenum target, GLsizei start, GLint x, GLint y, GLsizei width);
  void glConvolutionFilter1D_Hook(GLenum target, GLenum internalformat, GLsizei width, GLenum
                                  format, GLenum type, const GLvoid *image);
  void glConvolutionFilter2D_Hook(GLenum target, GLenum internalformat, GLsizei width, GLsizei
                                  height, GLenum format, GLenum type, const GLvoid *image);
  void glConvolutionParameterf_Hook(GLenum target, GLenum pname, GLfloat params);
  void glConvolutionParameterfv_Hook(GLenum target, GLenum pname, const GLfloat *params);
  void glConvolutionParameteri_Hook(GLenum target, GLenum pname, GLint params);
  void glConvolutionParameteriv_Hook(GLenum target, GLenum pname, const GLint *params);
  void glCopyConvolutionFilter1D_Hook(GLenum target, GLenum internalformat,
                                      GLint x, GLint y, GLsizei width);
  void glCopyConvolutionFilter2D_Hook(GLenum target, GLenum internalformat,
                                      GLint x, GLint y, GLsizei width, GLsizei height);
  void glGetConvolutionFilter_Hook(GLenum target, GLenum format, GLenum type, GLvoid *image);
  void glGetConvolutionParameterfv_Hook(GLenum target, GLenum pname, GLfloat *params);
  void glGetConvolutionParameteriv_Hook(GLenum target, GLenum pname, GLint *params);
  void glGetSeparableFilter_Hook(GLenum target, GLenum format, GLenum type,
                                 GLvoid *row, GLvoid *column, GLvoid *span);
  void glSeparableFilter2D_Hook(GLenum target, GLenum internalformat, GLsizei width, GLsizei height,
                               GLenum format, GLenum type, const GLvoid *row, const GLvoid *column);
  void glGetHistogram_Hook(GLenum target, GLboolean reset, GLenum format,
                           GLenum type, GLvoid *values);
  void glGetHistogramParameterfv_Hook(GLenum target, GLenum pname, GLfloat *params);
  void glGetHistogramParameteriv_Hook(GLenum target, GLenum pname, GLint *params);
  void glGetMinmax_Hook(GLenum target, GLboolean reset, GLenum format, GLenum type, GLvoid *values);
  void glGetMinmaxParameterfv_Hook(GLenum target, GLenum pname, GLfloat *params);
  void glGetMinmaxParameteriv_Hook(GLenum target, GLenum pname, GLint *params);
  void glHistogram_Hook(GLenum target, GLsizei width, GLenum internalformat, GLboolean sink);
  void glMinmax_Hook(GLenum target, GLenum internalformat, GLboolean sink);
  void glResetHistogram_Hook(GLenum target);
  void glResetMinmax_Hook(GLenum target);
  */

  // GL_VERSION_1_3
  void glActiveTexture_Hook(GLenum texture);
  void glSampleCoverage_Hook(GLclampf value, GLboolean invert);
  void glCompressedTexImage3D_Hook(
      GLenum target,
      GLint level,
      GLenum internalformat,
      GLsizei width,
      GLsizei height,
      GLsizei depth,
      GLint border,
      GLsizei imageSize,
      const GLvoid* data);
  void glCompressedTexImage2D_Hook(
      GLenum target,
      GLint level,
      GLenum internalformat,
      GLsizei width,
      GLsizei height,
      GLint border,
      GLsizei imageSize,
      const GLvoid* data);
  void glCompressedTexImage1D_Hook(
      GLenum target,
      GLint level,
      GLenum internalformat,
      GLsizei width,
      GLint border,
      GLsizei imageSize,
      const GLvoid* data);
  void glCompressedTexSubImage3D_Hook(
      GLenum target,
      GLint level,
      GLint xoffset,
      GLint yoffset,
      GLint zoffset,
      GLsizei width,
      GLsizei height,
      GLsizei depth,
      GLenum format,
      GLsizei imageSize,
      const GLvoid* data);
  void glCompressedTexSubImage2D_Hook(
      GLenum target,
      GLint level,
      GLint xoffset,
      GLint yoffset,
      GLsizei width,
      GLsizei height,
      GLenum format,
      GLsizei imageSize,
      const GLvoid* data);
  void glCompressedTexSubImage1D_Hook(
      GLenum target,
      GLint level,
      GLint xoffset,
      GLsizei width,
      GLenum format,
      GLsizei imageSize,
      const GLvoid* data);
  void glGetCompressedTexImage_Hook(GLenum target, GLint level, GLvoid* img);

  // GL_VERSION_1_3 deprecated functions
  void glClientActiveTexture_Hook(GLenum texture);
  void glMultiTexCoord1d_Hook(GLenum target, GLdouble s);
  void glMultiTexCoord1dv_Hook(GLenum target, const GLdouble* v);
  void glMultiTexCoord1f_Hook(GLenum target, GLfloat s);
  void glMultiTexCoord1fv_Hook(GLenum target, const GLfloat* v);
  void glMultiTexCoord1i_Hook(GLenum target, GLint s);
  void glMultiTexCoord1iv_Hook(GLenum target, const GLint* v);
  void glMultiTexCoord1s_Hook(GLenum target, GLshort s);
  void glMultiTexCoord1sv_Hook(GLenum target, const GLshort* v);
  void glMultiTexCoord2d_Hook(GLenum target, GLdouble s, GLdouble t);
  void glMultiTexCoord2dv_Hook(GLenum target, const GLdouble* v);
  void glMultiTexCoord2f_Hook(GLenum target, GLfloat s, GLfloat t);
  void glMultiTexCoord2fv_Hook(GLenum target, const GLfloat* v);
  void glMultiTexCoord2i_Hook(GLenum target, GLint s, GLint t);
  void glMultiTexCoord2iv_Hook(GLenum target, const GLint* v);
  void glMultiTexCoord2s_Hook(GLenum target, GLshort s, GLshort t);
  void glMultiTexCoord2sv_Hook(GLenum target, const GLshort* v);
  void glMultiTexCoord3d_Hook(GLenum target, GLdouble s, GLdouble t, GLdouble r);
  void glMultiTexCoord3dv_Hook(GLenum target, const GLdouble* v);
  void glMultiTexCoord3f_Hook(GLenum target, GLfloat s, GLfloat t, GLfloat r);
  void glMultiTexCoord3fv_Hook(GLenum target, const GLfloat* v);
  void glMultiTexCoord3i_Hook(GLenum target, GLint s, GLint t, GLint r);
  void glMultiTexCoord3iv_Hook(GLenum target, const GLint* v);
  void glMultiTexCoord3s_Hook(GLenum target, GLshort s, GLshort t, GLshort r);
  void glMultiTexCoord3sv_Hook(GLenum target, const GLshort* v);
  void glMultiTexCoord4d_Hook(GLenum target, GLdouble s, GLdouble t, GLdouble r, GLdouble q);
  void glMultiTexCoord4dv_Hook(GLenum target, const GLdouble* v);
  void glMultiTexCoord4f_Hook(GLenum target, GLfloat s, GLfloat t, GLfloat r, GLfloat q);
  void glMultiTexCoord4fv_Hook(GLenum target, const GLfloat* v);
  void glMultiTexCoord4i_Hook(GLenum target, GLint s, GLint t, GLint r, GLint q);
  void glMultiTexCoord4iv_Hook(GLenum target, const GLint* v);
  void glMultiTexCoord4s_Hook(GLenum target, GLshort s, GLshort t, GLshort r, GLshort q);
  void glMultiTexCoord4sv_Hook(GLenum target, const GLshort* v);
  void glLoadTransposeMatrixf_Hook(const GLfloat* m);
  void glLoadTransposeMatrixd_Hook(const GLdouble* m);
  void glMultTransposeMatrixf_Hook(const GLfloat* m);
  void glMultTransposeMatrixd_Hook(const GLdouble* m);

  // GL_VERSION_1_4
  void glBlendFuncSeparate_Hook(
      GLenum sfactorRGB,
      GLenum dfactorRGB,
      GLenum sfactorAlpha,
      GLenum dfactorAlpha);
  void
  glMultiDrawArrays_Hook(GLenum mode, const GLint* first, const GLsizei* count, GLsizei primcount);
  void glMultiDrawElements_Hook(
      GLenum mode,
      const GLsizei* count,
      GLenum type,
      const GLvoid** indices,
      GLsizei primcount);
  void glPointParameterf_Hook(GLenum pname, GLfloat param);
  void glPointParameterfv_Hook(GLenum pname, const GLfloat* params);
  void glPointParameteri_Hook(GLenum pname, GLint param);
  void glPointParameteriv_Hook(GLenum pname, const GLint* params);

  // GL_VERSION_1_4 deprecated functions
  void glFogCoordf_Hook(GLfloat coord);
  void glFogCoordfv_Hook(const GLfloat* coord);
  void glFogCoordd_Hook(GLdouble coord);
  void glFogCoorddv_Hook(const GLdouble* coord);
  void glFogCoordPointer_Hook(GLenum type, GLsizei stride, const GLvoid* pointer);
  void glSecondaryColor3b_Hook(GLbyte red, GLbyte green, GLbyte blue);
  void glSecondaryColor3bv_Hook(const GLbyte* v);
  void glSecondaryColor3d_Hook(GLdouble red, GLdouble green, GLdouble blue);
  void glSecondaryColor3dv_Hook(const GLdouble* v);
  void glSecondaryColor3f_Hook(GLfloat red, GLfloat green, GLfloat blue);
  void glSecondaryColor3fv_Hook(const GLfloat* v);
  void glSecondaryColor3i_Hook(GLint red, GLint green, GLint blue);
  void glSecondaryColor3iv_Hook(const GLint* v);
  void glSecondaryColor3s_Hook(GLshort red, GLshort green, GLshort blue);
  void glSecondaryColor3sv_Hook(const GLshort* v);
  void glSecondaryColor3ub_Hook(GLubyte red, GLubyte green, GLubyte blue);
  void glSecondaryColor3ubv_Hook(const GLubyte* v);
  void glSecondaryColor3ui_Hook(GLuint red, GLuint green, GLuint blue);
  void glSecondaryColor3uiv_Hook(const GLuint* v);
  void glSecondaryColor3us_Hook(GLushort red, GLushort green, GLushort blue);
  void glSecondaryColor3usv_Hook(const GLushort* v);
  void glSecondaryColorPointer_Hook(GLint size, GLenum type, GLsizei stride, const GLvoid* pointer);
  void glWindowPos2d_Hook(GLdouble x, GLdouble y);
  void glWindowPos2dv_Hook(const GLdouble* v);
  void glWindowPos2f_Hook(GLfloat x, GLfloat y);
  void glWindowPos2fv_Hook(const GLfloat* v);
  void glWindowPos2i_Hook(GLint x, GLint y);
  void glWindowPos2iv_Hook(const GLint* v);
  void glWindowPos2s_Hook(GLshort x, GLshort y);
  void glWindowPos2sv_Hook(const GLshort* v);
  void glWindowPos3d_Hook(GLdouble x, GLdouble y, GLdouble z);
  void glWindowPos3dv_Hook(const GLdouble* v);
  void glWindowPos3f_Hook(GLfloat x, GLfloat y, GLfloat z);
  void glWindowPos3fv_Hook(const GLfloat* v);
  void glWindowPos3i_Hook(GLint x, GLint y, GLint z);
  void glWindowPos3iv_Hook(const GLint* v);
  void glWindowPos3s_Hook(GLshort x, GLshort y, GLshort z);
  void glWindowPos3sv_Hook(const GLshort* v);

  // GL_VERSION_1_5
  void glGenQueries_Hook(GLsizei n, GLuint* ids);
  void glDeleteQueries_Hook(GLsizei n, const GLuint* ids);
  GLboolean glIsQuery_Hook(GLuint id);
  void glBeginQuery_Hook(GLenum target, GLuint id);
  void glEndQuery_Hook(GLenum target);
  void glGetQueryiv_Hook(GLenum target, GLenum pname, GLint* params);
  void glGetQueryObjectiv_Hook(GLuint id, GLenum pname, GLint* params);
  void glGetQueryObjectuiv_Hook(GLuint id, GLenum pname, GLuint* params);
  void glBindBuffer_Hook(GLenum target, GLuint buffer);
  void glDeleteBuffers_Hook(GLsizei n, const GLuint* buffers);
  void glGenBuffers_Hook(GLsizei n, GLuint* buffers);
  GLboolean glIsBuffer_Hook(GLuint buffer);
  void glBufferData_Hook(GLenum target, GLsizeiptr size, const GLvoid* data, GLenum usage);
  void glBufferSubData_Hook(GLenum target, GLintptr offset, GLsizeiptr size, const GLvoid* data);
  void glGetBufferSubData_Hook(GLenum target, GLintptr offset, GLsizeiptr size, GLvoid* data);
  GLvoid* glMapBuffer_Hook(GLenum target, GLenum access);
  GLboolean glUnmapBuffer_Hook(GLenum target);
  void glGetBufferParameteriv_Hook(GLenum target, GLenum pname, GLint* params);
  void glGetBufferPointerv_Hook(GLenum target, GLenum pname, GLvoid** params);

  // GL_VERSION_2_0
  void glBlendEquationSeparate_Hook(GLenum modeRGB, GLenum modeAlpha);
  void glDrawBuffers_Hook(GLsizei n, const GLenum* bufs);
  void glStencilOpSeparate_Hook(GLenum face, GLenum sfail, GLenum dpfail, GLenum dppass);
  void glStencilFuncSeparate_Hook(GLenum face, GLenum func, GLint ref, GLuint mask);
  void glStencilMaskSeparate_Hook(GLenum face, GLuint mask);
  void glAttachShader_Hook(GLuint program, GLuint shader);
  void glBindAttribLocation_Hook(GLuint program, GLuint index, const GLchar* name);
  void glCompileShader_Hook(GLuint shader);
  GLuint glCreateProgram_Hook(void);
  GLuint glCreateShader_Hook(GLenum type);
  void glDeleteProgram_Hook(GLuint program);
  void glDeleteShader_Hook(GLuint shader);
  void glDetachShader_Hook(GLuint program, GLuint shader);
  void glDisableVertexAttribArray_Hook(GLuint index);
  void glEnableVertexAttribArray_Hook(GLuint index);
  void glGetActiveAttrib_Hook(
      GLuint program,
      GLuint index,
      GLsizei bufSize,
      GLsizei* length,
      GLint* size,
      GLenum* type,
      GLchar* name);
  void glGetActiveUniform_Hook(
      GLuint program,
      GLuint index,
      GLsizei bufSize,
      GLsizei* length,
      GLint* size,
      GLenum* type,
      GLchar* name);
  void glGetAttachedShaders_Hook(GLuint program, GLsizei maxCount, GLsizei* count, GLuint* obj);
  GLint glGetAttribLocation_Hook(GLuint program, const GLchar* name);
  void glGetProgramiv_Hook(GLuint program, GLenum pname, GLint* params);
  void glGetProgramInfoLog_Hook(GLuint program, GLsizei bufSize, GLsizei* length, GLchar* infoLog);
  void glGetShaderiv_Hook(GLuint shader, GLenum pname, GLint* params);
  void glGetShaderInfoLog_Hook(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* infoLog);
  void glGetShaderSource_Hook(GLuint shader, GLsizei bufSize, GLsizei* length, GLchar* source);
  GLint glGetUniformLocation_Hook(GLuint program, const GLchar* name);
  void glGetUniformfv_Hook(GLuint program, GLint location, GLfloat* params);
  void glGetUniformiv_Hook(GLuint program, GLint location, GLint* params);
  void glGetVertexAttribdv_Hook(GLuint index, GLenum pname, GLdouble* params);
  void glGetVertexAttribfv_Hook(GLuint index, GLenum pname, GLfloat* params);
  void glGetVertexAttribiv_Hook(GLuint index, GLenum pname, GLint* params);
  void glGetVertexAttribPointerv_Hook(GLuint index, GLenum pname, GLvoid** pointer);
  GLboolean glIsProgram_Hook(GLuint program);
  GLboolean glIsShader_Hook(GLuint shader);
  void glLinkProgram_Hook(GLuint program);
  void
  glShaderSource_Hook(GLuint shader, GLsizei count, const GLchar** string, const GLint* length);
  void glUseProgram_Hook(GLuint program);
  void glUniform1f_Hook(GLint location, GLfloat v0);
  void glUniform2f_Hook(GLint location, GLfloat v0, GLfloat v1);
  void glUniform3f_Hook(GLint location, GLfloat v0, GLfloat v1, GLfloat v2);
  void glUniform4f_Hook(GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3);
  void glUniform1i_Hook(GLint location, GLint v0);
  void glUniform2i_Hook(GLint location, GLint v0, GLint v1);
  void glUniform3i_Hook(GLint location, GLint v0, GLint v1, GLint v2);
  void glUniform4i_Hook(GLint location, GLint v0, GLint v1, GLint v2, GLint v3);
  void glUniform1fv_Hook(GLint location, GLsizei count, const GLfloat* value);
  void glUniform2fv_Hook(GLint location, GLsizei count, const GLfloat* value);
  void glUniform3fv_Hook(GLint location, GLsizei count, const GLfloat* value);
  void glUniform4fv_Hook(GLint location, GLsizei count, const GLfloat* value);
  void glUniform1iv_Hook(GLint location, GLsizei count, const GLint* value);
  void glUniform2iv_Hook(GLint location, GLsizei count, const GLint* value);
  void glUniform3iv_Hook(GLint location, GLsizei count, const GLint* value);
  void glUniform4iv_Hook(GLint location, GLsizei count, const GLint* value);
  void
  glUniformMatrix2fv_Hook(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
  void
  glUniformMatrix3fv_Hook(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
  void
  glUniformMatrix4fv_Hook(GLint location, GLsizei count, GLboolean transpose, const GLfloat* value);
  void glValidateProgram_Hook(GLuint program);
  void glVertexAttrib1d_Hook(GLuint index, GLdouble x);
  void glVertexAttrib1dv_Hook(GLuint index, const GLdouble* v);
  void glVertexAttrib1f_Hook(GLuint index, GLfloat x);
  void glVertexAttrib1fv_Hook(GLuint index, const GLfloat* v);
  void glVertexAttrib1s_Hook(GLuint index, GLshort x);
  void glVertexAttrib1sv_Hook(GLuint index, const GLshort* v);
  void glVertexAttrib2d_Hook(GLuint index, GLdouble x, GLdouble y);
  void glVertexAttrib2dv_Hook(GLuint index, const GLdouble* v);
  void glVertexAttrib2f_Hook(GLuint index, GLfloat x, GLfloat y);
  void glVertexAttrib2fv_Hook(GLuint index, const GLfloat* v);
  void glVertexAttrib2s_Hook(GLuint index, GLshort x, GLshort y);
  void glVertexAttrib2sv_Hook(GLuint index, const GLshort* v);
  void glVertexAttrib3d_Hook(GLuint index, GLdouble x, GLdouble y, GLdouble z);
  void glVertexAttrib3dv_Hook(GLuint index, const GLdouble* v);
  void glVertexAttrib3f_Hook(GLuint index, GLfloat x, GLfloat y, GLfloat z);
  void glVertexAttrib3fv_Hook(GLuint index, const GLfloat* v);
  void glVertexAttrib3s_Hook(GLuint index, GLshort x, GLshort y, GLshort z);
  void glVertexAttrib3sv_Hook(GLuint index, const GLshort* v);
  void glVertexAttrib4Nbv_Hook(GLuint index, const GLbyte* v);
  void glVertexAttrib4Niv_Hook(GLuint index, const GLint* v);
  void glVertexAttrib4Nsv_Hook(GLuint index, const GLshort* v);
  void glVertexAttrib4Nub_Hook(GLuint index, GLubyte x, GLubyte y, GLubyte z, GLubyte w);
  void glVertexAttrib4Nubv_Hook(GLuint index, const GLubyte* v);
  void glVertexAttrib4Nuiv_Hook(GLuint index, const GLuint* v);
  void glVertexAttrib4Nusv_Hook(GLuint index, const GLushort* v);
  void glVertexAttrib4bv_Hook(GLuint index, const GLbyte* v);
  void glVertexAttrib4d_Hook(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w);
  void glVertexAttrib4dv_Hook(GLuint index, const GLdouble* v);
  void glVertexAttrib4f_Hook(GLuint index, GLfloat x, GLfloat y, GLfloat z, GLfloat w);
  void glVertexAttrib4fv_Hook(GLuint index, const GLfloat* v);
  void glVertexAttrib4iv_Hook(GLuint index, const GLint* v);
  void glVertexAttrib4s_Hook(GLuint index, GLshort x, GLshort y, GLshort z, GLshort w);
  void glVertexAttrib4sv_Hook(GLuint index, const GLshort* v);
  void glVertexAttrib4ubv_Hook(GLuint index, const GLubyte* v);
  void glVertexAttrib4uiv_Hook(GLuint index, const GLuint* v);
  void glVertexAttrib4usv_Hook(GLuint index, const GLushort* v);
  void glVertexAttribPointer_Hook(
      GLuint index,
      GLint size,
      GLenum type,
      GLboolean normalized,
      GLsizei stride,
      const GLvoid* pointer);

  // GL_VERSION_2_1
  void glUniformMatrix2x3fv_Hook(
      GLint location,
      GLsizei count,
      GLboolean transpose,
      const GLfloat* value);
  void glUniformMatrix3x2fv_Hook(
      GLint location,
      GLsizei count,
      GLboolean transpose,
      const GLfloat* value);
  void glUniformMatrix2x4fv_Hook(
      GLint location,
      GLsizei count,
      GLboolean transpose,
      const GLfloat* value);
  void glUniformMatrix4x2fv_Hook(
      GLint location,
      GLsizei count,
      GLboolean transpose,
      const GLfloat* value);
  void glUniformMatrix3x4fv_Hook(
      GLint location,
      GLsizei count,
      GLboolean transpose,
      const GLfloat* value);
  void glUniformMatrix4x3fv_Hook(
      GLint location,
      GLsizei count,
      GLboolean transpose,
      const GLfloat* value);

  // GL_VERSION_3_0
  void glColorMaski_Hook(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
  void glGetBooleani_v_Hook(GLenum target, GLuint index, GLboolean* data);
  void glGetIntegeri_v_Hook(GLenum target, GLuint index, GLint* data);
  void glEnablei_Hook(GLenum target, GLuint index);
  void glDisablei_Hook(GLenum target, GLuint index);
  GLboolean glIsEnabledi_Hook(GLenum target, GLuint index);
  void glBeginTransformFeedback_Hook(GLenum primitiveMode);
  void glEndTransformFeedback_Hook(void);
  void glBindBufferRange_Hook(
      GLenum target,
      GLuint index,
      GLuint buffer,
      GLintptr offset,
      GLsizeiptr size);
  void glBindBufferBase_Hook(GLenum target, GLuint index, GLuint buffer);
  void glTransformFeedbackVaryings_Hook(
      GLuint program,
      GLsizei count,
      const GLchar** varyings,
      GLenum bufferMode);
  void glGetTransformFeedbackVarying_Hook(
      GLuint program,
      GLuint index,
      GLsizei bufSize,
      GLsizei* length,
      GLsizei* size,
      GLenum* type,
      GLchar* name);
  void glClampColor_Hook(GLenum target, GLenum clamp);
  void glBeginConditionalRender_Hook(GLuint id, GLenum mode);
  void glEndConditionalRender_Hook(void);
  void glVertexAttribIPointer_Hook(
      GLuint index,
      GLint size,
      GLenum type,
      GLsizei stride,
      const GLvoid* pointer);
  void glGetVertexAttribIiv_Hook(GLuint index, GLenum pname, GLint* params);
  void glGetVertexAttribIuiv_Hook(GLuint index, GLenum pname, GLuint* params);
  void glVertexAttribI1i_Hook(GLuint index, GLint x);
  void glVertexAttribI2i_Hook(GLuint index, GLint x, GLint y);
  void glVertexAttribI3i_Hook(GLuint index, GLint x, GLint y, GLint z);
  void glVertexAttribI4i_Hook(GLuint index, GLint x, GLint y, GLint z, GLint w);
  void glVertexAttribI1ui_Hook(GLuint index, GLuint x);
  void glVertexAttribI2ui_Hook(GLuint index, GLuint x, GLuint y);
  void glVertexAttribI3ui_Hook(GLuint index, GLuint x, GLuint y, GLuint z);
  void glVertexAttribI4ui_Hook(GLuint index, GLuint x, GLuint y, GLuint z, GLuint w);
  void glVertexAttribI1iv_Hook(GLuint index, const GLint* v);
  void glVertexAttribI2iv_Hook(GLuint index, const GLint* v);
  void glVertexAttribI3iv_Hook(GLuint index, const GLint* v);
  void glVertexAttribI4iv_Hook(GLuint index, const GLint* v);
  void glVertexAttribI1uiv_Hook(GLuint index, const GLuint* v);
  void glVertexAttribI2uiv_Hook(GLuint index, const GLuint* v);
  void glVertexAttribI3uiv_Hook(GLuint index, const GLuint* v);
  void glVertexAttribI4uiv_Hook(GLuint index, const GLuint* v);
  void glVertexAttribI4bv_Hook(GLuint index, const GLbyte* v);
  void glVertexAttribI4sv_Hook(GLuint index, const GLshort* v);
  void glVertexAttribI4ubv_Hook(GLuint index, const GLubyte* v);
  void glVertexAttribI4usv_Hook(GLuint index, const GLushort* v);
  void glGetUniformuiv_Hook(GLuint program, GLint location, GLuint* params);
  void glBindFragDataLocation_Hook(GLuint program, GLuint color, const GLchar* name);
  GLint glGetFragDataLocation_Hook(GLuint program, const GLchar* name);
  void glUniform1ui_Hook(GLint location, GLuint v0);
  void glUniform2ui_Hook(GLint location, GLuint v0, GLuint v1);
  void glUniform3ui_Hook(GLint location, GLuint v0, GLuint v1, GLuint v2);
  void glUniform4ui_Hook(GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3);
  void glUniform1uiv_Hook(GLint location, GLsizei count, const GLuint* value);
  void glUniform2uiv_Hook(GLint location, GLsizei count, const GLuint* value);
  void glUniform3uiv_Hook(GLint location, GLsizei count, const GLuint* value);
  void glUniform4uiv_Hook(GLint location, GLsizei count, const GLuint* value);
  void glTexParameterIiv_Hook(GLenum target, GLenum pname, const GLint* params);
  void glTexParameterIuiv_Hook(GLenum target, GLenum pname, const GLuint* params);
  void glGetTexParameterIiv_Hook(GLenum target, GLenum pname, GLint* params);
  void glGetTexParameterIuiv_Hook(GLenum target, GLenum pname, GLuint* params);
  void glClearBufferiv_Hook(GLenum buffer, GLint drawbuffer, const GLint* value);
  void glClearBufferuiv_Hook(GLenum buffer, GLint drawbuffer, const GLuint* value);
  void glClearBufferfv_Hook(GLenum buffer, GLint drawbuffer, const GLfloat* value);
  void glClearBufferfi_Hook(GLenum buffer, GLint drawbuffer, GLfloat depth, GLint stencil);
  const GLubyte* glGetStringi_Hook(GLenum name, GLuint index);

  // GL_VERSION_3_1
  void glDrawArraysInstanced_Hook(GLenum mode, GLint first, GLsizei count, GLsizei primcount);
  void glDrawElementsInstanced_Hook(
      GLenum mode,
      GLsizei count,
      GLenum type,
      const GLvoid* indices,
      GLsizei primcount);
  void glTexBuffer_Hook(GLenum target, GLenum internalformat, GLuint buffer);
  void glPrimitiveRestartIndex_Hook(GLuint index);

  // GL_VERSION_3_2
  void glGetInteger64i_v_Hook(GLenum target, GLuint index, GLint64* data);
  void glGetBufferParameteri64v_Hook(GLenum target, GLenum pname, GLint64* params);
  void glFramebufferTexture_Hook(GLenum target, GLenum attachment, GLuint texture, GLint level);

  // GL_VERSION_3_3
  void glVertexAttribDivisor_Hook(GLuint index, GLuint divisor);

  // GL_VERSION_4_0
  void glMinSampleShading_Hook(GLclampf value);
  void glBlendEquationi_Hook(GLuint buf, GLenum mode);
  void glBlendEquationSeparatei_Hook(GLuint buf, GLenum modeRGB, GLenum modeAlpha);
  void glBlendFunci_Hook(GLuint buf, GLenum src, GLenum dst);
  void glBlendFuncSeparatei_Hook(
      GLuint buf,
      GLenum srcRGB,
      GLenum dstRGB,
      GLenum srcAlpha,
      GLenum dstAlpha);

  // GL_AMD_debug_output
  void glDebugMessageEnableAMD_Hook(
      GLenum category,
      GLenum severity,
      GLsizei count,
      const GLuint* ids,
      GLboolean enabled);
  void glDebugMessageInsertAMD_Hook(
      GLenum category,
      GLenum severity,
      GLuint id,
      GLsizei length,
      const GLchar* buf);
  void glDebugMessageCallbackAMD_Hook(GLDEBUGPROCAMD callback, GLvoid* userParam);
  GLuint glGetDebugMessageLogAMD_Hook(
      GLuint count,
      GLsizei bufsize,
      GLenum* categories,
      GLuint* severities,
      GLuint* ids,
      GLsizei* lengths,
      GLchar* message);

#if defined(GLE_CGL_ENABLED)
  // GL_APPLE_element_array
  void glElementPointerAPPLE_Hook(GLenum type, const GLvoid* pointer);
  void glDrawElementArrayAPPLE_Hook(GLenum mode, GLint first, GLsizei count);
  void glDrawRangeElementArrayAPPLE_Hook(
      GLenum mode,
      GLuint start,
      GLuint end,
      GLint first,
      GLsizei count);
  void glMultiDrawElementArrayAPPLE_Hook(
      GLenum mode,
      const GLint* first,
      const GLsizei* count,
      GLsizei primcount);
  void glMultiDrawRangeElementArrayAPPLE_Hook(
      GLenum mode,
      GLuint start,
      GLuint end,
      const GLint* first,
      const GLsizei* count,
      GLsizei primcount);

  // GL_APPLE_fence
  void glGenFencesAPPLE_Hook(GLsizei n, GLuint* fences);
  void glDeleteFencesAPPLE_Hook(GLsizei n, const GLuint* fences);
  void glSetFenceAPPLE_Hook(GLuint fence);
  GLboolean glIsFenceAPPLE_Hook(GLuint fence);
  GLboolean glTestFenceAPPLE_Hook(GLuint fence);
  void glFinishFenceAPPLE_Hook(GLuint fence);
  GLboolean glTestObjectAPPLE_Hook(GLenum object, GLuint name);
  void glFinishObjectAPPLE_Hook(GLenum object, GLint name);

  // GL_APPLE_flush_buffer_range
  void glBufferParameteriAPPLE_Hook(GLenum target, GLenum pname, GLint param);
  void glFlushMappedBufferRangeAPPLE_Hook(GLenum target, GLintptr offset, GLsizeiptr size);

  // GL_APPLE_object_purgeable
  GLenum glObjectPurgeableAPPLE_Hook(GLenum objectType, GLuint name, GLenum option);
  GLenum glObjectUnpurgeableAPPLE_Hook(GLenum objectType, GLuint name, GLenum option);
  void
  glGetObjectParameterivAPPLE_Hook(GLenum objectType, GLuint name, GLenum pname, GLint* params);

  // GL_APPLE_texture_range
  void glTextureRangeAPPLE_Hook(GLenum target, GLsizei length, const GLvoid* pointer);
  void glGetTexParameterPointervAPPLE_Hook(GLenum target, GLenum pname, GLvoid** params);

  // GL_APPLE_vertex_array_object
  void glBindVertexArrayAPPLE_Hook(GLuint array);
  void glDeleteVertexArraysAPPLE_Hook(GLsizei n, const GLuint* arrays);
  void glGenVertexArraysAPPLE_Hook(GLsizei n, GLuint* arrays);
  GLboolean glIsVertexArrayAPPLE_Hook(GLuint array);

  // GL_APPLE_vertex_array_range
  void glVertexArrayRangeAPPLE_Hook(GLsizei length, GLvoid* pointer);
  void glFlushVertexArrayRangeAPPLE_Hook(GLsizei length, GLvoid* pointer);
  void glVertexArrayParameteriAPPLE_Hook(GLenum pname, GLint param);

  // GL_APPLE_vertex_program_evaluators
  void glEnableVertexAttribAPPLE_Hook(GLuint index, GLenum pname);
  void glDisableVertexAttribAPPLE_Hook(GLuint index, GLenum pname);
  GLboolean glIsVertexAttribEnabledAPPLE_Hook(GLuint index, GLenum pname);
  void glMapVertexAttrib1dAPPLE_Hook(
      GLuint index,
      GLuint size,
      GLdouble u1,
      GLdouble u2,
      GLint stride,
      GLint order,
      const GLdouble* points);
  void glMapVertexAttrib1fAPPLE_Hook(
      GLuint index,
      GLuint size,
      GLfloat u1,
      GLfloat u2,
      GLint stride,
      GLint order,
      const GLfloat* points);
  void glMapVertexAttrib2dAPPLE_Hook(
      GLuint index,
      GLuint size,
      GLdouble u1,
      GLdouble u2,
      GLint ustride,
      GLint uorder,
      GLdouble v1,
      GLdouble v2,
      GLint vstride,
      GLint vorder,
      const GLdouble* points);
  void glMapVertexAttrib2fAPPLE_Hook(
      GLuint index,
      GLuint size,
      GLfloat u1,
      GLfloat u2,
      GLint ustride,
      GLint uorder,
      GLfloat v1,
      GLfloat v2,
      GLint vstride,
      GLint vorder,
      const GLfloat* points);
#endif // GLE_CGL_ENABLED

  // GL_ARB_copy_buffer
  void glCopyBufferSubData_Hook(
      GLenum readtarget,
      GLenum writetarget,
      GLintptr readoffset,
      GLintptr writeoffset,
      GLsizeiptr size);

  // GL_ARB_debug_output
  void glDebugMessageControlARB_Hook(
      GLenum source,
      GLenum type,
      GLenum severity,
      GLsizei count,
      const GLuint* ids,
      GLboolean enabled);
  void glDebugMessageInsertARB_Hook(
      GLenum source,
      GLenum type,
      GLuint id,
      GLenum severity,
      GLsizei length,
      const GLchar* buf);
  void glDebugMessageCallbackARB_Hook(GLDEBUGPROCARB callback, const GLvoid* userParam);
  GLuint glGetDebugMessageLogARB_Hook(
      GLuint count,
      GLsizei bufsize,
      GLenum* sources,
      GLenum* types,
      GLuint* ids,
      GLenum* severities,
      GLsizei* lengths,
      GLchar* messageLog);

  // GL_ARB_ES2_compatibility
  void glReleaseShaderCompiler_Hook();
  void glShaderBinary_Hook(
      GLsizei count,
      const GLuint* shaders,
      GLenum binaryformat,
      const GLvoid* binary,
      GLsizei length);
  void glGetShaderPrecisionFormat_Hook(
      GLenum shadertype,
      GLenum precisiontype,
      GLint* range,
      GLint* precision);
  void glDepthRangef_Hook(GLclampf n, GLclampf f);
  void glClearDepthf_Hook(GLclampf d);

  // GL_ARB_framebuffer_object
  GLboolean glIsRenderbuffer_Hook(GLuint renderbuffer);
  void glBindRenderbuffer_Hook(GLenum target, GLuint renderbuffer);
  void glDeleteRenderbuffers_Hook(GLsizei n, const GLuint* renderbuffers);
  void glGenRenderbuffers_Hook(GLsizei n, GLuint* renderbuffers);
  void
  glRenderbufferStorage_Hook(GLenum target, GLenum internalformat, GLsizei width, GLsizei height);
  void glGetRenderbufferParameteriv_Hook(GLenum target, GLenum pname, GLint* params);
  GLboolean glIsFramebuffer_Hook(GLuint framebuffer);
  void glBindFramebuffer_Hook(GLenum target, GLuint framebuffer);
  void glDeleteFramebuffers_Hook(GLsizei n, const GLuint* framebuffers);
  void glGenFramebuffers_Hook(GLsizei n, GLuint* framebuffers);
  GLenum glCheckFramebufferStatus_Hook(GLenum target);
  void glFramebufferTexture1D_Hook(
      GLenum target,
      GLenum attachment,
      GLenum textarget,
      GLuint texture,
      GLint level);
  void glFramebufferTexture2D_Hook(
      GLenum target,
      GLenum attachment,
      GLenum textarget,
      GLuint texture,
      GLint level);
  void glFramebufferTexture3D_Hook(
      GLenum target,
      GLenum attachment,
      GLenum textarget,
      GLuint texture,
      GLint level,
      GLint zoffset);
  void glFramebufferRenderbuffer_Hook(
      GLenum target,
      GLenum attachment,
      GLenum renderbuffertarget,
      GLuint renderbuffer);
  void glGetFramebufferAttachmentParameteriv_Hook(
      GLenum target,
      GLenum attachment,
      GLenum pname,
      GLint* params);
  void glGenerateMipmap_Hook(GLenum target);
  void glBlitFramebuffer_Hook(
      GLint srcX0,
      GLint srcY0,
      GLint srcX1,
      GLint srcY1,
      GLint dstX0,
      GLint dstY0,
      GLint dstX1,
      GLint dstY1,
      GLbitfield mask,
      GLenum filter);
  void glRenderbufferStorageMultisample_Hook(
      GLenum target,
      GLsizei samples,
      GLenum internalformat,
      GLsizei width,
      GLsizei height);
  void glFramebufferTextureLayer_Hook(
      GLenum target,
      GLenum attachment,
      GLuint texture,
      GLint level,
      GLint layer);

  // GL_ARB_texture_multisample
  void glTexImage2DMultisample_Hook(
      GLenum target,
      GLsizei samples,
      GLint internalformat,
      GLsizei width,
      GLsizei height,
      GLboolean fixedsamplelocations);
  void glTexImage3DMultisample_Hook(
      GLenum target,
      GLsizei samples,
      GLint internalformat,
      GLsizei width,
      GLsizei height,
      GLsizei depth,
      GLboolean fixedsamplelocations);
  void glGetMultisamplefv_Hook(GLenum pname, GLuint index, GLfloat* val);
  void glSampleMaski_Hook(GLuint index, GLbitfield mask);

  // GL_ARB_texture_storage
  void glTexStorage1D_Hook(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width);
  void glTexStorage2D_Hook(
      GLenum target,
      GLsizei levels,
      GLenum internalformat,
      GLsizei width,
      GLsizei height);
  void glTexStorage3D_Hook(
      GLenum target,
      GLsizei levels,
      GLenum internalformat,
      GLsizei width,
      GLsizei height,
      GLsizei depth);
  void glTextureStorage1DEXT_Hook(
      GLuint texture,
      GLenum target,
      GLsizei levels,
      GLenum internalformat,
      GLsizei width);
  void glTextureStorage2DEXT_Hook(
      GLuint texture,
      GLenum target,
      GLsizei levels,
      GLenum internalformat,
      GLsizei width,
      GLsizei height);
  void glTextureStorage3DEXT_Hook(
      GLuint texture,
      GLenum target,
      GLsizei levels,
      GLenum internalformat,
      GLsizei width,
      GLsizei height,
      GLsizei depth);

  // GL_ARB_texture_storage_multisample
  void glTexStorage2DMultisample_Hook(
      GLenum target,
      GLsizei samples,
      GLenum internalformat,
      GLsizei width,
      GLsizei height,
      GLboolean fixedsamplelocations);
  void glTexStorage3DMultisample_Hook(
      GLenum target,
      GLsizei samples,
      GLenum internalformat,
      GLsizei width,
      GLsizei height,
      GLsizei depth,
      GLboolean fixedsamplelocations);
  void glTextureStorage2DMultisampleEXT_Hook(
      GLuint texture,
      GLenum target,
      GLsizei samples,
      GLenum internalformat,
      GLsizei width,
      GLsizei height,
      GLboolean fixedsamplelocations);
  void glTextureStorage3DMultisampleEXT_Hook(
      GLuint texture,
      GLenum target,
      GLsizei samples,
      GLenum internalformat,
      GLsizei width,
      GLsizei height,
      GLsizei depth,
      GLboolean fixedsamplelocations);

  // GL_ARB_timer_query
  void glQueryCounter_Hook(GLuint id, GLenum target);
  void glGetQueryObjecti64v_Hook(GLuint id, GLenum pname, GLint64* params);
  void glGetQueryObjectui64v_Hook(GLuint id, GLenum pname, GLuint64* params);

  // GL_ARB_vertex_array_object
  void glBindVertexArray_Hook(GLuint array);
  void glDeleteVertexArrays_Hook(GLsizei n, const GLuint* arrays);
  void glGenVertexArrays_Hook(GLsizei n, GLuint* arrays);
  GLboolean glIsVertexArray_Hook(GLuint array);

  // GL_EXT_draw_buffers2
  void glColorMaskIndexedEXT_Hook(GLuint index, GLboolean r, GLboolean g, GLboolean b, GLboolean a);
  void glGetBooleanIndexedvEXT_Hook(GLenum target, GLuint index, GLboolean* data);
  void glGetIntegerIndexedvEXT_Hook(GLenum target, GLuint index, GLint* data);
  void glEnableIndexedEXT_Hook(GLenum target, GLuint index);
  void glDisableIndexedEXT_Hook(GLenum target, GLuint index);
  GLboolean glIsEnabledIndexedEXT_Hook(GLenum target, GLuint index);

  // GL_KHR_debug
  void glDebugMessageControl_Hook(
      GLenum source,
      GLenum type,
      GLenum severity,
      GLsizei count,
      const GLuint* ids,
      GLboolean enabled);
  void glDebugMessageInsert_Hook(
      GLenum source,
      GLenum type,
      GLuint id,
      GLenum severity,
      GLsizei length,
      const char* buf);
  void glDebugMessageCallback_Hook(GLDEBUGPROC callback, const void* userParam);
  GLuint glGetDebugMessageLog_Hook(
      GLuint count,
      GLsizei bufSize,
      GLenum* sources,
      GLenum* types,
      GLuint* ids,
      GLenum* severities,
      GLsizei* lengths,
      char* messageLog);
  void glPushDebugGroup_Hook(GLenum source, GLuint id, GLsizei length, const char* message);
  void glPopDebugGroup_Hook(void);
  void glObjectLabel_Hook(GLenum identifier, GLuint name, GLsizei length, const char* label);
  void glGetObjectLabel_Hook(
      GLenum identifier,
      GLuint name,
      GLsizei bufSize,
      GLsizei* length,
      char* label);
  void glObjectPtrLabel_Hook(void* ptr, GLsizei length, const char* label);
  void glGetObjectPtrLabel_Hook(void* ptr, GLsizei bufSize, GLsizei* length, char* label);

  // GL_WIN_swap_hint
  void glAddSwapHintRectWIN_Hook(GLint x, GLint y, GLsizei width, GLsizei height);

#if defined(GLE_WGL_ENABLED)
  void PostWGLHook(const char* functionName);

  // WGL
  /* Hooking of these is currently disabled.
  BOOL  wglCopyContext_Hook(HGLRC, HGLRC, UINT);
  HGLRC wglCreateContext_Hook(HDC);
  HGLRC wglCreateLayerContext_Hook(HDC, int);
  BOOL  wglDeleteContext_Hook(HGLRC);
  HGLRC wglGetCurrentContext_Hook(VOID);
  HDC   wglGetCurrentDC_Hook(VOID);
  PROC  wglGetProcAddress_Hook(LPCSTR);
  BOOL  wglMakeCurrent_Hook(HDC, HGLRC);
  BOOL  wglShareLists_Hook(HGLRC, HGLRC);
  BOOL  wglUseFontBitmapsA_Hook(HDC, DWORD, DWORD, DWORD);
  BOOL  wglUseFontBitmapsW_Hook(HDC, DWORD, DWORD, DWORD);
  BOOL  wglUseFontOutlinesA_Hook(HDC, DWORD, DWORD, DWORD, FLOAT, FLOAT, int, LPGLYPHMETRICSFLOAT);
  BOOL  wglUseFontOutlinesW_Hook(HDC, DWORD, DWORD, DWORD, FLOAT, FLOAT, int, LPGLYPHMETRICSFLOAT);
  BOOL  wglDescribeLayerPlane_Hook(HDC, int, int, UINT, LPLAYERPLANEDESCRIPTOR);
  int   wglSetLayerPaletteEntries_Hook(HDC, int, int, int, CONST COLORREF *);
  int   wglGetLayerPaletteEntries_Hook(HDC, int, int, int, COLORREF *);
  BOOL  wglRealizeLayerPalette_Hook(HDC, int, BOOL);
  BOOL  wglSwapLayerBuffers_Hook(HDC, UINT);
  DWORD wglSwapMultipleBuffers_Hook(UINT, CONST WGLSWAP *);
  */

  // WGL_ARB_buffer_region
  HANDLE wglCreateBufferRegionARB_Hook(HDC hDC, int iLayerPlane, UINT uType);
  VOID wglDeleteBufferRegionARB_Hook(HANDLE hRegion);
  BOOL wglSaveBufferRegionARB_Hook(HANDLE hRegion, int x, int y, int width, int height);
  BOOL wglRestoreBufferRegionARB_Hook(
      HANDLE hRegion,
      int x,
      int y,
      int width,
      int height,
      int xSrc,
      int ySrc);

  // WGL_ARB_extensions_string
  const char* wglGetExtensionsStringARB_Hook(HDC hdc);

  // WGL_ARB_pixel_format
  BOOL wglGetPixelFormatAttribivARB_Hook(
      HDC hdc,
      int iPixelFormat,
      int iLayerPlane,
      UINT nAttributes,
      const int* piAttributes,
      int* piValues);
  BOOL wglGetPixelFormatAttribfvARB_Hook(
      HDC hdc,
      int iPixelFormat,
      int iLayerPlane,
      UINT nAttributes,
      const int* piAttributes,
      FLOAT* pfValues);
  BOOL wglChoosePixelFormatARB_Hook(
      HDC hdc,
      const int* piAttribIList,
      const FLOAT* pfAttribFList,
      UINT nMaxFormats,
      int* piFormats,
      UINT* nNumFormats);

  // WGL_ARB_make_current_read
  BOOL wglMakeContextCurrentARB_Hook(HDC hDrawDC, HDC hReadDC, HGLRC hglrc);
  HDC wglGetCurrentReadDCARB_Hook(void);

  // WGL_ARB_pbuffer
  HPBUFFERARB wglCreatePbufferARB_Hook(
      HDC hDC,
      int iPixelFormat,
      int iWidth,
      int iHeight,
      const int* piAttribList);
  HDC wglGetPbufferDCARB_Hook(HPBUFFERARB hPbuffer);
  int wglReleasePbufferDCARB_Hook(HPBUFFERARB hPbuffer, HDC hDC);
  BOOL wglDestroyPbufferARB_Hook(HPBUFFERARB hPbuffer);
  BOOL wglQueryPbufferARB_Hook(HPBUFFERARB hPbuffer, int iAttribute, int* piValue);

  // WGL_ARB_render_texture
  BOOL wglBindTexImageARB_Hook(HPBUFFERARB hPbuffer, int iBuffer);
  BOOL wglReleaseTexImageARB_Hook(HPBUFFERARB hPbuffer, int iBuffer);
  BOOL wglSetPbufferAttribARB_Hook(HPBUFFERARB hPbuffer, const int* piAttribList);

  // WGL_NV_present_video
  int wglEnumerateVideoDevicesNV_Hook(HDC hDC, HVIDEOOUTPUTDEVICENV* phDeviceList);
  BOOL wglBindVideoDeviceNV_Hook(
      HDC hDC,
      unsigned int uVideoSlot,
      HVIDEOOUTPUTDEVICENV hVideoDevice,
      const int* piAttribList);
  BOOL wglQueryCurrentContextNV_Hook(int iAttribute, int* piValue);

  // WGL_ARB_create_context
  HGLRC wglCreateContextAttribsARB_Hook(HDC hDC, HGLRC hShareContext, const int* attribList);

  // WGL_EXT_extensions_string
  const char* wglGetExtensionsStringEXT_Hook();

  // WGL_EXT_swap_control
  BOOL wglSwapIntervalEXT_Hook(int interval);
  int wglGetSwapIntervalEXT_Hook();

  // WGL_OML_sync_control
  BOOL wglGetSyncValuesOML_Hook(HDC hdc, INT64* ust, INT64* msc, INT64* sbc);
  BOOL wglGetMscRateOML_Hook(HDC hdc, INT32* numerator, INT32* denominator);
  INT64 wglSwapBuffersMscOML_Hook(HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder);
  INT64 wglSwapLayerBuffersMscOML_Hook(
      HDC hdc,
      int fuPlanes,
      INT64 target_msc,
      INT64 divisor,
      INT64 remainder);
  BOOL wglWaitForMscOML_Hook(
      HDC hdc,
      INT64 target_msc,
      INT64 divisor,
      INT64 remainder,
      INT64* ust,
      INT64* msc,
      INT64* sbc);
  BOOL wglWaitForSbcOML_Hook(HDC hdc, INT64 target_sbc, INT64* ust, INT64* msc, INT64* sbc);

  // WGL_NV_video_output
  BOOL wglGetVideoDeviceNV_Hook(HDC hDC, int numDevices, HPVIDEODEV* hVideoDevice);
  BOOL wglReleaseVideoDeviceNV_Hook(HPVIDEODEV hVideoDevice);
  BOOL wglBindVideoImageNV_Hook(HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer);
  BOOL wglReleaseVideoImageNV_Hook(HPBUFFERARB hPbuffer, int iVideoBuffer);
  BOOL wglSendPbufferToVideoNV_Hook(
      HPBUFFERARB hPbuffer,
      int iBufferType,
      unsigned long* pulCounterPbuffer,
      BOOL bBlock);
  BOOL wglGetVideoInfoNV_Hook(
      HPVIDEODEV hpVideoDevice,
      unsigned long* pulCounterOutputPbuffer,
      unsigned long* pulCounterOutputVideo);

  // WGL_NV_swap_group
  BOOL wglJoinSwapGroupNV_Hook(HDC hDC, GLuint group);
  BOOL wglBindSwapBarrierNV_Hook(GLuint group, GLuint barrier);
  BOOL wglQuerySwapGroupNV_Hook(HDC hDC, GLuint* group, GLuint* barrier);
  BOOL wglQueryMaxSwapGroupsNV_Hook(HDC hDC, GLuint* maxGroups, GLuint* maxBarriers);
  BOOL wglQueryFrameCountNV_Hook(HDC hDC, GLuint* count);
  BOOL wglResetFrameCountNV_Hook(HDC hDC);

  // WGL_NV_video_capture
  BOOL wglBindVideoCaptureDeviceNV_Hook(UINT uVideoSlot, HVIDEOINPUTDEVICENV hDevice);
  UINT wglEnumerateVideoCaptureDevicesNV_Hook(HDC hDc, HVIDEOINPUTDEVICENV* phDeviceList);
  BOOL wglLockVideoCaptureDeviceNV_Hook(HDC hDc, HVIDEOINPUTDEVICENV hDevice);
  BOOL wglQueryVideoCaptureDeviceNV_Hook(
      HDC hDc,
      HVIDEOINPUTDEVICENV hDevice,
      int iAttribute,
      int* piValue);
  BOOL wglReleaseVideoCaptureDeviceNV_Hook(HDC hDc, HVIDEOINPUTDEVICENV hDevice);

  // WGL_NV_copy_image
  BOOL wglCopyImageSubDataNV_Hook(
      HGLRC hSrcRC,
      GLuint srcName,
      GLenum srcTarget,
      GLint srcLevel,
      GLint srcX,
      GLint srcY,
      GLint srcZ,
      HGLRC hDstRC,
      GLuint dstName,
      GLenum dstTarget,
      GLint dstLevel,
      GLint dstX,
      GLint dstY,
      GLint dstZ,
      GLsizei width,
      GLsizei height,
      GLsizei depth);

  // WGL_NV_DX_interop
  BOOL wglDXSetResourceShareHandleNV_Hook(void* dxObject, HANDLE shareHandle);
  HANDLE wglDXOpenDeviceNV_Hook(void* dxDevice);
  BOOL wglDXCloseDeviceNV_Hook(HANDLE hDevice);
  HANDLE wglDXRegisterObjectNV_Hook(
      HANDLE hDevice,
      void* dxObject,
      GLuint name,
      GLenum type,
      GLenum access);
  BOOL wglDXUnregisterObjectNV_Hook(HANDLE hDevice, HANDLE hObject);
  BOOL wglDXObjectAccessNV_Hook(HANDLE hObject, GLenum access);
  BOOL wglDXLockObjectsNV_Hook(HANDLE hDevice, GLint count, HANDLE* hObjects);
  BOOL wglDXUnlockObjectsNV_Hook(HANDLE hDevice, GLint count, HANDLE* hObjects);
#endif // GLE_WGL_ENABLED

#if defined(GLE_GLX_ENABLED)
  void PostGLXHook(const char* functionName);

  // GLX_VERSION_1_0
  // GLX_VERSION_1_1
  // We don't currently do hooking of these.

  // GLX_VERSION_1_2
  ::Display* glXGetCurrentDisplay_Hook(void);

  // GLX_VERSION_1_3
  GLXFBConfig*
  glXChooseFBConfig_Hook(::Display* dpy, int screen, const int* attrib_list, int* nelements);
  GLXContext glXCreateNewContext_Hook(
      ::Display* dpy,
      GLXFBConfig config,
      int render_type,
      GLXContext share_list,
      Bool direct);
  GLXPbuffer glXCreatePbuffer_Hook(::Display* dpy, GLXFBConfig config, const int* attrib_list);
  GLXPixmap
  glXCreatePixmap_Hook(::Display* dpy, GLXFBConfig config, Pixmap pixmap, const int* attrib_list);
  GLXWindow
  glXCreateWindow_Hook(::Display* dpy, GLXFBConfig config, Window win, const int* attrib_list);
  void glXDestroyPbuffer_Hook(::Display* dpy, GLXPbuffer pbuf);
  void glXDestroyPixmap_Hook(::Display* dpy, GLXPixmap pixmap);
  void glXDestroyWindow_Hook(::Display* dpy, GLXWindow win);
  GLXDrawable glXGetCurrentReadDrawable_Hook(void);
  int glXGetFBConfigAttrib_Hook(::Display* dpy, GLXFBConfig config, int attribute, int* value);
  GLXFBConfig* glXGetFBConfigs_Hook(::Display* dpy, int screen, int* nelements);
  void glXGetSelectedEvent_Hook(::Display* dpy, GLXDrawable draw, unsigned long* event_mask);
  XVisualInfo* glXGetVisualFromFBConfig_Hook(::Display* dpy, GLXFBConfig config);
  Bool glXMakeContextCurrent_Hook(
      ::Display* display,
      GLXDrawable draw,
      GLXDrawable read,
      GLXContext ctx);
  int glXQueryContext_Hook(::Display* dpy, GLXContext ctx, int attribute, int* value);
  void glXQueryDrawable_Hook(::Display* dpy, GLXDrawable draw, int attribute, unsigned int* value);
  void glXSelectEvent_Hook(::Display* dpy, GLXDrawable draw, unsigned long event_mask);

  // GLX_VERSION_1_4
  // We don't do hooking of this.

  // GLX_ARB_create_context
  GLXContext glXCreateContextAttribsARB_Hook(
      Display* dpy,
      GLXFBConfig config,
      GLXContext share_context,
      Bool direct,
      const int* attrib_list);

  // GLX_EXT_swap_control
  void glXSwapIntervalEXT_Hook(::Display* dpy, GLXDrawable drawable, int interval);

  // GLX_OML_sync_control
  Bool glXGetMscRateOML_Hook(
      ::Display* dpy,
      GLXDrawable drawable,
      int32_t* numerator,
      int32_t* denominator);
  Bool glXGetSyncValuesOML_Hook(
      ::Display* dpy,
      GLXDrawable drawable,
      int64_t* ust,
      int64_t* msc,
      int64_t* sbc);
  int64_t glXSwapBuffersMscOML_Hook(
      ::Display* dpy,
      GLXDrawable drawable,
      int64_t target_msc,
      int64_t divisor,
      int64_t remainder);
  Bool glXWaitForMscOML_Hook(
      ::Display* dpy,
      GLXDrawable drawable,
      int64_t target_msc,
      int64_t divisor,
      int64_t remainder,
      int64_t* ust,
      int64_t* msc,
      int64_t* sbc);
  Bool glXWaitForSbcOML_Hook(
      ::Display* dpy,
      GLXDrawable drawable,
      int64_t target_sbc,
      int64_t* ust,
      int64_t* msc,
      int64_t* sbc);

  // GLX_MESA_swap_control
  int glXGetSwapIntervalMESA_Hook();
  int glXSwapIntervalMESA_Hook(unsigned int interval);

#endif // GLE_GLX_ENABLED

#endif // #if defined(GLE_HOOKING_ENABLED)

  // GL_VERSION_1_1
  // These are not represented by function pointers.

  // GL_VERSION_1_2
  PFNGLCOPYTEXSUBIMAGE3DPROC glCopyTexSubImage3D_Impl;
  PFNGLDRAWRANGEELEMENTSPROC glDrawRangeElements_Impl;
  PFNGLTEXIMAGE3DPROC glTexImage3D_Impl;
  PFNGLTEXSUBIMAGE3DPROC glTexSubImage3D_Impl;

  // GL_VERSION_1_2 deprecated functions
  /* Not currently supported
  PFNGLCOLORTABLEPROC glColorTable_Impl;
  PFNGLCOLORTABLEPARAMETERFVPROC glColorTableParameterfv_Impl;
  PFNGLCOLORTABLEPARAMETERIVPROC glColorTableParameteriv_Impl;
  PFNGLCOPYCOLORTABLEPROC glCopyColorTable_Impl;
  PFNGLGETCOLORTABLEPROC glGetColorTable_Impl;
  PFNGLGETCOLORTABLEPARAMETERFVPROC glGetColorTableParameterfv_Impl;
  PFNGLGETCOLORTABLEPARAMETERIVPROC glGetColorTableParameteriv_Impl;
  PFNGLCOLORSUBTABLEPROC glColorSubTable_Impl;
  PFNGLCOPYCOLORSUBTABLEPROC glCopyColorSubTable_Impl;
  PFNGLCONVOLUTIONFILTER1DPROC glConvolutionFilter1D_Impl;
  PFNGLCONVOLUTIONFILTER2DPROC glConvolutionFilter2D_Impl;
  PFNGLCONVOLUTIONPARAMETERFPROC glConvolutionParameterf_Impl;
  PFNGLCONVOLUTIONPARAMETERFVPROC glConvolutionParameterfv_Impl;
  PFNGLCONVOLUTIONPARAMETERIPROC glConvolutionParameteri_Impl;
  PFNGLCONVOLUTIONPARAMETERIVPROC glConvolutionParameteriv_Impl;
  PFNGLCOPYCONVOLUTIONFILTER1DPROC glCopyConvolutionFilter1D_Impl;
  PFNGLCOPYCONVOLUTIONFILTER2DPROC glCopyConvolutionFilter2D_Impl;
  PFNGLGETCONVOLUTIONFILTERPROC glGetConvolutionFilter_Impl;
  PFNGLGETCONVOLUTIONPARAMETERFVPROC glGetConvolutionParameterfv_Impl;
  PFNGLGETCONVOLUTIONPARAMETERIVPROC glGetConvolutionParameteriv_Impl;
  PFNGLGETSEPARABLEFILTERPROC glGetSeparableFilter_Impl;
  PFNGLSEPARABLEFILTER2DPROC glSeparableFilter2D_Impl;
  PFNGLGETHISTOGRAMPROC glGetHistogram_Impl;
  PFNGLGETHISTOGRAMPARAMETERFVPROC glGetHistogramParameterfv_Impl;
  PFNGLGETHISTOGRAMPARAMETERIVPROC glGetHistogramParameteriv_Impl;
  PFNGLGETMINMAXPROC glGetMinmax_Impl;
  PFNGLGETMINMAXPARAMETERFVPROC glGetMinmaxParameterfv_Impl;
  PFNGLGETMINMAXPARAMETERIVPROC glGetMinmaxParameteriv_Impl;
  PFNGLHISTOGRAMPROC glHistogram_Impl;
  PFNGLMINMAXPROC glMinmax_Impl;
  PFNGLRESETHISTOGRAMPROC glResetHistogram_Impl;
  PFNGLRESETMINMAXPROC glResetMinmax_Impl;
  */

  // GL_VERSION_1_3
  PFNGLACTIVETEXTUREPROC glActiveTexture_Impl;
  PFNGLCLIENTACTIVETEXTUREPROC glClientActiveTexture_Impl;
  PFNGLCOMPRESSEDTEXIMAGE1DPROC glCompressedTexImage1D_Impl;
  PFNGLCOMPRESSEDTEXIMAGE2DPROC glCompressedTexImage2D_Impl;
  PFNGLCOMPRESSEDTEXIMAGE3DPROC glCompressedTexImage3D_Impl;
  PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glCompressedTexSubImage1D_Impl;
  PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glCompressedTexSubImage2D_Impl;
  PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glCompressedTexSubImage3D_Impl;
  PFNGLGETCOMPRESSEDTEXIMAGEPROC glGetCompressedTexImage_Impl;
  PFNGLLOADTRANSPOSEMATRIXDPROC glLoadTransposeMatrixd_Impl;
  PFNGLLOADTRANSPOSEMATRIXFPROC glLoadTransposeMatrixf_Impl;
  PFNGLMULTTRANSPOSEMATRIXDPROC glMultTransposeMatrixd_Impl;
  PFNGLMULTTRANSPOSEMATRIXFPROC glMultTransposeMatrixf_Impl;
  PFNGLMULTITEXCOORD1DPROC glMultiTexCoord1d_Impl;
  PFNGLMULTITEXCOORD1DVPROC glMultiTexCoord1dv_Impl;
  PFNGLMULTITEXCOORD1FPROC glMultiTexCoord1f_Impl;
  PFNGLMULTITEXCOORD1FVPROC glMultiTexCoord1fv_Impl;
  PFNGLMULTITEXCOORD1IPROC glMultiTexCoord1i_Impl;
  PFNGLMULTITEXCOORD1IVPROC glMultiTexCoord1iv_Impl;
  PFNGLMULTITEXCOORD1SPROC glMultiTexCoord1s_Impl;
  PFNGLMULTITEXCOORD1SVPROC glMultiTexCoord1sv_Impl;
  PFNGLMULTITEXCOORD2DPROC glMultiTexCoord2d_Impl;
  PFNGLMULTITEXCOORD2DVPROC glMultiTexCoord2dv_Impl;
  PFNGLMULTITEXCOORD2FPROC glMultiTexCoord2f_Impl;
  PFNGLMULTITEXCOORD2FVPROC glMultiTexCoord2fv_Impl;
  PFNGLMULTITEXCOORD2IPROC glMultiTexCoord2i_Impl;
  PFNGLMULTITEXCOORD2IVPROC glMultiTexCoord2iv_Impl;
  PFNGLMULTITEXCOORD2SPROC glMultiTexCoord2s_Impl;
  PFNGLMULTITEXCOORD2SVPROC glMultiTexCoord2sv_Impl;
  PFNGLMULTITEXCOORD3DPROC glMultiTexCoord3d_Impl;
  PFNGLMULTITEXCOORD3DVPROC glMultiTexCoord3dv_Impl;
  PFNGLMULTITEXCOORD3FPROC glMultiTexCoord3f_Impl;
  PFNGLMULTITEXCOORD3FVPROC glMultiTexCoord3fv_Impl;
  PFNGLMULTITEXCOORD3IPROC glMultiTexCoord3i_Impl;
  PFNGLMULTITEXCOORD3IVPROC glMultiTexCoord3iv_Impl;
  PFNGLMULTITEXCOORD3SPROC glMultiTexCoord3s_Impl;
  PFNGLMULTITEXCOORD3SVPROC glMultiTexCoord3sv_Impl;
  PFNGLMULTITEXCOORD4DPROC glMultiTexCoord4d_Impl;
  PFNGLMULTITEXCOORD4DVPROC glMultiTexCoord4dv_Impl;
  PFNGLMULTITEXCOORD4FPROC glMultiTexCoord4f_Impl;
  PFNGLMULTITEXCOORD4FVPROC glMultiTexCoord4fv_Impl;
  PFNGLMULTITEXCOORD4IPROC glMultiTexCoord4i_Impl;
  PFNGLMULTITEXCOORD4IVPROC glMultiTexCoord4iv_Impl;
  PFNGLMULTITEXCOORD4SPROC glMultiTexCoord4s_Impl;
  PFNGLMULTITEXCOORD4SVPROC glMultiTexCoord4sv_Impl;
  PFNGLSAMPLECOVERAGEPROC glSampleCoverage_Impl;

  // GL_VERSION_1_4
  PFNGLBLENDCOLORPROC glBlendColor_Impl;
  PFNGLBLENDEQUATIONPROC glBlendEquation_Impl;
  PFNGLBLENDFUNCSEPARATEPROC glBlendFuncSeparate_Impl;
  PFNGLFOGCOORDPOINTERPROC glFogCoordPointer_Impl;
  PFNGLFOGCOORDDPROC glFogCoordd_Impl;
  PFNGLFOGCOORDDVPROC glFogCoorddv_Impl;
  PFNGLFOGCOORDFPROC glFogCoordf_Impl;
  PFNGLFOGCOORDFVPROC glFogCoordfv_Impl;
  PFNGLMULTIDRAWARRAYSPROC glMultiDrawArrays_Impl;
  PFNGLMULTIDRAWELEMENTSPROC glMultiDrawElements_Impl;
  PFNGLPOINTPARAMETERFPROC glPointParameterf_Impl;
  PFNGLPOINTPARAMETERFVPROC glPointParameterfv_Impl;
  PFNGLPOINTPARAMETERIPROC glPointParameteri_Impl;
  PFNGLPOINTPARAMETERIVPROC glPointParameteriv_Impl;
  PFNGLSECONDARYCOLOR3BPROC glSecondaryColor3b_Impl;
  PFNGLSECONDARYCOLOR3BVPROC glSecondaryColor3bv_Impl;
  PFNGLSECONDARYCOLOR3DPROC glSecondaryColor3d_Impl;
  PFNGLSECONDARYCOLOR3DVPROC glSecondaryColor3dv_Impl;
  PFNGLSECONDARYCOLOR3FPROC glSecondaryColor3f_Impl;
  PFNGLSECONDARYCOLOR3FVPROC glSecondaryColor3fv_Impl;
  PFNGLSECONDARYCOLOR3IPROC glSecondaryColor3i_Impl;
  PFNGLSECONDARYCOLOR3IVPROC glSecondaryColor3iv_Impl;
  PFNGLSECONDARYCOLOR3SPROC glSecondaryColor3s_Impl;
  PFNGLSECONDARYCOLOR3SVPROC glSecondaryColor3sv_Impl;
  PFNGLSECONDARYCOLOR3UBPROC glSecondaryColor3ub_Impl;
  PFNGLSECONDARYCOLOR3UBVPROC glSecondaryColor3ubv_Impl;
  PFNGLSECONDARYCOLOR3UIPROC glSecondaryColor3ui_Impl;
  PFNGLSECONDARYCOLOR3UIVPROC glSecondaryColor3uiv_Impl;
  PFNGLSECONDARYCOLOR3USPROC glSecondaryColor3us_Impl;
  PFNGLSECONDARYCOLOR3USVPROC glSecondaryColor3usv_Impl;
  PFNGLSECONDARYCOLORPOINTERPROC glSecondaryColorPointer_Impl;
  PFNGLWINDOWPOS2DPROC glWindowPos2d_Impl;
  PFNGLWINDOWPOS2DVPROC glWindowPos2dv_Impl;
  PFNGLWINDOWPOS2FPROC glWindowPos2f_Impl;
  PFNGLWINDOWPOS2FVPROC glWindowPos2fv_Impl;
  PFNGLWINDOWPOS2IPROC glWindowPos2i_Impl;
  PFNGLWINDOWPOS2IVPROC glWindowPos2iv_Impl;
  PFNGLWINDOWPOS2SPROC glWindowPos2s_Impl;
  PFNGLWINDOWPOS2SVPROC glWindowPos2sv_Impl;
  PFNGLWINDOWPOS3DPROC glWindowPos3d_Impl;
  PFNGLWINDOWPOS3DVPROC glWindowPos3dv_Impl;
  PFNGLWINDOWPOS3FPROC glWindowPos3f_Impl;
  PFNGLWINDOWPOS3FVPROC glWindowPos3fv_Impl;
  PFNGLWINDOWPOS3IPROC glWindowPos3i_Impl;
  PFNGLWINDOWPOS3IVPROC glWindowPos3iv_Impl;
  PFNGLWINDOWPOS3SPROC glWindowPos3s_Impl;
  PFNGLWINDOWPOS3SVPROC glWindowPos3sv_Impl;

  // GL_VERSION_1_5
  PFNGLBEGINQUERYPROC glBeginQuery_Impl;
  PFNGLBINDBUFFERPROC glBindBuffer_Impl;
  PFNGLBUFFERDATAPROC glBufferData_Impl;
  PFNGLBUFFERSUBDATAPROC glBufferSubData_Impl;
  PFNGLDELETEBUFFERSPROC glDeleteBuffers_Impl;
  PFNGLDELETEQUERIESPROC glDeleteQueries_Impl;
  PFNGLENDQUERYPROC glEndQuery_Impl;
  PFNGLGENBUFFERSPROC glGenBuffers_Impl;
  PFNGLGENQUERIESPROC glGenQueries_Impl;
  PFNGLGETBUFFERPARAMETERIVPROC glGetBufferParameteriv_Impl;
  PFNGLGETBUFFERPOINTERVPROC glGetBufferPointerv_Impl;
  PFNGLGETBUFFERSUBDATAPROC glGetBufferSubData_Impl;
  PFNGLGETQUERYOBJECTIVPROC glGetQueryObjectiv_Impl;
  PFNGLGETQUERYOBJECTUIVPROC glGetQueryObjectuiv_Impl;
  PFNGLGETQUERYIVPROC glGetQueryiv_Impl;
  PFNGLISBUFFERPROC glIsBuffer_Impl;
  PFNGLISQUERYPROC glIsQuery_Impl;
  PFNGLMAPBUFFERPROC glMapBuffer_Impl;
  PFNGLUNMAPBUFFERPROC glUnmapBuffer_Impl;

  // GL_VERSION_2_0
  PFNGLATTACHSHADERPROC glAttachShader_Impl;
  PFNGLBINDATTRIBLOCATIONPROC glBindAttribLocation_Impl;
  PFNGLBLENDEQUATIONSEPARATEPROC glBlendEquationSeparate_Impl;
  PFNGLCOMPILESHADERPROC glCompileShader_Impl;
  PFNGLCREATEPROGRAMPROC glCreateProgram_Impl;
  PFNGLCREATESHADERPROC glCreateShader_Impl;
  PFNGLDELETEPROGRAMPROC glDeleteProgram_Impl;
  PFNGLDELETESHADERPROC glDeleteShader_Impl;
  PFNGLDETACHSHADERPROC glDetachShader_Impl;
  PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray_Impl;
  PFNGLDRAWBUFFERSPROC glDrawBuffers_Impl;
  PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray_Impl;
  PFNGLGETACTIVEATTRIBPROC glGetActiveAttrib_Impl;
  PFNGLGETACTIVEUNIFORMPROC glGetActiveUniform_Impl;
  PFNGLGETATTACHEDSHADERSPROC glGetAttachedShaders_Impl;
  PFNGLGETATTRIBLOCATIONPROC glGetAttribLocation_Impl;
  PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog_Impl;
  PFNGLGETPROGRAMIVPROC glGetProgramiv_Impl;
  PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog_Impl;
  PFNGLGETSHADERSOURCEPROC glGetShaderSource_Impl;
  PFNGLGETSHADERIVPROC glGetShaderiv_Impl;
  PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation_Impl;
  PFNGLGETUNIFORMFVPROC glGetUniformfv_Impl;
  PFNGLGETUNIFORMIVPROC glGetUniformiv_Impl;
  PFNGLGETVERTEXATTRIBPOINTERVPROC glGetVertexAttribPointerv_Impl;
  PFNGLGETVERTEXATTRIBDVPROC glGetVertexAttribdv_Impl;
  PFNGLGETVERTEXATTRIBFVPROC glGetVertexAttribfv_Impl;
  PFNGLGETVERTEXATTRIBIVPROC glGetVertexAttribiv_Impl;
  PFNGLISPROGRAMPROC glIsProgram_Impl;
  PFNGLISSHADERPROC glIsShader_Impl;
  PFNGLLINKPROGRAMPROC glLinkProgram_Impl;
  PFNGLSHADERSOURCEPROC glShaderSource_Impl;
  PFNGLSTENCILFUNCSEPARATEPROC glStencilFuncSeparate_Impl;
  PFNGLSTENCILMASKSEPARATEPROC glStencilMaskSeparate_Impl;
  PFNGLSTENCILOPSEPARATEPROC glStencilOpSeparate_Impl;
  PFNGLUNIFORM1FPROC glUniform1f_Impl;
  PFNGLUNIFORM1FVPROC glUniform1fv_Impl;
  PFNGLUNIFORM1IPROC glUniform1i_Impl;
  PFNGLUNIFORM1IVPROC glUniform1iv_Impl;
  PFNGLUNIFORM2FPROC glUniform2f_Impl;
  PFNGLUNIFORM2FVPROC glUniform2fv_Impl;
  PFNGLUNIFORM2IPROC glUniform2i_Impl;
  PFNGLUNIFORM2IVPROC glUniform2iv_Impl;
  PFNGLUNIFORM3FPROC glUniform3f_Impl;
  PFNGLUNIFORM3FVPROC glUniform3fv_Impl;
  PFNGLUNIFORM3IPROC glUniform3i_Impl;
  PFNGLUNIFORM3IVPROC glUniform3iv_Impl;
  PFNGLUNIFORM4FPROC glUniform4f_Impl;
  PFNGLUNIFORM4FVPROC glUniform4fv_Impl;
  PFNGLUNIFORM4IPROC glUniform4i_Impl;
  PFNGLUNIFORM4IVPROC glUniform4iv_Impl;
  PFNGLUNIFORMMATRIX2FVPROC glUniformMatrix2fv_Impl;
  PFNGLUNIFORMMATRIX3FVPROC glUniformMatrix3fv_Impl;
  PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv_Impl;
  PFNGLUSEPROGRAMPROC glUseProgram_Impl;
  PFNGLVALIDATEPROGRAMPROC glValidateProgram_Impl;
  PFNGLVERTEXATTRIB1DPROC glVertexAttrib1d_Impl;
  PFNGLVERTEXATTRIB1DVPROC glVertexAttrib1dv_Impl;
  PFNGLVERTEXATTRIB1FPROC glVertexAttrib1f_Impl;
  PFNGLVERTEXATTRIB1FVPROC glVertexAttrib1fv_Impl;
  PFNGLVERTEXATTRIB1SPROC glVertexAttrib1s_Impl;
  PFNGLVERTEXATTRIB1SVPROC glVertexAttrib1sv_Impl;
  PFNGLVERTEXATTRIB2DPROC glVertexAttrib2d_Impl;
  PFNGLVERTEXATTRIB2DVPROC glVertexAttrib2dv_Impl;
  PFNGLVERTEXATTRIB2FPROC glVertexAttrib2f_Impl;
  PFNGLVERTEXATTRIB2FVPROC glVertexAttrib2fv_Impl;
  PFNGLVERTEXATTRIB2SPROC glVertexAttrib2s_Impl;
  PFNGLVERTEXATTRIB2SVPROC glVertexAttrib2sv_Impl;
  PFNGLVERTEXATTRIB3DPROC glVertexAttrib3d_Impl;
  PFNGLVERTEXATTRIB3DVPROC glVertexAttrib3dv_Impl;
  PFNGLVERTEXATTRIB3FPROC glVertexAttrib3f_Impl;
  PFNGLVERTEXATTRIB3FVPROC glVertexAttrib3fv_Impl;
  PFNGLVERTEXATTRIB3SPROC glVertexAttrib3s_Impl;
  PFNGLVERTEXATTRIB3SVPROC glVertexAttrib3sv_Impl;
  PFNGLVERTEXATTRIB4NBVPROC glVertexAttrib4Nbv_Impl;
  PFNGLVERTEXATTRIB4NIVPROC glVertexAttrib4Niv_Impl;
  PFNGLVERTEXATTRIB4NSVPROC glVertexAttrib4Nsv_Impl;
  PFNGLVERTEXATTRIB4NUBPROC glVertexAttrib4Nub_Impl;
  PFNGLVERTEXATTRIB4NUBVPROC glVertexAttrib4Nubv_Impl;
  PFNGLVERTEXATTRIB4NUIVPROC glVertexAttrib4Nuiv_Impl;
  PFNGLVERTEXATTRIB4NUSVPROC glVertexAttrib4Nusv_Impl;
  PFNGLVERTEXATTRIB4BVPROC glVertexAttrib4bv_Impl;
  PFNGLVERTEXATTRIB4DPROC glVertexAttrib4d_Impl;
  PFNGLVERTEXATTRIB4DVPROC glVertexAttrib4dv_Impl;
  PFNGLVERTEXATTRIB4FPROC glVertexAttrib4f_Impl;
  PFNGLVERTEXATTRIB4FVPROC glVertexAttrib4fv_Impl;
  PFNGLVERTEXATTRIB4IVPROC glVertexAttrib4iv_Impl;
  PFNGLVERTEXATTRIB4SPROC glVertexAttrib4s_Impl;
  PFNGLVERTEXATTRIB4SVPROC glVertexAttrib4sv_Impl;
  PFNGLVERTEXATTRIB4UBVPROC glVertexAttrib4ubv_Impl;
  PFNGLVERTEXATTRIB4UIVPROC glVertexAttrib4uiv_Impl;
  PFNGLVERTEXATTRIB4USVPROC glVertexAttrib4usv_Impl;
  PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer_Impl;

  // GL_VERSION_2_1
  PFNGLUNIFORMMATRIX2X3FVPROC glUniformMatrix2x3fv_Impl;
  PFNGLUNIFORMMATRIX2X4FVPROC glUniformMatrix2x4fv_Impl;
  PFNGLUNIFORMMATRIX3X2FVPROC glUniformMatrix3x2fv_Impl;
  PFNGLUNIFORMMATRIX3X4FVPROC glUniformMatrix3x4fv_Impl;
  PFNGLUNIFORMMATRIX4X2FVPROC glUniformMatrix4x2fv_Impl;
  PFNGLUNIFORMMATRIX4X3FVPROC glUniformMatrix4x3fv_Impl;

  // GL_VERSION_3_0
  PFNGLBEGINCONDITIONALRENDERPROC glBeginConditionalRender_Impl;
  PFNGLBEGINTRANSFORMFEEDBACKPROC glBeginTransformFeedback_Impl;
  PFNGLBINDFRAGDATALOCATIONPROC glBindFragDataLocation_Impl;
  PFNGLCLAMPCOLORPROC glClampColor_Impl;
  PFNGLCLEARBUFFERFIPROC glClearBufferfi_Impl;
  PFNGLCLEARBUFFERFVPROC glClearBufferfv_Impl;
  PFNGLCLEARBUFFERIVPROC glClearBufferiv_Impl;
  PFNGLCLEARBUFFERUIVPROC glClearBufferuiv_Impl;
  PFNGLCOLORMASKIPROC glColorMaski_Impl;
  PFNGLDISABLEIPROC glDisablei_Impl;
  PFNGLENABLEIPROC glEnablei_Impl;
  PFNGLENDCONDITIONALRENDERPROC glEndConditionalRender_Impl;
  PFNGLENDTRANSFORMFEEDBACKPROC glEndTransformFeedback_Impl;
  PFNGLBINDBUFFERRANGEPROC glBindBufferRange_Impl;
  PFNGLBINDBUFFERBASEPROC glBindBufferBase_Impl;
  PFNGLGETBOOLEANI_VPROC glGetBooleani_v_Impl;
  PFNGLGETINTEGERI_VPROC glGetIntegeri_v_Impl;
  PFNGLGETFRAGDATALOCATIONPROC glGetFragDataLocation_Impl;
  PFNGLGETSTRINGIPROC glGetStringi_Impl;
  PFNGLGETTEXPARAMETERIIVPROC glGetTexParameterIiv_Impl;
  PFNGLGETTEXPARAMETERIUIVPROC glGetTexParameterIuiv_Impl;
  PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glGetTransformFeedbackVarying_Impl;
  PFNGLGETUNIFORMUIVPROC glGetUniformuiv_Impl;
  PFNGLGETVERTEXATTRIBIIVPROC glGetVertexAttribIiv_Impl;
  PFNGLGETVERTEXATTRIBIUIVPROC glGetVertexAttribIuiv_Impl;
  PFNGLISENABLEDIPROC glIsEnabledi_Impl;
  PFNGLTEXPARAMETERIIVPROC glTexParameterIiv_Impl;
  PFNGLTEXPARAMETERIUIVPROC glTexParameterIuiv_Impl;
  PFNGLTRANSFORMFEEDBACKVARYINGSPROC glTransformFeedbackVaryings_Impl;
  PFNGLUNIFORM1UIPROC glUniform1ui_Impl;
  PFNGLUNIFORM1UIVPROC glUniform1uiv_Impl;
  PFNGLUNIFORM2UIPROC glUniform2ui_Impl;
  PFNGLUNIFORM2UIVPROC glUniform2uiv_Impl;
  PFNGLUNIFORM3UIPROC glUniform3ui_Impl;
  PFNGLUNIFORM3UIVPROC glUniform3uiv_Impl;
  PFNGLUNIFORM4UIPROC glUniform4ui_Impl;
  PFNGLUNIFORM4UIVPROC glUniform4uiv_Impl;
  PFNGLVERTEXATTRIBI1IPROC glVertexAttribI1i_Impl;
  PFNGLVERTEXATTRIBI1IVPROC glVertexAttribI1iv_Impl;
  PFNGLVERTEXATTRIBI1UIPROC glVertexAttribI1ui_Impl;
  PFNGLVERTEXATTRIBI1UIVPROC glVertexAttribI1uiv_Impl;
  PFNGLVERTEXATTRIBI2IPROC glVertexAttribI2i_Impl;
  PFNGLVERTEXATTRIBI2IVPROC glVertexAttribI2iv_Impl;
  PFNGLVERTEXATTRIBI2UIPROC glVertexAttribI2ui_Impl;
  PFNGLVERTEXATTRIBI2UIVPROC glVertexAttribI2uiv_Impl;
  PFNGLVERTEXATTRIBI3IPROC glVertexAttribI3i_Impl;
  PFNGLVERTEXATTRIBI3IVPROC glVertexAttribI3iv_Impl;
  PFNGLVERTEXATTRIBI3UIPROC glVertexAttribI3ui_Impl;
  PFNGLVERTEXATTRIBI3UIVPROC glVertexAttribI3uiv_Impl;
  PFNGLVERTEXATTRIBI4BVPROC glVertexAttribI4bv_Impl;
  PFNGLVERTEXATTRIBI4IPROC glVertexAttribI4i_Impl;
  PFNGLVERTEXATTRIBI4IVPROC glVertexAttribI4iv_Impl;
  PFNGLVERTEXATTRIBI4SVPROC glVertexAttribI4sv_Impl;
  PFNGLVERTEXATTRIBI4UBVPROC glVertexAttribI4ubv_Impl;
  PFNGLVERTEXATTRIBI4UIPROC glVertexAttribI4ui_Impl;
  PFNGLVERTEXATTRIBI4UIVPROC glVertexAttribI4uiv_Impl;
  PFNGLVERTEXATTRIBI4USVPROC glVertexAttribI4usv_Impl;
  PFNGLVERTEXATTRIBIPOINTERPROC glVertexAttribIPointer_Impl;

  // GL_VERSION_3_1
  PFNGLDRAWARRAYSINSTANCEDPROC glDrawArraysInstanced_Impl;
  PFNGLDRAWELEMENTSINSTANCEDPROC glDrawElementsInstanced_Impl;
  PFNGLPRIMITIVERESTARTINDEXPROC glPrimitiveRestartIndex_Impl;
  PFNGLTEXBUFFERPROC glTexBuffer_Impl;

  // GL_VERSION_3_2
  PFNGLFRAMEBUFFERTEXTUREPROC glFramebufferTexture_Impl;
  PFNGLGETBUFFERPARAMETERI64VPROC glGetBufferParameteri64v_Impl;
  PFNGLGETINTEGER64I_VPROC glGetInteger64i_v_Impl;

  // GL_VERSION_3_3
  PFNGLVERTEXATTRIBDIVISORPROC glVertexAttribDivisor_Impl;

  // GL_VERSION_4_0
  PFNGLBLENDEQUATIONSEPARATEIPROC glBlendEquationSeparatei_Impl;
  PFNGLBLENDEQUATIONIPROC glBlendEquationi_Impl;
  PFNGLBLENDFUNCSEPARATEIPROC glBlendFuncSeparatei_Impl;
  PFNGLBLENDFUNCIPROC glBlendFunci_Impl;
  PFNGLMINSAMPLESHADINGPROC glMinSampleShading_Impl;

  // GL_VERSION_4_2
  PFNGLMEMORYBARRIER glMemoryBarrier_Impl;

  // GL_VERSION_4_3
  PFNGLDISPATCHCOMPUTEPROC glDispatchCompute_Impl;
  PFNGLBINDIMAGETEXTUREPROC glBindImageTexture_Impl;

  // GL_AMD_debug_output
  PFNGLDEBUGMESSAGECALLBACKAMDPROC glDebugMessageCallbackAMD_Impl;
  PFNGLDEBUGMESSAGEENABLEAMDPROC glDebugMessageEnableAMD_Impl;
  PFNGLDEBUGMESSAGEINSERTAMDPROC glDebugMessageInsertAMD_Impl;
  PFNGLGETDEBUGMESSAGELOGAMDPROC glGetDebugMessageLogAMD_Impl;

#if defined(GLE_CGL_ENABLED)
  // GL_APPLE_aux_depth_stencil
  // (no functions)

  // GL_APPLE_client_storage
  // (no functions)

  // GL_APPLE_element_array
  PFNGLDRAWELEMENTARRAYAPPLEPROC glDrawElementArrayAPPLE_Impl;
  PFNGLDRAWRANGEELEMENTARRAYAPPLEPROC glDrawRangeElementArrayAPPLE_Impl;
  PFNGLELEMENTPOINTERAPPLEPROC glElementPointerAPPLE_Impl;
  PFNGLMULTIDRAWELEMENTARRAYAPPLEPROC glMultiDrawElementArrayAPPLE_Impl;
  PFNGLMULTIDRAWRANGEELEMENTARRAYAPPLEPROC glMultiDrawRangeElementArrayAPPLE_Impl;

  // GL_APPLE_fence
  PFNGLDELETEFENCESAPPLEPROC glDeleteFencesAPPLE_Impl;
  PFNGLFINISHFENCEAPPLEPROC glFinishFenceAPPLE_Impl;
  PFNGLFINISHOBJECTAPPLEPROC glFinishObjectAPPLE_Impl;
  PFNGLGENFENCESAPPLEPROC glGenFencesAPPLE_Impl;
  PFNGLISFENCEAPPLEPROC glIsFenceAPPLE_Impl;
  PFNGLSETFENCEAPPLEPROC glSetFenceAPPLE_Impl;
  PFNGLTESTFENCEAPPLEPROC glTestFenceAPPLE_Impl;
  PFNGLTESTOBJECTAPPLEPROC glTestObjectAPPLE_Impl;

  // GL_APPLE_float_pixels
  // (no functions)

  // GL_APPLE_flush_buffer_range
  PFNGLBUFFERPARAMETERIAPPLEPROC glBufferParameteriAPPLE_Impl;
  PFNGLFLUSHMAPPEDBUFFERRANGEAPPLEPROC glFlushMappedBufferRangeAPPLE_Impl;

  // GL_APPLE_object_purgeable
  PFNGLGETOBJECTPARAMETERIVAPPLEPROC glGetObjectParameterivAPPLE_Impl;
  PFNGLOBJECTPURGEABLEAPPLEPROC glObjectPurgeableAPPLE_Impl;
  PFNGLOBJECTUNPURGEABLEAPPLEPROC glObjectUnpurgeableAPPLE_Impl;

  // GL_APPLE_pixel_buffer
  // (no functions)

  // GL_APPLE_rgb_422
  // (no functions)

  // GL_APPLE_row_bytes
  // (no functions)

  // GL_APPLE_specular_vector
  // (no functions)

  // GL_APPLE_texture_range
  PFNGLGETTEXPARAMETERPOINTERVAPPLEPROC glGetTexParameterPointervAPPLE_Impl;
  PFNGLTEXTURERANGEAPPLEPROC glTextureRangeAPPLE_Impl;

  // GL_APPLE_transform_hint
  // (no functions)

  // GL_APPLE_vertex_array_object
  PFNGLBINDVERTEXARRAYAPPLEPROC glBindVertexArrayAPPLE_Impl;
  PFNGLDELETEVERTEXARRAYSAPPLEPROC glDeleteVertexArraysAPPLE_Impl;
  PFNGLGENVERTEXARRAYSAPPLEPROC glGenVertexArraysAPPLE_Impl;
  PFNGLISVERTEXARRAYAPPLEPROC glIsVertexArrayAPPLE_Impl;

  // GL_APPLE_vertex_array_range
  PFNGLFLUSHVERTEXARRAYRANGEAPPLEPROC glFlushVertexArrayRangeAPPLE_Impl;
  PFNGLVERTEXARRAYPARAMETERIAPPLEPROC glVertexArrayParameteriAPPLE_Impl;
  PFNGLVERTEXARRAYRANGEAPPLEPROC glVertexArrayRangeAPPLE_Impl;

  // GL_APPLE_vertex_program_evaluators
  PFNGLDISABLEVERTEXATTRIBAPPLEPROC glDisableVertexAttribAPPLE_Impl;
  PFNGLENABLEVERTEXATTRIBAPPLEPROC glEnableVertexAttribAPPLE_Impl;
  PFNGLISVERTEXATTRIBENABLEDAPPLEPROC glIsVertexAttribEnabledAPPLE_Impl;
  PFNGLMAPVERTEXATTRIB1DAPPLEPROC glMapVertexAttrib1dAPPLE_Impl;
  PFNGLMAPVERTEXATTRIB1FAPPLEPROC glMapVertexAttrib1fAPPLE_Impl;
  PFNGLMAPVERTEXATTRIB2DAPPLEPROC glMapVertexAttrib2dAPPLE_Impl;
  PFNGLMAPVERTEXATTRIB2FAPPLEPROC glMapVertexAttrib2fAPPLE_Impl;
#endif // GLE_CGL_ENABLED

  // GL_ARB_copy_buffer
  PFNGLCOPYBUFFERSUBDATAPROC glCopyBufferSubData_Impl;

  // GL_ARB_debug_output
  PFNGLDEBUGMESSAGECALLBACKARBPROC glDebugMessageCallbackARB_Impl;
  PFNGLDEBUGMESSAGECONTROLARBPROC glDebugMessageControlARB_Impl;
  PFNGLDEBUGMESSAGEINSERTARBPROC glDebugMessageInsertARB_Impl;
  PFNGLGETDEBUGMESSAGELOGARBPROC glGetDebugMessageLogARB_Impl;

  // GL_ARB_ES2_compatibility
  PFNGLCLEARDEPTHFPROC glClearDepthf_Impl;
  PFNGLDEPTHRANGEFPROC glDepthRangef_Impl;
  PFNGLGETSHADERPRECISIONFORMATPROC glGetShaderPrecisionFormat_Impl;
  PFNGLRELEASESHADERCOMPILERPROC glReleaseShaderCompiler_Impl;
  PFNGLSHADERBINARYPROC glShaderBinary_Impl;

  // GL_ARB_framebuffer_object
  PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer_Impl;
  PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer_Impl;
  PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer_Impl;
  PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus_Impl;
  PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers_Impl;
  PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers_Impl;
  PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer_Impl;
  PFNGLFRAMEBUFFERTEXTURE1DPROC glFramebufferTexture1D_Impl;
  PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D_Impl;
  PFNGLFRAMEBUFFERTEXTURE3DPROC glFramebufferTexture3D_Impl;
  PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer_Impl;
  PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers_Impl;
  PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers_Impl;
  PFNGLGENERATEMIPMAPPROC glGenerateMipmap_Impl;
  PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv_Impl;
  PFNGLGETRENDERBUFFERPARAMETERIVPROC glGetRenderbufferParameteriv_Impl;
  PFNGLISFRAMEBUFFERPROC glIsFramebuffer_Impl;
  PFNGLISRENDERBUFFERPROC glIsRenderbuffer_Impl;
  PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage_Impl;
  PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample_Impl;

  // GL_ARB_framebuffer_sRGB
  // (no functions)

  // GL_ARB_texture_multisample
  PFNGLGETMULTISAMPLEFVPROC glGetMultisamplefv_Impl;
  PFNGLSAMPLEMASKIPROC glSampleMaski_Impl;
  PFNGLTEXIMAGE2DMULTISAMPLEPROC glTexImage2DMultisample_Impl;
  PFNGLTEXIMAGE3DMULTISAMPLEPROC glTexImage3DMultisample_Impl;

  // GL_ARB_texture_non_power_of_two
  // (no functions)

  // GL_ARB_texture_rectangle
  // (no functions)

  // GL_ARB_texture_storage
  PFNGLTEXSTORAGE1DPROC glTexStorage1D_Impl;
  PFNGLTEXSTORAGE2DPROC glTexStorage2D_Impl;
  PFNGLTEXSTORAGE3DPROC glTexStorage3D_Impl;
  PFNGLTEXTURESTORAGE1DEXTPROC glTextureStorage1DEXT_Impl;
  PFNGLTEXTURESTORAGE2DEXTPROC glTextureStorage2DEXT_Impl;
  PFNGLTEXTURESTORAGE3DEXTPROC glTextureStorage3DEXT_Impl;

  // GL_ARB_texture_storage_multisample
  PFNGLTEXSTORAGE2DMULTISAMPLEPROC glTexStorage2DMultisample_Impl;
  PFNGLTEXSTORAGE3DMULTISAMPLEPROC glTexStorage3DMultisample_Impl;
  PFNGLTEXTURESTORAGE2DMULTISAMPLEEXTPROC glTextureStorage2DMultisampleEXT_Impl;
  PFNGLTEXTURESTORAGE3DMULTISAMPLEEXTPROC glTextureStorage3DMultisampleEXT_Impl;

  // GL_ARB_timer_query
  PFNGLGETQUERYOBJECTI64VPROC glGetQueryObjecti64v_Impl;
  PFNGLGETQUERYOBJECTUI64VPROC glGetQueryObjectui64v_Impl;
  PFNGLQUERYCOUNTERPROC glQueryCounter_Impl;

  // GL_ARB_vertex_array_object
  PFNGLBINDVERTEXARRAYPROC glBindVertexArray_Impl;
  PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays_Impl;
  PFNGLGENVERTEXARRAYSPROC glGenVertexArrays_Impl;
  PFNGLISVERTEXARRAYPROC glIsVertexArray_Impl;

  // GL_EXT_draw_buffers2
  PFNGLCOLORMASKINDEXEDEXTPROC glColorMaskIndexedEXT_Impl;
  PFNGLDISABLEINDEXEDEXTPROC glDisableIndexedEXT_Impl;
  PFNGLENABLEINDEXEDEXTPROC glEnableIndexedEXT_Impl;
  PFNGLGETBOOLEANINDEXEDVEXTPROC glGetBooleanIndexedvEXT_Impl;
  PFNGLGETINTEGERINDEXEDVEXTPROC glGetIntegerIndexedvEXT_Impl;
  PFNGLISENABLEDINDEXEDEXTPROC glIsEnabledIndexedEXT_Impl;

  // GL_EXT_texture_filter_anisotropic
  // (no functions)

  // GL_KHR_debug
  PFNGLDEBUGMESSAGECALLBACKPROC glDebugMessageCallback_Impl;
  PFNGLDEBUGMESSAGECONTROLPROC glDebugMessageControl_Impl;
  PFNGLDEBUGMESSAGEINSERTPROC glDebugMessageInsert_Impl;
  PFNGLGETDEBUGMESSAGELOGPROC glGetDebugMessageLog_Impl;
  PFNGLGETOBJECTLABELPROC glGetObjectLabel_Impl;
  PFNGLGETOBJECTPTRLABELPROC glGetObjectPtrLabel_Impl;
  PFNGLOBJECTLABELPROC glObjectLabel_Impl;
  PFNGLOBJECTPTRLABELPROC glObjectPtrLabel_Impl;
  PFNGLPOPDEBUGGROUPPROC glPopDebugGroup_Impl;
  PFNGLPUSHDEBUGGROUPPROC glPushDebugGroup_Impl;

  // GL_KHR_robust_buffer_access_behavior

  // GL_WIN_swap_hint
  PFNGLADDSWAPHINTRECTWINPROC glAddSwapHintRectWIN_Impl;

#if defined(GLE_WGL_ENABLED)
  // WGL
  // We don't declare pointers for these because we statically link to the implementations, same as
  // with the OpenGL 1.1 functions.
  // BOOL  wglCopyContext_Hook(HGLRC, HGLRC, UINT);
  // HGLRC wglCreateContext_Hook(HDC);
  // HGLRC wglCreateLayerContext_Hook(HDC, int);
  // BOOL  wglDeleteContext_Hook(HGLRC);
  // HGLRC wglGetCurrentContext_Hook(VOID);
  // HDC   wglGetCurrentDC_Hook(VOID);
  // PROC  wglGetProcAddress_Hook(LPCSTR);
  // BOOL  wglMakeCurrent_Hook(HDC, HGLRC);
  // BOOL  wglShareLists_Hook(HGLRC, HGLRC);
  // BOOL  wglUseFontBitmapsA_Hook(HDC, DWORD, DWORD, DWORD);
  // BOOL  wglUseFontBitmapsW_Hook(HDC, DWORD, DWORD, DWORD);
  // BOOL  wglUseFontOutlinesA_Hook(HDC, DWORD, DWORD, DWORD, FLOAT, FLOAT, int,
  // LPGLYPHMETRICSFLOAT); BOOL  wglUseFontOutlinesW_Hook(HDC, DWORD, DWORD, DWORD, FLOAT, FLOAT,
  // int, LPGLYPHMETRICSFLOAT); BOOL  wglDescribeLayerPlane_Hook(HDC, int, int, UINT,
  // LPLAYERPLANEDESCRIPTOR); int   wglSetLayerPaletteEntries_Hook(HDC, int, int, int, CONST
  // COLORREF *); int   wglGetLayerPaletteEntries_Hook(HDC, int, int, int, COLORREF *); BOOL
  // wglRealizeLayerPalette_Hook(HDC, int, BOOL); BOOL  wglSwapLayerBuffers_Hook(HDC, UINT); DWORD
  // wglSwapMultipleBuffers_Hook(UINT, CONST WGLSWAP *);

#if 0
        PFNWGLCOPYCONTEXTPROC            wglCopyContext_Impl;
        PFNWGLCREATECONTEXTPROC          wglCreateContext_Impl;
        PFNWGLCREATELAYERCONTEXTPROC     wglCreateLayerContext_Impl;
        PFNWGLDELETECONTEXTPROC          wglDeleteContext_Impl;
        PFNWGLGETCURRENTCONTEXTPROC      wglGetCurrentContext_Impl;
        PFNWGLGETCURRENTDCPROC           wglGetCurrentDC_Impl;
        PFNWGLGETPROCADDRESSPROC         wglGetProcAddress_Impl;
        PFNWGLMAKECURRENTPROC            wglMakeCurrent_Impl;
        PFNWGLSHARELISTSPROC             wglShareLists_Impl;
        PFNWGLUSEFONTBITMAPSAPROC        wglUseFontBitmapsA_Impl;
        PFNWGLUSEFONTBITMAPSWPROC        wglUseFontBitmapsW_Impl;
        PFNWGLUSEFONTOUTLINESAPROC       wglUseFontOutlinesA_Impl;
        PFNWGLUSEFONTOUTLINESWPROC       wglUseFontOutlinesW_Impl;
        PFNWGLDESCRIBELAYERPLANEPROC     wglDescribeLayerPlane_Impl;
        PFNWGLSETLAYERPALETTEENTRIESPROC wglSetLayerPaletteEntries_Impl;
        PFNWGLGETLAYERPALETTEENTRIESPROC wglGetLayerPaletteEntries_Impl;
        PFNWGLREALIZELAYERPALETTEPROC    wglRealizeLayerPalette_Impl;
        PFNWGLSWAPLAYERBUFFERSPROC       wglSwapLayerBuffers_Impl;
        PFNWGLSWAPMULTIPLEBUFFERSPROC    wglSwapMultipleBuffers_Impl;
#endif

  // WGL_ARB_buffer_region
  PFNWGLCREATEBUFFERREGIONARBPROC wglCreateBufferRegionARB_Impl;
  PFNWGLDELETEBUFFERREGIONARBPROC wglDeleteBufferRegionARB_Impl;
  PFNWGLSAVEBUFFERREGIONARBPROC wglSaveBufferRegionARB_Impl;
  PFNWGLRESTOREBUFFERREGIONARBPROC wglRestoreBufferRegionARB_Impl;

  // WGL_ARB_extensions_string
  PFNWGLGETEXTENSIONSSTRINGARBPROC wglGetExtensionsStringARB_Impl;

  // WGL_ARB_pixel_format
  PFNWGLGETPIXELFORMATATTRIBIVARBPROC wglGetPixelFormatAttribivARB_Impl;
  PFNWGLGETPIXELFORMATATTRIBFVARBPROC wglGetPixelFormatAttribfvARB_Impl;
  PFNWGLCHOOSEPIXELFORMATARBPROC wglChoosePixelFormatARB_Impl;

  // WGL_ARB_make_current_read
  PFNWGLMAKECONTEXTCURRENTARBPROC wglMakeContextCurrentARB_Impl;
  PFNWGLGETCURRENTREADDCARBPROC wglGetCurrentReadDCARB_Impl;

  // WGL_ARB_pbuffer
  PFNWGLCREATEPBUFFERARBPROC wglCreatePbufferARB_Impl;
  PFNWGLGETPBUFFERDCARBPROC wglGetPbufferDCARB_Impl;
  PFNWGLRELEASEPBUFFERDCARBPROC wglReleasePbufferDCARB_Impl;
  PFNWGLDESTROYPBUFFERARBPROC wglDestroyPbufferARB_Impl;
  PFNWGLQUERYPBUFFERARBPROC wglQueryPbufferARB_Impl;

  // WGL_ARB_render_texture
  PFNWGLBINDTEXIMAGEARBPROC wglBindTexImageARB_Impl;
  PFNWGLRELEASETEXIMAGEARBPROC wglReleaseTexImageARB_Impl;
  PFNWGLSETPBUFFERATTRIBARBPROC wglSetPbufferAttribARB_Impl;

  // WGL_ARB_pixel_format_float
  // (no functions)

  // WGL_ARB_framebuffer_sRGB
  // (no functions)

  // WGL_NV_present_video
  PFNWGLENUMERATEVIDEODEVICESNVPROC wglEnumerateVideoDevicesNV_Impl;
  PFNWGLBINDVIDEODEVICENVPROC wglBindVideoDeviceNV_Impl;
  PFNWGLQUERYCURRENTCONTEXTNVPROC wglQueryCurrentContextNV_Impl;

  // WGL_ARB_create_context
  PFNWGLCREATECONTEXTATTRIBSARBPROC wglCreateContextAttribsARB_Impl;

  // WGL_ARB_create_context_profile
  // (no functions)

  // WGL_ARB_create_context_robustness
  // (no functions)

  // WGL_EXT_extensions_string
  PFNWGLGETEXTENSIONSSTRINGEXTPROC wglGetExtensionsStringEXT_Impl;

  // WGL_EXT_swap_control
  PFNWGLGETSWAPINTERVALEXTPROC wglGetSwapIntervalEXT_Impl;
  PFNWGLSWAPINTERVALEXTPROC wglSwapIntervalEXT_Impl;

  // WGL_OML_sync_control
  PFNWGLGETSYNCVALUESOMLPROC wglGetSyncValuesOML_Impl;
  PFNWGLGETMSCRATEOMLPROC wglGetMscRateOML_Impl;
  PFNWGLSWAPBUFFERSMSCOMLPROC wglSwapBuffersMscOML_Impl;
  PFNWGLSWAPLAYERBUFFERSMSCOMLPROC wglSwapLayerBuffersMscOML_Impl;
  PFNWGLWAITFORMSCOMLPROC wglWaitForMscOML_Impl;
  PFNWGLWAITFORSBCOMLPROC wglWaitForSbcOML_Impl;

  // WGL_NV_video_output
  PFNWGLGETVIDEODEVICENVPROC wglGetVideoDeviceNV_Impl;
  PFNWGLRELEASEVIDEODEVICENVPROC wglReleaseVideoDeviceNV_Impl;
  PFNWGLBINDVIDEOIMAGENVPROC wglBindVideoImageNV_Impl;
  PFNWGLRELEASEVIDEOIMAGENVPROC wglReleaseVideoImageNV_Impl;
  PFNWGLSENDPBUFFERTOVIDEONVPROC wglSendPbufferToVideoNV_Impl;
  PFNWGLGETVIDEOINFONVPROC wglGetVideoInfoNV_Impl;

  // WGL_NV_swap_group
  PFNWGLJOINSWAPGROUPNVPROC wglJoinSwapGroupNV_Impl;
  PFNWGLBINDSWAPBARRIERNVPROC wglBindSwapBarrierNV_Impl;
  PFNWGLQUERYSWAPGROUPNVPROC wglQuerySwapGroupNV_Impl;
  PFNWGLQUERYMAXSWAPGROUPSNVPROC wglQueryMaxSwapGroupsNV_Impl;
  PFNWGLQUERYFRAMECOUNTNVPROC wglQueryFrameCountNV_Impl;
  PFNWGLRESETFRAMECOUNTNVPROC wglResetFrameCountNV_Impl;

  // WGL_NV_video_capture
  PFNWGLBINDVIDEOCAPTUREDEVICENVPROC wglBindVideoCaptureDeviceNV_Impl;
  PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC wglEnumerateVideoCaptureDevicesNV_Impl;
  PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC wglLockVideoCaptureDeviceNV_Impl;
  PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC wglQueryVideoCaptureDeviceNV_Impl;
  PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC wglReleaseVideoCaptureDeviceNV_Impl;

  // WGL_NV_copy_image
  PFNWGLCOPYIMAGESUBDATANVPROC wglCopyImageSubDataNV_Impl;

  // WGL_NV_DX_interop
  PFNWGLDXCLOSEDEVICENVPROC wglDXCloseDeviceNV_Impl;
  PFNWGLDXLOCKOBJECTSNVPROC wglDXLockObjectsNV_Impl;
  PFNWGLDXOBJECTACCESSNVPROC wglDXObjectAccessNV_Impl;
  PFNWGLDXOPENDEVICENVPROC wglDXOpenDeviceNV_Impl;
  PFNWGLDXREGISTEROBJECTNVPROC wglDXRegisterObjectNV_Impl;
  PFNWGLDXSETRESOURCESHAREHANDLENVPROC wglDXSetResourceShareHandleNV_Impl;
  PFNWGLDXUNLOCKOBJECTSNVPROC wglDXUnlockObjectsNV_Impl;
  PFNWGLDXUNREGISTEROBJECTNVPROC wglDXUnregisterObjectNV_Impl;

#endif // GLE_WGL_ENABLED

#if defined(GLE_GLX_ENABLED)
  // GLX_VERSION_1_1
  // We don't create any pointers, because we assume these functions are always present.

  // GLX_VERSION_1_2
  PFNGLXGETCURRENTDISPLAYPROC glXGetCurrentDisplay_Impl;

  // GLX_VERSION_1_3
  PFNGLXCHOOSEFBCONFIGPROC glXChooseFBConfig_Impl;
  PFNGLXCREATENEWCONTEXTPROC glXCreateNewContext_Impl;
  PFNGLXCREATEPBUFFERPROC glXCreatePbuffer_Impl;
  PFNGLXCREATEPIXMAPPROC glXCreatePixmap_Impl;
  PFNGLXCREATEWINDOWPROC glXCreateWindow_Impl;
  PFNGLXDESTROYPBUFFERPROC glXDestroyPbuffer_Impl;
  PFNGLXDESTROYPIXMAPPROC glXDestroyPixmap_Impl;
  PFNGLXDESTROYWINDOWPROC glXDestroyWindow_Impl;
  PFNGLXGETCURRENTREADDRAWABLEPROC glXGetCurrentReadDrawable_Impl;
  PFNGLXGETFBCONFIGATTRIBPROC glXGetFBConfigAttrib_Impl;
  PFNGLXGETFBCONFIGSPROC glXGetFBConfigs_Impl;
  PFNGLXGETSELECTEDEVENTPROC glXGetSelectedEvent_Impl;
  PFNGLXGETVISUALFROMFBCONFIGPROC glXGetVisualFromFBConfig_Impl;
  PFNGLXMAKECONTEXTCURRENTPROC glXMakeContextCurrent_Impl;
  PFNGLXQUERYCONTEXTPROC glXQueryContext_Impl;
  PFNGLXQUERYDRAWABLEPROC glXQueryDrawable_Impl;
  PFNGLXSELECTEVENTPROC glXSelectEvent_Impl;

  // GLX_VERSION_1_4
  // Nothing to declare

  // GLX_ARB_create_context
  PFNGLXCREATECONTEXTATTRIBSARBPROC glXCreateContextAttribsARB_Impl;

  // GLX_EXT_swap_control
  PFNGLXSWAPINTERVALEXTPROC glXSwapIntervalEXT_Impl;

  // GLX_OML_sync_control
  PFNGLXGETMSCRATEOMLPROC glXGetMscRateOML_Impl;
  PFNGLXGETSYNCVALUESOMLPROC glXGetSyncValuesOML_Impl;
  PFNGLXSWAPBUFFERSMSCOMLPROC glXSwapBuffersMscOML_Impl;
  PFNGLXWAITFORMSCOMLPROC glXWaitForMscOML_Impl;
  PFNGLXWAITFORSBCOMLPROC glXWaitForSbcOML_Impl;

  // GLX_MESA_swap_control
  PFNGLXGETSWAPINTERVALMESAPROC glXGetSwapIntervalMESA_Impl;
  PFNGLXSWAPINTERVALMESAPROC glXSwapIntervalMESA_Impl;

#endif // GLE_GLX_ENABLED

  // Boolean extension support indicators. Each of these identifies the
  // presence or absence of the given extension. A better solution here
  // might be to use an STL map<const char*, bool>.
  bool gle_AMD_debug_output;
  // bool gle_AMD_performance_monitor;
  bool gle_APPLE_aux_depth_stencil;
  bool gle_APPLE_client_storage;
  bool gle_APPLE_element_array;
  bool gle_APPLE_fence;
  bool gle_APPLE_float_pixels;
  bool gle_APPLE_flush_buffer_range;
  bool gle_APPLE_object_purgeable;
  bool gle_APPLE_pixel_buffer;
  bool gle_APPLE_rgb_422;
  bool gle_APPLE_row_bytes;
  bool gle_APPLE_specular_vector;
  bool gle_APPLE_texture_range;
  bool gle_APPLE_transform_hint;
  bool gle_APPLE_vertex_array_object;
  bool gle_APPLE_vertex_array_range;
  bool gle_APPLE_vertex_program_evaluators;
  bool gle_APPLE_ycbcr_422;
  bool gle_ARB_copy_buffer;
  bool gle_ARB_debug_output;
  bool gle_ARB_depth_buffer_float;
  // bool gle_ARB_direct_state_access;
  bool gle_ARB_ES2_compatibility;
  bool gle_ARB_framebuffer_object;
  bool gle_ARB_framebuffer_sRGB;
  bool gle_ARB_texture_multisample;
  bool gle_ARB_texture_non_power_of_two;
  bool gle_ARB_texture_rectangle;
  bool gle_ARB_texture_storage;
  bool gle_ARB_texture_storage_multisample;
  bool gle_ARB_timer_query;
  bool gle_ARB_vertex_array_object;
  // bool gle_ARB_vertex_attrib_binding;
  bool gle_EXT_draw_buffers2;
  bool gle_EXT_texture_compression_s3tc;
  bool gle_EXT_texture_filter_anisotropic;
  bool gle_EXT_texture_sRGB;
  // bool gle_KHR_context_flush_control;
  bool gle_KHR_debug;
  // bool gle_KHR_robust_buffer_access_behavior;
  // bool gle_KHR_robustness;
  bool gle_WIN_swap_hint;

#if defined(GLE_WGL_ENABLED)
  bool gle_WGL_ARB_buffer_region;
  bool gle_WGL_ARB_create_context;
  bool gle_WGL_ARB_create_context_profile;
  bool gle_WGL_ARB_create_context_robustness;
  bool gle_WGL_ARB_extensions_string;
  bool gle_WGL_ARB_framebuffer_sRGB;
  bool gle_WGL_ARB_make_current_read;
  bool gle_WGL_ARB_pbuffer;
  bool gle_WGL_ARB_pixel_format;
  bool gle_WGL_ARB_pixel_format_float;
  bool gle_WGL_ARB_render_texture;
  bool gle_WGL_ATI_render_texture_rectangle;
  bool gle_WGL_EXT_extensions_string;
  bool gle_WGL_EXT_swap_control;
  bool gle_WGL_NV_copy_image;
  bool gle_WGL_NV_DX_interop;
  bool gle_WGL_NV_DX_interop2;
  bool gle_WGL_NV_present_video;
  bool gle_WGL_NV_render_texture_rectangle;
  bool gle_WGL_NV_swap_group;
  bool gle_WGL_NV_video_capture;
  bool gle_WGL_NV_video_output;
  bool gle_WGL_OML_sync_control;
#elif defined(GLE_GLX_ENABLED)
  bool gle_GLX_ARB_create_context;
  bool gle_GLX_ARB_create_context_profile;
  bool gle_GLX_ARB_create_context_robustness;
  bool gle_GLX_EXT_swap_control;
  bool gle_GLX_OML_sync_control;
  bool gle_MESA_swap_control;
#endif

}; // class GLEContext

} // namespace OVR

#endif // OVR_CAPI_GLE_h