Macos 调整与OpenCL共享的OpenGL纹理的大小(在OS X 10.9中)
我有一个OpenCL内核,它可以渲染成OpenGL纹理,我可以调整它的大小以匹配窗口大小的变化。我曾经在我的resize回调中通过释放cl_mem对象、调用glTexImage2D并重新创建cl_mem来实现这一点:Macos 调整与OpenCL共享的OpenGL纹理的大小(在OS X 10.9中),macos,qt,opengl,opencl,Macos,Qt,Opengl,Opencl,我有一个OpenCL内核,它可以渲染成OpenGL纹理,我可以调整它的大小以匹配窗口大小的变化。我曾经在我的resize回调中通过释放cl_mem对象、调用glTexImage2D并重新创建cl_mem来实现这一点: if (m_clBuffer != NULL) CALL_CL_GUARDED(clReleaseMemObject, (m_clBuffer)); glBindTexture(GL_TEXTURE_2D, m_glTexture); glTexImage2D(GL_TEX
if (m_clBuffer != NULL)
CALL_CL_GUARDED(clReleaseMemObject, (m_clBuffer));
glBindTexture(GL_TEXTURE_2D, m_glTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, width, height, 0, GL_RGBA,
GL_UNSIGNED_BYTE, NULL);
m_clBuffer = clCreateFromGLTexture(m_clContext, CL_MEM_WRITE_ONLY,
GL_TEXTURE_2D, 0, m_clBuffer, &err);
这在OSX10.8上运行得很好,但升级到10.9后,调整窗口大小会导致所有后续内核调用使我的监视器闪烁黑色并冻结几分钟。我认为这意味着我的OpenCL上下文不知何故被破坏了,但没有一个OpenCL调用报告错误。这个bug发生在GLUT下和QtQglWidget子类内部
在调用glTexImage2D之前,我删除了旧的OpenGL纹理并创建了一个全新的纹理,最终成功地避免了这个崩溃。看来我不需要这么做。这是10.9中新的OpenCL/OpenGL实现中的一个bug,还是我应该一直这么做?您的CL/GL同步在哪里?由于GL不必立即完成
glTexImage2D(…)
命令,因此在CL中使用该命令之前,需要确保该命令完成。glFinish(…)
是执行此操作的最方便的技术,但glFlush(…)
在某些情况下可能就足够了。我的印象是glTexImage2D会立即生效——例如,当您传入纹理数据时,可以在glTexImage2D返回后取消分配它(尽管我认为它可能会在系统ram中的某个地方缓冲)。当然,在我的clEnqueueAcquireGLObjects调用之前,我有glFinish()。在任何情况下,我尝试添加glFinish(),但我得到了相同的崩溃行为。顺便说一句,NVIDIA工程师在本演示文稿的幻灯片36中没有包括glTexImage2D和clCreateFromGLTexture调用之间的显式同步:Julian,glTextImage2D和clCreateFromGLTexture之间不需要同步。在获取/释放调用中确实需要它。