OpenGL-CL多线程互操作

时间:2013-07-09 23:16:20

标签: c++ opengl opencl gpgpu

我有一个线程,我有GL上下文,我做了所有渲染的东西。在另一个线程中,我正在运行OpenCL程序。这两个任务必须使用浮点值缓冲区进行交换。

现在,这个缓冲区是OpenGL 2D纹理(我想使用3D,它会很棒,但大多数设备不支持cl_khr_3d_image_writes以及我的)。因为可以预期纹理是在GL线程中创建的,所以当我尝试在另一个线程的CL程序中使用它时,应用程序失败(没有GL或CL错误,只是应用程序压缩)。

是否有可能以某种方式使用两个线程和CL-GL互操作?

1 个答案:

答案 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之间传递它们:)