2012-07-30 10 views

Antwort

16

Ja, sicher ist.

Zuerst müssen Sie in einem Thread einen Kontext, in erstellen:

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

Dann in dem anderen Thread Sie einen gemeinsamen Kontext wie folgt erstellen:

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

Sie werden natürlich müssen haben einige Mutex/Semaphore, um alle Updates mit GLES zu synchronisieren. Zum Beispiel benötigen Sie einen

eglMakeCurrent(m_Display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); 

im Thread vor dem anderen Thread aufrufen tun

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

Dann können Sie Texturen, Last-Shadern erstellen usw. entweder Thread

+0

Hallo, ich Ich litt unter der Synchronisation von 2 OpenGL-Thread. Was soll ich neben dem makeCurrent erledigen? Gibt es Artikel, die diesen Punkt vorstellen? – dragonfly

+0

Für eine vollständige Probe können Sie diesen Quellcode betrachten: https://github.com/klhurley/EffectsManager/blob/master/src/Android/Renderer.cpp –

Verwandte Themen