Ho un codice in cui creo GL texture 8K (7680 x 4320) e visualizzo questa texture. Poi lo cambio in CL e faccio qualche cosa ...OpenCL - OpenGL Prestazioni di interoperabilità
Il problema è che il "passaggio" è molto lento.
Se non si esegue alcun codice CL, è necessario solo passare. Ha circa 40 FPS sul mio GTS 450.
Se commento "clEnqueueAcquireGLObjects (..)" riga => nessun interruttore. Ha circa 600 FPS.
C'è un modo in cui posso accelerare?
Voglio chiedere anche Se questo è un problema solo con Nvidia o altri come Ati, Intel e alcuni SoC (ARM) hanno lo stesso problema di velocità?
Creazione di GL-CL texture:
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 Interoperabilità:
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;
}
ne dite di fare né e utilizzando un [oggetto recinzione sync] (http://www.opengl.org/wiki/Sync_Object)? –
Ho appena provato "flush" ed è lo stesso :(Le cose lente accadono in clEnqueueAcquireGLObjects() e clEnqueueReleaseGLObjects(). "Finish" o "Flush" non è un problema! – Milan
Nicol: Ma se uso "Sync Object". deve ancora chiamare clEnqueueAcquireGLObjects(), quindi penso che non sia la soluzione :( – Milan