gpt4 book ai didi

c++ - OpenGL-CL多线程互操作

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:27:08 27 4
gpt4 key购买 nike

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

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

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

最佳答案

这样使用两个线程是完全可以的。但是,您必须明确注意缓冲区的同步。请参阅 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(GL_ARB_cl_event 扩展名)创建 GLsync 对象。

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

8) 继续进行 GL 处理。

9) 回到第一步

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

关于c++ - OpenGL-CL多线程互操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17559873/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com