【问题标题】:android opengl es sharing texture between two contexts running on two threadsandroid opengl es 在两个线程上运行的两个上下文之间共享纹理
【发布时间】:2015-05-26 09:29:28
【问题描述】:

主要目标:

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

到目前为止我做了什么。

  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错误。我认为纹理没有成功共享。

你能告诉我我做错了什么吗?是否存在无法共享纹理的情况。

【问题讨论】:

  • 您可以尝试在主线程中调用glIsTexture()。这会告诉你纹理是否被共享。尽管如此,我认为你应该从glGetError() 那里得到一个错误,如果它根本没有共享的话。
  • 不走运.. glIsTexture 返回 GL_TRUE 并且没有 gl 错误。这是否意味着共享着色器没有问题??
  • 这使得纹理本身或您使用它的方式更有可能出现问题。如果您在主线程中使用相同的代码创建相同的纹理,它是否有效?
  • 是的,一切都在主线程中使用相同的代码完美运行。此外,如果我尝试在第二个线程中获取生成的纹理,它看起来也不错。
  • 很难说。我的意思是:glFlush() 还不够。如果您可以使用 ES 3.x,您将需要 glFinish() 或某种栅栏。

标签: android c++ multithreading opengl-es


【解决方案1】:

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

也许你可以在 context1 的命令缓冲区上设置一个栅栏,然后在 context2 中等待完成

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-03
    • 2012-08-14
    • 2018-10-01
    • 2011-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多