OpenGL EGL returns 0x300c (EGL_BAD_PARAMETER) 在 docker 中的 eglGetDisplay
OpenGL EGL returns 0x300c (EGL_BAD_PARAMETER) at eglGetDisplay in docker
我正在尝试 运行 一个在 docker 容器中设置 EGL 上下文的简单示例。但是,我不断收到此错误消息:
Detected 0 devices
terminate called after throwing an instance of 'std::runtime_error'
what(): EGL error 0x300c at eglGetDisplay
Aborted
基本上,eglQueryDevicesEXT
returns 0 和 eglGetPlatformDisplayEXT
returns 错误代码 0x300c (EGL_BAD_PARAMETER)
.
我已经试穿了:
- Ubuntu 16.04 docker 在 Macbook Pro 上
- Ubuntu 16.04 docker 在带有 Nvidia GPU
的 Ubuntu 16.04 服务器上
在这些 docker 环境中,我使用 apt-get install libgl1-mesa-dev
和 apt-get install libegl1-mesa-dev
安装了 openGL
和 ELG
。 CMake 可以找到组件 GL::GL
和 EGL::EGL
.
我已经尝试 link 到 libEGL.so
手动和在 CMake 中使用 find_package
。
这让我发疯!我不明白为什么 EGL 无法检测到设备?我该如何解决这个错误?
这是我的完整代码。我也试过 EGLDisplay eglDpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
这给了我同样的错误。谢谢!
#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;
}
天哪,我终于解决了这个问题。结果我 link 访问了服务器上的错误库。
我在这个 post 中找到了答案:https://forums.developer.nvidia.com/t/problem-with-opengl-visualization-without-an-x-server/73204/15
关键是 link 到 /usr/lib/nvidia-410/
中的库,而不是系统默认 /usr/local/lib/x86_64-linux-gnu/libEGL.so
有效的新CMake
:
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
搜索link库,没用
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}
再次注意这不起作用!!
/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
我正在尝试 运行 一个在 docker 容器中设置 EGL 上下文的简单示例。但是,我不断收到此错误消息:
Detected 0 devices
terminate called after throwing an instance of 'std::runtime_error'
what(): EGL error 0x300c at eglGetDisplay
Aborted
基本上,eglQueryDevicesEXT
returns 0 和 eglGetPlatformDisplayEXT
returns 错误代码 0x300c (EGL_BAD_PARAMETER)
.
我已经试穿了:
- Ubuntu 16.04 docker 在 Macbook Pro 上
- Ubuntu 16.04 docker 在带有 Nvidia GPU 的 Ubuntu 16.04 服务器上
在这些 docker 环境中,我使用 apt-get install libgl1-mesa-dev
和 apt-get install libegl1-mesa-dev
安装了 openGL
和 ELG
。 CMake 可以找到组件 GL::GL
和 EGL::EGL
.
我已经尝试 link 到 libEGL.so
手动和在 CMake 中使用 find_package
。
这让我发疯!我不明白为什么 EGL 无法检测到设备?我该如何解决这个错误?
这是我的完整代码。我也试过 EGLDisplay eglDpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
这给了我同样的错误。谢谢!
#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;
}
天哪,我终于解决了这个问题。结果我 link 访问了服务器上的错误库。
我在这个 post 中找到了答案:https://forums.developer.nvidia.com/t/problem-with-opengl-visualization-without-an-x-server/73204/15
关键是 link 到 /usr/lib/nvidia-410/
中的库,而不是系统默认 /usr/local/lib/x86_64-linux-gnu/libEGL.so
有效的新CMake
:
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
搜索link库,没用
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}
再次注意这不起作用!!
/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