1 //          Copyright 2018 - 2021 Michael D. Parker
2 // Distributed under the Boost Software License, Version 1.0.
3 //    (See accompanying file LICENSE_1_0.txt or copy at
4 //          http://www.boost.org/LICENSE_1_0.txt)
5 
6 module bindbc.opengl.bind.arb.arb_01;
7 
8 import bindbc.loader;
9 import bindbc.opengl.config,
10        bindbc.opengl.context;
11 import bindbc.opengl.bind.types;
12 
13 // ARB_bindless_texture
14 version(GL_ARB) enum useARBBindlessTexture = true;
15 else version(GL_ARB_bindless_texture) enum useARBBindlessTexture = true;
16 else enum useARBBindlessTexture = false;
17 
18 static if(useARBBindlessTexture) {
19     private bool _hasARBBindlessTexture;
20     @nogc nothrow bool hasARBBindlessTexture() { return _hasARBBindlessTexture; }
21 
22     enum uint GL_UNSIGNED_INT64_ARB = 0x140F;
23 
24     extern(System) @nogc nothrow  {
25         alias pglGetTextureHandleARB = GLuint64 function(GLuint);
26         alias pglGetTextureSamplerHandleARB = GLuint64 function(GLuint,GLuint);
27         alias pglMakeTextureHandleResidentARB = void function(GLuint64);
28         alias pglMakeTextureHandleNonResidentARB = void function(GLuint64);
29         alias pglGetImageHandleARB = GLuint64 function(GLuint,GLint,GLboolean,GLint,GLenum);
30         alias pglMakeImageHandleResidentARB = void function(GLuint64,GLenum);
31         alias pglMakeImageHandleNonResidentARB = void function(GLuint64);
32         alias pglUniformHandleui64ARB = void function(GLint,GLuint64);
33         alias pglUniformHandleui64vARB = void function(GLint,GLsizei,const(GLuint64)*);
34         alias pglProgramUniformHandleui64ARB = void function(GLuint,GLint,GLuint64);
35         alias pglProgramUniformHandleui64vARB = void function(GLuint,GLint,GLsizei,const(GLuint64)*);
36         alias pglIsTextureHandleResidentARB = GLboolean function(GLuint64);
37         alias pglIsImageHandleResidentARB = GLboolean function(GLuint64);
38         alias pglVertexAttribL1ui64ARB = void function(GLuint,GLuint64);
39         alias pglVertexAttribL1ui64vARB = void function(GLuint,const(GLuint64)*);
40         alias pglGetVertexAttribLui64vARB = void function(GLuint,GLenum,GLuint64*);
41     }
42 
43     __gshared {
44         pglGetTextureHandleARB glGetTextureHandleARB;
45         pglGetTextureSamplerHandleARB glGetTextureSamplerHandleARB;
46         pglMakeTextureHandleResidentARB glMakeTextureHandleResidentARB;
47         pglMakeTextureHandleNonResidentARB glMakeTextureHandleNonResidentARB;
48         pglGetImageHandleARB glGetImageHandleARB;
49         pglMakeImageHandleResidentARB glMakeImageHandleResidentARB;
50         pglMakeImageHandleNonResidentARB glMakeImageHandleNonResidentARB;
51         pglUniformHandleui64ARB glUniformHandleui64ARB;
52         pglUniformHandleui64vARB glUniformHandleui64vARB;
53         pglProgramUniformHandleui64ARB glProgramUniformHandleui64ARB;
54         pglProgramUniformHandleui64vARB glProgramUniformHandleui64vARB;
55         pglIsTextureHandleResidentARB glIsTextureHandleResidentARB;
56         pglIsImageHandleResidentARB glIsImageHandleResidentARB;
57         pglVertexAttribL1ui64ARB glVertexAttribL1ui64ARB;
58         pglVertexAttribL1ui64vARB glVertexAttribL1ui64vARB;
59         pglGetVertexAttribLui64vARB glGetVertexAttribLui64vARB;
60     }
61 
62     private @nogc nothrow
63     bool loadARBBindlessTexture(SharedLib lib, GLSupport contextVersion)
64     {
65         lib.bindGLSymbol(cast(void**)&glGetTextureHandleARB, "glGetTextureHandleARB");
66         lib.bindGLSymbol(cast(void**)&glGetTextureSamplerHandleARB, "glGetTextureSamplerHandleARB");
67         lib.bindGLSymbol(cast(void**)&glMakeTextureHandleResidentARB, "glMakeTextureHandleResidentARB");
68         lib.bindGLSymbol(cast(void**)&glMakeTextureHandleNonResidentARB, "glMakeTextureHandleNonResidentARB");
69         lib.bindGLSymbol(cast(void**)&glGetImageHandleARB, "glGetImageHandleARB");
70         lib.bindGLSymbol(cast(void**)&glMakeImageHandleResidentARB, "glMakeImageHandleResidentARB");
71         lib.bindGLSymbol(cast(void**)&glMakeImageHandleNonResidentARB, "glMakeImageHandleNonResidentARB");
72         lib.bindGLSymbol(cast(void**)&glUniformHandleui64ARB, "glUniformHandleui64ARB");
73         lib.bindGLSymbol(cast(void**)&glUniformHandleui64vARB, "glUniformHandleui64vARB");
74         lib.bindGLSymbol(cast(void**)&glProgramUniformHandleui64ARB, "glProgramUniformHandleui64ARB");
75         lib.bindGLSymbol(cast(void**)&glProgramUniformHandleui64vARB, "glProgramUniformHandleui64vARB");
76         lib.bindGLSymbol(cast(void**)&glIsTextureHandleResidentARB, "glIsTextureHandleResidentARB");
77         lib.bindGLSymbol(cast(void**)&glIsImageHandleResidentARB, "glIsImageHandleResidentARB");
78         lib.bindGLSymbol(cast(void**)&glVertexAttribL1ui64ARB, "glVertexAttribL1ui64ARB");
79         lib.bindGLSymbol(cast(void**)&glVertexAttribL1ui64vARB, "glVertexAttribL1ui64vARB");
80         lib.bindGLSymbol(cast(void**)&glGetVertexAttribLui64vARB, "glGetVertexAttribLui64vARB");
81         return resetErrorCountGL();
82     }
83 }
84 else enum hasARBBindlessTexture = false;
85 
86 // ARB_cl_event
87 version(GL_ARB) enum useARBCLEvent = true;
88 else version(GL_ARB_cl_event) enum useARBCLEvent = true;
89 else enum useARBCLEvent = false;
90 
91 static if(useARBCLEvent) {
92     import bindbc.opengl.bind.arb.core_32 : GLsync;
93     private bool _hasARBCLEvent;
94     @nogc nothrow bool hasARBCLEvent() { return _hasARBCLEvent; }
95 
96     struct _cl_context;
97     struct _cl_event;
98 
99     enum : uint {
100         GL_SYNC_CL_EVENT_ARB              = 0x8240,
101         GL_SYNC_CL_EVENT_COMPLETE_ARB     = 0x8241,
102     }
103 
104     extern(System) @nogc nothrow alias  pglCreateSyncFromCLeventARB = GLsync function(_cl_context*, _cl_event*, GLbitfield);
105     __gshared pglCreateSyncFromCLeventARB glCreateSyncFromCLeventARB;
106 
107     private @nogc nothrow
108     bool loadARBCLEvent(SharedLib lib, GLSupport contextVersion)
109     {
110         lib.bindGLSymbol(cast(void**)&glCreateSyncFromCLeventARB, "glCreateSyncFromCLeventARB");
111         return resetErrorCountGL();
112     }
113 }
114 else enum hasARBCLEvent = false;
115 
116 // ARB_compute_variable_group_size
117 version(GL_ARB) enum useARBComputeVariableGroupSize = true;
118 else version(GL_ARB_compute_variable_group_size) enum useARBComputeVariableGroupSize = true;
119 else enum useARBComputeVariableGroupSize = false;
120 
121 static if(useARBComputeVariableGroupSize) {
122     private bool _hasARBComputeVariableGroupSize;
123     @nogc nothrow bool hasARBComputeVariableGroupSize() { return _hasARBComputeVariableGroupSize; }
124 
125     enum : uint {
126         GL_MAX_COMPUTE_VARIABLE_GROUP_INVOCATIONS_ARB   = 0x9344,
127         GL_MAX_COMPUTE_FIXED_GROUP_INVOCATIONS_ARB      = 0x90EB,
128         GL_MAX_COMPUTE_VARIABLE_GROUP_SIZE_ARB          = 0x9345,
129         GL_MAX_COMPUTE_FIXED_GROUP_SIZE_ARB             = 0x91BF,
130     }
131 
132     extern(System) @nogc nothrow alias  pglDispatchComputeGroupSizeARB = GLsync function(GLuint,GLuint,GLuint,GLuint,GLuint,GLuint);
133     __gshared pglDispatchComputeGroupSizeARB glDispatchComputeGroupSizeARB;
134 
135     private @nogc nothrow
136     bool loadARBComputeVariableGroupSize(SharedLib lib, GLSupport contextVersion)
137     {
138         lib.bindGLSymbol(cast(void**)&glDispatchComputeGroupSizeARB, "glDispatchComputeGroupSizeARB");
139         return resetErrorCountGL();
140     }
141 }
142 else enum hasARBComputeVariableGroupSize = false;
143 
144 // ARB_debug_output
145 version(GL_ARB) enum useARBDebugOutput = true;
146 else version(GL_ARB_debug_output) enum useARBDebugOutput = true;
147 else enum useARBDebugOutput = false;
148 
149 static if(useARBDebugOutput) {
150     private bool _hasARBDebugOutput;
151     @nogc nothrow bool hasARBDebugOutput() { return _hasARBDebugOutput; }
152 
153     enum : uint {
154         GL_DEBUG_OUTPUT_SYNCHRONOUS_ARB   = 0x8242,
155         GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH_ARB = 0x8243,
156         GL_DEBUG_CALLBACK_FUNCTION_ARB    = 0x8244,
157         GL_DEBUG_CALLBACK_USER_PARAM_ARB  = 0x8245,
158         GL_DEBUG_SOURCE_API_ARB           = 0x8246,
159         GL_DEBUG_SOURCE_WINDOW_SYSTEM_ARB = 0x8247,
160         GL_DEBUG_SOURCE_SHADER_COMPILER_ARB = 0x8248,
161         GL_DEBUG_SOURCE_THIRD_PARTY_ARB   = 0x8249,
162         GL_DEBUG_SOURCE_APPLICATION_ARB   = 0x824A,
163         GL_DEBUG_SOURCE_OTHER_ARB         = 0x824B,
164         GL_DEBUG_TYPE_ERROR_ARB           = 0x824C,
165         GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR_ARB = 0x824D,
166         GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR_ARB = 0x824E,
167         GL_DEBUG_TYPE_PORTABILITY_ARB     = 0x824F,
168         GL_DEBUG_TYPE_PERFORMANCE_ARB     = 0x8250,
169         GL_DEBUG_TYPE_OTHER_ARB           = 0x8251,
170         GL_MAX_DEBUG_MESSAGE_LENGTH_ARB   = 0x9143,
171         GL_MAX_DEBUG_LOGGED_MESSAGES_ARB  = 0x9144,
172         GL_DEBUG_LOGGED_MESSAGES_ARB      = 0x9145,
173         GL_DEBUG_SEVERITY_HIGH_ARB        = 0x9146,
174         GL_DEBUG_SEVERITY_MEDIUM_ARB      = 0x9147,
175         GL_DEBUG_SEVERITY_LOW_ARB         = 0x9148,
176     }
177 
178     extern(System) nothrow {
179         alias GLDEBUGPROCARB = void function(GLenum,GLenum,GLuint,GLenum,GLsizei,in GLchar*,GLvoid*);
180         alias GLDEBUGPROCAMD = void function(GLuint,GLenum,GLenum,GLsizei,in GLchar*,GLvoid*);
181     }
182 
183     extern(System) @nogc nothrow  {
184         alias pglDebugMessageControlARB = void function(GLenum,GLenum,GLenum,GLsizei,const(GLuint)*,GLboolean);
185         alias pglDebugMessageInsertARB = void function(GLenum,GLenum,GLuint,GLenum,GLsizei,const(GLchar)*);
186         alias pglGetDebugMessageLogARB = void function(GLuint,GLsizei,GLenum*,GLenum*,GLuint*,GLenum*,GLsizei*,GLchar*);
187         alias pglDebugMessageCallbackARB = void function(GLDEBUGPROCARB,const(GLvoid)*);
188     }
189 
190     __gshared {
191         pglDebugMessageControlARB glDebugMessageControlARB;
192         pglDebugMessageInsertARB glDebugMessageInsertARB;
193         pglDebugMessageCallbackARB glDebugMessageCallbackARB;
194         pglGetDebugMessageLogARB glGetDebugMessageLogARB;
195     }
196 
197     private @nogc nothrow
198     bool loadARBDebugOutput(SharedLib lib, GLSupport contextVersion)
199     {
200         lib.bindGLSymbol(cast(void**)&glDebugMessageControlARB, "glDebugMessageControlARB");
201         lib.bindGLSymbol(cast(void**)&glDebugMessageInsertARB, "glDebugMessageInsertARB");
202         lib.bindGLSymbol(cast(void**)&glDebugMessageCallbackARB, "glDebugMessageCallbackARB");
203         lib.bindGLSymbol(cast(void**)&glGetDebugMessageLogARB, "glGetDebugMessageLogARB");
204         return resetErrorCountGL();
205     }
206 }
207 else enum hasARBDebugOutput = false;
208 
209 // ARB_framebuffer_sRGB
210 version(GL_ARB) enum useARBFramebufferSRGB = true;
211 else version(GL_ARB_framebuffer_sRGB) enum useARBFramebufferSRGB = true;
212 else enum useARBFramebufferSRGB = false;
213 
214 static if(useARBFramebufferSRGB) {
215     private bool _hasARBFramebufferSRGB;
216     @nogc nothrow bool hasARBFramebufferSRGB() { return _hasARBFramebufferSRGB; }
217 
218     enum uint GL_FRAMEBUFFER_SRGB = 0x8DB9;
219 }
220 else enum hasARBFramebufferSRGB = false;
221 
222 // ARB_geometry_shader4
223 version(GL_ARB) enum useARBGeometryShader4 = true;
224 else version(GL_ARB_geometry_shader4) enum useARBGeometryShader4 = true;
225 else enum useARBGeometryShader4 = false;
226 
227 static if(useARBGeometryShader4) {
228     private bool _hasARBGeometryShader4;
229     @nogc nothrow bool hasARBGeometryShader4() { return _hasARBGeometryShader4; }
230 
231     enum : uint {
232         GL_LINES_ADJACENCY_ARB            = 0x000A,
233         GL_LINE_STRIP_ADJACENCY_ARB       = 0x000B,
234         GL_TRIANGLES_ADJACENCY_ARB        = 0x000C,
235         GL_TRIANGLE_STRIP_ADJACENCY_ARB   = 0x000D,
236         GL_PROGRAM_POINT_SIZE_ARB         = 0x8642,
237         GL_MAX_GEOMETRY_TEXTURE_IMAGE_UNITS_ARB = 0x8C29,
238         GL_FRAMEBUFFER_ATTACHMENT_LAYERED_ARB = 0x8DA7,
239         GL_FRAMEBUFFER_INCOMPLETE_LAYER_TARGETS_ARB = 0x8DA8,
240         GL_FRAMEBUFFER_INCOMPLETE_LAYER_COUNT_ARB = 0x8DA9,
241         GL_GEOMETRY_SHADER_ARB            = 0x8DD9,
242         GL_GEOMETRY_VERTICES_OUT_ARB      = 0x8DDA,
243         GL_GEOMETRY_INPUT_TYPE_ARB        = 0x8DDB,
244         GL_GEOMETRY_OUTPUT_TYPE_ARB       = 0x8DDC,
245         GL_MAX_GEOMETRY_VARYING_COMPONENTS_ARB = 0x8DDD,
246         GL_MAX_VERTEX_VARYING_COMPONENTS_ARB = 0x8DDE,
247         GL_MAX_GEOMETRY_UNIFORM_COMPONENTS_ARB = 0x8DDF,
248         GL_MAX_GEOMETRY_OUTPUT_VERTICES_ARB = 0x8DE0,
249         GL_MAX_GEOMETRY_TOTAL_OUTPUT_COMPONENTS_ARB = 0x8DE1,
250     }
251 
252     extern(System) @nogc nothrow  {
253         alias pglProgramParameteriARB = void function(GLuint,GLenum,GLint);
254         alias pglFramebufferTextureARB = void function(GLuint,GLenum,GLuint,GLint);
255         alias pglFramebufferTextureLayerARB = void function(GLuint,GLenum,GLuint,GLint,GLint);
256         alias pglFramebufferTextureFaceARB = void function(GLuint,GLenum,GLuint,GLint,GLenum);
257     }
258 
259     __gshared {
260         pglProgramParameteriARB glProgramParameteriARB;
261         pglFramebufferTextureARB glFramebufferTextureARB;
262         pglFramebufferTextureLayerARB glFramebufferTextureLayerARB;
263         pglFramebufferTextureFaceARB glFramebufferTextureFaceARB;
264     }
265 
266     private @nogc nothrow
267     bool loadARBGeometryShader4(SharedLib lib, GLSupport contextVersion)
268     {
269         lib.bindGLSymbol(cast(void**)&glProgramParameteriARB,"glProgramParameteriARB");
270         lib.bindGLSymbol(cast(void**)&glFramebufferTextureARB,"glFramebufferTextureARB");
271         lib.bindGLSymbol(cast(void**)&glFramebufferTextureLayerARB,"glFramebufferTextureLayerARB");
272         lib.bindGLSymbol(cast(void**)&glFramebufferTextureFaceARB,"glFramebufferTextureFaceARB");
273         return resetErrorCountGL();
274     }
275 }
276 else enum hasARBGeometryShader4 = false;
277 
278 // ARB_gl_spirv
279 version(GL_ARB) enum useARBGLSPIRV = true;
280 else version(GL_ARB_gl_spirv) enum useARBGLSPIRV = true;
281 else enum useARBGLSPIRV = false;
282 
283 static if(useARBGLSPIRV) {
284     private bool _hasARBGLSPIRV;
285     @nogc nothrow bool hasARBGLSPIRV() { return _hasARBGLSPIRV; }
286 
287     enum : uint {
288         GL_SHADER_BINARY_FORMAT_SPIR_V_ARB = 0x9551,
289         GL_SPIR_V_BINARY_ARB               = 0x9552,
290     }
291 
292     extern(System) @nogc nothrow
293     alias pglSpecializeShaderARB = void function(GLuint,const(char)*,GLuint,const(GLuint)*,const(GLuint)*);
294 
295     __gshared pglSpecializeShaderARB glSpecializeShaderARB;
296 
297     private @nogc nothrow
298     bool loadARBGLSPIRV(SharedLib lib, GLSupport contextVersion)
299     {
300         lib.bindGLSymbol(cast(void**)&glSpecializeShaderARB,"glSpecializeShaderARB");
301         return resetErrorCountGL();
302     }
303 }
304 else enum hasARBGLSPIRV = false;
305 
306 // ARB_gpu_shader_int64
307 version(GL_ARB) enum useARBGPUShaderInt64 = true;
308 else version(GL_ARB_gpu_shader_int64) enum useARBGPUShaderInt64 = true;
309 else enum useARBGPUShaderInt64 = false;
310 
311 static if(useARBGPUShaderInt64) {
312     private bool _hasARBGPUShaderInt64;
313     @nogc nothrow bool hasARBGPUShaderInt64() { return _hasARBGPUShaderInt64; }
314 
315     enum : uint {
316         GL_INT64_ARB                      = 0x140E,
317         GL_INT64_VEC2_ARB                 = 0x8FE9,
318         GL_INT64_VEC3_ARB                 = 0x8FEA,
319         GL_INT64_VEC4_ARB                 = 0x8FEB,
320         GL_UNSIGNED_INT64_VEC2_ARB        = 0x8FF5,
321         GL_UNSIGNED_INT64_VEC3_ARB        = 0x8FF6,
322         GL_UNSIGNED_INT64_VEC4_ARB        = 0x8FF7,
323     }
324 
325     extern(System) @nogc nothrow  {
326         alias pglUniform1i64ARB = void function(GLint,GLint64);
327         alias pglUniform2i64ARB = void function(GLint,GLint64,GLint64);
328         alias pglUniform3i64ARB = void function(GLint,GLint64,GLint64,GLint64);
329         alias pglUniform4i64ARB = void function(GLint,GLint64,GLint64,GLint64,GLint64);
330         alias pglUniform1i64vARB = void function(GLint,GLsizei,const(GLint64)*);
331         alias pglUniform2i64vARB = void function(GLint,GLsizei,const(GLint64)*);
332         alias pglUniform3i64vARB = void function(GLint,GLsizei,const(GLint64)*);
333         alias pglUniform4i64vARB = void function(GLint,GLsizei,const(GLint64)*);
334         alias pglUniform1ui64ARB = void function(GLint,GLuint64);
335         alias pglUniform2ui64ARB = void function(GLint,GLuint64,GLuint64);
336         alias pglUniform3ui64ARB = void function(GLint,GLuint64,GLuint64,GLuint64);
337         alias pglUniform4ui64ARB = void function(GLint,GLuint64,GLuint64,GLuint64,GLuint64);
338         alias pglUniform1ui64vARB = void function(GLint,GLsizei,const(GLuint64)*);
339         alias pglUniform2ui64vARB = void function(GLint,GLsizei,const(GLuint64)*);
340         alias pglUniform3ui64vARB = void function(GLint,GLsizei,const(GLuint64)*);
341         alias pglUniform4ui64vARB = void function(GLint,GLsizei,const(GLuint64)*);
342         alias pglGetUniformi64vARB = void function(GLuint,GLint,GLint64*);
343         alias pglGetUniformui64vARB = void function(GLuint,GLint,GLuint64*);
344         alias pglGetnUniformi64vARB = void function(GLuint,GLint,GLsizei,GLint64*);
345         alias pglGetnUniformui64vARB = void function(GLuint,GLint,GLsizei,GLuint64*);
346         alias pglProgramUniform1i64ARB = void function(GLuint,GLint,GLint64);
347         alias pglProgramUniform2i64ARB = void function(GLuint,GLint,GLint64,GLint64);
348         alias pglProgramUniform3i64ARB = void function(GLuint,GLint,GLint64,GLint64,GLint64);
349         alias pglProgramUniform4i64ARB = void function(GLuint,GLint,GLint64,GLint64,GLint64,GLint64);
350         alias pglProgramUniform1i64vARB = void function(GLuint,GLint,GLsizei,const(GLint64)*);
351         alias pglProgramUniform2i64vARB = void function(GLuint,GLint,GLsizei,const(GLint64)*);
352         alias pglProgramUniform3i64vARB = void function(GLuint,GLint,GLsizei,const(GLint64)*);
353         alias pglProgramUniform4i64vARB = void function(GLuint,GLint,GLsizei,const(GLint64)*);
354         alias pglProgramUniform1ui64ARB = void function(GLuint,GLint,GLsizei,GLuint64);
355         alias pglProgramUniform2ui64ARB = void function(GLuint,GLint,GLsizei,GLuint64,GLuint64);
356         alias pglProgramUniform3ui64ARB = void function(GLuint,GLint,GLsizei,GLuint64,GLuint64,GLuint64);
357         alias pglProgramUniform4ui64ARB = void function(GLuint,GLint,GLsizei,GLuint64,GLuint64,GLuint64,GLuint64);
358         alias pglProgramUniform1ui64vARB = void function(GLuint,GLint,GLsizei,const(GLuint)*);
359         alias pglProgramUniform2ui64vARB = void function(GLuint,GLint,GLsizei,const(GLuint)*);
360         alias pglProgramUniform3ui64vARB = void function(GLuint,GLint,GLsizei,const(GLuint)*);
361         alias pglProgramUniform4ui64vARB = void function(GLuint,GLint,GLsizei,const(GLuint)*);
362     }
363 
364     __gshared {
365         pglUniform1i64ARB glUniform1i64ARB;
366         pglUniform2i64ARB glUniform2i64ARB;
367         pglUniform3i64ARB glUniform3i64ARB;
368         pglUniform4i64ARB glUniform4i64ARB;
369         pglUniform1i64vARB glUniform1i64vARB;
370         pglUniform2i64vARB glUniform2i64vARB;
371         pglUniform3i64vARB glUniform3i64vARB;
372         pglUniform4i64vARB glUniform4i64vARB;
373         pglUniform1ui64ARB glUniform1ui64ARB;
374         pglUniform2ui64ARB glUniform2ui64ARB;
375         pglUniform3ui64ARB glUniform3ui64ARB;
376         pglUniform4ui64ARB glUniform4ui64ARB;
377         pglUniform1ui64vARB glUniform1ui64vARB;
378         pglUniform2ui64vARB glUniform2ui64vARB;
379         pglUniform3ui64vARB glUniform3ui64vARB;
380         pglUniform4ui64vARB glUniform4ui64vARB;
381         pglGetUniformi64vARB glGetUniformi64vARB;
382         pglGetUniformui64vARB glGetUniformui64vARB;
383         pglGetnUniformi64vARB glGetnUniformi64vARB;
384         pglGetnUniformui64vARB glGetnUniformui64vARB;
385         pglProgramUniform1i64ARB glProgramUniform1i64ARB;
386         pglProgramUniform2i64ARB glProgramUniform2i64ARB;
387         pglProgramUniform3i64ARB glProgramUniform3i64ARB;
388         pglProgramUniform4i64ARB glProgramUniform4i64ARB;
389         pglProgramUniform1i64vARB glProgramUniform1i64vARB;
390         pglProgramUniform2i64vARB glProgramUniform2i64vARB;
391         pglProgramUniform3i64vARB glProgramUniform3i64vARB;
392         pglProgramUniform4i64vARB glProgramUniform4i64vARB;
393         pglProgramUniform1ui64ARB glProgramUniform1ui64ARB;
394         pglProgramUniform2ui64ARB glProgramUniform2ui64ARB;
395         pglProgramUniform3ui64ARB glProgramUniform3ui64ARB;
396         pglProgramUniform4ui64ARB glProgramUniform4ui64ARB;
397         pglProgramUniform1ui64vARB glProgramUniform1ui64vARB;
398         pglProgramUniform2ui64vARB glProgramUniform2ui64vARB;
399         pglProgramUniform3ui64vARB glProgramUniform3ui64vARB;
400         pglProgramUniform4ui64vARB glProgramUniform4ui64vARB;
401     }
402 
403     private @nogc nothrow
404     bool loadARBGPUShaderInt64(SharedLib lib, GLSupport contextVersion)
405     {
406         lib.bindGLSymbol(cast(void**)&glUniform1i64ARB,"glUniform1i64ARB");
407         lib.bindGLSymbol(cast(void**)&glUniform2i64ARB,"glUniform2i64ARB");
408         lib.bindGLSymbol(cast(void**)&glUniform3i64ARB,"glUniform3i64ARB");
409         lib.bindGLSymbol(cast(void**)&glUniform4i64ARB,"glUniform4i64ARB");
410         lib.bindGLSymbol(cast(void**)&glUniform1i64vARB,"glUniform1i64vARB");
411         lib.bindGLSymbol(cast(void**)&glUniform2i64vARB,"glUniform2i64vARB");
412         lib.bindGLSymbol(cast(void**)&glUniform3i64vARB,"glUniform3i64vARB");
413         lib.bindGLSymbol(cast(void**)&glUniform4i64vARB,"glUniform4i64vARB");
414         lib.bindGLSymbol(cast(void**)&glUniform1ui64ARB,"glUniform1ui64ARB");
415         lib.bindGLSymbol(cast(void**)&glUniform2ui64ARB,"glUniform2ui64ARB");
416         lib.bindGLSymbol(cast(void**)&glUniform3ui64ARB,"glUniform3ui64ARB");
417         lib.bindGLSymbol(cast(void**)&glUniform4ui64ARB,"glUniform4ui64ARB");
418         lib.bindGLSymbol(cast(void**)&glUniform1ui64vARB,"glUniform1ui64vARB");
419         lib.bindGLSymbol(cast(void**)&glUniform2ui64vARB,"glUniform2ui64vARB");
420         lib.bindGLSymbol(cast(void**)&glUniform3ui64vARB,"glUniform3ui64vARB");
421         lib.bindGLSymbol(cast(void**)&glUniform4ui64vARB,"glUniform4ui64vARB");
422         lib.bindGLSymbol(cast(void**)&glGetUniformi64vARB,"glGetUniformi64vARB");
423         lib.bindGLSymbol(cast(void**)&glGetUniformui64vARB,"glGetUniformui64vARB");
424         lib.bindGLSymbol(cast(void**)&glGetnUniformi64vARB,"glGetnUniformi64vARB");
425         lib.bindGLSymbol(cast(void**)&glGetnUniformui64vARB,"glGetnUniformui64vARB");
426         lib.bindGLSymbol(cast(void**)&glProgramUniform1i64ARB,"glProgramUniform1i64ARB");
427         lib.bindGLSymbol(cast(void**)&glProgramUniform2i64ARB,"glProgramUniform2i64ARB");
428         lib.bindGLSymbol(cast(void**)&glProgramUniform3i64ARB,"glProgramUniform3i64ARB");
429         lib.bindGLSymbol(cast(void**)&glProgramUniform4i64ARB,"glProgramUniform4i64ARB");
430         lib.bindGLSymbol(cast(void**)&glProgramUniform1i64vARB,"glProgramUniform1i64vARB");
431         lib.bindGLSymbol(cast(void**)&glProgramUniform2i64vARB,"glProgramUniform2i64vARB");
432         lib.bindGLSymbol(cast(void**)&glProgramUniform3i64vARB,"glProgramUniform3i64vARB");
433         lib.bindGLSymbol(cast(void**)&glProgramUniform4i64vARB,"glProgramUniform4i64vARB");
434         lib.bindGLSymbol(cast(void**)&glProgramUniform1ui64ARB,"glProgramUniform1ui64ARB");
435         lib.bindGLSymbol(cast(void**)&glProgramUniform2ui64ARB,"glProgramUniform2ui64ARB");
436         lib.bindGLSymbol(cast(void**)&glProgramUniform3ui64ARB,"glProgramUniform3ui64ARB");
437         lib.bindGLSymbol(cast(void**)&glProgramUniform4ui64ARB,"glProgramUniform4ui64ARB");
438         lib.bindGLSymbol(cast(void**)&glProgramUniform1ui64vARB,"glProgramUniform1ui64vARB");
439         lib.bindGLSymbol(cast(void**)&glProgramUniform2ui64vARB,"glProgramUniform2ui64vARB");
440         lib.bindGLSymbol(cast(void**)&glProgramUniform3ui64vARB,"glProgramUniform3ui64vARB");
441         lib.bindGLSymbol(cast(void**)&glProgramUniform4ui64vARB,"glProgramUniform4ui64vARB");
442         return resetErrorCountGL();
443     }
444 }
445 else enum hasARBGPUShaderInt64 = false;
446 
447 // ARB_indirect_parameters
448 version(GL_ARB) enum useARBIndirectParameters = true;
449 else version(GL_ARB_indirect_parameters) enum useARBIndirectParameters = true;
450 else enum useARBIndirectParameters = false;
451 
452 static if(useARBIndirectParameters) {
453     private bool _hasARBIndirectParameters;
454     @nogc nothrow bool hasARBIndirectParameters() { return _hasARBIndirectParameters; }
455 
456     enum : uint {
457         GL_PARAMETER_BUFFER_ARB           = 0x80EE,
458         GL_PARAMETER_BUFFER_BINDING_ARB   = 0x80EF,
459     }
460 
461     extern(System) @nogc nothrow  {
462         alias pglMultiDrawArraysIndirectCountARB = void function(GLenum,const(void)*,GLintptr,GLsizei,GLsizei);
463         alias pglMultiDrawElementsIndirectCountARB = void function(GLenum,GLenum,const(void)*,GLintptr,GLsizei,GLsizei);
464     }
465 
466     __gshared {
467         pglMultiDrawArraysIndirectCountARB glMultiDrawArraysIndirectCountARB;
468         pglMultiDrawElementsIndirectCountARB glMultiDrawElementsIndirectCountARB;
469     }
470 
471     private @nogc nothrow
472     bool loadARBIndirectParameters(SharedLib lib, GLSupport contextVersion)
473     {
474         lib.bindGLSymbol(cast(void**)&glMultiDrawArraysIndirectCountARB,"glMultiDrawArraysIndirectCountARB");
475         lib.bindGLSymbol(cast(void**)&glMultiDrawElementsIndirectCountARB,"glMultiDrawElementsIndirectCountARB");
476         return resetErrorCountGL();
477     }
478 }
479 else enum hasARBIndirectParameters = false;
480 
481 // ARB_instanced_arrays
482 version(GL_ARB) enum useARBInstancedArrays = true;
483 else version(GL_ARB_instanced_arrays) enum useARBInstancedArrays = true;
484 else enum useARBInstancedArrays = false;
485 
486 static if(useARBInstancedArrays) {
487     private bool _hasARBInstancedArrays;
488     @nogc nothrow bool hasARBInstancedArrays() { return _hasARBInstancedArrays; }
489 
490     enum : uint {
491         GL_VERTEX_ATTRIB_ARRAY_DIVISOR_ARB = 0x88FE,
492     }
493 
494     extern(System) @nogc nothrow {
495         alias pglVertexAttribDivisorARB = void function(GLuint,GLuint);
496         alias pglVertexArrayVertexAttribDivisorEXT = void function(GLuint,GLuint,GLuint);
497     }
498 
499     __gshared {
500         pglVertexAttribDivisorARB glVertexAttribDivisorARB;
501         pglVertexArrayVertexAttribDivisorEXT glVertexArrayVertexAttribDivisorEXT;
502     }
503 
504     private @nogc nothrow
505     bool loadARBInstancedArrays(SharedLib lib, GLSupport contextVersion)
506     {
507         lib.bindGLSymbol(cast(void**)&glVertexAttribDivisorARB,"glVertexAttribDivisorARB");
508 
509         // glVertexArrayVertexAttribDivisorEXT is only available when EXT_direct_state_access is supported.
510         // Save the error count to return and ignore the error if the EXT function isn't available.
511         bool ret = resetErrorCountGL();
512         if(hasExtension(contextVersion, "GL_EXT_direct_state_access ")) {
513             lib.bindGLSymbol(cast(void**)&glVertexArrayVertexAttribDivisorEXT, "glVertexArrayVertexAttribDivisorEXT");
514             resetErrorCountGL();
515         }
516         return ret;
517     }
518 }
519 else enum hasARBInstancedArrays = false;
520 
521 // ARB_pipeline_statistics_query
522 version(GL_ARB) enum useARBPipelineStatisticsQuery = true;
523 else version(GL_ARB_pipeline_statistics_query) enum useARBPipelineStatisticsQuery = true;
524 else enum useARBPipelineStatisticsQuery = false;
525 
526 static if(useARBPipelineStatisticsQuery) {
527     private bool _hasARBPipelineStatisticsQuery;
528     @nogc nothrow bool hasARBPipelineStatisticsQuery() { return _hasARBPipelineStatisticsQuery; }
529 
530     enum : uint {
531         GL_VERTICES_SUBMITTED_ARB         = 0x82EE,
532         GL_PRIMITIVES_SUBMITTED_ARB       = 0x82EF,
533         GL_VERTEX_SHADER_INVOCATIONS_ARB  = 0x82F0,
534         GL_TESS_CONTROL_SHADER_PATCHES_ARB = 0x82F1,
535         GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB = 0x82F2,
536         GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB = 0x82F3,
537         GL_FRAGMENT_SHADER_INVOCATIONS_ARB = 0x82F4,
538         GL_COMPUTE_SHADER_INVOCATIONS_ARB = 0x82F5,
539         GL_CLIPPING_INPUT_PRIMITIVES_ARB  = 0x82F6,
540         GL_CLIPPING_OUTPUT_PRIMITIVES_ARB = 0x82F7,
541     }
542 }
543 else enum hasARBPipelineStatisticsQuery = false;
544 
545 // ARB_robustness_isolation
546 version(GL_ARB) enum useARBRobustnessIsolation = true;
547 else version(GL_ARB_robustness_isolation) enum useARBRobustnessIsolation = true;
548 else enum useARBRobustnessIsolation = false;
549 
550 static if(useARBRobustnessIsolation) {
551     private bool _hasARBRobustnessIsolation;
552     @nogc nothrow bool hasARBRobustnessIsolation() { return _hasARBRobustnessIsolation; }
553 }
554 else enum hasARBRobustnessIsolation = false;
555 
556 // ARB_sample_shading
557 version(GL_ARB) enum useARBSampleShading = true;
558 else version(GL_ARB_sample_shading) enum useARBSampleShading = true;
559 else enum useARBSampleShading = false;
560 
561 static if(useARBSampleShading) {
562     private bool _hasARBSampleShading;
563     @nogc nothrow bool hasARBSampleShading() { return _hasARBSampleShading; }
564 
565     enum : uint {
566         GL_SAMPLE_SHADING_ARB             = 0x8C36,
567         GL_MIN_SAMPLE_SHADING_VALUE_ARB   = 0x8C37,
568     }
569 
570     extern(System) @nogc nothrow alias pglMinSampleShadingARB = void function(GLclampf);
571     __gshared pglMinSampleShadingARB glMinSampleShadingARB;
572 
573     private @nogc nothrow
574     bool loadARBSampleShading(SharedLib lib, GLSupport contextVersion)
575     {
576         lib.bindGLSymbol(cast(void**)&glMinSampleShadingARB,"glMinSampleShadingARB");
577         return resetErrorCountGL();
578     }
579 }
580 else enum hasARBSampleShading = false;
581 
582 // ARB_texture_buffer_object
583 version(GL_ARB) enum useARBTextureBufferObject = true;
584 else version(GL_ARB_texture_buffer_object) enum useARBTextureBufferObject = true;
585 else enum useARBTextureBufferObject = false;
586 
587 static if(useARBTextureBufferObject) {
588     private bool _hasARBTextureBufferObject;
589     @nogc nothrow bool hasARBTextureBufferObject() { return _hasARBTextureBufferObject; }
590 
591     enum : uint {
592         GL_TEXTURE_BUFFER_ARB =             0x8C2A,
593         GL_MAX_TEXTURE_BUFFER_SIZE_ARB =    0x8C2B,
594         GL_TEXTURE_BINDING_BUFFER_ARB =     0x8C2C,
595         GL_TEXTURE_BUFFER_DATA_STORE_BINDING_ARB = 0x8C2D,
596         GL_TEXTURE_BUFFER_FORMAT_ARB =      0x8C2E,
597     }
598 
599     extern(System) @nogc nothrow
600     alias pglTexBufferARB = void function(GLenum,GLenum,GLuint);
601 
602     __gshared pglTexBufferARB glTexBufferARB;
603 
604     private @nogc nothrow
605     bool loadARBTextureBufferObject(SharedLib lib, GLSupport contextVersion)
606     {
607         lib.bindGLSymbol(cast(void**)&glTexBufferARB,"glTexBufferARB");
608         return resetErrorCountGL();
609     }
610 }
611 else enum hasARBTextureBufferObject = false;
612 
613 // ARB_texture_compression_bptc
614 version(GL_ARB) enum useARBTextureCompressionBPTC = true;
615 else version(GL_ARB_texture_compression_bptc) enum useARBTextureCompressionBPTC = true;
616 else enum useARBTextureCompressionBPTC = false;
617 
618 static if(useARBTextureCompressionBPTC) {
619     private bool _hasARBTextureCompressionBPTC;
620     @nogc nothrow bool hasARBTextureCompressionBPTC() { return _hasARBTextureCompressionBPTC; }
621 
622     enum : uint {
623         GL_COMPRESSED_RGBA_BPTC_UNORM_ARB = 0x8E8C,
624         GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB = 0x8E8D,
625         GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB = 0x8E8E,
626         GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB = 0x8E8F,
627     }
628 }
629 else enum hasARBTextureCompressionBPTC = false;
630 
631 // ARB_texture_cube_map_array
632 version(GL_ARB) enum useARBTextureCubeMapArray = true;
633 else version(GL_ARB_texture_cube_map_array) enum useARBTextureCubeMapArray = true;
634 else enum useARBTextureCubeMapArray = false;
635 
636 static if(useARBTextureCubeMapArray) {
637     private bool _hasARBTextureCubeMapArray;
638     @nogc nothrow bool hasARBTextureCubeMapArray() { return _hasARBTextureCubeMapArray; }
639 
640     enum : uint {
641         GL_TEXTURE_CUBE_MAP_ARRAY_ARB     = 0x9009,
642         GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB = 0x900A,
643         GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB = 0x900B,
644         GL_SAMPLER_CUBE_MAP_ARRAY_ARB     = 0x900C,
645         GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB = 0x900D,
646         GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB = 0x900E,
647         GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB = 0x900F,
648     }
649 }
650 else enum hasARBTextureCubeMapArray = false;
651 
652 // ARB_texture_gather
653 version(GL_ARB) enum useARBTextureGather = true;
654 else version(GL_ARB_texture_gather) enum useARBTextureGather = true;
655 else enum useARBTextureGather = false;
656 
657 static if(useARBTextureGather) {
658     private bool _hasARBTextureGather;
659     @nogc nothrow bool hasARBTextureGather() { return _hasARBTextureGather; }
660 
661     enum : uint {
662         GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB = 0x8E5E,
663         GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB = 0x8E5F,
664     }
665 }
666 else enum hasARBTextureGather = false;
667 
668 // ARB_transform_feedback_overflow_query
669 version(GL_ARB) enum useARBTransformFeedbackOverflowQuery = true;
670 else version(GL_ARB_transform_feedback_overflow_query) enum useARBTransformFeedbackOverflowQuery = true;
671 else enum useARBTransformFeedbackOverflowQuery = false;
672 
673 static if(useARBTransformFeedbackOverflowQuery) {
674     private bool _hasARBTransformFeedbackOverflowQuery;
675     @nogc nothrow bool hasARBTransformFeedbackOverflowQuery() { return _hasARBTransformFeedbackOverflowQuery; }
676 
677     enum : uint {
678         GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB          = 0x82EC,
679         GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB   = 0x82ED,
680     }
681 }
682 else enum hasARBTransformFeedbackOverflowQuery = false;
683 
684 // ARB_sparse_texture
685 version(GL_ARB) enum useARBSparseTexture = true;
686 else version(GL_ARB_sparse_texture) enum useARBSparseTexture = true;
687 else enum useARBSparseTexture = false;
688 
689 static if(useARBSparseTexture) {
690     import bindbc.opengl.bind.arb.core_45 : useARBDirectStateAccess, hasARBDirectStateAccess;
691 
692     private bool _hasARBSparseTexture;
693     @nogc nothrow bool hasARBSparseTexture() { return _hasARBSparseTexture; }
694 
695     enum : uint {
696         GL_TEXTURE_SPARSE_ARB          = 0x91A6,
697         GL_VIRTUAL_PAGE_SIZE_INDEX_ARB = 0x91A7,
698 
699         GL_NUM_SPARSE_LEVELS_ARB = 0x91AA,
700 
701         GL_NUM_VIRTUAL_PAGE_SIZES_ARB = 0x91A8,
702         GL_VIRTUAL_PAGE_SIZE_X_ARB    = 0x9195,
703         GL_VIRTUAL_PAGE_SIZE_Y_ARB    = 0x9196,
704         GL_VIRTUAL_PAGE_SIZE_Z_ARB    = 0x9197,
705 
706         GL_MAX_SPARSE_TEXTURE_SIZE_ARB                = 0x9198,
707         GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB             = 0x9199,
708         GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB        = 0x919A,
709         GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB = 0x91A9
710     }
711 
712     extern(System) @nogc nothrow {
713         alias pglTexPageCommitmentARB =
714             void function(GLenum,GLint,GLint,GLint,GLint,GLsizei,GLsizei,GLsizei,GLboolean);
715         static if(useARBDirectStateAccess) {
716             alias pglTexturePageCommitmentEXT =
717                 void function(GLuint,GLint,GLint,GLint,GLint,GLsizei,GLsizei,GLsizei,GLboolean);
718         }
719     }
720 
721     __gshared {
722         pglTexPageCommitmentARB glTexPageCommitmentARB;
723         static if(useARBDirectStateAccess)
724             pglTexturePageCommitmentEXT glTexturePageCommitmentEXT;
725     }
726 
727     private @nogc nothrow
728     bool loadARBSparseTexture(SharedLib lib, GLSupport contextVersion)
729     {
730         lib.bindGLSymbol(cast(void**)&glTexPageCommitmentARB, "glTexPageCommitmentARB");
731 
732         static if(useARBDirectStateAccess) {
733             if(hasARBDirectStateAccess)
734                 lib.bindGLSymbol(cast(void**)&glTexturePageCommitmentEXT, "glTexturePageCommitmentEXT");
735         }
736 
737         return resetErrorCountGL();
738     }
739 }
740 
741 // ARB_sparse_texture2
742 version(GL_ARB) enum useARBSparseTexture2 = true;
743 else version(GL_ARB_sparse_texture2) enum useARBSparseTexture2 = true;
744 else enum useARBSparseTexture2 = false;
745 
746 static if(useARBSparseTexture2) {
747     private bool _hasARBSparseTexture2;
748     @nogc nothrow bool hasARBSparseTexture2() { return _hasARBSparseTexture2; }
749 }
750 
751 // ARB_sparse_texture_clamp
752 version(GL_ARB) enum useARBSparseTextureClamp = true;
753 else version(GL_ARB_sparse_texture_clamp) enum useARBSparseTextureClamp = true;
754 else enum useARBSparseTextureClamp = false;
755 
756 static if(useARBSparseTextureClamp) {
757     private bool _hasARBSparseTextureClamp;
758     @nogc nothrow bool hasARBSparseTextureClamp() { return _hasARBSparseTextureClamp; }
759 }
760 
761 package @nogc nothrow
762 void loadARB_01(SharedLib lib, GLSupport contextVersion)
763 {
764     static if(useARBBindlessTexture) _hasARBBindlessTexture =
765             hasExtension(contextVersion, "GL_ARB_bindless_texture") &&
766             lib.loadARBBindlessTexture(contextVersion);
767 
768     static if(useARBCLEvent) _hasARBCLEvent =
769             hasExtension(contextVersion, "GL_ARB_cl_event") &&
770             lib.loadARBCLEvent(contextVersion);
771 
772     static if(useARBComputeVariableGroupSize) _hasARBComputeVariableGroupSize =
773             hasExtension(contextVersion, "GL_ARB_compute_variable_group_size") &&
774             lib.loadARBComputeVariableGroupSize(contextVersion);
775 
776     static if(useARBDebugOutput) _hasARBDebugOutput =
777             hasExtension(contextVersion, "GL_ARB_debug_output") &&
778             lib.loadARBDebugOutput(contextVersion);
779 
780     static if(useARBFramebufferSRGB) _hasARBFramebufferSRGB =
781             hasExtension(contextVersion, "GL_ARB_framebuffer_sRGB");
782 
783     static if(useARBGeometryShader4) _hasARBGeometryShader4 =
784             hasExtension(contextVersion, "GL_ARB_geometry_shader4") &&
785             lib.loadARBGeometryShader4(contextVersion);
786 
787     static if(useARBGLSPIRV) _hasARBGLSPIRV =
788             hasExtension(contextVersion, "GL_ARB_gl_spirv") &&
789             lib.loadARBGLSPIRV(contextVersion);
790 
791     static if(useARBGPUShaderInt64) _hasARBGPUShaderInt64 =
792             hasExtension(contextVersion, "GL_ARB_gpu_shader_int64") &&
793             lib.loadARBGPUShaderInt64(contextVersion);
794 
795     static if(useARBIndirectParameters) _hasARBIndirectParameters =
796             hasExtension(contextVersion, "GL_ARB_indirect_parameters") &&
797             lib.loadARBIndirectParameters(contextVersion);
798 
799     static if(useARBInstancedArrays) _hasARBInstancedArrays =
800             hasExtension(contextVersion, "GL_ARB_instanced_arrays") &&
801             lib.loadARBInstancedArrays(contextVersion);
802 
803     static if(useARBPipelineStatisticsQuery) _hasARBPipelineStatisticsQuery =
804             hasExtension(contextVersion, "GL_ARB_pipeline_statistics_query");
805 
806     static if(useARBRobustnessIsolation) _hasARBRobustnessIsolation =
807             hasExtension(contextVersion, "GL_ARB_robustness_isolation");
808 
809     static if(useARBSampleShading ) _hasARBSampleShading  =
810             hasExtension(contextVersion, "GL_ARB_sample_shading") &&
811             lib.loadARBSampleShading (contextVersion);
812 
813     static if(useARBTextureBufferObject) _hasARBTextureBufferObject =
814             hasExtension(contextVersion, "GL_ARB_texture_buffer_object") &&
815             lib.loadARBTextureBufferObject(contextVersion);
816 
817     static if(useARBTextureCompressionBPTC) _hasARBTextureCompressionBPTC =
818             hasExtension(contextVersion, "GL_ARB_texture_compression_bptc");
819 
820     static if(useARBTextureCubeMapArray) _hasARBTextureCubeMapArray =
821             hasExtension(contextVersion, "GL_ARB_texture_cube_map_array");
822 
823     static if(useARBTextureGather) _hasARBTextureGather =
824             hasExtension(contextVersion, "GL_ARB_texture_gather");
825 
826     static if(useARBTransformFeedbackOverflowQuery) _hasARBTransformFeedbackOverflowQuery =
827             hasExtension(contextVersion, "GL_ARB_transform_feedback_overflow_query");
828 
829     static if(useARBSparseTexture) _hasARBSparseTexture =
830             hasExtension(contextVersion, "GL_ARB_sparse_texture") &&
831             lib.loadARBSparseTexture(contextVersion);
832 
833     static if(useARBSparseTexture2) _hasARBSparseTexture2 =
834             hasExtension(contextVersion, "GL_ARB_sparse_texture2");
835 
836     static if(useARBSparseTextureClamp) _hasARBSparseTextureClamp =
837             hasExtension(contextVersion, "GL_ARB_sparse_texture_clamp");
838 }