EGL在第一次opengl函数调用

时间:2017-08-03 11:06:17

标签: c++ opengl egl

我在拱门nvidia 1060 gtx上使用linux卡片和最新的驱动程序。但是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;
}

1 个答案:

答案 0 :(得分:3)

您必须初始化GLEW。在创建OpenGL上下文后立即调用glewInit

if ( glewInit() != GLEW_OK )
    return;

注意,glewInit如果成功则返回GLEW_OKglewInit初始化OpenGL函数的函数指针。如果您尝试通过未初始化的函数指针调用函数,则会发生分段错误。

另见Undefined reference when using glew and mingw?

的答案