Не удается создать общий доступ к OpenCL контексту EGL / OpenGLES - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь использовать взаимодействие OpenCL с OpenGL-ES с помощью расширения cl_khr_gl_sharing. Но когда я пытаюсь создать контекст OpenCL, который будет делиться с моим контекстом OpenGL, clCreateContext завершится с ошибкой -59 (CL_INVALID_OPERATION).

Из документации ( Документы OpenCL ) я вижу только одну возможность: мое «устройство [...] не может поддерживать объекты OpenCL, которые совместно используют хранилище данных объекта OpenGL». Я проверил clGetDeviceInfo, что используемое мной устройство OpenCL поддерживает расширение: оно поддерживает. Сейчас я пытаюсь использовать внеэкранный рендер, но я пытался использовать поверхность PBuffer, я также пробовал экранный рендеринг, все та же ошибка.

Я использую EGL в Ubuntu 18.04. Вот информация, которую я получаю о своем GPU, когда я запрашиваю OpenGL и OpenCL:

Информация OpenGL (glGetString):

Opengl context: NVIDIA Corporation : GeForce GTX 750 Ti/PCIe/SSE2 : OpenGL ES 3.2 NVIDIA 435.21

Информация OpenCL (clGetPlatformInfo и clGetDeviceInfo) :

CL_PLATFORM_PROFILE FULL_PROFILE
CL_PLATFORM_VERSION OpenCL 1.2 CUDA 10.1.0
CL_PLATFORM_NAME NVIDIA CUDA
CL_PLATFORM_VENDOR NVIDIA Corporation
CL_DEVICE_NAME GeForce GTX 750 Ti
CL_DEVICE_PROFILE FULL_PROFILE
CL_DEVICE_VENDOR NVIDIA Corporation
CL_DEVICE_VERSION OpenCL 1.2 CUDA
CL_DRIVER_VERSION 435.21

Вот упрощенная версия кода, который я пытаюсь запустить:

int main()
{
    /// OpenGL Setup
    EGLDisplay egl_dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
    eglInitialize(egl_dpy, NULL, NULL);

    const EGLint config_attribs[] = {
            EGL_RED_SIZE, 8,
            EGL_GREEN_SIZE, 8,
            EGL_BLUE_SIZE, 8,
            EGL_ALPHA_SIZE, 8,
            EGL_DEPTH_SIZE, 16,
            EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
            EGL_NONE};

    EGLConfig cfg;
    EGLint count;
    eglChooseConfig(egl_dpy, config_attribs, &cfg, 1, &count);
    eglBindAPI(EGL_OPENGL_ES_API);

    static const EGLint attribs[] = {EGL_CONTEXT_CLIENT_VERSION, 3, EGL_NONE};
    EGLContext core_ctx = eglCreateContext(egl_dpy, cfg, EGL_NO_CONTEXT, attribs);

    eglMakeCurrent(egl_dpy, EGL_NO_SURFACE, EGL_NO_SURFACE, core_ctx);


    /// OpenCL setup
    cl_platform_id platform_id = NULL;
    cl_uint ret_num_platforms;
    auto retPlat = clGetPlatformIDs(1, &platform_id, &ret_num_platforms);
    if (retPlat != CL_SUCCESS)
    {
        assert(0);
    }

    cl_device_id device_id = NULL;
    auto retDev = clGetDeviceIDs(platform_id, CL_DEVICE_TYPE_GPU, 1, &device_id, NULL);
    if (retDev != CL_SUCCESS)
    {
        assert(0);
    }

    cl_context_properties props[] = {CL_CONTEXT_PLATFORM, (cl_context_properties)platform_id, CL_GL_CONTEXT_KHR,
            (cl_context_properties)eglGetCurrentContext(), CL_EGL_DISPLAY_KHR,
            (cl_context_properties)eglGetCurrentDisplay(), 0};


    cl_int retContext;
    cl_context myContext = clCreateContext(props, 1, &device_id, NULL, NULL, &retContext);
    if (retContext != CL_SUCCESS)
    {
        std::cout << "clCreateContext " << retContext << "\n";
        assert(0);
    }
}

1 Ответ

0 голосов
/ 06 апреля 2020

Я нашел проблему. Кажется, что драйвер Nvidia OpenCL не поддерживает совместное использование OpenGL с контекстами EGL. Я смог отследить в библиотеке OpenCL и заметил оператор switch, который возвращал эту конкретную ошибку, если использовалось свойство CL_EGL_DISPLAY_KHR. Если я использую контекст GLX OpenGL, все работает нормально. Я не знаю, как они могли лучше документировать этот факт, но это спасло бы меня на неделю.

...