ScummVM API documentation
imgui_impl_opengl3_loader.h
1 //-----------------------------------------------------------------------------
2 // About imgui_impl_opengl3_loader.h:
3 //
4 // We embed our own OpenGL loader to not require user to provide their own or to have to use ours,
5 // which proved to be endless problems for users.
6 // Our loader is custom-generated, based on gl3w but automatically filtered to only include
7 // enums/functions that we use in our imgui_impl_opengl3.cpp source file in order to be small.
8 //
9 // YOU SHOULD NOT NEED TO INCLUDE/USE THIS DIRECTLY. THIS IS USED BY imgui_impl_opengl3.cpp ONLY.
10 // THE REST OF YOUR APP SHOULD USE A DIFFERENT GL LOADER: ANY GL LOADER OF YOUR CHOICE.
11 //
12 // IF YOU GET BUILD ERRORS IN THIS FILE (commonly macro redefinitions or function redefinitions):
13 // IT LIKELY MEANS THAT YOU ARE BUILDING 'imgui_impl_opengl3.cpp' OR INCLUDING 'imgui_impl_opengl3_loader.h'
14 // IN THE SAME COMPILATION UNIT AS ONE OF YOUR FILE WHICH IS USING A THIRD-PARTY OPENGL LOADER.
15 // (e.g. COULD HAPPEN IF YOU ARE DOING A UNITY/JUMBO BUILD, OR INCLUDING .CPP FILES FROM OTHERS)
16 // YOU SHOULD NOT BUILD BOTH IN THE SAME COMPILATION UNIT.
17 // BUT IF YOU REALLY WANT TO, you can '#define IMGUI_IMPL_OPENGL_LOADER_CUSTOM' and imgui_impl_opengl3.cpp
18 // WILL NOT BE USING OUR LOADER, AND INSTEAD EXPECT ANOTHER/YOUR LOADER TO BE AVAILABLE IN THE COMPILATION UNIT.
19 //
20 // Regenerate with:
21 // python3 gl3w_gen.py --output ../imgui/backends/imgui_impl_opengl3_loader.h --ref ../imgui/backends/imgui_impl_opengl3.cpp ./extra_symbols.txt
22 //
23 // More info:
24 // https://github.com/dearimgui/gl3w_stripped
25 // https://github.com/ocornut/imgui/issues/4445
26 //-----------------------------------------------------------------------------
27 
28 /*
29  * This file was generated with gl3w_gen.py, part of imgl3w
30  * (hosted at https://github.com/dearimgui/gl3w_stripped)
31  *
32  * This is free and unencumbered software released into the public domain.
33  *
34  * Anyone is free to copy, modify, publish, use, compile, sell, or
35  * distribute this software, either in source code form or as a compiled
36  * binary, for any purpose, commercial or non-commercial, and by any
37  * means.
38  *
39  * In jurisdictions that recognize copyright laws, the author or authors
40  * of this software dedicate any and all copyright interest in the
41  * software to the public domain. We make this dedication for the benefit
42  * of the public at large and to the detriment of our heirs and
43  * successors. We intend this dedication to be an overt act of
44  * relinquishment in perpetuity of all present and future rights to this
45  * software under copyright law.
46  *
47  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
48  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
49  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
50  * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
51  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
52  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
53  * OTHER DEALINGS IN THE SOFTWARE.
54  */
55 
56 #ifndef __gl3w_h_
57 #define __gl3w_h_
58 
59 #if defined(IMGL3W_SCUMMVM_LOADER)
60 #define FORBIDDEN_SYMBOL_ALLOW_ALL
61 #include "common/system.h"
62 #endif
63 
64 // Adapted from KHR/khrplatform.h to avoid including entire file.
65 #ifndef __khrplatform_h_
66 typedef float khronos_float_t;
67 typedef signed char khronos_int8_t;
68 typedef unsigned char khronos_uint8_t;
69 typedef signed short int khronos_int16_t;
70 typedef unsigned short int khronos_uint16_t;
71 #ifdef _WIN64
72 typedef signed long long int khronos_intptr_t;
73 typedef signed long long int khronos_ssize_t;
74 #else
75 typedef signed long int khronos_intptr_t;
76 typedef signed long int khronos_ssize_t;
77 #endif
78 
79 #if defined(_MSC_VER) && !defined(__clang__)
80 typedef signed __int64 khronos_int64_t;
81 typedef unsigned __int64 khronos_uint64_t;
82 #elif (defined(__clang__) || defined(__GNUC__)) && (__cplusplus < 201100)
83 #include <stdint.h>
84 typedef int64_t khronos_int64_t;
85 typedef uint64_t khronos_uint64_t;
86 #else
87 typedef signed long long khronos_int64_t;
88 typedef unsigned long long khronos_uint64_t;
89 #endif
90 #endif // __khrplatform_h_
91 
92 #ifndef __gl_glcorearb_h_
93 #define __gl_glcorearb_h_ 1
94 #ifdef __cplusplus
95 extern "C" {
96 #endif
97 /*
98 ** Copyright 2013-2020 The Khronos Group Inc.
99 ** SPDX-License-Identifier: MIT
100 **
101 ** This header is generated from the Khronos OpenGL / OpenGL ES XML
102 ** API Registry. The current version of the Registry, generator scripts
103 ** used to make the header, and the header can be found at
104 ** https://github.com/KhronosGroup/OpenGL-Registry
105 */
106 #if defined(_WIN32) && !defined(APIENTRY) && !defined(__CYGWIN__) && !defined(__SCITECH_SNAP__)
107 #ifndef WIN32_LEAN_AND_MEAN
108 #define WIN32_LEAN_AND_MEAN 1
109 #endif
110 #include <windows.h>
111 #endif
112 #ifndef APIENTRY
113 #define APIENTRY
114 #endif
115 #ifndef APIENTRYP
116 #define APIENTRYP APIENTRY *
117 #endif
118 #ifndef GLAPI
119 #define GLAPI extern
120 #endif
121 /* glcorearb.h is for use with OpenGL core profile implementations.
122 ** It should should be placed in the same directory as gl.h and
123 ** included as <GL/glcorearb.h>.
124 **
125 ** glcorearb.h includes only APIs in the latest OpenGL core profile
126 ** implementation together with APIs in newer ARB extensions which
127 ** can be supported by the core profile. It does not, and never will
128 ** include functionality removed from the core profile, such as
129 ** fixed-function vertex and fragment processing.
130 **
131 ** Do not #include both <GL/glcorearb.h> and either of <GL/gl.h> or
132 ** <GL/glext.h> in the same source file.
133 */
134 /* Generated C header for:
135  * API: gl
136  * Profile: core
137  * Versions considered: .*
138  * Versions emitted: .*
139  * Default extensions included: glcore
140  * Additional extensions included: _nomatch_^
141  * Extensions removed: _nomatch_^
142  */
143 #ifndef GL_VERSION_1_0
144 typedef void GLvoid;
145 typedef unsigned int GLenum;
146 
147 typedef khronos_float_t GLfloat;
148 typedef int GLint;
149 typedef int GLsizei;
150 typedef unsigned int GLbitfield;
151 typedef double GLdouble;
152 typedef unsigned int GLuint;
153 typedef unsigned char GLboolean;
154 typedef khronos_uint8_t GLubyte;
155 #define GL_COLOR_BUFFER_BIT 0x00004000
156 #define GL_FALSE 0
157 #define GL_TRUE 1
158 #define GL_TRIANGLES 0x0004
159 #define GL_ONE 1
160 #define GL_SRC_ALPHA 0x0302
161 #define GL_ONE_MINUS_SRC_ALPHA 0x0303
162 #define GL_FRONT 0x0404
163 #define GL_BACK 0x0405
164 #define GL_FRONT_AND_BACK 0x0408
165 #define GL_POLYGON_MODE 0x0B40
166 #define GL_CULL_FACE 0x0B44
167 #define GL_DEPTH_TEST 0x0B71
168 #define GL_STENCIL_TEST 0x0B90
169 #define GL_VIEWPORT 0x0BA2
170 #define GL_BLEND 0x0BE2
171 #define GL_SCISSOR_BOX 0x0C10
172 #define GL_SCISSOR_TEST 0x0C11
173 #define GL_UNPACK_ROW_LENGTH 0x0CF2
174 #define GL_PACK_ALIGNMENT 0x0D05
175 #define GL_MAX_TEXTURE_SIZE 0x0D33
176 #define GL_TEXTURE_2D 0x0DE1
177 #define GL_UNSIGNED_BYTE 0x1401
178 #define GL_UNSIGNED_SHORT 0x1403
179 #define GL_UNSIGNED_INT 0x1405
180 #define GL_FLOAT 0x1406
181 #define GL_RGBA 0x1908
182 #define GL_FILL 0x1B02
183 #define GL_VENDOR 0x1F00
184 #define GL_RENDERER 0x1F01
185 #define GL_VERSION 0x1F02
186 #define GL_EXTENSIONS 0x1F03
187 #define GL_LINEAR 0x2601
188 #define GL_TEXTURE_MAG_FILTER 0x2800
189 #define GL_TEXTURE_MIN_FILTER 0x2801
190 #define GL_TEXTURE_WRAP_S 0x2802
191 #define GL_TEXTURE_WRAP_T 0x2803
192 #define GL_REPEAT 0x2901
193 typedef void (APIENTRYP PFNGLPOLYGONMODEPROC) (GLenum face, GLenum mode);
194 typedef void (APIENTRYP PFNGLSCISSORPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
195 typedef void (APIENTRYP PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param);
196 typedef void (APIENTRYP PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
197 typedef void (APIENTRYP PFNGLCLEARPROC) (GLbitfield mask);
198 typedef void (APIENTRYP PFNGLCLEARCOLORPROC) (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
199 typedef void (APIENTRYP PFNGLDISABLEPROC) (GLenum cap);
200 typedef void (APIENTRYP PFNGLENABLEPROC) (GLenum cap);
201 typedef void (APIENTRYP PFNGLFLUSHPROC) (void);
202 typedef void (APIENTRYP PFNGLPIXELSTOREIPROC) (GLenum pname, GLint param);
203 typedef void (APIENTRYP PFNGLREADPIXELSPROC) (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
204 typedef GLenum (APIENTRYP PFNGLGETERRORPROC) (void);
205 typedef void (APIENTRYP PFNGLGETINTEGERVPROC) (GLenum pname, GLint *data);
206 typedef const GLubyte *(APIENTRYP PFNGLGETSTRINGPROC) (GLenum name);
207 typedef GLboolean (APIENTRYP PFNGLISENABLEDPROC) (GLenum cap);
208 typedef void (APIENTRYP PFNGLVIEWPORTPROC) (GLint x, GLint y, GLsizei width, GLsizei height);
209 #ifdef GL_GLEXT_PROTOTYPES
210 GLAPI void APIENTRY glPolygonMode (GLenum face, GLenum mode);
211 GLAPI void APIENTRY glScissor (GLint x, GLint y, GLsizei width, GLsizei height);
212 GLAPI void APIENTRY glTexParameteri (GLenum target, GLenum pname, GLint param);
213 GLAPI void APIENTRY glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void *pixels);
214 GLAPI void APIENTRY glClear (GLbitfield mask);
215 GLAPI void APIENTRY glClearColor (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha);
216 GLAPI void APIENTRY glDisable (GLenum cap);
217 GLAPI void APIENTRY glEnable (GLenum cap);
218 GLAPI void APIENTRY glFlush (void);
219 GLAPI void APIENTRY glPixelStorei (GLenum pname, GLint param);
220 GLAPI void APIENTRY glReadPixels (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, void *pixels);
221 GLAPI GLenum APIENTRY glGetError (void);
222 GLAPI void APIENTRY glGetIntegerv (GLenum pname, GLint *data);
223 GLAPI const GLubyte *APIENTRY glGetString (GLenum name);
224 GLAPI GLboolean APIENTRY glIsEnabled (GLenum cap);
225 GLAPI void APIENTRY glViewport (GLint x, GLint y, GLsizei width, GLsizei height);
226 #endif
227 #endif /* GL_VERSION_1_0 */
228 #ifndef GL_VERSION_1_1
229 typedef khronos_float_t GLclampf;
230 typedef double GLclampd;
231 #define GL_TEXTURE_BINDING_2D 0x8069
232 typedef void (APIENTRYP PFNGLDRAWELEMENTSPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices);
233 typedef void (APIENTRYP PFNGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
234 typedef void (APIENTRYP PFNGLBINDTEXTUREPROC) (GLenum target, GLuint texture);
235 typedef void (APIENTRYP PFNGLDELETETEXTURESPROC) (GLsizei n, const GLuint *textures);
236 typedef void (APIENTRYP PFNGLGENTEXTURESPROC) (GLsizei n, GLuint *textures);
237 #ifdef GL_GLEXT_PROTOTYPES
238 GLAPI void APIENTRY glDrawElements (GLenum mode, GLsizei count, GLenum type, const void *indices);
239 GLAPI void APIENTRY glTexSubImage2D (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const void *pixels);
240 GLAPI void APIENTRY glBindTexture (GLenum target, GLuint texture);
241 GLAPI void APIENTRY glDeleteTextures (GLsizei n, const GLuint *textures);
242 GLAPI void APIENTRY glGenTextures (GLsizei n, GLuint *textures);
243 #endif
244 #endif /* GL_VERSION_1_1 */
245 #ifndef GL_VERSION_1_2
246 #define GL_CLAMP_TO_EDGE 0x812F
247 #endif /* GL_VERSION_1_2 */
248 #ifndef GL_VERSION_1_3
249 #define GL_TEXTURE0 0x84C0
250 #define GL_ACTIVE_TEXTURE 0x84E0
251 typedef void (APIENTRYP PFNGLACTIVETEXTUREPROC) (GLenum texture);
252 #ifdef GL_GLEXT_PROTOTYPES
253 GLAPI void APIENTRY glActiveTexture (GLenum texture);
254 #endif
255 #endif /* GL_VERSION_1_3 */
256 #ifndef GL_VERSION_1_4
257 #define GL_BLEND_DST_RGB 0x80C8
258 #define GL_BLEND_SRC_RGB 0x80C9
259 #define GL_BLEND_DST_ALPHA 0x80CA
260 #define GL_BLEND_SRC_ALPHA 0x80CB
261 #define GL_FUNC_ADD 0x8006
262 typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEPROC) (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
263 typedef void (APIENTRYP PFNGLBLENDEQUATIONPROC) (GLenum mode);
264 #ifdef GL_GLEXT_PROTOTYPES
265 GLAPI void APIENTRY glBlendFuncSeparate (GLenum sfactorRGB, GLenum dfactorRGB, GLenum sfactorAlpha, GLenum dfactorAlpha);
266 GLAPI void APIENTRY glBlendEquation (GLenum mode);
267 #endif
268 #endif /* GL_VERSION_1_4 */
269 #ifndef GL_VERSION_1_5
270 typedef khronos_ssize_t GLsizeiptr;
271 typedef khronos_intptr_t GLintptr;
272 #define GL_ARRAY_BUFFER 0x8892
273 #define GL_ELEMENT_ARRAY_BUFFER 0x8893
274 #define GL_ARRAY_BUFFER_BINDING 0x8894
275 #define GL_ELEMENT_ARRAY_BUFFER_BINDING 0x8895
276 #define GL_STREAM_DRAW 0x88E0
277 typedef void (APIENTRYP PFNGLBINDBUFFERPROC) (GLenum target, GLuint buffer);
278 typedef void (APIENTRYP PFNGLDELETEBUFFERSPROC) (GLsizei n, const GLuint *buffers);
279 typedef void (APIENTRYP PFNGLGENBUFFERSPROC) (GLsizei n, GLuint *buffers);
280 typedef void (APIENTRYP PFNGLBUFFERDATAPROC) (GLenum target, GLsizeiptr size, const void *data, GLenum usage);
281 typedef void (APIENTRYP PFNGLBUFFERSUBDATAPROC) (GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
282 #ifdef GL_GLEXT_PROTOTYPES
283 GLAPI void APIENTRY glBindBuffer (GLenum target, GLuint buffer);
284 GLAPI void APIENTRY glDeleteBuffers (GLsizei n, const GLuint *buffers);
285 GLAPI void APIENTRY glGenBuffers (GLsizei n, GLuint *buffers);
286 GLAPI void APIENTRY glBufferData (GLenum target, GLsizeiptr size, const void *data, GLenum usage);
287 GLAPI void APIENTRY glBufferSubData (GLenum target, GLintptr offset, GLsizeiptr size, const void *data);
288 #endif
289 #endif /* GL_VERSION_1_5 */
290 #ifndef GL_VERSION_2_0
291 typedef char GLchar;
292 typedef khronos_int16_t GLshort;
293 typedef khronos_int8_t GLbyte;
294 typedef khronos_uint16_t GLushort;
295 #define GL_BLEND_EQUATION_RGB 0x8009
296 #define GL_VERTEX_ATTRIB_ARRAY_ENABLED 0x8622
297 #define GL_VERTEX_ATTRIB_ARRAY_SIZE 0x8623
298 #define GL_VERTEX_ATTRIB_ARRAY_STRIDE 0x8624
299 #define GL_VERTEX_ATTRIB_ARRAY_TYPE 0x8625
300 #define GL_VERTEX_ATTRIB_ARRAY_POINTER 0x8645
301 #define GL_BLEND_EQUATION_ALPHA 0x883D
302 #define GL_VERTEX_ATTRIB_ARRAY_NORMALIZED 0x886A
303 #define GL_FRAGMENT_SHADER 0x8B30
304 #define GL_VERTEX_SHADER 0x8B31
305 #define GL_COMPILE_STATUS 0x8B81
306 #define GL_LINK_STATUS 0x8B82
307 #define GL_INFO_LOG_LENGTH 0x8B84
308 #define GL_CURRENT_PROGRAM 0x8B8D
309 #define GL_UPPER_LEFT 0x8CA2
310 typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEPROC) (GLenum modeRGB, GLenum modeAlpha);
311 typedef void (APIENTRYP PFNGLATTACHSHADERPROC) (GLuint program, GLuint shader);
312 typedef void (APIENTRYP PFNGLCOMPILESHADERPROC) (GLuint shader);
313 typedef GLuint (APIENTRYP PFNGLCREATEPROGRAMPROC) (void);
314 typedef GLuint (APIENTRYP PFNGLCREATESHADERPROC) (GLenum type);
315 typedef void (APIENTRYP PFNGLDELETEPROGRAMPROC) (GLuint program);
316 typedef void (APIENTRYP PFNGLDELETESHADERPROC) (GLuint shader);
317 typedef void (APIENTRYP PFNGLDETACHSHADERPROC) (GLuint program, GLuint shader);
318 typedef void (APIENTRYP PFNGLDISABLEVERTEXATTRIBARRAYPROC) (GLuint index);
319 typedef void (APIENTRYP PFNGLENABLEVERTEXATTRIBARRAYPROC) (GLuint index);
320 typedef GLint (APIENTRYP PFNGLGETATTRIBLOCATIONPROC) (GLuint program, const GLchar *name);
321 typedef void (APIENTRYP PFNGLGETPROGRAMIVPROC) (GLuint program, GLenum pname, GLint *params);
322 typedef void (APIENTRYP PFNGLGETPROGRAMINFOLOGPROC) (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
323 typedef void (APIENTRYP PFNGLGETSHADERIVPROC) (GLuint shader, GLenum pname, GLint *params);
324 typedef void (APIENTRYP PFNGLGETSHADERINFOLOGPROC) (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
325 typedef GLint (APIENTRYP PFNGLGETUNIFORMLOCATIONPROC) (GLuint program, const GLchar *name);
326 typedef void (APIENTRYP PFNGLGETVERTEXATTRIBIVPROC) (GLuint index, GLenum pname, GLint *params);
327 typedef void (APIENTRYP PFNGLGETVERTEXATTRIBPOINTERVPROC) (GLuint index, GLenum pname, void **pointer);
328 typedef GLboolean (APIENTRYP PFNGLISPROGRAMPROC) (GLuint program);
329 typedef void (APIENTRYP PFNGLLINKPROGRAMPROC) (GLuint program);
330 typedef void (APIENTRYP PFNGLSHADERSOURCEPROC) (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
331 typedef void (APIENTRYP PFNGLUSEPROGRAMPROC) (GLuint program);
332 typedef void (APIENTRYP PFNGLUNIFORM1IPROC) (GLint location, GLint v0);
333 typedef void (APIENTRYP PFNGLUNIFORMMATRIX4FVPROC) (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
334 typedef void (APIENTRYP PFNGLVERTEXATTRIBPOINTERPROC) (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
335 #ifdef GL_GLEXT_PROTOTYPES
336 GLAPI void APIENTRY glBlendEquationSeparate (GLenum modeRGB, GLenum modeAlpha);
337 GLAPI void APIENTRY glAttachShader (GLuint program, GLuint shader);
338 GLAPI void APIENTRY glCompileShader (GLuint shader);
339 GLAPI GLuint APIENTRY glCreateProgram (void);
340 GLAPI GLuint APIENTRY glCreateShader (GLenum type);
341 GLAPI void APIENTRY glDeleteProgram (GLuint program);
342 GLAPI void APIENTRY glDeleteShader (GLuint shader);
343 GLAPI void APIENTRY glDetachShader (GLuint program, GLuint shader);
344 GLAPI void APIENTRY glDisableVertexAttribArray (GLuint index);
345 GLAPI void APIENTRY glEnableVertexAttribArray (GLuint index);
346 GLAPI GLint APIENTRY glGetAttribLocation (GLuint program, const GLchar *name);
347 GLAPI void APIENTRY glGetProgramiv (GLuint program, GLenum pname, GLint *params);
348 GLAPI void APIENTRY glGetProgramInfoLog (GLuint program, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
349 GLAPI void APIENTRY glGetShaderiv (GLuint shader, GLenum pname, GLint *params);
350 GLAPI void APIENTRY glGetShaderInfoLog (GLuint shader, GLsizei bufSize, GLsizei *length, GLchar *infoLog);
351 GLAPI GLint APIENTRY glGetUniformLocation (GLuint program, const GLchar *name);
352 GLAPI void APIENTRY glGetVertexAttribiv (GLuint index, GLenum pname, GLint *params);
353 GLAPI void APIENTRY glGetVertexAttribPointerv (GLuint index, GLenum pname, void **pointer);
354 GLAPI GLboolean APIENTRY glIsProgram (GLuint program);
355 GLAPI void APIENTRY glLinkProgram (GLuint program);
356 GLAPI void APIENTRY glShaderSource (GLuint shader, GLsizei count, const GLchar *const*string, const GLint *length);
357 GLAPI void APIENTRY glUseProgram (GLuint program);
358 GLAPI void APIENTRY glUniform1i (GLint location, GLint v0);
359 GLAPI void APIENTRY glUniformMatrix4fv (GLint location, GLsizei count, GLboolean transpose, const GLfloat *value);
360 GLAPI void APIENTRY glVertexAttribPointer (GLuint index, GLint size, GLenum type, GLboolean normalized, GLsizei stride, const void *pointer);
361 #endif
362 #endif /* GL_VERSION_2_0 */
363 #ifndef GL_VERSION_2_1
364 #define GL_PIXEL_UNPACK_BUFFER 0x88EC
365 #define GL_PIXEL_UNPACK_BUFFER_BINDING 0x88EF
366 #endif /* GL_VERSION_2_1 */
367 #ifndef GL_VERSION_3_0
368 typedef khronos_uint16_t GLhalf;
369 #define GL_MAJOR_VERSION 0x821B
370 #define GL_MINOR_VERSION 0x821C
371 #define GL_NUM_EXTENSIONS 0x821D
372 #define GL_FRAMEBUFFER_SRGB 0x8DB9
373 #define GL_VERTEX_ARRAY_BINDING 0x85B5
374 typedef void (APIENTRYP PFNGLGETBOOLEANI_VPROC) (GLenum target, GLuint index, GLboolean *data);
375 typedef void (APIENTRYP PFNGLGETINTEGERI_VPROC) (GLenum target, GLuint index, GLint *data);
376 typedef const GLubyte *(APIENTRYP PFNGLGETSTRINGIPROC) (GLenum name, GLuint index);
377 typedef void (APIENTRYP PFNGLBINDVERTEXARRAYPROC) (GLuint array);
378 typedef void (APIENTRYP PFNGLDELETEVERTEXARRAYSPROC) (GLsizei n, const GLuint *arrays);
379 typedef void (APIENTRYP PFNGLGENVERTEXARRAYSPROC) (GLsizei n, GLuint *arrays);
380 #ifdef GL_GLEXT_PROTOTYPES
381 GLAPI const GLubyte *APIENTRY glGetStringi (GLenum name, GLuint index);
382 GLAPI void APIENTRY glBindVertexArray (GLuint array);
383 GLAPI void APIENTRY glDeleteVertexArrays (GLsizei n, const GLuint *arrays);
384 GLAPI void APIENTRY glGenVertexArrays (GLsizei n, GLuint *arrays);
385 #endif
386 #endif /* GL_VERSION_3_0 */
387 #ifndef GL_VERSION_3_1
388 #define GL_VERSION_3_1 1
389 #define GL_PRIMITIVE_RESTART 0x8F9D
390 #endif /* GL_VERSION_3_1 */
391 #ifndef GL_VERSION_3_2
392 #define GL_VERSION_3_2 1
393 typedef struct __GLsync *GLsync;
394 typedef khronos_uint64_t GLuint64;
395 typedef khronos_int64_t GLint64;
396 #define GL_CONTEXT_COMPATIBILITY_PROFILE_BIT 0x00000002
397 #define GL_CONTEXT_PROFILE_MASK 0x9126
398 typedef void (APIENTRYP PFNGLDRAWELEMENTSBASEVERTEXPROC) (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
399 typedef void (APIENTRYP PFNGLGETINTEGER64I_VPROC) (GLenum target, GLuint index, GLint64 *data);
400 #ifdef GL_GLEXT_PROTOTYPES
401 GLAPI void APIENTRY glDrawElementsBaseVertex (GLenum mode, GLsizei count, GLenum type, const void *indices, GLint basevertex);
402 #endif
403 #endif /* GL_VERSION_3_2 */
404 #ifndef GL_VERSION_3_3
405 #define GL_VERSION_3_3 1
406 #define GL_SAMPLER_BINDING 0x8919
407 typedef void (APIENTRYP PFNGLBINDSAMPLERPROC) (GLuint unit, GLuint sampler);
408 #ifdef GL_GLEXT_PROTOTYPES
409 GLAPI void APIENTRY glBindSampler (GLuint unit, GLuint sampler);
410 #endif
411 #endif /* GL_VERSION_3_3 */
412 #ifndef GL_VERSION_4_1
413 typedef void (APIENTRYP PFNGLGETFLOATI_VPROC) (GLenum target, GLuint index, GLfloat *data);
414 typedef void (APIENTRYP PFNGLGETDOUBLEI_VPROC) (GLenum target, GLuint index, GLdouble *data);
415 #endif /* GL_VERSION_4_1 */
416 #ifndef GL_VERSION_4_3
417 typedef void (APIENTRY *GLDEBUGPROC)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);
418 #endif /* GL_VERSION_4_3 */
419 #ifndef GL_VERSION_4_5
420 #define GL_CLIP_ORIGIN 0x935C
421 typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKI_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint *param);
422 typedef void (APIENTRYP PFNGLGETTRANSFORMFEEDBACKI64_VPROC) (GLuint xfb, GLenum pname, GLuint index, GLint64 *param);
423 #endif /* GL_VERSION_4_5 */
424 #ifndef GL_ARB_bindless_texture
425 typedef khronos_uint64_t GLuint64EXT;
426 #endif /* GL_ARB_bindless_texture */
427 #ifndef GL_ARB_cl_event
428 struct _cl_context;
429 struct _cl_event;
430 #endif /* GL_ARB_cl_event */
431 #ifndef GL_ARB_clip_control
432 #define GL_ARB_clip_control 1
433 #endif /* GL_ARB_clip_control */
434 #ifndef GL_ARB_debug_output
435 typedef void (APIENTRY *GLDEBUGPROCARB)(GLenum source,GLenum type,GLuint id,GLenum severity,GLsizei length,const GLchar *message,const void *userParam);
436 #endif /* GL_ARB_debug_output */
437 #ifndef GL_EXT_EGL_image_storage
438 typedef void *GLeglImageOES;
439 #endif /* GL_EXT_EGL_image_storage */
440 #ifndef GL_EXT_direct_state_access
441 typedef void (APIENTRYP PFNGLGETFLOATI_VEXTPROC) (GLenum pname, GLuint index, GLfloat *params);
442 typedef void (APIENTRYP PFNGLGETDOUBLEI_VEXTPROC) (GLenum pname, GLuint index, GLdouble *params);
443 typedef void (APIENTRYP PFNGLGETPOINTERI_VEXTPROC) (GLenum pname, GLuint index, void **params);
444 typedef void (APIENTRYP PFNGLGETVERTEXARRAYINTEGERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, GLint *param);
445 typedef void (APIENTRYP PFNGLGETVERTEXARRAYPOINTERI_VEXTPROC) (GLuint vaobj, GLuint index, GLenum pname, void **param);
446 #endif /* GL_EXT_direct_state_access */
447 #ifndef GL_NV_draw_vulkan_image
448 typedef void (APIENTRY *GLVULKANPROCNV)(void);
449 #endif /* GL_NV_draw_vulkan_image */
450 #ifndef GL_NV_gpu_shader5
451 typedef khronos_int64_t GLint64EXT;
452 #endif /* GL_NV_gpu_shader5 */
453 #ifndef GL_NV_vertex_buffer_unified_memory
454 typedef void (APIENTRYP PFNGLGETINTEGERUI64I_VNVPROC) (GLenum value, GLuint index, GLuint64EXT *result);
455 #endif /* GL_NV_vertex_buffer_unified_memory */
456 #ifdef __cplusplus
457 }
458 #endif
459 #endif
460 
461 #ifndef GL3W_API
462 #define GL3W_API
463 #endif
464 
465 #ifndef __gl_h_
466 #define __gl_h_
467 #endif
468 
469 #ifdef __cplusplus
470 extern "C" {
471 #endif
472 
473 #define GL3W_OK 0
474 #define GL3W_ERROR_INIT -1
475 #define GL3W_ERROR_LIBRARY_OPEN -2
476 #define GL3W_ERROR_OPENGL_VERSION -3
477 
478 typedef void (*GL3WglProc)(void);
479 typedef GL3WglProc (*GL3WGetProcAddressProc)(const char *proc);
480 
481 /* gl3w api */
482 GL3W_API int imgl3wInit(void);
483 GL3W_API int imgl3wInit2(GL3WGetProcAddressProc proc);
484 GL3W_API int imgl3wIsSupported(int major, int minor);
485 GL3W_API GL3WglProc imgl3wGetProcAddress(const char *proc);
486 
487 /* gl3w internal state */
488 union ImGL3WProcs {
489  GL3WglProc ptr[60];
490  struct {
491  PFNGLACTIVETEXTUREPROC ActiveTexture;
492  PFNGLATTACHSHADERPROC AttachShader;
493  PFNGLBINDBUFFERPROC BindBuffer;
494  PFNGLBINDSAMPLERPROC BindSampler;
495  PFNGLBINDTEXTUREPROC BindTexture;
496  PFNGLBINDVERTEXARRAYPROC BindVertexArray;
497  PFNGLBLENDEQUATIONPROC BlendEquation;
498  PFNGLBLENDEQUATIONSEPARATEPROC BlendEquationSeparate;
499  PFNGLBLENDFUNCSEPARATEPROC BlendFuncSeparate;
500  PFNGLBUFFERDATAPROC BufferData;
501  PFNGLBUFFERSUBDATAPROC BufferSubData;
502  PFNGLCLEARPROC Clear;
503  PFNGLCLEARCOLORPROC ClearColor;
504  PFNGLCOMPILESHADERPROC CompileShader;
505  PFNGLCREATEPROGRAMPROC CreateProgram;
506  PFNGLCREATESHADERPROC CreateShader;
507  PFNGLDELETEBUFFERSPROC DeleteBuffers;
508  PFNGLDELETEPROGRAMPROC DeleteProgram;
509  PFNGLDELETESHADERPROC DeleteShader;
510  PFNGLDELETETEXTURESPROC DeleteTextures;
511  PFNGLDELETEVERTEXARRAYSPROC DeleteVertexArrays;
512  PFNGLDETACHSHADERPROC DetachShader;
513  PFNGLDISABLEPROC Disable;
514  PFNGLDISABLEVERTEXATTRIBARRAYPROC DisableVertexAttribArray;
515  PFNGLDRAWELEMENTSPROC DrawElements;
516  PFNGLDRAWELEMENTSBASEVERTEXPROC DrawElementsBaseVertex;
517  PFNGLENABLEPROC Enable;
518  PFNGLENABLEVERTEXATTRIBARRAYPROC EnableVertexAttribArray;
519  PFNGLFLUSHPROC Flush;
520  PFNGLGENBUFFERSPROC GenBuffers;
521  PFNGLGENTEXTURESPROC GenTextures;
522  PFNGLGENVERTEXARRAYSPROC GenVertexArrays;
523  PFNGLGETATTRIBLOCATIONPROC GetAttribLocation;
524  PFNGLGETERRORPROC GetError;
525  PFNGLGETINTEGERVPROC GetIntegerv;
526  PFNGLGETPROGRAMINFOLOGPROC GetProgramInfoLog;
527  PFNGLGETPROGRAMIVPROC GetProgramiv;
528  PFNGLGETSHADERINFOLOGPROC GetShaderInfoLog;
529  PFNGLGETSHADERIVPROC GetShaderiv;
530  PFNGLGETSTRINGPROC GetString;
531  PFNGLGETSTRINGIPROC GetStringi;
532  PFNGLGETUNIFORMLOCATIONPROC GetUniformLocation;
533  PFNGLGETVERTEXATTRIBPOINTERVPROC GetVertexAttribPointerv;
534  PFNGLGETVERTEXATTRIBIVPROC GetVertexAttribiv;
535  PFNGLISENABLEDPROC IsEnabled;
536  PFNGLISPROGRAMPROC IsProgram;
537  PFNGLLINKPROGRAMPROC LinkProgram;
538  PFNGLPIXELSTOREIPROC PixelStorei;
539  PFNGLPOLYGONMODEPROC PolygonMode;
540  PFNGLREADPIXELSPROC ReadPixels;
541  PFNGLSCISSORPROC Scissor;
542  PFNGLSHADERSOURCEPROC ShaderSource;
543  PFNGLTEXIMAGE2DPROC TexImage2D;
544  PFNGLTEXPARAMETERIPROC TexParameteri;
545  PFNGLTEXSUBIMAGE2DPROC TexSubImage2D;
546  PFNGLUNIFORM1IPROC Uniform1i;
547  PFNGLUNIFORMMATRIX4FVPROC UniformMatrix4fv;
548  PFNGLUSEPROGRAMPROC UseProgram;
549  PFNGLVERTEXATTRIBPOINTERPROC VertexAttribPointer;
550  PFNGLVIEWPORTPROC Viewport;
551  } gl;
552 };
553 
554 GL3W_API extern union ImGL3WProcs imgl3wProcs;
555 
556 /* OpenGL functions */
557 #define glActiveTexture imgl3wProcs.gl.ActiveTexture
558 #define glAttachShader imgl3wProcs.gl.AttachShader
559 #define glBindBuffer imgl3wProcs.gl.BindBuffer
560 #define glBindSampler imgl3wProcs.gl.BindSampler
561 #define glBindTexture imgl3wProcs.gl.BindTexture
562 #define glBindVertexArray imgl3wProcs.gl.BindVertexArray
563 #define glBlendEquation imgl3wProcs.gl.BlendEquation
564 #define glBlendEquationSeparate imgl3wProcs.gl.BlendEquationSeparate
565 #define glBlendFuncSeparate imgl3wProcs.gl.BlendFuncSeparate
566 #define glBufferData imgl3wProcs.gl.BufferData
567 #define glBufferSubData imgl3wProcs.gl.BufferSubData
568 #define glClear imgl3wProcs.gl.Clear
569 #define glClearColor imgl3wProcs.gl.ClearColor
570 #define glCompileShader imgl3wProcs.gl.CompileShader
571 #define glCreateProgram imgl3wProcs.gl.CreateProgram
572 #define glCreateShader imgl3wProcs.gl.CreateShader
573 #define glDeleteBuffers imgl3wProcs.gl.DeleteBuffers
574 #define glDeleteProgram imgl3wProcs.gl.DeleteProgram
575 #define glDeleteShader imgl3wProcs.gl.DeleteShader
576 #define glDeleteTextures imgl3wProcs.gl.DeleteTextures
577 #define glDeleteVertexArrays imgl3wProcs.gl.DeleteVertexArrays
578 #define glDetachShader imgl3wProcs.gl.DetachShader
579 #define glDisable imgl3wProcs.gl.Disable
580 #define glDisableVertexAttribArray imgl3wProcs.gl.DisableVertexAttribArray
581 #define glDrawElements imgl3wProcs.gl.DrawElements
582 #define glDrawElementsBaseVertex imgl3wProcs.gl.DrawElementsBaseVertex
583 #define glEnable imgl3wProcs.gl.Enable
584 #define glEnableVertexAttribArray imgl3wProcs.gl.EnableVertexAttribArray
585 #define glFlush imgl3wProcs.gl.Flush
586 #define glGenBuffers imgl3wProcs.gl.GenBuffers
587 #define glGenTextures imgl3wProcs.gl.GenTextures
588 #define glGenVertexArrays imgl3wProcs.gl.GenVertexArrays
589 #define glGetAttribLocation imgl3wProcs.gl.GetAttribLocation
590 #define glGetError imgl3wProcs.gl.GetError
591 #define glGetIntegerv imgl3wProcs.gl.GetIntegerv
592 #define glGetProgramInfoLog imgl3wProcs.gl.GetProgramInfoLog
593 #define glGetProgramiv imgl3wProcs.gl.GetProgramiv
594 #define glGetShaderInfoLog imgl3wProcs.gl.GetShaderInfoLog
595 #define glGetShaderiv imgl3wProcs.gl.GetShaderiv
596 #define glGetString imgl3wProcs.gl.GetString
597 #define glGetStringi imgl3wProcs.gl.GetStringi
598 #define glGetUniformLocation imgl3wProcs.gl.GetUniformLocation
599 #define glGetVertexAttribPointerv imgl3wProcs.gl.GetVertexAttribPointerv
600 #define glGetVertexAttribiv imgl3wProcs.gl.GetVertexAttribiv
601 #define glIsEnabled imgl3wProcs.gl.IsEnabled
602 #define glIsProgram imgl3wProcs.gl.IsProgram
603 #define glLinkProgram imgl3wProcs.gl.LinkProgram
604 #define glPixelStorei imgl3wProcs.gl.PixelStorei
605 #define glPolygonMode imgl3wProcs.gl.PolygonMode
606 #define glReadPixels imgl3wProcs.gl.ReadPixels
607 #define glScissor imgl3wProcs.gl.Scissor
608 #define glShaderSource imgl3wProcs.gl.ShaderSource
609 #define glTexImage2D imgl3wProcs.gl.TexImage2D
610 #define glTexParameteri imgl3wProcs.gl.TexParameteri
611 #define glTexSubImage2D imgl3wProcs.gl.TexSubImage2D
612 #define glUniform1i imgl3wProcs.gl.Uniform1i
613 #define glUniformMatrix4fv imgl3wProcs.gl.UniformMatrix4fv
614 #define glUseProgram imgl3wProcs.gl.UseProgram
615 #define glVertexAttribPointer imgl3wProcs.gl.VertexAttribPointer
616 #define glViewport imgl3wProcs.gl.Viewport
617 
618 #ifdef __cplusplus
619 }
620 #endif
621 
622 #endif
623 
624 #ifdef IMGL3W_IMPL
625 #ifdef __cplusplus
626 extern "C" {
627 #endif
628 
629 #include <stdlib.h>
630 
631 #define GL3W_ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
632 
633 #if defined(IMGL3W_SCUMMVM_LOADER)
634 static int open_libgl(void)
635 {
636  return GL3W_OK;
637 }
638 
639 static void close_libgl(void) { }
640 
641 static GL3WglProc get_proc(const char *proc)
642 {
643  return (GL3WglProc)g_system->getOpenGLProcAddress(proc);
644 }
645 
646 #elif defined(_WIN32)
647 #ifndef WIN32_LEAN_AND_MEAN
648 #define WIN32_LEAN_AND_MEAN 1
649 #endif
650 #include <windows.h>
651 
652 static HMODULE libgl;
653 typedef PROC(__stdcall* GL3WglGetProcAddr)(LPCSTR);
654 static GL3WglGetProcAddr wgl_get_proc_address;
655 
656 static int open_libgl(void)
657 {
658  libgl = LoadLibraryA("opengl32.dll");
659  if (!libgl)
660  return GL3W_ERROR_LIBRARY_OPEN;
661  wgl_get_proc_address = (GL3WglGetProcAddr)GetProcAddress(libgl, "wglGetProcAddress");
662  return GL3W_OK;
663 }
664 
665 static void close_libgl(void) { FreeLibrary(libgl); }
666 static GL3WglProc get_proc(const char *proc)
667 {
668  GL3WglProc res;
669  res = (GL3WglProc)wgl_get_proc_address(proc);
670  if (!res)
671  res = (GL3WglProc)GetProcAddress(libgl, proc);
672  return res;
673 }
674 #elif defined(__APPLE__)
675 #include <dlfcn.h>
676 
677 static void *libgl;
678 static int open_libgl(void)
679 {
680  libgl = dlopen("/System/Library/Frameworks/OpenGL.framework/OpenGL", RTLD_LAZY | RTLD_LOCAL);
681  if (!libgl)
682  return GL3W_ERROR_LIBRARY_OPEN;
683  return GL3W_OK;
684 }
685 
686 static void close_libgl(void) { dlclose(libgl); }
687 
688 static GL3WglProc get_proc(const char *proc)
689 {
690  GL3WglProc res;
691  *(void **)(&res) = dlsym(libgl, proc);
692  return res;
693 }
694 #else
695 #include <dlfcn.h>
696 
697 static void* libgl; // OpenGL library
698 static void* libglx; // GLX library
699 static void* libegl; // EGL library
700 static GL3WGetProcAddressProc gl_get_proc_address;
701 
702 static void close_libgl(void)
703 {
704  if (libgl) {
705  dlclose(libgl);
706  libgl = NULL;
707  }
708  if (libegl) {
709  dlclose(libegl);
710  libegl = NULL;
711  }
712  if (libglx) {
713  dlclose(libglx);
714  libglx = NULL;
715  }
716 }
717 
718 static int is_library_loaded(const char* name, void** lib)
719 {
720  *lib = dlopen(name, RTLD_LAZY | RTLD_LOCAL | RTLD_NOLOAD);
721  return *lib != NULL;
722 }
723 
724 static int open_libs(void)
725 {
726  // On Linux we have two APIs to get process addresses: EGL and GLX.
727  // EGL is supported under both X11 and Wayland, whereas GLX is X11-specific.
728 
729  libgl = NULL;
730  libegl = NULL;
731  libglx = NULL;
732 
733  // First check what's already loaded, the windowing library might have
734  // already loaded either EGL or GLX and we want to use the same one.
735 
736  if (is_library_loaded("libEGL.so.1", &libegl) ||
737  is_library_loaded("libGLX.so.0", &libglx)) {
738  libgl = dlopen("libOpenGL.so.0", RTLD_LAZY | RTLD_LOCAL);
739  if (libgl)
740  return GL3W_OK;
741  else
742  close_libgl();
743  }
744 
745  if (is_library_loaded("libGL.so", &libgl))
746  return GL3W_OK;
747  if (is_library_loaded("libGL.so.1", &libgl))
748  return GL3W_OK;
749  if (is_library_loaded("libGL.so.3", &libgl))
750  return GL3W_OK;
751 
752  // Neither is already loaded, so we have to load one. Try EGL first
753  // because it is supported under both X11 and Wayland.
754 
755  // Load OpenGL + EGL
756  libgl = dlopen("libOpenGL.so.0", RTLD_LAZY | RTLD_LOCAL);
757  libegl = dlopen("libEGL.so.1", RTLD_LAZY | RTLD_LOCAL);
758  if (libgl && libegl)
759  return GL3W_OK;
760  else
761  close_libgl();
762 
763  // Fall back to legacy libGL, which includes GLX
764  // While most systems use libGL.so.1, NetBSD seems to use that libGL.so.3. See https://github.com/ocornut/imgui/issues/6983
765  libgl = dlopen("libGL.so", RTLD_LAZY | RTLD_LOCAL);
766  if (!libgl)
767  libgl = dlopen("libGL.so.1", RTLD_LAZY | RTLD_LOCAL);
768  if (!libgl)
769  libgl = dlopen("libGL.so.3", RTLD_LAZY | RTLD_LOCAL);
770 
771  if (libgl)
772  return GL3W_OK;
773 
774  return GL3W_ERROR_LIBRARY_OPEN;
775 }
776 
777 static int open_libgl(void)
778 {
779  int res = open_libs();
780  if (res)
781  return res;
782 
783  if (libegl)
784  *(void**)(&gl_get_proc_address) = dlsym(libegl, "eglGetProcAddress");
785  else if (libglx)
786  *(void**)(&gl_get_proc_address) = dlsym(libglx, "glXGetProcAddressARB");
787  else
788  *(void**)(&gl_get_proc_address) = dlsym(libgl, "glXGetProcAddressARB");
789 
790  if (!gl_get_proc_address) {
791  close_libgl();
792  return GL3W_ERROR_LIBRARY_OPEN;
793  }
794 
795  return GL3W_OK;
796 }
797 
798 static GL3WglProc get_proc(const char* proc)
799 {
800  GL3WglProc res = NULL;
801 
802  // Before EGL version 1.5, eglGetProcAddress doesn't support querying core
803  // functions and may return a dummy function if we try, so try to load the
804  // function from the GL library directly first.
805  if (libegl)
806  *(void**)(&res) = dlsym(libgl, proc);
807 
808  if (!res)
809  res = gl_get_proc_address(proc);
810 
811  if (!libegl && !res)
812  *(void**)(&res) = dlsym(libgl, proc);
813 
814  return res;
815 }
816 #endif
817 
818 static struct { int major, minor; } version;
819 
820 static int parse_version(void)
821 {
822  if (!glGetIntegerv)
823  return GL3W_ERROR_INIT;
824  glGetIntegerv(GL_MAJOR_VERSION, &version.major);
825  glGetIntegerv(GL_MINOR_VERSION, &version.minor);
826  if (version.major == 0 && version.minor == 0)
827  {
828  // Query GL_VERSION in desktop GL 2.x, the string will start with "<major>.<minor>"
829  if (const char* gl_version = (const char*)glGetString(GL_VERSION))
830  sscanf(gl_version, "%d.%d", &version.major, &version.minor);
831  }
832  if (version.major < 2)
833  return GL3W_ERROR_OPENGL_VERSION;
834  return GL3W_OK;
835 }
836 
837 static void load_procs(GL3WGetProcAddressProc proc);
838 
839 int imgl3wInit(void)
840 {
841  int res = open_libgl();
842  if (res)
843  return res;
844  atexit(close_libgl);
845  return imgl3wInit2(get_proc);
846 }
847 
848 int imgl3wInit2(GL3WGetProcAddressProc proc)
849 {
850  load_procs(proc);
851  return parse_version();
852 }
853 
854 int imgl3wIsSupported(int major, int minor)
855 {
856  if (major < 2)
857  return 0;
858  if (version.major == major)
859  return version.minor >= minor;
860  return version.major >= major;
861 }
862 
863 GL3WglProc imgl3wGetProcAddress(const char *proc) { return get_proc(proc); }
864 
865 static const char *proc_names[] = {
866  "glActiveTexture",
867  "glAttachShader",
868  "glBindBuffer",
869  "glBindSampler",
870  "glBindTexture",
871  "glBindVertexArray",
872  "glBlendEquation",
873  "glBlendEquationSeparate",
874  "glBlendFuncSeparate",
875  "glBufferData",
876  "glBufferSubData",
877  "glClear",
878  "glClearColor",
879  "glCompileShader",
880  "glCreateProgram",
881  "glCreateShader",
882  "glDeleteBuffers",
883  "glDeleteProgram",
884  "glDeleteShader",
885  "glDeleteTextures",
886  "glDeleteVertexArrays",
887  "glDetachShader",
888  "glDisable",
889  "glDisableVertexAttribArray",
890  "glDrawElements",
891  "glDrawElementsBaseVertex",
892  "glEnable",
893  "glEnableVertexAttribArray",
894  "glFlush",
895  "glGenBuffers",
896  "glGenTextures",
897  "glGenVertexArrays",
898  "glGetAttribLocation",
899  "glGetError",
900  "glGetIntegerv",
901  "glGetProgramInfoLog",
902  "glGetProgramiv",
903  "glGetShaderInfoLog",
904  "glGetShaderiv",
905  "glGetString",
906  "glGetStringi",
907  "glGetUniformLocation",
908  "glGetVertexAttribPointerv",
909  "glGetVertexAttribiv",
910  "glIsEnabled",
911  "glIsProgram",
912  "glLinkProgram",
913  "glPixelStorei",
914  "glPolygonMode",
915  "glReadPixels",
916  "glScissor",
917  "glShaderSource",
918  "glTexImage2D",
919  "glTexParameteri",
920  "glTexSubImage2D",
921  "glUniform1i",
922  "glUniformMatrix4fv",
923  "glUseProgram",
924  "glVertexAttribPointer",
925  "glViewport",
926 };
927 
928 GL3W_API union ImGL3WProcs imgl3wProcs;
929 
930 static void load_procs(GL3WGetProcAddressProc proc)
931 {
932  size_t i;
933  for (i = 0; i < GL3W_ARRAY_SIZE(proc_names); i++)
934  imgl3wProcs.ptr[i] = proc(proc_names[i]);
935 }
936 
937 #ifdef __cplusplus
938 }
939 #endif
940 #endif
OSystem * g_system
Definition: imgui_impl_opengl3_loader.h:488