我确实谷歌提问,并从this link
获得clEnqueueAcquireGLObjects
获取从OpenGL对象创建的OpenCL内存对象。
在排队到命令队列的任何OpenCL命令可以使用这些对象之前,需要获取这些对象。
我真的不明白为什么需要获取这些对象。在我看来,获取的原因不是OpenGL / OpenCL同步,因为可以通过glFinish
和clFinish
来实现同步。
我的意思是,如果使用clEnqueueAcquireGLObjects/clEnqueueReleaseGLObjects
,则glFinish/clFinish
是多余的,反之亦然。
答案 0 :(得分:3)
我的意思是,如果使用clEnqueueAcquireGLObjects / clEnqueueReleaseGLObjects,则glFinish / clFinish是多余的,反之亦然。
你以完全错误的方式思考这个问题。
glFinish
使OpenGL执行完整的CPU同步,这样实现之后就会完成所有命令。 clFinish
为OpenCL做了类似的事情。
您调用其中一个的事实对不同的系统的绝对没有影响。 OpenGL不知道OpenCL存在,反之亦然。 glFinish
与clFinish
无关,反之亦然。因此,虽然OpenGL可能已完成对对象的一些修改,但OpenCL并不知道发生了这些修改。
获取和发布OpenGL对象的目的是让OpenCL和OpenGL相互通信。当获取对象时,OpenCL告诉OpenGL,"嘿,看到这些对象?他们现在我的,所以把它们交给我。"这意味着OpenGL / OpenCL驱动程序将执行将这些对象的访问控制转移到OpenCL所需的任何机制。
例如,如果一个对象已经从GPU内存中分页,OpenCL获取它可能需要再次驻留它。 OpenCL和OpenGL有两组独立的记录引用这个内存;通过获取对象,您可以将OpenCL数据与OpenGL所做的更改同步。等等。
请注意,这些机制什么都没有与同步GPU操作有关。它们是关于使OpenCL可以访问的对象。
如果您的OpenCL实现没有cl_khr_gl_event
,那么您必须使用OpenGL的同步机制来确保在获取这些对象之前不再使用这些对象。这两个功能并不冗余;他们正在做不同的事情以确保系统的完整性。