Browse Source

GL: new nv-egl-incorrect-gl11-function-pointers workaround.

This one explicitly loads GL 1.0 and 1.0 function pointers on EGL
contexts on NVidia drivers (Linux headless boxes), because somehow the
usual statically linked functions don't behave correctly.
simd
Vladimír Vondruš 7 years ago
parent
commit
87e842934b
  1. 4
      doc/changelog.dox
  2. 8
      src/Magnum/GL/Implementation/driverSpecific.cpp
  3. 187
      src/MagnumExternal/OpenGL/GL/flextGL.cpp
  4. 18
      src/MagnumExternal/OpenGL/GL/flextGL.cpp.template
  5. 183
      src/MagnumExternal/OpenGL/GL/flextGL.h
  6. 9
      src/MagnumExternal/OpenGL/GL/flextGL.h.template
  7. 85
      src/MagnumExternal/OpenGL/GL/flextGLPlatform.cpp
  8. 30
      src/MagnumExternal/OpenGL/GL/flextGLPlatform.cpp.template

4
doc/changelog.dox

@ -102,6 +102,10 @@ See also:
@subsubsection changelog-latest-changes-gl GL library
. Added a @cpp "nv-egl-incorrect-gl11-function-pointers" @ce workaround that
explicitly loads OpenGL 1.0 and 1.1 function pointers on contexts created
using EGL on NVidia drivers, because there functions such as
@fn_gl{GetString()} behave incorrectly when linked statically.
- New @ref GL::Context::State::BindScratchVao state to make external OpenGL
code that's not VAO-aware working on core GL profiles (which don't allow
default VAOs being used for drawing)

8
src/Magnum/GL/Implementation/driverSpecific.cpp

