2013-07-27 15 views
5

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; 
} 

risposta

2

Stessa domanda simile come ha chiesto in questa discussione: LINK

Si tratta di un problema nel driver di soli nVIDIA + Windows. Non AMD, non Intel, e non in Linux. Ma, come il commento di @ user2725937 dice:

It is reported to nVIDIA and fixed in 331.xx beta drivers 
-1

sulla vostra piattaforma, glFinish e clFinish potrebbe non essere necessaria qui. Prova a utilizzare glFlush e clFlush invece.

Dipende molto dalla piattaforma, come indicato nelle specifiche di estensione CL/GL. Le specifiche dicono che Finish è l'unico modo completamente portatile, ma possono esistere alternative più veloci.

Su Mac OS X, ad esempio, è necessario solo glFlushRenderAPPLE e non clEnqueueAcquireGLObjects quando si passa da GL a CL, e poi solo clFlush e non clEnqueueReleaseGLObjects quando si passa di nuovo a GL.

+3

ne dite di fare né e utilizzando un [oggetto recinzione sync] (http://www.opengl.org/wiki/Sync_Object)? –

+0

Ho appena provato "flush" ed è lo stesso :(Le cose lente accadono in clEnqueueAcquireGLObjects() e clEnqueueReleaseGLObjects(). "Finish" o "Flush" non è un problema! – Milan

+0

Nicol: Ma se uso "Sync Object". deve ancora chiamare clEnqueueAcquireGLObjects(), quindi penso che non sia la soluzione :( – Milan

Problemi correlati