android opengl es在两个线程上运行的两个上下文之间共享纹理

时间:2015-05-26 09:29:29

标签: android c++ multithreading opengl-es

主要目标:

在一个线程中创建纹理。在另一个线程中使用纹理。

到目前为止我做了什么。

  1. 我创建了两个上下文和两个表面。并在主线程中使context1和surface1成为当前的。

        surface1 = eglCreateWindowSurface(display, config, engine->app->window, NULL);
        context1 = eglCreateContext(display, config, NULL, attribList);
        context2 = eglCreateContext(display, config, context1, attribList);
    
        eglMakeCurrent(display, surface1, surface1, context1)
    
        eglQuerySurface(display, surface1, EGL_WIDTH, &w);
        eglQuerySurface(display, surface1, EGL_HEIGHT, &h);
    
        EGLint attribpbf[] =
        {
                EGL_HEIGHT, h,
                EGL_WIDTH, w,
                EGL_NONE
        };
    
        surface2 = eglCreatePbufferSurface(display, config, attribpbf);
    
  2. 现在我创建了一个新线程,在该线程中我将context2和surface2设为当前。

    eglMakeCurrent(display, surface2, surface2, context2);
    
  3. 然后我创建了一个纹理并对纹理进行了一些渲染,然后我做了glFlush();

  4. 我在这里查了一下,纹理已成功创建。

  5. 之后尝试将此纹理用作主线程中的纹理附件。但结果是一个黑色的空白屏幕。没有GL错误。我认为纹理没有成功共享。

  6. 请你告诉我我做错了什么。有些情况下无法分享纹理。

1 个答案:

答案 0 :(得分:0)

我认为你遇到了同步问题,这意味着你在context1中渲染纹理,然后你在context2中立即查询纹理内容,但你发布到context1的命令还没有完成。

也许你可以在context1的命令缓冲区放置一个栅栏并等待context2中的完成

参考: https://www.khronos.org/registry/OpenGL-Refpages/gl4/html/glFenceSync.xhtml