我正在开发一个使用 OpenCL / OpenGL 互操作性和多线程的项目。Thread1 仅用于渲染 VBO,Thread2 用于运行 OpenCL 内核,处理存储在 VBO 中的几何图形。内核被多次调用,我想在每次迭代后可视化处理过的网格。因此,我需要两件事 - 在 Thread1 和 Thread2 中共享 openGL 上下文以共享 VBO 并共享 OpenCL / OpenGL 上下文。第一个可以使用 wglShareLists(HLRC2, HLRC2) 来实现。第二步是使用共享 OpenGL 上下文创建 OpenCL 上下文。为此,我必须使用 Thread2 的上下文 - 处理线程。
据我了解,命令的顺序应该如下:
// 创建上下文
hlrc1 = wglCreateContext(m_hdc);
hlrc2 = wglCreateContext(m_hdc);
// 在没有为每个线程设置为当前资源时共享资源
wglShareLists(hlrc1, hlrc2);
// 使线程 1 中的 hlrc1 和线程 2 中的 hlrc2 成为当前的
wglMakeCurrent(m_hdc, hlrc1) / wglMakeCurrent(m_hdc, hlrc2)
// 现在为 openCL 设置共享上下文
cl_context_properties properties[] = {
CL_GL_CONTEXT_KHR, (cl_context_properties)wglGetCurrentContext(), // WGL Context
CL_WGL_HDC_KHR, (cl_context_properties)wglGetCurrentDC(), // WGL HDC
CL_CONTEXT_PLATFORM, (cl_context_properties)cpPlatform, // OpenCL platform
0 };
cl_device_id devices[32]; size_t sizedev;
clGetGLContextInfoKHR_fn clGetGLContextInfo = (clGetGLContextInfoKHR_fn)clGetExtensionFunctionAddressForPlatform(cpPlatform, "clGetGLContextInfoKHR");
clGetGLContextInfo(properties, CL_DEVICES_FOR_GL_CONTEXT_KHR, 32 * sizeof(cl_device_id), devices, &sizedev);
cl_uint countdev = (cl_uint)(sizedev / sizeof(cl_device_id));
context = clCreateContext(properties, countdev, devices, NULL, 0, 0);
// 然后创建共享互操作内存对象并将其作为内核参数传递给 openCL
cl_mem vbo_cl = clCreateFromGLBuffer(context, CL_MEM_READ_WRITE, vboID, NULL);
麻烦就来了。如果调用命令 wglShareLists(hlrc1, hlrc2),共享 VBO 只有零而不是顶点位置。如果跳过命令 wglShareLists(hlrc1, hlrc2),VBO 具有有效值,OpenGL / OpenCL 互操作之间一切正常,但我无法渲染进程,因为 Thread1 和 Thread2 中的 OpenGL 上下文之间的资源无法共享。
有没有人尝试过这样的事情,可能吗?还是我做错了什么?