Разделение контекста EGL2.0 между двумя GLSurfaceViews вызвало EGL_BAD_ACCESS на планшетах Android - PullRequest
5 голосов
/ 13 января 2012

Я пытаюсь поделиться контекстом EGL между двумя 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): ИСКЛЮЧИТЕЛЬНОЕ ИСКЛЮЧЕНИЕ: 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): в android.opengl.GLSurfaceView $ EglHelper.throwEglException (GLSurface)1011 *

Поскольку я объявил LOCAL_LDLIBS: = -lGLESv2, EGL является контекстом 2.0.

Почему он не работает на планшетах (xoom, galaxy, lg, sony и т. Д.)

Любое понимание приветствуется.

Ответы [ 2 ]

2 голосов
/ 13 января 2012

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

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

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

0 голосов
/ 13 января 2012

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

}
...