首页 > 解决方案 > 为什么设置 DISPLAY 环境变量时 eglCreatePbufferSurface 会给出 EGL_NO_SURFACE?

问题描述

我遇到了一个非常奇怪的问题。我正在使用 Ubuntu 20.04。下面的最小示例应该设置一个 EGL 上下文(用于以后的 OpenGL 渲染)。

#include <EGL/egl.h>
#include <stdexcept>
#include <sstream>

#define ASSERT( expression ) \
    if( !( expression ) ) \
    { \
        std::stringstream details; \
        details \
            << "Failed expression: " << #expression << std::endl \
            << "File: " << __FILE__ << std::endl \
            << "Line: " << __LINE__; \
        throw std::runtime_error( details.str() ); \
    }

static const EGLint CONFIG_ATTRIBS[] =
{
    EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
    EGL_BLUE_SIZE, 8,
    EGL_GREEN_SIZE, 8,
    EGL_RED_SIZE, 8,
    EGL_DEPTH_SIZE, 8,
    EGL_RENDERABLE_TYPE, EGL_OPENGL_BIT,
    EGL_NONE
};

static const EGLint PBUFFER_ATTRIBS[] =
{
    EGL_WIDTH, 8,
    EGL_HEIGHT, 8,
    EGL_NONE
};

int main()
{
    EGLDisplay eglDpy;
    EGLSurface eglSurf;
    EGLContext eglCtx;
    
    eglDpy = eglGetDisplay( EGL_DEFAULT_DISPLAY );
    EGLint major, minor;
    eglInitialize( eglDpy, &major, &minor );
    
    eglBindAPI( EGL_OPENGL_API );

    EGLint numConfigs;
    EGLConfig eglCfg;

    auto cfgResult = eglChooseConfig( eglDpy, CONFIG_ATTRIBS, &eglCfg, 1, &numConfigs );
    ASSERT( cfgResult == EGL_TRUE );

    eglSurf = eglCreatePbufferSurface( eglDpy, eglCfg, PBUFFER_ATTRIBS );
    ASSERT( eglSurf != EGL_NO_SURFACE ); // <-- this assertion fails

    eglCtx  = eglCreateContext( eglDpy, eglCfg, EGL_NO_CONTEXT, NULL );
    ASSERT( eglCtx != EGL_NO_CONTEXT );
}

我使用命令行c++ egltest.cpp -lGL -lEGL -o egltest进行编译和链接。当我在桌面上然后运行./egltest时,会出现以下错误:

terminate called after throwing an instance of 'std::runtime_error'
  what():  Failed expression: eglSurf != EGL_NO_SURFACE
File: egltest.cpp
Line: 53

但是,如果我用于跑步,它会起作用。unset DISPLAY && ./egltest因此,一种解决方法是在我的函数unsetenv( "DISPLAY" );的第一行中使用(经过测试,是的,它也可以)。main但是,这是一个巨大的但是,为什么有必要取消设置DISPLAY

标签: c++linuxshellopenglegl

解决方案


推荐阅读