簡體   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