EGL - 上下文是否可以在线程之间共享?

13

在从main()创建egl上下文并从另一个线程进行渲染的情况下,是否允许传递上下文句柄从main()到线程函数中?

1个回答

21
是的,当然可以。
首先你需要在一个线程中创建一个上下文:
   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;
}

然后在另一个线程中,您可以创建一个共享上下文,方法如下:
    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);

当然,您需要一些互斥锁/信号量来同步您想要使用GLES进行的任何更新。例如,您需要执行

eglMakeCurrent(m_Display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);

在另一个线程调用之前,在线程内部

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

然后您可以从任何一个线程创建纹理,加载着色器等等。


嗨,我遇到了两个OpenGL线程同步的问题。除了makeCurrent之外,还有哪些需要注意的地方吗? 有没有一些介绍这个问题的文章? - dragonfly
您可以查看以下源代码以获取完整示例:https://github.com/klhurley/EffectsManager/blob/master/src/Android/Renderer.cpp - Kenneth Hurley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接