13

コンテキスト ハンドルが main() からスレッドの関数に渡されるという事実を考慮して、main() から egl コンテキストを作成し、別のスレッドからレンダリングすることは許可されますか?

4

1 に答える 1

20

はい、そうです。

まず、1 つのスレッドでコンテキストを作成する必要があります。

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

次に、いずれかのスレッドからテクスチャを作成したり、シェーダーをロードしたりできます。

于 2012-08-04T05:42:34.560 に答える