1
2 // Copyright 2018 - 2021 Michael D. Parker
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_32;
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.gl32) {
15 enum has32 = true;
16 }
17 else enum has32 = false;
18
19 // ARB_depth_clamp
20 version(GL_ARB) enum useARBDepthClamp = true;
21 else version(GL_ARB_depth_clamp) enum useARBDepthClamp = true;
22 else enum useARBDepthClamp = has32;
23
24 static if(useARBDepthClamp) {
25 private bool _hasARBDepthClamp;
26 @nogc nothrow bool hasARBDepthClamp() { return _hasARBDepthClamp; }
27
28 enum uint GL_DEPTH_CLAMP = 0x864F;
29 }
30 else enum hasARBDepthClamp = false;
31
32 // ARB_provoking_vertex
33 version(GL_ARB) enum useARBProvokingVertex = true;
34 else version(GL_ARB_provoking_vertex) enum useARBProvokingVertex = true;
35 else enum useARBProvokingVertex = has32;
36
37 static if(useARBProvokingVertex) {
38 private bool _hasARBProvokingVertex;
39 @nogc nothrow bool hasARBProvokingVertex() { return _hasARBProvokingVertex; }
40
41 enum : uint {
42 GL_QUADS_FOLLOW_PROVOKING_VERTEX_CONVENTION = 0x8E4C,
43 GL_FIRST_VERTEX_CONVENTION = 0x8E4D,
44 GL_LAST_VERTEX_CONVENTION = 0x8E4E,
45 GL_PROVOKING_VERTEX = 0x8E4F,
46 }
47
48 extern(System) @nogc nothrow {
49 alias pglProvokingVertex = void function(GLenum);
50 }
51
52 __gshared {
53 pglProvokingVertex glProvokingVertex;
54 }
55
56 private @nogc nothrow
57 bool loadARBProvokingVertex(SharedLib lib, GLSupport contextVersion)
58 {
59 lib.bindGLSymbol(cast(void**)&glProvokingVertex, "glProvokingVertex");
60 return resetErrorCountGL();
61 }
62 }
63 else enum hasARBProvokingVertex = false;
64
65 // ARB_seamless_cube_map
66 version(GL_ARB) enum useARBSeamlessCubeMap = true;
67 else version(GL_ARB_seamless_cube_map) enum useARBSeamlessCubeMap = true;
68 else enum useARBSeamlessCubeMap = has32;
69
70 static if(useARBSeamlessCubeMap) {
71 private bool _hasARBSeamlessCubeMap;
72 @nogc nothrow bool hasARBSeamlessCubeMap() { return _hasARBSeamlessCubeMap; }
73
74 enum uint GL_TEXTURE_CUBE_MAP_SEAMLESS = 0x884F;
75 }
76 else enum hasARBSeamlessCubeMap = false;
77
78 // ARB_draw_elements_base_vertex
79 version(GL_ARB) enum useARBDrawElementsBaseVertex = true;
80 else version(GL_ARB_draw_elements_base_vertex) enum useARBDrawElementsBaseVertex = true;
81 else enum useARBDrawElementsBaseVertex = has32;
82
83 static if(useARBDrawElementsBaseVertex) {
84 private bool _hasARBDrawElementsBaseVertex;
85 @nogc nothrow bool hasARBDrawElementsBaseVertex() { return _hasARBDrawElementsBaseVertex; }
86
87 extern(System) @nogc nothrow {
88 alias pglDrawElementsBaseVertex = void function(GLenum, GLsizei, GLenum, const(GLvoid)*, GLint);
89 alias pglDrawRangeElementsBaseVertex = void function(GLenum, GLuint, GLuint, GLsizei, GLenum, const(GLvoid)*, GLint);
90 alias pglDrawElementsInstancedBaseVertex = void function(GLenum, GLsizei, GLenum, const(GLvoid)*, GLsizei, GLint);
91 alias pglMultiDrawElementsBaseVertex = void function(GLenum, const(GLsizei)*, GLenum, const(GLvoid*)*, GLsizei, const(GLint)*);
92 }
93
94 __gshared {
95 pglDrawElementsBaseVertex glDrawElementsBaseVertex;
96 pglDrawRangeElementsBaseVertex glDrawRangeElementsBaseVertex;
97 pglDrawElementsInstancedBaseVertex glDrawElementsInstancedBaseVertex;
98 pglMultiDrawElementsBaseVertex glMultiDrawElementsBaseVertex;
99 }
100
101 private @nogc nothrow
102 bool loadARBDrawElementsBaseVertex(SharedLib lib, GLSupport contextVersion)
103 {
104 lib.bindGLSymbol(cast(void**)&glDrawElementsBaseVertex, "glDrawElementsBaseVertex");
105 lib.bindGLSymbol(cast(void**)&glDrawRangeElementsBaseVertex, "glDrawRangeElementsBaseVertex");
106 lib.bindGLSymbol(cast(void**)&glDrawElementsInstancedBaseVertex, "glDrawElementsInstancedBaseVertex");
107 lib.bindGLSymbol(cast(void**)&glMultiDrawElementsBaseVertex, "glMultiDrawElementsBaseVertex");
108 return resetErrorCountGL();
109 }
110 }
111 else enum hasARBDrawElementsBaseVertex = false;
112
113 // ARB_sync
114 version(GL_ARB) enum useARBSync = true;
115 else version(GL_ARB_sync) enum useARBSync = true;
116 else enum useARBSync = has32;
117
118 alias GLint64 = long;
119 alias GLuint64 = ulong;
120 struct __GLsync;
121 alias __GLsync* GLsync;
122
123 static if(useARBSync) {
124 private bool _hasARBSync;
125 @nogc nothrow bool hasARBSync() { return _hasARBSync; }
126
127 enum : uint {
128 GL_MAX_SERVER_WAIT_TIMEOUT = 0x9111,
129 GL_OBJECT_TYPE = 0x9112,
130 GL_SYNC_CONDITION = 0x9113,
131 GL_SYNC_STATUS = 0x9114,
132 GL_SYNC_FLAGS = 0x9115,
133 GL_SYNC_FENCE = 0x9116,
134 GL_SYNC_GPU_COMMANDS_COMPLETE = 0x9117,
135 GL_UNSIGNALED = 0x9118,
136 GL_SIGNALED = 0x9119,
137 GL_ALREADY_SIGNALED = 0x911A,
138 GL_TIMEOUT_EXPIRED = 0x911B,
139 GL_CONDITION_SATISFIED = 0x911C,
140 GL_WAIT_FAILED = 0x911D,
141 GL_SYNC_FLUSH_COMMANDS_BIT = 0x00000001,
142 }
143
144 extern(System) @nogc nothrow {
145 alias pglFenceSync = GLsync function(GLenum, GLbitfield);
146 alias pglIsSync = GLboolean function(GLsync);
147 alias pglDeleteSync = void function(GLsync);
148 alias pglClientWaitSync = GLenum function(GLsync, GLbitfield, GLuint64);
149 alias pglWaitSync = void function(GLsync, GLbitfield, GLuint64);
150 alias pglGetInteger64v = void function(GLenum, GLint64*);
151 alias pglGetSynciv = void function(GLsync, GLenum, GLsizei, GLsizei*, GLint*);
152 }
153
154 __gshared {
155 pglFenceSync glFenceSync;
156 pglIsSync glIsSync;
157 pglDeleteSync glDeleteSync;
158 pglClientWaitSync glClientWaitSync;
159 pglWaitSync glWaitSync;
160 pglGetInteger64v glGetInteger64v;
161 pglGetSynciv glGetSynciv;
162 }
163
164 private @nogc nothrow
165 bool loadARBSync(SharedLib lib, GLSupport contextVersion)
166 {
167 lib.bindGLSymbol(cast(void**)&glFenceSync, "glFenceSync");
168 lib.bindGLSymbol(cast(void**)&glIsSync, "glIsSync");
169 lib.bindGLSymbol(cast(void**)&glDeleteSync, "glDeleteSync");
170 lib.bindGLSymbol(cast(void**)&glClientWaitSync, "glClientWaitSync");
171 lib.bindGLSymbol(cast(void**)&glWaitSync, "glWaitSync");
172 lib.bindGLSymbol(cast(void**)&glGetInteger64v, "glGetInteger64v");
173 lib.bindGLSymbol(cast(void**)&glGetSynciv, "glGetSynciv");
174 return resetErrorCountGL();
175 }
176 }
177 else enum hasARBSync = false;
178
179 // ARB_texture_multisample
180 version(GL_ARB) enum useARBTextureMultiSample = true;
181 else version(GL_ARB_texture_multisample) enum useARBTextureMultiSample = true;
182 else enum useARBTextureMultiSample = has32;
183
184 static if(useARBTextureMultiSample) {
185 private bool _hasARBTextureMultiSample;
186 @nogc nothrow bool hasARBTextureMultiSample() { return _hasARBTextureMultiSample; }
187
188 enum : uint {
189 GL_SAMPLE_POSITION = 0x8E50,
190 GL_SAMPLE_MASK = 0x8E51,
191 GL_SAMPLE_MASK_VALUE = 0x8E52,
192 GL_MAX_SAMPLE_MASK_WORDS = 0x8E59,
193 GL_TEXTURE_2D_MULTISAMPLE = 0x9100,
194 GL_PROXY_TEXTURE_2D_MULTISAMPLE = 0x9101,
195 GL_TEXTURE_2D_MULTISAMPLE_ARRAY = 0x9102,
196 GL_PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY = 0x9103,
197 GL_TEXTURE_BINDING_2D_MULTISAMPLE = 0x9104,
198 GL_TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY = 0x9105,
199 GL_TEXTURE_SAMPLES = 0x9106,
200 GL_TEXTURE_FIXED_SAMPLE_LOCATIONS = 0x9107,
201 GL_SAMPLER_2D_MULTISAMPLE = 0x9108,
202 GL_INT_SAMPLER_2D_MULTISAMPLE = 0x9109,
203 GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE = 0x910A,
204 GL_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910B,
205 GL_INT_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910C,
206 GL_UNSIGNED_INT_SAMPLER_2D_MULTISAMPLE_ARRAY = 0x910D,
207 GL_MAX_COLOR_TEXTURE_SAMPLES = 0x910E,
208 GL_MAX_DEPTH_TEXTURE_SAMPLES = 0x910F,
209 GL_MAX_INTEGER_SAMPLES = 0x9110,
210 }
211
212 extern(System) @nogc nothrow {
213 alias pglTexImage2DMultisample = void function(GLenum, GLsizei, GLint, GLsizei, GLsizei, GLboolean);
214 alias pglTexImage3DMultisample = void function(GLenum, GLsizei, GLint, GLsizei, GLsizei, GLsizei, GLboolean);
215 alias pglGetMultisamplefv = void function(GLenum, GLuint, GLfloat*);
216 alias pglSampleMaski = void function(GLuint, GLbitfield);
217 }
218
219 __gshared {
220 pglTexImage2DMultisample glTexImage2DMultisample;
221 pglTexImage3DMultisample glTexImage3DMultisample;
222 pglGetMultisamplefv glGetMultisamplefv;
223 pglSampleMaski glSampleMaski;
224 }
225
226 private @nogc nothrow
227 bool loadTextureMultiSample(SharedLib lib, GLSupport contextVersion)
228 {
229 lib.bindGLSymbol(cast(void**)&glTexImage2DMultisample, "glTexImage2DMultisample");
230 lib.bindGLSymbol(cast(void**)&glTexImage3DMultisample, "glTexImage3DMultisample");
231 lib.bindGLSymbol(cast(void**)&glGetMultisamplefv, "glGetMultisamplefv");
232 lib.bindGLSymbol(cast(void**)&glSampleMaski, "glSampleMaski");
233 return resetErrorCountGL();
234 }
235 }
236 else enum hasARBTextureMultiSample = false;
237
238 package(bindbc.opengl) @nogc nothrow
239 bool loadARB32(SharedLib lib, GLSupport contextVersion)
240 {
241 static if(has32) {
242 if(contextVersion >= GLSupport.gl32) {
243 _hasARBDepthClamp = true;
244 _hasARBSeamlessCubeMap = true;
245
246 bool ret = true;
247 ret = _hasARBProvokingVertex = lib.loadARBProvokingVertex(contextVersion);
248 ret = _hasARBDrawElementsBaseVertex = lib.loadARBDrawElementsBaseVertex(contextVersion);
249 ret = _hasARBSync = lib.loadARBSync(contextVersion);
250 ret = _hasARBTextureMultiSample = lib.loadTextureMultiSample(contextVersion);
251 return ret;
252 }
253 }
254
255 static if(useARBDepthClamp) _hasARBDepthClamp =
256 hasExtension(contextVersion, "GL_ARB_depth_clamp");
257
258 static if(useARBProvokingVertex) _hasARBProvokingVertex =
259 hasExtension(contextVersion, "GL_ARB_provoking_vertex") &&
260 lib.loadARBProvokingVertex(contextVersion);
261
262 static if(useARBSeamlessCubeMap) _hasARBSeamlessCubeMap =
263 hasExtension(contextVersion, "GL_ARB_seamless_cube_map");
264
265 static if(useARBDrawElementsBaseVertex) _hasARBDrawElementsBaseVertex =
266 hasExtension(contextVersion, "GL_ARB_draw_elements_base_vertex") &&
267 lib.loadARBDrawElementsBaseVertex(contextVersion);
268
269 static if(useARBSync) _hasARBSync =
270 hasExtension(contextVersion, "GL_ARB_sync") &&
271 lib.loadARBSync(contextVersion);
272
273 static if(useARBTextureMultiSample) _hasARBTextureMultiSample =
274 hasExtension(contextVersion, "GL_ARB_texture_multisample") &&
275 lib.loadTextureMultiSample(contextVersion);
276
277 return true;
278 }