summaryrefslogtreecommitdiff
path: root/gfx/angle/src/libANGLE/renderer/gl/FunctionsGL.h
blob: fa8634e5701f2313d0edc5c4c36826be9140e22d (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
//
// Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//

// FunctionsGL.h: Defines the FuntionsGL class to contain loaded GL functions

#ifndef LIBANGLE_RENDERER_GL_FUNCTIONSGL_H_
#define LIBANGLE_RENDERER_GL_FUNCTIONSGL_H_

#include "common/debug.h"
#include "libANGLE/Version.h"
#include "libANGLE/renderer/gl/functionsgl_enums.h"
#include "libANGLE/renderer/gl/functionsgl_typedefs.h"

namespace rx
{

enum StandardGL
{
    STANDARD_GL_DESKTOP,
    STANDARD_GL_ES,
};

class FunctionsGL
{
  public:
    FunctionsGL();
    virtual ~FunctionsGL();

    void initialize();

    // Version information
    gl::Version version;
    StandardGL standard;
    GLint profile;
    bool isAtLeastGL(const gl::Version &glVersion) const;
    bool isAtMostGL(const gl::Version &glVersion) const;
    bool isAtLeastGLES(const gl::Version &glesVersion) const;
    bool isAtMostGLES(const gl::Version &glesVersion) const;

    // Extensions
    std::vector<std::string> extensions;
    bool hasExtension(const std::string &ext) const;
    bool hasGLExtension(const std::string &ext) const;
    bool hasGLESExtension(const std::string &ext) const;

    // Entry Points
    // 1.0
    PFNGLBLENDFUNCPROC blendFunc;
    PFNGLCLEARPROC clear;
    PFNGLCLEARCOLORPROC clearColor;
    PFNGLCLEARDEPTHPROC clearDepth;
    PFNGLCLEARSTENCILPROC clearStencil;
    PFNGLCOLORMASKPROC colorMask;
    PFNGLCULLFACEPROC cullFace;
    PFNGLDEPTHFUNCPROC depthFunc;
    PFNGLDEPTHMASKPROC depthMask;
    PFNGLDEPTHRANGEPROC depthRange;
    PFNGLDISABLEPROC disable;
    PFNGLDRAWBUFFERPROC drawBuffer;
    PFNGLENABLEPROC enable;
    PFNGLFINISHPROC finish;
    PFNGLFLUSHPROC flush;
    PFNGLFRONTFACEPROC frontFace;
    PFNGLGETBOOLEANVPROC getBooleanv;
    PFNGLGETDOUBLEVPROC getDoublev;
    PFNGLGETERRORPROC getError;
    PFNGLGETFLOATVPROC getFloatv;
    PFNGLGETINTEGERVPROC getIntegerv;
    PFNGLGETSTRINGPROC getString;
    PFNGLGETTEXIMAGEPROC getTexImage;
    PFNGLGETTEXLEVELPARAMETERFVPROC getTexLevelParameterfv;
    PFNGLGETTEXLEVELPARAMETERIVPROC getTexLevelParameteriv;
    PFNGLGETTEXPARAMETERFVPROC getTexParameterfv;
    PFNGLGETTEXPARAMETERIVPROC getTexParameteriv;
    PFNGLHINTPROC hint;
    PFNGLISENABLEDPROC isEnabled;
    PFNGLLINEWIDTHPROC lineWidth;
    PFNGLLOGICOPPROC logicOp;
    PFNGLPIXELSTOREFPROC pixelStoref;
    PFNGLPIXELSTOREIPROC pixelStorei;
    PFNGLPOINTSIZEPROC pointSize;
    PFNGLPOLYGONMODEPROC polygonMode;
    PFNGLREADBUFFERPROC readBuffer;
    PFNGLREADPIXELSPROC readPixels;
    PFNGLSCISSORPROC scissor;
    PFNGLSTENCILFUNCPROC stencilFunc;
    PFNGLSTENCILMASKPROC stencilMask;
    PFNGLSTENCILOPPROC stencilOp;
    PFNGLTEXIMAGE1DPROC texImage1D;
    PFNGLTEXIMAGE2DPROC texImage2D;
    PFNGLTEXPARAMETERFPROC texParameterf;
    PFNGLTEXPARAMETERFVPROC texParameterfv;
    PFNGLTEXPARAMETERIPROC texParameteri;
    PFNGLTEXPARAMETERIVPROC texParameteriv;
    PFNGLVIEWPORTPROC viewport;

    // 1.1
    PFNGLBINDTEXTUREPROC bindTexture;
    PFNGLCOPYTEXIMAGE1DPROC copyTexImage1D;
    PFNGLCOPYTEXIMAGE2DPROC copyTexImage2D;
    PFNGLCOPYTEXSUBIMAGE1DPROC copyTexSubImage1D;
    PFNGLCOPYTEXSUBIMAGE2DPROC copyTexSubImage2D;
    PFNGLDELETETEXTURESPROC deleteTextures;
    PFNGLDRAWARRAYSPROC drawArrays;
    PFNGLDRAWELEMENTSPROC drawElements;
    PFNGLGENTEXTURESPROC genTextures;
    PFNGLISTEXTUREPROC isTexture;
    PFNGLPOLYGONOFFSETPROC polygonOffset;
    PFNGLTEXSUBIMAGE1DPROC texSubImage1D;
    PFNGLTEXSUBIMAGE2DPROC texSubImage2D;

    // 1.2
    PFNGLBLENDCOLORPROC blendColor;
    PFNGLBLENDEQUATIONPROC blendEquation;
    PFNGLCOPYTEXSUBIMAGE3DPROC copyTexSubImage3D;
    PFNGLDRAWRANGEELEMENTSPROC drawRangeElements;
    PFNGLTEXIMAGE3DPROC texImage3D;
    PFNGLTEXSUBIMAGE3DPROC texSubImage3D;

    // 1.2 Extensions
    PFNGLDELETEFENCESNVPROC deleteFencesNV;
    PFNGLGENFENCESNVPROC genFencesNV;
    PFNGLISFENCENVPROC isFenceNV;
    PFNGLTESTFENCENVPROC testFenceNV;
    PFNGLGETFENCEIVNVPROC getFenceivNV;
    PFNGLFINISHFENCENVPROC finishFenceNV;
    PFNGLSETFENCENVPROC setFenceNV;

    // 1.3
    PFNGLACTIVETEXTUREPROC activeTexture;
    PFNGLCOMPRESSEDTEXIMAGE1DPROC compressedTexImage1D;
    PFNGLCOMPRESSEDTEXIMAGE2DPROC compressedTexImage2D;
    PFNGLCOMPRESSEDTEXIMAGE3DPROC compressedTexImage3D;
    PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC compressedTexSubImage1D;
    PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC compressedTexSubImage2D;
    PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC compressedTexSubImage3D;
    PFNGLGETCOMPRESSEDTEXIMAGEPROC getCompressedTexImage;
    PFNGLSAMPLECOVERAGEPROC sampleCoverage;

    // 1.4
    PFNGLBLENDFUNCSEPARATEPROC blendFuncSeparate;
    PFNGLMULTIDRAWARRAYSPROC multiDrawArrays;
    PFNGLMULTIDRAWELEMENTSPROC multiDrawElements;
    PFNGLPOINTPARAMETERFPROC pointParameterf;
    PFNGLPOINTPARAMETERFVPROC pointParameterfv;
    PFNGLPOINTPARAMETERIPROC pointParameteri;
    PFNGLPOINTPARAMETERIVPROC pointParameteriv;

    // 1.5
    PFNGLBEGINQUERYPROC beginQuery;
    PFNGLBINDBUFFERPROC bindBuffer;
    PFNGLBUFFERDATAPROC bufferData;
    PFNGLBUFFERSUBDATAPROC bufferSubData;
    PFNGLDELETEBUFFERSPROC deleteBuffers;
    PFNGLDELETEQUERIESPROC deleteQueries;
    PFNGLENDQUERYPROC endQuery;
    PFNGLGENBUFFERSPROC genBuffers;
    PFNGLGENQUERIESPROC genQueries;
    PFNGLGETBUFFERPARAMETERIVPROC getBufferParameteriv;
    PFNGLGETBUFFERPOINTERVPROC getBufferPointerv;
    PFNGLGETBUFFERSUBDATAPROC getBufferSubData;
    PFNGLGETQUERYOBJECTIVPROC getQueryObjectiv;
    PFNGLGETQUERYOBJECTUIVPROC getQueryObjectuiv;
    PFNGLGETQUERYIVPROC getQueryiv;
    PFNGLISBUFFERPROC isBuffer;
    PFNGLISQUERYPROC isQuery;
    PFNGLMAPBUFFERPROC mapBuffer;
    PFNGLUNMAPBUFFERPROC unmapBuffer;

    // 2.0
    PFNGLATTACHSHADERPROC attachShader;
    PFNGLBINDATTRIBLOCATIONPROC bindAttribLocation;
    PFNGLBLENDEQUATIONSEPARATEPROC blendEquationSeparate;
    PFNGLCOMPILESHADERPROC compileShader;
    PFNGLCREATEPROGRAMPROC createProgram;
    PFNGLCREATESHADERPROC createShader;
    PFNGLDELETEPROGRAMPROC deleteProgram;
    PFNGLDELETESHADERPROC deleteShader;
    PFNGLDETACHSHADERPROC detachShader;
    PFNGLDISABLEVERTEXATTRIBARRAYPROC disableVertexAttribArray;
    PFNGLDRAWBUFFERSPROC drawBuffers;
    PFNGLENABLEVERTEXATTRIBARRAYPROC enableVertexAttribArray;
    PFNGLGETACTIVEATTRIBPROC getActiveAttrib;
    PFNGLGETACTIVEUNIFORMPROC getActiveUniform;
    PFNGLGETATTACHEDSHADERSPROC getAttachedShaders;
    PFNGLGETATTRIBLOCATIONPROC getAttribLocation;
    PFNGLGETPROGRAMINFOLOGPROC getProgramInfoLog;
    PFNGLGETPROGRAMIVPROC getProgramiv;
    PFNGLGETSHADERINFOLOGPROC getShaderInfoLog;
    PFNGLGETSHADERSOURCEPROC getShaderSource;
    PFNGLGETSHADERIVPROC getShaderiv;
    PFNGLGETUNIFORMLOCATIONPROC getUniformLocation;
    PFNGLGETUNIFORMFVPROC getUniformfv;
    PFNGLGETUNIFORMIVPROC getUniformiv;
    PFNGLGETVERTEXATTRIBPOINTERVPROC getVertexAttribPointerv;
    PFNGLGETVERTEXATTRIBDVPROC getVertexAttribdv;
    PFNGLGETVERTEXATTRIBFVPROC getVertexAttribfv;
    PFNGLGETVERTEXATTRIBIVPROC getVertexAttribiv;
    PFNGLISPROGRAMPROC isProgram;
    PFNGLISSHADERPROC isShader;
    PFNGLLINKPROGRAMPROC linkProgram;
    PFNGLSHADERSOURCEPROC shaderSource;
    PFNGLSTENCILFUNCSEPARATEPROC stencilFuncSeparate;
    PFNGLSTENCILMASKSEPARATEPROC stencilMaskSeparate;
    PFNGLSTENCILOPSEPARATEPROC stencilOpSeparate;
    PFNGLUNIFORM1FPROC uniform1f;
    PFNGLUNIFORM1FVPROC uniform1fv;
    PFNGLUNIFORM1IPROC uniform1i;
    PFNGLUNIFORM1IVPROC uniform1iv;
    PFNGLUNIFORM2FPROC uniform2f;
    PFNGLUNIFORM2FVPROC uniform2fv;
    PFNGLUNIFORM2IPROC uniform2i;
    PFNGLUNIFORM2IVPROC uniform2iv;
    PFNGLUNIFORM3FPROC uniform3f;
    PFNGLUNIFORM3FVPROC uniform3fv;
    PFNGLUNIFORM3IPROC uniform3i;
    PFNGLUNIFORM3IVPROC uniform3iv;
    PFNGLUNIFORM4FPROC uniform4f;
    PFNGLUNIFORM4FVPROC uniform4fv;
    PFNGLUNIFORM4IPROC uniform4i;
    PFNGLUNIFORM4IVPROC uniform4iv;
    PFNGLUNIFORMMATRIX2FVPROC uniformMatrix2fv;
    PFNGLUNIFORMMATRIX3FVPROC uniformMatrix3fv;
    PFNGLUNIFORMMATRIX4FVPROC uniformMatrix4fv;
    PFNGLUSEPROGRAMPROC useProgram;
    PFNGLVALIDATEPROGRAMPROC validateProgram;
    PFNGLVERTEXATTRIB1DPROC vertexAttrib1d;
    PFNGLVERTEXATTRIB1DVPROC vertexAttrib1dv;
    PFNGLVERTEXATTRIB1FPROC vertexAttrib1f;
    PFNGLVERTEXATTRIB1FVPROC vertexAttrib1fv;
    PFNGLVERTEXATTRIB1SPROC vertexAttrib1s;
    PFNGLVERTEXATTRIB1SVPROC vertexAttrib1sv;
    PFNGLVERTEXATTRIB2DPROC vertexAttrib2d;
    PFNGLVERTEXATTRIB2DVPROC vertexAttrib2dv;
    PFNGLVERTEXATTRIB2FPROC vertexAttrib2f;
    PFNGLVERTEXATTRIB2FVPROC vertexAttrib2fv;
    PFNGLVERTEXATTRIB2SPROC vertexAttrib2s;
    PFNGLVERTEXATTRIB2SVPROC vertexAttrib2sv;
    PFNGLVERTEXATTRIB3DPROC vertexAttrib3d;
    PFNGLVERTEXATTRIB3DVPROC vertexAttrib3dv;
    PFNGLVERTEXATTRIB3FPROC vertexAttrib3f;
    PFNGLVERTEXATTRIB3FVPROC vertexAttrib3fv;
    PFNGLVERTEXATTRIB3SPROC vertexAttrib3s;
    PFNGLVERTEXATTRIB3SVPROC vertexAttrib3sv;
    PFNGLVERTEXATTRIB4NBVPROC vertexAttrib4Nbv;
    PFNGLVERTEXATTRIB4NIVPROC vertexAttrib4Niv;
    PFNGLVERTEXATTRIB4NSVPROC vertexAttrib4Nsv;
    PFNGLVERTEXATTRIB4NUBPROC vertexAttrib4Nub;
    PFNGLVERTEXATTRIB4NUBVPROC vertexAttrib4Nubv;
    PFNGLVERTEXATTRIB4NUIVPROC vertexAttrib4Nuiv;
    PFNGLVERTEXATTRIB4NUSVPROC vertexAttrib4Nusv;
    PFNGLVERTEXATTRIB4BVPROC vertexAttrib4bv;
    PFNGLVERTEXATTRIB4DPROC vertexAttrib4d;
    PFNGLVERTEXATTRIB4DVPROC vertexAttrib4dv;
    PFNGLVERTEXATTRIB4FPROC vertexAttrib4f;
    PFNGLVERTEXATTRIB4FVPROC vertexAttrib4fv;
    PFNGLVERTEXATTRIB4IVPROC vertexAttrib4iv;
    PFNGLVERTEXATTRIB4SPROC vertexAttrib4s;
    PFNGLVERTEXATTRIB4SVPROC vertexAttrib4sv;
    PFNGLVERTEXATTRIB4UBVPROC vertexAttrib4ubv;
    PFNGLVERTEXATTRIB4UIVPROC vertexAttrib4uiv;
    PFNGLVERTEXATTRIB4USVPROC vertexAttrib4usv;
    PFNGLVERTEXATTRIBPOINTERPROC vertexAttribPointer;

    // 2.1
    PFNGLUNIFORMMATRIX2X3FVPROC uniformMatrix2x3fv;
    PFNGLUNIFORMMATRIX2X4FVPROC uniformMatrix2x4fv;
    PFNGLUNIFORMMATRIX3X2FVPROC uniformMatrix3x2fv;
    PFNGLUNIFORMMATRIX3X4FVPROC uniformMatrix3x4fv;
    PFNGLUNIFORMMATRIX4X2FVPROC uniformMatrix4x2fv;
    PFNGLUNIFORMMATRIX4X3FVPROC uniformMatrix4x3fv;

    // 3.0
    PFNGLBEGINCONDITIONALRENDERPROC beginConditionalRender;
    PFNGLBEGINTRANSFORMFEEDBACKPROC beginTransformFeedback;
    PFNGLBINDBUFFERBASEPROC bindBufferBase;
    PFNGLBINDBUFFERRANGEPROC bindBufferRange;
    PFNGLBINDFRAGDATALOCATIONPROC bindFragDataLocation;
    PFNGLBINDFRAMEBUFFERPROC bindFramebuffer;
    PFNGLBINDRENDERBUFFERPROC bindRenderbuffer;
    PFNGLBINDVERTEXARRAYPROC bindVertexArray;
    PFNGLBLITFRAMEBUFFERPROC blitFramebuffer;
    PFNGLCHECKFRAMEBUFFERSTATUSPROC checkFramebufferStatus;
    PFNGLCLAMPCOLORPROC clampColor;
    PFNGLCLEARBUFFERFIPROC clearBufferfi;
    PFNGLCLEARBUFFERFVPROC clearBufferfv;
    PFNGLCLEARBUFFERIVPROC clearBufferiv;
    PFNGLCLEARBUFFERUIVPROC clearBufferuiv;
    PFNGLCOLORMASKIPROC colorMaski;
    PFNGLDELETEFRAMEBUFFERSPROC deleteFramebuffers;
    PFNGLDELETERENDERBUFFERSPROC deleteRenderbuffers;
    PFNGLDELETEVERTEXARRAYSPROC deleteVertexArrays;
    PFNGLDISABLEIPROC disablei;
    PFNGLENABLEIPROC enablei;
    PFNGLENDCONDITIONALRENDERPROC endConditionalRender;
    PFNGLENDTRANSFORMFEEDBACKPROC endTransformFeedback;
    PFNGLFLUSHMAPPEDBUFFERRANGEPROC flushMappedBufferRange;
    PFNGLFRAMEBUFFERRENDERBUFFERPROC framebufferRenderbuffer;
    PFNGLFRAMEBUFFERTEXTURE1DPROC framebufferTexture1D;
    PFNGLFRAMEBUFFERTEXTURE2DPROC framebufferTexture2D;
    PFNGLFRAMEBUFFERTEXTURE3DPROC framebufferTexture3D;
    PFNGLFRAMEBUFFERTEXTURELAYERPROC framebufferTextureLayer;
    PFNGLGENFRAMEBUFFERSPROC genFramebuffers;
    PFNGLGENRENDERBUFFERSPROC genRenderbuffers;
    PFNGLGENVERTEXARRAYSPROC genVertexArrays;
    PFNGLGENERATEMIPMAPPROC generateMipmap;
    PFNGLGETBOOLEANI_VPROC getBooleani_v;
    PFNGLGETFRAGDATALOCATIONPROC getFragDataLocation;
    PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC getFramebufferAttachmentParameteriv;
    PFNGLGETINTEGERI_VPROC getIntegeri_v;
    PFNGLGETRENDERBUFFERPARAMETERIVPROC getRenderbufferParameteriv;
    PFNGLGETSTRINGIPROC getStringi;
    PFNGLGETTEXPARAMETERIIVPROC getTexParameterIiv;
    PFNGLGETTEXPARAMETERIUIVPROC getTexParameterIuiv;
    PFNGLGETTRANSFORMFEEDBACKVARYINGPROC getTransformFeedbackVarying;
    PFNGLGETUNIFORMUIVPROC getUniformuiv;
    PFNGLGETVERTEXATTRIBIIVPROC getVertexAttribIiv;
    PFNGLGETVERTEXATTRIBIUIVPROC getVertexAttribIuiv;
    PFNGLISENABLEDIPROC isEnabledi;
    PFNGLISFRAMEBUFFERPROC isFramebuffer;
    PFNGLISRENDERBUFFERPROC isRenderbuffer;
    PFNGLISVERTEXARRAYPROC isVertexArray;
    PFNGLMAPBUFFERRANGEPROC mapBufferRange;
    PFNGLRENDERBUFFERSTORAGEPROC renderbufferStorage;
    PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC renderbufferStorageMultisample;
    PFNGLTEXPARAMETERIIVPROC texParameterIiv;
    PFNGLTEXPARAMETERIUIVPROC texParameterIuiv;
    PFNGLTRANSFORMFEEDBACKVARYINGSPROC transformFeedbackVaryings;
    PFNGLUNIFORM1UIPROC uniform1ui;
    PFNGLUNIFORM1UIVPROC uniform1uiv;
    PFNGLUNIFORM2UIPROC uniform2ui;
    PFNGLUNIFORM2UIVPROC uniform2uiv;
    PFNGLUNIFORM3UIPROC uniform3ui;
    PFNGLUNIFORM3UIVPROC uniform3uiv;
    PFNGLUNIFORM4UIPROC uniform4ui;
    PFNGLUNIFORM4UIVPROC uniform4uiv;
    PFNGLVERTEXATTRIBI1IPROC vertexAttribI1i;
    PFNGLVERTEXATTRIBI1IVPROC vertexAttribI1iv;
    PFNGLVERTEXATTRIBI1UIPROC vertexAttribI1ui;
    PFNGLVERTEXATTRIBI1UIVPROC vertexAttribI1uiv;
    PFNGLVERTEXATTRIBI2IPROC vertexAttribI2i;
    PFNGLVERTEXATTRIBI2IVPROC vertexAttribI2iv;
    PFNGLVERTEXATTRIBI2UIPROC vertexAttribI2ui;
    PFNGLVERTEXATTRIBI2UIVPROC vertexAttribI2uiv;
    PFNGLVERTEXATTRIBI3IPROC vertexAttribI3i;
    PFNGLVERTEXATTRIBI3IVPROC vertexAttribI3iv;
    PFNGLVERTEXATTRIBI3UIPROC vertexAttribI3ui;
    PFNGLVERTEXATTRIBI3UIVPROC vertexAttribI3uiv;
    PFNGLVERTEXATTRIBI4BVPROC vertexAttribI4bv;
    PFNGLVERTEXATTRIBI4IPROC vertexAttribI4i;
    PFNGLVERTEXATTRIBI4IVPROC vertexAttribI4iv;
    PFNGLVERTEXATTRIBI4SVPROC vertexAttribI4sv;
    PFNGLVERTEXATTRIBI4UBVPROC vertexAttribI4ubv;
    PFNGLVERTEXATTRIBI4UIPROC vertexAttribI4ui;
    PFNGLVERTEXATTRIBI4UIVPROC vertexAttribI4uiv;
    PFNGLVERTEXATTRIBI4USVPROC vertexAttribI4usv;
    PFNGLVERTEXATTRIBIPOINTERPROC vertexAttribIPointer;

    // 3.1
    PFNGLCOPYBUFFERSUBDATAPROC copyBufferSubData;
    PFNGLDRAWARRAYSINSTANCEDPROC drawArraysInstanced;
    PFNGLDRAWELEMENTSINSTANCEDPROC drawElementsInstanced;
    PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC getActiveUniformBlockName;
    PFNGLGETACTIVEUNIFORMBLOCKIVPROC getActiveUniformBlockiv;
    PFNGLGETACTIVEUNIFORMNAMEPROC getActiveUniformName;
    PFNGLGETACTIVEUNIFORMSIVPROC getActiveUniformsiv;
    PFNGLGETUNIFORMBLOCKINDEXPROC getUniformBlockIndex;
    PFNGLGETUNIFORMINDICESPROC getUniformIndices;
    PFNGLPRIMITIVERESTARTINDEXPROC primitiveRestartIndex;
    PFNGLTEXBUFFERPROC texBuffer;
    PFNGLUNIFORMBLOCKBINDINGPROC uniformBlockBinding;

    // 3.2
    PFNGLCLIENTWAITSYNCPROC clientWaitSync;
    PFNGLDELETESYNCPROC deleteSync;
    PFNGLDRAWELEMENTSBASEVERTEXPROC drawElementsBaseVertex;
    PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC drawElementsInstancedBaseVertex;
    PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC drawRangeElementsBaseVertex;
    PFNGLFENCESYNCPROC fenceSync;
    PFNGLFRAMEBUFFERTEXTUREPROC framebufferTexture;
    PFNGLGETBUFFERPARAMETERI64VPROC getBufferParameteri64v;
    PFNGLGETINTEGER64I_VPROC getInteger64i_v;
    PFNGLGETINTEGER64VPROC getInteger64v;
    PFNGLGETMULTISAMPLEFVPROC getMultisamplefv;
    PFNGLGETSYNCIVPROC getSynciv;
    PFNGLISSYNCPROC isSync;
    PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC multiDrawElementsBaseVertex;
    PFNGLPROVOKINGVERTEXPROC provokingVertex;
    PFNGLSAMPLEMASKIPROC sampleMaski;
    PFNGLTEXIMAGE2DMULTISAMPLEPROC texImage2DMultisample;
    PFNGLTEXIMAGE3DMULTISAMPLEPROC texImage3DMultisample;
    PFNGLWAITSYNCPROC waitSync;

    // NV_path_rendering (originally written against 3.2 compatibility profile)
    PFNGLMATRIXLOADFEXTPROC matrixLoadEXT;
    PFNGLGENPATHSNVPROC genPathsNV;
    PFNGLDELETEPATHSNVPROC delPathsNV;
    PFNGLPATHCOMMANDSNVPROC pathCommandsNV;
    PFNGLISPATHNVPROC isPathNV;
    PFNGLPATHPARAMETERFNVPROC setPathParameterfNV;
    PFNGLPATHPARAMETERINVPROC setPathParameteriNV;
    PFNGLGETPATHPARAMETERFVNVPROC getPathParameterfNV;
    PFNGLGETPATHPARAMETERIVNVPROC getPathParameteriNV;
    PFNGLPATHSTENCILFUNCNVPROC pathStencilFuncNV;
    PFNGLSTENCILFILLPATHNVPROC stencilFillPathNV;
    PFNGLSTENCILSTROKEPATHNVPROC stencilStrokePathNV;
    PFNGLCOVERFILLPATHNVPROC coverFillPathNV;
    PFNGLCOVERSTROKEPATHNVPROC coverStrokePathNV;
    PFNGLSTENCILTHENCOVERFILLPATHNVPROC stencilThenCoverFillPathNV;
    PFNGLSTENCILTHENCOVERSTROKEPATHNVPROC stencilThenCoverStrokePathNV;
    PFNGLCOVERFILLPATHINSTANCEDNVPROC coverFillPathInstancedNV;
    PFNGLCOVERSTROKEPATHINSTANCEDNVPROC coverStrokePathInstancedNV;
    PFNGLSTENCILFILLPATHINSTANCEDNVPROC stencilFillPathInstancedNV;
    PFNGLSTENCILSTROKEPATHINSTANCEDNVPROC stencilStrokePathInstancedNV;
    PFNGLSTENCILTHENCOVERFILLPATHINSTANCEDNVPROC stencilThenCoverFillPathInstancedNV;
    PFNGLSTENCILTHENCOVERSTROKEPATHINSTANCEDNVPROC stencilThenCoverStrokePathInstancedNV;
    PFNGLPROGRAMPATHFRAGMENTINPUTGENNVPROC programPathFragmentInputGenNV;

    // 3.3
    PFNGLBINDFRAGDATALOCATIONINDEXEDPROC bindFragDataLocationIndexed;
    PFNGLBINDSAMPLERPROC bindSampler;
    PFNGLDELETESAMPLERSPROC deleteSamplers;
    PFNGLGENSAMPLERSPROC genSamplers;
    PFNGLGETFRAGDATAINDEXPROC getFragDataIndex;
    PFNGLGETQUERYOBJECTI64VPROC getQueryObjecti64v;
    PFNGLGETQUERYOBJECTUI64VPROC getQueryObjectui64v;
    PFNGLGETSAMPLERPARAMETERIIVPROC getSamplerParameterIiv;
    PFNGLGETSAMPLERPARAMETERIUIVPROC getSamplerParameterIuiv;
    PFNGLGETSAMPLERPARAMETERFVPROC getSamplerParameterfv;
    PFNGLGETSAMPLERPARAMETERIVPROC getSamplerParameteriv;
    PFNGLISSAMPLERPROC isSampler;
    PFNGLQUERYCOUNTERPROC queryCounter;
    PFNGLSAMPLERPARAMETERIIVPROC samplerParameterIiv;
    PFNGLSAMPLERPARAMETERIUIVPROC samplerParameterIuiv;
    PFNGLSAMPLERPARAMETERFPROC samplerParameterf;
    PFNGLSAMPLERPARAMETERFVPROC samplerParameterfv;
    PFNGLSAMPLERPARAMETERIPROC samplerParameteri;
    PFNGLSAMPLERPARAMETERIVPROC samplerParameteriv;
    PFNGLVERTEXATTRIBDIVISORPROC vertexAttribDivisor;
    PFNGLVERTEXATTRIBP1UIPROC vertexAttribP1ui;
    PFNGLVERTEXATTRIBP1UIVPROC vertexAttribP1uiv;
    PFNGLVERTEXATTRIBP2UIPROC vertexAttribP2ui;
    PFNGLVERTEXATTRIBP2UIVPROC vertexAttribP2uiv;
    PFNGLVERTEXATTRIBP3UIPROC vertexAttribP3ui;
    PFNGLVERTEXATTRIBP3UIVPROC vertexAttribP3uiv;
    PFNGLVERTEXATTRIBP4UIPROC vertexAttribP4ui;
    PFNGLVERTEXATTRIBP4UIVPROC vertexAttribP4uiv;

    // 4.0
    PFNGLBEGINQUERYINDEXEDPROC beginQueryIndexed;
    PFNGLBINDTRANSFORMFEEDBACKPROC bindTransformFeedback;
    PFNGLBLENDEQUATIONSEPARATEIPROC blendEquationSeparatei;
    PFNGLBLENDEQUATIONIPROC blendEquationi;
    PFNGLBLENDFUNCSEPARATEIPROC blendFuncSeparatei;
    PFNGLBLENDFUNCIPROC blendFunci;
    PFNGLDELETETRANSFORMFEEDBACKSPROC deleteTransformFeedbacks;
    PFNGLDRAWARRAYSINDIRECTPROC drawArraysIndirect;
    PFNGLDRAWELEMENTSINDIRECTPROC drawElementsIndirect;
    PFNGLDRAWTRANSFORMFEEDBACKPROC drawTransformFeedback;
    PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC drawTransformFeedbackStream;
    PFNGLENDQUERYINDEXEDPROC endQueryIndexed;
    PFNGLGENTRANSFORMFEEDBACKSPROC genTransformFeedbacks;
    PFNGLGETACTIVESUBROUTINENAMEPROC getActiveSubroutineName;
    PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC getActiveSubroutineUniformName;
    PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC getActiveSubroutineUniformiv;
    PFNGLGETPROGRAMSTAGEIVPROC getProgramStageiv;
    PFNGLGETQUERYINDEXEDIVPROC getQueryIndexediv;
    PFNGLGETSUBROUTINEINDEXPROC getSubroutineIndex;
    PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC getSubroutineUniformLocation;
    PFNGLGETUNIFORMSUBROUTINEUIVPROC getUniformSubroutineuiv;
    PFNGLGETUNIFORMDVPROC getUniformdv;
    PFNGLISTRANSFORMFEEDBACKPROC isTransformFeedback;
    PFNGLMINSAMPLESHADINGPROC minSampleShading;
    PFNGLPATCHPARAMETERFVPROC patchParameterfv;
    PFNGLPATCHPARAMETERIPROC patchParameteri;
    PFNGLPAUSETRANSFORMFEEDBACKPROC pauseTransformFeedback;
    PFNGLRESUMETRANSFORMFEEDBACKPROC resumeTransformFeedback;
    PFNGLUNIFORM1DPROC uniform1d;
    PFNGLUNIFORM1DVPROC uniform1dv;
    PFNGLUNIFORM2DPROC uniform2d;
    PFNGLUNIFORM2DVPROC uniform2dv;
    PFNGLUNIFORM3DPROC uniform3d;
    PFNGLUNIFORM3DVPROC uniform3dv;
    PFNGLUNIFORM4DPROC uniform4d;
    PFNGLUNIFORM4DVPROC uniform4dv;
    PFNGLUNIFORMMATRIX2DVPROC uniformMatrix2dv;
    PFNGLUNIFORMMATRIX2X3DVPROC uniformMatrix2x3dv;
    PFNGLUNIFORMMATRIX2X4DVPROC uniformMatrix2x4dv;
    PFNGLUNIFORMMATRIX3DVPROC uniformMatrix3dv;
    PFNGLUNIFORMMATRIX3X2DVPROC uniformMatrix3x2dv;
    PFNGLUNIFORMMATRIX3X4DVPROC uniformMatrix3x4dv;
    PFNGLUNIFORMMATRIX4DVPROC uniformMatrix4dv;
    PFNGLUNIFORMMATRIX4X2DVPROC uniformMatrix4x2dv;
    PFNGLUNIFORMMATRIX4X3DVPROC uniformMatrix4x3dv;
    PFNGLUNIFORMSUBROUTINESUIVPROC uniformSubroutinesuiv;

    // 4.1
    PFNGLACTIVESHADERPROGRAMPROC activeShaderProgram;
    PFNGLBINDPROGRAMPIPELINEPROC bindProgramPipeline;
    PFNGLCLEARDEPTHFPROC clearDepthf;
    PFNGLCREATESHADERPROGRAMVPROC createShaderProgramv;
    PFNGLDELETEPROGRAMPIPELINESPROC deleteProgramPipelines;
    PFNGLDEPTHRANGEARRAYVPROC depthRangeArrayv;
    PFNGLDEPTHRANGEINDEXEDPROC depthRangeIndexed;
    PFNGLDEPTHRANGEFPROC depthRangef;
    PFNGLGENPROGRAMPIPELINESPROC genProgramPipelines;
    PFNGLGETDOUBLEI_VPROC getDoublei_v;
    PFNGLGETFLOATI_VPROC getFloati_v;
    PFNGLGETPROGRAMBINARYPROC getProgramBinary;
    PFNGLGETPROGRAMPIPELINEINFOLOGPROC getProgramPipelineInfoLog;
    PFNGLGETPROGRAMPIPELINEIVPROC getProgramPipelineiv;
    PFNGLGETSHADERPRECISIONFORMATPROC getShaderPrecisionFormat;
    PFNGLGETVERTEXATTRIBLDVPROC getVertexAttribLdv;
    PFNGLISPROGRAMPIPELINEPROC isProgramPipeline;
    PFNGLPROGRAMBINARYPROC programBinary;
    PFNGLPROGRAMPARAMETERIPROC programParameteri;
    PFNGLPROGRAMUNIFORM1DPROC programUniform1d;
    PFNGLPROGRAMUNIFORM1DVPROC programUniform1dv;
    PFNGLPROGRAMUNIFORM1FPROC programUniform1f;
    PFNGLPROGRAMUNIFORM1FVPROC programUniform1fv;
    PFNGLPROGRAMUNIFORM1IPROC programUniform1i;
    PFNGLPROGRAMUNIFORM1IVPROC programUniform1iv;
    PFNGLPROGRAMUNIFORM1UIPROC programUniform1ui;
    PFNGLPROGRAMUNIFORM1UIVPROC programUniform1uiv;
    PFNGLPROGRAMUNIFORM2DPROC programUniform2d;
    PFNGLPROGRAMUNIFORM2DVPROC programUniform2dv;
    PFNGLPROGRAMUNIFORM2FPROC programUniform2f;
    PFNGLPROGRAMUNIFORM2FVPROC programUniform2fv;
    PFNGLPROGRAMUNIFORM2IPROC programUniform2i;
    PFNGLPROGRAMUNIFORM2IVPROC programUniform2iv;
    PFNGLPROGRAMUNIFORM2UIPROC programUniform2ui;
    PFNGLPROGRAMUNIFORM2UIVPROC programUniform2uiv;
    PFNGLPROGRAMUNIFORM3DPROC programUniform3d;
    PFNGLPROGRAMUNIFORM3DVPROC programUniform3dv;
    PFNGLPROGRAMUNIFORM3FPROC programUniform3f;
    PFNGLPROGRAMUNIFORM3FVPROC programUniform3fv;
    PFNGLPROGRAMUNIFORM3IPROC programUniform3i;
    PFNGLPROGRAMUNIFORM3IVPROC programUniform3iv;
    PFNGLPROGRAMUNIFORM3UIPROC programUniform3ui;
    PFNGLPROGRAMUNIFORM3UIVPROC programUniform3uiv;
    PFNGLPROGRAMUNIFORM4DPROC programUniform4d;
    PFNGLPROGRAMUNIFORM4DVPROC programUniform4dv;
    PFNGLPROGRAMUNIFORM4FPROC programUniform4f;
    PFNGLPROGRAMUNIFORM4FVPROC programUniform4fv;
    PFNGLPROGRAMUNIFORM4IPROC programUniform4i;
    PFNGLPROGRAMUNIFORM4IVPROC programUniform4iv;
    PFNGLPROGRAMUNIFORM4UIPROC programUniform4ui;
    PFNGLPROGRAMUNIFORM4UIVPROC programUniform4uiv;
    PFNGLPROGRAMUNIFORMMATRIX2DVPROC programUniformMatrix2dv;
    PFNGLPROGRAMUNIFORMMATRIX2FVPROC programUniformMatrix2fv;
    PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC programUniformMatrix2x3dv;
    PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC programUniformMatrix2x3fv;
    PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC programUniformMatrix2x4dv;
    PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC programUniformMatrix2x4fv;
    PFNGLPROGRAMUNIFORMMATRIX3DVPROC programUniformMatrix3dv;
    PFNGLPROGRAMUNIFORMMATRIX3FVPROC programUniformMatrix3fv;
    PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC programUniformMatrix3x2dv;
    PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC programUniformMatrix3x2fv;
    PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC programUniformMatrix3x4dv;
    PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC programUniformMatrix3x4fv;
    PFNGLPROGRAMUNIFORMMATRIX4DVPROC programUniformMatrix4dv;
    PFNGLPROGRAMUNIFORMMATRIX4FVPROC programUniformMatrix4fv;
    PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC programUniformMatrix4x2dv;
    PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC programUniformMatrix4x2fv;
    PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC programUniformMatrix4x3dv;
    PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC programUniformMatrix4x3fv;
    PFNGLRELEASESHADERCOMPILERPROC releaseShaderCompiler;
    PFNGLSCISSORARRAYVPROC scissorArrayv;
    PFNGLSCISSORINDEXEDPROC scissorIndexed;
    PFNGLSCISSORINDEXEDVPROC scissorIndexedv;
    PFNGLSHADERBINARYPROC shaderBinary;
    PFNGLUSEPROGRAMSTAGESPROC useProgramStages;
    PFNGLVALIDATEPROGRAMPIPELINEPROC validateProgramPipeline;
    PFNGLVERTEXATTRIBL1DPROC vertexAttribL1d;
    PFNGLVERTEXATTRIBL1DVPROC vertexAttribL1dv;
    PFNGLVERTEXATTRIBL2DPROC vertexAttribL2d;
    PFNGLVERTEXATTRIBL2DVPROC vertexAttribL2dv;
    PFNGLVERTEXATTRIBL3DPROC vertexAttribL3d;
    PFNGLVERTEXATTRIBL3DVPROC vertexAttribL3dv;
    PFNGLVERTEXATTRIBL4DPROC vertexAttribL4d;
    PFNGLVERTEXATTRIBL4DVPROC vertexAttribL4dv;
    PFNGLVERTEXATTRIBLPOINTERPROC vertexAttribLPointer;
    PFNGLVIEWPORTARRAYVPROC viewportArrayv;
    PFNGLVIEWPORTINDEXEDFPROC viewportIndexedf;
    PFNGLVIEWPORTINDEXEDFVPROC viewportIndexedfv;

    // 4.2
    PFNGLBINDIMAGETEXTUREPROC bindImageTexture;
    PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC drawArraysInstancedBaseInstance;
    PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC drawElementsInstancedBaseInstance;
    PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC drawElementsInstancedBaseVertexBaseInstance;
    PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC drawTransformFeedbackInstanced;
    PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC drawTransformFeedbackStreamInstanced;
    PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC getActiveAtomicCounterBufferiv;
    PFNGLGETINTERNALFORMATIVPROC getInternalformativ;
    PFNGLMEMORYBARRIERPROC memoryBarrier;
    PFNGLTEXSTORAGE1DPROC texStorage1D;
    PFNGLTEXSTORAGE2DPROC texStorage2D;
    PFNGLTEXSTORAGE3DPROC texStorage3D;

    // 4.3
    PFNGLBINDVERTEXBUFFERPROC bindVertexBuffer;
    PFNGLCLEARBUFFERDATAPROC clearBufferData;
    PFNGLCLEARBUFFERSUBDATAPROC clearBufferSubData;
    PFNGLCOPYIMAGESUBDATAPROC copyImageSubData;
    PFNGLDEBUGMESSAGECALLBACKPROC debugMessageCallback;
    PFNGLDEBUGMESSAGECONTROLPROC debugMessageControl;
    PFNGLDEBUGMESSAGEINSERTPROC debugMessageInsert;
    PFNGLDISPATCHCOMPUTEPROC dispatchCompute;
    PFNGLDISPATCHCOMPUTEINDIRECTPROC dispatchComputeIndirect;
    PFNGLFRAMEBUFFERPARAMETERIPROC framebufferParameteri;
    PFNGLGETDEBUGMESSAGELOGPROC getDebugMessageLog;
    PFNGLGETFRAMEBUFFERPARAMETERIVPROC getFramebufferParameteriv;
    PFNGLGETINTERNALFORMATI64VPROC getInternalformati64v;
    PFNGLGETPOINTERVPROC getPointerv;
    PFNGLGETOBJECTLABELPROC getObjectLabel;
    PFNGLGETOBJECTPTRLABELPROC getObjectPtrLabel;
    PFNGLGETPROGRAMINTERFACEIVPROC getProgramInterfaceiv;
    PFNGLGETPROGRAMRESOURCEINDEXPROC getProgramResourceIndex;
    PFNGLGETPROGRAMRESOURCELOCATIONPROC getProgramResourceLocation;
    PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC getProgramResourceLocationIndex;
    PFNGLGETPROGRAMRESOURCENAMEPROC getProgramResourceName;
    PFNGLGETPROGRAMRESOURCEIVPROC getProgramResourceiv;
    PFNGLINVALIDATEBUFFERDATAPROC invalidateBufferData;
    PFNGLINVALIDATEBUFFERSUBDATAPROC invalidateBufferSubData;
    PFNGLINVALIDATEFRAMEBUFFERPROC invalidateFramebuffer;
    PFNGLINVALIDATESUBFRAMEBUFFERPROC invalidateSubFramebuffer;
    PFNGLINVALIDATETEXIMAGEPROC invalidateTexImage;
    PFNGLINVALIDATETEXSUBIMAGEPROC invalidateTexSubImage;
    PFNGLMULTIDRAWARRAYSINDIRECTPROC multiDrawArraysIndirect;
    PFNGLMULTIDRAWELEMENTSINDIRECTPROC multiDrawElementsIndirect;
    PFNGLOBJECTLABELPROC objectLabel;
    PFNGLOBJECTPTRLABELPROC objectPtrLabel;
    PFNGLPOPDEBUGGROUPPROC popDebugGroup;
    PFNGLPUSHDEBUGGROUPPROC pushDebugGroup;
    PFNGLSHADERSTORAGEBLOCKBINDINGPROC shaderStorageBlockBinding;
    PFNGLTEXBUFFERRANGEPROC texBufferRange;
    PFNGLTEXSTORAGE2DMULTISAMPLEPROC texStorage2DMultisample;
    PFNGLTEXSTORAGE3DMULTISAMPLEPROC texStorage3DMultisample;
    PFNGLTEXTUREVIEWPROC textureView;
    PFNGLVERTEXATTRIBBINDINGPROC vertexAttribBinding;
    PFNGLVERTEXATTRIBFORMATPROC vertexAttribFormat;
    PFNGLVERTEXATTRIBIFORMATPROC vertexAttribIFormat;
    PFNGLVERTEXATTRIBLFORMATPROC vertexAttribLFormat;
    PFNGLVERTEXBINDINGDIVISORPROC vertexBindingDivisor;
    PFNGLCOVERAGEMODULATIONNVPROC coverageModulationNV;

    // 4.4
    PFNGLBINDBUFFERSBASEPROC bindBuffersBase;
    PFNGLBINDBUFFERSRANGEPROC bindBuffersRange;
    PFNGLBINDIMAGETEXTURESPROC bindImageTextures;
    PFNGLBINDSAMPLERSPROC bindSamplers;
    PFNGLBINDTEXTURESPROC bindTextures;
    PFNGLBINDVERTEXBUFFERSPROC bindVertexBuffers;
    PFNGLBUFFERSTORAGEPROC bufferStorage;
    PFNGLCLEARTEXIMAGEPROC clearTexImage;
    PFNGLCLEARTEXSUBIMAGEPROC clearTexSubImage;

    // 4.5
    PFNGLBINDTEXTUREUNITPROC bindTextureUnit;
    PFNGLBLITNAMEDFRAMEBUFFERPROC blitNamedFramebuffer;
    PFNGLCHECKNAMEDFRAMEBUFFERSTATUSPROC checkNamedFramebufferStatus;
    PFNGLCLEARNAMEDBUFFERDATAPROC clearNamedBufferData;
    PFNGLCLEARNAMEDBUFFERSUBDATAPROC clearNamedBufferSubData;
    PFNGLCLEARNAMEDFRAMEBUFFERFIPROC clearNamedFramebufferfi;
    PFNGLCLEARNAMEDFRAMEBUFFERFVPROC clearNamedFramebufferfv;
    PFNGLCLEARNAMEDFRAMEBUFFERIVPROC clearNamedFramebufferiv;
    PFNGLCLEARNAMEDFRAMEBUFFERUIVPROC clearNamedFramebufferuiv;
    PFNGLCLIPCONTROLPROC clipControl;
    PFNGLCOMPRESSEDTEXTURESUBIMAGE1DPROC compressedTextureSubImage1D;
    PFNGLCOMPRESSEDTEXTURESUBIMAGE2DPROC compressedTextureSubImage2D;
    PFNGLCOMPRESSEDTEXTURESUBIMAGE3DPROC compressedTextureSubImage3D;
    PFNGLCOPYNAMEDBUFFERSUBDATAPROC copyNamedBufferSubData;
    PFNGLCOPYTEXTURESUBIMAGE1DPROC copyTextureSubImage1D;
    PFNGLCOPYTEXTURESUBIMAGE2DPROC copyTextureSubImage2D;
    PFNGLCOPYTEXTURESUBIMAGE3DPROC copyTextureSubImage3D;
    PFNGLCREATEBUFFERSPROC createBuffers;
    PFNGLCREATEFRAMEBUFFERSPROC createFramebuffers;
    PFNGLCREATEPROGRAMPIPELINESPROC createProgramPipelines;
    PFNGLCREATEQUERIESPROC createQueries;
    PFNGLCREATERENDERBUFFERSPROC createRenderbuffers;
    PFNGLCREATESAMPLERSPROC createSamplers;
    PFNGLCREATETEXTURESPROC createTextures;
    PFNGLCREATETRANSFORMFEEDBACKSPROC createTransformFeedbacks;
    PFNGLCREATEVERTEXARRAYSPROC createVertexArrays;
    PFNGLDISABLEVERTEXARRAYATTRIBPROC disableVertexArrayAttrib;
    PFNGLENABLEVERTEXARRAYATTRIBPROC enableVertexArrayAttrib;
    PFNGLFLUSHMAPPEDNAMEDBUFFERRANGEPROC flushMappedNamedBufferRange;
    PFNGLGENERATETEXTUREMIPMAPPROC generateTextureMipmap;
    PFNGLGETCOMPRESSEDTEXTUREIMAGEPROC getCompressedTextureImage;
    PFNGLGETCOMPRESSEDTEXTURESUBIMAGEPROC getCompressedTextureSubImage;
    PFNGLGETGRAPHICSRESETSTATUSPROC getGraphicsResetStatus;
    PFNGLGETNAMEDBUFFERPARAMETERI64VPROC getNamedBufferParameteri64v;
    PFNGLGETNAMEDBUFFERPARAMETERIVPROC getNamedBufferParameteriv;
    PFNGLGETNAMEDBUFFERPOINTERVPROC getNamedBufferPointerv;
    PFNGLGETNAMEDBUFFERSUBDATAPROC getNamedBufferSubData;
    PFNGLGETNAMEDFRAMEBUFFERATTACHMENTPARAMETERIVPROC getNamedFramebufferAttachmentParameteriv;
    PFNGLGETNAMEDFRAMEBUFFERPARAMETERIVPROC getNamedFramebufferParameteriv;
    PFNGLGETNAMEDRENDERBUFFERPARAMETERIVPROC getNamedRenderbufferParameteriv;
    PFNGLGETQUERYBUFFEROBJECTI64VPROC getQueryBufferObjecti64v;
    PFNGLGETQUERYBUFFEROBJECTIVPROC getQueryBufferObjectiv;
    PFNGLGETQUERYBUFFEROBJECTUI64VPROC getQueryBufferObjectui64v;
    PFNGLGETQUERYBUFFEROBJECTUIVPROC getQueryBufferObjectuiv;
    PFNGLGETTEXTUREIMAGEPROC getTextureImage;
    PFNGLGETTEXTURELEVELPARAMETERFVPROC getTextureLevelParameterfv;
    PFNGLGETTEXTURELEVELPARAMETERIVPROC getTextureLevelParameteriv;
    PFNGLGETTEXTUREPARAMETERIIVPROC getTextureParameterIiv;
    PFNGLGETTEXTUREPARAMETERIUIVPROC getTextureParameterIuiv;
    PFNGLGETTEXTUREPARAMETERFVPROC getTextureParameterfv;
    PFNGLGETTEXTUREPARAMETERIVPROC getTextureParameteriv;
    PFNGLGETTEXTURESUBIMAGEPROC getTextureSubImage;
    PFNGLGETTRANSFORMFEEDBACKI64_VPROC getTransformFeedbacki64_v;
    PFNGLGETTRANSFORMFEEDBACKI_VPROC getTransformFeedbacki_v;
    PFNGLGETTRANSFORMFEEDBACKIVPROC getTransformFeedbackiv;
    PFNGLGETVERTEXARRAYINDEXED64IVPROC getVertexArrayIndexed64iv;
    PFNGLGETVERTEXARRAYINDEXEDIVPROC getVertexArrayIndexediv;
    PFNGLGETVERTEXARRAYIVPROC getVertexArrayiv;
    PFNGLGETNCOMPRESSEDTEXIMAGEPROC getnCompressedTexImage;
    PFNGLGETNTEXIMAGEPROC getnTexImage;
    PFNGLGETNUNIFORMDVPROC getnUniformdv;
    PFNGLGETNUNIFORMFVPROC getnUniformfv;
    PFNGLGETNUNIFORMIVPROC getnUniformiv;
    PFNGLGETNUNIFORMUIVPROC getnUniformuiv;
    PFNGLINVALIDATENAMEDFRAMEBUFFERDATAPROC invalidateNamedFramebufferData;
    PFNGLINVALIDATENAMEDFRAMEBUFFERSUBDATAPROC invalidateNamedFramebufferSubData;
    PFNGLMAPNAMEDBUFFERPROC mapNamedBuffer;
    PFNGLMAPNAMEDBUFFERRANGEPROC mapNamedBufferRange;
    PFNGLMEMORYBARRIERBYREGIONPROC memoryBarrierByRegion;
    PFNGLNAMEDBUFFERDATAPROC namedBufferData;
    PFNGLNAMEDBUFFERSTORAGEPROC namedBufferStorage;
    PFNGLNAMEDBUFFERSUBDATAPROC namedBufferSubData;
    PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC namedFramebufferDrawBuffer;
    PFNGLNAMEDFRAMEBUFFERDRAWBUFFERSPROC namedFramebufferDrawBuffers;
    PFNGLNAMEDFRAMEBUFFERPARAMETERIPROC namedFramebufferParameteri;
    PFNGLNAMEDFRAMEBUFFERREADBUFFERPROC namedFramebufferReadBuffer;
    PFNGLNAMEDFRAMEBUFFERRENDERBUFFERPROC namedFramebufferRenderbuffer;
    PFNGLNAMEDFRAMEBUFFERTEXTUREPROC namedFramebufferTexture;
    PFNGLNAMEDFRAMEBUFFERTEXTURELAYERPROC namedFramebufferTextureLayer;
    PFNGLNAMEDRENDERBUFFERSTORAGEPROC namedRenderbufferStorage;
    PFNGLNAMEDRENDERBUFFERSTORAGEMULTISAMPLEPROC namedRenderbufferStorageMultisample;
    PFNGLREADNPIXELSPROC readnPixels;
    PFNGLTEXTUREBARRIERPROC textureBarrier;
    PFNGLTEXTUREBUFFERPROC textureBuffer;
    PFNGLTEXTUREBUFFERRANGEPROC textureBufferRange;
    PFNGLTEXTUREPARAMETERIIVPROC textureParameterIiv;
    PFNGLTEXTUREPARAMETERIUIVPROC textureParameterIuiv;
    PFNGLTEXTUREPARAMETERFPROC textureParameterf;
    PFNGLTEXTUREPARAMETERFVPROC textureParameterfv;
    PFNGLTEXTUREPARAMETERIPROC textureParameteri;
    PFNGLTEXTUREPARAMETERIVPROC textureParameteriv;
    PFNGLTEXTURESTORAGE1DPROC textureStorage1D;
    PFNGLTEXTURESTORAGE2DPROC textureStorage2D;
    PFNGLTEXTURESTORAGE2DMULTISAMPLEPROC textureStorage2DMultisample;
    PFNGLTEXTURESTORAGE3DPROC textureStorage3D;
    PFNGLTEXTURESTORAGE3DMULTISAMPLEPROC textureStorage3DMultisample;
    PFNGLTEXTURESUBIMAGE1DPROC textureSubImage1D;
    PFNGLTEXTURESUBIMAGE2DPROC textureSubImage2D;
    PFNGLTEXTURESUBIMAGE3DPROC textureSubImage3D;
    PFNGLTRANSFORMFEEDBACKBUFFERBASEPROC transformFeedbackBufferBase;
    PFNGLTRANSFORMFEEDBACKBUFFERRANGEPROC transformFeedbackBufferRange;
    PFNGLUNMAPNAMEDBUFFERPROC unmapNamedBuffer;
    PFNGLVERTEXARRAYATTRIBBINDINGPROC vertexArrayAttribBinding;
    PFNGLVERTEXARRAYATTRIBFORMATPROC vertexArrayAttribFormat;
    PFNGLVERTEXARRAYATTRIBIFORMATPROC vertexArrayAttribIFormat;
    PFNGLVERTEXARRAYATTRIBLFORMATPROC vertexArrayAttribLFormat;
    PFNGLVERTEXARRAYBINDINGDIVISORPROC vertexArrayBindingDivisor;
    PFNGLVERTEXARRAYELEMENTBUFFERPROC vertexArrayElementBuffer;
    PFNGLVERTEXARRAYVERTEXBUFFERPROC vertexArrayVertexBuffer;
    PFNGLVERTEXARRAYVERTEXBUFFERSPROC vertexArrayVertexBuffers;

    // ES 3.2
    PFNGLBLENDBARRIERPROC blendBarrier;
    PFNGLPRIMITIVEBOUNDINGBOXPROC primitiveBoundingBox;

    // ES extensions
    PFNGLEGLIMAGETARGETRENDERBUFFERSTORAGEOESPROC eglImageTargetRenderbufferStorageOES;
    PFNGLEGLIMAGETARGETTEXTURE2DOESPROC eglImageTargetTexture2DOES;

  private:
    void initializeProcsDesktopGL();
    void initializeProcsGLES();

    virtual void *loadProcAddress(const std::string &function) = 0;
};

}

#endif // LIBANGLE_RENDERER_GL_FUNCTIONSGL_H_