Mam kod, w którym tworzę teksturę GL 8K (7680 x 4320) i renderuję do tej tekstury. Następnie przełączam go na CL i robię kilka rzeczy ...OpenCL - wydajność OpenGL Interop
Problem polega na tym, że "przełączanie" przebiega bardzo wolno.
Jeśli nie uruchomię żadnego kodu CL, przełącz tylko. Ma około 40FPS na moim GTS 450.
Jeśli komentarz "clEnqueueAcquireGLObjects (..)" line => bez przełącznika. Ma około 600 FPS.
Czy istnieje sposób, w jaki mogę przyspieszyć?
Chcę też zapytać Jeśli problem dotyczy tylko Nvidii lub innych urządzeń takich jak Ati, Intel i niektóre urządzenia SoC (ARM) mają ten sam problem z szybkością?
Tworzenie GL-CL tekstury:
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;
}
Jak o zrobieniu ani i używając [płot synchronizacji obiektu] (http://www.opengl.org/wiki/Sync_Object)? –
Właśnie próbowałem "flush" i to samo :(Powolne rzeczy dzieją się w clEnqueueAcquireGLObjects() i clEnqueueReleaseGLObjects(). "Finish" lub "Flush" nie jest problemem! – Milan
Nicol: Ale jeśli użyję "obiektu synchronizacji". nadal musi wywołać clEnqueueAcquireGLObjects(), więc myślę, że to nie jest rozwiązanie :( – Milan