繁体   English   中英

为什么我不能使用EGL创建无头的OpenGl上下文?

[英]Why can't I create a headless OpenGl context with EGL?

我目前正在开发需要无头opengl上下文的程序。 理想情况下,可以在没有X服务器的情况下在Linux上运行。 我的研究告诉我,EGL是执行此操作的唯一方法(请告诉我是否还有另一种方法,因为我非常喜欢C ++ API而不是像EGL这样的C api)。 通过阅读教程和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服务器上运行时,以上代码失败。 我没有在无头的环境中测试过它。

@GM的建议起作用了,在现有的createOpenGlContext函数解决了问题之前,添加了对eglMakeCurrent的调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM