我有一个线程,我有GL上下文,我做了所有渲染的东西。在另一个线程中,我正在运行OpenCL程序。这两个任务必须使用浮点值缓冲区进行交换。
现在,这个缓冲区是OpenGL 2D纹理(我想使用3D,它会很棒,但大多数设备不支持cl_khr_3d_image_writes
以及我的)。因为可以预期纹理是在GL线程中创建的,所以当我尝试在另一个线程的CL程序中使用它时,应用程序失败(没有GL或CL错误,只是应用程序压缩)。
是否有可能以某种方式使用两个线程和CL-GL互操作?
答案 0 :(得分:1)
以这种方式完全可以使用两个线程。但是,您必须明确地处理缓冲区的同步。请参阅OpenGL规范的附录D("共享对象和多个上下文")。
粗略的流程是:
1)在GL线程上执行glFenceSync()以创建GLsync对象(ARB_sync extension)。
2)在任一线程上(OpenCL是线程安全的)使用clCreateEventFromGLsyncKHR()从GLsync(cl_khr_gl_event扩展名)创建cl_event。
3)在您的CL线程上,使用clEnqueueAcquireGLObjects()作为等待列表中的事件(cl_khr_gl_sharing扩展名)从步骤2传入cl_event。可能保持创建的cl_event。
4)继续进行CL处理。如果您使用的是乱序队列,请确保在步骤2中使用clEnqueueAcquireGLObjects()创建的cl_event。
5)在你的CL线程上使用clEnqueueReleaseGLObjects()创建一个cl_event(cl_khr_gl_sharing扩展名)。
6)在GL线程上(OpenGL不是线程安全的)使用glCreateSyncFromCLeventARB()从步骤5(GL_ARB_cl_event扩展名)的cl_event创建GLsync对象。
7)返回你的GL线程使用glWaitSync()等待GLsync对象(ARB_sync extension扩展名)。
8)继续进行GL处理。
9)回到第1步。
它只是创建同步对象并在两个API之间传递它们:)