Multithreading 具有共享上下文和多线程的OpenGL/OpenCL互操作
我正在从事一个使用OpenCL/OpenGL互操作性和多线程的项目。Thread1仅用于VBO的渲染,Thread2用于运行OpenCL内核,该内核处理VBO中存储的几何体。内核被调用了好几次,我想在每次迭代后可视化处理过的网格。因此,我需要两件事——在Thread1和Thread2中共享openGL上下文以共享VBO和共享OpenCL/openGL上下文。第一个可以使用WglShareList(HLRC2,HLRC2)实现。第二步是使用共享OpenGL上下文创建OpenCL上下文。为此,我必须使用Thread2-processing线程中的上下文 据我所知,命令的顺序如下: //创建上下文Multithreading 具有共享上下文和多线程的OpenGL/OpenCL互操作,multithreading,opengl,interop,opencl,shared,Multithreading,Opengl,Interop,Opencl,Shared,我正在从事一个使用OpenCL/OpenGL互操作性和多线程的项目。Thread1仅用于VBO的渲染,Thread2用于运行OpenCL内核,该内核处理VBO中存储的几何体。内核被调用了好几次,我想在每次迭代后可视化处理过的网格。因此,我需要两件事——在Thread1和Thread2中共享openGL上下文以共享VBO和共享OpenCL/openGL上下文。第一个可以使用WglShareList(HLRC2,HLRC2)实现。第二步是使用共享OpenGL上下文创建OpenCL上下文。为此,我必须
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上下文之间的资源
有人试过这样的东西吗,可能吗?
还是我做了一些错误的事情?您有某种线程同步吗?因为OpenGL API调用不是线程安全的。在我看来,上下文共享似乎是正确的。我还跨多个线程共享纹理。我只是希望你不要因为性能原因而这样做,因为共享OpenGL线程实际上是一件坏事。没有特殊的同步,只有一个标志表明线程应该使用新修改的VBO重新渲染屏幕。我这样做的唯一原因是,当处理线程正在更改顶点位置时,我希望看到已修改的VBO被渲染。您确定从未从两个不同的线程同时执行两个OpenGL API调用吗?另外,您是否正在从OpenCL释放缓冲区,以便OpenGL可以再次使用它?@mado:您没有看到
clCreateFromGLBuffer
返回的任何错误吗?