Почему я не могу создать безголовый контекст OpenGl с помощью EGL?

В настоящее время я работаю над программой, для которой мне нужен безголовый контекст opengl. В идеале можно будет работать без X-сервера в Linux. Мои исследования говорят мне, что EGL — единственный способ сделать это (пожалуйста, сообщите мне, есть ли другой способ, поскольку я настоятельно предпочитаю C++ API API C, такому как EGL). Глядя на этот учебник и справочник по EGL, Я придумал этот код в виде минимального и полного примера:

#include <EGL/egl.h>
#include <glad/glad.h>
#include <iostream>
#include <exception>

class GlException : public std::exception{
public:
    GlException(const std::string &message) : m_message(message) {}
    const char *what() const noexcept override  { return m_message.c_str(); }
private:
    std::string m_message;
};

void createOpenGlContext() {
    constexpr EGLint configAttribs[] = {
        EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
        EGL_BLUE_SIZE, 8,
        EGL_GREEN_SIZE, 8,
        EGL_RED_SIZE, 8,
        EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
        EGL_NONE
    };

    constexpr EGLint pbufferAttribs[] = {
        EGL_WIDTH, 1600,
        EGL_HEIGHT, 900,
        EGL_NONE,
    };

    EGLDisplay m_display = eglGetDisplay(EGL_DEFAULT_DISPLAY);

    EGLBoolean result = eglInitialize(m_display, nullptr, nullptr);
    if(result != EGL_TRUE){
        switch(eglGetError()){
            case EGL_BAD_DISPLAY:
                throw GlException("Failed to initialize EGL Display: EGL_BAD_DISPLAY");
            case EGL_NOT_INITIALIZED:
                throw GlException("Failed to initialize EGL Display: EGL_NOT_INITIALIZED");
            default:
                throw GlException("Failed to initialize EGL Display: unknown error");
        }
    }

    EGLint numConfigs;
    EGLConfig eglConfig;
    result = eglChooseConfig(m_display, configAttribs, &eglConfig, 1, &numConfigs);
    if(result != EGL_TRUE){
        switch(eglGetError()){
            case EGL_BAD_DISPLAY:
                throw GlException("Failed to configure EGL Display: EGL_BAD_DISPLAY");
            case EGL_BAD_ATTRIBUTE:
                throw GlException("Failed to configure EGL Display: EGL_BAD_ATTRIBUTE");
            case EGL_NOT_INITIALIZED:
                throw GlException("Failed to configure EGL Display: EGL_NOT_INITIALIZED");
            case EGL_BAD_PARAMETER:
                throw GlException("Failed to configure EGL Display: EGL_BAD_PARAMETER");
            default:
                throw GlException("Failed to configure EGL Display: unknown error");
        }
    }

    EGLSurface surface = eglCreatePbufferSurface(m_display, eglConfig, pbufferAttribs);

    eglBindAPI(EGL_OPENGL_API);

    EGLContext context = eglCreateContext(m_display, eglConfig, EGL_NO_CONTEXT, nullptr);
}

int main(){
    createOpenGlContext();
    if(!gladLoadGL()){
        std::cerr << "Failed to load OpenGl function pointers" << std::endl;
        return -1;
    }
    return 0;
}

Когда я вызываю gladLoadGl в этом коде, он терпит неудачу, как можно определить по его возвращаемому значению, предполагая, что контекст не был создан, несмотря на почти точное использование кода из блога Nvidia (предположительно, Nvidia знает, что они делают с OpenGl.) . Я попытался найти кого-то еще с такой же ошибкой с помощью предпочитаемой мной поисковой системы, но ничего полезного не вышло. Что не так с моим кодом?

Я использую эта радостная конфигурация. Я использую Arch Linux, полностью обновленный. У меня Gtx 1070 с последними драйверами от Nvidia. Вышеупомянутый код дает сбой при запуске с доступным X-сервером. Я не тестировал его в безголовой среде.


person john01dav    schedule 02.11.2018    source источник
comment
Разве не должно быть обращение к чему-то вроде eglMakeCurrent< /а> где-то?   -  person G.M.    schedule 02.11.2018


Ответы (1)


Совет @G.M. сработал, добавив вызов eglMakeCurrent до того, как функция createOpenGlContext решила проблему.

person john01dav    schedule 02.11.2018