1 //          Copyright Michael D. Parker 2018.
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_pipeline_statistics_query
482 version(GL_ARB) enum useARBPipelineStatisticsQuery = true;
483 else version(GL_ARB_pipeline_statistics_query) enum useARBPipelineStatisticsQuery = true;
484 else enum useARBPipelineStatisticsQuery = false;
485 
486 static if(useARBPipelineStatisticsQuery) {
487     private bool _hasARBPipelineStatisticsQuery;
488     @nogc nothrow bool hasARBPipelineStatisticsQuery() { return _hasARBPipelineStatisticsQuery; }
489 
490     enum : uint {
491         GL_VERTICES_SUBMITTED_ARB         = 0x82EE,
492         GL_PRIMITIVES_SUBMITTED_ARB       = 0x82EF,
493         GL_VERTEX_SHADER_INVOCATIONS_ARB  = 0x82F0,
494         GL_TESS_CONTROL_SHADER_PATCHES_ARB = 0x82F1,
495         GL_TESS_EVALUATION_SHADER_INVOCATIONS_ARB = 0x82F2,
496         GL_GEOMETRY_SHADER_PRIMITIVES_EMITTED_ARB = 0x82F3,
497         GL_FRAGMENT_SHADER_INVOCATIONS_ARB = 0x82F4,
498         GL_COMPUTE_SHADER_INVOCATIONS_ARB = 0x82F5,
499         GL_CLIPPING_INPUT_PRIMITIVES_ARB  = 0x82F6,
500         GL_CLIPPING_OUTPUT_PRIMITIVES_ARB = 0x82F7,
501     }
502 }
503 else enum hasARBPipelineStatisticsQuery = false;
504 
505 // ARB_robustness_isolation
506 version(GL_ARB) enum useARBRobustnessIsolation = true;
507 else version(GL_ARB_robustness_isolation) enum useARBRobustnessIsolation = true;
508 else enum useARBRobustnessIsolation = false;
509 
510 static if(useARBRobustnessIsolation) {
511     private bool _hasARBRobustnessIsolation;
512     @nogc nothrow bool hasARBRobustnessIsolation() { return _hasARBRobustnessIsolation; }
513 }
514 else enum hasARBRobustnessIsolation = false;
515 
516 // ARB_sample_shading
517 version(GL_ARB) enum useARBSampleShading = true;
518 else version(GL_ARB_sample_shading) enum useARBSampleShading = true;
519 else enum useARBSampleShading = false;
520 
521 static if(useARBSampleShading) {
522     private bool _hasARBSampleShading;
523     @nogc nothrow bool hasARBSampleShading() { return _hasARBSampleShading; }
524 
525     enum : uint {
526         GL_SAMPLE_SHADING_ARB             = 0x8C36,
527         GL_MIN_SAMPLE_SHADING_VALUE_ARB   = 0x8C37,
528     }
529 
530     extern(System) @nogc nothrow alias pglMinSampleShadingARB = void function(GLclampf);
531     __gshared pglMinSampleShadingARB glMinSampleShadingARB;
532 
533     private @nogc nothrow
534     bool loadARBSampleShading(SharedLib lib, GLSupport contextVersion)
535     {
536         lib.bindGLSymbol(cast(void**)&glMinSampleShadingARB,"glMinSampleShadingARB");
537         return resetErrorCountGL();
538     }
539 }
540 else enum hasARBSampleShading = false;
541 
542 // ARB_texture_compression_bptc
543 version(GL_ARB) enum useARBTextureCompressionBPTC = true;
544 else version(GL_ARB_texture_compression_bptc) enum useARBTextureCompressionBPTC = true;
545 else enum useARBTextureCompressionBPTC = false;
546 
547 static if(useARBTextureCompressionBPTC) {
548     private bool _hasARBTextureCompressionBPTC;
549     @nogc nothrow bool hasARBTextureCompressionBPTC() { return _hasARBTextureCompressionBPTC; }
550 
551     enum : uint {
552         GL_COMPRESSED_RGBA_BPTC_UNORM_ARB = 0x8E8C,
553         GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB = 0x8E8D,
554         GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB = 0x8E8E,
555         GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB = 0x8E8F,
556     }
557 }
558 else enum hasARBTextureCompressionBPTC = false;
559 
560 // ARB_texture_cube_map_array
561 version(GL_ARB) enum useARBTextureCubeMapArray = true;
562 else version(GL_ARB_texture_cube_map_array) enum useARBTextureCubeMapArray = true;
563 else enum useARBTextureCubeMapArray = false;
564 
565 static if(useARBTextureCubeMapArray) {
566     private bool _hasARBTextureCubeMapArray;
567     @nogc nothrow bool hasARBTextureCubeMapArray() { return _hasARBTextureCubeMapArray; }
568 
569     enum : uint {
570         GL_TEXTURE_CUBE_MAP_ARRAY_ARB     = 0x9009,
571         GL_TEXTURE_BINDING_CUBE_MAP_ARRAY_ARB = 0x900A,
572         GL_PROXY_TEXTURE_CUBE_MAP_ARRAY_ARB = 0x900B,
573         GL_SAMPLER_CUBE_MAP_ARRAY_ARB     = 0x900C,
574         GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW_ARB = 0x900D,
575         GL_INT_SAMPLER_CUBE_MAP_ARRAY_ARB = 0x900E,
576         GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY_ARB = 0x900F,
577     }
578 }
579 else enum hasARBTextureCubeMapArray = false;
580 
581 // ARB_texture_gather
582 version(GL_ARB) enum useARBTextureGather = true;
583 else version(GL_ARB_texture_gather) enum useARBTextureGather = true;
584 else enum useARBTextureGather = false;
585 
586 static if(useARBTextureGather) {
587     private bool _hasARBTextureGather;
588     @nogc nothrow bool hasARBTextureGather() { return _hasARBTextureGather; }
589 
590     enum : uint {
591         GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET_ARB = 0x8E5E,
592         GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET_ARB = 0x8E5F,
593     }
594 }
595 else enum hasARBTextureGather = false;
596 
597 // ARB_transform_feedback_overflow_query
598 version(GL_ARB) enum useARBTransformFeedbackOverflowQuery = true;
599 else version(GL_ARB_transform_feedback_overflow_query) enum useARBTransformFeedbackOverflowQuery = true;
600 else enum useARBTransformFeedbackOverflowQuery = false;
601 
602 static if(useARBTransformFeedbackOverflowQuery) {
603     private bool _hasARBTransformFeedbackOverflowQuery;
604     @nogc nothrow bool hasARBTransformFeedbackOverflowQuery() { return _hasARBTransformFeedbackOverflowQuery; }
605 
606     enum : uint {
607         GL_TRANSFORM_FEEDBACK_OVERFLOW_ARB          = 0x82EC,
608         GL_TRANSFORM_FEEDBACK_STREAM_OVERFLOW_ARB   = 0x82ED,
609     }
610 }
611 else enum hasARBTransformFeedbackOverflowQuery = false;
612 
613 // ARB_sparse_texture
614 version(GL_ARB) enum useARBSparseTexture = true;
615 else version(GL_ARB_sparse_texture) enum useARBSparseTexture = true;
616 else enum useARBSparseTexture = false;
617 
618 static if(useARBSparseTexture) {
619     import bindbc.opengl.bind.arb.core_45 : useARBDirectStateAccess, hasARBDirectStateAccess;
620 
621     private bool _hasARBSparseTexture;
622     @nogc nothrow bool hasARBSparseTexture() { return _hasARBSparseTexture; }
623 
624     enum : uint {
625         GL_TEXTURE_SPARSE_ARB          = 0x91A6,
626         GL_VIRTUAL_PAGE_SIZE_INDEX_ARB = 0x91A7,
627 
628         GL_NUM_SPARSE_LEVELS_ARB = 0x91AA,
629 
630         GL_NUM_VIRTUAL_PAGE_SIZES_ARB = 0x91A8,
631         GL_VIRTUAL_PAGE_SIZE_X_ARB    = 0x9195,
632         GL_VIRTUAL_PAGE_SIZE_Y_ARB    = 0x9196,
633         GL_VIRTUAL_PAGE_SIZE_Z_ARB    = 0x9197,
634 
635         GL_MAX_SPARSE_TEXTURE_SIZE_ARB                = 0x9198,
636         GL_MAX_SPARSE_3D_TEXTURE_SIZE_ARB             = 0x9199,
637         GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB        = 0x919A,
638         GL_SPARSE_TEXTURE_FULL_ARRAY_CUBE_MIPMAPS_ARB = 0x91A9
639     }
640 
641     extern(System) @nogc nothrow {
642         alias pglTexPageCommitmentARB =
643             void function(GLenum,GLint,GLint,GLint,GLint,GLsizei,GLsizei,GLsizei,GLboolean);
644         static if(useARBDirectStateAccess) {
645             alias pglTexturePageCommitmentEXT =
646                 void function(GLuint,GLint,GLint,GLint,GLint,GLsizei,GLsizei,GLsizei,GLboolean);
647         }
648     }
649 
650     __gshared {
651         pglTexPageCommitmentARB glTexPageCommitmentARB;
652         static if(useARBDirectStateAccess)
653             pglTexturePageCommitmentEXT glTexturePageCommitmentEXT;
654     }
655 
656     private @nogc nothrow
657     bool loadARBSparseTexture(SharedLib lib, GLSupport contextVersion)
658     {
659         lib.bindGLSymbol(cast(void**)&glTexPageCommitmentARB, "glTexPageCommitmentARB");
660 
661         static if(useARBDirectStateAccess) {
662             if(hasARBDirectStateAccess)
663                 lib.bindGLSymbol(cast(void**)&glTexturePageCommitmentEXT, "glTexturePageCommitmentEXT");
664         }
665 
666         return resetErrorCountGL();
667     }
668 }
669 
670 // ARB_sparse_texture2
671 version(GL_ARB) enum useARBSparseTexture2 = true;
672 else version(GL_ARB_sparse_texture2) enum useARBSparseTexture2 = true;
673 else enum useARBSparseTexture2 = false;
674 
675 static if(useARBSparseTexture2) {
676     private bool _hasARBSparseTexture2;
677     @nogc nothrow bool hasARBSparseTexture2() { return _hasARBSparseTexture2; }
678 }
679 
680 // ARB_sparse_texture_clamp
681 version(GL_ARB) enum useARBSparseTextureClamp = true;
682 else version(GL_ARB_sparse_texture_clamp) enum useARBSparseTextureClamp = true;
683 else enum useARBSparseTextureClamp = false;
684 
685 static if(useARBSparseTextureClamp) {
686     private bool _hasARBSparseTextureClamp;
687     @nogc nothrow bool hasARBSparseTextureClamp() { return _hasARBSparseTextureClamp; }
688 }
689 
690 package @nogc nothrow
691 void loadARB_01(SharedLib lib, GLSupport contextVersion)
692 {
693     static if(useARBBindlessTexture) _hasARBBindlessTexture =
694             hasExtension(contextVersion, "GL_ARB_bindless_texture") &&
695             lib.loadARBBindlessTexture(contextVersion);
696 
697     static if(useARBCLEvent) _hasARBCLEvent =
698             hasExtension(contextVersion, "GL_ARB_cl_event") &&
699             lib.loadARBCLEvent(contextVersion);
700 
701     static if(useARBComputeVariableGroupSize) _hasARBComputeVariableGroupSize =
702             hasExtension(contextVersion, "GL_ARB_compute_variable_group_size") &&
703             lib.loadARBComputeVariableGroupSize(contextVersion);
704 
705     static if(useARBDebugOutput) _hasARBDebugOutput =
706             hasExtension(contextVersion, "GL_ARB_debug_output") &&
707             lib.loadARBDebugOutput(contextVersion);
708 
709     static if(useARBFramebufferSRGB) _hasARBFramebufferSRGB =
710             hasExtension(contextVersion, "GL_ARB_framebuffer_sRGB");
711 
712     static if(useARBGeometryShader4) _hasARBGeometryShader4 =
713             hasExtension(contextVersion, "GL_ARB_geometry_shader4") &&
714             lib.loadARBGeometryShader4(contextVersion);
715 
716     static if(useARBGLSPIRV) _hasARBGLSPIRV =
717             hasExtension(contextVersion, "GL_ARB_gl_spirv") &&
718             lib.loadARBGLSPIRV(contextVersion);
719 
720     static if(useARBGPUShaderInt64) _hasARBGPUShaderInt64 =
721             hasExtension(contextVersion, "GL_ARB_gpu_shader_int64") &&
722             lib.loadARBGPUShaderInt64(contextVersion);
723 
724     static if(useARBIndirectParameters) _hasARBIndirectParameters =
725             hasExtension(contextVersion, "GL_ARB_indirect_parameters") &&
726             lib.loadARBIndirectParameters(contextVersion);
727 
728     static if(useARBPipelineStatisticsQuery) _hasARBPipelineStatisticsQuery =
729             hasExtension(contextVersion, "GL_ARB_pipeline_statistics_query");
730 
731     static if(useARBRobustnessIsolation) _hasARBRobustnessIsolation =
732             hasExtension(contextVersion, "GL_ARB_robustness_isolation");
733 
734     static if(useARBSampleShading ) _hasARBSampleShading  =
735             hasExtension(contextVersion, "GL_ARB_sample_shading") &&
736             lib.loadARBSampleShading (contextVersion);
737 
738     static if(useARBTextureCompressionBPTC) _hasARBTextureCompressionBPTC =
739             hasExtension(contextVersion, "GL_ARB_texture_compression_bptc");
740 
741     static if(useARBTextureCubeMapArray) _hasARBTextureCubeMapArray =
742             hasExtension(contextVersion, "GL_ARB_texture_cube_map_array");
743 
744     static if(useARBTextureGather) _hasARBTextureGather =
745             hasExtension(contextVersion, "GL_ARB_texture_gather");
746 
747     static if(useARBTransformFeedbackOverflowQuery) _hasARBTransformFeedbackOverflowQuery =
748             hasExtension(contextVersion, "GL_ARB_transform_feedback_overflow_query");
749 
750     static if(useARBSparseTexture) _hasARBSparseTexture =
751             hasExtension(contextVersion, "GL_ARB_sparse_texture") &&
752             lib.loadARBSparseTexture(contextVersion);
753 
754     static if(useARBSparseTexture2) _hasARBSparseTexture2 =
755             hasExtension(contextVersion, "GL_ARB_sparse_texture2");
756 
757     static if(useARBSparseTextureClamp) _hasARBSparseTextureClamp =
758             hasExtension(contextVersion, "GL_ARB_sparse_texture_clamp");
759 }