1 
2 //          Copyright Michael D. Parker 2018.
3 // Distributed under the Boost Software License, Version 1.0.
4 //    (See accompanying file LICENSE_1_0.txt or copy at
5 //          http://www.boost.org/LICENSE_1_0.txt)
6 
7 module bindbc.opengl.bind.arb.core_41;
8 
9 import bindbc.loader;
10 import bindbc.opengl.config,
11        bindbc.opengl.context;
12 import bindbc.opengl.bind.types;
13 
14 static if(glSupport >= GLSupport.gl41) {
15     enum has41 = true;
16 }
17 else enum has41 = false;
18 
19 // ARB_ES2_compatibility
20 version(GL_ARB) enum useARBES2Compatibility = true;
21 else version(GL_ARB_ES2_compatibility) enum useARBES2Compatibility = true;
22 else enum useARBES2Compatibility = has41;
23 
24 static if(useARBES2Compatibility) {
25     private bool _hasARBES2Compatibility;
26     bool hasARBES2Compatibility() { return _hasARBES2Compatibility; }
27 
28     enum : uint {
29         GL_FIXED                          = 0x140C,
30         GL_IMPLEMENTATION_COLOR_READ_TYPE = 0x8B9A,
31         GL_IMPLEMENTATION_COLOR_READ_FORMAT = 0x8B9B,
32         GL_LOW_FLOAT                      = 0x8DF0,
33         GL_MEDIUM_FLOAT                   = 0x8DF1,
34         GL_HIGH_FLOAT                     = 0x8DF2,
35         GL_LOW_INT                        = 0x8DF3,
36         GL_MEDIUM_INT                     = 0x8DF4,
37         GL_HIGH_INT                       = 0x8DF5,
38         GL_SHADER_COMPILER                = 0x8DFA,
39         GL_NUM_SHADER_BINARY_FORMATS      = 0x8DF9,
40         GL_MAX_VERTEX_UNIFORM_VECTORS     = 0x8DFB,
41         GL_MAX_VARYING_VECTORS            = 0x8DFC,
42         GL_MAX_FRAGMENT_UNIFORM_VECTORS   = 0x8DFD,
43     }
44 
45     extern(System) @nogc nothrow {
46         alias pglReleaseShaderCompiler = void function();
47         alias pglShaderBinary = void function(GLsizei, const(GLuint)*, GLenum, const(GLvoid)*, GLsizei);
48         alias pglGetShaderPrecisionFormat = void function(GLenum, GLenum, GLint*, GLint*);
49         alias pglDepthRangef = void function(GLclampf, GLclampf);
50         alias pglClearDepthf = void function(GLclampf);
51     }
52 
53     __gshared {
54         pglReleaseShaderCompiler glReleaseShaderCompiler;
55         pglShaderBinary glShaderBinary;
56         pglGetShaderPrecisionFormat glGetShaderPrecisionFormat;
57         pglDepthRangef glDepthRangef;
58         pglClearDepthf glClearDepthf;
59     }
60 
61     private @nogc nothrow
62     bool loadARBES2Compatibility(SharedLib lib, GLSupport contextVersion)
63     {
64         lib.bindGLSymbol(cast(void**)&glReleaseShaderCompiler, "glReleaseShaderCompiler");
65         lib.bindGLSymbol(cast(void**)&glShaderBinary, "glShaderBinary");
66         lib.bindGLSymbol(cast(void**)&glGetShaderPrecisionFormat, "glGetShaderPrecisionFormat");
67         lib.bindGLSymbol(cast(void**)&glDepthRangef, "glDepthRangef");
68         lib.bindGLSymbol(cast(void**)&glClearDepthf, "glClearDepthf");
69         return resetErrorCountGL();
70     }
71 }
72 else enum hasARBES2Compatibility = false;
73 
74 // ARB_get_program_binary
75 version(GL_ARB) enum useARBGetProgramBinary = true;
76 else version(GL_ARB_get_program_binary) enum useARBGetProgramBinary = true;
77 else enum useARBGetProgramBinary = has41;
78 
79 static if(useARBGetProgramBinary) {
80     private bool _hasARBGetProgramBinary;
81     bool hasARBGetProgramBinary() { return _hasARBGetProgramBinary; }
82 
83     enum : uint {
84         GL_PROGRAM_BINARY_RETRIEVABLE_HINT = 0x8257,
85         GL_PROGRAM_BINARY_LENGTH          = 0x8741,
86         GL_NUM_PROGRAM_BINARY_FORMATS     = 0x87FE,
87         GL_PROGRAM_BINARY_FORMATS         = 0x87FF,
88     }
89 
90     extern(System) @nogc nothrow {
91         alias pglGetProgramBinary = void function(GLuint,GLsizei,GLsizei*,GLenum*,GLvoid*);
92         alias pglProgramBinary = void function(GLuint,GLenum,const(GLvoid)*,GLsizei);
93         alias pglProgramParameteri = void function(GLuint,GLenum,GLint);
94     }
95 
96     __gshared {
97         pglGetProgramBinary glGetProgramBinary;
98         pglProgramBinary glProgramBinary;
99         pglProgramParameteri glProgramParameteri;
100     }
101 
102     private @nogc nothrow
103     bool loadARBGetProgramBinary(SharedLib lib, GLSupport contextVersion)
104     {
105         lib.bindGLSymbol(cast(void**)&glGetProgramBinary,"glGetProgramBinary");
106         lib.bindGLSymbol(cast(void**)&glProgramBinary,"glProgramBinary");
107         lib.bindGLSymbol(cast(void**)&glProgramParameteri,"glProgramParameteri");
108         return resetErrorCountGL();
109     }
110 }
111 else enum hasARBGetProgramBinary = false;
112 
113 // ARB_separate_shader_objects
114 version(GL_ARB) enum useARBSeparateShaderObjects = true;
115 else version(GL_ARB_separate_shader_objects) enum useARBSeparateShaderObjects = true;
116 else enum useARBSeparateShaderObjects = has41;
117 
118 static if(useARBSeparateShaderObjects) {
119     private bool _hasARBSeparateShaderObjects;
120     bool hasARBSeparateShaderObjects() { return _hasARBSeparateShaderObjects; }
121 
122     enum : uint {
123         GL_VERTEX_SHADER_BIT              = 0x00000001,
124         GL_FRAGMENT_SHADER_BIT            = 0x00000002,
125         GL_GEOMETRY_SHADER_BIT            = 0x00000004,
126         GL_TESS_CONTROL_SHADER_BIT        = 0x00000008,
127         GL_TESS_EVALUATION_SHADER_BIT     = 0x00000010,
128         GL_ALL_SHADER_BITS                = 0xFFFFFFFF,
129         GL_PROGRAM_SEPARABLE              = 0x8258,
130         GL_ACTIVE_PROGRAM                 = 0x8259,
131         GL_PROGRAM_PIPELINE_BINDING       = 0x825A,
132     }
133 
134     extern(System) @nogc nothrow {
135         alias pglUseProgramStages = void function(GLuint, GLbitfield, GLuint);
136         alias pglActiveShaderProgram = void function(GLuint, GLuint);
137         alias pglCreateShaderProgramv = GLuint function(GLenum, GLsizei, const(GLchar*)*);
138         alias pglBindProgramPipeline = void function(GLuint);
139         alias pglDeleteProgramPipelines = void function(GLsizei, const(GLuint)*);
140         alias pglGenProgramPipelines = void function(GLsizei, GLuint*);
141         alias pglIsProgramPipeline = GLboolean function(GLuint);
142         alias pglGetProgramPipelineiv = void function(GLuint, GLenum, GLint*);
143         alias pglProgramUniform1i = void function(GLuint, GLint, GLint);
144         alias pglProgramUniform1iv = void function(GLuint, GLint, GLsizei, const(GLint)*);
145         alias pglProgramUniform1f = void function(GLuint, GLint, GLfloat);
146         alias pglProgramUniform1fv = void function(GLuint, GLint, GLsizei, const(GLfloat)*);
147         alias pglProgramUniform1d = void function(GLuint, GLint, GLdouble);
148         alias pglProgramUniform1dv = void function(GLuint, GLint, GLsizei, const(GLdouble)*);
149         alias pglProgramUniform1ui = void function(GLuint, GLint, GLuint);
150         alias pglProgramUniform1uiv = void function(GLuint, GLint, GLsizei, const(GLuint)*);
151         alias pglProgramUniform2i = void function(GLuint, GLint, GLint, GLint);
152         alias pglProgramUniform2iv = void function(GLuint, GLint, GLsizei, const(GLint)*);
153         alias pglProgramUniform2f = void function(GLuint, GLint, GLfloat, GLfloat);
154         alias pglProgramUniform2fv = void function(GLuint, GLint, GLsizei, const(GLfloat)*);
155         alias pglProgramUniform2d = void function(GLuint, GLint, GLdouble, GLdouble);
156         alias pglProgramUniform2dv = void function(GLuint, GLint, GLsizei, const(GLdouble)*);
157         alias pglProgramUniform2ui = void function(GLuint, GLint, GLuint, GLuint);
158         alias pglProgramUniform2uiv = void function(GLuint, GLint, GLsizei, const(GLuint)*);
159         alias pglProgramUniform3i = void function(GLuint, GLint, GLint, GLint, GLint);
160         alias pglProgramUniform3iv = void function(GLuint, GLint, GLsizei, const(GLint)*);
161         alias pglProgramUniform3f = void function(GLuint, GLint, GLfloat, GLfloat, GLfloat);
162         alias pglProgramUniform3fv = void function(GLuint, GLint, GLsizei, const(GLfloat)*);
163         alias pglProgramUniform3d = void function(GLuint, GLint, GLdouble, GLdouble, GLdouble);
164         alias pglProgramUniform3dv = void function(GLuint, GLint, GLsizei, const(GLdouble)*);
165         alias pglProgramUniform3ui = void function(GLuint, GLint, GLuint, GLuint, GLuint);
166         alias pglProgramUniform3uiv = void function(GLuint, GLint, GLsizei, const(GLuint)*);
167         alias pglProgramUniform4i = void function(GLuint, GLint, GLint, GLint, GLint, GLint);
168         alias pglProgramUniform4iv = void function(GLuint, GLint, GLsizei, const(GLint)*);
169         alias pglProgramUniform4f = void function(GLuint, GLint, GLfloat, GLfloat, GLfloat, GLfloat);
170         alias pglProgramUniform4fv = void function(GLuint, GLint, GLsizei, const(GLfloat)*);
171         alias pglProgramUniform4d = void function(GLuint, GLint, GLdouble, GLdouble, GLdouble, GLdouble);
172         alias pglProgramUniform4dv = void function(GLuint, GLint, GLsizei, const(GLdouble)*);
173         alias pglProgramUniform4ui = void function(GLuint, GLint, GLuint, GLuint, GLuint, GLuint);
174         alias pglProgramUniform4uiv = void function(GLuint, GLint, GLsizei, const(GLuint)*);
175         alias pglProgramUniformMatrix2fv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLfloat)*);
176         alias pglProgramUniformMatrix3fv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLfloat)*);
177         alias pglProgramUniformMatrix4fv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLfloat)*);
178         alias pglProgramUniformMatrix2dv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLdouble)*);
179         alias pglProgramUniformMatrix3dv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLdouble)*);
180         alias pglProgramUniformMatrix4dv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLdouble)*);
181         alias pglProgramUniformMatrix2x3fv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLfloat)*);
182         alias pglProgramUniformMatrix3x2fv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLfloat)*);
183         alias pglProgramUniformMatrix2x4fv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLfloat)*);
184         alias pglProgramUniformMatrix4x2fv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLfloat)*);
185         alias pglProgramUniformMatrix3x4fv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLfloat)*);
186         alias pglProgramUniformMatrix4x3fv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLfloat)*);
187         alias pglProgramUniformMatrix2x3dv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLdouble)*);
188         alias pglProgramUniformMatrix3x2dv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLdouble)*);
189         alias pglProgramUniformMatrix2x4dv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLdouble)*);
190         alias pglProgramUniformMatrix4x2dv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLdouble)*);
191         alias pglProgramUniformMatrix3x4dv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLdouble)*);
192         alias pglProgramUniformMatrix4x3dv = void function(GLuint, GLint, GLsizei, GLboolean, const(GLdouble)*);
193         alias pglValidateProgramPipeline = void function(GLuint);
194         alias pglGetProgramPipelineInfoLog = void function(GLuint, GLsizei, GLsizei*, GLchar*);
195     }
196 
197     __gshared {
198         pglUseProgramStages glUseProgramStages;
199         pglActiveShaderProgram glActiveShaderProgram;
200         pglCreateShaderProgramv glCreateShaderProgramv;
201         pglBindProgramPipeline glBindProgramPipeline;
202         pglDeleteProgramPipelines glDeleteProgramPipelines;
203         pglGenProgramPipelines glGenProgramPipelines;
204         pglIsProgramPipeline glIsProgramPipeline;
205         pglGetProgramPipelineiv glGetProgramPipelineiv;
206         pglProgramUniform1i glProgramUniform1i;
207         pglProgramUniform1iv glProgramUniform1iv;
208         pglProgramUniform1f glProgramUniform1f;
209         pglProgramUniform1fv glProgramUniform1fv;
210         pglProgramUniform1d glProgramUniform1d;
211         pglProgramUniform1dv glProgramUniform1dv;
212         pglProgramUniform1ui glProgramUniform1ui;
213         pglProgramUniform1uiv glProgramUniform1uiv;
214         pglProgramUniform2i glProgramUniform2i;
215         pglProgramUniform2iv glProgramUniform2iv;
216         pglProgramUniform2f glProgramUniform2f;
217         pglProgramUniform2fv glProgramUniform2fv;
218         pglProgramUniform2d glProgramUniform2d;
219         pglProgramUniform2dv glProgramUniform2dv;
220         pglProgramUniform2ui glProgramUniform2ui;
221         pglProgramUniform2uiv glProgramUniform2uiv;
222         pglProgramUniform3i glProgramUniform3i;
223         pglProgramUniform3iv glProgramUniform3iv;
224         pglProgramUniform3f glProgramUniform3f;
225         pglProgramUniform3fv glProgramUniform3fv;
226         pglProgramUniform3d glProgramUniform3d;
227         pglProgramUniform3dv glProgramUniform3dv;
228         pglProgramUniform3ui glProgramUniform3ui;
229         pglProgramUniform3uiv glProgramUniform3uiv;
230         pglProgramUniform4i glProgramUniform4i;
231         pglProgramUniform4iv glProgramUniform4iv;
232         pglProgramUniform4f glProgramUniform4f;
233         pglProgramUniform4fv glProgramUniform4fv;
234         pglProgramUniform4d glProgramUniform4d;
235         pglProgramUniform4dv glProgramUniform4dv;
236         pglProgramUniform4ui glProgramUniform4ui;
237         pglProgramUniform4uiv glProgramUniform4uiv;
238         pglProgramUniformMatrix2fv glProgramUniformMatrix2fv;
239         pglProgramUniformMatrix3fv glProgramUniformMatrix3fv;
240         pglProgramUniformMatrix4fv glProgramUniformMatrix4fv;
241         pglProgramUniformMatrix2dv glProgramUniformMatrix2dv;
242         pglProgramUniformMatrix3dv glProgramUniformMatrix3dv;
243         pglProgramUniformMatrix4dv glProgramUniformMatrix4dv;
244         pglProgramUniformMatrix2x3fv glProgramUniformMatrix2x3fv;
245         pglProgramUniformMatrix3x2fv glProgramUniformMatrix3x2fv;
246         pglProgramUniformMatrix2x4fv glProgramUniformMatrix2x4fv;
247         pglProgramUniformMatrix4x2fv glProgramUniformMatrix4x2fv;
248         pglProgramUniformMatrix3x4fv glProgramUniformMatrix3x4fv;
249         pglProgramUniformMatrix4x3fv glProgramUniformMatrix4x3fv;
250         pglProgramUniformMatrix2x3dv glProgramUniformMatrix2x3dv;
251         pglProgramUniformMatrix3x2dv glProgramUniformMatrix3x2dv;
252         pglProgramUniformMatrix2x4dv glProgramUniformMatrix2x4dv;
253         pglProgramUniformMatrix4x2dv glProgramUniformMatrix4x2dv;
254         pglProgramUniformMatrix3x4dv glProgramUniformMatrix3x4dv;
255         pglProgramUniformMatrix4x3dv glProgramUniformMatrix4x3dv;
256         pglValidateProgramPipeline glValidateProgramPipeline;
257         pglGetProgramPipelineInfoLog glGetProgramPipelineInfoLog;
258     }
259 
260     private @nogc nothrow
261     bool loadARBSeparateShaderObjects(SharedLib lib, GLSupport contextVersion)
262     {
263         lib.bindGLSymbol(cast(void**)&glUseProgramStages, "glUseProgramStages");
264         lib.bindGLSymbol(cast(void**)&glActiveShaderProgram, "glActiveShaderProgram");
265         lib.bindGLSymbol(cast(void**)&glCreateShaderProgramv, "glCreateShaderProgramv");
266         lib.bindGLSymbol(cast(void**)&glBindProgramPipeline, "glBindProgramPipeline");
267         lib.bindGLSymbol(cast(void**)&glDeleteProgramPipelines, "glDeleteProgramPipelines");
268         lib.bindGLSymbol(cast(void**)&glGenProgramPipelines, "glGenProgramPipelines");
269         lib.bindGLSymbol(cast(void**)&glIsProgramPipeline, "glIsProgramPipeline");
270         lib.bindGLSymbol(cast(void**)&glGetProgramPipelineiv, "glGetProgramPipelineiv");
271         lib.bindGLSymbol(cast(void**)&glProgramUniform1i, "glProgramUniform1i");
272         lib.bindGLSymbol(cast(void**)&glProgramUniform1iv, "glProgramUniform1iv");
273         lib.bindGLSymbol(cast(void**)&glProgramUniform1f, "glProgramUniform1f");
274         lib.bindGLSymbol(cast(void**)&glProgramUniform1fv, "glProgramUniform1fv");
275         lib.bindGLSymbol(cast(void**)&glProgramUniform1d, "glProgramUniform1d");
276         lib.bindGLSymbol(cast(void**)&glProgramUniform1dv, "glProgramUniform1dv");
277         lib.bindGLSymbol(cast(void**)&glProgramUniform1ui, "glProgramUniform1ui");
278         lib.bindGLSymbol(cast(void**)&glProgramUniform1uiv, "glProgramUniform1uiv");
279         lib.bindGLSymbol(cast(void**)&glProgramUniform2i, "glProgramUniform2i");
280         lib.bindGLSymbol(cast(void**)&glProgramUniform2iv, "glProgramUniform2iv");
281         lib.bindGLSymbol(cast(void**)&glProgramUniform2f, "glProgramUniform2f");
282         lib.bindGLSymbol(cast(void**)&glProgramUniform2fv, "glProgramUniform2fv");
283         lib.bindGLSymbol(cast(void**)&glProgramUniform2d, "glProgramUniform2d");
284         lib.bindGLSymbol(cast(void**)&glProgramUniform2dv, "glProgramUniform2dv");
285         lib.bindGLSymbol(cast(void**)&glProgramUniform2ui, "glProgramUniform2ui");
286         lib.bindGLSymbol(cast(void**)&glProgramUniform2uiv, "glProgramUniform2uiv");
287         lib.bindGLSymbol(cast(void**)&glProgramUniform3i, "glProgramUniform3i");
288         lib.bindGLSymbol(cast(void**)&glProgramUniform3iv, "glProgramUniform3iv");
289         lib.bindGLSymbol(cast(void**)&glProgramUniform3f, "glProgramUniform3f");
290         lib.bindGLSymbol(cast(void**)&glProgramUniform3fv, "glProgramUniform3fv");
291         lib.bindGLSymbol(cast(void**)&glProgramUniform3d, "glProgramUniform3d");
292         lib.bindGLSymbol(cast(void**)&glProgramUniform3dv, "glProgramUniform3dv");
293         lib.bindGLSymbol(cast(void**)&glProgramUniform3ui, "glProgramUniform3ui");
294         lib.bindGLSymbol(cast(void**)&glProgramUniform3uiv, "glProgramUniform3uiv");
295         lib.bindGLSymbol(cast(void**)&glProgramUniform4i, "glProgramUniform4i");
296         lib.bindGLSymbol(cast(void**)&glProgramUniform4iv, "glProgramUniform4iv");
297         lib.bindGLSymbol(cast(void**)&glProgramUniform4f, "glProgramUniform4f");
298         lib.bindGLSymbol(cast(void**)&glProgramUniform4fv, "glProgramUniform4fv");
299         lib.bindGLSymbol(cast(void**)&glProgramUniform4d, "glProgramUniform4d");
300         lib.bindGLSymbol(cast(void**)&glProgramUniform4dv, "glProgramUniform4dv");
301         lib.bindGLSymbol(cast(void**)&glProgramUniform4ui, "glProgramUniform4ui");
302         lib.bindGLSymbol(cast(void**)&glProgramUniform4uiv, "glProgramUniform4uiv");
303         lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix2fv, "glProgramUniformMatrix2fv");
304         lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix3fv, "glProgramUniformMatrix3fv");
305         lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix4fv, "glProgramUniformMatrix4fv");
306         lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix2dv, "glProgramUniformMatrix2dv");
307         lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix3dv, "glProgramUniformMatrix3dv");
308         lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix4dv, "glProgramUniformMatrix4dv");
309         lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix2x3fv, "glProgramUniformMatrix2x3fv");
310         lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix3x2fv, "glProgramUniformMatrix3x2fv");
311         lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix2x4fv, "glProgramUniformMatrix2x4fv");
312         lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix4x2fv, "glProgramUniformMatrix4x2fv");
313         lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix3x4fv, "glProgramUniformMatrix3x4fv");
314         lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix4x3fv, "glProgramUniformMatrix4x3fv");
315         lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix2x3dv, "glProgramUniformMatrix2x3dv");
316         lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix3x2dv, "glProgramUniformMatrix3x2dv");
317         lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix2x4dv, "glProgramUniformMatrix2x4dv");
318         lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix4x2dv, "glProgramUniformMatrix4x2dv");
319         lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix3x4dv, "glProgramUniformMatrix3x4dv");
320         lib.bindGLSymbol(cast(void**)&glProgramUniformMatrix4x3dv, "glProgramUniformMatrix4x3dv");
321         lib.bindGLSymbol(cast(void**)&glValidateProgramPipeline, "glValidateProgramPipeline");
322         lib.bindGLSymbol(cast(void**)&glGetProgramPipelineInfoLog, "glGetProgramPipelineInfoLog");
323         return resetErrorCountGL();
324     }
325 }
326 else enum hasARBSeparateShaderObjects = false;
327 
328 // ARB_vertex_attrib_64bit
329 version(GL_ARB) enum useARBVertexAttrib64Bit = true;
330 else version(GL_ARB_vertex_attrib_64bit) enum useARBVertexAttrib64Bit = true;
331 else enum useARBVertexAttrib64Bit = has41;
332 
333 static if(useARBVertexAttrib64Bit) {
334     private bool _hasARBVertexAttrib64Bit;
335     bool hasARBVertexAttrib64Bit() { return _hasARBVertexAttrib64Bit; }
336 
337     extern(System) @nogc nothrow {
338         alias pglVertexAttribL1d = void function(GLuint, GLdouble);
339         alias pglVertexAttribL2d = void function(GLuint, GLdouble, GLdouble);
340         alias pglVertexAttribL3d = void function(GLuint, GLdouble, GLdouble, GLdouble);
341         alias pglVertexAttribL4d = void function(GLuint, GLdouble, GLdouble, GLdouble, GLdouble);
342         alias pglVertexAttribL1dv = void function(GLuint, const(GLdouble)*);
343         alias pglVertexAttribL2dv = void function(GLuint, const(GLdouble)*);
344         alias pglVertexAttribL3dv = void function(GLuint, const(GLdouble)*);
345         alias pglVertexAttribL4dv = void function(GLuint, const(GLdouble)*);
346         alias pglVertexAttribLPointer = void function(GLuint, GLint, GLenum, GLsizei, const(GLvoid)*);
347         alias pglGetVertexAttribLdv = void function(GLuint, GLenum, GLdouble*);
348     }
349 
350     __gshared {
351         pglVertexAttribL1d glVertexAttribL1d;
352         pglVertexAttribL2d glVertexAttribL2d;
353         pglVertexAttribL3d glVertexAttribL3d;
354         pglVertexAttribL4d glVertexAttribL4d;
355         pglVertexAttribL1dv glVertexAttribL1dv;
356         pglVertexAttribL2dv glVertexAttribL2dv;
357         pglVertexAttribL3dv glVertexAttribL3dv;
358         pglVertexAttribL4dv glVertexAttribL4dv;
359         pglVertexAttribLPointer glVertexAttribLPointer;
360         pglGetVertexAttribLdv glGetVertexAttribLdv;
361     }
362 
363     private @nogc nothrow
364     bool loadARBVertexAttrib64Bit(SharedLib lib, GLSupport contextVersion)
365     {
366         lib.bindGLSymbol(cast(void**)&glVertexAttribL1d, "glVertexAttribL1d");
367         lib.bindGLSymbol(cast(void**)&glVertexAttribL2d, "glVertexAttribL2d");
368         lib.bindGLSymbol(cast(void**)&glVertexAttribL3d, "glVertexAttribL3d");
369         lib.bindGLSymbol(cast(void**)&glVertexAttribL4d, "glVertexAttribL4d");
370         lib.bindGLSymbol(cast(void**)&glVertexAttribL1dv, "glVertexAttribL1dv");
371         lib.bindGLSymbol(cast(void**)&glVertexAttribL2dv, "glVertexAttribL2dv");
372         lib.bindGLSymbol(cast(void**)&glVertexAttribL3dv, "glVertexAttribL3dv");
373         lib.bindGLSymbol(cast(void**)&glVertexAttribL4dv, "glVertexAttribL4dv");
374         lib.bindGLSymbol(cast(void**)&glVertexAttribLPointer, "glVertexAttribLPointer");
375         lib.bindGLSymbol(cast(void**)&glGetVertexAttribLdv, "glGetVertexAttribLdv");
376         return resetErrorCountGL();
377     }
378 }
379 else enum hasARBVertexAttrib64Bit = false;
380 
381 // ARB_viewport_array
382 version(GL_ARB) enum useARBViewportArray = true;
383 else version(GL_ARB_viewport_array) enum useARBViewportArray = true;
384 else enum useARBViewportArray = has41;
385 
386 static if(useARBViewportArray) {
387     private bool _hasARBViewportArray;
388     bool hasARBViewportArray() { return _hasARBViewportArray; }
389 
390     enum : uint {
391         GL_MAX_VIEWPORTS                  = 0x825B,
392         GL_VIEWPORT_SUBPIXEL_BITS         = 0x825C,
393         GL_VIEWPORT_BOUNDS_RANGE          = 0x825D,
394         GL_LAYER_PROVOKING_VERTEX         = 0x825E,
395         GL_VIEWPORT_INDEX_PROVOKING_VERTEX = 0x825F,
396         GL_UNDEFINED_VERTEX               = 0x8260,
397     }
398 
399     extern(System) @nogc nothrow {
400         alias pglViewportArrayv = void function(GLuint, GLsizei, const(GLfloat)*);
401         alias pglViewportIndexedf = void function(GLuint, GLfloat, GLfloat, GLfloat, GLfloat);
402         alias pglViewportIndexedfv = void function(GLuint, const(GLfloat)*);
403         alias pglScissorArrayv = void function(GLuint, GLsizei, const(GLint)*);
404         alias pglScissorIndexed = void function(GLuint, GLint, GLint, GLsizei, GLsizei);
405         alias pglScissorIndexedv = void function(GLuint, const(GLint)*);
406         alias pglDepthRangeArrayv = void function(GLuint, GLsizei, const(GLclampd)*);
407         alias pglDepthRangeIndexed = void function(GLuint, GLclampd, GLclampd);
408         alias pglGetFloati_v = void function(GLenum, GLuint, GLfloat*);
409         alias pglGetDoublei_v = void function(GLenum, GLuint, GLdouble*);
410     }
411 
412     __gshared {
413         pglViewportArrayv glViewportArrayv;
414         pglViewportIndexedf glViewportIndexedf;
415         pglViewportIndexedfv glViewportIndexedfv;
416         pglScissorArrayv glScissorArrayv;
417         pglScissorIndexed glScissorIndexed;
418         pglScissorIndexedv glScissorIndexedv;
419         pglDepthRangeArrayv glDepthRangeArrayv;
420         pglDepthRangeIndexed glDepthRangeIndexed;
421         pglGetFloati_v glGetFloati_v;
422         pglGetDoublei_v glGetDoublei_v;
423     }
424 
425     private @nogc nothrow
426     bool loadARBViewportArray(SharedLib lib, GLSupport contextVersion)
427     {
428         lib.bindGLSymbol(cast(void**)&glViewportArrayv, "glViewportArrayv");
429         lib.bindGLSymbol(cast(void**)&glViewportIndexedf, "glViewportIndexedf");
430         lib.bindGLSymbol(cast(void**)&glViewportIndexedfv, "glViewportIndexedfv");
431         lib.bindGLSymbol(cast(void**)&glScissorArrayv, "glScissorArrayv");
432         lib.bindGLSymbol(cast(void**)&glScissorIndexed, "glScissorIndexed");
433         lib.bindGLSymbol(cast(void**)&glScissorIndexedv, "glScissorIndexedv");
434         lib.bindGLSymbol(cast(void**)&glDepthRangeArrayv, "glDepthRangeArrayv");
435         lib.bindGLSymbol(cast(void**)&glDepthRangeIndexed, "glDepthRangeIndexed");
436         lib.bindGLSymbol(cast(void**)&glGetFloati_v, "glGetFloati_v");
437         lib.bindGLSymbol(cast(void**)&glGetDoublei_v, "glGetDoublei_v");
438         return resetErrorCountGL();
439     }
440 }
441 else enum hasARBViewportArray = false;
442 
443 package(bindbc.opengl) @nogc nothrow
444 bool loadARB41(SharedLib lib, GLSupport contextVersion)
445 {
446     static if(has41) {
447         if(contextVersion >= GLSupport.gl41) {
448             bool ret = true;
449             ret = _hasARBES2Compatibility = lib.loadARBES2Compatibility(contextVersion);
450             ret = _hasARBGetProgramBinary = lib.loadARBGetProgramBinary(contextVersion);
451             ret = _hasARBSeparateShaderObjects = lib.loadARBSeparateShaderObjects(contextVersion);
452             ret = _hasARBVertexAttrib64Bit = lib.loadARBVertexAttrib64Bit(contextVersion);
453             ret = _hasARBViewportArray = lib.loadARBViewportArray(contextVersion);
454             return ret;
455         }
456     }
457 
458     static if(useARBES2Compatibility) _hasARBES2Compatibility =
459             hasExtension(contextVersion, "GL_ARB_ES2_compatibility") &&
460             lib.loadARBES2Compatibility(contextVersion);
461 
462     static if(useARBGetProgramBinary) _hasARBGetProgramBinary =
463             hasExtension(contextVersion, "GL_ARB_get_program_binary") &&
464             lib.loadARBGetProgramBinary(contextVersion);
465 
466     static if(useARBSeparateShaderObjects) _hasARBSeparateShaderObjects =
467             hasExtension(contextVersion, "GL_ARB_separate_shader_objects") &&
468             lib.loadARBSeparateShaderObjects(contextVersion);
469 
470     static if(useARBVertexAttrib64Bit) _hasARBVertexAttrib64Bit =
471             hasExtension(contextVersion, "GL_ARB_vertex_attrib_64bit") &&
472             lib.loadARBVertexAttrib64Bit(contextVersion);
473 
474     static if(useARBViewportArray) _hasARBViewportArray =
475             hasExtension(contextVersion, "GL_ARB_viewport_array") &&
476             lib.loadARBViewportArray(contextVersion);
477 
478     return true;
479 }