在2个GLSurfaceViews之间共享EGL2.0上下文导致Android平板电脑上的EGL_BAD_ACCESS

时间:2012-01-13 03:23:02

标签: android opengl-es android-ndk opengl-es-2.0 glsurfaceview

我尝试通过以下代码分享2个GLSurfaceViews的EGL上下文:

createContext(EGL10 egl, EGLDisplay display, EGLConfig eglConfig) {
    EGLContext shared = ...; // a cached egl context
    int[] attrib_list = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL10.EGL_NONE };
    EGLContext context = egl.eglCreateContext(display, eglConfig, shared == null ? EGL10.EGL_NO_CONTEXT : shared,
        attrib_list);
    return context;
  }
}

代码适用于大多数Android手机(操作系统> = 2.2),但在所有经过测试的平板电脑上都失败了。

  

01-12 18:33:35.381:E / AndroidRuntime(12171):致命异常:GLThread 11

  01-12 18:33:35.381:E / AndroidRuntime(12171):java.lang.RuntimeException:eglMakeCurrent failed:EGL_BAD_ACCESS

  01-12 18:33:35.381:E / AndroidRuntime(12171):在android.opengl.GLSurfaceView $ EglHelper.throwEglException(GLSurfaceView.java:1146)

由于我声明了LOCAL_LDLIBS:= - lGLESv2,因此EGL是2.0上下文。

为什么它在平板电脑上失败(xoom,galaxy,lg,sony等)

感谢任何见解。

2 个答案:

答案 0 :(得分:2)

此失败的两个可能原因(来自EGL规范):

  • 如果ctx对某个其他线程是最新的,或者是绘制或读取 在另一个线程中绑定到上下文,EGL_BAD_ACCESS错误是 产生。
  • 如果绑定ctx会超过当前的数量 实现支持的客户端API类型的上下文,a 生成EGL_BAD_ACCESS错误。

也可能是您在平板电脑上使用的GPU不支持共享上下文。

答案 1 :(得分:0)

最有可能是以下行是GLSurfaceView中出错的原因。

public GL createSurface(SurfaceHolder holder) {
    ....

    /*
     * Before we can issue GL commands, we need to make sure
     * the context is current and bound to a surface.
     */
    if (!mEgl.eglMakeCurrent(mEglDisplay, mEglSurface, mEglSurface, mEglContext)) {
         throwEglException("eglMakeCurrent");
    }

}