我有一个代码,我创建GL纹理8K(7680 x 4320),我渲染到这个纹理。然后我将它切换到CL并且我做了一些事情......
问题是“切换”非常慢。
如果我没有运行任何CL代码,只能切换。它在我的GTS 450上大约有40FPS。
如果我评论“clEnqueueAcquireGLObjects(..)”line =>没有开关。它有大约600FPS。
我有什么方法可以加快速度吗?
我也想问一下如果只有Nvidia或其他像Ati这样的问题,英特尔和某些SoC(ARM)有同样的速度问题吗?
创建GL-CL纹理:
glGenFramebuffers(1, &m_fbo);
glGenTextures(1, &m_tex);
glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
glBindTexture(GL_TEXTURE_2D, m_tex);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, m_imageSize.x, m_imageSize.y, 0, GL_RGBA, GL_INT, NULL); //GL_ALPHA
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, m_tex, 0);
if(glCheckFramebufferStatus(GL_FRAMEBUFFER)!=GL_FRAMEBUFFER_COMPLETE)
return false;
glBindFramebuffer(GL_FRAMEBUFFER, 0);
int err;
m_memD = clCreateFromGLTexture2D(ecl.getContext(), CL_MEM_READ_WRITE, GL_TEXTURE_2D, 0, m_tex, &err);
if(ERR_CL)
return false;
GL - CL Interop:
void activateCL()
{
glFinish();
int err = clEnqueueAcquireGLObjects(m_queue, 1, &m_memD, 0, 0, 0);
}
void activateGL()
{
int err;
err = clFinish(m_queue);
err = clEnqueueReleaseGLObjects(m_queue, 1, &m_memD, 0, 0, 0);
}
bool activateGLRendering()
{
activateGL();
glBindFramebuffer(GL_FRAMEBUFFER, m_fbo);
return true;
}
bool deactivateGLRendering()
{
glBindFramebuffer(GL_FRAMEBUFFER, 0);
return true;
}
答案 0 :(得分:2)
与此主题中提出的问题相同:LINK
仅在nVIDIA + Windows
的驱动程序中存在问题。不是AMD,不是英特尔,而不是Linux。
但正如@ user2725937的评论所说:
It is reported to nVIDIA and fixed in 331.xx beta drivers
答案 1 :(得分:-1)
在您的平台上,此处可能不需要 glFinish 和 clFinish 。请尝试使用 glFlush 和 clFlush 。
这实际上取决于平台,如CL / GL扩展规范中所述。规范说Finish是唯一完全可移植的方式,但可能存在更快的替代方案。
例如,在Mac OS X上,从GL切换到CL,然后只有 clFlush 时,只需要 glFlushRenderAPPLE 而不需要 clEnqueueAcquireGLObjects 切换回GL时没有 clEnqueueReleaseGLObjects 。