Opengl和opencl在一个共享上下文中只能使用一个内核
本文关键字:一个 内核 上下文 opencl Opengl 共享 | 更新日期: 2023-09-27 18:27:37
(已解决)
安装其中一个时出现问题:
{OpenTK,JIT(C#),错误的依赖项,错误的DLL,GPU驱动程序,me}
现在,在Java+jocl+lwjgl中,同样的事情可以毫无问题地工作。
在一个简单的opencl opengl互操作程序中,内核使用GL缓冲区(顶点、颜色等)和CL缓冲区(以毫秒为单位的时间和过滤数据)来更改网格的顶点。当共享上下文中只有一个内核时,它就会工作。
问题:当我使用两个cl内核而不是一个时,为什么不能再添加GL缓冲区?第二个内核是由单独的字符串(C99代码)作为单独的程序构建的
OpenCL的缓冲区是用C++代码创建的:
//raises System.AccessViolationException at C# if there are more than 1 kernel
glBuf1=cl::BufferGL(ctx,CL_MEM_READ_WRITE,glBufName,0); // exception is exactly here
//no error even with multiple kernels
buf1=cl::Buffer(ctx,CL_MEM_READ_WRITE,sizeof(cl_float) * 1);//single time variable
buf2=cl::Buffer(ctx,CL_MEM_READ_WRITE,sizeof(cl_float) * bufferN*3);// some filter data
buf3=cl::Buffer(ctx,CL_MEM_READ_WRITE,sizeof(cl_float) * bufferN*3);// some filter data
OpenGL的缓冲区是用C#代码创建的:
GL.GenBuffers(1,&name); // and name is passed to opencl wrapper as glBufName.
是否有类似的规则"如果要在opengl和opencl之间共享上下文,每个内核必须在一个单独的上下文中,并且每个上下文必须具有与其他上下文不同的缓冲区"?
编辑:64位目标构建,windows7-64位,OpenTK作为opengl部分,Khronos网站的opencl 1.2 C++包装器作为opencl部分。
编辑:用于纯开放cl计算的多个内核可以毫无问题地工作。当包含GL缓冲区时,它会出错。对于我的windows7-64位+HD7870 WHQL 13.4+opentk+opencl 1.2 c++包装器,只有单个opencl内核和opengl可以合作。
这里听起来更像是遇到了同步问题。内核的加入使它浮出水面。一旦开始大量共享资源,就需要确保OpenGL和OpenCL上下文不会同时使用它们。
在最简单的层面上,glFinish (...)
可能会有所帮助。否则,您将不得不使用更复杂(且不太便携)的OpenCL/OOpenGL同步技术,如栅栏。
当它不起作用时,会收到什么错误消息?
没有一条规则要求每个内核必须在单独的上下文中。您应该能够在一个cl_program中拥有多个内核,并在一个上下文中具有多个程序。
您使用的硬件是什么,例如Nvidia或AMD GPU?