首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OpenGL EGL在码头eglGetDisplay返回0x300c (EGL_BAD_PARAMETER)

OpenGL EGL在码头eglGetDisplay返回0x300c (EGL_BAD_PARAMETER)
EN

Stack Overflow用户
提问于 2020-08-07 03:45:27
回答 1查看 1.5K关注 0票数 0

我正在尝试运行一个简单的示例来在docker容器中设置EGL上下文。但是,我一直收到以下错误消息:

代码语言:javascript
运行
复制
Detected 0 devices
terminate called after throwing an instance of 'std::runtime_error'
  what():  EGL error 0x300c at eglGetDisplay
Aborted

基本上,eglQueryDevicesEXT返回0,eglGetPlatformDisplayEXT返回错误代码0x300c (EGL_BAD_PARAMETER)

我试过:

  1. Ubuntu 16.04在Macbook Pro
  2. Ubuntu 16.04上与Nvidia GPU

服务器对接

在这些对接环境中,我使用openGLapt-get install libegl1-mesa-dev安装了apt-get install libgl1-mesa-devapt-get install libegl1-mesa-dev。CMake可以找到组件GL::GLEGL::EGL

我尝试过手动和在libEGL.so中使用find_package链接到CMake。

快把我逼疯了!我不明白为什么EGL不能检测设备?如何解决此错误?

这是我的完整密码。我也尝试过EGLDisplay eglDpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);,它给了我同样的错误。谢谢!

代码语言:javascript
运行
复制
#include <EGL/egl.h>
#include <EGL/eglext.h>


void assertEGLError(const std::string& msg) {
    EGLint error = eglGetError();

    if (error != EGL_SUCCESS) {
        std::stringstream s;
        s << "EGL error 0x" << std::hex << error << " at " << msg;
        throw std::runtime_error(s.str());
    }
}


int main(int argc, char *argv[])
{
    // 1. Initialize EGL
//    EGLDisplay eglDpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);

    int deviceID = 0;  // TODO hardcode

    EGLDisplay eglDpy;
    EGLConfig config;
    EGLContext context;
    EGLint num_config;

    static const int MAX_DEVICES = 16;
    EGLDeviceEXT eglDevs[MAX_DEVICES];
    EGLint numDevices;

    PFNEGLQUERYDEVICESEXTPROC eglQueryDevicesEXT =
            (PFNEGLQUERYDEVICESEXTPROC)eglGetProcAddress("eglQueryDevicesEXT");

    eglQueryDevicesEXT(MAX_DEVICES, eglDevs, &numDevices);
    printf("Detected %d devices\n", numDevices);
    PFNEGLGETPLATFORMDISPLAYEXTPROC eglGetPlatformDisplayEXT =
            (PFNEGLGETPLATFORMDISPLAYEXTPROC)eglGetProcAddress("eglGetPlatformDisplayEXT");

    // Choose device by deviceID
    eglDpy = eglGetPlatformDisplayEXT(EGL_PLATFORM_DEVICE_EXT, eglDevs[deviceID], nullptr);

    assertEGLError("eglGetDisplay");

    return 0;
}
EN

Stack Overflow用户

回答已采纳

发布于 2020-08-17 01:22:04

天哪,我终于解决了这个问题。结果我链接到服务器上的错误库。

我在这篇文章中找到了答案:https://forums.developer.nvidia.com/t/problem-with-opengl-visualization-without-an-x-server/73204/15

关键是链接到/usr/lib/nvidia-410/中的库,而不是系统默认的/usr/local/lib/x86_64-linux-gnu/libEGL.so

工作的新CMake

代码语言:javascript
运行
复制
target_link_libraries(sandbox PRIVATE /usr/lib/nvidia-410/libEGL.so)
target_link_libraries(sandbox PRIVATE /usr/lib/nvidia-410/libGLX.so)
target_link_libraries(sandbox PRIVATE /usr/lib/nvidia-410/libOpenGL.so)

以前我使用CMake的findOpenGL搜索链接库,不使用

代码语言:javascript
运行
复制
find_package(OpenGL REQUIRED COMPONENTS OpenGL EGL GLX)
include_directories(${OPENGL_INCLUDE_DIRS})
if(OPENGL_FOUND)
   message("Found OpenGL in the current environment!")
else()
   message("Error: No OpenGL found.")
endif()

message("OpenGL include dirs" )
message("${OPENGL_INCLUDE_DIR}")
message("EGL include dirs" )
message("${OPENGL_EGL_INCLUDE_DIRS}")

if (OpenGL_EGL_FOUND)
   message("EGL Found!")
else()
   message("EGL Not Found!")
endif()

message(${OPENGL_egl_LIBRARY})
message(${OPENGL_glx_LIBRARY})
message(${OPENGL_opengl_LIBRARY}

请再次注意,,这不起作用!!

代码语言:javascript
运行
复制
/usr/local/lib/x86_64-linux-gnu/libEGL.so
/usr/local/lib/x86_64-linux-gnu/libGLX.so
/usr/local/lib/x86_64-linux-gnu/libOpenGL.so
票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63294883

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档