EGL падает при первом вызове функции opengl

я использую 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;
}

2

Решение

Вы должны инициализировать GLEW. Вызов glewInit сразу после того, как вы создали контекст OpenGL:

if ( glewInit() != GLEW_OK )
return;

Обратите внимание, что glewInit возвращается GLEW_OK если получилось. glewInit инициализирует указатели на функции для функций OpenGL. Если вы попытаетесь вызвать функцию через неинициализированный указатель на функцию, произойдет ошибка сегментации.

см. также ответ на Неопределенная ссылка при использовании glew и mingw?

3

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector