我有一个OpenCL内核渲染到OpenGL纹理,我调整大小以匹配窗口大小。我曾经通过释放cl_mem对象,调用glTexImage2D并重新创建cl_mem来在我的resize回调中执行此操作:
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);
这在OS X 10.8上运行良好,但在升级到10.9之后,调整窗口大小会导致所有后续内核调用使我的监视器闪烁黑色并冻结几分钟。我认为这意味着我的OpenCL上下文以某种方式被破坏,但没有一个OpenCL调用报告错误。这个错误发生在GLUT和QT QGLWidget子类中。
我终于设法通过删除旧的OpenGL纹理并在调用glTexImage2D之前创建一个全新的纹理来解决这个崩溃。看起来我不应该这样做。这是10.9中新的OpenCL / OpenGL实现中的错误,还是我一直都在这样做?