Разделяете контекст и текстуры GLES20 между разными GLSurfaceViews? - PullRequest
4 голосов
/ 15 апреля 2011

Можно ли совместно использовать контекст GLES20 между различными GLSurfaceViews (в рамках одного занятия)?В качестве альтернативы, как можно разделить набор текстур между различными GLSurfaceViews?

В iOS, если вы хотите сохранить память и повторно использовать (большие) текстуры в различных поддерживаемых CAEAGLLayer UIViews, вы можете передавать объект EAGLContext междуих или использовать различные EAGLContexts, которые совместно используют общий объект EAGLSharegroup.

Интересно, как это сделать на Android.Есть ли какой-либо эквивалентный метод?

Edit1

Первоначальное предложение реализовать собственную EGLContextFactory, которая будет возвращать тот же EGLContext, не работает, так как все GLSurfaceViews отправляетрендеринг в собственный приватный поток рендеринга gl и совместное использование одного и того же EGLContext между разными потоками невозможен.

Перефразируя мой первоначальный вопрос: у вас есть несколько GLSurfaceViews на одном экране (одно действие), и вам нужно получить доступ кнабор общих, но больших текстур в отдельных EGLContext каждой поверхности, но загрузка ваших текстур в несколько раз превышает объем памяти вашего устройства.Как бы вы тогда поделились своими текстурами между GLSurfaceViews?

Ответы [ 2 ]

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

Следующий код работает на некоторых устройствах, но не на всех:

public EGLContext createContext(EGL10 egl, EGLDisplay display, EGLConfig eglConfig) {
    EGLContext shared = .....;

    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;
  }
}
0 голосов
/ 15 апреля 2011

Похоже, что setEGLContextFactory позволяет использовать один и тот же контекст GLES20 между различными GLSurfaceViews.

псевдокод:

private class MyEGLContextFactory implements EGLContextFactory {
    private static EGLContext mEGLContext;

    public EGLContext createContext(EGL10 egl, EGLDisplay display, EGLConfig config) {
        /* create EGLContext for GLES20 in first time */
        return mEGLContext;
    }

    public void destroyContext(EGL10 egl, EGLDisplay display,
            EGLContext context) {
    }
}
...