clCreateFromGLTexture()仅在某些平台上返回CL_INVALID_CONTEXT

时间:2018-03-19 10:16:14

标签: qt opengl interop opencl

使用以下命令在OpenGL和OpenCL之间积极创建共享上下文之后:

cl_context_properties cps[] = {
    CL_GL_CONTEXT_KHR,
    (cl_context_properties)glXGetCurrentContext(),
    CL_GLX_DISPLAY_KHR,
    (cl_context_properties)glXGetCurrentDisplay(),
    CL_CONTEXT_PLATFORM,
    (cl_context_properties)platform_id,
    0
};

// Create an OpenCL context
m_contextCL = clCreateContext( cps, 1, &device_id, NULL, NULL, &err);

我尝试创建一个共享纹理:

cl_mem mem = clCreateFromGLTexture(
            m_contextCL ,
            CL_MEM_READ_ONLY ,
            GL_TEXTURE_2D ,
            0 ,
            qt_fbo->texture() ,
            &err
            );

现在,只有xubuntu 16.04上的呼叫成功,NVIDIA Quadro K620使用专有驱动程序版本387.26和OpenCL随CUDA实现包一起提供。

然而,当在Manjaro OS和Beignet OpenCL实施上使用Intel HD Graphics 520的Toshiba笔记本电脑上进行尝试时。通过返回CL_INVALID_CONTEXT,clCreateFromGLTexture(...)失败, 此外,我尝试了使用英特尔SDK和Beignet OpenCL的Ubuntu 16.04和英特尔Iris IGP(集成图形处理器)的另一个平台。它在共享纹理创建的同一点失败。

我为比较两种GPU技术(OpenGL和OpenCL)及其与Qt的互操作性创建了最小工作示例:
https://github.com/pietrzakmat/opengl-opencl-qt-interop
所有步骤都来自两个教程:
1. https://www.codeproject.com/Articles/685281/OpenGL-OpenCL-Interoperability-A-Case-Study-Using
2. https://software.intel.com/en-us/articles/opencl-and-opengl-interoperability-tutorial

任何人都可以指出我做错了什么以及为什么在集成显卡或IGP Intel cpu的平台上创建共享纹理会失败?这是驱动程序或OpenCL实现的一些问题吗?我设法构建并运行Beignet或intel_ocl_examples中包含的示例,因此我认为安装是正确的。

1 个答案:

答案 0 :(得分:0)

1)是否支持cl_khr_gl_sharing扩展?您是否尝试在Windows平台/ macOS上使用此代码用于Intel GPU? 2)你是否尝试使用没有附加到FBO的纹理?

无论如何,我认为这是Linux平台上OpenCL实现的问题。