@ -91,6 +91,14 @@ namespace {
/* NVidia drivers return 0 when asked for GL_CONTEXT_PROFILE_MASK,
so it needs to be worked around by asking for GL_ARB_compatibility */
"nv-zero-context-profile-mask",
/* (Headless) EGL contexts for desktop GL on NVidia 384 and 390 drivers
don't have correct statically linked GL 1.0 and 1.1 functions (such
as glGetString()) and one has to retrieve them explicitly using
eglGetProcAddress(). Doesn't seem to happen on pre-384 and 396, but
it's not possible to get driver version through EGL, so enabling
this unconditionally on all EGL NV contexts. */
"nv-egl-incorrect-gl11-function-pointers",
#endif
#ifndef MAGNUM_TARGET_GLES

187
src/MagnumExternal/OpenGL/GL/flextGL.cpp vendored

@ -343,6 +343,193 @@ FLEXTGL_EXPORT void(APIENTRY *flextglStringMarkerGREMEDY)(GLsizei, const void *)
/* GL_KHR_blend_equation_advanced */
FLEXTGL_EXPORT void(APIENTRY *flextglBlendBarrierKHR)(void) = nullptr;
/* GL_VERSION_1_0 */
#undef glBlendFunc
#undef glClear
#undef glClearColor
#undef glClearDepth
#undef glClearStencil
#undef glColorMask
#undef glCullFace
#undef glDepthFunc
#undef glDepthMask
#undef glDepthRange
#undef glDisable
#undef glDrawBuffer
#undef glEnable
#undef glFinish
#undef glFlush
#undef glFrontFace
#undef glGetBooleanv
#undef glGetDoublev
#undef glGetError
#undef glGetFloatv
#undef glGetIntegerv
#undef glGetString
#undef glGetTexImage
#undef glGetTexLevelParameterfv
#undef glGetTexLevelParameteriv
#undef glGetTexParameterfv
#undef glGetTexParameteriv
#undef glHint
#undef glIsEnabled
#undef glLineWidth
#undef glLogicOp
#undef glPixelStoref
#undef glPixelStorei
#undef glPointSize
#undef glPolygonMode
#undef glReadBuffer
#undef glReadPixels
#undef glScissor
#undef glStencilFunc
#undef glStencilMask
#undef glStencilOp
#undef glTexImage1D
#undef glTexImage2D
#undef glTexParameterf
#undef glTexParameterfv
#undef glTexParameteri
#undef glTexParameteriv
#undef glViewport
GLAPI void APIENTRY glBlendFunc(GLenum, GLenum);
GLAPI void APIENTRY glClear(GLbitfield);
GLAPI void APIENTRY glClearColor(GLfloat, GLfloat, GLfloat, GLfloat);
GLAPI void APIENTRY glClearDepth(GLdouble);
GLAPI void APIENTRY glClearStencil(GLint);
GLAPI void APIENTRY glColorMask(GLboolean, GLboolean, GLboolean, GLboolean);
GLAPI void APIENTRY glCullFace(GLenum);
GLAPI void APIENTRY glDepthFunc(GLenum);
GLAPI void APIENTRY glDepthMask(GLboolean);
GLAPI void APIENTRY glDepthRange(GLdouble, GLdouble);
GLAPI void APIENTRY glDisable(GLenum);
GLAPI void APIENTRY glDrawBuffer(GLenum);
GLAPI void APIENTRY glEnable(GLenum);
GLAPI void APIENTRY glFinish(void);
GLAPI void APIENTRY glFlush(void);
GLAPI void APIENTRY glFrontFace(GLenum);
GLAPI void APIENTRY glGetBooleanv(GLenum, GLboolean *);
GLAPI void APIENTRY glGetDoublev(GLenum, GLdouble *);
GLAPI GLenum APIENTRY glGetError(void);
GLAPI void APIENTRY glGetFloatv(GLenum, GLfloat *);
GLAPI void APIENTRY glGetIntegerv(GLenum, GLint *);
GLAPI const GLubyte * APIENTRY glGetString(GLenum);
GLAPI void APIENTRY glGetTexImage(GLenum, GLint, GLenum, GLenum, void *);
GLAPI void APIENTRY glGetTexLevelParameterfv(GLenum, GLint, GLenum, GLfloat *);
GLAPI void APIENTRY glGetTexLevelParameteriv(GLenum, GLint, GLenum, GLint *);
GLAPI void APIENTRY glGetTexParameterfv(GLenum, GLenum, GLfloat *);
GLAPI void APIENTRY glGetTexParameteriv(GLenum, GLenum, GLint *);
GLAPI void APIENTRY glHint(GLenum, GLenum);
GLAPI GLboolean APIENTRY glIsEnabled(GLenum);
GLAPI void APIENTRY glLineWidth(GLfloat);
GLAPI void APIENTRY glLogicOp(GLenum);
GLAPI void APIENTRY glPixelStoref(GLenum, GLfloat);
GLAPI void APIENTRY glPixelStorei(GLenum, GLint);
GLAPI void APIENTRY glPointSize(GLfloat);
GLAPI void APIENTRY glPolygonMode(GLenum, GLenum);
GLAPI void APIENTRY glReadBuffer(GLenum);
GLAPI void APIENTRY glReadPixels(GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, void *);
GLAPI void APIENTRY glScissor(GLint, GLint, GLsizei, GLsizei);
GLAPI void APIENTRY glStencilFunc(GLenum, GLint, GLuint);
GLAPI void APIENTRY glStencilMask(GLuint);
GLAPI void APIENTRY glStencilOp(GLenum, GLenum, GLenum);
GLAPI void APIENTRY glTexImage1D(GLenum, GLint, GLint, GLsizei, GLint, GLenum, GLenum, const void *);
GLAPI void APIENTRY glTexImage2D(GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const void *);
GLAPI void APIENTRY glTexParameterf(GLenum, GLenum, GLfloat);
GLAPI void APIENTRY glTexParameterfv(GLenum, GLenum, const GLfloat *);
GLAPI void APIENTRY glTexParameteri(GLenum, GLenum, GLint);
GLAPI void APIENTRY glTexParameteriv(GLenum, GLenum, const GLint *);
GLAPI void APIENTRY glViewport(GLint, GLint, GLsizei, GLsizei);
FLEXTGL_EXPORT void(APIENTRY *flextglBlendFunc)(GLenum, GLenum) = glBlendFunc;
FLEXTGL_EXPORT void(APIENTRY *flextglClear)(GLbitfield) = glClear;
FLEXTGL_EXPORT void(APIENTRY *flextglClearColor)(GLfloat, GLfloat, GLfloat, GLfloat) = glClearColor;
FLEXTGL_EXPORT void(APIENTRY *flextglClearDepth)(GLdouble) = glClearDepth;
FLEXTGL_EXPORT void(APIENTRY *flextglClearStencil)(GLint) = glClearStencil;
FLEXTGL_EXPORT void(APIENTRY *flextglColorMask)(GLboolean, GLboolean, GLboolean, GLboolean) = glColorMask;
FLEXTGL_EXPORT void(APIENTRY *flextglCullFace)(GLenum) = glCullFace;
FLEXTGL_EXPORT void(APIENTRY *flextglDepthFunc)(GLenum) = glDepthFunc;
FLEXTGL_EXPORT void(APIENTRY *flextglDepthMask)(GLboolean) = glDepthMask;
FLEXTGL_EXPORT void(APIENTRY *flextglDepthRange)(GLdouble, GLdouble) = glDepthRange;
FLEXTGL_EXPORT void(APIENTRY *flextglDisable)(GLenum) = glDisable;
FLEXTGL_EXPORT void(APIENTRY *flextglDrawBuffer)(GLenum) = glDrawBuffer;
FLEXTGL_EXPORT void(APIENTRY *flextglEnable)(GLenum) = glEnable;
FLEXTGL_EXPORT void(APIENTRY *flextglFinish)(void) = glFinish;
FLEXTGL_EXPORT void(APIENTRY *flextglFlush)(void) = glFlush;
FLEXTGL_EXPORT void(APIENTRY *flextglFrontFace)(GLenum) = glFrontFace;
FLEXTGL_EXPORT void(APIENTRY *flextglGetBooleanv)(GLenum, GLboolean *) = glGetBooleanv;
FLEXTGL_EXPORT void(APIENTRY *flextglGetDoublev)(GLenum, GLdouble *) = glGetDoublev;
FLEXTGL_EXPORT GLenum(APIENTRY *flextglGetError)(void) = glGetError;
FLEXTGL_EXPORT void(APIENTRY *flextglGetFloatv)(GLenum, GLfloat *) = glGetFloatv;
FLEXTGL_EXPORT void(APIENTRY *flextglGetIntegerv)(GLenum, GLint *) = glGetIntegerv;
FLEXTGL_EXPORT const GLubyte *(APIENTRY *flextglGetString)(GLenum) = glGetString;
FLEXTGL_EXPORT void(APIENTRY *flextglGetTexImage)(GLenum, GLint, GLenum, GLenum, void *) = glGetTexImage;
FLEXTGL_EXPORT void(APIENTRY *flextglGetTexLevelParameterfv)(GLenum, GLint, GLenum, GLfloat *) = glGetTexLevelParameterfv;
FLEXTGL_EXPORT void(APIENTRY *flextglGetTexLevelParameteriv)(GLenum, GLint, GLenum, GLint *) = glGetTexLevelParameteriv;
FLEXTGL_EXPORT void(APIENTRY *flextglGetTexParameterfv)(GLenum, GLenum, GLfloat *) = glGetTexParameterfv;
FLEXTGL_EXPORT void(APIENTRY *flextglGetTexParameteriv)(GLenum, GLenum, GLint *) = glGetTexParameteriv;
FLEXTGL_EXPORT void(APIENTRY *flextglHint)(GLenum, GLenum) = glHint;
FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsEnabled)(GLenum) = glIsEnabled;
FLEXTGL_EXPORT void(APIENTRY *flextglLineWidth)(GLfloat) = glLineWidth;
FLEXTGL_EXPORT void(APIENTRY *flextglLogicOp)(GLenum) = glLogicOp;
FLEXTGL_EXPORT void(APIENTRY *flextglPixelStoref)(GLenum, GLfloat) = glPixelStoref;
FLEXTGL_EXPORT void(APIENTRY *flextglPixelStorei)(GLenum, GLint) = glPixelStorei;
FLEXTGL_EXPORT void(APIENTRY *flextglPointSize)(GLfloat) = glPointSize;
FLEXTGL_EXPORT void(APIENTRY *flextglPolygonMode)(GLenum, GLenum) = glPolygonMode;
FLEXTGL_EXPORT void(APIENTRY *flextglReadBuffer)(GLenum) = glReadBuffer;
FLEXTGL_EXPORT void(APIENTRY *flextglReadPixels)(GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, void *) = glReadPixels;
FLEXTGL_EXPORT void(APIENTRY *flextglScissor)(GLint, GLint, GLsizei, GLsizei) = glScissor;
FLEXTGL_EXPORT void(APIENTRY *flextglStencilFunc)(GLenum, GLint, GLuint) = glStencilFunc;
FLEXTGL_EXPORT void(APIENTRY *flextglStencilMask)(GLuint) = glStencilMask;
FLEXTGL_EXPORT void(APIENTRY *flextglStencilOp)(GLenum, GLenum, GLenum) = glStencilOp;
FLEXTGL_EXPORT void(APIENTRY *flextglTexImage1D)(GLenum, GLint, GLint, GLsizei, GLint, GLenum, GLenum, const void *) = glTexImage1D;
FLEXTGL_EXPORT void(APIENTRY *flextglTexImage2D)(GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const void *) = glTexImage2D;
FLEXTGL_EXPORT void(APIENTRY *flextglTexParameterf)(GLenum, GLenum, GLfloat) = glTexParameterf;
FLEXTGL_EXPORT void(APIENTRY *flextglTexParameterfv)(GLenum, GLenum, const GLfloat *) = glTexParameterfv;
FLEXTGL_EXPORT void(APIENTRY *flextglTexParameteri)(GLenum, GLenum, GLint) = glTexParameteri;
FLEXTGL_EXPORT void(APIENTRY *flextglTexParameteriv)(GLenum, GLenum, const GLint *) = glTexParameteriv;
FLEXTGL_EXPORT void(APIENTRY *flextglViewport)(GLint, GLint, GLsizei, GLsizei) = glViewport;
/* GL_VERSION_1_1 */
#undef glBindTexture
#undef glCopyTexImage1D
#undef glCopyTexImage2D
#undef glCopyTexSubImage1D
#undef glCopyTexSubImage2D
#undef glDeleteTextures
#undef glDrawArrays
#undef glDrawElements
#undef glGenTextures
#undef glIsTexture
#undef glPolygonOffset
#undef glTexSubImage1D
#undef glTexSubImage2D
GLAPI void APIENTRY glBindTexture(GLenum, GLuint);
GLAPI void APIENTRY glCopyTexImage1D(GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint);
GLAPI void APIENTRY glCopyTexImage2D(GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint);
GLAPI void APIENTRY glCopyTexSubImage1D(GLenum, GLint, GLint, GLint, GLint, GLsizei);
GLAPI void APIENTRY glCopyTexSubImage2D(GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei);
GLAPI void APIENTRY glDeleteTextures(GLsizei, const GLuint *);
GLAPI void APIENTRY glDrawArrays(GLenum, GLint, GLsizei);
GLAPI void APIENTRY glDrawElements(GLenum, GLsizei, GLenum, const void *);
GLAPI void APIENTRY glGenTextures(GLsizei, GLuint *);
GLAPI GLboolean APIENTRY glIsTexture(GLuint);
GLAPI void APIENTRY glPolygonOffset(GLfloat, GLfloat);
GLAPI void APIENTRY glTexSubImage1D(GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const void *);
GLAPI void APIENTRY glTexSubImage2D(GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const void *);
FLEXTGL_EXPORT void(APIENTRY *flextglBindTexture)(GLenum, GLuint) = glBindTexture;
FLEXTGL_EXPORT void(APIENTRY *flextglCopyTexImage1D)(GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint) = glCopyTexImage1D;
FLEXTGL_EXPORT void(APIENTRY *flextglCopyTexImage2D)(GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint) = glCopyTexImage2D;
FLEXTGL_EXPORT void(APIENTRY *flextglCopyTexSubImage1D)(GLenum, GLint, GLint, GLint, GLint, GLsizei) = glCopyTexSubImage1D;
FLEXTGL_EXPORT void(APIENTRY *flextglCopyTexSubImage2D)(GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei) = glCopyTexSubImage2D;
FLEXTGL_EXPORT void(APIENTRY *flextglDeleteTextures)(GLsizei, const GLuint *) = glDeleteTextures;
FLEXTGL_EXPORT void(APIENTRY *flextglDrawArrays)(GLenum, GLint, GLsizei) = glDrawArrays;
FLEXTGL_EXPORT void(APIENTRY *flextglDrawElements)(GLenum, GLsizei, GLenum, const void *) = glDrawElements;
FLEXTGL_EXPORT void(APIENTRY *flextglGenTextures)(GLsizei, GLuint *) = glGenTextures;
FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsTexture)(GLuint) = glIsTexture;
FLEXTGL_EXPORT void(APIENTRY *flextglPolygonOffset)(GLfloat, GLfloat) = glPolygonOffset;
FLEXTGL_EXPORT void(APIENTRY *flextglTexSubImage1D)(GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const void *) = glTexSubImage1D;
FLEXTGL_EXPORT void(APIENTRY *flextglTexSubImage2D)(GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const void *) = glTexSubImage2D;
/* GL_VERSION_1_2 */
FLEXTGL_EXPORT void(APIENTRY *flextglCopyTexSubImage3D)(GLenum, GLint, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei) = nullptr;
FLEXTGL_EXPORT void(APIENTRY *flextglDrawRangeElements)(GLenum, GLuint, GLuint, GLsizei, GLenum, const void *) = nullptr;

