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']: