c++ - 为什么设置 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
?
解决方案
推荐阅读
- css - 将鼠标悬停在父项上并显示子项
- sql - 如何在 postgresql 中随机化布尔值?
- javascript - 获取范围内的x单元格谷歌表格应用程序脚本
- cassandra - 使用 dsbulk 将数据加载到 Cassandra 的第一步
- sql - 如何使用列作为在 SQL 中对列进行透视的键
- javascript - 当我单击按钮时,我的模式不显示
- ibm-midrange - 从 IBM Emulator AS400 5250 读取泰语字符
- python - Python:如何在 .txt 文件中搜索整个单词?
- wpf - 如何使用可重用样式根据其(动态)上下文菜单是否具有项目来更改控件的外观?
- pandas - Python Pandas 到 csv 没有双引号