Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 具有共享上下文和多线程的OpenGL/OpenCL互操作_Multithreading_Opengl_Interop_Opencl_Shared - Fatal编程技术网

Multithreading 具有共享上下文和多线程的OpenGL/OpenCL互操作

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上下文。为此,我必须

我正在从事一个使用OpenCL/OpenGL互操作性和多线程的项目。Thread1仅用于VBO的渲染,Thread2用于运行OpenCL内核,该内核处理VBO中存储的几何体。内核被调用了好几次,我想在每次迭代后可视化处理过的网格。因此,我需要两件事——在Thread1和Thread2中共享openGL上下文以共享VBO和共享OpenCL/openGL上下文。第一个可以使用WglShareList(HLRC2,HLRC2)实现。第二步是使用共享OpenGL上下文创建OpenCL上下文。为此,我必须使用Thread2-processing线程中的上下文

据我所知,命令的顺序如下:

//创建上下文

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
返回的任何错误吗?