簡體   English   中英

EGL在第一次opengl函數調用時崩潰

[英]EGL crashes at first opengl function call

我在帶有最新驅動程序的nvidia 1060 gtx 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;
}

您必須初始化GLEW 創建OpenGL上下文后立即調用glewInit

if ( glewInit() != GLEW_OK )
    return;

請注意,如果成功, glewInit將返回GLEW_OK glewInit初始化OpenGL函數的函數指針。 如果嘗試通過未初始化的函數指針調用函數,則會發生分段錯誤。

在使用glew和mingw時,還可以看到未定義參考的答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM