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.gl30;
8 
9 import bindbc.opengl.config;
10 static if(glSupport >= GLSupport.gl30) {
11     import bindbc.loader : SharedLib;
12     import bindbc.opengl.context;
13     import bindbc.opengl.bind.types;
14 
15     enum : uint {
16         GL_COMPARE_REF_TO_TEXTURE         = 0x884E,
17         GL_CLIP_DISTANCE0                 = 0x3000,
18         GL_CLIP_DISTANCE1                 = 0x3001,
19         GL_CLIP_DISTANCE2                 = 0x3002,
20         GL_CLIP_DISTANCE3                 = 0x3003,
21         GL_CLIP_DISTANCE4                 = 0x3004,
22         GL_CLIP_DISTANCE5                 = 0x3005,
23         GL_CLIP_DISTANCE6                 = 0x3006,
24         GL_CLIP_DISTANCE7                 = 0x3007,
25         GL_MAX_CLIP_DISTANCES             = 0x0D32,
26         GL_MAJOR_VERSION                  = 0x821B,
27         GL_MINOR_VERSION                  = 0x821C,
28         GL_NUM_EXTENSIONS                 = 0x821D,
29         GL_CONTEXT_FLAGS                  = 0x821E,
30         GL_COMPRESSED_RED                 = 0x8225,
31         GL_COMPRESSED_RG                  = 0x8226,
32         GL_CONTEXT_FLAG_FORWARD_COMPATIBLE_BIT = 0x0001,
33         GL_RGBA32F                        = 0x8814,
34         GL_RGB32F                         = 0x8815,
35         GL_RGBA16F                        = 0x881A,
36         GL_RGB16F                         = 0x881B,
37         GL_VERTEX_ATTRIB_ARRAY_INTEGER    = 0x88FD,
38         GL_MAX_ARRAY_TEXTURE_LAYERS       = 0x88FF,
39         GL_MIN_PROGRAM_TEXEL_OFFSET       = 0x8904,
40         GL_MAX_PROGRAM_TEXEL_OFFSET       = 0x8905,
41         GL_CLAMP_READ_COLOR               = 0x891C,
42         GL_FIXED_ONLY                     = 0x891D,
43         GL_MAX_VARYING_COMPONENTS         = 0x8B4B,
44         GL_TEXTURE_1D_ARRAY               = 0x8C18,
45         GL_PROXY_TEXTURE_1D_ARRAY         = 0x8C19,
46         GL_TEXTURE_2D_ARRAY               = 0x8C1A,
47         GL_PROXY_TEXTURE_2D_ARRAY         = 0x8C1B,
48         GL_TEXTURE_BINDING_1D_ARRAY       = 0x8C1C,
49         GL_TEXTURE_BINDING_2D_ARRAY       = 0x8C1D,
50         GL_R11F_G11F_B10F                 = 0x8C3A,
51         GL_UNSIGNED_INT_10F_11F_11F_REV   = 0x8C3B,
52         GL_RGB9_E5                        = 0x8C3D,
53         GL_UNSIGNED_INT_5_9_9_9_REV       = 0x8C3E,
54         GL_TEXTURE_SHARED_SIZE            = 0x8C3F,
55         GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH = 0x8C76,
56         GL_TRANSFORM_FEEDBACK_BUFFER_MODE = 0x8C7F,
57         GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_COMPONENTS = 0x8C80,
58         GL_TRANSFORM_FEEDBACK_VARYINGS    = 0x8C83,
59         GL_TRANSFORM_FEEDBACK_BUFFER_START = 0x8C84,
60         GL_TRANSFORM_FEEDBACK_BUFFER_SIZE = 0x8C85,
61         GL_PRIMITIVES_GENERATED           = 0x8C87,
62         GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN = 0x8C88,
63         GL_RASTERIZER_DISCARD             = 0x8C89,
64         GL_MAX_TRANSFORM_FEEDBACK_INTERLEAVED_COMPONENTS = 0x8C8A,
65         GL_MAX_TRANSFORM_FEEDBACK_SEPARATE_ATTRIBS = 0x8C8B,
66         GL_INTERLEAVED_ATTRIBS            = 0x8C8C,
67         GL_SEPARATE_ATTRIBS               = 0x8C8D,
68         GL_TRANSFORM_FEEDBACK_BUFFER      = 0x8C8E,
69         GL_TRANSFORM_FEEDBACK_BUFFER_BINDING = 0x8C8F,
70         GL_RGBA32UI                       = 0x8D70,
71         GL_RGB32UI                        = 0x8D71,
72         GL_RGBA16UI                       = 0x8D76,
73         GL_RGB16UI                        = 0x8D77,
74         GL_RGBA8UI                        = 0x8D7C,
75         GL_RGB8UI                         = 0x8D7D,
76         GL_RGBA32I                        = 0x8D82,
77         GL_RGB32I                         = 0x8D83,
78         GL_RGBA16I                        = 0x8D88,
79         GL_RGB16I                         = 0x8D89,
80         GL_RGBA8I                         = 0x8D8E,
81         GL_RGB8I                          = 0x8D8F,
82         GL_RED_INTEGER                    = 0x8D94,
83         GL_GREEN_INTEGER                  = 0x8D95,
84         GL_BLUE_INTEGER                   = 0x8D96,
85         GL_RGB_INTEGER                    = 0x8D98,
86         GL_RGBA_INTEGER                   = 0x8D99,
87         GL_BGR_INTEGER                    = 0x8D9A,
88         GL_BGRA_INTEGER                   = 0x8D9B,
89         GL_SAMPLER_1D_ARRAY               = 0x8DC0,
90         GL_SAMPLER_2D_ARRAY               = 0x8DC1,
91         GL_SAMPLER_1D_ARRAY_SHADOW        = 0x8DC3,
92         GL_SAMPLER_2D_ARRAY_SHADOW        = 0x8DC4,
93         GL_SAMPLER_CUBE_SHADOW            = 0x8DC5,
94         GL_UNSIGNED_INT_VEC2              = 0x8DC6,
95         GL_UNSIGNED_INT_VEC3              = 0x8DC7,
96         GL_UNSIGNED_INT_VEC4              = 0x8DC8,
97         GL_INT_SAMPLER_1D                 = 0x8DC9,
98         GL_INT_SAMPLER_2D                 = 0x8DCA,
99         GL_INT_SAMPLER_3D                 = 0x8DCB,
100         GL_INT_SAMPLER_CUBE               = 0x8DCC,
101         GL_INT_SAMPLER_1D_ARRAY           = 0x8DCE,
102         GL_INT_SAMPLER_2D_ARRAY           = 0x8DCF,
103         GL_UNSIGNED_INT_SAMPLER_1D        = 0x8DD1,
104         GL_UNSIGNED_INT_SAMPLER_2D        = 0x8DD2,
105         GL_UNSIGNED_INT_SAMPLER_3D        = 0x8DD3,
106         GL_UNSIGNED_INT_SAMPLER_CUBE      = 0x8DD4,
107         GL_UNSIGNED_INT_SAMPLER_1D_ARRAY  = 0x8DD6,
108         GL_UNSIGNED_INT_SAMPLER_2D_ARRAY  = 0x8DD7,
109         GL_QUERY_WAIT                     = 0x8E13,
110         GL_QUERY_NO_WAIT                  = 0x8E14,
111         GL_QUERY_BY_REGION_WAIT           = 0x8E15,
112         GL_QUERY_BY_REGION_NO_WAIT        = 0x8E16,
113         GL_BUFFER_ACCESS_FLAGS            = 0x911F,
114         GL_BUFFER_MAP_LENGTH              = 0x9120,
115         GL_BUFFER_MAP_OFFSET              = 0x9121,
116     }
117 
118     extern(System) @nogc nothrow {
119         alias pglColorMaski = void function(GLuint,GLboolean,GLboolean,GLboolean,GLboolean);
120         alias pglGetBooleani_v = void function(GLenum,GLuint,GLboolean*);
121         alias pglGetIntegeri_v = void function(GLenum,GLuint,GLint*);
122         alias pglEnablei = void function(GLenum,GLuint);
123         alias pglDisablei = void function(GLenum,GLuint);
124         alias pglIsEnabledi = GLboolean function(GLenum,GLuint);
125         alias pglBeginTransformFeedback = void function(GLenum);
126         alias pglEndTransformFeedback = void function();
127         alias pglBindBufferRange = void function(GLenum,GLuint,GLuint,GLintptr,GLsizeiptr);
128         alias pglBindBufferBase = void function(GLenum,GLuint,GLuint);
129         alias pglTransformFeedbackVaryings = void function(GLuint,GLsizei,const(GLchar*)*,GLenum);
130         alias pglGetTransformFeedbackVarying = void function(GLuint,GLuint,GLsizei,GLsizei*,GLsizei*,GLenum*,GLchar*);
131         alias pglClampColor = void function(GLenum,GLenum);
132         alias pglBeginConditionalRender = void function(GLuint,GLenum);
133         alias pglEndConditionalRender = void function();
134         alias pglVertexAttribIPointer = void function(GLuint,GLint,GLenum,GLsizei,const(GLvoid)*);
135         alias pglGetVertexAttribIiv = void function(GLuint,GLenum,GLint*);
136         alias pglGetVertexAttribIuiv = void function(GLuint,GLenum,GLuint*);
137         alias pglVertexAttribI1i = void function(GLuint,GLint);
138         alias pglVertexAttribI2i = void function(GLuint,GLint,GLint);
139         alias pglVertexAttribI3i = void function(GLuint,GLint,GLint,GLint);
140         alias pglVertexAttribI4i = void function(GLuint,GLint,GLint,GLint,GLint);
141         alias pglVertexAttribI1ui = void function(GLuint,GLuint);
142         alias pglVertexAttribI2ui = void function(GLuint,GLuint,GLuint);
143         alias pglVertexAttribI3ui = void function(GLuint,GLuint,GLuint,GLuint);
144         alias pglVertexAttribI4ui = void function(GLuint,GLuint,GLuint,GLuint,GLuint);
145         alias pglVertexAttribI1iv = void function(GLuint,const(GLint)*);
146         alias pglVertexAttribI2iv = void function(GLuint,const(GLint)*);
147         alias pglVertexAttribI3iv = void function(GLuint,const(GLint)*);
148         alias pglVertexAttribI4iv = void function(GLuint,const(GLint)*);
149         alias pglVertexAttribI1uiv = void function(GLuint,const(GLuint)*);
150         alias pglVertexAttribI2uiv = void function(GLuint,const(GLuint)*);
151         alias pglVertexAttribI3uiv = void function(GLuint,const(GLuint)*);
152         alias pglVertexAttribI4uiv = void function(GLuint,const(GLuint)*);
153         alias pglVertexAttribI4bv = void function(GLuint,const(GLbyte)*);
154         alias pglVertexAttribI4sv = void function(GLuint,const(GLshort)*);
155         alias pglVertexAttribI4ubv = void function(GLuint,const(GLubyte)*);
156         alias pglVertexAttribI4usv = void function(GLuint,const(GLushort)*);
157         alias pglGetUniformuiv = void function(GLuint,GLint,GLuint*);
158         alias pglBindFragDataLocation = void function(GLuint,GLuint,const(GLchar)*);
159         alias pglGetFragDataLocation = GLint function(GLuint,const(GLchar)*);
160         alias pglUniform1ui = void function(GLint,GLuint);
161         alias pglUniform2ui = void function(GLint,GLuint,GLuint);
162         alias pglUniform3ui = void function(GLint,GLuint,GLuint,GLuint);
163         alias pglUniform4ui = void function(GLint,GLuint,GLuint,GLuint,GLuint);
164         alias pglUniform1uiv = void function(GLint,GLsizei,const(GLuint)*);
165         alias pglUniform2uiv = void function(GLint,GLsizei,const(GLuint)*);
166         alias pglUniform3uiv = void function(GLint,GLsizei,const(GLuint)*);
167         alias pglUniform4uiv = void function(GLint,GLsizei,const(GLuint)*);
168         alias pglTexParameterIiv = void function(GLenum,GLenum,const(GLint)*);
169         alias pglTexParameterIuiv = void function(GLenum,GLenum,const(GLuint)*);
170         alias pglGetTexParameterIiv = void function(GLenum,GLenum,GLint*);
171         alias pglGetTexParameterIuiv = void function(GLenum,GLenum,GLuint*);
172         alias pglClearBufferiv = void function(GLenum,GLint,const(GLint)*);
173         alias pglClearBufferuiv = void function(GLenum,GLint,const(GLuint)*);
174         alias pglClearBufferfv = void function(GLenum,GLint,const(GLfloat)*);
175         alias pglClearBufferfi = void function(GLenum,GLint,GLfloat,GLint);
176         alias pglGetStringi = const(char)* function(GLenum,GLuint);
177     }
178 
179     __gshared {
180         pglColorMaski glColorMaski;
181         pglGetBooleani_v glGetBooleani_v;
182         pglGetIntegeri_v glGetIntegeri_v;
183         pglEnablei glEnablei;
184         pglDisablei glDisablei;
185         pglIsEnabledi glIsEnabledi;
186         pglBeginTransformFeedback glBeginTransformFeedback;
187         pglEndTransformFeedback glEndTransformFeedback;
188         pglBindBufferRange glBindBufferRange;
189         pglBindBufferBase glBindBufferBase;
190         pglTransformFeedbackVaryings glTransformFeedbackVaryings;
191         pglGetTransformFeedbackVarying glGetTransformFeedbackVarying;
192         pglClampColor glClampColor;
193         pglBeginConditionalRender glBeginConditionalRender;
194         pglEndConditionalRender glEndConditionalRender;
195         pglVertexAttribIPointer glVertexAttribIPointer;
196         pglGetVertexAttribIiv glGetVertexAttribIiv;
197         pglGetVertexAttribIuiv glGetVertexAttribIuiv;
198         pglVertexAttribI1i glVertexAttribI1i;
199         pglVertexAttribI2i glVertexAttribI2i;
200         pglVertexAttribI3i glVertexAttribI3i;
201         pglVertexAttribI4i glVertexAttribI4i;
202         pglVertexAttribI1ui glVertexAttribI1ui;
203         pglVertexAttribI2ui glVertexAttribI2ui;
204         pglVertexAttribI3ui glVertexAttribI3ui;
205         pglVertexAttribI4ui glVertexAttribI4ui;
206         pglVertexAttribI1iv glVertexAttribI1iv;
207         pglVertexAttribI2iv glVertexAttribI2iv;
208         pglVertexAttribI3iv glVertexAttribI3iv;
209         pglVertexAttribI4iv glVertexAttribI4iv;
210         pglVertexAttribI1uiv glVertexAttribI1uiv;
211         pglVertexAttribI2uiv glVertexAttribI2uiv;
212         pglVertexAttribI3uiv glVertexAttribI3uiv;
213         pglVertexAttribI4uiv glVertexAttribI4uiv;
214         pglVertexAttribI4bv glVertexAttribI4bv;
215         pglVertexAttribI4sv glVertexAttribI4sv;
216         pglVertexAttribI4ubv glVertexAttribI4ubv;
217         pglVertexAttribI4usv glVertexAttribI4usv;
218         pglGetUniformuiv glGetUniformuiv;
219         pglBindFragDataLocation glBindFragDataLocation;
220         pglGetFragDataLocation glGetFragDataLocation;
221         pglUniform1ui glUniform1ui;
222         pglUniform2ui glUniform2ui;
223         pglUniform3ui glUniform3ui;
224         pglUniform4ui glUniform4ui;
225         pglUniform1uiv glUniform1uiv;
226         pglUniform2uiv glUniform2uiv;
227         pglUniform3uiv glUniform3uiv;
228         pglUniform4uiv glUniform4uiv;
229         pglTexParameterIiv glTexParameterIiv;
230         pglTexParameterIuiv glTexParameterIuiv;
231         pglGetTexParameterIiv glGetTexParameterIiv;
232         pglGetTexParameterIuiv glGetTexParameterIuiv;
233         pglClearBufferiv glClearBufferiv;
234         pglClearBufferuiv glClearBufferuiv;
235         pglClearBufferfv glClearBufferfv;
236         pglClearBufferfi glClearBufferfi;
237         pglGetStringi glGetStringi;
238     }
239 
240     package(bindbc.opengl) @nogc nothrow
241     GLSupport loadGL30(SharedLib lib, GLSupport contextVersion)
242     {
243         import bindbc.opengl.bind.arb : loadARB30;
244 
245         if(contextVersion >= GLSupport.gl30) {
246             lib.bindGLSymbol(cast(void**)&glColorMaski, "glColorMaski");
247             lib.bindGLSymbol(cast(void**)&glGetBooleani_v, "glGetBooleani_v");
248             lib.bindGLSymbol(cast(void**)&glGetIntegeri_v, "glGetIntegeri_v");
249             lib.bindGLSymbol(cast(void**)&glEnablei, "glEnablei");
250             lib.bindGLSymbol(cast(void**)&glDisablei, "glDisablei");
251             lib.bindGLSymbol(cast(void**)&glIsEnabledi, "glIsEnabledi");
252             lib.bindGLSymbol(cast(void**)&glBeginTransformFeedback, "glBeginTransformFeedback");
253             lib.bindGLSymbol(cast(void**)&glEndTransformFeedback, "glEndTransformFeedback");
254             lib.bindGLSymbol(cast(void**)&glBindBufferRange, "glBindBufferRange");
255             lib.bindGLSymbol(cast(void**)&glBindBufferBase, "glBindBufferBase");
256             lib.bindGLSymbol(cast(void**)&glTransformFeedbackVaryings, "glTransformFeedbackVaryings");
257             lib.bindGLSymbol(cast(void**)&glGetTransformFeedbackVarying, "glGetTransformFeedbackVarying");
258             lib.bindGLSymbol(cast(void**)&glClampColor, "glClampColor");
259             lib.bindGLSymbol(cast(void**)&glBeginConditionalRender, "glBeginConditionalRender");
260             lib.bindGLSymbol(cast(void**)&glEndConditionalRender, "glEndConditionalRender");
261             lib.bindGLSymbol(cast(void**)&glVertexAttribIPointer, "glVertexAttribIPointer");
262             lib.bindGLSymbol(cast(void**)&glGetVertexAttribIiv, "glGetVertexAttribIiv");
263             lib.bindGLSymbol(cast(void**)&glGetVertexAttribIuiv, "glGetVertexAttribIuiv");
264             lib.bindGLSymbol(cast(void**)&glVertexAttribI1i, "glVertexAttribI1i");
265             lib.bindGLSymbol(cast(void**)&glVertexAttribI2i, "glVertexAttribI2i");
266             lib.bindGLSymbol(cast(void**)&glVertexAttribI3i, "glVertexAttribI3i");
267             lib.bindGLSymbol(cast(void**)&glVertexAttribI4i, "glVertexAttribI4i");
268             lib.bindGLSymbol(cast(void**)&glVertexAttribI1ui, "glVertexAttribI1ui");
269             lib.bindGLSymbol(cast(void**)&glVertexAttribI2ui, "glVertexAttribI2ui");
270             lib.bindGLSymbol(cast(void**)&glVertexAttribI3ui, "glVertexAttribI3ui");
271             lib.bindGLSymbol(cast(void**)&glVertexAttribI4ui, "glVertexAttribI4ui");
272             lib.bindGLSymbol(cast(void**)&glVertexAttribI1iv, "glVertexAttribI1iv");
273             lib.bindGLSymbol(cast(void**)&glVertexAttribI2iv, "glVertexAttribI2iv");
274             lib.bindGLSymbol(cast(void**)&glVertexAttribI3iv, "glVertexAttribI3iv");
275             lib.bindGLSymbol(cast(void**)&glVertexAttribI4iv, "glVertexAttribI4iv");
276             lib.bindGLSymbol(cast(void**)&glVertexAttribI1uiv, "glVertexAttribI1uiv");
277             lib.bindGLSymbol(cast(void**)&glVertexAttribI2uiv, "glVertexAttribI2uiv");
278             lib.bindGLSymbol(cast(void**)&glVertexAttribI3uiv, "glVertexAttribI3uiv");
279             lib.bindGLSymbol(cast(void**)&glVertexAttribI4uiv, "glVertexAttribI4uiv");
280             lib.bindGLSymbol(cast(void**)&glVertexAttribI4bv, "glVertexAttribI4bv");
281             lib.bindGLSymbol(cast(void**)&glVertexAttribI4sv, "glVertexAttribI4sv");
282             lib.bindGLSymbol(cast(void**)&glVertexAttribI4ubv, "glVertexAttribI4ubv");
283             lib.bindGLSymbol(cast(void**)&glVertexAttribI4usv, "glVertexAttribI4usv");
284             lib.bindGLSymbol(cast(void**)&glGetUniformuiv, "glGetUniformuiv");
285             lib.bindGLSymbol(cast(void**)&glBindFragDataLocation, "glBindFragDataLocation");
286             lib.bindGLSymbol(cast(void**)&glGetFragDataLocation, "glGetFragDataLocation");
287             lib.bindGLSymbol(cast(void**)&glUniform1ui, "glUniform1ui");
288             lib.bindGLSymbol(cast(void**)&glUniform2ui, "glUniform2ui");
289             lib.bindGLSymbol(cast(void**)&glUniform3ui, "glUniform3ui");
290             lib.bindGLSymbol(cast(void**)&glUniform4ui, "glUniform4ui");
291             lib.bindGLSymbol(cast(void**)&glUniform1uiv, "glUniform1uiv");
292             lib.bindGLSymbol(cast(void**)&glUniform2uiv, "glUniform2uiv");
293             lib.bindGLSymbol(cast(void**)&glUniform3uiv, "glUniform3uiv");
294             lib.bindGLSymbol(cast(void**)&glUniform4uiv, "glUniform4uiv");
295             lib.bindGLSymbol(cast(void**)&glTexParameterIiv, "glTexParameterIiv");
296             lib.bindGLSymbol(cast(void**)&glTexParameterIuiv, "glTexParameterIuiv");
297             lib.bindGLSymbol(cast(void**)&glGetTexParameterIiv, "glGetTexParameterIiv");
298             lib.bindGLSymbol(cast(void**)&glGetTexParameterIuiv, "glGetTexParameterIuiv");
299             lib.bindGLSymbol(cast(void**)&glClearBufferiv, "glClearBufferiv");
300             lib.bindGLSymbol(cast(void**)&glClearBufferuiv, "glClearBufferuiv");
301             lib.bindGLSymbol(cast(void**)&glClearBufferfv, "glClearBufferfv");
302             lib.bindGLSymbol(cast(void**)&glClearBufferfi, "glClearBufferfi");
303             lib.bindGLSymbol(cast(void**)&glGetStringi, "glGetStringi");
304 
305             if(errorCountGL() == 0 && loadARB30(lib, contextVersion)) return GLSupport.gl30;
306         }
307         return GLSupport.gl21;
308     }
309 }