我正在开发一个使用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和thread2中的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上下文之间的resorces。 / p>
有没有人尝试过这样的事情,有可能吗? 或者我是以错误的方式做某事?