1 //
2 // Copyright (c) 2015 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6 
7 // FunctionsGL.cpp: Implements the FuntionsGL class to contain loaded GL functions
8 
9 #include "libANGLE/renderer/gl/FunctionsGL.h"
10 
11 #include <algorithm>
12 
13 #include "common/string_utils.h"
14 #include "libANGLE/renderer/gl/renderergl_utils.h"
15 
16 namespace rx
17 {
18 
GetGLVersion(PFNGLGETSTRINGPROC getStringFunction,gl::Version * outVersion,StandardGL * outStandard)19 static void GetGLVersion(PFNGLGETSTRINGPROC getStringFunction, gl::Version *outVersion, StandardGL *outStandard)
20 {
21     const std::string version = reinterpret_cast<const char*>(getStringFunction(GL_VERSION));
22     if (version.find("OpenGL ES") == std::string::npos)
23     {
24         // OpenGL spec states the GL_VERSION string will be in the following format:
25         // <version number><space><vendor-specific information>
26         // The version number is either of the form major number.minor number or major
27         // number.minor number.release number, where the numbers all have one or more
28         // digits
29         *outStandard = STANDARD_GL_DESKTOP;
30         *outVersion = gl::Version(version[0] - '0', version[2] - '0');
31     }
32     else
33     {
34         // ES spec states that the GL_VERSION string will be in the following format:
35         // "OpenGL ES N.M vendor-specific information"
36         *outStandard = STANDARD_GL_ES;
37         *outVersion = gl::Version(version[10] - '0', version[12] - '0');
38     }
39 }
40 
GetIndexedExtensions(PFNGLGETINTEGERVPROC getIntegerFunction,PFNGLGETSTRINGIPROC getStringIFunction)41 static std::vector<std::string> GetIndexedExtensions(PFNGLGETINTEGERVPROC getIntegerFunction, PFNGLGETSTRINGIPROC getStringIFunction)
42 {
43     std::vector<std::string> result;
44 
45     GLint numExtensions;
46     getIntegerFunction(GL_NUM_EXTENSIONS, &numExtensions);
47 
48     result.reserve(numExtensions);
49 
50     for (GLint i = 0; i < numExtensions; i++)
51     {
52         result.push_back(reinterpret_cast<const char*>(getStringIFunction(GL_EXTENSIONS, i)));
53     }
54 
55     return result;
56 }
57 
58 template <typename T>
AssignGLEntryPoint(void * function,T * outFunction)59 static void AssignGLEntryPoint(void *function, T *outFunction)
60 {
61     *outFunction = reinterpret_cast<T>(function);
62 }
63 
64 template <typename T>
AssignGLExtensionEntryPoint(const std::vector<std::string> & extensions,const char * requiredExtensionString,void * function,T * outFunction)65 static void AssignGLExtensionEntryPoint(const std::vector<std::string> &extensions, const char *requiredExtensionString,
66                                         void *function, T *outFunction)
67 {
68     std::vector<std::string> requiredExtensions;
69     angle::SplitStringAlongWhitespace(requiredExtensionString, &requiredExtensions);
70     for (const std::string& requiredExtension : requiredExtensions)
71     {
72         if (std::find(extensions.begin(), extensions.end(), requiredExtension) == extensions.end())
73         {
74             return;
75         }
76     }
77 
78     *outFunction = reinterpret_cast<T>(function);
79 }
80 
FunctionsGL()81 FunctionsGL::FunctionsGL()
82     : version(),
83       standard(),
84       extensions(),
85 
86       blendFunc(nullptr),
87       clear(nullptr),
88       clearColor(nullptr),
89       clearDepth(nullptr),
90       clearStencil(nullptr),
91       colorMask(nullptr),
92       cullFace(nullptr),
93       depthFunc(nullptr),
94       depthMask(nullptr),
95       depthRange(nullptr),
96       disable(nullptr),
97       drawBuffer(nullptr),
98       enable(nullptr),
99       finish(nullptr),
100       flush(nullptr),
101       frontFace(nullptr),
102       getBooleanv(nullptr),
103       getDoublev(nullptr),
104       getError(nullptr),
105       getFloatv(nullptr),
106       getIntegerv(nullptr),
107       getString(nullptr),
108       getTexImage(nullptr),
109       getTexLevelParameterfv(nullptr),
110       getTexLevelParameteriv(nullptr),
111       getTexParameterfv(nullptr),
112       getTexParameteriv(nullptr),
113       hint(nullptr),
114       isEnabled(nullptr),
115       lineWidth(nullptr),
116       logicOp(nullptr),
117       pixelStoref(nullptr),
118       pixelStorei(nullptr),
119       pointSize(nullptr),
120       polygonMode(nullptr),
121       readBuffer(nullptr),
122       readPixels(nullptr),
123       scissor(nullptr),
124       stencilFunc(nullptr),
125       stencilMask(nullptr),
126       stencilOp(nullptr),
127       texImage1D(nullptr),
128       texImage2D(nullptr),
129       texParameterf(nullptr),
130       texParameterfv(nullptr),
131       texParameteri(nullptr),
132       texParameteriv(nullptr),
133       viewport(nullptr),
134 
135       bindTexture(nullptr),
136       copyTexImage1D(nullptr),
137       copyTexImage2D(nullptr),
138       copyTexSubImage1D(nullptr),
139       copyTexSubImage2D(nullptr),
140       deleteTextures(nullptr),
141       drawArrays(nullptr),
142       drawElements(nullptr),
143       genTextures(nullptr),
144       isTexture(nullptr),
145       polygonOffset(nullptr),
146       texSubImage1D(nullptr),
147       texSubImage2D(nullptr),
148 
149       blendColor(nullptr),
150       blendEquation(nullptr),
151       copyTexSubImage3D(nullptr),
152       drawRangeElements(nullptr),
153       texImage3D(nullptr),
154       texSubImage3D(nullptr),
155 
156       deleteFencesNV(nullptr),
157       genFencesNV(nullptr),
158       isFenceNV(nullptr),
159       testFenceNV(nullptr),
160       getFenceivNV(nullptr),
161       finishFenceNV(nullptr),
162       setFenceNV(nullptr),
163 
164       activeTexture(nullptr),
165       compressedTexImage1D(nullptr),
166       compressedTexImage2D(nullptr),
167       compressedTexImage3D(nullptr),
168       compressedTexSubImage1D(nullptr),
169       compressedTexSubImage2D(nullptr),
170       compressedTexSubImage3D(nullptr),
171       getCompressedTexImage(nullptr),
172       sampleCoverage(nullptr),
173 
174       blendFuncSeparate(nullptr),
175       multiDrawArrays(nullptr),
176       multiDrawElements(nullptr),
177       pointParameterf(nullptr),
178       pointParameterfv(nullptr),
179       pointParameteri(nullptr),
180       pointParameteriv(nullptr),
181 
182       beginQuery(nullptr),
183       bindBuffer(nullptr),
184       bufferData(nullptr),
185       bufferSubData(nullptr),
186       deleteBuffers(nullptr),
187       deleteQueries(nullptr),
188       endQuery(nullptr),
189       genBuffers(nullptr),
190       genQueries(nullptr),
191       getBufferParameteriv(nullptr),
192       getBufferPointerv(nullptr),
193       getBufferSubData(nullptr),
194       getQueryObjectiv(nullptr),
195       getQueryObjectuiv(nullptr),
196       getQueryiv(nullptr),
197       isBuffer(nullptr),
198       isQuery(nullptr),
199       mapBuffer(nullptr),
200       unmapBuffer(nullptr),
201 
202       attachShader(nullptr),
203       bindAttribLocation(nullptr),
204       blendEquationSeparate(nullptr),
205       compileShader(nullptr),
206       createProgram(nullptr),
207       createShader(nullptr),
208       deleteProgram(nullptr),
209       deleteShader(nullptr),
210       detachShader(nullptr),
211       disableVertexAttribArray(nullptr),
212       drawBuffers(nullptr),
213       enableVertexAttribArray(nullptr),
214       getActiveAttrib(nullptr),
215       getActiveUniform(nullptr),
216       getAttachedShaders(nullptr),
217       getAttribLocation(nullptr),
218       getProgramInfoLog(nullptr),
219       getProgramiv(nullptr),
220       getShaderInfoLog(nullptr),
221       getShaderSource(nullptr),
222       getShaderiv(nullptr),
223       getUniformLocation(nullptr),
224       getUniformfv(nullptr),
225       getUniformiv(nullptr),
226       getVertexAttribPointerv(nullptr),
227       getVertexAttribdv(nullptr),
228       getVertexAttribfv(nullptr),
229       getVertexAttribiv(nullptr),
230       isProgram(nullptr),
231       isShader(nullptr),
232       linkProgram(nullptr),
233       shaderSource(nullptr),
234       stencilFuncSeparate(nullptr),
235       stencilMaskSeparate(nullptr),
236       stencilOpSeparate(nullptr),
237       uniform1f(nullptr),
238       uniform1fv(nullptr),
239       uniform1i(nullptr),
240       uniform1iv(nullptr),
241       uniform2f(nullptr),
242       uniform2fv(nullptr),
243       uniform2i(nullptr),
244       uniform2iv(nullptr),
245       uniform3f(nullptr),
246       uniform3fv(nullptr),
247       uniform3i(nullptr),
248       uniform3iv(nullptr),
249       uniform4f(nullptr),
250       uniform4fv(nullptr),
251       uniform4i(nullptr),
252       uniform4iv(nullptr),
253       uniformMatrix2fv(nullptr),
254       uniformMatrix3fv(nullptr),
255       uniformMatrix4fv(nullptr),
256       useProgram(nullptr),
257       validateProgram(nullptr),
258       vertexAttrib1d(nullptr),
259       vertexAttrib1dv(nullptr),
260       vertexAttrib1f(nullptr),
261       vertexAttrib1fv(nullptr),
262       vertexAttrib1s(nullptr),
263       vertexAttrib1sv(nullptr),
264       vertexAttrib2d(nullptr),
265       vertexAttrib2dv(nullptr),
266       vertexAttrib2f(nullptr),
267       vertexAttrib2fv(nullptr),
268       vertexAttrib2s(nullptr),
269       vertexAttrib2sv(nullptr),
270       vertexAttrib3d(nullptr),
271       vertexAttrib3dv(nullptr),
272       vertexAttrib3f(nullptr),
273       vertexAttrib3fv(nullptr),
274       vertexAttrib3s(nullptr),
275       vertexAttrib3sv(nullptr),
276       vertexAttrib4Nbv(nullptr),
277       vertexAttrib4Niv(nullptr),
278       vertexAttrib4Nsv(nullptr),
279       vertexAttrib4Nub(nullptr),
280       vertexAttrib4Nubv(nullptr),
281       vertexAttrib4Nuiv(nullptr),
282       vertexAttrib4Nusv(nullptr),
283       vertexAttrib4bv(nullptr),
284       vertexAttrib4d(nullptr),
285       vertexAttrib4dv(nullptr),
286       vertexAttrib4f(nullptr),
287       vertexAttrib4fv(nullptr),
288       vertexAttrib4iv(nullptr),
289       vertexAttrib4s(nullptr),
290       vertexAttrib4sv(nullptr),
291       vertexAttrib4ubv(nullptr),
292       vertexAttrib4uiv(nullptr),
293       vertexAttrib4usv(nullptr),
294       vertexAttribPointer(nullptr),
295 
296       uniformMatrix2x3fv(nullptr),
297       uniformMatrix2x4fv(nullptr),
298       uniformMatrix3x2fv(nullptr),
299       uniformMatrix3x4fv(nullptr),
300       uniformMatrix4x2fv(nullptr),
301       uniformMatrix4x3fv(nullptr),
302 
303       beginConditionalRender(nullptr),
304       beginTransformFeedback(nullptr),
305       bindBufferBase(nullptr),
306       bindBufferRange(nullptr),
307       bindFragDataLocation(nullptr),
308       bindFramebuffer(nullptr),
309       bindRenderbuffer(nullptr),
310       bindVertexArray(nullptr),
311       blitFramebuffer(nullptr),
312       checkFramebufferStatus(nullptr),
313       clampColor(nullptr),
314       clearBufferfi(nullptr),
315       clearBufferfv(nullptr),
316       clearBufferiv(nullptr),
317       clearBufferuiv(nullptr),
318       colorMaski(nullptr),
319       deleteFramebuffers(nullptr),
320       deleteRenderbuffers(nullptr),
321       deleteVertexArrays(nullptr),
322       disablei(nullptr),
323       enablei(nullptr),
324       endConditionalRender(nullptr),
325       endTransformFeedback(nullptr),
326       flushMappedBufferRange(nullptr),
327       framebufferRenderbuffer(nullptr),
328       framebufferTexture1D(nullptr),
329       framebufferTexture2D(nullptr),
330       framebufferTexture3D(nullptr),
331       framebufferTextureLayer(nullptr),
332       genFramebuffers(nullptr),
333       genRenderbuffers(nullptr),
334       genVertexArrays(nullptr),
335       generateMipmap(nullptr),
336       getBooleani_v(nullptr),
337       getFragDataLocation(nullptr),
338       getFramebufferAttachmentParameteriv(nullptr),
339       getIntegeri_v(nullptr),
340       getRenderbufferParameteriv(nullptr),
341       getStringi(nullptr),
342       getTexParameterIiv(nullptr),
343       getTexParameterIuiv(nullptr),
344       getTransformFeedbackVarying(nullptr),
345       getUniformuiv(nullptr),
346       getVertexAttribIiv(nullptr),
347       getVertexAttribIuiv(nullptr),
348       isEnabledi(nullptr),
349       isFramebuffer(nullptr),
350       isRenderbuffer(nullptr),
351       isVertexArray(nullptr),
352       mapBufferRange(nullptr),
353       renderbufferStorage(nullptr),
354       renderbufferStorageMultisample(nullptr),
355       texParameterIiv(nullptr),
356       texParameterIuiv(nullptr),
357       transformFeedbackVaryings(nullptr),
358       uniform1ui(nullptr),
359       uniform1uiv(nullptr),
360       uniform2ui(nullptr),
361       uniform2uiv(nullptr),
362       uniform3ui(nullptr),
363       uniform3uiv(nullptr),
364       uniform4ui(nullptr),
365       uniform4uiv(nullptr),
366       vertexAttribI1i(nullptr),
367       vertexAttribI1iv(nullptr),
368       vertexAttribI1ui(nullptr),
369       vertexAttribI1uiv(nullptr),
370       vertexAttribI2i(nullptr),
371       vertexAttribI2iv(nullptr),
372       vertexAttribI2ui(nullptr),
373       vertexAttribI2uiv(nullptr),
374       vertexAttribI3i(nullptr),
375       vertexAttribI3iv(nullptr),
376       vertexAttribI3ui(nullptr),
377       vertexAttribI3uiv(nullptr),
378       vertexAttribI4bv(nullptr),
379       vertexAttribI4i(nullptr),
380       vertexAttribI4iv(nullptr),
381       vertexAttribI4sv(nullptr),
382       vertexAttribI4ubv(nullptr),
383       vertexAttribI4ui(nullptr),
384       vertexAttribI4uiv(nullptr),
385       vertexAttribI4usv(nullptr),
386       vertexAttribIPointer(nullptr),
387 
388       copyBufferSubData(nullptr),
389       drawArraysInstanced(nullptr),
390       drawElementsInstanced(nullptr),
391       getActiveUniformBlockName(nullptr),
392       getActiveUniformBlockiv(nullptr),
393       getActiveUniformName(nullptr),
394       getActiveUniformsiv(nullptr),
395       getUniformBlockIndex(nullptr),
396       getUniformIndices(nullptr),
397       primitiveRestartIndex(nullptr),
398       texBuffer(nullptr),
399       uniformBlockBinding(nullptr),
400 
401       clientWaitSync(nullptr),
402       deleteSync(nullptr),
403       drawElementsBaseVertex(nullptr),
404       drawElementsInstancedBaseVertex(nullptr),
405       drawRangeElementsBaseVertex(nullptr),
406       fenceSync(nullptr),
407       framebufferTexture(nullptr),
408       getBufferParameteri64v(nullptr),
409       getInteger64i_v(nullptr),
410       getInteger64v(nullptr),
411       getMultisamplefv(nullptr),
412       getSynciv(nullptr),
413       isSync(nullptr),
414       multiDrawElementsBaseVertex(nullptr),
415       provokingVertex(nullptr),
416       sampleMaski(nullptr),
417       texImage2DMultisample(nullptr),
418       texImage3DMultisample(nullptr),
419       waitSync(nullptr),
420 
421       matrixLoadEXT(nullptr),
422       genPathsNV(nullptr),
423       delPathsNV(nullptr),
424       pathCommandsNV(nullptr),
425       setPathParameterfNV(nullptr),
426       setPathParameteriNV(nullptr),
427       getPathParameterfNV(nullptr),
428       getPathParameteriNV(nullptr),
429       pathStencilFuncNV(nullptr),
430       stencilFillPathNV(nullptr),
431       stencilStrokePathNV(nullptr),
432       coverFillPathNV(nullptr),
433       coverStrokePathNV(nullptr),
434       stencilThenCoverFillPathNV(nullptr),
435       stencilThenCoverStrokePathNV(nullptr),
436       coverFillPathInstancedNV(nullptr),
437       coverStrokePathInstancedNV(nullptr),
438       stencilFillPathInstancedNV(nullptr),
439       stencilStrokePathInstancedNV(nullptr),
440       stencilThenCoverFillPathInstancedNV(nullptr),
441       stencilThenCoverStrokePathInstancedNV(nullptr),
442       programPathFragmentInputGenNV(nullptr),
443 
444       bindFragDataLocationIndexed(nullptr),
445       bindSampler(nullptr),
446       deleteSamplers(nullptr),
447       genSamplers(nullptr),
448       getFragDataIndex(nullptr),
449       getQueryObjecti64v(nullptr),
450       getQueryObjectui64v(nullptr),
451       getSamplerParameterIiv(nullptr),
452       getSamplerParameterIuiv(nullptr),
453       getSamplerParameterfv(nullptr),
454       getSamplerParameteriv(nullptr),
455       isSampler(nullptr),
456       queryCounter(nullptr),
457       samplerParameterIiv(nullptr),
458       samplerParameterIuiv(nullptr),
459       samplerParameterf(nullptr),
460       samplerParameterfv(nullptr),
461       samplerParameteri(nullptr),
462       samplerParameteriv(nullptr),
463       vertexAttribDivisor(nullptr),
464       vertexAttribP1ui(nullptr),
465       vertexAttribP1uiv(nullptr),
466       vertexAttribP2ui(nullptr),
467       vertexAttribP2uiv(nullptr),
468       vertexAttribP3ui(nullptr),
469       vertexAttribP3uiv(nullptr),
470       vertexAttribP4ui(nullptr),
471       vertexAttribP4uiv(nullptr),
472 
473       beginQueryIndexed(nullptr),
474       bindTransformFeedback(nullptr),
475       blendEquationSeparatei(nullptr),
476       blendEquationi(nullptr),
477       blendFuncSeparatei(nullptr),
478       blendFunci(nullptr),
479       deleteTransformFeedbacks(nullptr),
480       drawArraysIndirect(nullptr),
481       drawElementsIndirect(nullptr),
482       drawTransformFeedback(nullptr),
483       drawTransformFeedbackStream(nullptr),
484       endQueryIndexed(nullptr),
485       genTransformFeedbacks(nullptr),
486       getActiveSubroutineName(nullptr),
487       getActiveSubroutineUniformName(nullptr),
488       getActiveSubroutineUniformiv(nullptr),
489       getProgramStageiv(nullptr),
490       getQueryIndexediv(nullptr),
491       getSubroutineIndex(nullptr),
492       getSubroutineUniformLocation(nullptr),
493       getUniformSubroutineuiv(nullptr),
494       getUniformdv(nullptr),
495       isTransformFeedback(nullptr),
496       minSampleShading(nullptr),
497       patchParameterfv(nullptr),
498       patchParameteri(nullptr),
499       pauseTransformFeedback(nullptr),
500       resumeTransformFeedback(nullptr),
501       uniform1d(nullptr),
502       uniform1dv(nullptr),
503       uniform2d(nullptr),
504       uniform2dv(nullptr),
505       uniform3d(nullptr),
506       uniform3dv(nullptr),
507       uniform4d(nullptr),
508       uniform4dv(nullptr),
509       uniformMatrix2dv(nullptr),
510       uniformMatrix2x3dv(nullptr),
511       uniformMatrix2x4dv(nullptr),
512       uniformMatrix3dv(nullptr),
513       uniformMatrix3x2dv(nullptr),
514       uniformMatrix3x4dv(nullptr),
515       uniformMatrix4dv(nullptr),
516       uniformMatrix4x2dv(nullptr),
517       uniformMatrix4x3dv(nullptr),
518       uniformSubroutinesuiv(nullptr),
519 
520       activeShaderProgram(nullptr),
521       bindProgramPipeline(nullptr),
522       clearDepthf(nullptr),
523       createShaderProgramv(nullptr),
524       deleteProgramPipelines(nullptr),
525       depthRangeArrayv(nullptr),
526       depthRangeIndexed(nullptr),
527       depthRangef(nullptr),
528       genProgramPipelines(nullptr),
529       getDoublei_v(nullptr),
530       getFloati_v(nullptr),
531       getProgramBinary(nullptr),
532       getProgramPipelineInfoLog(nullptr),
533       getProgramPipelineiv(nullptr),
534       getShaderPrecisionFormat(nullptr),
535       getVertexAttribLdv(nullptr),
536       isProgramPipeline(nullptr),
537       programBinary(nullptr),
538       programParameteri(nullptr),
539       programUniform1d(nullptr),
540       programUniform1dv(nullptr),
541       programUniform1f(nullptr),
542       programUniform1fv(nullptr),
543       programUniform1i(nullptr),
544       programUniform1iv(nullptr),
545       programUniform1ui(nullptr),
546       programUniform1uiv(nullptr),
547       programUniform2d(nullptr),
548       programUniform2dv(nullptr),
549       programUniform2f(nullptr),
550       programUniform2fv(nullptr),
551       programUniform2i(nullptr),
552       programUniform2iv(nullptr),
553       programUniform2ui(nullptr),
554       programUniform2uiv(nullptr),
555       programUniform3d(nullptr),
556       programUniform3dv(nullptr),
557       programUniform3f(nullptr),
558       programUniform3fv(nullptr),
559       programUniform3i(nullptr),
560       programUniform3iv(nullptr),
561       programUniform3ui(nullptr),
562       programUniform3uiv(nullptr),
563       programUniform4d(nullptr),
564       programUniform4dv(nullptr),
565       programUniform4f(nullptr),
566       programUniform4fv(nullptr),
567       programUniform4i(nullptr),
568       programUniform4iv(nullptr),
569       programUniform4ui(nullptr),
570       programUniform4uiv(nullptr),
571       programUniformMatrix2dv(nullptr),
572       programUniformMatrix2fv(nullptr),
573       programUniformMatrix2x3dv(nullptr),
574       programUniformMatrix2x3fv(nullptr),
575       programUniformMatrix2x4dv(nullptr),
576       programUniformMatrix2x4fv(nullptr),
577       programUniformMatrix3dv(nullptr),
578       programUniformMatrix3fv(nullptr),
579       programUniformMatrix3x2dv(nullptr),
580       programUniformMatrix3x2fv(nullptr),
581       programUniformMatrix3x4dv(nullptr),
582       programUniformMatrix3x4fv(nullptr),
583       programUniformMatrix4dv(nullptr),
584       programUniformMatrix4fv(nullptr),
585       programUniformMatrix4x2dv(nullptr),
586       programUniformMatrix4x2fv(nullptr),
587       programUniformMatrix4x3dv(nullptr),
588       programUniformMatrix4x3fv(nullptr),
589       releaseShaderCompiler(nullptr),
590       scissorArrayv(nullptr),
591       scissorIndexed(nullptr),
592       scissorIndexedv(nullptr),
593       shaderBinary(nullptr),
594       useProgramStages(nullptr),
595       validateProgramPipeline(nullptr),
596       vertexAttribL1d(nullptr),
597       vertexAttribL1dv(nullptr),
598       vertexAttribL2d(nullptr),
599       vertexAttribL2dv(nullptr),
600       vertexAttribL3d(nullptr),
601       vertexAttribL3dv(nullptr),
602       vertexAttribL4d(nullptr),
603       vertexAttribL4dv(nullptr),
604       vertexAttribLPointer(nullptr),
605       viewportArrayv(nullptr),
606       viewportIndexedf(nullptr),
607       viewportIndexedfv(nullptr),
608 
609       bindImageTexture(nullptr),
610       drawArraysInstancedBaseInstance(nullptr),
611       drawElementsInstancedBaseInstance(nullptr),
612       drawElementsInstancedBaseVertexBaseInstance(nullptr),
613       drawTransformFeedbackInstanced(nullptr),
614       drawTransformFeedbackStreamInstanced(nullptr),
615       getActiveAtomicCounterBufferiv(nullptr),
616       getInternalformativ(nullptr),
617       memoryBarrier(nullptr),
618       texStorage1D(nullptr),
619       texStorage2D(nullptr),
620       texStorage3D(nullptr),
621 
622       bindVertexBuffer(nullptr),
623       clearBufferData(nullptr),
624       clearBufferSubData(nullptr),
625       copyImageSubData(nullptr),
626       debugMessageCallback(nullptr),
627       debugMessageControl(nullptr),
628       debugMessageInsert(nullptr),
629       dispatchCompute(nullptr),
630       dispatchComputeIndirect(nullptr),
631       framebufferParameteri(nullptr),
632       getDebugMessageLog(nullptr),
633       getFramebufferParameteriv(nullptr),
634       getInternalformati64v(nullptr),
635       getPointerv(nullptr),
636       getObjectLabel(nullptr),
637       getObjectPtrLabel(nullptr),
638       getProgramInterfaceiv(nullptr),
639       getProgramResourceIndex(nullptr),
640       getProgramResourceLocation(nullptr),
641       getProgramResourceLocationIndex(nullptr),
642       getProgramResourceName(nullptr),
643       getProgramResourceiv(nullptr),
644       invalidateBufferData(nullptr),
645       invalidateBufferSubData(nullptr),
646       invalidateFramebuffer(nullptr),
647       invalidateSubFramebuffer(nullptr),
648       invalidateTexImage(nullptr),
649       invalidateTexSubImage(nullptr),
650       multiDrawArraysIndirect(nullptr),
651       multiDrawElementsIndirect(nullptr),
652       objectLabel(nullptr),
653       objectPtrLabel(nullptr),
654       popDebugGroup(nullptr),
655       pushDebugGroup(nullptr),
656       shaderStorageBlockBinding(nullptr),
657       texBufferRange(nullptr),
658       texStorage2DMultisample(nullptr),
659       texStorage3DMultisample(nullptr),
660       textureView(nullptr),
661       vertexAttribBinding(nullptr),
662       vertexAttribFormat(nullptr),
663       vertexAttribIFormat(nullptr),
664       vertexAttribLFormat(nullptr),
665       vertexBindingDivisor(nullptr),
666       coverageModulationNV(nullptr),
667 
668       bindBuffersBase(nullptr),
669       bindBuffersRange(nullptr),
670       bindImageTextures(nullptr),
671       bindSamplers(nullptr),
672       bindTextures(nullptr),
673       bindVertexBuffers(nullptr),
674       bufferStorage(nullptr),
675       clearTexImage(nullptr),
676       clearTexSubImage(nullptr),
677 
678       bindTextureUnit(nullptr),
679       blitNamedFramebuffer(nullptr),
680       checkNamedFramebufferStatus(nullptr),
681       clearNamedBufferData(nullptr),
682       clearNamedBufferSubData(nullptr),
683       clearNamedFramebufferfi(nullptr),
684       clearNamedFramebufferfv(nullptr),
685       clearNamedFramebufferiv(nullptr),
686       clearNamedFramebufferuiv(nullptr),
687       clipControl(nullptr),
688       compressedTextureSubImage1D(nullptr),
689       compressedTextureSubImage2D(nullptr),
690       compressedTextureSubImage3D(nullptr),
691       copyNamedBufferSubData(nullptr),
692       copyTextureSubImage1D(nullptr),
693       copyTextureSubImage2D(nullptr),
694       copyTextureSubImage3D(nullptr),
695       createBuffers(nullptr),
696       createFramebuffers(nullptr),
697       createProgramPipelines(nullptr),
698       createQueries(nullptr),
699       createRenderbuffers(nullptr),
700       createSamplers(nullptr),
701       createTextures(nullptr),
702       createTransformFeedbacks(nullptr),
703       createVertexArrays(nullptr),
704       disableVertexArrayAttrib(nullptr),
705       enableVertexArrayAttrib(nullptr),
706       flushMappedNamedBufferRange(nullptr),
707       generateTextureMipmap(nullptr),
708       getCompressedTextureImage(nullptr),
709       getCompressedTextureSubImage(nullptr),
710       getGraphicsResetStatus(nullptr),
711       getNamedBufferParameteri64v(nullptr),
712       getNamedBufferParameteriv(nullptr),
713       getNamedBufferPointerv(nullptr),
714       getNamedBufferSubData(nullptr),
715       getNamedFramebufferAttachmentParameteriv(nullptr),
716       getNamedFramebufferParameteriv(nullptr),
717       getNamedRenderbufferParameteriv(nullptr),
718       getQueryBufferObjecti64v(nullptr),
719       getQueryBufferObjectiv(nullptr),
720       getQueryBufferObjectui64v(nullptr),
721       getQueryBufferObjectuiv(nullptr),
722       getTextureImage(nullptr),
723       getTextureLevelParameterfv(nullptr),
724       getTextureLevelParameteriv(nullptr),
725       getTextureParameterIiv(nullptr),
726       getTextureParameterIuiv(nullptr),
727       getTextureParameterfv(nullptr),
728       getTextureParameteriv(nullptr),
729       getTextureSubImage(nullptr),
730       getTransformFeedbacki64_v(nullptr),
731       getTransformFeedbacki_v(nullptr),
732       getTransformFeedbackiv(nullptr),
733       getVertexArrayIndexed64iv(nullptr),
734       getVertexArrayIndexediv(nullptr),
735       getVertexArrayiv(nullptr),
736       getnCompressedTexImage(nullptr),
737       getnTexImage(nullptr),
738       getnUniformdv(nullptr),
739       getnUniformfv(nullptr),
740       getnUniformiv(nullptr),
741       getnUniformuiv(nullptr),
742       invalidateNamedFramebufferData(nullptr),
743       invalidateNamedFramebufferSubData(nullptr),
744       mapNamedBuffer(nullptr),
745       mapNamedBufferRange(nullptr),
746       memoryBarrierByRegion(nullptr),
747       namedBufferData(nullptr),
748       namedBufferStorage(nullptr),
749       namedBufferSubData(nullptr),
750       namedFramebufferDrawBuffer(nullptr),
751       namedFramebufferDrawBuffers(nullptr),
752       namedFramebufferParameteri(nullptr),
753       namedFramebufferReadBuffer(nullptr),
754       namedFramebufferRenderbuffer(nullptr),
755       namedFramebufferTexture(nullptr),
756       namedFramebufferTextureLayer(nullptr),
757       namedRenderbufferStorage(nullptr),
758       namedRenderbufferStorageMultisample(nullptr),
759       readnPixels(nullptr),
760       textureBarrier(nullptr),
761       textureBuffer(nullptr),
762       textureBufferRange(nullptr),
763       textureParameterIiv(nullptr),
764       textureParameterIuiv(nullptr),
765       textureParameterf(nullptr),
766       textureParameterfv(nullptr),
767       textureParameteri(nullptr),
768       textureParameteriv(nullptr),
769       textureStorage1D(nullptr),
770       textureStorage2D(nullptr),
771       textureStorage2DMultisample(nullptr),
772       textureStorage3D(nullptr),
773       textureStorage3DMultisample(nullptr),
774       textureSubImage1D(nullptr),
775       textureSubImage2D(nullptr),
776       textureSubImage3D(nullptr),
777       transformFeedbackBufferBase(nullptr),
778       transformFeedbackBufferRange(nullptr),
779       unmapNamedBuffer(nullptr),
780       vertexArrayAttribBinding(nullptr),
781       vertexArrayAttribFormat(nullptr),
782       vertexArrayAttribIFormat(nullptr),
783       vertexArrayAttribLFormat(nullptr),
784       vertexArrayBindingDivisor(nullptr),
785       vertexArrayElementBuffer(nullptr),
786       vertexArrayVertexBuffer(nullptr),
787       vertexArrayVertexBuffers(nullptr),
788       blendBarrier(nullptr),
789       primitiveBoundingBox(nullptr),
790       eglImageTargetRenderbufferStorageOES(nullptr),
791       eglImageTargetTexture2DOES(nullptr)
792 {
793 }
794 
~FunctionsGL()795 FunctionsGL::~FunctionsGL()
796 {
797 }
798 
initialize()799 void FunctionsGL::initialize()
800 {
801     // Grab the version number
802     AssignGLEntryPoint(loadProcAddress("glGetString"), &getString);
803     AssignGLEntryPoint(loadProcAddress("glGetIntegerv"), &getIntegerv);
804     GetGLVersion(getString, &version, &standard);
805 
806     // Grab the GL extensions
807     if (isAtLeastGL(gl::Version(3, 0)) || isAtLeastGLES(gl::Version(3, 0)))
808     {
809         AssignGLEntryPoint(loadProcAddress("glGetStringi"), &getStringi);
810         extensions = GetIndexedExtensions(getIntegerv, getStringi);
811     }
812     else
813     {
814         const char *exts = reinterpret_cast<const char*>(getString(GL_EXTENSIONS));
815         angle::SplitStringAlongWhitespace(std::string(exts), &extensions);
816     }
817 
818     // Load the entry points
819     switch (standard)
820     {
821         case STANDARD_GL_DESKTOP:
822             initializeProcsDesktopGL();
823             break;
824 
825         case STANDARD_GL_ES:
826             initializeProcsGLES();
827             break;
828 
829         default:
830             UNREACHABLE();
831             break;
832     }
833 }
834 
initializeProcsDesktopGL()835 void FunctionsGL::initializeProcsDesktopGL()
836 {
837     // Check the context profile
838     profile = 0;
839     if (isAtLeastGL(gl::Version(3, 2)))
840     {
841         getIntegerv(GL_CONTEXT_PROFILE_MASK, &profile);
842     }
843 
844     // clang-format off
845 
846     // Load extensions
847     // Even though extensions are written against specific versions of GL, many drivers expose the extensions
848     // in even older versions.  Always try loading the extensions regardless of GL version.
849 
850     // GL_ARB_program_interface_query (loading only functions relevant to GL_NV_path_rendering here)
851     AssignGLExtensionEntryPoint(extensions, "GL_ARB_program_interface_query", loadProcAddress("glGetProgramInterfaceiv"), &getProgramInterfaceiv);
852     AssignGLExtensionEntryPoint(extensions, "GL_ARB_program_interface_query", loadProcAddress("glGetProgramResourceName"), &getProgramResourceName);
853     AssignGLExtensionEntryPoint(extensions, "GL_ARB_program_interface_query", loadProcAddress("glGetProgramResourceiv"), &getProgramResourceiv);
854 
855     // GL_NV_path_rendering
856     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glMatrixLoadfEXT"), &matrixLoadEXT);
857     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glGenPathsNV"), &genPathsNV);
858     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glDeletePathsNV"), &delPathsNV);
859     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glPathCommandsNV"), &pathCommandsNV);
860     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glIsPathNV"), &isPathNV);
861     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glPathParameterfNV"), &setPathParameterfNV);
862     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glPathParameteriNV"), &setPathParameteriNV);
863     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glGetPathParameterfvNV"), &getPathParameterfNV);
864     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glGetPathParameterivNV"), &getPathParameteriNV);
865     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glPathStencilFuncNV"), &pathStencilFuncNV);
866     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glStencilFillPathNV"), &stencilFillPathNV);
867     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glStencilStrokePathNV"), &stencilStrokePathNV);
868     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glCoverFillPathNV"), &coverFillPathNV);
869     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glCoverStrokePathNV"), &coverStrokePathNV);
870     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glStencilThenCoverFillPathNV"), &stencilThenCoverFillPathNV);
871     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glStencilThenCoverStrokePathNV"), &stencilThenCoverStrokePathNV);
872     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glCoverFillPathInstancedNV"), &coverFillPathInstancedNV);
873     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glCoverStrokePathInstancedNV"), &coverStrokePathInstancedNV);
874     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glStencilFillPathInstancedNV"), &stencilFillPathInstancedNV);
875     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glStencilStrokePathInstancedNV"), &stencilStrokePathInstancedNV);
876     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glStencilThenCoverFillPathInstancedNV"), &stencilThenCoverFillPathInstancedNV);
877     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glStencilThenCoverStrokePathInstancedNV"), &stencilThenCoverStrokePathInstancedNV);
878     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glProgramPathFragmentInputGenNV"), &programPathFragmentInputGenNV);
879 
880     // GL_NV_framebuffer_mixed_samples
881     AssignGLExtensionEntryPoint(extensions, "GL_NV_framebuffer_mixed_samples", loadProcAddress("glCoverageModulationNV"), &coverageModulationNV);
882 
883     // GL_NV_fence
884     AssignGLExtensionEntryPoint(extensions, "GL_NV_fence", loadProcAddress("glDeleteFencesNV"), &deleteFencesNV);
885     AssignGLExtensionEntryPoint(extensions, "GL_NV_fence", loadProcAddress("glGenFencesNV"), &genFencesNV);
886     AssignGLExtensionEntryPoint(extensions, "GL_NV_fence", loadProcAddress("glIsFenceNV"), &isFenceNV);
887     AssignGLExtensionEntryPoint(extensions, "GL_NV_fence", loadProcAddress("glTestFenceNV"), &testFenceNV);
888     AssignGLExtensionEntryPoint(extensions, "GL_NV_fence", loadProcAddress("glGetFenceivNV"), &getFenceivNV);
889     AssignGLExtensionEntryPoint(extensions, "GL_NV_fence", loadProcAddress("glFinishFenceNV"), &finishFenceNV);
890     AssignGLExtensionEntryPoint(extensions, "GL_NV_fence", loadProcAddress("glSetFenceNV"), &setFenceNV);
891 
892     // GL_EXT_texture_storage
893     AssignGLExtensionEntryPoint(extensions, "GL_EXT_texture_storage", loadProcAddress("glTexStorage1DEXT"), &texStorage1D);
894     AssignGLExtensionEntryPoint(extensions, "GL_EXT_texture_storage", loadProcAddress("glTexStorage2DEXT"), &texStorage2D);
895     AssignGLExtensionEntryPoint(extensions, "GL_EXT_texture_storage GL_EXT_texture3D", loadProcAddress("glTexStorage3DEXT"), &texStorage3D);
896     AssignGLExtensionEntryPoint(extensions, "GL_EXT_texture_storage GL_EXT_direct_state_access", loadProcAddress("glTextureStorage1DEXT"), &textureStorage1D);
897     AssignGLExtensionEntryPoint(extensions, "GL_EXT_texture_storage GL_EXT_direct_state_access", loadProcAddress("glTextureStorage2DEXT"), &textureStorage2D);
898     AssignGLExtensionEntryPoint(extensions, "GL_EXT_texture_storage GL_EXT_direct_state_access GL_EXT_texture3D", loadProcAddress("glTextureStorage3DEXT"), &textureStorage3D);
899 
900     // GL_ARB_vertex_array_object
901     AssignGLExtensionEntryPoint(extensions, "GL_ARB_vertex_array_object", loadProcAddress("glBindVertexArray"), &bindVertexArray);
902     AssignGLExtensionEntryPoint(extensions, "GL_ARB_vertex_array_object", loadProcAddress("glDeleteVertexArrays"), &deleteVertexArrays);
903     AssignGLExtensionEntryPoint(extensions, "GL_ARB_vertex_array_object", loadProcAddress("glGenVertexArrays"), &genVertexArrays);
904     AssignGLExtensionEntryPoint(extensions, "GL_ARB_vertex_array_object", loadProcAddress("glIsVertexArray"), &isVertexArray);
905 
906     // GL_ARB_sync
907     AssignGLExtensionEntryPoint(extensions, "GL_ARB_sync", loadProcAddress("glClientWaitSync"), &clientWaitSync);
908     AssignGLExtensionEntryPoint(extensions, "GL_ARB_sync", loadProcAddress("glDeleteSync"), &deleteSync);
909     AssignGLExtensionEntryPoint(extensions, "GL_ARB_sync", loadProcAddress("glFenceSync"), &fenceSync);
910     AssignGLExtensionEntryPoint(extensions, "GL_ARB_sync", loadProcAddress("glGetInteger64i_v"), &getInteger64i_v);
911     AssignGLExtensionEntryPoint(extensions, "GL_ARB_sync", loadProcAddress("glGetInteger64v"), &getInteger64v);
912     AssignGLExtensionEntryPoint(extensions, "GL_ARB_sync", loadProcAddress("glGetSynciv"), &getSynciv);
913     AssignGLExtensionEntryPoint(extensions, "GL_ARB_sync", loadProcAddress("glIsSync"), &isSync);
914     AssignGLExtensionEntryPoint(extensions, "GL_ARB_sync", loadProcAddress("glWaitSync"), &waitSync);
915 
916     // GL_EXT_framebuffer_object
917     AssignGLExtensionEntryPoint(extensions, "GL_EXT_framebuffer_object", loadProcAddress("glIsRenderbufferEXT"), &isRenderbuffer);
918     AssignGLExtensionEntryPoint(extensions, "GL_EXT_framebuffer_object", loadProcAddress("glBindRenderbufferEXT"), &bindRenderbuffer);
919     AssignGLExtensionEntryPoint(extensions, "GL_EXT_framebuffer_object", loadProcAddress("glDeleteRenderbuffersEXT"), &deleteRenderbuffers);
920     AssignGLExtensionEntryPoint(extensions, "GL_EXT_framebuffer_object", loadProcAddress("glGenRenderbuffersEXT"), &genRenderbuffers);
921     AssignGLExtensionEntryPoint(extensions, "GL_EXT_framebuffer_object", loadProcAddress("glRenderbufferStorageEXT"), &renderbufferStorage);
922     AssignGLExtensionEntryPoint(extensions, "GL_EXT_framebuffer_object", loadProcAddress("glGetRenderbufferParameterivEXT"), &getRenderbufferParameteriv);
923     AssignGLExtensionEntryPoint(extensions, "GL_EXT_framebuffer_object", loadProcAddress("glIsFramebufferEXT"), &isFramebuffer);
924     AssignGLExtensionEntryPoint(extensions, "GL_EXT_framebuffer_object", loadProcAddress("glBindFramebufferEXT"), &bindFramebuffer);
925     AssignGLExtensionEntryPoint(extensions, "GL_EXT_framebuffer_object", loadProcAddress("glDeleteFramebuffersEXT"), &deleteFramebuffers);
926     AssignGLExtensionEntryPoint(extensions, "GL_EXT_framebuffer_object", loadProcAddress("glGenFramebuffersEXT"), &genFramebuffers);
927     AssignGLExtensionEntryPoint(extensions, "GL_EXT_framebuffer_object", loadProcAddress("glCheckFramebufferStatusEXT"), &checkFramebufferStatus);
928     AssignGLExtensionEntryPoint(extensions, "GL_EXT_framebuffer_object", loadProcAddress("glFramebufferTexture1DEXT"), &framebufferTexture1D);
929     AssignGLExtensionEntryPoint(extensions, "GL_EXT_framebuffer_object", loadProcAddress("glFramebufferTexture2DEXT"), &framebufferTexture2D);
930     AssignGLExtensionEntryPoint(extensions, "GL_EXT_framebuffer_object", loadProcAddress("glFramebufferTexture3DEXT"), &framebufferTexture3D);
931     AssignGLExtensionEntryPoint(extensions, "GL_EXT_framebuffer_object", loadProcAddress("glFramebufferRenderbufferEXT"), &framebufferRenderbuffer);
932     AssignGLExtensionEntryPoint(extensions, "GL_EXT_framebuffer_object", loadProcAddress("glGetFramebufferAttachmentParameterivEXT"), &getFramebufferAttachmentParameteriv);
933     AssignGLExtensionEntryPoint(extensions, "GL_EXT_framebuffer_object", loadProcAddress("glGenerateMipmapEXT"), &generateMipmap);
934 
935     // GL_EXT_framebuffer_blit
936     AssignGLExtensionEntryPoint(extensions, "GL_EXT_framebuffer_blit", loadProcAddress("glBlitFramebufferEXT"), &blitFramebuffer);
937 
938     // GL_KHR_debug
939     AssignGLExtensionEntryPoint(extensions, "GL_KHR_debug", loadProcAddress("glDebugMessageControl"), &debugMessageControl);
940     AssignGLExtensionEntryPoint(extensions, "GL_KHR_debug", loadProcAddress("glDebugMessageInsert"), &debugMessageInsert);
941     AssignGLExtensionEntryPoint(extensions, "GL_KHR_debug", loadProcAddress("glDebugMessageCallback"), &debugMessageCallback);
942     AssignGLExtensionEntryPoint(extensions, "GL_KHR_debug", loadProcAddress("glGetDebugMessageLog"), &getDebugMessageLog);
943     AssignGLExtensionEntryPoint(extensions, "GL_KHR_debug", loadProcAddress("glGetPointerv"), &getPointerv);
944     AssignGLExtensionEntryPoint(extensions, "GL_KHR_debug", loadProcAddress("glPushDebugGroup"), &pushDebugGroup);
945     AssignGLExtensionEntryPoint(extensions, "GL_KHR_debug", loadProcAddress("glPopDebugGroup"), &popDebugGroup);
946     AssignGLExtensionEntryPoint(extensions, "GL_KHR_debug", loadProcAddress("glObjectLabel"), &objectLabel);
947     AssignGLExtensionEntryPoint(extensions, "GL_KHR_debug", loadProcAddress("glGetObjectLabel"), &getObjectLabel);
948     AssignGLExtensionEntryPoint(extensions, "GL_KHR_debug", loadProcAddress("glObjectPtrLabel"), &objectPtrLabel);
949     AssignGLExtensionEntryPoint(extensions, "GL_KHR_debug", loadProcAddress("glGetObjectPtrLabel"), &getObjectPtrLabel);
950 
951     // GL_ARB_internalformat_query
952     AssignGLExtensionEntryPoint(extensions, "GL_ARB_internalformat_query", loadProcAddress("glGetInternalformativ"), &getInternalformativ);
953 
954     // GL_ARB_ES2_compatibility
955     AssignGLExtensionEntryPoint(extensions, "GL_ARB_ES2_compatibility", loadProcAddress("glReleaseShaderCompiler"), &releaseShaderCompiler);
956     AssignGLExtensionEntryPoint(extensions, "GL_ARB_ES2_compatibility", loadProcAddress("glShaderBinary"), &shaderBinary);
957     AssignGLExtensionEntryPoint(extensions, "GL_ARB_ES2_compatibility", loadProcAddress("glGetShaderPrecisionFormat"), &getShaderPrecisionFormat);
958     AssignGLExtensionEntryPoint(extensions, "GL_ARB_ES2_compatibility", loadProcAddress("glDepthRangef"), &depthRangef);
959     AssignGLExtensionEntryPoint(extensions, "GL_ARB_ES2_compatibility", loadProcAddress("glClearDepthf"), &clearDepthf);
960 
961     // GL_ARB_instanced_arrays
962     AssignGLExtensionEntryPoint(extensions, "GL_ARB_instanced_arrays", loadProcAddress("glVertexAttribDivisorARB"), &vertexAttribDivisor);
963 
964     // GL_EXT_draw_instanced
965     AssignGLExtensionEntryPoint(extensions, "GL_EXT_draw_instanced", loadProcAddress("glDrawArraysInstancedEXT"), &drawArraysInstanced);
966     AssignGLExtensionEntryPoint(extensions, "GL_EXT_draw_instanced", loadProcAddress("glDrawElementsInstancedEXT"), &drawElementsInstanced);
967 
968     // GL_ARB_draw_instanced
969     AssignGLExtensionEntryPoint(extensions, "GL_ARB_draw_instanced", loadProcAddress("glDrawArraysInstancedARB"), &drawArraysInstanced);
970     AssignGLExtensionEntryPoint(extensions, "GL_ARB_draw_instanced", loadProcAddress("glDrawElementsInstancedARB"), &drawElementsInstanced);
971 
972     // GL_ARB_sampler_objects
973     AssignGLExtensionEntryPoint(extensions, "GL_ARB_sampler_objects", loadProcAddress("glGenSamplers"), &genSamplers);
974     AssignGLExtensionEntryPoint(extensions, "GL_ARB_sampler_objects", loadProcAddress("glDeleteSamplers"), &deleteSamplers);
975     AssignGLExtensionEntryPoint(extensions, "GL_ARB_sampler_objects", loadProcAddress("glIsSampler"), &isSampler);
976     AssignGLExtensionEntryPoint(extensions, "GL_ARB_sampler_objects", loadProcAddress("glBindSampler"), &bindSampler);
977     AssignGLExtensionEntryPoint(extensions, "GL_ARB_sampler_objects", loadProcAddress("glSamplerParameteri"), &samplerParameteri);
978     AssignGLExtensionEntryPoint(extensions, "GL_ARB_sampler_objects", loadProcAddress("glSamplerParameterf"), &samplerParameterf);
979     AssignGLExtensionEntryPoint(extensions, "GL_ARB_sampler_objects", loadProcAddress("glSamplerParameteriv"), &samplerParameteriv);
980     AssignGLExtensionEntryPoint(extensions, "GL_ARB_sampler_objects", loadProcAddress("glSamplerParameterfv"), &samplerParameterfv);
981     AssignGLExtensionEntryPoint(extensions, "GL_ARB_sampler_objects", loadProcAddress("glSamplerParameterIiv"), &samplerParameterIiv);
982     AssignGLExtensionEntryPoint(extensions, "GL_ARB_sampler_objects", loadProcAddress("glSamplerParameterIuiv"), &samplerParameterIuiv);
983     AssignGLExtensionEntryPoint(extensions, "GL_ARB_sampler_objects", loadProcAddress("glGetSamplerParameteriv"), &getSamplerParameteriv);
984     AssignGLExtensionEntryPoint(extensions, "GL_ARB_sampler_objects", loadProcAddress("glGetSamplerParameterfv"), &getSamplerParameterfv);
985     AssignGLExtensionEntryPoint(extensions, "GL_ARB_sampler_objects", loadProcAddress("glGetSamplerParameterIiv"), &getSamplerParameterIiv);
986     AssignGLExtensionEntryPoint(extensions, "GL_ARB_sampler_objects", loadProcAddress("glGetSamplerParameterIuiv"), &getSamplerParameterIuiv);
987 
988     // GL_ARB_occlusion_query
989     AssignGLExtensionEntryPoint(extensions, "GL_ARB_occlusion_query", loadProcAddress("glGenQueriesARB"), &genQueries);
990     AssignGLExtensionEntryPoint(extensions, "GL_ARB_occlusion_query", loadProcAddress("glDeleteQueriesARB"), &deleteQueries);
991     AssignGLExtensionEntryPoint(extensions, "GL_ARB_occlusion_query", loadProcAddress("glIsQueryARB"), &isQuery);
992     AssignGLExtensionEntryPoint(extensions, "GL_ARB_occlusion_query", loadProcAddress("glBeginQueryARB"), &beginQuery);
993     AssignGLExtensionEntryPoint(extensions, "GL_ARB_occlusion_query", loadProcAddress("glEndQueryARB"), &endQuery);
994     AssignGLExtensionEntryPoint(extensions, "GL_ARB_occlusion_query", loadProcAddress("glGetQueryivARB"), &getQueryiv);
995     AssignGLExtensionEntryPoint(extensions, "GL_ARB_occlusion_query", loadProcAddress("glGetQueryObjectivARB"), &getQueryObjectiv);
996     AssignGLExtensionEntryPoint(extensions, "GL_ARB_occlusion_query", loadProcAddress("glGetQueryObjectuivARB"), &getQueryObjectuiv);
997 
998     // EXT_transform_feedback
999     AssignGLExtensionEntryPoint(extensions, "EXT_transform_feedback", loadProcAddress("glBindBufferRangeEXT"), &bindBufferRange);
1000     AssignGLExtensionEntryPoint(extensions, "EXT_transform_feedback", loadProcAddress("glBindBufferBaseEXT"), &bindBufferBase);
1001     AssignGLExtensionEntryPoint(extensions, "EXT_transform_feedback", loadProcAddress("glBeginTransformFeedbackEXT"), &beginTransformFeedback);
1002     AssignGLExtensionEntryPoint(extensions, "EXT_transform_feedback", loadProcAddress("glEndTransformFeedbackEXT"), &endTransformFeedback);
1003     AssignGLExtensionEntryPoint(extensions, "EXT_transform_feedback", loadProcAddress("glTransformFeedbackVaryingsEXT"), &transformFeedbackVaryings);
1004     AssignGLExtensionEntryPoint(extensions, "EXT_transform_feedback", loadProcAddress("glGetTransformFeedbackVaryingEXT"), &getTransformFeedbackVarying);
1005 
1006     // GL_ARB_transform_feedback2
1007     AssignGLExtensionEntryPoint(extensions, "GL_ARB_transform_feedback2", loadProcAddress("glBindTransformFeedback"), &bindTransformFeedback);
1008     AssignGLExtensionEntryPoint(extensions, "GL_ARB_transform_feedback2", loadProcAddress("glDeleteTransformFeedbacks"), &deleteTransformFeedbacks);
1009     AssignGLExtensionEntryPoint(extensions, "GL_ARB_transform_feedback2", loadProcAddress("glGenTransformFeedbacks"), &genTransformFeedbacks);
1010     AssignGLExtensionEntryPoint(extensions, "GL_ARB_transform_feedback2", loadProcAddress("glIsTransformFeedback"), &isTransformFeedback);
1011     AssignGLExtensionEntryPoint(extensions, "GL_ARB_transform_feedback2", loadProcAddress("glPauseTransformFeedback"), &pauseTransformFeedback);
1012     AssignGLExtensionEntryPoint(extensions, "GL_ARB_transform_feedback2", loadProcAddress("glResumeTransformFeedback"), &resumeTransformFeedback);
1013     AssignGLExtensionEntryPoint(extensions, "GL_ARB_transform_feedback2", loadProcAddress("glDrawTransformFeedback"), &drawTransformFeedback);
1014 
1015     // GL_ARB_transform_feedback3
1016     AssignGLExtensionEntryPoint(extensions, "GL_ARB_transform_feedback3", loadProcAddress("glDrawTransformFeedbackStream"), &drawTransformFeedbackStream);
1017     AssignGLExtensionEntryPoint(extensions, "GL_ARB_transform_feedback3", loadProcAddress("glBeginQueryIndexed"), &beginQueryIndexed);
1018     AssignGLExtensionEntryPoint(extensions, "GL_ARB_transform_feedback3", loadProcAddress("glEndQueryIndexed"), &endQueryIndexed);
1019     AssignGLExtensionEntryPoint(extensions, "GL_ARB_transform_feedback3", loadProcAddress("glGetQueryIndexediv"), &getQueryIndexediv);
1020 
1021     // GL_ARB_get_program_binary
1022     AssignGLExtensionEntryPoint(extensions, "GL_ARB_get_program_binary", loadProcAddress("glGetProgramBinary"), &getProgramBinary);
1023     AssignGLExtensionEntryPoint(extensions, "GL_ARB_get_program_binary", loadProcAddress("glProgramBinary"), &programBinary);
1024     AssignGLExtensionEntryPoint(extensions, "GL_ARB_get_program_binary", loadProcAddress("glProgramParameteri"), &programParameteri);
1025 
1026     // GL_ARB_robustness
1027     AssignGLExtensionEntryPoint(extensions, "GL_ARB_robustness", loadProcAddress("glGetGraphicsResetStatusARB"), &getGraphicsResetStatus);
1028 
1029     // GL_KHR_robustness
1030     AssignGLExtensionEntryPoint(extensions, "GL_KHR_robustness", loadProcAddress("glGetGraphicsResetStatus"), &getGraphicsResetStatus);
1031 
1032     // 1.0
1033     if (isAtLeastGL(gl::Version(1, 0)))
1034     {
1035         AssignGLEntryPoint(loadProcAddress("glBlendFunc"), &blendFunc);
1036         AssignGLEntryPoint(loadProcAddress("glClear"), &clear);
1037         AssignGLEntryPoint(loadProcAddress("glClearColor"), &clearColor);
1038         AssignGLEntryPoint(loadProcAddress("glClearDepth"), &clearDepth);
1039         AssignGLEntryPoint(loadProcAddress("glClearStencil"), &clearStencil);
1040         AssignGLEntryPoint(loadProcAddress("glColorMask"), &colorMask);
1041         AssignGLEntryPoint(loadProcAddress("glCullFace"), &cullFace);
1042         AssignGLEntryPoint(loadProcAddress("glDepthFunc"), &depthFunc);
1043         AssignGLEntryPoint(loadProcAddress("glDepthMask"), &depthMask);
1044         AssignGLEntryPoint(loadProcAddress("glDepthRange"), &depthRange);
1045         AssignGLEntryPoint(loadProcAddress("glDisable"), &disable);
1046         AssignGLEntryPoint(loadProcAddress("glDrawBuffer"), &drawBuffer);
1047         AssignGLEntryPoint(loadProcAddress("glEnable"), &enable);
1048         AssignGLEntryPoint(loadProcAddress("glFinish"), &finish);
1049         AssignGLEntryPoint(loadProcAddress("glFlush"), &flush);
1050         AssignGLEntryPoint(loadProcAddress("glFrontFace"), &frontFace);
1051         AssignGLEntryPoint(loadProcAddress("glGetBooleanv"), &getBooleanv);
1052         AssignGLEntryPoint(loadProcAddress("glGetDoublev"), &getDoublev);
1053         AssignGLEntryPoint(loadProcAddress("glGetError"), &getError);
1054         AssignGLEntryPoint(loadProcAddress("glGetFloatv"), &getFloatv);
1055         AssignGLEntryPoint(loadProcAddress("glGetIntegerv"), &getIntegerv);
1056         AssignGLEntryPoint(loadProcAddress("glGetString"), &getString);
1057         AssignGLEntryPoint(loadProcAddress("glGetTexImage"), &getTexImage);
1058         AssignGLEntryPoint(loadProcAddress("glGetTexLevelParameterfv"), &getTexLevelParameterfv);
1059         AssignGLEntryPoint(loadProcAddress("glGetTexLevelParameteriv"), &getTexLevelParameteriv);
1060         AssignGLEntryPoint(loadProcAddress("glGetTexParameterfv"), &getTexParameterfv);
1061         AssignGLEntryPoint(loadProcAddress("glGetTexParameteriv"), &getTexParameteriv);
1062         AssignGLEntryPoint(loadProcAddress("glHint"), &hint);
1063         AssignGLEntryPoint(loadProcAddress("glIsEnabled"), &isEnabled);
1064         AssignGLEntryPoint(loadProcAddress("glLineWidth"), &lineWidth);
1065         AssignGLEntryPoint(loadProcAddress("glLogicOp"), &logicOp);
1066         AssignGLEntryPoint(loadProcAddress("glPixelStoref"), &pixelStoref);
1067         AssignGLEntryPoint(loadProcAddress("glPixelStorei"), &pixelStorei);
1068         AssignGLEntryPoint(loadProcAddress("glPointSize"), &pointSize);
1069         AssignGLEntryPoint(loadProcAddress("glPolygonMode"), &polygonMode);
1070         AssignGLEntryPoint(loadProcAddress("glReadBuffer"), &readBuffer);
1071         AssignGLEntryPoint(loadProcAddress("glReadPixels"), &readPixels);
1072         AssignGLEntryPoint(loadProcAddress("glScissor"), &scissor);
1073         AssignGLEntryPoint(loadProcAddress("glStencilFunc"), &stencilFunc);
1074         AssignGLEntryPoint(loadProcAddress("glStencilMask"), &stencilMask);
1075         AssignGLEntryPoint(loadProcAddress("glStencilOp"), &stencilOp);
1076         AssignGLEntryPoint(loadProcAddress("glTexImage1D"), &texImage1D);
1077         AssignGLEntryPoint(loadProcAddress("glTexImage2D"), &texImage2D);
1078         AssignGLEntryPoint(loadProcAddress("glTexParameterf"), &texParameterf);
1079         AssignGLEntryPoint(loadProcAddress("glTexParameterfv"), &texParameterfv);
1080         AssignGLEntryPoint(loadProcAddress("glTexParameteri"), &texParameteri);
1081         AssignGLEntryPoint(loadProcAddress("glTexParameteriv"), &texParameteriv);
1082         AssignGLEntryPoint(loadProcAddress("glViewport"), &viewport);
1083     }
1084 
1085     // 1.1
1086     if (isAtLeastGL(gl::Version(1, 1)))
1087     {
1088         AssignGLEntryPoint(loadProcAddress("glBindTexture"), &bindTexture);
1089         AssignGLEntryPoint(loadProcAddress("glCopyTexImage1D"), &copyTexImage1D);
1090         AssignGLEntryPoint(loadProcAddress("glCopyTexImage2D"), &copyTexImage2D);
1091         AssignGLEntryPoint(loadProcAddress("glCopyTexSubImage1D"), &copyTexSubImage1D);
1092         AssignGLEntryPoint(loadProcAddress("glCopyTexSubImage2D"), &copyTexSubImage2D);
1093         AssignGLEntryPoint(loadProcAddress("glDeleteTextures"), &deleteTextures);
1094         AssignGLEntryPoint(loadProcAddress("glDrawArrays"), &drawArrays);
1095         AssignGLEntryPoint(loadProcAddress("glDrawElements"), &drawElements);
1096         AssignGLEntryPoint(loadProcAddress("glGenTextures"), &genTextures);
1097         AssignGLEntryPoint(loadProcAddress("glIsTexture"), &isTexture);
1098         AssignGLEntryPoint(loadProcAddress("glPolygonOffset"), &polygonOffset);
1099         AssignGLEntryPoint(loadProcAddress("glTexSubImage1D"), &texSubImage1D);
1100         AssignGLEntryPoint(loadProcAddress("glTexSubImage2D"), &texSubImage2D);
1101     }
1102 
1103     // 1.2
1104     if (isAtLeastGL(gl::Version(1, 2)))
1105     {
1106         AssignGLEntryPoint(loadProcAddress("glBlendColor"), &blendColor);
1107         AssignGLEntryPoint(loadProcAddress("glBlendEquation"), &blendEquation);
1108         AssignGLEntryPoint(loadProcAddress("glCopyTexSubImage3D"), &copyTexSubImage3D);
1109         AssignGLEntryPoint(loadProcAddress("glDrawRangeElements"), &drawRangeElements);
1110         AssignGLEntryPoint(loadProcAddress("glTexImage3D"), &texImage3D);
1111         AssignGLEntryPoint(loadProcAddress("glTexSubImage3D"), &texSubImage3D);
1112     }
1113 
1114     // 1.3
1115     if (isAtLeastGL(gl::Version(1, 3)))
1116     {
1117         AssignGLEntryPoint(loadProcAddress("glActiveTexture"), &activeTexture);
1118         AssignGLEntryPoint(loadProcAddress("glCompressedTexImage1D"), &compressedTexImage1D);
1119         AssignGLEntryPoint(loadProcAddress("glCompressedTexImage2D"), &compressedTexImage2D);
1120         AssignGLEntryPoint(loadProcAddress("glCompressedTexImage3D"), &compressedTexImage3D);
1121         AssignGLEntryPoint(loadProcAddress("glCompressedTexSubImage1D"), &compressedTexSubImage1D);
1122         AssignGLEntryPoint(loadProcAddress("glCompressedTexSubImage2D"), &compressedTexSubImage2D);
1123         AssignGLEntryPoint(loadProcAddress("glCompressedTexSubImage3D"), &compressedTexSubImage3D);
1124         AssignGLEntryPoint(loadProcAddress("glGetCompressedTexImage"), &getCompressedTexImage);
1125         AssignGLEntryPoint(loadProcAddress("glSampleCoverage"), &sampleCoverage);
1126     }
1127 
1128     // 1.4
1129     if (isAtLeastGL(gl::Version(1, 4)))
1130     {
1131         AssignGLEntryPoint(loadProcAddress("glBlendFuncSeparate"), &blendFuncSeparate);
1132         AssignGLEntryPoint(loadProcAddress("glMultiDrawArrays"), &multiDrawArrays);
1133         AssignGLEntryPoint(loadProcAddress("glMultiDrawElements"), &multiDrawElements);
1134         AssignGLEntryPoint(loadProcAddress("glPointParameterf"), &pointParameterf);
1135         AssignGLEntryPoint(loadProcAddress("glPointParameterfv"), &pointParameterfv);
1136         AssignGLEntryPoint(loadProcAddress("glPointParameteri"), &pointParameteri);
1137         AssignGLEntryPoint(loadProcAddress("glPointParameteriv"), &pointParameteriv);
1138     }
1139 
1140     // 1.5
1141     if (isAtLeastGL(gl::Version(1, 5)))
1142     {
1143         AssignGLEntryPoint(loadProcAddress("glBeginQuery"), &beginQuery);
1144         AssignGLEntryPoint(loadProcAddress("glBindBuffer"), &bindBuffer);
1145         AssignGLEntryPoint(loadProcAddress("glBufferData"), &bufferData);
1146         AssignGLEntryPoint(loadProcAddress("glBufferSubData"), &bufferSubData);
1147         AssignGLEntryPoint(loadProcAddress("glDeleteBuffers"), &deleteBuffers);
1148         AssignGLEntryPoint(loadProcAddress("glDeleteQueries"), &deleteQueries);
1149         AssignGLEntryPoint(loadProcAddress("glEndQuery"), &endQuery);
1150         AssignGLEntryPoint(loadProcAddress("glGenBuffers"), &genBuffers);
1151         AssignGLEntryPoint(loadProcAddress("glGenQueries"), &genQueries);
1152         AssignGLEntryPoint(loadProcAddress("glGetBufferParameteriv"), &getBufferParameteriv);
1153         AssignGLEntryPoint(loadProcAddress("glGetBufferPointerv"), &getBufferPointerv);
1154         AssignGLEntryPoint(loadProcAddress("glGetBufferSubData"), &getBufferSubData);
1155         AssignGLEntryPoint(loadProcAddress("glGetQueryObjectiv"), &getQueryObjectiv);
1156         AssignGLEntryPoint(loadProcAddress("glGetQueryObjectuiv"), &getQueryObjectuiv);
1157         AssignGLEntryPoint(loadProcAddress("glGetQueryiv"), &getQueryiv);
1158         AssignGLEntryPoint(loadProcAddress("glIsBuffer"), &isBuffer);
1159         AssignGLEntryPoint(loadProcAddress("glIsQuery"), &isQuery);
1160         AssignGLEntryPoint(loadProcAddress("glMapBuffer"), &mapBuffer);
1161         AssignGLEntryPoint(loadProcAddress("glUnmapBuffer"), &unmapBuffer);
1162     }
1163 
1164     // 2.0
1165     if (isAtLeastGL(gl::Version(2, 0)))
1166     {
1167         AssignGLEntryPoint(loadProcAddress("glAttachShader"), &attachShader);
1168         AssignGLEntryPoint(loadProcAddress("glBindAttribLocation"), &bindAttribLocation);
1169         AssignGLEntryPoint(loadProcAddress("glBlendEquationSeparate"), &blendEquationSeparate);
1170         AssignGLEntryPoint(loadProcAddress("glCompileShader"), &compileShader);
1171         AssignGLEntryPoint(loadProcAddress("glCreateProgram"), &createProgram);
1172         AssignGLEntryPoint(loadProcAddress("glCreateShader"), &createShader);
1173         AssignGLEntryPoint(loadProcAddress("glDeleteProgram"), &deleteProgram);
1174         AssignGLEntryPoint(loadProcAddress("glDeleteShader"), &deleteShader);
1175         AssignGLEntryPoint(loadProcAddress("glDetachShader"), &detachShader);
1176         AssignGLEntryPoint(loadProcAddress("glDisableVertexAttribArray"), &disableVertexAttribArray);
1177         AssignGLEntryPoint(loadProcAddress("glDrawBuffers"), &drawBuffers);
1178         AssignGLEntryPoint(loadProcAddress("glEnableVertexAttribArray"), &enableVertexAttribArray);
1179         AssignGLEntryPoint(loadProcAddress("glGetActiveAttrib"), &getActiveAttrib);
1180         AssignGLEntryPoint(loadProcAddress("glGetActiveUniform"), &getActiveUniform);
1181         AssignGLEntryPoint(loadProcAddress("glGetAttachedShaders"), &getAttachedShaders);
1182         AssignGLEntryPoint(loadProcAddress("glGetAttribLocation"), &getAttribLocation);
1183         AssignGLEntryPoint(loadProcAddress("glGetProgramInfoLog"), &getProgramInfoLog);
1184         AssignGLEntryPoint(loadProcAddress("glGetProgramiv"), &getProgramiv);
1185         AssignGLEntryPoint(loadProcAddress("glGetShaderInfoLog"), &getShaderInfoLog);
1186         AssignGLEntryPoint(loadProcAddress("glGetShaderSource"), &getShaderSource);
1187         AssignGLEntryPoint(loadProcAddress("glGetShaderiv"), &getShaderiv);
1188         AssignGLEntryPoint(loadProcAddress("glGetUniformLocation"), &getUniformLocation);
1189         AssignGLEntryPoint(loadProcAddress("glGetUniformfv"), &getUniformfv);
1190         AssignGLEntryPoint(loadProcAddress("glGetUniformiv"), &getUniformiv);
1191         AssignGLEntryPoint(loadProcAddress("glGetVertexAttribPointerv"), &getVertexAttribPointerv);
1192         AssignGLEntryPoint(loadProcAddress("glGetVertexAttribdv"), &getVertexAttribdv);
1193         AssignGLEntryPoint(loadProcAddress("glGetVertexAttribfv"), &getVertexAttribfv);
1194         AssignGLEntryPoint(loadProcAddress("glGetVertexAttribiv"), &getVertexAttribiv);
1195         AssignGLEntryPoint(loadProcAddress("glIsProgram"), &isProgram);
1196         AssignGLEntryPoint(loadProcAddress("glIsShader"), &isShader);
1197         AssignGLEntryPoint(loadProcAddress("glLinkProgram"), &linkProgram);
1198         AssignGLEntryPoint(loadProcAddress("glShaderSource"), &shaderSource);
1199         AssignGLEntryPoint(loadProcAddress("glStencilFuncSeparate"), &stencilFuncSeparate);
1200         AssignGLEntryPoint(loadProcAddress("glStencilMaskSeparate"), &stencilMaskSeparate);
1201         AssignGLEntryPoint(loadProcAddress("glStencilOpSeparate"), &stencilOpSeparate);
1202         AssignGLEntryPoint(loadProcAddress("glUniform1f"), &uniform1f);
1203         AssignGLEntryPoint(loadProcAddress("glUniform1fv"), &uniform1fv);
1204         AssignGLEntryPoint(loadProcAddress("glUniform1i"), &uniform1i);
1205         AssignGLEntryPoint(loadProcAddress("glUniform1iv"), &uniform1iv);
1206         AssignGLEntryPoint(loadProcAddress("glUniform2f"), &uniform2f);
1207         AssignGLEntryPoint(loadProcAddress("glUniform2fv"), &uniform2fv);
1208         AssignGLEntryPoint(loadProcAddress("glUniform2i"), &uniform2i);
1209         AssignGLEntryPoint(loadProcAddress("glUniform2iv"), &uniform2iv);
1210         AssignGLEntryPoint(loadProcAddress("glUniform3f"), &uniform3f);
1211         AssignGLEntryPoint(loadProcAddress("glUniform3fv"), &uniform3fv);
1212         AssignGLEntryPoint(loadProcAddress("glUniform3i"), &uniform3i);
1213         AssignGLEntryPoint(loadProcAddress("glUniform3iv"), &uniform3iv);
1214         AssignGLEntryPoint(loadProcAddress("glUniform4f"), &uniform4f);
1215         AssignGLEntryPoint(loadProcAddress("glUniform4fv"), &uniform4fv);
1216         AssignGLEntryPoint(loadProcAddress("glUniform4i"), &uniform4i);
1217         AssignGLEntryPoint(loadProcAddress("glUniform4iv"), &uniform4iv);
1218         AssignGLEntryPoint(loadProcAddress("glUniformMatrix2fv"), &uniformMatrix2fv);
1219         AssignGLEntryPoint(loadProcAddress("glUniformMatrix3fv"), &uniformMatrix3fv);
1220         AssignGLEntryPoint(loadProcAddress("glUniformMatrix4fv"), &uniformMatrix4fv);
1221         AssignGLEntryPoint(loadProcAddress("glUseProgram"), &useProgram);
1222         AssignGLEntryPoint(loadProcAddress("glValidateProgram"), &validateProgram);
1223         AssignGLEntryPoint(loadProcAddress("glVertexAttrib1d"), &vertexAttrib1d);
1224         AssignGLEntryPoint(loadProcAddress("glVertexAttrib1dv"), &vertexAttrib1dv);
1225         AssignGLEntryPoint(loadProcAddress("glVertexAttrib1f"), &vertexAttrib1f);
1226         AssignGLEntryPoint(loadProcAddress("glVertexAttrib1fv"), &vertexAttrib1fv);
1227         AssignGLEntryPoint(loadProcAddress("glVertexAttrib1s"), &vertexAttrib1s);
1228         AssignGLEntryPoint(loadProcAddress("glVertexAttrib1sv"), &vertexAttrib1sv);
1229         AssignGLEntryPoint(loadProcAddress("glVertexAttrib2d"), &vertexAttrib2d);
1230         AssignGLEntryPoint(loadProcAddress("glVertexAttrib2dv"), &vertexAttrib2dv);
1231         AssignGLEntryPoint(loadProcAddress("glVertexAttrib2f"), &vertexAttrib2f);
1232         AssignGLEntryPoint(loadProcAddress("glVertexAttrib2fv"), &vertexAttrib2fv);
1233         AssignGLEntryPoint(loadProcAddress("glVertexAttrib2s"), &vertexAttrib2s);
1234         AssignGLEntryPoint(loadProcAddress("glVertexAttrib2sv"), &vertexAttrib2sv);
1235         AssignGLEntryPoint(loadProcAddress("glVertexAttrib3d"), &vertexAttrib3d);
1236         AssignGLEntryPoint(loadProcAddress("glVertexAttrib3dv"), &vertexAttrib3dv);
1237         AssignGLEntryPoint(loadProcAddress("glVertexAttrib3f"), &vertexAttrib3f);
1238         AssignGLEntryPoint(loadProcAddress("glVertexAttrib3fv"), &vertexAttrib3fv);
1239         AssignGLEntryPoint(loadProcAddress("glVertexAttrib3s"), &vertexAttrib3s);
1240         AssignGLEntryPoint(loadProcAddress("glVertexAttrib3sv"), &vertexAttrib3sv);
1241         AssignGLEntryPoint(loadProcAddress("glVertexAttrib4Nbv"), &vertexAttrib4Nbv);
1242         AssignGLEntryPoint(loadProcAddress("glVertexAttrib4Niv"), &vertexAttrib4Niv);
1243         AssignGLEntryPoint(loadProcAddress("glVertexAttrib4Nsv"), &vertexAttrib4Nsv);
1244         AssignGLEntryPoint(loadProcAddress("glVertexAttrib4Nub"), &vertexAttrib4Nub);
1245         AssignGLEntryPoint(loadProcAddress("glVertexAttrib4Nubv"), &vertexAttrib4Nubv);
1246         AssignGLEntryPoint(loadProcAddress("glVertexAttrib4Nuiv"), &vertexAttrib4Nuiv);
1247         AssignGLEntryPoint(loadProcAddress("glVertexAttrib4Nusv"), &vertexAttrib4Nusv);
1248         AssignGLEntryPoint(loadProcAddress("glVertexAttrib4bv"), &vertexAttrib4bv);
1249         AssignGLEntryPoint(loadProcAddress("glVertexAttrib4d"), &vertexAttrib4d);
1250         AssignGLEntryPoint(loadProcAddress("glVertexAttrib4dv"), &vertexAttrib4dv);
1251         AssignGLEntryPoint(loadProcAddress("glVertexAttrib4f"), &vertexAttrib4f);
1252         AssignGLEntryPoint(loadProcAddress("glVertexAttrib4fv"), &vertexAttrib4fv);
1253         AssignGLEntryPoint(loadProcAddress("glVertexAttrib4iv"), &vertexAttrib4iv);
1254         AssignGLEntryPoint(loadProcAddress("glVertexAttrib4s"), &vertexAttrib4s);
1255         AssignGLEntryPoint(loadProcAddress("glVertexAttrib4sv"), &vertexAttrib4sv);
1256         AssignGLEntryPoint(loadProcAddress("glVertexAttrib4ubv"), &vertexAttrib4ubv);
1257         AssignGLEntryPoint(loadProcAddress("glVertexAttrib4uiv"), &vertexAttrib4uiv);
1258         AssignGLEntryPoint(loadProcAddress("glVertexAttrib4usv"), &vertexAttrib4usv);
1259         AssignGLEntryPoint(loadProcAddress("glVertexAttribPointer"), &vertexAttribPointer);
1260     }
1261 
1262     // 2.1
1263     if (isAtLeastGL(gl::Version(2, 1)))
1264     {
1265         AssignGLEntryPoint(loadProcAddress("glUniformMatrix2x3fv"), &uniformMatrix2x3fv);
1266         AssignGLEntryPoint(loadProcAddress("glUniformMatrix2x4fv"), &uniformMatrix2x4fv);
1267         AssignGLEntryPoint(loadProcAddress("glUniformMatrix3x2fv"), &uniformMatrix3x2fv);
1268         AssignGLEntryPoint(loadProcAddress("glUniformMatrix3x4fv"), &uniformMatrix3x4fv);
1269         AssignGLEntryPoint(loadProcAddress("glUniformMatrix4x2fv"), &uniformMatrix4x2fv);
1270         AssignGLEntryPoint(loadProcAddress("glUniformMatrix4x3fv"), &uniformMatrix4x3fv);
1271     }
1272 
1273     // 3.0
1274     if (isAtLeastGL(gl::Version(3, 0)))
1275     {
1276         AssignGLEntryPoint(loadProcAddress("glBeginConditionalRender"), &beginConditionalRender);
1277         AssignGLEntryPoint(loadProcAddress("glBeginTransformFeedback"), &beginTransformFeedback);
1278         AssignGLEntryPoint(loadProcAddress("glBindBufferBase"), &bindBufferBase);
1279         AssignGLEntryPoint(loadProcAddress("glBindBufferRange"), &bindBufferRange);
1280         AssignGLEntryPoint(loadProcAddress("glBindFragDataLocation"), &bindFragDataLocation);
1281         AssignGLEntryPoint(loadProcAddress("glBindFramebuffer"), &bindFramebuffer);
1282         AssignGLEntryPoint(loadProcAddress("glBindRenderbuffer"), &bindRenderbuffer);
1283         AssignGLEntryPoint(loadProcAddress("glBindVertexArray"), &bindVertexArray);
1284         AssignGLEntryPoint(loadProcAddress("glBlitFramebuffer"), &blitFramebuffer);
1285         AssignGLEntryPoint(loadProcAddress("glCheckFramebufferStatus"), &checkFramebufferStatus);
1286         AssignGLEntryPoint(loadProcAddress("glClampColor"), &clampColor);
1287         AssignGLEntryPoint(loadProcAddress("glClearBufferfi"), &clearBufferfi);
1288         AssignGLEntryPoint(loadProcAddress("glClearBufferfv"), &clearBufferfv);
1289         AssignGLEntryPoint(loadProcAddress("glClearBufferiv"), &clearBufferiv);
1290         AssignGLEntryPoint(loadProcAddress("glClearBufferuiv"), &clearBufferuiv);
1291         AssignGLEntryPoint(loadProcAddress("glColorMaski"), &colorMaski);
1292         AssignGLEntryPoint(loadProcAddress("glDeleteFramebuffers"), &deleteFramebuffers);
1293         AssignGLEntryPoint(loadProcAddress("glDeleteRenderbuffers"), &deleteRenderbuffers);
1294         AssignGLEntryPoint(loadProcAddress("glDeleteVertexArrays"), &deleteVertexArrays);
1295         AssignGLEntryPoint(loadProcAddress("glDisablei"), &disablei);
1296         AssignGLEntryPoint(loadProcAddress("glEnablei"), &enablei);
1297         AssignGLEntryPoint(loadProcAddress("glEndConditionalRender"), &endConditionalRender);
1298         AssignGLEntryPoint(loadProcAddress("glEndTransformFeedback"), &endTransformFeedback);
1299         AssignGLEntryPoint(loadProcAddress("glFlushMappedBufferRange"), &flushMappedBufferRange);
1300         AssignGLEntryPoint(loadProcAddress("glFramebufferRenderbuffer"), &framebufferRenderbuffer);
1301         AssignGLEntryPoint(loadProcAddress("glFramebufferTexture1D"), &framebufferTexture1D);
1302         AssignGLEntryPoint(loadProcAddress("glFramebufferTexture2D"), &framebufferTexture2D);
1303         AssignGLEntryPoint(loadProcAddress("glFramebufferTexture3D"), &framebufferTexture3D);
1304         AssignGLEntryPoint(loadProcAddress("glFramebufferTextureLayer"), &framebufferTextureLayer);
1305         AssignGLEntryPoint(loadProcAddress("glGenFramebuffers"), &genFramebuffers);
1306         AssignGLEntryPoint(loadProcAddress("glGenRenderbuffers"), &genRenderbuffers);
1307         AssignGLEntryPoint(loadProcAddress("glGenVertexArrays"), &genVertexArrays);
1308         AssignGLEntryPoint(loadProcAddress("glGenerateMipmap"), &generateMipmap);
1309         AssignGLEntryPoint(loadProcAddress("glGetBooleani_v"), &getBooleani_v);
1310         AssignGLEntryPoint(loadProcAddress("glGetFragDataLocation"), &getFragDataLocation);
1311         AssignGLEntryPoint(loadProcAddress("glGetFramebufferAttachmentParameteriv"), &getFramebufferAttachmentParameteriv);
1312         AssignGLEntryPoint(loadProcAddress("glGetIntegeri_v"), &getIntegeri_v);
1313         AssignGLEntryPoint(loadProcAddress("glGetRenderbufferParameteriv"), &getRenderbufferParameteriv);
1314         AssignGLEntryPoint(loadProcAddress("glGetStringi"), &getStringi);
1315         AssignGLEntryPoint(loadProcAddress("glGetTexParameterIiv"), &getTexParameterIiv);
1316         AssignGLEntryPoint(loadProcAddress("glGetTexParameterIuiv"), &getTexParameterIuiv);
1317         AssignGLEntryPoint(loadProcAddress("glGetTransformFeedbackVarying"), &getTransformFeedbackVarying);
1318         AssignGLEntryPoint(loadProcAddress("glGetUniformuiv"), &getUniformuiv);
1319         AssignGLEntryPoint(loadProcAddress("glGetVertexAttribIiv"), &getVertexAttribIiv);
1320         AssignGLEntryPoint(loadProcAddress("glGetVertexAttribIuiv"), &getVertexAttribIuiv);
1321         AssignGLEntryPoint(loadProcAddress("glIsEnabledi"), &isEnabledi);
1322         AssignGLEntryPoint(loadProcAddress("glIsFramebuffer"), &isFramebuffer);
1323         AssignGLEntryPoint(loadProcAddress("glIsRenderbuffer"), &isRenderbuffer);
1324         AssignGLEntryPoint(loadProcAddress("glIsVertexArray"), &isVertexArray);
1325         AssignGLEntryPoint(loadProcAddress("glMapBufferRange"), &mapBufferRange);
1326         AssignGLEntryPoint(loadProcAddress("glRenderbufferStorage"), &renderbufferStorage);
1327         AssignGLEntryPoint(loadProcAddress("glRenderbufferStorageMultisample"), &renderbufferStorageMultisample);
1328         AssignGLEntryPoint(loadProcAddress("glTexParameterIiv"), &texParameterIiv);
1329         AssignGLEntryPoint(loadProcAddress("glTexParameterIuiv"), &texParameterIuiv);
1330         AssignGLEntryPoint(loadProcAddress("glTransformFeedbackVaryings"), &transformFeedbackVaryings);
1331         AssignGLEntryPoint(loadProcAddress("glUniform1ui"), &uniform1ui);
1332         AssignGLEntryPoint(loadProcAddress("glUniform1uiv"), &uniform1uiv);
1333         AssignGLEntryPoint(loadProcAddress("glUniform2ui"), &uniform2ui);
1334         AssignGLEntryPoint(loadProcAddress("glUniform2uiv"), &uniform2uiv);
1335         AssignGLEntryPoint(loadProcAddress("glUniform3ui"), &uniform3ui);
1336         AssignGLEntryPoint(loadProcAddress("glUniform3uiv"), &uniform3uiv);
1337         AssignGLEntryPoint(loadProcAddress("glUniform4ui"), &uniform4ui);
1338         AssignGLEntryPoint(loadProcAddress("glUniform4uiv"), &uniform4uiv);
1339         AssignGLEntryPoint(loadProcAddress("glVertexAttribI1i"), &vertexAttribI1i);
1340         AssignGLEntryPoint(loadProcAddress("glVertexAttribI1iv"), &vertexAttribI1iv);
1341         AssignGLEntryPoint(loadProcAddress("glVertexAttribI1ui"), &vertexAttribI1ui);
1342         AssignGLEntryPoint(loadProcAddress("glVertexAttribI1uiv"), &vertexAttribI1uiv);
1343         AssignGLEntryPoint(loadProcAddress("glVertexAttribI2i"), &vertexAttribI2i);
1344         AssignGLEntryPoint(loadProcAddress("glVertexAttribI2iv"), &vertexAttribI2iv);
1345         AssignGLEntryPoint(loadProcAddress("glVertexAttribI2ui"), &vertexAttribI2ui);
1346         AssignGLEntryPoint(loadProcAddress("glVertexAttribI2uiv"), &vertexAttribI2uiv);
1347         AssignGLEntryPoint(loadProcAddress("glVertexAttribI3i"), &vertexAttribI3i);
1348         AssignGLEntryPoint(loadProcAddress("glVertexAttribI3iv"), &vertexAttribI3iv);
1349         AssignGLEntryPoint(loadProcAddress("glVertexAttribI3ui"), &vertexAttribI3ui);
1350         AssignGLEntryPoint(loadProcAddress("glVertexAttribI3uiv"), &vertexAttribI3uiv);
1351         AssignGLEntryPoint(loadProcAddress("glVertexAttribI4bv"), &vertexAttribI4bv);
1352         AssignGLEntryPoint(loadProcAddress("glVertexAttribI4i"), &vertexAttribI4i);
1353         AssignGLEntryPoint(loadProcAddress("glVertexAttribI4iv"), &vertexAttribI4iv);
1354         AssignGLEntryPoint(loadProcAddress("glVertexAttribI4sv"), &vertexAttribI4sv);
1355         AssignGLEntryPoint(loadProcAddress("glVertexAttribI4ubv"), &vertexAttribI4ubv);
1356         AssignGLEntryPoint(loadProcAddress("glVertexAttribI4ui"), &vertexAttribI4ui);
1357         AssignGLEntryPoint(loadProcAddress("glVertexAttribI4uiv"), &vertexAttribI4uiv);
1358         AssignGLEntryPoint(loadProcAddress("glVertexAttribI4usv"), &vertexAttribI4usv);
1359         AssignGLEntryPoint(loadProcAddress("glVertexAttribIPointer"), &vertexAttribIPointer);
1360     }
1361 
1362     // 3.1
1363     if (isAtLeastGL(gl::Version(3, 1)))
1364     {
1365         AssignGLEntryPoint(loadProcAddress("glCopyBufferSubData"), &copyBufferSubData);
1366         AssignGLEntryPoint(loadProcAddress("glDrawArraysInstanced"), &drawArraysInstanced);
1367         AssignGLEntryPoint(loadProcAddress("glDrawElementsInstanced"), &drawElementsInstanced);
1368         AssignGLEntryPoint(loadProcAddress("glGetActiveUniformBlockName"), &getActiveUniformBlockName);
1369         AssignGLEntryPoint(loadProcAddress("glGetActiveUniformBlockiv"), &getActiveUniformBlockiv);
1370         AssignGLEntryPoint(loadProcAddress("glGetActiveUniformName"), &getActiveUniformName);
1371         AssignGLEntryPoint(loadProcAddress("glGetActiveUniformsiv"), &getActiveUniformsiv);
1372         AssignGLEntryPoint(loadProcAddress("glGetUniformBlockIndex"), &getUniformBlockIndex);
1373         AssignGLEntryPoint(loadProcAddress("glGetUniformIndices"), &getUniformIndices);
1374         AssignGLEntryPoint(loadProcAddress("glPrimitiveRestartIndex"), &primitiveRestartIndex);
1375         AssignGLEntryPoint(loadProcAddress("glTexBuffer"), &texBuffer);
1376         AssignGLEntryPoint(loadProcAddress("glUniformBlockBinding"), &uniformBlockBinding);
1377     }
1378 
1379     // 3.2
1380     if (isAtLeastGL(gl::Version(3, 2)))
1381     {
1382         AssignGLEntryPoint(loadProcAddress("glClientWaitSync"), &clientWaitSync);
1383         AssignGLEntryPoint(loadProcAddress("glDeleteSync"), &deleteSync);
1384         AssignGLEntryPoint(loadProcAddress("glDrawElementsBaseVertex"), &drawElementsBaseVertex);
1385         AssignGLEntryPoint(loadProcAddress("glDrawElementsInstancedBaseVertex"), &drawElementsInstancedBaseVertex);
1386         AssignGLEntryPoint(loadProcAddress("glDrawRangeElementsBaseVertex"), &drawRangeElementsBaseVertex);
1387         AssignGLEntryPoint(loadProcAddress("glFenceSync"), &fenceSync);
1388         AssignGLEntryPoint(loadProcAddress("glFramebufferTexture"), &framebufferTexture);
1389         AssignGLEntryPoint(loadProcAddress("glGetBufferParameteri64v"), &getBufferParameteri64v);
1390         AssignGLEntryPoint(loadProcAddress("glGetInteger64i_v"), &getInteger64i_v);
1391         AssignGLEntryPoint(loadProcAddress("glGetInteger64v"), &getInteger64v);
1392         AssignGLEntryPoint(loadProcAddress("glGetMultisamplefv"), &getMultisamplefv);
1393         AssignGLEntryPoint(loadProcAddress("glGetSynciv"), &getSynciv);
1394         AssignGLEntryPoint(loadProcAddress("glIsSync"), &isSync);
1395         AssignGLEntryPoint(loadProcAddress("glMultiDrawElementsBaseVertex"), &multiDrawElementsBaseVertex);
1396         AssignGLEntryPoint(loadProcAddress("glProvokingVertex"), &provokingVertex);
1397         AssignGLEntryPoint(loadProcAddress("glSampleMaski"), &sampleMaski);
1398         AssignGLEntryPoint(loadProcAddress("glTexImage2DMultisample"), &texImage2DMultisample);
1399         AssignGLEntryPoint(loadProcAddress("glTexImage3DMultisample"), &texImage3DMultisample);
1400         AssignGLEntryPoint(loadProcAddress("glWaitSync"), &waitSync);
1401     }
1402 
1403     // 3.3
1404     if (isAtLeastGL(gl::Version(3, 3)))
1405     {
1406         AssignGLEntryPoint(loadProcAddress("glBindFragDataLocationIndexed"), &bindFragDataLocationIndexed);
1407         AssignGLEntryPoint(loadProcAddress("glBindSampler"), &bindSampler);
1408         AssignGLEntryPoint(loadProcAddress("glDeleteSamplers"), &deleteSamplers);
1409         AssignGLEntryPoint(loadProcAddress("glGenSamplers"), &genSamplers);
1410         AssignGLEntryPoint(loadProcAddress("glGetFragDataIndex"), &getFragDataIndex);
1411         AssignGLEntryPoint(loadProcAddress("glGetQueryObjecti64v"), &getQueryObjecti64v);
1412         AssignGLEntryPoint(loadProcAddress("glGetQueryObjectui64v"), &getQueryObjectui64v);
1413         AssignGLEntryPoint(loadProcAddress("glGetSamplerParameterIiv"), &getSamplerParameterIiv);
1414         AssignGLEntryPoint(loadProcAddress("glGetSamplerParameterIuiv"), &getSamplerParameterIuiv);
1415         AssignGLEntryPoint(loadProcAddress("glGetSamplerParameterfv"), &getSamplerParameterfv);
1416         AssignGLEntryPoint(loadProcAddress("glGetSamplerParameteriv"), &getSamplerParameteriv);
1417         AssignGLEntryPoint(loadProcAddress("glIsSampler"), &isSampler);
1418         AssignGLEntryPoint(loadProcAddress("glQueryCounter"), &queryCounter);
1419         AssignGLEntryPoint(loadProcAddress("glSamplerParameterIiv"), &samplerParameterIiv);
1420         AssignGLEntryPoint(loadProcAddress("glSamplerParameterIuiv"), &samplerParameterIuiv);
1421         AssignGLEntryPoint(loadProcAddress("glSamplerParameterf"), &samplerParameterf);
1422         AssignGLEntryPoint(loadProcAddress("glSamplerParameterfv"), &samplerParameterfv);
1423         AssignGLEntryPoint(loadProcAddress("glSamplerParameteri"), &samplerParameteri);
1424         AssignGLEntryPoint(loadProcAddress("glSamplerParameteriv"), &samplerParameteriv);
1425         AssignGLEntryPoint(loadProcAddress("glVertexAttribDivisor"), &vertexAttribDivisor);
1426         AssignGLEntryPoint(loadProcAddress("glVertexAttribP1ui"), &vertexAttribP1ui);
1427         AssignGLEntryPoint(loadProcAddress("glVertexAttribP1uiv"), &vertexAttribP1uiv);
1428         AssignGLEntryPoint(loadProcAddress("glVertexAttribP2ui"), &vertexAttribP2ui);
1429         AssignGLEntryPoint(loadProcAddress("glVertexAttribP2uiv"), &vertexAttribP2uiv);
1430         AssignGLEntryPoint(loadProcAddress("glVertexAttribP3ui"), &vertexAttribP3ui);
1431         AssignGLEntryPoint(loadProcAddress("glVertexAttribP3uiv"), &vertexAttribP3uiv);
1432         AssignGLEntryPoint(loadProcAddress("glVertexAttribP4ui"), &vertexAttribP4ui);
1433         AssignGLEntryPoint(loadProcAddress("glVertexAttribP4uiv"), &vertexAttribP4uiv);
1434     }
1435 
1436     // 4.0
1437     if (isAtLeastGL(gl::Version(4, 0)))
1438     {
1439         AssignGLEntryPoint(loadProcAddress("glBeginQueryIndexed"), &beginQueryIndexed);
1440         AssignGLEntryPoint(loadProcAddress("glBindTransformFeedback"), &bindTransformFeedback);
1441         AssignGLEntryPoint(loadProcAddress("glBlendEquationSeparatei"), &blendEquationSeparatei);
1442         AssignGLEntryPoint(loadProcAddress("glBlendEquationi"), &blendEquationi);
1443         AssignGLEntryPoint(loadProcAddress("glBlendFuncSeparatei"), &blendFuncSeparatei);
1444         AssignGLEntryPoint(loadProcAddress("glBlendFunci"), &blendFunci);
1445         AssignGLEntryPoint(loadProcAddress("glDeleteTransformFeedbacks"), &deleteTransformFeedbacks);
1446         AssignGLEntryPoint(loadProcAddress("glDrawArraysIndirect"), &drawArraysIndirect);
1447         AssignGLEntryPoint(loadProcAddress("glDrawElementsIndirect"), &drawElementsIndirect);
1448         AssignGLEntryPoint(loadProcAddress("glDrawTransformFeedback"), &drawTransformFeedback);
1449         AssignGLEntryPoint(loadProcAddress("glDrawTransformFeedbackStream"), &drawTransformFeedbackStream);
1450         AssignGLEntryPoint(loadProcAddress("glEndQueryIndexed"), &endQueryIndexed);
1451         AssignGLEntryPoint(loadProcAddress("glGenTransformFeedbacks"), &genTransformFeedbacks);
1452         AssignGLEntryPoint(loadProcAddress("glGetActiveSubroutineName"), &getActiveSubroutineName);
1453         AssignGLEntryPoint(loadProcAddress("glGetActiveSubroutineUniformName"), &getActiveSubroutineUniformName);
1454         AssignGLEntryPoint(loadProcAddress("glGetActiveSubroutineUniformiv"), &getActiveSubroutineUniformiv);
1455         AssignGLEntryPoint(loadProcAddress("glGetProgramStageiv"), &getProgramStageiv);
1456         AssignGLEntryPoint(loadProcAddress("glGetQueryIndexediv"), &getQueryIndexediv);
1457         AssignGLEntryPoint(loadProcAddress("glGetSubroutineIndex"), &getSubroutineIndex);
1458         AssignGLEntryPoint(loadProcAddress("glGetSubroutineUniformLocation"), &getSubroutineUniformLocation);
1459         AssignGLEntryPoint(loadProcAddress("glGetUniformSubroutineuiv"), &getUniformSubroutineuiv);
1460         AssignGLEntryPoint(loadProcAddress("glGetUniformdv"), &getUniformdv);
1461         AssignGLEntryPoint(loadProcAddress("glIsTransformFeedback"), &isTransformFeedback);
1462         AssignGLEntryPoint(loadProcAddress("glMinSampleShading"), &minSampleShading);
1463         AssignGLEntryPoint(loadProcAddress("glPatchParameterfv"), &patchParameterfv);
1464         AssignGLEntryPoint(loadProcAddress("glPatchParameteri"), &patchParameteri);
1465         AssignGLEntryPoint(loadProcAddress("glPauseTransformFeedback"), &pauseTransformFeedback);
1466         AssignGLEntryPoint(loadProcAddress("glResumeTransformFeedback"), &resumeTransformFeedback);
1467         AssignGLEntryPoint(loadProcAddress("glUniform1d"), &uniform1d);
1468         AssignGLEntryPoint(loadProcAddress("glUniform1dv"), &uniform1dv);
1469         AssignGLEntryPoint(loadProcAddress("glUniform2d"), &uniform2d);
1470         AssignGLEntryPoint(loadProcAddress("glUniform2dv"), &uniform2dv);
1471         AssignGLEntryPoint(loadProcAddress("glUniform3d"), &uniform3d);
1472         AssignGLEntryPoint(loadProcAddress("glUniform3dv"), &uniform3dv);
1473         AssignGLEntryPoint(loadProcAddress("glUniform4d"), &uniform4d);
1474         AssignGLEntryPoint(loadProcAddress("glUniform4dv"), &uniform4dv);
1475         AssignGLEntryPoint(loadProcAddress("glUniformMatrix2dv"), &uniformMatrix2dv);
1476         AssignGLEntryPoint(loadProcAddress("glUniformMatrix2x3dv"), &uniformMatrix2x3dv);
1477         AssignGLEntryPoint(loadProcAddress("glUniformMatrix2x4dv"), &uniformMatrix2x4dv);
1478         AssignGLEntryPoint(loadProcAddress("glUniformMatrix3dv"), &uniformMatrix3dv);
1479         AssignGLEntryPoint(loadProcAddress("glUniformMatrix3x2dv"), &uniformMatrix3x2dv);
1480         AssignGLEntryPoint(loadProcAddress("glUniformMatrix3x4dv"), &uniformMatrix3x4dv);
1481         AssignGLEntryPoint(loadProcAddress("glUniformMatrix4dv"), &uniformMatrix4dv);
1482         AssignGLEntryPoint(loadProcAddress("glUniformMatrix4x2dv"), &uniformMatrix4x2dv);
1483         AssignGLEntryPoint(loadProcAddress("glUniformMatrix4x3dv"), &uniformMatrix4x3dv);
1484         AssignGLEntryPoint(loadProcAddress("glUniformSubroutinesuiv"), &uniformSubroutinesuiv);
1485     }
1486 
1487     // 4.1
1488     if (isAtLeastGL(gl::Version(4, 1)))
1489     {
1490         AssignGLEntryPoint(loadProcAddress("glActiveShaderProgram"), &activeShaderProgram);
1491         AssignGLEntryPoint(loadProcAddress("glBindProgramPipeline"), &bindProgramPipeline);
1492         AssignGLEntryPoint(loadProcAddress("glClearDepthf"), &clearDepthf);
1493         AssignGLEntryPoint(loadProcAddress("glCreateShaderProgramv"), &createShaderProgramv);
1494         AssignGLEntryPoint(loadProcAddress("glDeleteProgramPipelines"), &deleteProgramPipelines);
1495         AssignGLEntryPoint(loadProcAddress("glDepthRangeArrayv"), &depthRangeArrayv);
1496         AssignGLEntryPoint(loadProcAddress("glDepthRangeIndexed"), &depthRangeIndexed);
1497         AssignGLEntryPoint(loadProcAddress("glDepthRangef"), &depthRangef);
1498         AssignGLEntryPoint(loadProcAddress("glGenProgramPipelines"), &genProgramPipelines);
1499         AssignGLEntryPoint(loadProcAddress("glGetDoublei_v"), &getDoublei_v);
1500         AssignGLEntryPoint(loadProcAddress("glGetFloati_v"), &getFloati_v);
1501         AssignGLEntryPoint(loadProcAddress("glGetProgramBinary"), &getProgramBinary);
1502         AssignGLEntryPoint(loadProcAddress("glGetProgramPipelineInfoLog"), &getProgramPipelineInfoLog);
1503         AssignGLEntryPoint(loadProcAddress("glGetProgramPipelineiv"), &getProgramPipelineiv);
1504         AssignGLEntryPoint(loadProcAddress("glGetShaderPrecisionFormat"), &getShaderPrecisionFormat);
1505         AssignGLEntryPoint(loadProcAddress("glGetVertexAttribLdv"), &getVertexAttribLdv);
1506         AssignGLEntryPoint(loadProcAddress("glIsProgramPipeline"), &isProgramPipeline);
1507         AssignGLEntryPoint(loadProcAddress("glProgramBinary"), &programBinary);
1508         AssignGLEntryPoint(loadProcAddress("glProgramParameteri"), &programParameteri);
1509         AssignGLEntryPoint(loadProcAddress("glProgramUniform1d"), &programUniform1d);
1510         AssignGLEntryPoint(loadProcAddress("glProgramUniform1dv"), &programUniform1dv);
1511         AssignGLEntryPoint(loadProcAddress("glProgramUniform1f"), &programUniform1f);
1512         AssignGLEntryPoint(loadProcAddress("glProgramUniform1fv"), &programUniform1fv);
1513         AssignGLEntryPoint(loadProcAddress("glProgramUniform1i"), &programUniform1i);
1514         AssignGLEntryPoint(loadProcAddress("glProgramUniform1iv"), &programUniform1iv);
1515         AssignGLEntryPoint(loadProcAddress("glProgramUniform1ui"), &programUniform1ui);
1516         AssignGLEntryPoint(loadProcAddress("glProgramUniform1uiv"), &programUniform1uiv);
1517         AssignGLEntryPoint(loadProcAddress("glProgramUniform2d"), &programUniform2d);
1518         AssignGLEntryPoint(loadProcAddress("glProgramUniform2dv"), &programUniform2dv);
1519         AssignGLEntryPoint(loadProcAddress("glProgramUniform2f"), &programUniform2f);
1520         AssignGLEntryPoint(loadProcAddress("glProgramUniform2fv"), &programUniform2fv);
1521         AssignGLEntryPoint(loadProcAddress("glProgramUniform2i"), &programUniform2i);
1522         AssignGLEntryPoint(loadProcAddress("glProgramUniform2iv"), &programUniform2iv);
1523         AssignGLEntryPoint(loadProcAddress("glProgramUniform2ui"), &programUniform2ui);
1524         AssignGLEntryPoint(loadProcAddress("glProgramUniform2uiv"), &programUniform2uiv);
1525         AssignGLEntryPoint(loadProcAddress("glProgramUniform3d"), &programUniform3d);
1526         AssignGLEntryPoint(loadProcAddress("glProgramUniform3dv"), &programUniform3dv);
1527         AssignGLEntryPoint(loadProcAddress("glProgramUniform3f"), &programUniform3f);
1528         AssignGLEntryPoint(loadProcAddress("glProgramUniform3fv"), &programUniform3fv);
1529         AssignGLEntryPoint(loadProcAddress("glProgramUniform3i"), &programUniform3i);
1530         AssignGLEntryPoint(loadProcAddress("glProgramUniform3iv"), &programUniform3iv);
1531         AssignGLEntryPoint(loadProcAddress("glProgramUniform3ui"), &programUniform3ui);
1532         AssignGLEntryPoint(loadProcAddress("glProgramUniform3uiv"), &programUniform3uiv);
1533         AssignGLEntryPoint(loadProcAddress("glProgramUniform4d"), &programUniform4d);
1534         AssignGLEntryPoint(loadProcAddress("glProgramUniform4dv"), &programUniform4dv);
1535         AssignGLEntryPoint(loadProcAddress("glProgramUniform4f"), &programUniform4f);
1536         AssignGLEntryPoint(loadProcAddress("glProgramUniform4fv"), &programUniform4fv);
1537         AssignGLEntryPoint(loadProcAddress("glProgramUniform4i"), &programUniform4i);
1538         AssignGLEntryPoint(loadProcAddress("glProgramUniform4iv"), &programUniform4iv);
1539         AssignGLEntryPoint(loadProcAddress("glProgramUniform4ui"), &programUniform4ui);
1540         AssignGLEntryPoint(loadProcAddress("glProgramUniform4uiv"), &programUniform4uiv);
1541         AssignGLEntryPoint(loadProcAddress("glProgramUniformMatrix2dv"), &programUniformMatrix2dv);
1542         AssignGLEntryPoint(loadProcAddress("glProgramUniformMatrix2fv"), &programUniformMatrix2fv);
1543         AssignGLEntryPoint(loadProcAddress("glProgramUniformMatrix2x3dv"), &programUniformMatrix2x3dv);
1544         AssignGLEntryPoint(loadProcAddress("glProgramUniformMatrix2x3fv"), &programUniformMatrix2x3fv);
1545         AssignGLEntryPoint(loadProcAddress("glProgramUniformMatrix2x4dv"), &programUniformMatrix2x4dv);
1546         AssignGLEntryPoint(loadProcAddress("glProgramUniformMatrix2x4fv"), &programUniformMatrix2x4fv);
1547         AssignGLEntryPoint(loadProcAddress("glProgramUniformMatrix3dv"), &programUniformMatrix3dv);
1548         AssignGLEntryPoint(loadProcAddress("glProgramUniformMatrix3fv"), &programUniformMatrix3fv);
1549         AssignGLEntryPoint(loadProcAddress("glProgramUniformMatrix3x2dv"), &programUniformMatrix3x2dv);
1550         AssignGLEntryPoint(loadProcAddress("glProgramUniformMatrix3x2fv"), &programUniformMatrix3x2fv);
1551         AssignGLEntryPoint(loadProcAddress("glProgramUniformMatrix3x4dv"), &programUniformMatrix3x4dv);
1552         AssignGLEntryPoint(loadProcAddress("glProgramUniformMatrix3x4fv"), &programUniformMatrix3x4fv);
1553         AssignGLEntryPoint(loadProcAddress("glProgramUniformMatrix4dv"), &programUniformMatrix4dv);
1554         AssignGLEntryPoint(loadProcAddress("glProgramUniformMatrix4fv"), &programUniformMatrix4fv);
1555         AssignGLEntryPoint(loadProcAddress("glProgramUniformMatrix4x2dv"), &programUniformMatrix4x2dv);
1556         AssignGLEntryPoint(loadProcAddress("glProgramUniformMatrix4x2fv"), &programUniformMatrix4x2fv);
1557         AssignGLEntryPoint(loadProcAddress("glProgramUniformMatrix4x3dv"), &programUniformMatrix4x3dv);
1558         AssignGLEntryPoint(loadProcAddress("glProgramUniformMatrix4x3fv"), &programUniformMatrix4x3fv);
1559         AssignGLEntryPoint(loadProcAddress("glReleaseShaderCompiler"), &releaseShaderCompiler);
1560         AssignGLEntryPoint(loadProcAddress("glScissorArrayv"), &scissorArrayv);
1561         AssignGLEntryPoint(loadProcAddress("glScissorIndexed"), &scissorIndexed);
1562         AssignGLEntryPoint(loadProcAddress("glScissorIndexedv"), &scissorIndexedv);
1563         AssignGLEntryPoint(loadProcAddress("glShaderBinary"), &shaderBinary);
1564         AssignGLEntryPoint(loadProcAddress("glUseProgramStages"), &useProgramStages);
1565         AssignGLEntryPoint(loadProcAddress("glValidateProgramPipeline"), &validateProgramPipeline);
1566         AssignGLEntryPoint(loadProcAddress("glVertexAttribL1d"), &vertexAttribL1d);
1567         AssignGLEntryPoint(loadProcAddress("glVertexAttribL1dv"), &vertexAttribL1dv);
1568         AssignGLEntryPoint(loadProcAddress("glVertexAttribL2d"), &vertexAttribL2d);
1569         AssignGLEntryPoint(loadProcAddress("glVertexAttribL2dv"), &vertexAttribL2dv);
1570         AssignGLEntryPoint(loadProcAddress("glVertexAttribL3d"), &vertexAttribL3d);
1571         AssignGLEntryPoint(loadProcAddress("glVertexAttribL3dv"), &vertexAttribL3dv);
1572         AssignGLEntryPoint(loadProcAddress("glVertexAttribL4d"), &vertexAttribL4d);
1573         AssignGLEntryPoint(loadProcAddress("glVertexAttribL4dv"), &vertexAttribL4dv);
1574         AssignGLEntryPoint(loadProcAddress("glVertexAttribLPointer"), &vertexAttribLPointer);
1575         AssignGLEntryPoint(loadProcAddress("glViewportArrayv"), &viewportArrayv);
1576         AssignGLEntryPoint(loadProcAddress("glViewportIndexedf"), &viewportIndexedf);
1577         AssignGLEntryPoint(loadProcAddress("glViewportIndexedfv"), &viewportIndexedfv);
1578     }
1579 
1580     // 4.2
1581     if (isAtLeastGL(gl::Version(4, 2)))
1582     {
1583         AssignGLEntryPoint(loadProcAddress("glBindImageTexture"), &bindImageTexture);
1584         AssignGLEntryPoint(loadProcAddress("glDrawArraysInstancedBaseInstance"), &drawArraysInstancedBaseInstance);
1585         AssignGLEntryPoint(loadProcAddress("glDrawElementsInstancedBaseInstance"), &drawElementsInstancedBaseInstance);
1586         AssignGLEntryPoint(loadProcAddress("glDrawElementsInstancedBaseVertexBaseInstance"), &drawElementsInstancedBaseVertexBaseInstance);
1587         AssignGLEntryPoint(loadProcAddress("glDrawTransformFeedbackInstanced"), &drawTransformFeedbackInstanced);
1588         AssignGLEntryPoint(loadProcAddress("glDrawTransformFeedbackStreamInstanced"), &drawTransformFeedbackStreamInstanced);
1589         AssignGLEntryPoint(loadProcAddress("glGetActiveAtomicCounterBufferiv"), &getActiveAtomicCounterBufferiv);
1590         AssignGLEntryPoint(loadProcAddress("glGetInternalformativ"), &getInternalformativ);
1591         AssignGLEntryPoint(loadProcAddress("glMemoryBarrier"), &memoryBarrier);
1592         AssignGLEntryPoint(loadProcAddress("glTexStorage1D"), &texStorage1D);
1593         AssignGLEntryPoint(loadProcAddress("glTexStorage2D"), &texStorage2D);
1594         AssignGLEntryPoint(loadProcAddress("glTexStorage3D"), &texStorage3D);
1595     }
1596 
1597     // 4.3
1598     if (isAtLeastGL(gl::Version(4, 3)))
1599     {
1600         AssignGLEntryPoint(loadProcAddress("glBindVertexBuffer"), &bindVertexBuffer);
1601         AssignGLEntryPoint(loadProcAddress("glClearBufferData"), &clearBufferData);
1602         AssignGLEntryPoint(loadProcAddress("glClearBufferSubData"), &clearBufferSubData);
1603         AssignGLEntryPoint(loadProcAddress("glCopyImageSubData"), &copyImageSubData);
1604         AssignGLEntryPoint(loadProcAddress("glDebugMessageCallback"), &debugMessageCallback);
1605         AssignGLEntryPoint(loadProcAddress("glDebugMessageControl"), &debugMessageControl);
1606         AssignGLEntryPoint(loadProcAddress("glDebugMessageInsert"), &debugMessageInsert);
1607         AssignGLEntryPoint(loadProcAddress("glDispatchCompute"), &dispatchCompute);
1608         AssignGLEntryPoint(loadProcAddress("glDispatchComputeIndirect"), &dispatchComputeIndirect);
1609         AssignGLEntryPoint(loadProcAddress("glFramebufferParameteri"), &framebufferParameteri);
1610         AssignGLEntryPoint(loadProcAddress("glGetDebugMessageLog"), &getDebugMessageLog);
1611         AssignGLEntryPoint(loadProcAddress("glGetFramebufferParameteriv"), &getFramebufferParameteriv);
1612         AssignGLEntryPoint(loadProcAddress("glGetInternalformati64v"), &getInternalformati64v);
1613         AssignGLEntryPoint(loadProcAddress("glGetPointerv"), &getPointerv);
1614         AssignGLEntryPoint(loadProcAddress("glGetObjectLabel"), &getObjectLabel);
1615         AssignGLEntryPoint(loadProcAddress("glGetObjectPtrLabel"), &getObjectPtrLabel);
1616         AssignGLEntryPoint(loadProcAddress("glGetProgramInterfaceiv"), &getProgramInterfaceiv);
1617         AssignGLEntryPoint(loadProcAddress("glGetProgramResourceIndex"), &getProgramResourceIndex);
1618         AssignGLEntryPoint(loadProcAddress("glGetProgramResourceLocation"), &getProgramResourceLocation);
1619         AssignGLEntryPoint(loadProcAddress("glGetProgramResourceLocationIndex"), &getProgramResourceLocationIndex);
1620         AssignGLEntryPoint(loadProcAddress("glGetProgramResourceName"), &getProgramResourceName);
1621         AssignGLEntryPoint(loadProcAddress("glGetProgramResourceiv"), &getProgramResourceiv);
1622         AssignGLEntryPoint(loadProcAddress("glInvalidateBufferData"), &invalidateBufferData);
1623         AssignGLEntryPoint(loadProcAddress("glInvalidateBufferSubData"), &invalidateBufferSubData);
1624         AssignGLEntryPoint(loadProcAddress("glInvalidateFramebuffer"), &invalidateFramebuffer);
1625         AssignGLEntryPoint(loadProcAddress("glInvalidateSubFramebuffer"), &invalidateSubFramebuffer);
1626         AssignGLEntryPoint(loadProcAddress("glInvalidateTexImage"), &invalidateTexImage);
1627         AssignGLEntryPoint(loadProcAddress("glInvalidateTexSubImage"), &invalidateTexSubImage);
1628         AssignGLEntryPoint(loadProcAddress("glMultiDrawArraysIndirect"), &multiDrawArraysIndirect);
1629         AssignGLEntryPoint(loadProcAddress("glMultiDrawElementsIndirect"), &multiDrawElementsIndirect);
1630         AssignGLEntryPoint(loadProcAddress("glObjectLabel"), &objectLabel);
1631         AssignGLEntryPoint(loadProcAddress("glObjectPtrLabel"), &objectPtrLabel);
1632         AssignGLEntryPoint(loadProcAddress("glPopDebugGroup"), &popDebugGroup);
1633         AssignGLEntryPoint(loadProcAddress("glPushDebugGroup"), &pushDebugGroup);
1634         AssignGLEntryPoint(loadProcAddress("glShaderStorageBlockBinding"), &shaderStorageBlockBinding);
1635         AssignGLEntryPoint(loadProcAddress("glTexBufferRange"), &texBufferRange);
1636         AssignGLEntryPoint(loadProcAddress("glTexStorage2DMultisample"), &texStorage2DMultisample);
1637         AssignGLEntryPoint(loadProcAddress("glTexStorage3DMultisample"), &texStorage3DMultisample);
1638         AssignGLEntryPoint(loadProcAddress("glTextureView"), &textureView);
1639         AssignGLEntryPoint(loadProcAddress("glVertexAttribBinding"), &vertexAttribBinding);
1640         AssignGLEntryPoint(loadProcAddress("glVertexAttribFormat"), &vertexAttribFormat);
1641         AssignGLEntryPoint(loadProcAddress("glVertexAttribIFormat"), &vertexAttribIFormat);
1642         AssignGLEntryPoint(loadProcAddress("glVertexAttribLFormat"), &vertexAttribLFormat);
1643         AssignGLEntryPoint(loadProcAddress("glVertexBindingDivisor"), &vertexBindingDivisor);
1644     }
1645 
1646     // 4.4
1647     if (isAtLeastGL(gl::Version(4, 4)))
1648     {
1649         AssignGLEntryPoint(loadProcAddress("glBindBuffersBase"), &bindBuffersBase);
1650         AssignGLEntryPoint(loadProcAddress("glBindBuffersRange"), &bindBuffersRange);
1651         AssignGLEntryPoint(loadProcAddress("glBindImageTextures"), &bindImageTextures);
1652         AssignGLEntryPoint(loadProcAddress("glBindSamplers"), &bindSamplers);
1653         AssignGLEntryPoint(loadProcAddress("glBindTextures"), &bindTextures);
1654         AssignGLEntryPoint(loadProcAddress("glBindVertexBuffers"), &bindVertexBuffers);
1655         AssignGLEntryPoint(loadProcAddress("glBufferStorage"), &bufferStorage);
1656         AssignGLEntryPoint(loadProcAddress("glClearTexImage"), &clearTexImage);
1657         AssignGLEntryPoint(loadProcAddress("glClearTexSubImage"), &clearTexSubImage);
1658     }
1659 
1660     // 4.5
1661     if (isAtLeastGL(gl::Version(4, 5)))
1662     {
1663         AssignGLEntryPoint(loadProcAddress("glBindTextureUnit"), &bindTextureUnit);
1664         AssignGLEntryPoint(loadProcAddress("glBlitNamedFramebuffer"), &blitNamedFramebuffer);
1665         AssignGLEntryPoint(loadProcAddress("glCheckNamedFramebufferStatus"), &checkNamedFramebufferStatus);
1666         AssignGLEntryPoint(loadProcAddress("glClearNamedBufferData"), &clearNamedBufferData);
1667         AssignGLEntryPoint(loadProcAddress("glClearNamedBufferSubData"), &clearNamedBufferSubData);
1668         AssignGLEntryPoint(loadProcAddress("glClearNamedFramebufferfi"), &clearNamedFramebufferfi);
1669         AssignGLEntryPoint(loadProcAddress("glClearNamedFramebufferfv"), &clearNamedFramebufferfv);
1670         AssignGLEntryPoint(loadProcAddress("glClearNamedFramebufferiv"), &clearNamedFramebufferiv);
1671         AssignGLEntryPoint(loadProcAddress("glClearNamedFramebufferuiv"), &clearNamedFramebufferuiv);
1672         AssignGLEntryPoint(loadProcAddress("glClipControl"), &clipControl);
1673         AssignGLEntryPoint(loadProcAddress("glCompressedTextureSubImage1D"), &compressedTextureSubImage1D);
1674         AssignGLEntryPoint(loadProcAddress("glCompressedTextureSubImage2D"), &compressedTextureSubImage2D);
1675         AssignGLEntryPoint(loadProcAddress("glCompressedTextureSubImage3D"), &compressedTextureSubImage3D);
1676         AssignGLEntryPoint(loadProcAddress("glCopyNamedBufferSubData"), &copyNamedBufferSubData);
1677         AssignGLEntryPoint(loadProcAddress("glCopyTextureSubImage1D"), &copyTextureSubImage1D);
1678         AssignGLEntryPoint(loadProcAddress("glCopyTextureSubImage2D"), &copyTextureSubImage2D);
1679         AssignGLEntryPoint(loadProcAddress("glCopyTextureSubImage3D"), &copyTextureSubImage3D);
1680         AssignGLEntryPoint(loadProcAddress("glCreateBuffers"), &createBuffers);
1681         AssignGLEntryPoint(loadProcAddress("glCreateFramebuffers"), &createFramebuffers);
1682         AssignGLEntryPoint(loadProcAddress("glCreateProgramPipelines"), &createProgramPipelines);
1683         AssignGLEntryPoint(loadProcAddress("glCreateQueries"), &createQueries);
1684         AssignGLEntryPoint(loadProcAddress("glCreateRenderbuffers"), &createRenderbuffers);
1685         AssignGLEntryPoint(loadProcAddress("glCreateSamplers"), &createSamplers);
1686         AssignGLEntryPoint(loadProcAddress("glCreateTextures"), &createTextures);
1687         AssignGLEntryPoint(loadProcAddress("glCreateTransformFeedbacks"), &createTransformFeedbacks);
1688         AssignGLEntryPoint(loadProcAddress("glCreateVertexArrays"), &createVertexArrays);
1689         AssignGLEntryPoint(loadProcAddress("glDisableVertexArrayAttrib"), &disableVertexArrayAttrib);
1690         AssignGLEntryPoint(loadProcAddress("glEnableVertexArrayAttrib"), &enableVertexArrayAttrib);
1691         AssignGLEntryPoint(loadProcAddress("glFlushMappedNamedBufferRange"), &flushMappedNamedBufferRange);
1692         AssignGLEntryPoint(loadProcAddress("glGenerateTextureMipmap"), &generateTextureMipmap);
1693         AssignGLEntryPoint(loadProcAddress("glGetCompressedTextureImage"), &getCompressedTextureImage);
1694         AssignGLEntryPoint(loadProcAddress("glGetCompressedTextureSubImage"), &getCompressedTextureSubImage);
1695         AssignGLEntryPoint(loadProcAddress("glGetGraphicsResetStatus"), &getGraphicsResetStatus);
1696         AssignGLEntryPoint(loadProcAddress("glGetNamedBufferParameteri64v"), &getNamedBufferParameteri64v);
1697         AssignGLEntryPoint(loadProcAddress("glGetNamedBufferParameteriv"), &getNamedBufferParameteriv);
1698         AssignGLEntryPoint(loadProcAddress("glGetNamedBufferPointerv"), &getNamedBufferPointerv);
1699         AssignGLEntryPoint(loadProcAddress("glGetNamedBufferSubData"), &getNamedBufferSubData);
1700         AssignGLEntryPoint(loadProcAddress("glGetNamedFramebufferAttachmentParameteriv"), &getNamedFramebufferAttachmentParameteriv);
1701         AssignGLEntryPoint(loadProcAddress("glGetNamedFramebufferParameteriv"), &getNamedFramebufferParameteriv);
1702         AssignGLEntryPoint(loadProcAddress("glGetNamedRenderbufferParameteriv"), &getNamedRenderbufferParameteriv);
1703         AssignGLEntryPoint(loadProcAddress("glGetQueryBufferObjecti64v"), &getQueryBufferObjecti64v);
1704         AssignGLEntryPoint(loadProcAddress("glGetQueryBufferObjectiv"), &getQueryBufferObjectiv);
1705         AssignGLEntryPoint(loadProcAddress("glGetQueryBufferObjectui64v"), &getQueryBufferObjectui64v);
1706         AssignGLEntryPoint(loadProcAddress("glGetQueryBufferObjectuiv"), &getQueryBufferObjectuiv);
1707         AssignGLEntryPoint(loadProcAddress("glGetTextureImage"), &getTextureImage);
1708         AssignGLEntryPoint(loadProcAddress("glGetTextureLevelParameterfv"), &getTextureLevelParameterfv);
1709         AssignGLEntryPoint(loadProcAddress("glGetTextureLevelParameteriv"), &getTextureLevelParameteriv);
1710         AssignGLEntryPoint(loadProcAddress("glGetTextureParameterIiv"), &getTextureParameterIiv);
1711         AssignGLEntryPoint(loadProcAddress("glGetTextureParameterIuiv"), &getTextureParameterIuiv);
1712         AssignGLEntryPoint(loadProcAddress("glGetTextureParameterfv"), &getTextureParameterfv);
1713         AssignGLEntryPoint(loadProcAddress("glGetTextureParameteriv"), &getTextureParameteriv);
1714         AssignGLEntryPoint(loadProcAddress("glGetTextureSubImage"), &getTextureSubImage);
1715         AssignGLEntryPoint(loadProcAddress("glGetTransformFeedbacki64_v"), &getTransformFeedbacki64_v);
1716         AssignGLEntryPoint(loadProcAddress("glGetTransformFeedbacki_v"), &getTransformFeedbacki_v);
1717         AssignGLEntryPoint(loadProcAddress("glGetTransformFeedbackiv"), &getTransformFeedbackiv);
1718         AssignGLEntryPoint(loadProcAddress("glGetVertexArrayIndexed64iv"), &getVertexArrayIndexed64iv);
1719         AssignGLEntryPoint(loadProcAddress("glGetVertexArrayIndexediv"), &getVertexArrayIndexediv);
1720         AssignGLEntryPoint(loadProcAddress("glGetVertexArrayiv"), &getVertexArrayiv);
1721         AssignGLEntryPoint(loadProcAddress("glGetnCompressedTexImage"), &getnCompressedTexImage);
1722         AssignGLEntryPoint(loadProcAddress("glGetnTexImage"), &getnTexImage);
1723         AssignGLEntryPoint(loadProcAddress("glGetnUniformdv"), &getnUniformdv);
1724         AssignGLEntryPoint(loadProcAddress("glGetnUniformfv"), &getnUniformfv);
1725         AssignGLEntryPoint(loadProcAddress("glGetnUniformiv"), &getnUniformiv);
1726         AssignGLEntryPoint(loadProcAddress("glGetnUniformuiv"), &getnUniformuiv);
1727         AssignGLEntryPoint(loadProcAddress("glInvalidateNamedFramebufferData"), &invalidateNamedFramebufferData);
1728         AssignGLEntryPoint(loadProcAddress("glInvalidateNamedFramebufferSubData"), &invalidateNamedFramebufferSubData);
1729         AssignGLEntryPoint(loadProcAddress("glMapNamedBuffer"), &mapNamedBuffer);
1730         AssignGLEntryPoint(loadProcAddress("glMapNamedBufferRange"), &mapNamedBufferRange);
1731         AssignGLEntryPoint(loadProcAddress("glMemoryBarrierByRegion"), &memoryBarrierByRegion);
1732         AssignGLEntryPoint(loadProcAddress("glNamedBufferData"), &namedBufferData);
1733         AssignGLEntryPoint(loadProcAddress("glNamedBufferStorage"), &namedBufferStorage);
1734         AssignGLEntryPoint(loadProcAddress("glNamedBufferSubData"), &namedBufferSubData);
1735         AssignGLEntryPoint(loadProcAddress("glNamedFramebufferDrawBuffer"), &namedFramebufferDrawBuffer);
1736         AssignGLEntryPoint(loadProcAddress("glNamedFramebufferDrawBuffers"), &namedFramebufferDrawBuffers);
1737         AssignGLEntryPoint(loadProcAddress("glNamedFramebufferParameteri"), &namedFramebufferParameteri);
1738         AssignGLEntryPoint(loadProcAddress("glNamedFramebufferReadBuffer"), &namedFramebufferReadBuffer);
1739         AssignGLEntryPoint(loadProcAddress("glNamedFramebufferRenderbuffer"), &namedFramebufferRenderbuffer);
1740         AssignGLEntryPoint(loadProcAddress("glNamedFramebufferTexture"), &namedFramebufferTexture);
1741         AssignGLEntryPoint(loadProcAddress("glNamedFramebufferTextureLayer"), &namedFramebufferTextureLayer);
1742         AssignGLEntryPoint(loadProcAddress("glNamedRenderbufferStorage"), &namedRenderbufferStorage);
1743         AssignGLEntryPoint(loadProcAddress("glNamedRenderbufferStorageMultisample"), &namedRenderbufferStorageMultisample);
1744         AssignGLEntryPoint(loadProcAddress("glReadnPixels"), &readnPixels);
1745         AssignGLEntryPoint(loadProcAddress("glTextureBarrier"), &textureBarrier);
1746         AssignGLEntryPoint(loadProcAddress("glTextureBuffer"), &textureBuffer);
1747         AssignGLEntryPoint(loadProcAddress("glTextureBufferRange"), &textureBufferRange);
1748         AssignGLEntryPoint(loadProcAddress("glTextureParameterIiv"), &textureParameterIiv);
1749         AssignGLEntryPoint(loadProcAddress("glTextureParameterIuiv"), &textureParameterIuiv);
1750         AssignGLEntryPoint(loadProcAddress("glTextureParameterf"), &textureParameterf);
1751         AssignGLEntryPoint(loadProcAddress("glTextureParameterfv"), &textureParameterfv);
1752         AssignGLEntryPoint(loadProcAddress("glTextureParameteri"), &textureParameteri);
1753         AssignGLEntryPoint(loadProcAddress("glTextureParameteriv"), &textureParameteriv);
1754         AssignGLEntryPoint(loadProcAddress("glTextureStorage1D"), &textureStorage1D);
1755         AssignGLEntryPoint(loadProcAddress("glTextureStorage2D"), &textureStorage2D);
1756         AssignGLEntryPoint(loadProcAddress("glTextureStorage2DMultisample"), &textureStorage2DMultisample);
1757         AssignGLEntryPoint(loadProcAddress("glTextureStorage3D"), &textureStorage3D);
1758         AssignGLEntryPoint(loadProcAddress("glTextureStorage3DMultisample"), &textureStorage3DMultisample);
1759         AssignGLEntryPoint(loadProcAddress("glTextureSubImage1D"), &textureSubImage1D);
1760         AssignGLEntryPoint(loadProcAddress("glTextureSubImage2D"), &textureSubImage2D);
1761         AssignGLEntryPoint(loadProcAddress("glTextureSubImage3D"), &textureSubImage3D);
1762         AssignGLEntryPoint(loadProcAddress("glTransformFeedbackBufferBase"), &transformFeedbackBufferBase);
1763         AssignGLEntryPoint(loadProcAddress("glTransformFeedbackBufferRange"), &transformFeedbackBufferRange);
1764         AssignGLEntryPoint(loadProcAddress("glUnmapNamedBuffer"), &unmapNamedBuffer);
1765         AssignGLEntryPoint(loadProcAddress("glVertexArrayAttribBinding"), &vertexArrayAttribBinding);
1766         AssignGLEntryPoint(loadProcAddress("glVertexArrayAttribFormat"), &vertexArrayAttribFormat);
1767         AssignGLEntryPoint(loadProcAddress("glVertexArrayAttribIFormat"), &vertexArrayAttribIFormat);
1768         AssignGLEntryPoint(loadProcAddress("glVertexArrayAttribLFormat"), &vertexArrayAttribLFormat);
1769         AssignGLEntryPoint(loadProcAddress("glVertexArrayBindingDivisor"), &vertexArrayBindingDivisor);
1770         AssignGLEntryPoint(loadProcAddress("glVertexArrayElementBuffer"), &vertexArrayElementBuffer);
1771         AssignGLEntryPoint(loadProcAddress("glVertexArrayVertexBuffer"), &vertexArrayVertexBuffer);
1772         AssignGLEntryPoint(loadProcAddress("glVertexArrayVertexBuffers"), &vertexArrayVertexBuffers);
1773     }
1774 
1775     // clang-format on
1776 }
1777 
initializeProcsGLES()1778 void FunctionsGL::initializeProcsGLES()
1779 {
1780     // No profiles in GLES
1781     profile = 0;
1782 
1783     // clang-format off
1784 
1785     // GL_NV_path_rendering
1786     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glMatrixLoadfEXT"), &matrixLoadEXT);
1787     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glGenPathsNV"), &genPathsNV);
1788     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glDeletePathsNV"), &delPathsNV);
1789     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glPathCommandsNV"), &pathCommandsNV);
1790     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glIsPathNV"), &isPathNV);
1791     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glPathParameterfNV"), &setPathParameterfNV);
1792     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glPathParameteriNV"), &setPathParameteriNV);
1793     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glGetPathParameterfvNV"), &getPathParameterfNV);
1794     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glGetPathParameterivNV"), &getPathParameteriNV);
1795     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glPathStencilFuncNV"), &pathStencilFuncNV);
1796     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glStencilFillPathNV"), &stencilFillPathNV);
1797     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glStencilStrokePathNV"), &stencilStrokePathNV);
1798     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glCoverFillPathNV"), &coverFillPathNV);
1799     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glCoverStrokePathNV"), &coverStrokePathNV);
1800     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glStencilThenCoverFillPathNV"), &stencilThenCoverFillPathNV);
1801     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glStencilThenCoverStrokePathNV"), &stencilThenCoverStrokePathNV);
1802     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glCoverFillPathInstancedNV"), &coverFillPathInstancedNV);
1803     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glCoverStrokePathInstancedNV"), &coverStrokePathInstancedNV);
1804     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glStencilFillPathInstancedNV"), &stencilFillPathInstancedNV);
1805     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glStencilStrokePathInstancedNV"), &stencilStrokePathInstancedNV);
1806     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glStencilThenCoverFillPathInstancedNV"), &stencilThenCoverFillPathInstancedNV);
1807     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glStencilThenCoverStrokePathInstancedNV"), &stencilThenCoverStrokePathInstancedNV);
1808     AssignGLExtensionEntryPoint(extensions, "GL_NV_path_rendering", loadProcAddress("glProgramPathFragmentInputGenNV"), &programPathFragmentInputGenNV);
1809 
1810     // GL_OES_texture_3D
1811     AssignGLExtensionEntryPoint(extensions, "GL_OES_texture_3D", loadProcAddress("glTexImage3DOES"), &texImage3D);
1812     AssignGLExtensionEntryPoint(extensions, "GL_OES_texture_3D", loadProcAddress("glTexSubImage3DOES"), &texSubImage3D);
1813     AssignGLExtensionEntryPoint(extensions, "GL_OES_texture_3D", loadProcAddress("glCopyTexSubImage3DOES"), &copyTexSubImage3D);
1814 
1815     // GL_NV_framebuffer_mixed_samples
1816     AssignGLExtensionEntryPoint(extensions, "GL_NV_framebuffer_mixed_samples", loadProcAddress("glCoverageModulationNV"), &coverageModulationNV);
1817 
1818     // GL_NV_fence
1819     AssignGLExtensionEntryPoint(extensions, "GL_NV_fence", loadProcAddress("glDeleteFencesNV"), &deleteFencesNV);
1820     AssignGLExtensionEntryPoint(extensions, "GL_NV_fence", loadProcAddress("glGenFencesNV"), &genFencesNV);
1821     AssignGLExtensionEntryPoint(extensions, "GL_NV_fence", loadProcAddress("glIsFenceNV"), &isFenceNV);
1822     AssignGLExtensionEntryPoint(extensions, "GL_NV_fence", loadProcAddress("glTestFenceNV"), &testFenceNV);
1823     AssignGLExtensionEntryPoint(extensions, "GL_NV_fence", loadProcAddress("glGetFenceivNV"), &getFenceivNV);
1824     AssignGLExtensionEntryPoint(extensions, "GL_NV_fence", loadProcAddress("glFinishFenceNV"), &finishFenceNV);
1825     AssignGLExtensionEntryPoint(extensions, "GL_NV_fence", loadProcAddress("glSetFenceNV"), &setFenceNV);
1826 
1827     // GL_EXT_texture_storage
1828     AssignGLExtensionEntryPoint(extensions, "GL_EXT_texture_storage", loadProcAddress("glTexStorage2DEXT"), &texStorage2D);
1829     AssignGLExtensionEntryPoint(extensions, "GL_EXT_texture_storage GL_OES_texture3D", loadProcAddress("glTexStorage3DEXT"), &texStorage3D);
1830 
1831     // GL_OES_vertex_array_object
1832     AssignGLExtensionEntryPoint(extensions, "GL_OES_vertex_array_object", loadProcAddress("glBindVertexArray"), &bindVertexArray);
1833     AssignGLExtensionEntryPoint(extensions, "GL_OES_vertex_array_object", loadProcAddress("glDeleteVertexArrays"), &deleteVertexArrays);
1834     AssignGLExtensionEntryPoint(extensions, "GL_OES_vertex_array_object", loadProcAddress("glGenVertexArrays"), &genVertexArrays);
1835     AssignGLExtensionEntryPoint(extensions, "GL_OES_vertex_array_object", loadProcAddress("glIsVertexArray"), &isVertexArray);
1836 
1837     // GL_EXT_map_buffer_range
1838     AssignGLExtensionEntryPoint(extensions, "GL_EXT_map_buffer_range", loadProcAddress("glMapBufferRangeEXT"), &mapBufferRange);
1839     AssignGLExtensionEntryPoint(extensions, "GL_EXT_map_buffer_range", loadProcAddress("glFlushMappedBufferRangeEXT"), &flushMappedBufferRange);
1840     AssignGLExtensionEntryPoint(extensions, "GL_EXT_map_buffer_range", loadProcAddress("glUnmapBufferOES"), &unmapBuffer);
1841 
1842     // GL_OES_mapbuffer
1843     AssignGLExtensionEntryPoint(extensions, "GL_OES_mapbuffer", loadProcAddress("glMapBufferOES"), &mapBuffer);
1844     AssignGLExtensionEntryPoint(extensions, "GL_OES_mapbuffer", loadProcAddress("glUnmapBufferOES"), &unmapBuffer);
1845 
1846     // GL_KHR_debug
1847     AssignGLExtensionEntryPoint(extensions, "GL_KHR_debug", loadProcAddress("glDebugMessageControlKHR"), &debugMessageControl);
1848     AssignGLExtensionEntryPoint(extensions, "GL_KHR_debug", loadProcAddress("glDebugMessageInsertKHR"), &debugMessageInsert);
1849     AssignGLExtensionEntryPoint(extensions, "GL_KHR_debug", loadProcAddress("glDebugMessageCallbackKHR"), &debugMessageCallback);
1850     AssignGLExtensionEntryPoint(extensions, "GL_KHR_debug", loadProcAddress("glGetDebugMessageLogKHR"), &getDebugMessageLog);
1851     AssignGLExtensionEntryPoint(extensions, "GL_KHR_debug", loadProcAddress("glGetPointervKHR"), &getPointerv);
1852     AssignGLExtensionEntryPoint(extensions, "GL_KHR_debug", loadProcAddress("glPushDebugGroupKHR"), &pushDebugGroup);
1853     AssignGLExtensionEntryPoint(extensions, "GL_KHR_debug", loadProcAddress("glPopDebugGroupKHR"), &popDebugGroup);
1854     AssignGLExtensionEntryPoint(extensions, "GL_KHR_debug", loadProcAddress("glObjectLabelKHR"), &objectLabel);
1855     AssignGLExtensionEntryPoint(extensions, "GL_KHR_debug", loadProcAddress("glGetObjectLabelKHR"), &getObjectLabel);
1856     AssignGLExtensionEntryPoint(extensions, "GL_KHR_debug", loadProcAddress("glObjectPtrLabelKHR"), &objectPtrLabel);
1857     AssignGLExtensionEntryPoint(extensions, "GL_KHR_debug", loadProcAddress("glGetObjectPtrLabelKHR"), &getObjectPtrLabel);
1858 
1859     // GL_EXT_draw_instanced
1860     AssignGLExtensionEntryPoint(extensions, "GL_EXT_draw_instanced", loadProcAddress("glVertexAttribDivisorEXT"), &vertexAttribDivisor);
1861     AssignGLExtensionEntryPoint(extensions, "GL_EXT_draw_instanced", loadProcAddress("glDrawArraysInstancedEXT"), &drawArraysInstanced);
1862     AssignGLExtensionEntryPoint(extensions, "GL_EXT_draw_instanced", loadProcAddress("glDrawElementsInstancedEXT"), &drawElementsInstanced);
1863 
1864     // GL_EXT_occlusion_query_boolean
1865     AssignGLExtensionEntryPoint(extensions, "GL_EXT_occlusion_query_boolean", loadProcAddress("glGenQueriesEXT"), &genQueries);
1866     AssignGLExtensionEntryPoint(extensions, "GL_EXT_occlusion_query_boolean", loadProcAddress("glDeleteQueriesEXT"), &deleteQueries);
1867     AssignGLExtensionEntryPoint(extensions, "GL_EXT_occlusion_query_boolean", loadProcAddress("glIsQueryEXT"), &isQuery);
1868     AssignGLExtensionEntryPoint(extensions, "GL_EXT_occlusion_query_boolean", loadProcAddress("glBeginQueryEXT"), &beginQuery);
1869     AssignGLExtensionEntryPoint(extensions, "GL_EXT_occlusion_query_boolean", loadProcAddress("glEndQueryEXT"), &endQuery);
1870     AssignGLExtensionEntryPoint(extensions, "GL_EXT_occlusion_query_boolean", loadProcAddress("glGetQueryivEXT"), &getQueryiv);
1871     AssignGLExtensionEntryPoint(extensions, "GL_EXT_occlusion_query_boolean", loadProcAddress("glGetQueryObjectuivEXT"), &getQueryObjectuiv);
1872 
1873     // GL_EXT_disjoint_timer_query
1874     AssignGLExtensionEntryPoint(extensions, "GL_EXT_disjoint_timer_query", loadProcAddress("glGenQueriesEXT"), &genQueries);
1875     AssignGLExtensionEntryPoint(extensions, "GL_EXT_disjoint_timer_query", loadProcAddress("glDeleteQueriesEXT"), &deleteQueries);
1876     AssignGLExtensionEntryPoint(extensions, "GL_EXT_disjoint_timer_query", loadProcAddress("glIsQueryEXT"), &isQuery);
1877     AssignGLExtensionEntryPoint(extensions, "GL_EXT_disjoint_timer_query", loadProcAddress("glBeginQueryEXT"), &beginQuery);
1878     AssignGLExtensionEntryPoint(extensions, "GL_EXT_disjoint_timer_query", loadProcAddress("glEndQueryEXT"), &endQuery);
1879     AssignGLExtensionEntryPoint(extensions, "GL_EXT_disjoint_timer_query", loadProcAddress("glQueryCounterEXT"), &queryCounter);
1880     AssignGLExtensionEntryPoint(extensions, "GL_EXT_disjoint_timer_query", loadProcAddress("glGetQueryivEXT"), &getQueryiv);
1881     AssignGLExtensionEntryPoint(extensions, "GL_EXT_disjoint_timer_query", loadProcAddress("glGetQueryObjectivEXT"), &getQueryObjectiv);
1882     AssignGLExtensionEntryPoint(extensions, "GL_EXT_disjoint_timer_query", loadProcAddress("glGetQueryObjectuivEXT"), &getQueryObjectuiv);
1883     AssignGLExtensionEntryPoint(extensions, "GL_EXT_disjoint_timer_query", loadProcAddress("glGetQueryObjecti64vEXT"), &getQueryObjecti64v);
1884     AssignGLExtensionEntryPoint(extensions, "GL_EXT_disjoint_timer_query", loadProcAddress("glGetQueryObjectui64vEXT"), &getQueryObjectui64v);
1885 
1886     // GL_OES_EGL_image
1887     AssignGLExtensionEntryPoint(extensions, "GL_OES_EGL_image", loadProcAddress("glEGLImageTargetRenderbufferStorageOES"), &eglImageTargetRenderbufferStorageOES);
1888     AssignGLExtensionEntryPoint(extensions, "GL_OES_EGL_image", loadProcAddress("glEGLImageTargetTexture2DOES"), &eglImageTargetTexture2DOES);
1889 
1890     // GL_OES_get_program_binary
1891     AssignGLExtensionEntryPoint(extensions, "GL_OES_get_program_binary", loadProcAddress("glGetProgramBinaryOES"), &getProgramBinary);
1892     AssignGLExtensionEntryPoint(extensions, "GL_OES_get_program_binary", loadProcAddress("glProgramBinaryOES"), &programBinary);
1893 
1894     // GL_EXT_robustness
1895     AssignGLExtensionEntryPoint(extensions, "GL_EXT_robustness", loadProcAddress("glGetGraphicsResetStatusEXT"), &getGraphicsResetStatus);
1896 
1897     // GL_KHR_robustness
1898     AssignGLExtensionEntryPoint(extensions, "GL_KHR_robustness", loadProcAddress("glGetGraphicsResetStatusKHR"), &getGraphicsResetStatus);
1899 
1900     // 2.0
1901     if (isAtLeastGLES(gl::Version(2, 0)))
1902     {
1903         AssignGLEntryPoint(loadProcAddress("glActiveTexture"), &activeTexture);
1904         AssignGLEntryPoint(loadProcAddress("glAttachShader"), &attachShader);
1905         AssignGLEntryPoint(loadProcAddress("glBindAttribLocation"), &bindAttribLocation);
1906         AssignGLEntryPoint(loadProcAddress("glBindBuffer"), &bindBuffer);
1907         AssignGLEntryPoint(loadProcAddress("glBindFramebuffer"), &bindFramebuffer);
1908         AssignGLEntryPoint(loadProcAddress("glBindRenderbuffer"), &bindRenderbuffer);
1909         AssignGLEntryPoint(loadProcAddress("glBindTexture"), &bindTexture);
1910         AssignGLEntryPoint(loadProcAddress("glBlendColor"), &blendColor);
1911         AssignGLEntryPoint(loadProcAddress("glBlendEquation"), &blendEquation);
1912         AssignGLEntryPoint(loadProcAddress("glBlendEquationSeparate"), &blendEquationSeparate);
1913         AssignGLEntryPoint(loadProcAddress("glBlendFunc"), &blendFunc);
1914         AssignGLEntryPoint(loadProcAddress("glBlendFuncSeparate"), &blendFuncSeparate);
1915         AssignGLEntryPoint(loadProcAddress("glBufferData"), &bufferData);
1916         AssignGLEntryPoint(loadProcAddress("glBufferSubData"), &bufferSubData);
1917         AssignGLEntryPoint(loadProcAddress("glCheckFramebufferStatus"), &checkFramebufferStatus);
1918         AssignGLEntryPoint(loadProcAddress("glClear"), &clear);
1919         AssignGLEntryPoint(loadProcAddress("glClearColor"), &clearColor);
1920         AssignGLEntryPoint(loadProcAddress("glClearDepthf"), &clearDepthf);
1921         AssignGLEntryPoint(loadProcAddress("glClearStencil"), &clearStencil);
1922         AssignGLEntryPoint(loadProcAddress("glColorMask"), &colorMask);
1923         AssignGLEntryPoint(loadProcAddress("glCompileShader"), &compileShader);
1924         AssignGLEntryPoint(loadProcAddress("glCompressedTexImage2D"), &compressedTexImage2D);
1925         AssignGLEntryPoint(loadProcAddress("glCompressedTexSubImage2D"), &compressedTexSubImage2D);
1926         AssignGLEntryPoint(loadProcAddress("glCopyTexImage2D"), &copyTexImage2D);
1927         AssignGLEntryPoint(loadProcAddress("glCopyTexSubImage2D"), &copyTexSubImage2D);
1928         AssignGLEntryPoint(loadProcAddress("glCreateProgram"), &createProgram);
1929         AssignGLEntryPoint(loadProcAddress("glCreateShader"), &createShader);
1930         AssignGLEntryPoint(loadProcAddress("glCullFace"), &cullFace);
1931         AssignGLEntryPoint(loadProcAddress("glDeleteBuffers"), &deleteBuffers);
1932         AssignGLEntryPoint(loadProcAddress("glDeleteFramebuffers"), &deleteFramebuffers);
1933         AssignGLEntryPoint(loadProcAddress("glDeleteProgram"), &deleteProgram);
1934         AssignGLEntryPoint(loadProcAddress("glDeleteRenderbuffers"), &deleteRenderbuffers);
1935         AssignGLEntryPoint(loadProcAddress("glDeleteShader"), &deleteShader);
1936         AssignGLEntryPoint(loadProcAddress("glDeleteTextures"), &deleteTextures);
1937         AssignGLEntryPoint(loadProcAddress("glDepthFunc"), &depthFunc);
1938         AssignGLEntryPoint(loadProcAddress("glDepthMask"), &depthMask);
1939         AssignGLEntryPoint(loadProcAddress("glDepthRangef"), &depthRangef);
1940         AssignGLEntryPoint(loadProcAddress("glDetachShader"), &detachShader);
1941         AssignGLEntryPoint(loadProcAddress("glDisable"), &disable);
1942         AssignGLEntryPoint(loadProcAddress("glDisableVertexAttribArray"), &disableVertexAttribArray);
1943         AssignGLEntryPoint(loadProcAddress("glDrawArrays"), &drawArrays);
1944         AssignGLEntryPoint(loadProcAddress("glDrawElements"), &drawElements);
1945         AssignGLEntryPoint(loadProcAddress("glEnable"), &enable);
1946         AssignGLEntryPoint(loadProcAddress("glEnableVertexAttribArray"), &enableVertexAttribArray);
1947         AssignGLEntryPoint(loadProcAddress("glFinish"), &finish);
1948         AssignGLEntryPoint(loadProcAddress("glFlush"), &flush);
1949         AssignGLEntryPoint(loadProcAddress("glFramebufferRenderbuffer"), &framebufferRenderbuffer);
1950         AssignGLEntryPoint(loadProcAddress("glFramebufferTexture2D"), &framebufferTexture2D);
1951         AssignGLEntryPoint(loadProcAddress("glFrontFace"), &frontFace);
1952         AssignGLEntryPoint(loadProcAddress("glGenBuffers"), &genBuffers);
1953         AssignGLEntryPoint(loadProcAddress("glGenerateMipmap"), &generateMipmap);
1954         AssignGLEntryPoint(loadProcAddress("glGenFramebuffers"), &genFramebuffers);
1955         AssignGLEntryPoint(loadProcAddress("glGenRenderbuffers"), &genRenderbuffers);
1956         AssignGLEntryPoint(loadProcAddress("glGenTextures"), &genTextures);
1957         AssignGLEntryPoint(loadProcAddress("glGetActiveAttrib"), &getActiveAttrib);
1958         AssignGLEntryPoint(loadProcAddress("glGetActiveUniform"), &getActiveUniform);
1959         AssignGLEntryPoint(loadProcAddress("glGetAttachedShaders"), &getAttachedShaders);
1960         AssignGLEntryPoint(loadProcAddress("glGetAttribLocation"), &getAttribLocation);
1961         AssignGLEntryPoint(loadProcAddress("glGetBooleanv"), &getBooleanv);
1962         AssignGLEntryPoint(loadProcAddress("glGetBufferParameteriv"), &getBufferParameteriv);
1963         AssignGLEntryPoint(loadProcAddress("glGetError"), &getError);
1964         AssignGLEntryPoint(loadProcAddress("glGetFloatv"), &getFloatv);
1965         AssignGLEntryPoint(loadProcAddress("glGetFramebufferAttachmentParameteriv"), &getFramebufferAttachmentParameteriv);
1966         AssignGLEntryPoint(loadProcAddress("glGetIntegerv"), &getIntegerv);
1967         AssignGLEntryPoint(loadProcAddress("glGetProgramiv"), &getProgramiv);
1968         AssignGLEntryPoint(loadProcAddress("glGetProgramInfoLog"), &getProgramInfoLog);
1969         AssignGLEntryPoint(loadProcAddress("glGetRenderbufferParameteriv"), &getRenderbufferParameteriv);
1970         AssignGLEntryPoint(loadProcAddress("glGetShaderiv"), &getShaderiv);
1971         AssignGLEntryPoint(loadProcAddress("glGetShaderInfoLog"), &getShaderInfoLog);
1972         AssignGLEntryPoint(loadProcAddress("glGetShaderPrecisionFormat"), &getShaderPrecisionFormat);
1973         AssignGLEntryPoint(loadProcAddress("glGetShaderSource"), &getShaderSource);
1974         AssignGLEntryPoint(loadProcAddress("glGetString"), &getString);
1975         AssignGLEntryPoint(loadProcAddress("glGetTexParameterfv"), &getTexParameterfv);
1976         AssignGLEntryPoint(loadProcAddress("glGetTexParameteriv"), &getTexParameteriv);
1977         AssignGLEntryPoint(loadProcAddress("glGetUniformfv"), &getUniformfv);
1978         AssignGLEntryPoint(loadProcAddress("glGetUniformiv"), &getUniformiv);
1979         AssignGLEntryPoint(loadProcAddress("glGetUniformLocation"), &getUniformLocation);
1980         AssignGLEntryPoint(loadProcAddress("glGetVertexAttribfv"), &getVertexAttribfv);
1981         AssignGLEntryPoint(loadProcAddress("glGetVertexAttribiv"), &getVertexAttribiv);
1982         AssignGLEntryPoint(loadProcAddress("glGetVertexAttribPointerv"), &getVertexAttribPointerv);
1983         AssignGLEntryPoint(loadProcAddress("glHint"), &hint);
1984         AssignGLEntryPoint(loadProcAddress("glIsBuffer"), &isBuffer);
1985         AssignGLEntryPoint(loadProcAddress("glIsEnabled"), &isEnabled);
1986         AssignGLEntryPoint(loadProcAddress("glIsFramebuffer"), &isFramebuffer);
1987         AssignGLEntryPoint(loadProcAddress("glIsProgram"), &isProgram);
1988         AssignGLEntryPoint(loadProcAddress("glIsRenderbuffer"), &isRenderbuffer);
1989         AssignGLEntryPoint(loadProcAddress("glIsShader"), &isShader);
1990         AssignGLEntryPoint(loadProcAddress("glIsTexture"), &isTexture);
1991         AssignGLEntryPoint(loadProcAddress("glLineWidth"), &lineWidth);
1992         AssignGLEntryPoint(loadProcAddress("glLinkProgram"), &linkProgram);
1993         AssignGLEntryPoint(loadProcAddress("glPixelStorei"), &pixelStorei);
1994         AssignGLEntryPoint(loadProcAddress("glPolygonOffset"), &polygonOffset);
1995         AssignGLEntryPoint(loadProcAddress("glReadPixels"), &readPixels);
1996         AssignGLEntryPoint(loadProcAddress("glReleaseShaderCompiler"), &releaseShaderCompiler);
1997         AssignGLEntryPoint(loadProcAddress("glRenderbufferStorage"), &renderbufferStorage);
1998         AssignGLEntryPoint(loadProcAddress("glSampleCoverage"), &sampleCoverage);
1999         AssignGLEntryPoint(loadProcAddress("glScissor"), &scissor);
2000         AssignGLEntryPoint(loadProcAddress("glShaderBinary"), &shaderBinary);
2001         AssignGLEntryPoint(loadProcAddress("glShaderSource"), &shaderSource);
2002         AssignGLEntryPoint(loadProcAddress("glStencilFunc"), &stencilFunc);
2003         AssignGLEntryPoint(loadProcAddress("glStencilFuncSeparate"), &stencilFuncSeparate);
2004         AssignGLEntryPoint(loadProcAddress("glStencilMask"), &stencilMask);
2005         AssignGLEntryPoint(loadProcAddress("glStencilMaskSeparate"), &stencilMaskSeparate);
2006         AssignGLEntryPoint(loadProcAddress("glStencilOp"), &stencilOp);
2007         AssignGLEntryPoint(loadProcAddress("glStencilOpSeparate"), &stencilOpSeparate);
2008         AssignGLEntryPoint(loadProcAddress("glTexImage2D"), &texImage2D);
2009         AssignGLEntryPoint(loadProcAddress("glTexParameterf"), &texParameterf);
2010         AssignGLEntryPoint(loadProcAddress("glTexParameterfv"), &texParameterfv);
2011         AssignGLEntryPoint(loadProcAddress("glTexParameteri"), &texParameteri);
2012         AssignGLEntryPoint(loadProcAddress("glTexParameteriv"), &texParameteriv);
2013         AssignGLEntryPoint(loadProcAddress("glTexSubImage2D"), &texSubImage2D);
2014         AssignGLEntryPoint(loadProcAddress("glUniform1f"), &uniform1f);
2015         AssignGLEntryPoint(loadProcAddress("glUniform1fv"), &uniform1fv);
2016         AssignGLEntryPoint(loadProcAddress("glUniform1i"), &uniform1i);
2017         AssignGLEntryPoint(loadProcAddress("glUniform1iv"), &uniform1iv);
2018         AssignGLEntryPoint(loadProcAddress("glUniform2f"), &uniform2f);
2019         AssignGLEntryPoint(loadProcAddress("glUniform2fv"), &uniform2fv);
2020         AssignGLEntryPoint(loadProcAddress("glUniform2i"), &uniform2i);
2021         AssignGLEntryPoint(loadProcAddress("glUniform2iv"), &uniform2iv);
2022         AssignGLEntryPoint(loadProcAddress("glUniform3f"), &uniform3f);
2023         AssignGLEntryPoint(loadProcAddress("glUniform3fv"), &uniform3fv);
2024         AssignGLEntryPoint(loadProcAddress("glUniform3i"), &uniform3i);
2025         AssignGLEntryPoint(loadProcAddress("glUniform3iv"), &uniform3iv);
2026         AssignGLEntryPoint(loadProcAddress("glUniform4f"), &uniform4f);
2027         AssignGLEntryPoint(loadProcAddress("glUniform4fv"), &uniform4fv);
2028         AssignGLEntryPoint(loadProcAddress("glUniform4i"), &uniform4i);
2029         AssignGLEntryPoint(loadProcAddress("glUniform4iv"), &uniform4iv);
2030         AssignGLEntryPoint(loadProcAddress("glUniformMatrix2fv"), &uniformMatrix2fv);
2031         AssignGLEntryPoint(loadProcAddress("glUniformMatrix3fv"), &uniformMatrix3fv);
2032         AssignGLEntryPoint(loadProcAddress("glUniformMatrix4fv"), &uniformMatrix4fv);
2033         AssignGLEntryPoint(loadProcAddress("glUseProgram"), &useProgram);
2034         AssignGLEntryPoint(loadProcAddress("glValidateProgram"), &validateProgram);
2035         AssignGLEntryPoint(loadProcAddress("glVertexAttrib1f"), &vertexAttrib1f);
2036         AssignGLEntryPoint(loadProcAddress("glVertexAttrib1fv"), &vertexAttrib1fv);
2037         AssignGLEntryPoint(loadProcAddress("glVertexAttrib2f"), &vertexAttrib2f);
2038         AssignGLEntryPoint(loadProcAddress("glVertexAttrib2fv"), &vertexAttrib2fv);
2039         AssignGLEntryPoint(loadProcAddress("glVertexAttrib3f"), &vertexAttrib3f);
2040         AssignGLEntryPoint(loadProcAddress("glVertexAttrib3fv"), &vertexAttrib3fv);
2041         AssignGLEntryPoint(loadProcAddress("glVertexAttrib4f"), &vertexAttrib4f);
2042         AssignGLEntryPoint(loadProcAddress("glVertexAttrib4fv"), &vertexAttrib4fv);
2043         AssignGLEntryPoint(loadProcAddress("glVertexAttribPointer"), &vertexAttribPointer);
2044         AssignGLEntryPoint(loadProcAddress("glViewport"), &viewport);
2045     }
2046 
2047     // 3.0
2048     if (isAtLeastGLES(gl::Version(3, 0)))
2049     {
2050         AssignGLEntryPoint(loadProcAddress("glReadBuffer"), &readBuffer);
2051         AssignGLEntryPoint(loadProcAddress("glDrawRangeElements"), &drawRangeElements);
2052         AssignGLEntryPoint(loadProcAddress("glTexImage3D"), &texImage3D);
2053         AssignGLEntryPoint(loadProcAddress("glTexSubImage3D"), &texSubImage3D);
2054         AssignGLEntryPoint(loadProcAddress("glCopyTexSubImage3D"), &copyTexSubImage3D);
2055         AssignGLEntryPoint(loadProcAddress("glCompressedTexImage3D"), &compressedTexImage3D);
2056         AssignGLEntryPoint(loadProcAddress("glCompressedTexSubImage3D"), &compressedTexSubImage3D);
2057         AssignGLEntryPoint(loadProcAddress("glGenQueries"), &genQueries);
2058         AssignGLEntryPoint(loadProcAddress("glDeleteQueries"), &deleteQueries);
2059         AssignGLEntryPoint(loadProcAddress("glIsQuery"), &isQuery);
2060         AssignGLEntryPoint(loadProcAddress("glBeginQuery"), &beginQuery);
2061         AssignGLEntryPoint(loadProcAddress("glEndQuery"), &endQuery);
2062         AssignGLEntryPoint(loadProcAddress("glGetQueryiv"), &getQueryiv);
2063         AssignGLEntryPoint(loadProcAddress("glGetQueryObjectuiv"), &getQueryObjectuiv);
2064         AssignGLEntryPoint(loadProcAddress("glUnmapBuffer"), &unmapBuffer);
2065         AssignGLEntryPoint(loadProcAddress("glGetBufferPointerv"), &getBufferPointerv);
2066         AssignGLEntryPoint(loadProcAddress("glDrawBuffers"), &drawBuffers);
2067         AssignGLEntryPoint(loadProcAddress("glUniformMatrix2x3fv"), &uniformMatrix2x3fv);
2068         AssignGLEntryPoint(loadProcAddress("glUniformMatrix3x2fv"), &uniformMatrix3x2fv);
2069         AssignGLEntryPoint(loadProcAddress("glUniformMatrix2x4fv"), &uniformMatrix2x4fv);
2070         AssignGLEntryPoint(loadProcAddress("glUniformMatrix4x2fv"), &uniformMatrix4x2fv);
2071         AssignGLEntryPoint(loadProcAddress("glUniformMatrix3x4fv"), &uniformMatrix3x4fv);
2072         AssignGLEntryPoint(loadProcAddress("glUniformMatrix4x3fv"), &uniformMatrix4x3fv);
2073         AssignGLEntryPoint(loadProcAddress("glBlitFramebuffer"), &blitFramebuffer);
2074         AssignGLEntryPoint(loadProcAddress("glRenderbufferStorageMultisample"), &renderbufferStorageMultisample);
2075         AssignGLEntryPoint(loadProcAddress("glFramebufferTextureLayer"), &framebufferTextureLayer);
2076         AssignGLEntryPoint(loadProcAddress("glMapBufferRange"), &mapBufferRange);
2077         AssignGLEntryPoint(loadProcAddress("glFlushMappedBufferRange"), &flushMappedBufferRange);
2078         AssignGLEntryPoint(loadProcAddress("glBindVertexArray"), &bindVertexArray);
2079         AssignGLEntryPoint(loadProcAddress("glDeleteVertexArrays"), &deleteVertexArrays);
2080         AssignGLEntryPoint(loadProcAddress("glGenVertexArrays"), &genVertexArrays);
2081         AssignGLEntryPoint(loadProcAddress("glIsVertexArray"), &isVertexArray);
2082         AssignGLEntryPoint(loadProcAddress("glGetIntegeri_v"), &getIntegeri_v);
2083         AssignGLEntryPoint(loadProcAddress("glBeginTransformFeedback"), &beginTransformFeedback);
2084         AssignGLEntryPoint(loadProcAddress("glEndTransformFeedback"), &endTransformFeedback);
2085         AssignGLEntryPoint(loadProcAddress("glBindBufferRange"), &bindBufferRange);
2086         AssignGLEntryPoint(loadProcAddress("glBindBufferBase"), &bindBufferBase);
2087         AssignGLEntryPoint(loadProcAddress("glTransformFeedbackVaryings"), &transformFeedbackVaryings);
2088         AssignGLEntryPoint(loadProcAddress("glGetTransformFeedbackVarying"), &getTransformFeedbackVarying);
2089         AssignGLEntryPoint(loadProcAddress("glVertexAttribIPointer"), &vertexAttribIPointer);
2090         AssignGLEntryPoint(loadProcAddress("glGetVertexAttribIiv"), &getVertexAttribIiv);
2091         AssignGLEntryPoint(loadProcAddress("glGetVertexAttribIuiv"), &getVertexAttribIuiv);
2092         AssignGLEntryPoint(loadProcAddress("glVertexAttribI4i"), &vertexAttribI4i);
2093         AssignGLEntryPoint(loadProcAddress("glVertexAttribI4ui"), &vertexAttribI4ui);
2094         AssignGLEntryPoint(loadProcAddress("glVertexAttribI4iv"), &vertexAttribI4iv);
2095         AssignGLEntryPoint(loadProcAddress("glVertexAttribI4uiv"), &vertexAttribI4uiv);
2096         AssignGLEntryPoint(loadProcAddress("glGetUniformuiv"), &getUniformuiv);
2097         AssignGLEntryPoint(loadProcAddress("glGetFragDataLocation"), &getFragDataLocation);
2098         AssignGLEntryPoint(loadProcAddress("glUniform1ui"), &uniform1ui);
2099         AssignGLEntryPoint(loadProcAddress("glUniform2ui"), &uniform2ui);
2100         AssignGLEntryPoint(loadProcAddress("glUniform3ui"), &uniform3ui);
2101         AssignGLEntryPoint(loadProcAddress("glUniform4ui"), &uniform4ui);
2102         AssignGLEntryPoint(loadProcAddress("glUniform1uiv"), &uniform1uiv);
2103         AssignGLEntryPoint(loadProcAddress("glUniform2uiv"), &uniform2uiv);
2104         AssignGLEntryPoint(loadProcAddress("glUniform3uiv"), &uniform3uiv);
2105         AssignGLEntryPoint(loadProcAddress("glUniform4uiv"), &uniform4uiv);
2106         AssignGLEntryPoint(loadProcAddress("glClearBufferiv"), &clearBufferiv);
2107         AssignGLEntryPoint(loadProcAddress("glClearBufferuiv"), &clearBufferuiv);
2108         AssignGLEntryPoint(loadProcAddress("glClearBufferfv"), &clearBufferfv);
2109         AssignGLEntryPoint(loadProcAddress("glClearBufferfi"), &clearBufferfi);
2110         AssignGLEntryPoint(loadProcAddress("glGetStringi"), &getStringi);
2111         AssignGLEntryPoint(loadProcAddress("glCopyBufferSubData"), &copyBufferSubData);
2112         AssignGLEntryPoint(loadProcAddress("glGetUniformIndices"), &getUniformIndices);
2113         AssignGLEntryPoint(loadProcAddress("glGetActiveUniformsiv"), &getActiveUniformsiv);
2114         AssignGLEntryPoint(loadProcAddress("glGetUniformBlockIndex"), &getUniformBlockIndex);
2115         AssignGLEntryPoint(loadProcAddress("glGetActiveUniformBlockiv"), &getActiveUniformBlockiv);
2116         AssignGLEntryPoint(loadProcAddress("glGetActiveUniformBlockName"), &getActiveUniformBlockName);
2117         AssignGLEntryPoint(loadProcAddress("glUniformBlockBinding"), &uniformBlockBinding);
2118         AssignGLEntryPoint(loadProcAddress("glDrawArraysInstanced"), &drawArraysInstanced);
2119         AssignGLEntryPoint(loadProcAddress("glDrawElementsInstanced"), &drawElementsInstanced);
2120         AssignGLEntryPoint(loadProcAddress("glFenceSync"), &fenceSync);
2121         AssignGLEntryPoint(loadProcAddress("glIsSync"), &isSync);
2122         AssignGLEntryPoint(loadProcAddress("glDeleteSync"), &deleteSync);
2123         AssignGLEntryPoint(loadProcAddress("glClientWaitSync"), &clientWaitSync);
2124         AssignGLEntryPoint(loadProcAddress("glWaitSync"), &waitSync);
2125         AssignGLEntryPoint(loadProcAddress("glGetInteger64v"), &getInteger64v);
2126         AssignGLEntryPoint(loadProcAddress("glGetSynciv"), &getSynciv);
2127         AssignGLEntryPoint(loadProcAddress("glGetInteger64i_v"), &getInteger64i_v);
2128         AssignGLEntryPoint(loadProcAddress("glGetBufferParameteri64v"), &getBufferParameteri64v);
2129         AssignGLEntryPoint(loadProcAddress("glGenSamplers"), &genSamplers);
2130         AssignGLEntryPoint(loadProcAddress("glDeleteSamplers"), &deleteSamplers);
2131         AssignGLEntryPoint(loadProcAddress("glIsSampler"), &isSampler);
2132         AssignGLEntryPoint(loadProcAddress("glBindSampler"), &bindSampler);
2133         AssignGLEntryPoint(loadProcAddress("glSamplerParameteri"), &samplerParameteri);
2134         AssignGLEntryPoint(loadProcAddress("glSamplerParameteriv"), &samplerParameteriv);
2135         AssignGLEntryPoint(loadProcAddress("glSamplerParameterf"), &samplerParameterf);
2136         AssignGLEntryPoint(loadProcAddress("glSamplerParameterfv"), &samplerParameterfv);
2137         AssignGLEntryPoint(loadProcAddress("glGetSamplerParameteriv"), &getSamplerParameteriv);
2138         AssignGLEntryPoint(loadProcAddress("glGetSamplerParameterfv"), &getSamplerParameterfv);
2139         AssignGLEntryPoint(loadProcAddress("glVertexAttribDivisor"), &vertexAttribDivisor);
2140         AssignGLEntryPoint(loadProcAddress("glBindTransformFeedback"), &bindTransformFeedback);
2141         AssignGLEntryPoint(loadProcAddress("glDeleteTransformFeedbacks"), &deleteTransformFeedbacks);
2142         AssignGLEntryPoint(loadProcAddress("glGenTransformFeedbacks"), &genTransformFeedbacks);
2143         AssignGLEntryPoint(loadProcAddress("glIsTransformFeedback"), &isTransformFeedback);
2144         AssignGLEntryPoint(loadProcAddress("glPauseTransformFeedback"), &pauseTransformFeedback);
2145         AssignGLEntryPoint(loadProcAddress("glResumeTransformFeedback"), &resumeTransformFeedback);
2146         AssignGLEntryPoint(loadProcAddress("glGetProgramBinary"), &getProgramBinary);
2147         AssignGLEntryPoint(loadProcAddress("glProgramBinary"), &programBinary);
2148         AssignGLEntryPoint(loadProcAddress("glProgramParameteri"), &programParameteri);
2149         AssignGLEntryPoint(loadProcAddress("glInvalidateFramebuffer"), &invalidateFramebuffer);
2150         AssignGLEntryPoint(loadProcAddress("glInvalidateSubFramebuffer"), &invalidateSubFramebuffer);
2151         AssignGLEntryPoint(loadProcAddress("glTexStorage2D"), &texStorage2D);
2152         AssignGLEntryPoint(loadProcAddress("glTexStorage3D"), &texStorage3D);
2153         AssignGLEntryPoint(loadProcAddress("glGetInternalformativ"), &getInternalformativ);
2154     }
2155 
2156     // 3.1
2157     if (isAtLeastGLES(gl::Version(3, 1)))
2158     {
2159         AssignGLEntryPoint(loadProcAddress("glDispatchCompute"), &dispatchCompute);
2160         AssignGLEntryPoint(loadProcAddress("glDispatchComputeIndirect"), &dispatchComputeIndirect);
2161         AssignGLEntryPoint(loadProcAddress("glDrawArraysIndirect"), &drawArraysIndirect);
2162         AssignGLEntryPoint(loadProcAddress("glDrawElementsIndirect"), &drawElementsIndirect);
2163         AssignGLEntryPoint(loadProcAddress("glFramebufferParameteri"), &framebufferParameteri);
2164         AssignGLEntryPoint(loadProcAddress("glGetFramebufferParameteriv"), &getFramebufferParameteriv);
2165         AssignGLEntryPoint(loadProcAddress("glGetProgramInterfaceiv"), &getProgramInterfaceiv);
2166         AssignGLEntryPoint(loadProcAddress("glGetProgramResourceIndex"), &getProgramResourceIndex);
2167         AssignGLEntryPoint(loadProcAddress("glGetProgramResourceName"), &getProgramResourceName);
2168         AssignGLEntryPoint(loadProcAddress("glGetProgramResourceiv"), &getProgramResourceiv);
2169         AssignGLEntryPoint(loadProcAddress("glGetProgramResourceLocation"), &getProgramResourceLocation);
2170         AssignGLEntryPoint(loadProcAddress("glUseProgramStages"), &useProgramStages);
2171         AssignGLEntryPoint(loadProcAddress("glActiveShaderProgram"), &activeShaderProgram);
2172         AssignGLEntryPoint(loadProcAddress("glCreateShaderProgramv"), &createShaderProgramv);
2173         AssignGLEntryPoint(loadProcAddress("glBindProgramPipeline"), &bindProgramPipeline);
2174         AssignGLEntryPoint(loadProcAddress("glDeleteProgramPipelines"), &deleteProgramPipelines);
2175         AssignGLEntryPoint(loadProcAddress("glGenProgramPipelines"), &genProgramPipelines);
2176         AssignGLEntryPoint(loadProcAddress("glIsProgramPipeline"), &isProgramPipeline);
2177         AssignGLEntryPoint(loadProcAddress("glGetProgramPipelineiv"), &getProgramPipelineiv);
2178         AssignGLEntryPoint(loadProcAddress("glProgramUniform1i"), &programUniform1i);
2179         AssignGLEntryPoint(loadProcAddress("glProgramUniform2i"), &programUniform2i);
2180         AssignGLEntryPoint(loadProcAddress("glProgramUniform3i"), &programUniform3i);
2181         AssignGLEntryPoint(loadProcAddress("glProgramUniform4i"), &programUniform4i);
2182         AssignGLEntryPoint(loadProcAddress("glProgramUniform1ui"), &programUniform1ui);
2183         AssignGLEntryPoint(loadProcAddress("glProgramUniform2ui"), &programUniform2ui);
2184         AssignGLEntryPoint(loadProcAddress("glProgramUniform3ui"), &programUniform3ui);
2185         AssignGLEntryPoint(loadProcAddress("glProgramUniform4ui"), &programUniform4ui);
2186         AssignGLEntryPoint(loadProcAddress("glProgramUniform1f"), &programUniform1f);
2187         AssignGLEntryPoint(loadProcAddress("glProgramUniform2f"), &programUniform2f);
2188         AssignGLEntryPoint(loadProcAddress("glProgramUniform3f"), &programUniform3f);
2189         AssignGLEntryPoint(loadProcAddress("glProgramUniform4f"), &programUniform4f);
2190         AssignGLEntryPoint(loadProcAddress("glProgramUniform1iv"), &programUniform1iv);
2191         AssignGLEntryPoint(loadProcAddress("glProgramUniform2iv"), &programUniform2iv);
2192         AssignGLEntryPoint(loadProcAddress("glProgramUniform3iv"), &programUniform3iv);
2193         AssignGLEntryPoint(loadProcAddress("glProgramUniform4iv"), &programUniform4iv);
2194         AssignGLEntryPoint(loadProcAddress("glProgramUniform1uiv"), &programUniform1uiv);
2195         AssignGLEntryPoint(loadProcAddress("glProgramUniform2uiv"), &programUniform2uiv);
2196         AssignGLEntryPoint(loadProcAddress("glProgramUniform3uiv"), &programUniform3uiv);
2197         AssignGLEntryPoint(loadProcAddress("glProgramUniform4uiv"), &programUniform4uiv);
2198         AssignGLEntryPoint(loadProcAddress("glProgramUniform1fv"), &programUniform1fv);
2199         AssignGLEntryPoint(loadProcAddress("glProgramUniform2fv"), &programUniform2fv);
2200         AssignGLEntryPoint(loadProcAddress("glProgramUniform3fv"), &programUniform3fv);
2201         AssignGLEntryPoint(loadProcAddress("glProgramUniform4fv"), &programUniform4fv);
2202         AssignGLEntryPoint(loadProcAddress("glProgramUniformMatrix2fv"), &programUniformMatrix2fv);
2203         AssignGLEntryPoint(loadProcAddress("glProgramUniformMatrix3fv"), &programUniformMatrix3fv);
2204         AssignGLEntryPoint(loadProcAddress("glProgramUniformMatrix4fv"), &programUniformMatrix4fv);
2205         AssignGLEntryPoint(loadProcAddress("glProgramUniformMatrix2x3fv"), &programUniformMatrix2x3fv);
2206         AssignGLEntryPoint(loadProcAddress("glProgramUniformMatrix3x2fv"), &programUniformMatrix3x2fv);
2207         AssignGLEntryPoint(loadProcAddress("glProgramUniformMatrix2x4fv"), &programUniformMatrix2x4fv);
2208         AssignGLEntryPoint(loadProcAddress("glProgramUniformMatrix4x2fv"), &programUniformMatrix4x2fv);
2209         AssignGLEntryPoint(loadProcAddress("glProgramUniformMatrix3x4fv"), &programUniformMatrix3x4fv);
2210         AssignGLEntryPoint(loadProcAddress("glProgramUniformMatrix4x3fv"), &programUniformMatrix4x3fv);
2211         AssignGLEntryPoint(loadProcAddress("glValidateProgramPipeline"), &validateProgramPipeline);
2212         AssignGLEntryPoint(loadProcAddress("glGetProgramPipelineInfoLog"), &getProgramPipelineInfoLog);
2213         AssignGLEntryPoint(loadProcAddress("glBindImageTexture"), &bindImageTexture);
2214         AssignGLEntryPoint(loadProcAddress("glGetBooleani_v"), &getBooleani_v);
2215         AssignGLEntryPoint(loadProcAddress("glMemoryBarrier"), &memoryBarrier);
2216         AssignGLEntryPoint(loadProcAddress("glMemoryBarrierByRegion"), &memoryBarrierByRegion);
2217         AssignGLEntryPoint(loadProcAddress("glTexStorage2DMultisample"), &texStorage2DMultisample);
2218         AssignGLEntryPoint(loadProcAddress("glGetMultisamplefv"), &getMultisamplefv);
2219         AssignGLEntryPoint(loadProcAddress("glSampleMaski"), &sampleMaski);
2220         AssignGLEntryPoint(loadProcAddress("glGetTexLevelParameteriv"), &getTexLevelParameteriv);
2221         AssignGLEntryPoint(loadProcAddress("glGetTexLevelParameterfv"), &getTexLevelParameterfv);
2222         AssignGLEntryPoint(loadProcAddress("glBindVertexBuffer"), &bindVertexBuffer);
2223         AssignGLEntryPoint(loadProcAddress("glVertexAttribFormat"), &vertexAttribFormat);
2224         AssignGLEntryPoint(loadProcAddress("glVertexAttribIFormat"), &vertexAttribIFormat);
2225         AssignGLEntryPoint(loadProcAddress("glVertexAttribBinding"), &vertexAttribBinding);
2226         AssignGLEntryPoint(loadProcAddress("glVertexBindingDivisor"), &vertexBindingDivisor);
2227     }
2228 
2229     // 3.2
2230     if (isAtLeastGLES(gl::Version(3, 2)))
2231     {
2232         AssignGLEntryPoint(loadProcAddress("glBlendBarrier"), &blendBarrier);
2233         AssignGLEntryPoint(loadProcAddress("glCopyImageSubData"), &copyImageSubData);
2234         AssignGLEntryPoint(loadProcAddress("glDebugMessageControl"), &debugMessageControl);
2235         AssignGLEntryPoint(loadProcAddress("glDebugMessageInsert"), &debugMessageInsert);
2236         AssignGLEntryPoint(loadProcAddress("glDebugMessageCallback"), &debugMessageCallback);
2237         AssignGLEntryPoint(loadProcAddress("glGetDebugMessageLog"), &getDebugMessageLog);
2238         AssignGLEntryPoint(loadProcAddress("glPushDebugGroup"), &pushDebugGroup);
2239         AssignGLEntryPoint(loadProcAddress("glPopDebugGroup"), &popDebugGroup);
2240         AssignGLEntryPoint(loadProcAddress("glObjectLabel"), &objectLabel);
2241         AssignGLEntryPoint(loadProcAddress("glGetObjectLabel"), &getObjectLabel);
2242         AssignGLEntryPoint(loadProcAddress("glObjectPtrLabel"), &objectPtrLabel);
2243         AssignGLEntryPoint(loadProcAddress("glGetObjectPtrLabel"), &getObjectPtrLabel);
2244         AssignGLEntryPoint(loadProcAddress("glGetPointerv"), &getPointerv);
2245         AssignGLEntryPoint(loadProcAddress("glEnablei"), &enablei);
2246         AssignGLEntryPoint(loadProcAddress("glDisablei"), &disablei);
2247         AssignGLEntryPoint(loadProcAddress("glBlendEquationi"), &blendEquationi);
2248         AssignGLEntryPoint(loadProcAddress("glBlendEquationSeparatei"), &blendEquationSeparatei);
2249         AssignGLEntryPoint(loadProcAddress("glBlendFunci"), &blendFunci);
2250         AssignGLEntryPoint(loadProcAddress("glBlendFuncSeparatei"), &blendFuncSeparatei);
2251         AssignGLEntryPoint(loadProcAddress("glColorMaski"), &colorMaski);
2252         AssignGLEntryPoint(loadProcAddress("glIsEnabledi"), &isEnabledi);
2253         AssignGLEntryPoint(loadProcAddress("glDrawElementsBaseVertex"), &drawElementsBaseVertex);
2254         AssignGLEntryPoint(loadProcAddress("glDrawRangeElementsBaseVertex"), &drawRangeElementsBaseVertex);
2255         AssignGLEntryPoint(loadProcAddress("glDrawElementsInstancedBaseVertex"), &drawElementsInstancedBaseVertex);
2256         AssignGLEntryPoint(loadProcAddress("glFramebufferTexture"), &framebufferTexture);
2257         AssignGLEntryPoint(loadProcAddress("glPrimitiveBoundingBox"), &primitiveBoundingBox);
2258         AssignGLEntryPoint(loadProcAddress("glGetGraphicsResetStatus"), &getGraphicsResetStatus);
2259         AssignGLEntryPoint(loadProcAddress("glReadnPixels"), &readnPixels);
2260         AssignGLEntryPoint(loadProcAddress("glGetnUniformfv"), &getnUniformfv);
2261         AssignGLEntryPoint(loadProcAddress("glGetnUniformiv"), &getnUniformiv);
2262         AssignGLEntryPoint(loadProcAddress("glGetnUniformuiv"), &getnUniformuiv);
2263         AssignGLEntryPoint(loadProcAddress("glMinSampleShading"), &minSampleShading);
2264         AssignGLEntryPoint(loadProcAddress("glPatchParameteri"), &patchParameteri);
2265         AssignGLEntryPoint(loadProcAddress("glTexParameterIiv"), &texParameterIiv);
2266         AssignGLEntryPoint(loadProcAddress("glTexParameterIuiv"), &texParameterIuiv);
2267         AssignGLEntryPoint(loadProcAddress("glGetTexParameterIiv"), &getTexParameterIiv);
2268         AssignGLEntryPoint(loadProcAddress("glGetTexParameterIuiv"), &getTexParameterIuiv);
2269         AssignGLEntryPoint(loadProcAddress("glSamplerParameterIiv"), &samplerParameterIiv);
2270         AssignGLEntryPoint(loadProcAddress("glSamplerParameterIuiv"), &samplerParameterIuiv);
2271         AssignGLEntryPoint(loadProcAddress("glGetSamplerParameterIiv"), &getSamplerParameterIiv);
2272         AssignGLEntryPoint(loadProcAddress("glGetSamplerParameterIuiv"), &getSamplerParameterIuiv);
2273         AssignGLEntryPoint(loadProcAddress("glTexBuffer"), &texBuffer);
2274         AssignGLEntryPoint(loadProcAddress("glTexBufferRange"), &texBufferRange);
2275         AssignGLEntryPoint(loadProcAddress("glTexStorage3DMultisample"), &texStorage3DMultisample);
2276     }
2277 
2278     // clang-format on
2279 }
2280 
isAtLeastGL(const gl::Version & glVersion) const2281 bool FunctionsGL::isAtLeastGL(const gl::Version &glVersion) const
2282 {
2283     return standard == STANDARD_GL_DESKTOP && version >= glVersion;
2284 }
2285 
isAtMostGL(const gl::Version & glVersion) const2286 bool FunctionsGL::isAtMostGL(const gl::Version &glVersion) const
2287 {
2288     return standard == STANDARD_GL_DESKTOP && glVersion >= version;
2289 }
2290 
isAtLeastGLES(const gl::Version & glesVersion) const2291 bool FunctionsGL::isAtLeastGLES(const gl::Version &glesVersion) const
2292 {
2293     return standard == STANDARD_GL_ES && version >= glesVersion;
2294 }
2295 
isAtMostGLES(const gl::Version & glesVersion) const2296 bool FunctionsGL::isAtMostGLES(const gl::Version &glesVersion) const
2297 {
2298     return standard == STANDARD_GL_ES && glesVersion >= version;
2299 }
2300 
hasExtension(const std::string & ext) const2301 bool FunctionsGL::hasExtension(const std::string &ext) const
2302 {
2303     return std::find(extensions.begin(), extensions.end(), ext) != extensions.end();
2304 }
2305 
hasGLExtension(const std::string & ext) const2306 bool FunctionsGL::hasGLExtension(const std::string &ext) const
2307 {
2308     return standard == STANDARD_GL_DESKTOP && hasExtension(ext);
2309 }
2310 
hasGLESExtension(const std::string & ext) const2311 bool FunctionsGL::hasGLESExtension(const std::string &ext) const
2312 {
2313     return standard == STANDARD_GL_ES && hasExtension(ext);
2314 }
2315 
2316 }
2317