2017-08-03 203 views
1

我正在使用nvidia 1060 gtx板卡linux與最新的驅動程序。但是ELG完全不起作用,實際上它在第一次調用opengl函數時崩潰,例如glGenBuffers()。使用GLFW創建上下文時,一切正常。但是這裏需要不依賴於x-server的存在。 gcc testegl.cpp -lGLEW -lGL -lEGL_nvidia -lEGL -lstdc++ -o testeglEGL在第一個opengl函數崩潰時崩潰

輸出是:

下面的代碼使用編譯

  • 開始...
  • 分割故障(核心轉儲)

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; 
} 
+0

你必須'glewInit'見[未定義參考使用GLEW和MinGW什麼時候?](https://stackoverflow.com/questions/45473091/undefined-reference-when-using -glew-and-mingw/45476269#45476269) – Rabbid76

+0

請編輯您的問題並顯示錯誤消息。 – Ripi2

回答