EGL 在第一次 opengl 函数调用时崩溃

EGL crashes at first opengl function call

我在带有最新驱动程序的 arch linux 上使用 nvidia 1060 gtx 卡。但是 ELG 根本不起作用,实际上它在第一次调用 opengl 函数时崩溃,例如 glGenBuffers()。使用 GLFW 创建上下文时一切正常。但是这里需要不依赖x-server存在。

以下代码编译使用:gcc testegl.cpp -lGLEW -lGL -lEGL_nvidia -lEGL -lstdc++ -o testegl

输出为:

testegl.cpp:

#include <EGL/egl.h>
#include <GL/glew.h>
#include <exception>
#include <string>
#include <iostream>

class GLEGLContext {
private:
    EGLDisplay mDisplay;
    EGLSurface mSurface;
    EGLContext mContext;

public:
    GLEGLContext ();
    ~GLEGLContext ();
    GLEGLContext (const GLEGLContext& ) = delete;
    GLEGLContext& operator = (const GLEGLContext&) = delete;

public:
    virtual void makeCurrent ();
    virtual void releaseCurrent ();
};

GLEGLContext::GLEGLContext () {
    const EGLint configAttribs[] = {
        EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
        EGL_BLUE_SIZE, 8,
        EGL_GREEN_SIZE, 8,
        EGL_RED_SIZE, 8,
        EGL_DEPTH_SIZE, 0,
        EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
        EGL_NONE
    };    

    const EGLint pbufferAttribs[] = {
        EGL_WIDTH, 1920,
        EGL_HEIGHT, 1080,
        EGL_NONE,
    };

    mDisplay = eglGetDisplay(EGL_DEFAULT_DISPLAY);
    if (mDisplay == EGL_NO_DISPLAY)
        throw StdException(__PRETTY_FUNCTION__, "eglGetDisplay() failed");

    EGLint major, minor;
    if (!eglInitialize(mDisplay, &major, &minor))
        throw StdException(__PRETTY_FUNCTION__, "eglInitialize() failed");

    EGLint numConfigs;
    EGLConfig eglCfg;
    if (!eglChooseConfig(mDisplay, configAttribs, &eglCfg, 1, &numConfigs))
        throw StdException(__PRETTY_FUNCTION__, "eglChooseConfig() failed");

    mSurface = eglCreatePbufferSurface(mDisplay, eglCfg, pbufferAttribs);
    if (mSurface == EGL_NO_SURFACE)
        throw StdException(__PRETTY_FUNCTION__, "eglCreatePbufferSurface() failed");

    if (!eglBindAPI(EGL_OPENGL_API))
        throw StdException(__PRETTY_FUNCTION__, "eglBindAPI() failed");

    mContext = eglCreateContext(mDisplay, eglCfg, EGL_NO_CONTEXT, NULL);
    if (mContext == EGL_NO_CONTEXT)
        throw StdException(__PRETTY_FUNCTION__, "eglCreateContext() failed");

    makeCurrent();
}

GLEGLContext::~GLEGLContext () {
    eglTerminate(mDisplay);
}

void GLEGLContext::makeCurrent () {
    if (!eglMakeCurrent(mDisplay, mSurface, mSurface, mContext))
        throw StdException(__PRETTY_FUNCTION__, "eglMakeCurrent() create failed");
}

void GLEGLContext::releaseCurrent () {
    if (!eglMakeCurrent(mDisplay, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT))
        throw StdException(__PRETTY_FUNCTION__, "eglMakeCurrent() release failed");
}

int main(int argc, char** argv) {
    GLEGLContext ctx;
    ctx.makeCurrent();
    std::cout << "Starting..." << std::endl;
    GLuint vertexBuffer = 0;
    glGenBuffers(1, &vertexBuffer);
    std::cout << "done" << std::endl;
    ctx.releaseCurrent();

    return 0;
}

您必须在创建 OpenGL 上下文后立即初始化 GLEW. Call glewInit

if ( glewInit() != GLEW_OK )
    return;

请注意,glewInit returns GLEW_OK if succeeded. glewInit 初始化 OpenGL 函数的函数指针。如果您尝试通过未初始化的函数指针调用函数,则会发生分段错误。

另请参阅

的答案