Esempio n. 1
0
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"
}
Esempio n. 2
0
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);
}