clEnqueueAcquireGLObjects的目的是什么?

时间:2016-01-25 10:39:04

标签: opengl opencl

我确实谷歌提问,并从this link

获得
  

clEnqueueAcquireGLObjects

     

获取从OpenGL对象创建的OpenCL内存对象。

     

在排队到命令队列的任何OpenCL命令可以使用这些对象之前,需要获取这些对象。

我真的不明白为什么需要获取这些对象。在我看来,获取的原因不是OpenGL / OpenCL同步,因为可以通过glFinishclFinish来实现同步。

我的意思是,如果使用clEnqueueAcquireGLObjects/clEnqueueReleaseGLObjects,则glFinish/clFinish是多余的,反之亦然。

1 个答案:

答案 0 :(得分:3)

  

我的意思是,如果使用clEnqueueAcquireGLObjects / clEnqueueReleaseGLObjects,则glFinish / clFinish是多余的,反之亦然。

你以完全错误的方式思考这个问题。

glFinish使OpenGL执行完整的CPU同步,这样实现之后就会完成所有命令。 clFinish为OpenCL做了类似的事情。

您调用其中一个的事实对不同的系统的绝对没有影响。 OpenGL不知道OpenCL存在,反之亦然。 glFinishclFinish无关,反之亦然。因此,虽然OpenGL可能已完成对对象的一些修改,但OpenCL并不知道发生了这些修改。

获取和发布OpenGL对象的目的是让OpenCL和OpenGL相互通信。当获取对象时,OpenCL告诉OpenGL,"嘿,看到这些对象?他们现在我的,所以把它们交给我。"这意味着OpenGL / OpenCL驱动程序将执行将这些对象的访问控制转移到OpenCL所需的任何机制。

例如,如果一个对象已经从GPU内存中分页,OpenCL获取它可能需要再次驻留它。 OpenCL和OpenGL有两组独立的记录引用这个内存;通过获取对象,您可以将OpenCL数据与OpenGL所做的更改同步。等等。

请注意,这些机制什么都没有与同步GPU操作有关。它们是关于使OpenCL可以访问的对象。

如果您的OpenCL实现没有cl_khr_gl_event,那么您必须使用OpenGL的同步机制来确保在获取这些对象之前不再使用这些对象。这两个功能并不冗余;他们正在做不同的事情以确保系统的完整性。