18
src/MagnumExternal/OpenGL/GL/flextGL.cpp.template vendored

@ -30,7 +30,22 @@
extern "C" {
#endif
@for category,funcs in functions:
@if len(funcs) > 0 and category not in ['VERSION_1_0', 'VERSION_1_1']:
@if len(funcs) > 0:
@if category in ['VERSION_1_0', 'VERSION_1_1']:
/* GL_@category */
@for f in funcs:
#undef gl@f.name
@end
@for f in funcs:
GLAPI @f.returntype APIENTRY gl@f.name\
(@f.param_type_list_string());
@end
@for f in funcs:
FLEXTGL_EXPORT @f.returntype\
(APIENTRY *flextgl@f.name)(@f.param_type_list_string()) = gl@f.name;
@end
@else:
/* GL_@category */
@for f in funcs:
@ -39,6 +54,7 @@ FLEXTGL_EXPORT @f.returntype\
@end
@end
@end
@end
#ifdef __cplusplus
}

183
src/MagnumExternal/OpenGL/GL/flextGL.h vendored

@ -2375,70 +2375,131 @@ GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBlendBarrierKHR)(void);
/* GL_VERSION_1_0 */
GLAPI FLEXTGL_EXPORT void APIENTRY glBlendFunc(GLenum, GLenum);
GLAPI FLEXTGL_EXPORT void APIENTRY glClear(GLbitfield);
GLAPI FLEXTGL_EXPORT void APIENTRY glClearColor(GLfloat, GLfloat, GLfloat, GLfloat);
GLAPI FLEXTGL_EXPORT void APIENTRY glClearDepth(GLdouble);
GLAPI FLEXTGL_EXPORT void APIENTRY glClearStencil(GLint);
GLAPI FLEXTGL_EXPORT void APIENTRY glColorMask(GLboolean, GLboolean, GLboolean, GLboolean);
GLAPI FLEXTGL_EXPORT void APIENTRY glCullFace(GLenum);
GLAPI FLEXTGL_EXPORT void APIENTRY glDepthFunc(GLenum);
GLAPI FLEXTGL_EXPORT void APIENTRY glDepthMask(GLboolean);
GLAPI FLEXTGL_EXPORT void APIENTRY glDepthRange(GLdouble, GLdouble);
GLAPI FLEXTGL_EXPORT void APIENTRY glDisable(GLenum);
GLAPI FLEXTGL_EXPORT void APIENTRY glDrawBuffer(GLenum);
GLAPI FLEXTGL_EXPORT void APIENTRY glEnable(GLenum);
GLAPI FLEXTGL_EXPORT void APIENTRY glFinish(void);
GLAPI FLEXTGL_EXPORT void APIENTRY glFlush(void);
GLAPI FLEXTGL_EXPORT void APIENTRY glFrontFace(GLenum);
GLAPI FLEXTGL_EXPORT void APIENTRY glGetBooleanv(GLenum, GLboolean *);
GLAPI FLEXTGL_EXPORT void APIENTRY glGetDoublev(GLenum, GLdouble *);
GLAPI FLEXTGL_EXPORT GLenum APIENTRY glGetError(void);
GLAPI FLEXTGL_EXPORT void APIENTRY glGetFloatv(GLenum, GLfloat *);
GLAPI FLEXTGL_EXPORT void APIENTRY glGetIntegerv(GLenum, GLint *);
GLAPI FLEXTGL_EXPORT const GLubyte * APIENTRY glGetString(GLenum);
GLAPI FLEXTGL_EXPORT void APIENTRY glGetTexImage(GLenum, GLint, GLenum, GLenum, void *);
GLAPI FLEXTGL_EXPORT void APIENTRY glGetTexLevelParameterfv(GLenum, GLint, GLenum, GLfloat *);
GLAPI FLEXTGL_EXPORT void APIENTRY glGetTexLevelParameteriv(GLenum, GLint, GLenum, GLint *);
GLAPI FLEXTGL_EXPORT void APIENTRY glGetTexParameterfv(GLenum, GLenum, GLfloat *);
GLAPI FLEXTGL_EXPORT void APIENTRY glGetTexParameteriv(GLenum, GLenum, GLint *);
GLAPI FLEXTGL_EXPORT void APIENTRY glHint(GLenum, GLenum);
GLAPI FLEXTGL_EXPORT GLboolean APIENTRY glIsEnabled(GLenum);
GLAPI FLEXTGL_EXPORT void APIENTRY glLineWidth(GLfloat);
GLAPI FLEXTGL_EXPORT void APIENTRY glLogicOp(GLenum);
GLAPI FLEXTGL_EXPORT void APIENTRY glPixelStoref(GLenum, GLfloat);
GLAPI FLEXTGL_EXPORT void APIENTRY glPixelStorei(GLenum, GLint);
GLAPI FLEXTGL_EXPORT void APIENTRY glPointSize(GLfloat);
GLAPI FLEXTGL_EXPORT void APIENTRY glPolygonMode(GLenum, GLenum);
GLAPI FLEXTGL_EXPORT void APIENTRY glReadBuffer(GLenum);
GLAPI FLEXTGL_EXPORT void APIENTRY glReadPixels(GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, void *);
GLAPI FLEXTGL_EXPORT void APIENTRY glScissor(GLint, GLint, GLsizei, GLsizei);
GLAPI FLEXTGL_EXPORT void APIENTRY glStencilFunc(GLenum, GLint, GLuint);
GLAPI FLEXTGL_EXPORT void APIENTRY glStencilMask(GLuint);
GLAPI FLEXTGL_EXPORT void APIENTRY glStencilOp(GLenum, GLenum, GLenum);
GLAPI FLEXTGL_EXPORT void APIENTRY glTexImage1D(GLenum, GLint, GLint, GLsizei, GLint, GLenum, GLenum, const void *);
GLAPI FLEXTGL_EXPORT void APIENTRY glTexImage2D(GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const void *);
GLAPI FLEXTGL_EXPORT void APIENTRY glTexParameterf(GLenum, GLenum, GLfloat);
GLAPI FLEXTGL_EXPORT void APIENTRY glTexParameterfv(GLenum, GLenum, const GLfloat *);
GLAPI FLEXTGL_EXPORT void APIENTRY glTexParameteri(GLenum, GLenum, GLint);
GLAPI FLEXTGL_EXPORT void APIENTRY glTexParameteriv(GLenum, GLenum, const GLint *);
GLAPI FLEXTGL_EXPORT void APIENTRY glViewport(GLint, GLint, GLsizei, GLsizei);
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBlendFunc)(GLenum, GLenum);
#define glBlendFunc flextglBlendFunc
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglClear)(GLbitfield);
#define glClear flextglClear
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglClearColor)(GLfloat, GLfloat, GLfloat, GLfloat);
#define glClearColor flextglClearColor
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglClearDepth)(GLdouble);
#define glClearDepth flextglClearDepth
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglClearStencil)(GLint);
#define glClearStencil flextglClearStencil
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglColorMask)(GLboolean, GLboolean, GLboolean, GLboolean);
#define glColorMask flextglColorMask
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglCullFace)(GLenum);
#define glCullFace flextglCullFace
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDepthFunc)(GLenum);
#define glDepthFunc flextglDepthFunc
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDepthMask)(GLboolean);
#define glDepthMask flextglDepthMask
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDepthRange)(GLdouble, GLdouble);
#define glDepthRange flextglDepthRange
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDisable)(GLenum);
#define glDisable flextglDisable
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDrawBuffer)(GLenum);
#define glDrawBuffer flextglDrawBuffer
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglEnable)(GLenum);
#define glEnable flextglEnable
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglFinish)(void);
#define glFinish flextglFinish
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglFlush)(void);
#define glFlush flextglFlush
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglFrontFace)(GLenum);
#define glFrontFace flextglFrontFace
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetBooleanv)(GLenum, GLboolean *);
#define glGetBooleanv flextglGetBooleanv
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetDoublev)(GLenum, GLdouble *);
#define glGetDoublev flextglGetDoublev
GLAPI FLEXTGL_EXPORT GLenum(APIENTRY *flextglGetError)(void);
#define glGetError flextglGetError
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetFloatv)(GLenum, GLfloat *);
#define glGetFloatv flextglGetFloatv
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetIntegerv)(GLenum, GLint *);
#define glGetIntegerv flextglGetIntegerv
GLAPI FLEXTGL_EXPORT const GLubyte *(APIENTRY *flextglGetString)(GLenum);
#define glGetString flextglGetString
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetTexImage)(GLenum, GLint, GLenum, GLenum, void *);
#define glGetTexImage flextglGetTexImage
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetTexLevelParameterfv)(GLenum, GLint, GLenum, GLfloat *);
#define glGetTexLevelParameterfv flextglGetTexLevelParameterfv
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetTexLevelParameteriv)(GLenum, GLint, GLenum, GLint *);
#define glGetTexLevelParameteriv flextglGetTexLevelParameteriv
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetTexParameterfv)(GLenum, GLenum, GLfloat *);
#define glGetTexParameterfv flextglGetTexParameterfv
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGetTexParameteriv)(GLenum, GLenum, GLint *);
#define glGetTexParameteriv flextglGetTexParameteriv
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglHint)(GLenum, GLenum);
#define glHint flextglHint
GLAPI FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsEnabled)(GLenum);
#define glIsEnabled flextglIsEnabled
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglLineWidth)(GLfloat);
#define glLineWidth flextglLineWidth
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglLogicOp)(GLenum);
#define glLogicOp flextglLogicOp
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglPixelStoref)(GLenum, GLfloat);
#define glPixelStoref flextglPixelStoref
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglPixelStorei)(GLenum, GLint);
#define glPixelStorei flextglPixelStorei
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglPointSize)(GLfloat);
#define glPointSize flextglPointSize
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglPolygonMode)(GLenum, GLenum);
#define glPolygonMode flextglPolygonMode
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglReadBuffer)(GLenum);
#define glReadBuffer flextglReadBuffer
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglReadPixels)(GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, void *);
#define glReadPixels flextglReadPixels
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglScissor)(GLint, GLint, GLsizei, GLsizei);
#define glScissor flextglScissor
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglStencilFunc)(GLenum, GLint, GLuint);
#define glStencilFunc flextglStencilFunc
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglStencilMask)(GLuint);
#define glStencilMask flextglStencilMask
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglStencilOp)(GLenum, GLenum, GLenum);
#define glStencilOp flextglStencilOp
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTexImage1D)(GLenum, GLint, GLint, GLsizei, GLint, GLenum, GLenum, const void *);
#define glTexImage1D flextglTexImage1D
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTexImage2D)(GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const void *);
#define glTexImage2D flextglTexImage2D
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTexParameterf)(GLenum, GLenum, GLfloat);
#define glTexParameterf flextglTexParameterf
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTexParameterfv)(GLenum, GLenum, const GLfloat *);
#define glTexParameterfv flextglTexParameterfv
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTexParameteri)(GLenum, GLenum, GLint);
#define glTexParameteri flextglTexParameteri
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTexParameteriv)(GLenum, GLenum, const GLint *);
#define glTexParameteriv flextglTexParameteriv
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglViewport)(GLint, GLint, GLsizei, GLsizei);
#define glViewport flextglViewport
/* GL_VERSION_1_1 */
GLAPI FLEXTGL_EXPORT void APIENTRY glBindTexture(GLenum, GLuint);
GLAPI FLEXTGL_EXPORT void APIENTRY glCopyTexImage1D(GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint);
GLAPI FLEXTGL_EXPORT void APIENTRY glCopyTexImage2D(GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint);
GLAPI FLEXTGL_EXPORT void APIENTRY glCopyTexSubImage1D(GLenum, GLint, GLint, GLint, GLint, GLsizei);
GLAPI FLEXTGL_EXPORT void APIENTRY glCopyTexSubImage2D(GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei);
GLAPI FLEXTGL_EXPORT void APIENTRY glDeleteTextures(GLsizei, const GLuint *);
GLAPI FLEXTGL_EXPORT void APIENTRY glDrawArrays(GLenum, GLint, GLsizei);
GLAPI FLEXTGL_EXPORT void APIENTRY glDrawElements(GLenum, GLsizei, GLenum, const void *);
GLAPI FLEXTGL_EXPORT void APIENTRY glGenTextures(GLsizei, GLuint *);
GLAPI FLEXTGL_EXPORT GLboolean APIENTRY glIsTexture(GLuint);
GLAPI FLEXTGL_EXPORT void APIENTRY glPolygonOffset(GLfloat, GLfloat);
GLAPI FLEXTGL_EXPORT void APIENTRY glTexSubImage1D(GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const void *);
GLAPI FLEXTGL_EXPORT void APIENTRY glTexSubImage2D(GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const void *);
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglBindTexture)(GLenum, GLuint);
#define glBindTexture flextglBindTexture
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglCopyTexImage1D)(GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint);
#define glCopyTexImage1D flextglCopyTexImage1D
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglCopyTexImage2D)(GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint);
#define glCopyTexImage2D flextglCopyTexImage2D
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglCopyTexSubImage1D)(GLenum, GLint, GLint, GLint, GLint, GLsizei);
#define glCopyTexSubImage1D flextglCopyTexSubImage1D
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglCopyTexSubImage2D)(GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei);
#define glCopyTexSubImage2D flextglCopyTexSubImage2D
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDeleteTextures)(GLsizei, const GLuint *);
#define glDeleteTextures flextglDeleteTextures
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDrawArrays)(GLenum, GLint, GLsizei);
#define glDrawArrays flextglDrawArrays
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglDrawElements)(GLenum, GLsizei, GLenum, const void *);
#define glDrawElements flextglDrawElements
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglGenTextures)(GLsizei, GLuint *);
#define glGenTextures flextglGenTextures
GLAPI FLEXTGL_EXPORT GLboolean(APIENTRY *flextglIsTexture)(GLuint);
#define glIsTexture flextglIsTexture
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglPolygonOffset)(GLfloat, GLfloat);
#define glPolygonOffset flextglPolygonOffset
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTexSubImage1D)(GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const void *);
#define glTexSubImage1D flextglTexSubImage1D
GLAPI FLEXTGL_EXPORT void(APIENTRY *flextglTexSubImage2D)(GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const void *);
#define glTexSubImage2D flextglTexSubImage2D
/* GL_VERSION_1_2 */

