Cogs.Core
GLFuncPointers.cpp
1#include "GLFuncPointers.h"
2#include "Foundation/StringView.h"
3#include "GLContext.h"
4#include "Foundation/Logging/Logger.h"
5
6#if defined(__EMSCRIPTEN__)
7
8#include <emscripten.h>
9
10extern "C" {
11
12 // Hack to work around missing function for EXT_clip_control in emscripten.
13 // -----------------------------------------------------------------
14 //
15 // These are typically called when setting up a graphics device, i.e.
16 // during initialization. So it shouldn't be a hot path, and thus unnecessary
17 // to cache these pointers for performance
18 void glClipControl(GLenum origin, GLenum depth)
19 {
20 EM_ASM({
21 const origin = $0;
22 const depth = $1;
23
24 // No idea how to figure out the right key, just use the first and hope for the best.
25 for (const item of Object.values(Module.GL.contexts)) {
26 if (item && item.hasOwnProperty('GLctx')) {
27 const ext = item.GLctx.getExtension("EXT_clip_control");
28 if (ext) {
29 ext.clipControlEXT(origin, depth);
30 }
31 break;
32 }
33 }
34 }, origin, depth);
35 }
36}
37
38bool has_glClipControl()
39{
40 int numExtensions = 0;
41 glGetIntegerv(GL_NUM_EXTENSIONS, &numExtensions);
42 for (int i = 0; i < numExtensions; i++) {
43 switch (Cogs::hash(Cogs::StringView((const char*)glGetStringi(GL_EXTENSIONS, i)))) {
44 case Cogs::hash("GL_EXT_clip_control"): return true;
45 default: break;
46 }
47 }
48 return false;
49}
50
51#elif !defined(__APPLE__)
52
53namespace {
54 Cogs::Logging::Log logger = Cogs::Logging::getLogger("GLFuncPointers");
55}
56
57
58PFNGLACTIVETEXTUREPROC glActiveTexture = nullptr;
59PFNGLATTACHSHADERPROC glAttachShader = nullptr;
60PFNGLBINDBUFFERBASEPROC glBindBufferBase = nullptr;
61PFNGLBINDBUFFERPROC glBindBuffer = nullptr;
62PFNGLBINDBUFFERRANGEPROC glBindBufferRange = nullptr;
63PFNGLBINDFRAMEBUFFERPROC glBindFramebuffer = nullptr;
64PFNGLBINDIMAGETEXTUREPROC glBindImageTexture = nullptr;
65PFNGLBINDRENDERBUFFERPROC glBindRenderbuffer = nullptr;
66PFNGLBINDSAMPLERPROC glBindSampler = nullptr;
67PFNGLBINDTEXTUREPROC glBindTexture = nullptr;
68PFNGLBINDVERTEXARRAYPROC glBindVertexArray = nullptr;
69PFNGLBLENDCOLORPROC glBlendColor = nullptr;
70PFNGLBLENDEQUATIONSEPARATEPROC glBlendEquationSeparate = nullptr;
71PFNGLBLENDFUNCSEPARATEPROC glBlendFuncSeparate = nullptr;
72PFNGLBLITFRAMEBUFFERPROC glBlitFramebuffer = nullptr;
73PFNGLBUFFERDATAPROC glBufferData = nullptr;
74PFNGLBUFFERSUBDATAPROC glBufferSubData = nullptr;
75PFNGLCHECKFRAMEBUFFERSTATUSPROC glCheckFramebufferStatus = nullptr;
76PFNGLCLEARBUFFERDATAPROC glClearBufferData = nullptr;
77PFNGLCLEARBUFFERFVPROC glClearBufferfv = nullptr;
78PFNGLCLEARBUFFERIVPROC glClearBufferiv = nullptr;
79PFNGLCLEARBUFFERUIVPROC glClearBufferuiv = nullptr;
80PFNGLCLEARCOLORPROC glClearColor = nullptr;
81PFNGLCLEARDEPTHFPROC glClearDepthf = nullptr;
82PFNGLCLEARDEPTHPROC glClearDepth = nullptr;
83PFNGLCLEARNAMEDBUFFERDATAPROC glClearNamedBufferData = nullptr;
84PFNGLCLEARPROC glClear = nullptr;
85PFNGLCLIENTWAITSYNCPROC glClientWaitSync = nullptr;
86#if defined(COGS_OPENGLES30)
87PFNGLCLIPCONTROLEXTPROC glClipControl = nullptr;
88#else
89PFNGLCLIPCONTROLPROC glClipControl = nullptr;
90#endif
91PFNGLCOMPILESHADERPROC glCompileShader = nullptr;
92PFNGLCOMPRESSEDTEXIMAGE2DPROC glCompressedTexImage2D = nullptr;
93PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glCompressedTexSubImage2D = nullptr;
94PFNGLCOPYBUFFERSUBDATAPROC glCopyBufferSubData = nullptr;
95PFNGLCOPYIMAGESUBDATAPROC glCopyImageSubData = nullptr;
96PFNGLCOPYNAMEDBUFFERSUBDATAPROC glCopyNamedBufferSubData = nullptr;
97PFNGLCOPYTEXSUBIMAGE2DPROC glCopyTexSubImage2D = nullptr;
98PFNGLCOPYTEXSUBIMAGE3DPROC glCopyTexSubImage3D = nullptr;
99PFNGLCREATEPROGRAMPROC glCreateProgram = nullptr;
100PFNGLCREATESHADERPROC glCreateShader = nullptr;
101PFNGLCULLFACEPROC glCullFace = nullptr;
102PFNGLDEBUGMESSAGECALLBACKPROC glDebugMessageCallback = nullptr;
103PFNGLDEBUGMESSAGECONTROLPROC glDebugMessageControl = nullptr;
104PFNGLDEBUGMESSAGEINSERTPROC glDebugMessageInsert = nullptr;
105PFNGLDELETEBUFFERSPROC glDeleteBuffers = nullptr;
106PFNGLDELETEFRAMEBUFFERSPROC glDeleteFramebuffers = nullptr;
107PFNGLDELETEPROGRAMPROC glDeleteProgram = nullptr;
108PFNGLDELETERENDERBUFFERSPROC glDeleteRenderbuffers = nullptr;
109PFNGLDELETESAMPLERSPROC glDeleteSamplers = nullptr;
110PFNGLDELETESHADERPROC glDeleteShader = nullptr;
111PFNGLDELETESYNCPROC glDeleteSync = nullptr;
112PFNGLDELETETEXTURESPROC glDeleteTextures = nullptr;
113PFNGLDELETEVERTEXARRAYSPROC glDeleteVertexArrays = nullptr;
114PFNGLDEPTHFUNCPROC glDepthFunc = nullptr;
115PFNGLDEPTHMASKPROC glDepthMask = nullptr;
116PFNGLDISABLEIPROC glDisablei = nullptr;
117PFNGLDISABLEPROC glDisable = nullptr;
118PFNGLDISABLEVERTEXARRAYATTRIBPROC glDisableVertexArrayAttrib = nullptr;
119PFNGLDISABLEVERTEXATTRIBARRAYPROC glDisableVertexAttribArray = nullptr;
120PFNGLDISPATCHCOMPUTEPROC glDispatchCompute = nullptr;
121PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC glDrawArraysInstancedBaseInstance = nullptr;
122PFNGLDRAWARRAYSINSTANCEDPROC glDrawArraysInstanced = nullptr;
123PFNGLDRAWARRAYSPROC glDrawArrays = nullptr;
124PFNGLDRAWBUFFERPROC glDrawBuffer = nullptr;
125PFNGLDRAWBUFFERSPROC glDrawBuffers = nullptr;
126PFNGLDRAWELEMENTSBASEVERTEXPROC glDrawElementsBaseVertex = nullptr;
127PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC glDrawElementsInstancedBaseInstance = nullptr;
128PFNGLDRAWELEMENTSINSTANCEDPROC glDrawElementsInstanced = nullptr;
129PFNGLDRAWELEMENTSPROC glDrawElements = nullptr;
130PFNGLENABLEIPROC glEnablei = nullptr;
131PFNGLENABLEPROC glEnable = nullptr;
132PFNGLENABLEVERTEXARRAYATTRIBPROC glEnableVertexArrayAttrib = nullptr;
133PFNGLENABLEVERTEXATTRIBARRAYPROC glEnableVertexAttribArray = nullptr;
134PFNGLFENCESYNCPROC glFenceSync = nullptr;
135PFNGLFINISHPROC glFinish = nullptr;
136PFNGLFLUSHPROC glFlush = nullptr;
137PFNGLFRAMEBUFFERRENDERBUFFERPROC glFramebufferRenderbuffer = nullptr;
138PFNGLFRAMEBUFFERTEXTURE2DPROC glFramebufferTexture2D = nullptr;
139PFNGLFRAMEBUFFERTEXTURELAYERPROC glFramebufferTextureLayer = nullptr;
140PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC glFramebufferTextureMultiviewOVR = nullptr;
141PFNGLFRONTFACEPROC glFrontFace = nullptr;
142PFNGLGENBUFFERSPROC glGenBuffers = nullptr;
143PFNGLGENERATEMIPMAPPROC glGenerateMipmap = nullptr;
144PFNGLGENFRAMEBUFFERSPROC glGenFramebuffers = nullptr;
145PFNGLGENRENDERBUFFERSPROC glGenRenderbuffers = nullptr;
146PFNGLGENSAMPLERSPROC glGenSamplers = nullptr;
147PFNGLGENTEXTURESPROC glGenTextures = nullptr;
148PFNGLGENVERTEXARRAYSPROC glGenVertexArrays = nullptr;
149PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC glGetActiveAtomicCounterBufferiv = nullptr;
150PFNGLGETACTIVEATTRIBPROC glGetActiveAttrib = nullptr;
151PFNGLGETACTIVEUNIFORMBLOCKIVPROC glGetActiveUniformBlockiv = nullptr;
152PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glGetActiveUniformBlockName = nullptr;
153PFNGLGETACTIVEUNIFORMNAMEPROC glGetActiveUniformName = nullptr;
154PFNGLGETACTIVEUNIFORMPROC glGetActiveUniform = nullptr;
155PFNGLGETACTIVEUNIFORMSIVPROC glGetActiveUniformsiv = nullptr;
156PFNGLGETATTACHEDSHADERSPROC glGetAttachedShaders = nullptr;
157PFNGLGETATTRIBLOCATIONPROC glGetAttribLocation = nullptr;
158PFNGLGETBUFFERSUBDATAPROC glGetBufferSubData = nullptr;
159PFNGLGETERRORPROC glGetError = nullptr;
160PFNGLGETFLOATVPROC glGetFloatv = nullptr;
161PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glGetFramebufferAttachmentParameteriv = nullptr;
162PFNGLGETINTEGERI_VPROC glGetIntegeri_v = nullptr;
163PFNGLGETINTEGERVPROC glGetIntegerv = nullptr;
164PFNGLGETINTERNALFORMATIVPROC glGetInternalformativ = nullptr;
165PFNGLGETNAMEDBUFFERSUBDATAPROC glGetNamedBufferSubData = nullptr;
166PFNGLGETPROGRAMINFOLOGPROC glGetProgramInfoLog = nullptr;
167PFNGLGETPROGRAMIVPROC glGetProgramiv = nullptr;
168PFNGLGETPROGRAMRESOURCEINDEXPROC glGetProgramResourceIndex = nullptr;
169PFNGLGETPROGRAMRESOURCEIVPROC glGetProgramResourceiv = nullptr;
170PFNGLGETSHADERINFOLOGPROC glGetShaderInfoLog = nullptr;
171PFNGLGETSHADERIVPROC glGetShaderiv = nullptr;
172PFNGLGETSHADERSOURCEPROC glGetShaderSource = nullptr;
173PFNGLGETSTRINGIPROC glGetStringi = nullptr;
174PFNGLGETSTRINGPROC glGetString = nullptr;
175PFNGLGETUNIFORMBLOCKINDEXPROC glGetUniformBlockIndex = nullptr;
176PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation = nullptr;
177PFNGLINVALIDATEFRAMEBUFFERPROC glInvalidateFramebuffer = nullptr;
178PFNGLISENABLEDPROC glIsEnabled = nullptr;
179PFNGLLINKPROGRAMPROC glLinkProgram = nullptr;
180PFNGLMAPBUFFERRANGEPROC glMapBufferRange = nullptr;
181PFNGLMEMORYBARRIERPROC glMemoryBarrier = nullptr;
182PFNGLNAMEDBUFFERDATAPROC glNamedBufferData = nullptr;
183PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC glNamedFramebufferDrawBuffer = nullptr;
184PFNGLOBJECTLABELPROC glObjectLabel = nullptr;
185PFNGLPIXELSTOREIPROC glPixelStorei = nullptr;
186PFNGLPOLYGONMODEPROC glPolygonMode = nullptr;
187PFNGLPOLYGONOFFSETPROC glPolygonOffset = nullptr;
188PFNGLPOPDEBUGGROUPPROC glPopDebugGroup = nullptr;
189PFNGLPUSHDEBUGGROUPPROC glPushDebugGroup = nullptr;
190PFNGLREADBUFFERPROC glReadBuffer = nullptr;
191PFNGLREADPIXELSPROC glReadPixels = nullptr;
192PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glRenderbufferStorageMultisample = nullptr;
193PFNGLRENDERBUFFERSTORAGEPROC glRenderbufferStorage = nullptr;
194PFNGLSAMPLERPARAMETERFPROC glSamplerParameterf = nullptr;
195PFNGLSAMPLERPARAMETERFVPROC glSamplerParameterfv = nullptr;
196PFNGLSAMPLERPARAMETERIPROC glSamplerParameteri = nullptr;
197PFNGLSCISSORPROC glScissor = nullptr;
198PFNGLSHADERSOURCEPROC glShaderSource = nullptr;
199PFNGLTEXIMAGE2DPROC glTexImage2D = nullptr;
200PFNGLTEXPARAMETERIPROC glTexParameteri = nullptr;
201PFNGLTEXSTORAGE1DPROC glTexStorage1D = nullptr;
202PFNGLTEXSTORAGE2DMULTISAMPLEPROC glTexStorage2DMultisample = nullptr;
203PFNGLTEXSTORAGE2DPROC glTexStorage2D = nullptr;
204PFNGLTEXSTORAGE3DMULTISAMPLEPROC glTexStorage3DMultisample = nullptr;
205PFNGLTEXSTORAGE3DPROC glTexStorage3D = nullptr;
206PFNGLTEXSUBIMAGE1DPROC glTexSubImage1D = nullptr;
207PFNGLTEXSUBIMAGE2DPROC glTexSubImage2D = nullptr;
208PFNGLTEXSUBIMAGE3DPROC glTexSubImage3D = nullptr;
209PFNGLTEXTUREVIEWPROC glTextureView = nullptr;
210PFNGLUNIFORM1FPROC glUniform1f = nullptr;
211PFNGLUNIFORM1FVPROC glUniform1fv = nullptr;
212PFNGLUNIFORM1IPROC glUniform1i = nullptr;
213PFNGLUNIFORM1IVPROC glUniform1iv = nullptr;
214PFNGLUNIFORM2FVPROC glUniform2fv = nullptr;
215PFNGLUNIFORM3FVPROC glUniform3fv = nullptr;
216PFNGLUNIFORM4FVPROC glUniform4fv = nullptr;
217PFNGLUNIFORM4IVPROC glUniform4iv = nullptr;
218PFNGLUNIFORMBLOCKBINDINGPROC glUniformBlockBinding = nullptr;
219PFNGLUNIFORMMATRIX4FVPROC glUniformMatrix4fv = nullptr;
220PFNGLUNMAPBUFFERPROC glUnmapBuffer = nullptr;
221PFNGLUSEPROGRAMPROC glUseProgram = nullptr;
222PFNGLVERTEXATTRIBDIVISORPROC glVertexAttribDivisor = nullptr;
223PFNGLVERTEXATTRIBIPOINTERPROC glVertexAttribIPointer = nullptr;
224PFNGLVERTEXATTRIBPOINTERPROC glVertexAttribPointer = nullptr;
225PFNGLVIEWPORTPROC glViewport = nullptr;
226PFNGLWAITSYNCPROC glWaitSync = nullptr;
227
228#if defined(COGS_OPENGLES30)
229PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC glFramebufferTextureMultisampleMultiviewOVR = nullptr;
230
231PFNGLDEBUGMESSAGECALLBACKKHRPROC glDebugMessageCallbackKHR = nullptr;
232PFNGLDEBUGMESSAGECONTROLKHRPROC glDebugMessageControlKHR = nullptr;
233PFNGLDEBUGMESSAGEINSERTKHRPROC glDebugMessageInsertKHR = nullptr;
234PFNGLOBJECTLABELKHRPROC glObjectLabelKHR = nullptr;
235#endif
236
237#ifdef COGS_GLX
238extern PFNGLXGETPROCADDRESSPROC _glXGetProcAddress;
239#endif
240
241#ifdef COGS_EGL
242extern PFNEGLGETPROCADDRESSPROC _eglGetProcAddress;
243#endif
244
245namespace {
246
247#ifdef _WIN32
248 void* getProcAddress(const char* name)
249 {
250 // 20221015 chrisdy: Any reason anymore to not solely rely on wglGetProcAddress? Some old
251 // stuff? And these 1, 2, 3 and -1 return values?
252 auto* f = (void*)wglGetProcAddress(name);
253 if (f && (f != (void*)1) && (f != (void*)2) && (f != (void*)3) && (f != (void*)-1)) {
254 return f;
255 }
256 HMODULE module = LoadLibraryA("opengl32.dll");
257 assert(module);
258 f = (void*)GetProcAddress(module, name);
259 assert(f);
260 return f;
261 }
262#endif
263
264#ifdef COGS_GLX
265
266 void* getProcAddress(const char* name)
267 {
268 auto f = (void*)_glXGetProcAddress((const GLubyte*)name);
269 assert(f);
270 return f;
271 }
272
273#endif
274
275#ifdef COGS_EGL
276 void* getProcAddress(const char* name)
277 {
278 auto f = (void*)_eglGetProcAddress(name);
279 assert(f);
280 return f;
281 }
282#endif
283
284 struct Version
285 {
286 int major = 0;
287 int minor = 0;
288
289 bool has_GL_NV_instanced_arrays = false;
290 bool has_GL_KHR_debug = false;
291 bool has_GL_OCULUS_multiview = false;
292 bool has_GL_OVR_multiview = false;
293 bool has_GL_EXT_clip_control = false;
294 };
295
296
297 bool bootstrap(Version& version)
298 {
299 glGetStringi = (PFNGLGETSTRINGIPROC)getProcAddress("glGetStringi");
300 glGetIntegerv = (PFNGLGETINTEGERVPROC)getProcAddress("glGetIntegerv");
301
302 glGetIntegerv(GL_MAJOR_VERSION, &version.major);
303 glGetIntegerv(GL_MINOR_VERSION, &version.minor);
304 LOG_DEBUG(logger, "Got OpenGL version %d.%d", version.major, version.minor);
305 if (version.major < 3) {
306 LOG_FATAL(logger, "Insufficient OpenGL version");
307 return false;
308 }
309
310 int numExtensions = 0;
311 glGetIntegerv(GL_NUM_EXTENSIONS, &numExtensions);
312 for (int i = 0; i < numExtensions; i++) {
313 switch (Cogs::hash(Cogs::StringView((const char*)glGetStringi(GL_EXTENSIONS, i)))) {
314 case Cogs::hash("GL_KHR_debug"): version.has_GL_KHR_debug = true; break;
315 case Cogs::hash("GL_OCULUS_multiview"): version.has_GL_OCULUS_multiview = true; break;
316 case Cogs::hash("GL_OVR_multiview_multisampled_render_to_texture"): version.has_GL_OCULUS_multiview = true; break;
317 case Cogs::hash("GL_OVR_multiview"): version.has_GL_OVR_multiview = true; break;
318 case Cogs::hash("GL_OVR_multiview2"): version.has_GL_OVR_multiview = true; break;
319 case Cogs::hash("GL_NV_instanced_arrays"): version.has_GL_NV_instanced_arrays = true; break;
320 case Cogs::hash("GL_EXT_clip_control"): version.has_GL_EXT_clip_control = true; break;
321 default: break;
322 }
323 }
324 return true;
325 }
326
327}
328
329bool Cogs::getGLES3FuncPointers(GLContextBase::Platform platform)
330{
331 Version version;
332 if (!bootstrap(version)) return false;
333
334 glActiveTexture = (PFNGLACTIVETEXTUREPROC)getProcAddress("glActiveTexture");
335 glAttachShader = (PFNGLATTACHSHADERPROC)getProcAddress("glAttachShader");
336 glBindBuffer = (PFNGLBINDBUFFERPROC)getProcAddress("glBindBuffer");
337 glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)getProcAddress("glBindBufferBase");
338 glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC)getProcAddress("glBindBufferRange");
339 glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)getProcAddress("glBindFramebuffer");
340 glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)getProcAddress("glBindRenderbuffer");
341 glBindSampler = (PFNGLBINDSAMPLERPROC)getProcAddress("glBindSampler");
342 glBindTexture = (PFNGLBINDTEXTUREPROC)getProcAddress("glBindTexture");
343 glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)getProcAddress("glBindVertexArray");
344 glBlendColor = (PFNGLBLENDCOLORPROC)getProcAddress("glBlendColor");
345 glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC)getProcAddress("glBlendEquationSeparate");
346 glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)getProcAddress("glBlendFuncSeparate");
347 glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)getProcAddress("glBlitFramebuffer");
348 glBufferData = (PFNGLBUFFERDATAPROC)getProcAddress("glBufferData");
349 glBufferSubData = (PFNGLBUFFERSUBDATAPROC)getProcAddress("glBufferSubData");
350 glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)getProcAddress("glCheckFramebufferStatus");
351 glClear = (PFNGLCLEARPROC)getProcAddress("glClear");
352 glClearBufferData = (PFNGLCLEARBUFFERDATAPROC)getProcAddress("glClearBufferData");
353 glClearBufferfv = (PFNGLCLEARBUFFERFVPROC)getProcAddress("glClearBufferfv");
354 glClearBufferiv = (PFNGLCLEARBUFFERIVPROC)getProcAddress("glClearBufferiv");
355 glClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC)getProcAddress("glClearBufferuiv");
356 glClearColor = (PFNGLCLEARCOLORPROC)getProcAddress("glClearColor");
357 glClearDepth = (PFNGLCLEARDEPTHPROC)getProcAddress("glClearDepth");
358 glClearDepthf = (PFNGLCLEARDEPTHFPROC)getProcAddress("glClearDepthf");
359 glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC)getProcAddress("glClientWaitSync");
360 glCompileShader = (PFNGLCOMPILESHADERPROC)getProcAddress("glCompileShader");
361 glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)getProcAddress("glCompressedTexImage2D");
362 glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)getProcAddress("glCompressedTexSubImage2D");
363 glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC)getProcAddress("glCopyBufferSubData");
364 glCopyImageSubData = (PFNGLCOPYIMAGESUBDATAPROC)getProcAddress("glCopyImageSubData");
365 glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC)getProcAddress("glCopyTexSubImage2D");
366 glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC)getProcAddress("glCopyTexSubImage3D");
367 glCreateProgram = (PFNGLCREATEPROGRAMPROC)getProcAddress("glCreateProgram");
368 glCreateShader = (PFNGLCREATESHADERPROC)getProcAddress("glCreateShader");
369 glCullFace = (PFNGLCULLFACEPROC)getProcAddress("glCullFace");
370 glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)getProcAddress("glDeleteBuffers");
371 glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)getProcAddress("glDeleteFramebuffers");
372 glDeleteProgram = (PFNGLDELETEPROGRAMPROC)getProcAddress("glDeleteProgram");
373 glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)getProcAddress("glDeleteRenderbuffers");
374 glDeleteSamplers = (PFNGLDELETESAMPLERSPROC)getProcAddress("glDeleteSamplers");
375 glDeleteShader = (PFNGLDELETESHADERPROC)getProcAddress("glDeleteShader");
376 glDeleteSync = (PFNGLDELETESYNCPROC)getProcAddress("glDeleteSync");
377 glDeleteTextures = (PFNGLDELETETEXTURESPROC)getProcAddress("glDeleteTextures");
378 glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)getProcAddress("glDeleteVertexArrays");
379 glDepthFunc = (PFNGLDEPTHFUNCPROC)getProcAddress("glDepthFunc");
380 glDepthMask = (PFNGLDEPTHMASKPROC)getProcAddress("glDepthMask");
381 glDisable = (PFNGLDISABLEPROC)getProcAddress("glDisable");
382 glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)getProcAddress("glDisableVertexAttribArray");
383 glDrawArrays = (PFNGLDRAWARRAYSPROC)getProcAddress("glDrawArrays");
384 glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC)getProcAddress("glDrawArraysInstanced");
385 glDrawBuffers = (PFNGLDRAWBUFFERSPROC)getProcAddress("glDrawBuffers");
386 glDrawElements = (PFNGLDRAWELEMENTSPROC)getProcAddress("glDrawElements");
387 glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC)getProcAddress("glDrawElementsInstanced");
388 glEnable = (PFNGLENABLEPROC)getProcAddress("glEnable");
389 glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)getProcAddress("glEnableVertexAttribArray");
390 glFenceSync = (PFNGLFENCESYNCPROC)getProcAddress("glFenceSync");
391 glFinish = (PFNGLFINISHPROC)getProcAddress("glFinish");
392 glFlush = (PFNGLFLUSHPROC)getProcAddress("glFlush");
393 glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)getProcAddress("glFramebufferRenderbuffer");
394 glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)getProcAddress("glFramebufferTexture2D");
395 glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)getProcAddress("glFramebufferTextureLayer");
396 glFrontFace = (PFNGLFRONTFACEPROC)getProcAddress("glFrontFace");
397 glGenBuffers = (PFNGLGENBUFFERSPROC)getProcAddress("glGenBuffers");
398 glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)getProcAddress("glGenerateMipmap");
399 glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)getProcAddress("glGenFramebuffers");
400 glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)getProcAddress("glGenRenderbuffers");
401 glGenSamplers = (PFNGLGENSAMPLERSPROC)getProcAddress("glGenSamplers");
402 glGenTextures = (PFNGLGENTEXTURESPROC)getProcAddress("glGenTextures");
403 glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)getProcAddress("glGenVertexArrays");
404 glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)getProcAddress("glGetActiveAttrib");
405 glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)getProcAddress("glGetActiveUniform");
406 glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC)getProcAddress("glGetActiveUniformBlockiv");
407 glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)getProcAddress("glGetActiveUniformBlockName");
408 glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC)getProcAddress("glGetActiveUniformsiv");
409 glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC)getProcAddress("glGetAttachedShaders");
410 glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)getProcAddress("glGetAttribLocation");
411 glGetError = (PFNGLGETERRORPROC)getProcAddress("glGetError");
412 glGetFloatv = (PFNGLGETFLOATVPROC)getProcAddress("glGetFloatv");
413 glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)getProcAddress("glGetFramebufferAttachmentParameteriv");
414 glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC)getProcAddress("glGetIntegeri_v");
415 glGetIntegerv = (PFNGLGETINTEGERVPROC)getProcAddress("glGetIntegerv");
416 glGetInternalformativ = (PFNGLGETINTERNALFORMATIVPROC)getProcAddress("glGetInternalformativ");
417 glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)getProcAddress("glGetProgramInfoLog");
418 glGetProgramiv = (PFNGLGETPROGRAMIVPROC)getProcAddress("glGetProgramiv");
419 glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)getProcAddress("glGetShaderInfoLog");
420 glGetShaderiv = (PFNGLGETSHADERIVPROC)getProcAddress("glGetShaderiv");
421 glGetShaderSource = (PFNGLGETSHADERSOURCEPROC)getProcAddress("glGetShaderSource");
422 glGetString = (PFNGLGETSTRINGPROC)getProcAddress("glGetString");
423 glGetStringi = (PFNGLGETSTRINGIPROC)getProcAddress("glGetStringi");
424 glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC)getProcAddress("glGetUniformBlockIndex");
425 glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)getProcAddress("glGetUniformLocation");
426 glInvalidateFramebuffer = (PFNGLINVALIDATEFRAMEBUFFERPROC)getProcAddress("glInvalidateFramebuffer");
427 glIsEnabled = (PFNGLISENABLEDPROC)getProcAddress("glIsEnabled");
428 glLinkProgram = (PFNGLLINKPROGRAMPROC)getProcAddress("glLinkProgram");
429 glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC)getProcAddress("glMapBufferRange");
430 glPixelStorei = (PFNGLPIXELSTOREIPROC)getProcAddress("glPixelStorei");
431 glPolygonOffset = (PFNGLPOLYGONOFFSETPROC)getProcAddress("glPolygonOffset");
432 glReadBuffer = (PFNGLREADBUFFERPROC)getProcAddress("glReadBuffer");
433 glReadPixels = (PFNGLREADPIXELSPROC)getProcAddress("glReadPixels");
434 glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)getProcAddress("glRenderbufferStorage");
435 glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)getProcAddress("glRenderbufferStorageMultisample");
436 glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC)getProcAddress("glSamplerParameterf");
437 glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC)getProcAddress("glSamplerParameterfv");
438 glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC)getProcAddress("glSamplerParameteri");
439 glScissor = (PFNGLSCISSORPROC)getProcAddress("glScissor");
440 glShaderSource = (PFNGLSHADERSOURCEPROC)getProcAddress("glShaderSource");
441 glTexImage2D = (PFNGLTEXIMAGE2DPROC)getProcAddress("glTexImage2D");
442 glTexParameteri = (PFNGLTEXPARAMETERIPROC)getProcAddress("glTexParameteri");
443 glTexStorage2D = (PFNGLTEXSTORAGE2DPROC)getProcAddress("glTexStorage2D");
444 glTexStorage3D = (PFNGLTEXSTORAGE3DPROC)getProcAddress("glTexStorage3D");
445 glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC)getProcAddress("glTexSubImage2D");
446 glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC)getProcAddress("glTexSubImage3D");
447 glUniform1f = (PFNGLUNIFORM1FPROC)getProcAddress("glUniform1f");
448 glUniform1fv = (PFNGLUNIFORM1FVPROC)getProcAddress("glUniform1fv");
449 glUniform1i = (PFNGLUNIFORM1IPROC)getProcAddress("glUniform1i");
450 glUniform1iv = (PFNGLUNIFORM1IVPROC)getProcAddress("glUniform1iv");
451 glUniform2fv = (PFNGLUNIFORM2FVPROC)getProcAddress("glUniform2fv");
452 glUniform3fv = (PFNGLUNIFORM3FVPROC)getProcAddress("glUniform3fv");
453 glUniform4fv = (PFNGLUNIFORM4FVPROC)getProcAddress("glUniform4fv");
454 glUniform4iv = (PFNGLUNIFORM4IVPROC)getProcAddress("glUniform4iv");
455 glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC)getProcAddress("glUniformBlockBinding");
456 glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)getProcAddress("glUniformMatrix4fv");
457 glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)getProcAddress("glUnmapBuffer");
458 glUseProgram = (PFNGLUSEPROGRAMPROC)getProcAddress("glUseProgram");
459 glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC)getProcAddress("glVertexAttribDivisor");
460 glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC)getProcAddress("glVertexAttribIPointer");
461 glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)getProcAddress("glVertexAttribPointer");
462 glViewport = (PFNGLVIEWPORTPROC)getProcAddress("glViewport");
463 glWaitSync = (PFNGLWAITSYNCPROC)getProcAddress("glWaitSync");
464
465#if defined(COGS_OPENGLES30)
466 if (version.has_GL_KHR_debug) {
467 // According to GL_KHR_debug extension specification, in an ES context, the extension API funcs have KHR suffices, but not in a GL context
468 if (platform == GLContextBase::Platform::ES3) {
469 glDebugMessageCallbackKHR = (PFNGLDEBUGMESSAGECALLBACKKHRPROC)getProcAddress("glDebugMessageCallbackKHR");
470 glDebugMessageControlKHR = (PFNGLDEBUGMESSAGECONTROLKHRPROC)getProcAddress("glDebugMessageControlKHR");
471 glDebugMessageInsertKHR = (PFNGLDEBUGMESSAGEINSERTKHRPROC)getProcAddress("glDebugMessageInsertKHR");
472 glObjectLabelKHR = (PFNGLOBJECTLABELKHRPROC)getProcAddress("glObjectLabelKHR");
473 }
474 else {
475 glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKKHRPROC)getProcAddress("glDebugMessageCallback");
476 glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLKHRPROC)getProcAddress("glDebugMessageControl");
477 glDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTKHRPROC)getProcAddress("glDebugMessageInsert");
478 glObjectLabel = (PFNGLOBJECTLABELKHRPROC)getProcAddress("glObjectLabel");
479 }
480 }
481
482 if (version.has_GL_OCULUS_multiview) {
483 glFramebufferTextureMultisampleMultiviewOVR = (PFNGLFRAMEBUFFERTEXTUREMULTISAMPLEMULTIVIEWOVRPROC)getProcAddress("glFramebufferTextureMultisampleMultiviewOVR");
484 glFramebufferTextureMultiviewOVR = (PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC)getProcAddress("glFramebufferTextureMultiviewOVR");
485 }
486 else if (version.has_GL_OVR_multiview) {
487 glFramebufferTextureMultiviewOVR = (PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC)getProcAddress("glFramebufferTextureMultiviewOVR");
488 }
489
490 if (version.has_GL_EXT_clip_control) {
491 glClipControl = (PFNGLCLIPCONTROLEXTPROC)getProcAddress("glClipControlEXT");
492 }
493#else
494 // To stop build warning unused variable 'platform'
495 (void)platform;
496#endif
497
498 return true;
499}
500
501bool Cogs::getGLFuncPointers()
502{
503 Version version;
504 if (!bootstrap(version)) return false;
505
506 glActiveTexture = (PFNGLACTIVETEXTUREPROC)getProcAddress("glActiveTexture");
507 glAttachShader = (PFNGLATTACHSHADERPROC)getProcAddress("glAttachShader");
508 glBindBufferBase = (PFNGLBINDBUFFERBASEPROC)getProcAddress("glBindBufferBase");
509 glBindBuffer = (PFNGLBINDBUFFERPROC)getProcAddress("glBindBuffer");
510 glBindBufferRange = (PFNGLBINDBUFFERRANGEPROC)getProcAddress("glBindBufferRange");
511 glBindFramebuffer = (PFNGLBINDFRAMEBUFFERPROC)getProcAddress("glBindFramebuffer");
512 glBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC)getProcAddress("glBindImageTexture");
513 glBindRenderbuffer = (PFNGLBINDRENDERBUFFERPROC)getProcAddress("glBindRenderbuffer");
514 glBindSampler = (PFNGLBINDSAMPLERPROC)getProcAddress("glBindSampler");
515 glBindTexture = (PFNGLBINDTEXTUREPROC)getProcAddress("glBindTexture");
516 glBindVertexArray = (PFNGLBINDVERTEXARRAYPROC)getProcAddress("glBindVertexArray");
517 glBlendColor = (PFNGLBLENDCOLORPROC)getProcAddress("glBlendColor");
518 glBlendEquationSeparate = (PFNGLBLENDEQUATIONSEPARATEPROC)getProcAddress("glBlendEquationSeparate");
519 glBlendFuncSeparate = (PFNGLBLENDFUNCSEPARATEPROC)getProcAddress("glBlendFuncSeparate");
520 glBlitFramebuffer = (PFNGLBLITFRAMEBUFFERPROC)getProcAddress("glBlitFramebuffer");
521 glBufferData = (PFNGLBUFFERDATAPROC)getProcAddress("glBufferData");
522 glBufferSubData = (PFNGLBUFFERSUBDATAPROC)getProcAddress("glBufferSubData");
523 glCheckFramebufferStatus = (PFNGLCHECKFRAMEBUFFERSTATUSPROC)getProcAddress("glCheckFramebufferStatus");
524 glClearBufferData = (PFNGLCLEARBUFFERDATAPROC)getProcAddress("glClearBufferData");
525 glClearBufferfv = (PFNGLCLEARBUFFERFVPROC)getProcAddress("glClearBufferfv");
526 glClearBufferiv = (PFNGLCLEARBUFFERIVPROC)getProcAddress("glClearBufferiv");
527 glClearBufferuiv = (PFNGLCLEARBUFFERUIVPROC)getProcAddress("glClearBufferuiv");
528 glClearColor = (PFNGLCLEARCOLORPROC)getProcAddress("glClearColor");
529 glClearDepthf = (PFNGLCLEARDEPTHFPROC)getProcAddress("glClearDepthf");
530 glClearDepth = (PFNGLCLEARDEPTHPROC)getProcAddress("glClearDepth");
531 glClearNamedBufferData = (PFNGLCLEARNAMEDBUFFERDATAPROC)getProcAddress("glClearNamedBufferData");
532 glClear = (PFNGLCLEARPROC)getProcAddress("glClear");
533 glClientWaitSync = (PFNGLCLIENTWAITSYNCPROC)getProcAddress("glClientWaitSync");
534 glClipControl = (PFNGLCLIPCONTROLPROC)getProcAddress("glClipControl");
535 glCompileShader = (PFNGLCOMPILESHADERPROC)getProcAddress("glCompileShader");
536 glCompressedTexImage2D = (PFNGLCOMPRESSEDTEXIMAGE2DPROC)getProcAddress("glCompressedTexImage2D");
537 glCompressedTexSubImage2D = (PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC)getProcAddress("glCompressedTexSubImage2D");
538 glCopyBufferSubData = (PFNGLCOPYBUFFERSUBDATAPROC)getProcAddress("glCopyBufferSubData");
539 glCopyImageSubData = (PFNGLCOPYIMAGESUBDATAPROC)getProcAddress("glCopyImageSubData");
540 glCopyNamedBufferSubData = (PFNGLCOPYNAMEDBUFFERSUBDATAPROC)getProcAddress("glCopyNamedBufferSubData");
541 glCopyTexSubImage2D = (PFNGLCOPYTEXSUBIMAGE2DPROC)getProcAddress("glCopyTexSubImage2D");
542 glCopyTexSubImage3D = (PFNGLCOPYTEXSUBIMAGE3DPROC)getProcAddress("glCopyTexSubImage3D");
543 glCreateProgram = (PFNGLCREATEPROGRAMPROC)getProcAddress("glCreateProgram");
544 glCreateShader = (PFNGLCREATESHADERPROC)getProcAddress("glCreateShader");
545 glCullFace = (PFNGLCULLFACEPROC)getProcAddress("glCullFace");
546 glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC)getProcAddress("glDebugMessageCallback");
547 glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC)getProcAddress("glDebugMessageControl");
548 glDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC)getProcAddress("glDebugMessageInsert");
549 glDeleteBuffers = (PFNGLDELETEBUFFERSPROC)getProcAddress("glDeleteBuffers");
550 glDeleteFramebuffers = (PFNGLDELETEFRAMEBUFFERSPROC)getProcAddress("glDeleteFramebuffers");
551 glDeleteProgram = (PFNGLDELETEPROGRAMPROC)getProcAddress("glDeleteProgram");
552 glDeleteRenderbuffers = (PFNGLDELETERENDERBUFFERSPROC)getProcAddress("glDeleteRenderbuffers");
553 glDeleteSamplers = (PFNGLDELETESAMPLERSPROC)getProcAddress("glDeleteSamplers");
554 glDeleteShader = (PFNGLDELETESHADERPROC)getProcAddress("glDeleteShader");
555 glDeleteSync = (PFNGLDELETESYNCPROC)getProcAddress("glDeleteSync");
556 glDeleteTextures = (PFNGLDELETETEXTURESPROC)getProcAddress("glDeleteTextures");
557 glDeleteVertexArrays = (PFNGLDELETEVERTEXARRAYSPROC)getProcAddress("glDeleteVertexArrays");
558 glDepthFunc = (PFNGLDEPTHFUNCPROC)getProcAddress("glDepthFunc");
559 glDepthMask = (PFNGLDEPTHMASKPROC)getProcAddress("glDepthMask");
560 glDisablei = (PFNGLDISABLEIPROC)getProcAddress("glDisablei");
561 glDisable = (PFNGLDISABLEPROC)getProcAddress("glDisable");
562 glDisableVertexArrayAttrib = (PFNGLDISABLEVERTEXARRAYATTRIBPROC)getProcAddress("glDisableVertexArrayAttrib");
563 glDisableVertexAttribArray = (PFNGLDISABLEVERTEXATTRIBARRAYPROC)getProcAddress("glDisableVertexAttribArray");
564 glDispatchCompute = (PFNGLDISPATCHCOMPUTEPROC)getProcAddress("glDispatchCompute");
565 glDrawArraysInstancedBaseInstance = (PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC)getProcAddress("glDrawArraysInstancedBaseInstance");
566 glDrawArraysInstanced = (PFNGLDRAWARRAYSINSTANCEDPROC)getProcAddress("glDrawArraysInstanced");
567 glDrawArrays = (PFNGLDRAWARRAYSPROC)getProcAddress("glDrawArrays");
568 glDrawBuffer = (PFNGLDRAWBUFFERPROC)getProcAddress("glDrawBuffer");
569 glDrawBuffers = (PFNGLDRAWBUFFERSPROC)getProcAddress("glDrawBuffers");
570 glDrawElementsBaseVertex = (PFNGLDRAWELEMENTSBASEVERTEXPROC)getProcAddress("glDrawElementsBaseVertex");
571 glDrawElementsInstancedBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC)getProcAddress("glDrawElementsInstancedBaseInstance");
572 glDrawElementsInstanced = (PFNGLDRAWELEMENTSINSTANCEDPROC)getProcAddress("glDrawElementsInstanced");
573 glDrawElements = (PFNGLDRAWELEMENTSPROC)getProcAddress("glDrawElements");
574 glEnablei = (PFNGLENABLEIPROC)getProcAddress("glEnablei");
575 glEnable = (PFNGLENABLEPROC)getProcAddress("glEnable");
576 glEnableVertexArrayAttrib = (PFNGLENABLEVERTEXARRAYATTRIBPROC)getProcAddress("glEnableVertexArrayAttrib");
577 glEnableVertexAttribArray = (PFNGLENABLEVERTEXATTRIBARRAYPROC)getProcAddress("glEnableVertexAttribArray");
578 glFenceSync = (PFNGLFENCESYNCPROC)getProcAddress("glFenceSync");
579 glFinish = (PFNGLFINISHPROC)getProcAddress("glFinish");
580 glFlush = (PFNGLFLUSHPROC)getProcAddress("glFlush");
581 glFramebufferRenderbuffer = (PFNGLFRAMEBUFFERRENDERBUFFERPROC)getProcAddress("glFramebufferRenderbuffer");
582 glFramebufferTexture2D = (PFNGLFRAMEBUFFERTEXTURE2DPROC)getProcAddress("glFramebufferTexture2D");
583 glFramebufferTextureLayer = (PFNGLFRAMEBUFFERTEXTURELAYERPROC)getProcAddress("glFramebufferTextureLayer");
584 glFramebufferTextureMultiviewOVR = (PFNGLFRAMEBUFFERTEXTUREMULTIVIEWOVRPROC)getProcAddress("glFramebufferTextureMultiviewOVR");
585 glFrontFace = (PFNGLFRONTFACEPROC)getProcAddress("glFrontFace");
586 glGenBuffers = (PFNGLGENBUFFERSPROC)getProcAddress("glGenBuffers");
587 glGenerateMipmap = (PFNGLGENERATEMIPMAPPROC)getProcAddress("glGenerateMipmap");
588 glGenFramebuffers = (PFNGLGENFRAMEBUFFERSPROC)getProcAddress("glGenFramebuffers");
589 glGenRenderbuffers = (PFNGLGENRENDERBUFFERSPROC)getProcAddress("glGenRenderbuffers");
590 glGenSamplers = (PFNGLGENSAMPLERSPROC)getProcAddress("glGenSamplers");
591 glGenTextures = (PFNGLGENTEXTURESPROC)getProcAddress("glGenTextures");
592 glGenVertexArrays = (PFNGLGENVERTEXARRAYSPROC)getProcAddress("glGenVertexArrays");
593 glGetActiveAtomicCounterBufferiv = (PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC)getProcAddress("glGetActiveAtomicCounterBufferiv");
594 glGetActiveAttrib = (PFNGLGETACTIVEATTRIBPROC)getProcAddress("glGetActiveAttrib");
595 glGetActiveUniformBlockiv = (PFNGLGETACTIVEUNIFORMBLOCKIVPROC)getProcAddress("glGetActiveUniformBlockiv");
596 glGetActiveUniformBlockName = (PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC)getProcAddress("glGetActiveUniformBlockName");
597 glGetActiveUniformName = (PFNGLGETACTIVEUNIFORMNAMEPROC)getProcAddress("glGetActiveUniformName");
598 glGetActiveUniform = (PFNGLGETACTIVEUNIFORMPROC)getProcAddress("glGetActiveUniform");
599 glGetActiveUniformsiv = (PFNGLGETACTIVEUNIFORMSIVPROC)getProcAddress("glGetActiveUniformsiv");
600 glGetAttachedShaders = (PFNGLGETATTACHEDSHADERSPROC)getProcAddress("glGetAttachedShaders");
601 glGetAttribLocation = (PFNGLGETATTRIBLOCATIONPROC)getProcAddress("glGetAttribLocation");
602 glGetBufferSubData = (PFNGLGETBUFFERSUBDATAPROC)getProcAddress("glGetBufferSubData");
603 glGetError = (PFNGLGETERRORPROC)getProcAddress("glGetError");
604 glGetFloatv = (PFNGLGETFLOATVPROC)getProcAddress("glGetFloatv");
605 glGetFramebufferAttachmentParameteriv = (PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC)getProcAddress("glGetFramebufferAttachmentParameteriv");
606 glGetIntegeri_v = (PFNGLGETINTEGERI_VPROC)getProcAddress("glGetIntegeri_v");
607 glGetIntegerv = (PFNGLGETINTEGERVPROC)getProcAddress("glGetIntegerv");
608 glGetInternalformativ = (PFNGLGETINTERNALFORMATIVPROC)getProcAddress("glGetInternalformativ");
609 glGetNamedBufferSubData = (PFNGLGETNAMEDBUFFERSUBDATAPROC)getProcAddress("glGetNamedBufferSubData");
610 glGetProgramInfoLog = (PFNGLGETPROGRAMINFOLOGPROC)getProcAddress("glGetProgramInfoLog");
611 glGetProgramiv = (PFNGLGETPROGRAMIVPROC)getProcAddress("glGetProgramiv");
612 glGetProgramResourceIndex = (PFNGLGETPROGRAMRESOURCEINDEXPROC)getProcAddress("glGetProgramResourceIndex");
613 glGetProgramResourceiv = (PFNGLGETPROGRAMRESOURCEIVPROC)getProcAddress("glGetProgramResourceiv");
614 glGetShaderInfoLog = (PFNGLGETSHADERINFOLOGPROC)getProcAddress("glGetShaderInfoLog");
615 glGetShaderiv = (PFNGLGETSHADERIVPROC)getProcAddress("glGetShaderiv");
616 glGetShaderSource = (PFNGLGETSHADERSOURCEPROC)getProcAddress("glGetShaderSource");
617 glGetStringi = (PFNGLGETSTRINGIPROC)getProcAddress("glGetStringi");
618 glGetString = (PFNGLGETSTRINGPROC)getProcAddress("glGetString");
619 glGetUniformBlockIndex = (PFNGLGETUNIFORMBLOCKINDEXPROC)getProcAddress("glGetUniformBlockIndex");
620 glGetUniformLocation = (PFNGLGETUNIFORMLOCATIONPROC)getProcAddress("glGetUniformLocation");
621 glInvalidateFramebuffer = (PFNGLINVALIDATEFRAMEBUFFERPROC)getProcAddress("glInvalidateFramebuffer");
622 glIsEnabled = (PFNGLISENABLEDPROC)getProcAddress("glIsEnabled");
623 glLinkProgram = (PFNGLLINKPROGRAMPROC)getProcAddress("glLinkProgram");
624 glMapBufferRange = (PFNGLMAPBUFFERRANGEPROC)getProcAddress("glMapBufferRange");
625 glMemoryBarrier = (PFNGLMEMORYBARRIERPROC)getProcAddress("glMemoryBarrier");
626 glNamedBufferData = (PFNGLNAMEDBUFFERDATAPROC)getProcAddress("glNamedBufferData");
627 glNamedFramebufferDrawBuffer = (PFNGLNAMEDFRAMEBUFFERDRAWBUFFERPROC)getProcAddress("glNamedFramebufferDrawBuffer");
628 glObjectLabel = (PFNGLOBJECTLABELPROC)getProcAddress("glObjectLabel");
629 glPixelStorei = (PFNGLPIXELSTOREIPROC)getProcAddress("glPixelStorei");
630 glPolygonMode = (PFNGLPOLYGONMODEPROC)getProcAddress("glPolygonMode");
631 glPolygonOffset = (PFNGLPOLYGONOFFSETPROC)getProcAddress("glPolygonOffset");
632 glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC)getProcAddress("glPopDebugGroup");
633 glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC)getProcAddress("glPushDebugGroup");
634 glReadBuffer = (PFNGLREADBUFFERPROC)getProcAddress("glReadBuffer");
635 glReadPixels = (PFNGLREADPIXELSPROC)getProcAddress("glReadPixels");
636 glRenderbufferStorageMultisample = (PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC)getProcAddress("glRenderbufferStorageMultisample");
637 glRenderbufferStorage = (PFNGLRENDERBUFFERSTORAGEPROC)getProcAddress("glRenderbufferStorage");
638 glSamplerParameterf = (PFNGLSAMPLERPARAMETERFPROC)getProcAddress("glSamplerParameterf");
639 glSamplerParameterfv = (PFNGLSAMPLERPARAMETERFVPROC)getProcAddress("glSamplerParameterfv");
640 glSamplerParameteri = (PFNGLSAMPLERPARAMETERIPROC)getProcAddress("glSamplerParameteri");
641 glScissor = (PFNGLSCISSORPROC)getProcAddress("glScissor");
642 glShaderSource = (PFNGLSHADERSOURCEPROC)getProcAddress("glShaderSource");
643 glTexImage2D = (PFNGLTEXIMAGE2DPROC)getProcAddress("glTexImage2D");
644 glTexParameteri = (PFNGLTEXPARAMETERIPROC)getProcAddress("glTexParameteri");
645 glTexStorage1D = (PFNGLTEXSTORAGE1DPROC)getProcAddress("glTexStorage1D");
646 glTexStorage2DMultisample = (PFNGLTEXSTORAGE2DMULTISAMPLEPROC)getProcAddress("glTexStorage2DMultisample");
647 glTexStorage2D = (PFNGLTEXSTORAGE2DPROC)getProcAddress("glTexStorage2D");
648 glTexStorage3DMultisample = (PFNGLTEXSTORAGE3DMULTISAMPLEPROC)getProcAddress("glTexStorage3DMultisample");
649 glTexStorage3D = (PFNGLTEXSTORAGE3DPROC)getProcAddress("glTexStorage3D");
650 glTexSubImage1D = (PFNGLTEXSUBIMAGE1DPROC)getProcAddress("glTexSubImage1D");
651 glTexSubImage2D = (PFNGLTEXSUBIMAGE2DPROC)getProcAddress("glTexSubImage2D");
652 glTexSubImage3D = (PFNGLTEXSUBIMAGE3DPROC)getProcAddress("glTexSubImage3D");
653 glTextureView = (PFNGLTEXTUREVIEWPROC)getProcAddress("glTextureView");
654 glUniform1f = (PFNGLUNIFORM1FPROC)getProcAddress("glUniform1f");
655 glUniform1fv = (PFNGLUNIFORM1FVPROC)getProcAddress("glUniform1fv");
656 glUniform1i = (PFNGLUNIFORM1IPROC)getProcAddress("glUniform1i");
657 glUniform1iv = (PFNGLUNIFORM1IVPROC)getProcAddress("glUniform1iv");
658 glUniform2fv = (PFNGLUNIFORM2FVPROC)getProcAddress("glUniform2fv");
659 glUniform3fv = (PFNGLUNIFORM3FVPROC)getProcAddress("glUniform3fv");
660 glUniform4fv = (PFNGLUNIFORM4FVPROC)getProcAddress("glUniform4fv");
661 glUniform4iv = (PFNGLUNIFORM4IVPROC)getProcAddress("glUniform4iv");
662 glUniformBlockBinding = (PFNGLUNIFORMBLOCKBINDINGPROC)getProcAddress("glUniformBlockBinding");
663 glUniformMatrix4fv = (PFNGLUNIFORMMATRIX4FVPROC)getProcAddress("glUniformMatrix4fv");
664 glUnmapBuffer = (PFNGLUNMAPBUFFERPROC)getProcAddress("glUnmapBuffer");
665 glUseProgram = (PFNGLUSEPROGRAMPROC)getProcAddress("glUseProgram");
666 glVertexAttribDivisor = (PFNGLVERTEXATTRIBDIVISORPROC)getProcAddress("glVertexAttribDivisor");
667 glVertexAttribIPointer = (PFNGLVERTEXATTRIBIPOINTERPROC)getProcAddress("glVertexAttribIPointer");
668 glVertexAttribPointer = (PFNGLVERTEXATTRIBPOINTERPROC)getProcAddress("glVertexAttribPointer");
669 glViewport = (PFNGLVIEWPORTPROC)getProcAddress("glViewport");
670 glWaitSync = (PFNGLWAITSYNCPROC)getProcAddress("glWaitSync");
671
672 return true;
673}
674
675#endif
Log implementation class.
Definition: LogManager.h:139
Provides a weakly referenced view over the contents of a string.
Definition: StringView.h:24
constexpr Log getLogger(const char(&name)[LEN]) noexcept
Definition: LogManager.h:180
constexpr size_t hash() noexcept
Simple getter function that returns the initial value for fnv1a hashing.
Definition: HashFunctions.h:62