From 87e842934b6228ebff5fea50c03c22ab2df13e27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Thu, 17 Jan 2019 19:22:02 +0100 Subject: [PATCH] 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. --- doc/changelog.dox | 4 + .../GL/Implementation/driverSpecific.cpp | 8 + src/MagnumExternal/OpenGL/GL/flextGL.cpp | 187 ++++++++++++++++++ .../OpenGL/GL/flextGL.cpp.template | 18 +- src/MagnumExternal/OpenGL/GL/flextGL.h | 183 +++++++++++------ .../OpenGL/GL/flextGL.h.template | 9 +- .../OpenGL/GL/flextGLPlatform.cpp | 85 ++++++++ .../OpenGL/GL/flextGLPlatform.cpp.template | 30 +++ 8 files changed, 454 insertions(+), 70 deletions(-) diff --git a/doc/changelog.dox b/doc/changelog.dox index 61a2c8515..d474208d2 100644 --- a/doc/changelog.dox +++ b/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) diff --git a/src/Magnum/GL/Implementation/driverSpecific.cpp b/src/Magnum/GL/Implementation/driverSpecific.cpp index cdf26b3db..caf385f30 100644 --- a/src/Magnum/GL/Implementation/driverSpecific.cpp +++ b/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 diff --git a/src/MagnumExternal/OpenGL/GL/flextGL.cpp b/src/MagnumExternal/OpenGL/GL/flextGL.cpp index 8b359baaf..44ba9a4b2 100644 --- a/src/MagnumExternal/OpenGL/GL/flextGL.cpp +++ b/src/MagnumExternal/OpenGL/GL/flextGL.cpp @@ -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; diff --git a/src/MagnumExternal/OpenGL/GL/flextGL.cpp.template b/src/MagnumExternal/OpenGL/GL/flextGL.cpp.template index b07278c09..70ecad7f9 100644 --- a/src/MagnumExternal/OpenGL/GL/flextGL.cpp.template +++ b/src/MagnumExternal/OpenGL/GL/flextGL.cpp.template @@ -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 } diff --git a/src/MagnumExternal/OpenGL/GL/flextGL.h b/src/MagnumExternal/OpenGL/GL/flextGL.h index 95c6e3def..c23928c76 100644 --- a/src/MagnumExternal/OpenGL/GL/flextGL.h +++ b/src/MagnumExternal/OpenGL/GL/flextGL.h @@ -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 */ diff --git a/src/MagnumExternal/OpenGL/GL/flextGL.h.template b/src/MagnumExternal/OpenGL/GL/flextGL.h.template index 1e0714378..a9217af6c 100644 --- a/src/MagnumExternal/OpenGL/GL/flextGL.h.template +++ b/src/MagnumExternal/OpenGL/GL/flextGL.h.template @@ -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 diff --git a/src/MagnumExternal/OpenGL/GL/flextGLPlatform.cpp b/src/MagnumExternal/OpenGL/GL/flextGLPlatform.cpp index 51a3cfff8..9e8049bf5 100644 --- a/src/MagnumExternal/OpenGL/GL/flextGLPlatform.cpp +++ b/src/MagnumExternal/OpenGL/GL/flextGLPlatform.cpp @@ -30,9 +30,94 @@ #include "Magnum/Platform/Implementation/OpenGLFunctionLoader.h" +#ifdef MAGNUM_PLATFORM_USE_EGL +#include +#include +#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(loader.load("glBlendFunc")); + flextglClear = reinterpret_cast(loader.load("glClear")); + flextglClearColor = reinterpret_cast(loader.load("glClearColor")); + flextglClearDepth = reinterpret_cast(loader.load("glClearDepth")); + flextglClearStencil = reinterpret_cast(loader.load("glClearStencil")); + flextglColorMask = reinterpret_cast(loader.load("glColorMask")); + flextglCullFace = reinterpret_cast(loader.load("glCullFace")); + flextglDepthFunc = reinterpret_cast(loader.load("glDepthFunc")); + flextglDepthMask = reinterpret_cast(loader.load("glDepthMask")); + flextglDepthRange = reinterpret_cast(loader.load("glDepthRange")); + flextglDisable = reinterpret_cast(loader.load("glDisable")); + flextglDrawBuffer = reinterpret_cast(loader.load("glDrawBuffer")); + flextglEnable = reinterpret_cast(loader.load("glEnable")); + flextglFinish = reinterpret_cast(loader.load("glFinish")); + flextglFlush = reinterpret_cast(loader.load("glFlush")); + flextglFrontFace = reinterpret_cast(loader.load("glFrontFace")); + flextglGetBooleanv = reinterpret_cast(loader.load("glGetBooleanv")); + flextglGetDoublev = reinterpret_cast(loader.load("glGetDoublev")); + flextglGetError = reinterpret_cast(loader.load("glGetError")); + flextglGetFloatv = reinterpret_cast(loader.load("glGetFloatv")); + flextglGetIntegerv = reinterpret_cast(loader.load("glGetIntegerv")); + flextglGetString = reinterpret_cast(loader.load("glGetString")); + flextglGetTexImage = reinterpret_cast(loader.load("glGetTexImage")); + flextglGetTexLevelParameterfv = reinterpret_cast(loader.load("glGetTexLevelParameterfv")); + flextglGetTexLevelParameteriv = reinterpret_cast(loader.load("glGetTexLevelParameteriv")); + flextglGetTexParameterfv = reinterpret_cast(loader.load("glGetTexParameterfv")); + flextglGetTexParameteriv = reinterpret_cast(loader.load("glGetTexParameteriv")); + flextglHint = reinterpret_cast(loader.load("glHint")); + flextglIsEnabled = reinterpret_cast(loader.load("glIsEnabled")); + flextglLineWidth = reinterpret_cast(loader.load("glLineWidth")); + flextglLogicOp = reinterpret_cast(loader.load("glLogicOp")); + flextglPixelStoref = reinterpret_cast(loader.load("glPixelStoref")); + flextglPixelStorei = reinterpret_cast(loader.load("glPixelStorei")); + flextglPointSize = reinterpret_cast(loader.load("glPointSize")); + flextglPolygonMode = reinterpret_cast(loader.load("glPolygonMode")); + flextglReadBuffer = reinterpret_cast(loader.load("glReadBuffer")); + flextglReadPixels = reinterpret_cast(loader.load("glReadPixels")); + flextglScissor = reinterpret_cast(loader.load("glScissor")); + flextglStencilFunc = reinterpret_cast(loader.load("glStencilFunc")); + flextglStencilMask = reinterpret_cast(loader.load("glStencilMask")); + flextglStencilOp = reinterpret_cast(loader.load("glStencilOp")); + flextglTexImage1D = reinterpret_cast(loader.load("glTexImage1D")); + flextglTexImage2D = reinterpret_cast(loader.load("glTexImage2D")); + flextglTexParameterf = reinterpret_cast(loader.load("glTexParameterf")); + flextglTexParameterfv = reinterpret_cast(loader.load("glTexParameterfv")); + flextglTexParameteri = reinterpret_cast(loader.load("glTexParameteri")); + flextglTexParameteriv = reinterpret_cast(loader.load("glTexParameteriv")); + flextglViewport = reinterpret_cast(loader.load("glViewport")); + + /* GL_VERSION_1_1 */ + flextglBindTexture = reinterpret_cast(loader.load("glBindTexture")); + flextglCopyTexImage1D = reinterpret_cast(loader.load("glCopyTexImage1D")); + flextglCopyTexImage2D = reinterpret_cast(loader.load("glCopyTexImage2D")); + flextglCopyTexSubImage1D = reinterpret_cast(loader.load("glCopyTexSubImage1D")); + flextglCopyTexSubImage2D = reinterpret_cast(loader.load("glCopyTexSubImage2D")); + flextglDeleteTextures = reinterpret_cast(loader.load("glDeleteTextures")); + flextglDrawArrays = reinterpret_cast(loader.load("glDrawArrays")); + flextglDrawElements = reinterpret_cast(loader.load("glDrawElements")); + flextglGenTextures = reinterpret_cast(loader.load("glGenTextures")); + flextglIsTexture = reinterpret_cast(loader.load("glIsTexture")); + flextglPolygonOffset = reinterpret_cast(loader.load("glPolygonOffset")); + flextglTexSubImage1D = reinterpret_cast(loader.load("glTexSubImage1D")); + flextglTexSubImage2D = reinterpret_cast(loader.load("glTexSubImage2D")); + } + } + #else + static_cast(context); + #endif + /* GL_ARB_ES3_2_compatibility */ flextglPrimitiveBoundingBoxARB = reinterpret_cast(loader.load("glPrimitiveBoundingBoxARB")); diff --git a/src/MagnumExternal/OpenGL/GL/flextGLPlatform.cpp.template b/src/MagnumExternal/OpenGL/GL/flextGLPlatform.cpp.template index 833b79b9d..4a6d904cd 100644 --- a/src/MagnumExternal/OpenGL/GL/flextGLPlatform.cpp.template +++ b/src/MagnumExternal/OpenGL/GL/flextGLPlatform.cpp.template @@ -31,8 +31,38 @@ #include "Magnum/Platform/Implementation/OpenGLFunctionLoader.h" +#ifdef MAGNUM_PLATFORM_USE_EGL +#include +#include +#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(context); + #endif @for category,funcs in functions: @if funcs and category not in ['VERSION_1_0', 'VERSION_1_1']: