Совместное использование контекста EGL2.0 между двумя GLSurfaceViews вызвало EGL_BAD_ACCESS на планшетах Android

Я пытаюсь разделить контекст EGL bwteen 2 GLSurfaceViews следующим кодом:

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 (OS> = 2.2), но не удался на всех тестируемых планшетах.

01-12 18: 33: 35.381: E / AndroidRuntime (12171): FATAL EXCEPTION: GLThread 11

01-12 18: 33: 35.381: E / AndroidRuntime (12171): java.lang.RuntimeException: eglMakeCurrent не удалось: EGL_BAD_ACCESS

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

Поскольку я объявлял LOCAL_LDLIBS: = -lGLESv2, EGL представляет собой 2.0-контекст.

Почему это не удалось на планшетах (xoom, galaxy, lg, sony и т. Д.)

Любое понимание очень ценится.

Две возможные причины этого отказа (из спецификации EGL):

  • Если ctx является текущим для какого-либо другого потока, или если рисование или чтение привязаны к контекстам в другом потоке, генерируется ошибка EGL_BAD_ACCESS.
  • Если привязка ctx превысит количество текущих контекстов этого типа API-клиента, поддерживаемых реализацией, генерируется ошибка EGL_BAD_ACCESS.

Также может быть, что графический процессор, который вы используете на планшетах, не поддерживает общий контекст.

Скорее всего, следующие строки являются причиной ошибки в 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"); } }