使用以下命令在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中包含的示例,因此我认为安装是正确的。
答案 0 :(得分:0)
1)是否支持cl_khr_gl_sharing扩展?您是否尝试在Windows平台/ macOS上使用此代码用于Intel GPU? 2)你是否尝试使用没有附加到FBO的纹理?
无论如何,我认为这是Linux平台上OpenCL实现的问题。