2012-07-30 33 views
9

arasında paylaşılabilir Içerik kolları ana() iş parçacığının işlevinden geçirildiği gerçeği göz önüne alındığında, main() öğesinden egl bağlamı oluşturma ve başka bir iş parçacığından oluşturma izni var mı?egl - Bağlam, konu başlıkları

cevap

16

Evet, tabi ki.

Önce bir iş parçacığı bir bağlam oluşturmak gerekir:

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

Elbette olması gerekir:

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

Sonra diğer dizisindeki böyle bir ortak bağlam oluşturmak GLES ile yapmak istediğiniz güncellemeleri senkronize etmek için bazı mutex/semaphores. Mesela sen Sonra iplik

+0

Merhaba birinden vb dokular, yük gölgelendiricileri oluşturabilir

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

çağırabilir diğer parçacığı önce iplik içinde

eglMakeCurrent(m_Display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT); 

yapmanız gereken, ben 2 opengl iplik senkronizasyonundan acı çekiyorum. MakeCurrent'ın yanı sıra, başkalarının neye dikkat etmeliyim? Bu noktayı sunan bazı makaleler var mı? – dragonfly

+0

Tam bir örnek için şu kaynak koduna bakabilirsiniz: https://github.com/klhurley/EffectsManager/blob/master/src/Android/Renderer.cpp –