void AppManagerPrivate::initGl(bool checkRenderingReq) { // Private should not lock assert( !openGLFunctionsMutex.tryLock() ); hasInitializedOpenGLFunctions = true; bool glLoaded = gladLoadGL(); #ifdef GLAD_DEBUG if (glLoaded) { glad_set_pre_callback(pre_gl_call); glad_set_post_callback(post_gl_call); // disablepost_gl_call for glBegin and commands that are authorized between glBegin and glEnd // (because glGetError isn't authorized there) // see https://www.khronos.org/registry/OpenGL-Refpages/gl2.1/xhtml/glBegin.xml glad_debug_glBegin = glad_glBegin; glad_debug_glVertex2s = glad_glVertex2s; glad_debug_glVertex2i = glad_glVertex2i; glad_debug_glVertex2f = glad_glVertex2f; glad_debug_glVertex2d = glad_glVertex2d; glad_debug_glVertex3s = glad_glVertex3s; glad_debug_glVertex3i = glad_glVertex3i; glad_debug_glVertex3f = glad_glVertex3f; glad_debug_glVertex3d = glad_glVertex3d; glad_debug_glVertex4s = glad_glVertex4s; glad_debug_glVertex4i = glad_glVertex4i; glad_debug_glVertex4f = glad_glVertex4f; glad_debug_glVertex4d = glad_glVertex4d; glad_debug_glColor3b = glad_glColor3b; glad_debug_glColor3s = glad_glColor3s; glad_debug_glColor3i = glad_glColor3i; glad_debug_glColor3f = glad_glColor3f; glad_debug_glColor3d = glad_glColor3d; glad_debug_glColor3ub = glad_glColor3ub; glad_debug_glColor3us = glad_glColor3us; glad_debug_glColor3ui = glad_glColor3ui; glad_debug_glColor4b = glad_glColor4b; glad_debug_glColor4s = glad_glColor4s; glad_debug_glColor4i = glad_glColor4i; glad_debug_glColor4f = glad_glColor4f; glad_debug_glColor4d = glad_glColor4d; glad_debug_glColor4ub = glad_glColor4ub; glad_debug_glColor4us = glad_glColor4us; glad_debug_glColor4ui = glad_glColor4ui; glad_debug_glSecondaryColor3b = glad_glSecondaryColor3b; glad_debug_glSecondaryColor3s = glad_glSecondaryColor3s; glad_debug_glSecondaryColor3i = glad_glSecondaryColor3i; glad_debug_glSecondaryColor3f = glad_glSecondaryColor3f; glad_debug_glSecondaryColor3d = glad_glSecondaryColor3d; glad_debug_glSecondaryColor3ub = glad_glSecondaryColor3ub; glad_debug_glSecondaryColor3us = glad_glSecondaryColor3us; glad_debug_glSecondaryColor3ui = glad_glSecondaryColor3ui; glad_debug_glIndexs = glad_glIndexs; glad_debug_glIndexi = glad_glIndexi; glad_debug_glIndexf = glad_glIndexf; glad_debug_glIndexd = glad_glIndexd; glad_debug_glIndexub = glad_glIndexub; glad_debug_glNormal3b = glad_glNormal3b; glad_debug_glNormal3d = glad_glNormal3d; glad_debug_glNormal3f = glad_glNormal3f; glad_debug_glNormal3i = glad_glNormal3i; glad_debug_glNormal3s = glad_glNormal3s; glad_debug_glFogCoorddv = glad_glFogCoorddv; glad_debug_glFogCoordfv = glad_glFogCoordfv; glad_debug_glTexCoord1s = glad_glTexCoord1s; glad_debug_glTexCoord1i = glad_glTexCoord1i; glad_debug_glTexCoord1f = glad_glTexCoord1f; glad_debug_glTexCoord1d = glad_glTexCoord1d; glad_debug_glTexCoord2s = glad_glTexCoord2s; glad_debug_glTexCoord2i = glad_glTexCoord2i; glad_debug_glTexCoord2f = glad_glTexCoord2f; glad_debug_glTexCoord2d = glad_glTexCoord2d; glad_debug_glTexCoord3s = glad_glTexCoord3s; glad_debug_glTexCoord3i = glad_glTexCoord3i; glad_debug_glTexCoord3f = glad_glTexCoord3f; glad_debug_glTexCoord3d = glad_glTexCoord3d; glad_debug_glTexCoord4s = glad_glTexCoord4s; glad_debug_glTexCoord4i = glad_glTexCoord4i; glad_debug_glTexCoord4f = glad_glTexCoord4f; glad_debug_glTexCoord4d = glad_glTexCoord4d; glad_debug_glMultiTexCoord1s = glad_glMultiTexCoord1s; glad_debug_glMultiTexCoord1i = glad_glMultiTexCoord1i; glad_debug_glMultiTexCoord1f = glad_glMultiTexCoord1f; glad_debug_glMultiTexCoord1d = glad_glMultiTexCoord1d; glad_debug_glMultiTexCoord2s = glad_glMultiTexCoord2s; glad_debug_glMultiTexCoord2i = glad_glMultiTexCoord2i; glad_debug_glMultiTexCoord2f = glad_glMultiTexCoord2f; glad_debug_glMultiTexCoord2d = glad_glMultiTexCoord2d; glad_debug_glMultiTexCoord3s = glad_glMultiTexCoord3s; glad_debug_glMultiTexCoord3i = glad_glMultiTexCoord3i; glad_debug_glMultiTexCoord3f = glad_glMultiTexCoord3f; glad_debug_glMultiTexCoord3d = glad_glMultiTexCoord3d; glad_debug_glMultiTexCoord4s = glad_glMultiTexCoord4s; glad_debug_glMultiTexCoord4i = glad_glMultiTexCoord4i; glad_debug_glMultiTexCoord4f = glad_glMultiTexCoord4f; glad_debug_glMultiTexCoord4d = glad_glMultiTexCoord4d; glad_debug_glVertexAttrib1f = glad_glVertexAttrib1f; glad_debug_glVertexAttrib1s = glad_glVertexAttrib1s; glad_debug_glVertexAttrib1d = glad_glVertexAttrib1d; glad_debug_glVertexAttrib2f = glad_glVertexAttrib2f; glad_debug_glVertexAttrib2s = glad_glVertexAttrib2s; glad_debug_glVertexAttrib2d = glad_glVertexAttrib2d; glad_debug_glVertexAttrib3f = glad_glVertexAttrib3f; glad_debug_glVertexAttrib3s = glad_glVertexAttrib3s; glad_debug_glVertexAttrib3d = glad_glVertexAttrib3d; glad_debug_glVertexAttrib4f = glad_glVertexAttrib4f; glad_debug_glVertexAttrib4s = glad_glVertexAttrib4s; glad_debug_glVertexAttrib4d = glad_glVertexAttrib4d; glad_debug_glVertexAttrib4Nub = glad_glVertexAttrib4Nub; glad_debug_glEvalCoord1f = glad_glEvalCoord1f; glad_debug_glEvalCoord1d = glad_glEvalCoord1d; glad_debug_glEvalCoord2f = glad_glEvalCoord2f; glad_debug_glEvalCoord2d = glad_glEvalCoord2d; glad_debug_glEvalPoint1 = glad_glEvalPoint1; glad_debug_glEvalPoint2 = glad_glEvalPoint2; glad_debug_glArrayElement = glad_glArrayElement; glad_debug_glMaterialf = glad_glMaterialf; glad_debug_glMateriali = glad_glMateriali; glad_debug_glEdgeFlag = glad_glEdgeFlag; glad_debug_glCallList = glad_glCallList; glad_debug_glCallLists = glad_glCallLists; } #endif // If only EXT_framebuffer is present and not ARB link functions if (glLoaded && GLAD_GL_EXT_framebuffer_object && !GLAD_GL_ARB_framebuffer_object) { glad_glIsRenderbuffer = glad_glIsRenderbufferEXT; glad_glBindRenderbuffer = glad_glBindRenderbufferEXT; glad_glDeleteRenderbuffers = glad_glDeleteRenderbuffersEXT; glad_glGenRenderbuffers = glad_glGenRenderbuffersEXT; glad_glRenderbufferStorage = glad_glRenderbufferStorageEXT; glad_glGetRenderbufferParameteriv = glad_glGetRenderbufferParameterivEXT; glad_glBindFramebuffer = glad_glBindFramebufferEXT; glad_glIsFramebuffer = glad_glIsFramebufferEXT; glad_glDeleteFramebuffers = glad_glDeleteFramebuffersEXT; glad_glGenFramebuffers = glad_glGenFramebuffersEXT; glad_glCheckFramebufferStatus = glad_glCheckFramebufferStatusEXT; glad_glFramebufferTexture1D = glad_glFramebufferTexture1DEXT; glad_glFramebufferTexture2D = glad_glFramebufferTexture2DEXT; glad_glFramebufferTexture3D = glad_glFramebufferTexture3DEXT; glad_glFramebufferRenderbuffer = glad_glFramebufferRenderbufferEXT; glad_glGetFramebufferAttachmentParameteriv = glad_glGetFramebufferAttachmentParameterivEXT; glad_glGenerateMipmap = glad_glGenerateMipmapEXT; } if (glLoaded && GLAD_GL_APPLE_vertex_array_object && !GLAD_GL_ARB_vertex_buffer_object) { glad_glBindVertexArray = glad_glBindVertexArrayAPPLE; glad_glDeleteVertexArrays = glad_glDeleteVertexArraysAPPLE; glad_glGenVertexArrays = glad_glGenVertexArraysAPPLE; glad_glIsVertexArray = glad_glIsVertexArrayAPPLE; } OpenGLRequirementsData& viewerReq = glRequirements[eOpenGLRequirementsTypeViewer]; viewerReq.hasRequirements = true; OpenGLRequirementsData& renderingReq = glRequirements[eOpenGLRequirementsTypeRendering]; if (checkRenderingReq) { renderingReq.hasRequirements = true; } if (!GLAD_GL_ARB_texture_float) { glHasTextureFloat = false; } else { glHasTextureFloat = true; } glVersionMajor = GLVersion.major; glVersionMinor = GLVersion.minor; if ( !glLoaded || GLVersion.major < NATRON_OPENGL_VERSION_REQUIRED_MAJOR || (GLVersion.major == NATRON_OPENGL_VERSION_REQUIRED_MAJOR && GLVersion.minor < NATRON_OPENGL_VERSION_REQUIRED_MINOR) || !GLAD_GL_ARB_pixel_buffer_object || !GLAD_GL_ARB_vertex_buffer_object) { viewerReq.error = tr("Failed to load OpenGL."); addOpenGLRequirementsString(viewerReq.error, eOpenGLRequirementsTypeViewer, true); viewerReq.hasRequirements = false; renderingReq.hasRequirements = false; #ifdef DEBUG std::cerr << viewerReq.error.toStdString() << std::endl; #endif return; } if (checkRenderingReq) { if (!GLAD_GL_ARB_texture_float || (!GLAD_GL_ARB_framebuffer_object && !GLAD_GL_EXT_framebuffer_object) || (!GLAD_GL_ARB_vertex_array_object && !GLAD_GL_APPLE_vertex_array_object)) { renderingReq.error += QLatin1String("<p>"); renderingReq.error += tr("Failed to load OpenGL."); addOpenGLRequirementsString(renderingReq.error, eOpenGLRequirementsTypeRendering, true); renderingReq.hasRequirements = false; } else { renderingReq.hasRequirements = true; } } // OpenGL is now read to be used! just include "Global/GLIncludes.h" }
void register_gl_error_handler(void(*cb)(void*, const char*), void* ud) { showerr_cb = cb; showerr_ud = ud; glad_set_post_callback(opengl_post_hook); }