【问题标题】:OpenGL-CL multithread interoperationOpenGL-CL多线程互操作
【发布时间】:2013-07-09 23:16:19
【问题描述】:

我有一个线程,其中我有 GL 上下文,并且我制作了所有渲染内容。在另一个线程中,我正在运行 OpenCL 程序。这两个任务必须与浮点值的缓冲区进行交换。

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

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

【问题讨论】:

  • OpenCL 扩展规范描述了与 GL 相关的扩展,特别是解决此类互操作性的 cl_khr_gl_sharingcl_khr_gl_event。你能提供一个不起作用的例子吗?

标签: c++ opengl opencl gpgpu


【解决方案1】:

以这种方式使用两个线程是完全可能的。但是,您必须明确注意缓冲区的同步。请参阅 OpenGL 规范的附录 D(“共享对象和多个上下文”)。

大致流程是:

1) 在您的 GL 线程上执行 glFenceSync() 以创建 GLsync 对象 (ARB_sync extension)。

2) 在任一线程上(OpenCL 是线程安全的)使用 clCreateEventFromGLsyncKHR() 从 GLsync(cl_khr_gl_event 扩展名)创建一个 cl_event。

3) 在您的 CL 线程上,使用 clEnqueueAcquireGLObjects() 从第 2 步传入您的 cl_event 作为等待列表中的事件(cl_khr_gl_sharing 扩展名)。可能保留创建的 cl_event。

4) 继续进行 CL 处理。如果您使用的是乱序队列,请确保使用第 2 步中由 clEnqueueAcquireGLObjects() 创建的 cl_event。

5) 在您的 CL 线程上使用 clEnqueueReleaseGLObjects() 创建一个 cl_event(cl_khr_gl_sharing 扩展名)。

6) 在您的 GL 线程(OpenGL 不是线程安全的)上,使用 glCreateSyncFromCLeventARB() 从步骤 5 中的 cl_event 创建一个 GLsync 对象(GL_ARB_cl_event 扩展名)。

7) 回到您的 GL 线程,使用 glWaitSync() 等待 GLsync 对象(ARB_sync extension 扩展名)。

8) 继续进行 GL 处理。

9) 返回第 1 步。

这只是关于创建同步对象并在两个 API 之间传递它们:)

【讨论】:

    猜你喜欢
    • 2013-07-31
    • 2011-09-22
    • 2019-07-15
    • 2023-04-10
    • 2011-12-03
    • 2013-07-27
    • 2018-09-04
    • 2012-02-08
    • 2020-09-17
    相关资源
    最近更新 更多