9
src/MagnumExternal/OpenGL/GL/flextGL.h.template vendored

@ -108,17 +108,10 @@ void flextGLInit(Magnum::GL::Context& context);
/* GL_@cat */
@if cat in ['VERSION_1_0', 'VERSION_1_1']:
@for f in funcs:
GLAPI FLEXTGL_EXPORT @f.returntype APIENTRY gl@f.name\
(@f.param_type_list_string());
@end
@else:
@for f in funcs:
@for f in funcs:
GLAPI FLEXTGL_EXPORT @f.returntype\
(APIENTRY *flextgl@f.name)(@f.param_type_list_string());
#define gl@f.name flextgl@f.name
@end
@end
@end
@end

85
src/MagnumExternal/OpenGL/GL/flextGLPlatform.cpp vendored

@ -30,9 +30,94 @@
#include "Magnum/Platform/Implementation/OpenGLFunctionLoader.h"
#ifdef MAGNUM_PLATFORM_USE_EGL
#include <cstring>
#include <EGL/egl.h>
#include "Magnum/GL/Context.h"
#endif
void flextGLInit(Magnum::GL::Context& context) {
Magnum::Platform::Implementation::OpenGLFunctionLoader loader;
#ifdef MAGNUM_PLATFORM_USE_EGL
{
/* EGL contexts on NVidia 390 drivers don't have correct statically
linked GL 1.0 and 1.1 functions (such as glGetString()) and one has
to retrieve them explicitly using eglGetProcAddress(). */
EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
const char* vendor = eglQueryString(display, EGL_VENDOR);
if(std::strcmp(vendor, "NVIDIA") == 0 && !context.isDriverWorkaroundDisabled("nv-egl-incorrect-gl11-function-pointers")) {
/* GL_VERSION_1_0 */
flextglBlendFunc = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum)>(loader.load("glBlendFunc"));
flextglClear = reinterpret_cast<void(APIENTRY*)(GLbitfield)>(loader.load("glClear"));
flextglClearColor = reinterpret_cast<void(APIENTRY*)(GLfloat, GLfloat, GLfloat, GLfloat)>(loader.load("glClearColor"));
flextglClearDepth = reinterpret_cast<void(APIENTRY*)(GLdouble)>(loader.load("glClearDepth"));
flextglClearStencil = reinterpret_cast<void(APIENTRY*)(GLint)>(loader.load("glClearStencil"));
flextglColorMask = reinterpret_cast<void(APIENTRY*)(GLboolean, GLboolean, GLboolean, GLboolean)>(loader.load("glColorMask"));
flextglCullFace = reinterpret_cast<void(APIENTRY*)(GLenum)>(loader.load("glCullFace"));
flextglDepthFunc = reinterpret_cast<void(APIENTRY*)(GLenum)>(loader.load("glDepthFunc"));
flextglDepthMask = reinterpret_cast<void(APIENTRY*)(GLboolean)>(loader.load("glDepthMask"));
flextglDepthRange = reinterpret_cast<void(APIENTRY*)(GLdouble, GLdouble)>(loader.load("glDepthRange"));
flextglDisable = reinterpret_cast<void(APIENTRY*)(GLenum)>(loader.load("glDisable"));
flextglDrawBuffer = reinterpret_cast<void(APIENTRY*)(GLenum)>(loader.load("glDrawBuffer"));
flextglEnable = reinterpret_cast<void(APIENTRY*)(GLenum)>(loader.load("glEnable"));
flextglFinish = reinterpret_cast<void(APIENTRY*)(void)>(loader.load("glFinish"));
flextglFlush = reinterpret_cast<void(APIENTRY*)(void)>(loader.load("glFlush"));
flextglFrontFace = reinterpret_cast<void(APIENTRY*)(GLenum)>(loader.load("glFrontFace"));
flextglGetBooleanv = reinterpret_cast<void(APIENTRY*)(GLenum, GLboolean *)>(loader.load("glGetBooleanv"));
flextglGetDoublev = reinterpret_cast<void(APIENTRY*)(GLenum, GLdouble *)>(loader.load("glGetDoublev"));
flextglGetError = reinterpret_cast<GLenum(APIENTRY*)(void)>(loader.load("glGetError"));
flextglGetFloatv = reinterpret_cast<void(APIENTRY*)(GLenum, GLfloat *)>(loader.load("glGetFloatv"));
flextglGetIntegerv = reinterpret_cast<void(APIENTRY*)(GLenum, GLint *)>(loader.load("glGetIntegerv"));
flextglGetString = reinterpret_cast<const GLubyte *(APIENTRY*)(GLenum)>(loader.load("glGetString"));
flextglGetTexImage = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, GLenum, GLenum, void *)>(loader.load("glGetTexImage"));
flextglGetTexLevelParameterfv = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, GLenum, GLfloat *)>(loader.load("glGetTexLevelParameterfv"));
flextglGetTexLevelParameteriv = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, GLenum, GLint *)>(loader.load("glGetTexLevelParameteriv"));
flextglGetTexParameterfv = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLfloat *)>(loader.load("glGetTexParameterfv"));
flextglGetTexParameteriv = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint *)>(loader.load("glGetTexParameteriv"));
flextglHint = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum)>(loader.load("glHint"));
flextglIsEnabled = reinterpret_cast<GLboolean(APIENTRY*)(GLenum)>(loader.load("glIsEnabled"));
flextglLineWidth = reinterpret_cast<void(APIENTRY*)(GLfloat)>(loader.load("glLineWidth"));
flextglLogicOp = reinterpret_cast<void(APIENTRY*)(GLenum)>(loader.load("glLogicOp"));
flextglPixelStoref = reinterpret_cast<void(APIENTRY*)(GLenum, GLfloat)>(loader.load("glPixelStoref"));
flextglPixelStorei = reinterpret_cast<void(APIENTRY*)(GLenum, GLint)>(loader.load("glPixelStorei"));
flextglPointSize = reinterpret_cast<void(APIENTRY*)(GLfloat)>(loader.load("glPointSize"));
flextglPolygonMode = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum)>(loader.load("glPolygonMode"));
flextglReadBuffer = reinterpret_cast<void(APIENTRY*)(GLenum)>(loader.load("glReadBuffer"));
flextglReadPixels = reinterpret_cast<void(APIENTRY*)(GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, void *)>(loader.load("glReadPixels"));
flextglScissor = reinterpret_cast<void(APIENTRY*)(GLint, GLint, GLsizei, GLsizei)>(loader.load("glScissor"));
flextglStencilFunc = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, GLuint)>(loader.load("glStencilFunc"));
flextglStencilMask = reinterpret_cast<void(APIENTRY*)(GLuint)>(loader.load("glStencilMask"));
flextglStencilOp = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLenum)>(loader.load("glStencilOp"));
flextglTexImage1D = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, GLint, GLsizei, GLint, GLenum, GLenum, const void *)>(loader.load("glTexImage1D"));
flextglTexImage2D = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, GLint, GLsizei, GLsizei, GLint, GLenum, GLenum, const void *)>(loader.load("glTexImage2D"));
flextglTexParameterf = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLfloat)>(loader.load("glTexParameterf"));
flextglTexParameterfv = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, const GLfloat *)>(loader.load("glTexParameterfv"));
flextglTexParameteri = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, GLint)>(loader.load("glTexParameteri"));
flextglTexParameteriv = reinterpret_cast<void(APIENTRY*)(GLenum, GLenum, const GLint *)>(loader.load("glTexParameteriv"));
flextglViewport = reinterpret_cast<void(APIENTRY*)(GLint, GLint, GLsizei, GLsizei)>(loader.load("glViewport"));
/* GL_VERSION_1_1 */
flextglBindTexture = reinterpret_cast<void(APIENTRY*)(GLenum, GLuint)>(loader.load("glBindTexture"));
flextglCopyTexImage1D = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLint)>(loader.load("glCopyTexImage1D"));
flextglCopyTexImage2D = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, GLenum, GLint, GLint, GLsizei, GLsizei, GLint)>(loader.load("glCopyTexImage2D"));
flextglCopyTexSubImage1D = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, GLint, GLint, GLint, GLsizei)>(loader.load("glCopyTexSubImage1D"));
flextglCopyTexSubImage2D = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, GLint, GLint, GLint, GLint, GLsizei, GLsizei)>(loader.load("glCopyTexSubImage2D"));
flextglDeleteTextures = reinterpret_cast<void(APIENTRY*)(GLsizei, const GLuint *)>(loader.load("glDeleteTextures"));
flextglDrawArrays = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, GLsizei)>(loader.load("glDrawArrays"));
flextglDrawElements = reinterpret_cast<void(APIENTRY*)(GLenum, GLsizei, GLenum, const void *)>(loader.load("glDrawElements"));
flextglGenTextures = reinterpret_cast<void(APIENTRY*)(GLsizei, GLuint *)>(loader.load("glGenTextures"));
flextglIsTexture = reinterpret_cast<GLboolean(APIENTRY*)(GLuint)>(loader.load("glIsTexture"));
flextglPolygonOffset = reinterpret_cast<void(APIENTRY*)(GLfloat, GLfloat)>(loader.load("glPolygonOffset"));
flextglTexSubImage1D = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, GLint, GLsizei, GLenum, GLenum, const void *)>(loader.load("glTexSubImage1D"));
flextglTexSubImage2D = reinterpret_cast<void(APIENTRY*)(GLenum, GLint, GLint, GLint, GLsizei, GLsizei, GLenum, GLenum, const void *)>(loader.load("glTexSubImage2D"));
}
}
#else
static_cast<void>(context);
#endif
/* GL_ARB_ES3_2_compatibility */
flextglPrimitiveBoundingBoxARB = reinterpret_cast<void(APIENTRY*)(GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat, GLfloat)>(loader.load("glPrimitiveBoundingBoxARB"));

