2012-07-30 20 views

risposta

16

Sì, lo è.

In primo luogo è necessario creare un contesto in in un thread:

EGLint contextAttrs[] = { 
    EGL_CONTEXT_CLIENT_VERSION, 2, 
    EGL_NONE 
}; 

LOG_INFO("creating context"); 
if (!(m_Context = eglCreateContext(m_Display, m_Config, 0, contextAttrs))) 
{ 
    LOG_ERROR("eglCreateContext() returned error %d", eglGetError()); 
    return false; 
} 

Poi in altro thread si crea un contesto condiviso come questo:

EGLint contextAttrs[] = 
    { 
     EGL_CONTEXT_CLIENT_VERSION, 2, 
     EGL_NONE 
    }; 

    if (m_Context == 0) 
    { 
     LOG_ERROR("m_Context wasn't initialized for some reason"); 
    } 

    // create a shared context for this thread 
    m_LocalThreadContext = eglCreateContext(m_Display, m_Config, m_Context, contextAttrs); 

Avrete ovviamente avere alcuni mutex/semafori per sincronizzare tutti gli aggiornamenti che vuoi fare con GLES. Per esempio è necessario fare un

eglMakeCurrent(m_Display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); 

all'interno del filo prima che l'altro thread può chiamare

if (!eglMakeCurrent(m_Display, m_Surface, m_Surface, m_Context)) 
{ 
    LOG_ERROR("eglMakeCurrent() returned error %d", eglGetError()); 
} 

Quindi è possibile creare texture, shader di carico, ecc sia da filo

+0

Ciao, Sono affetto dalla sincronizzazione di 2 thread opengl. Oltre al makeCurrent, di quali altri dovrei occuparmi? Ci sono alcuni articoli che introducono questo punto? – dragonfly

+0

Per un esempio completo è possibile consultare questo codice sorgente: https://github.com/klhurley/EffectsManager/blob/master/src/Android/Renderer.cpp –

Problemi correlati