OpenGL EGL возвращает 0x300 c (EGL_BAD_PARAMETER) в eglGetDisplay в docker - PullRequest
0 голосов
/ 07 августа 2020

Я пытаюсь запустить простой пример для настройки контекста EGL в контейнере docker. Однако я продолжаю получать это сообщение об ошибке:

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 docker на Macbook Pro
  2. Ubuntu 16.04 docker на сервере Ubuntu 16.04 с графическим процессором Nvidia

В этих docker средах , Я установил openGL и ELG, используя apt-get install libgl1-mesa-dev и apt-get install libegl1-mesa-dev. CMake может найти компоненты GL::GL и EGL::EGL.

Я пробовал создать ссылку на libEGL.so как вручную, так и используя find_package в CMake.

Это сводит меня с ума! Я не могу понять, почему 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;
}

1 Ответ

0 голосов
/ 17 августа 2020

OMG Я наконец решил эту проблему. Оказалось, что я делал ссылку на неправильную библиотеку на сервере.

Я нашел ответ в этом посте: 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, который работает:

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 для поиска библиотек ссылок, которые не работает

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
...