30
src/MagnumExternal/OpenGL/GL/flextGLPlatform.cpp.template vendored

@ -31,8 +31,38 @@
#include "Magnum/Platform/Implementation/OpenGLFunctionLoader.h"
#ifdef MAGNUM_PLATFORM_USE_EGL
#include <cstring>
#include <EGL/egl.h>
#include "Magnum/GL/Context.h"
#endif
void flextGLInit(Magnum::GL::Context& context) {
Magnum::Platform::Implementation::OpenGLFunctionLoader loader;
#ifdef MAGNUM_PLATFORM_USE_EGL
{
/* EGL contexts on NVidia 390 drivers don't have correct statically
linked GL 1.0 and 1.1 functions (such as glGetString()) and one has
to retrieve them explicitly using eglGetProcAddress(). */
EGLDisplay display = eglGetDisplay(EGL_DEFAULT_DISPLAY);
const char* vendor = eglQueryString(display, EGL_VENDOR);
if(std::strcmp(vendor, "NVIDIA") == 0 && !context.isDriverWorkaroundDisabled("nv-egl-incorrect-gl11-function-pointers")) {
@for category,funcs in functions:
@if funcs and category in ['VERSION_1_0', 'VERSION_1_1']:
/* GL_@category */
@for f in funcs:
flextgl@f.name = reinterpret_cast<@f.returntype\
(APIENTRY*)(@f.param_type_list_string())>(loader.load("gl@f.name"));
@end
@end
@end
}
}
#else
static_cast<void>(context);
#endif
@for category,funcs in functions:
@if funcs and category not in ['VERSION_1_0', 'VERSION_1_1']:

Loading…
Cancel
Save