Compartir recursos entre el contexto de OpenGL en Android

Estoy tratando de utilizar múltiples contextos EGL para cargar texturas fuera de mi hilo principal. Estoy recibiendo un error EGL_BAD_CONTEXT después de mi llamada eglCreateContext .

Dentro de mi android.opengl.Renderer

 public void onSurfaceCreated (javax.microedition.khronos.opengles.GL10 gl, EGLConfig config) { // ... EGLContext sharedContext = egl.getCurrentContext(); EGLDisplay display = eglGetCurrentDisplay(); eglCreateContext(display, config, sharedContext, new int[] { EGL_CONTEXT_CLIENT_VERSION, 2 } ); } 

El EGL_BAD_CONTEXT me lleva a la documentación aquí , que dice

EGL_BAD_CONTEXT se genera si share_context no es un contexto de representación EGL del mismo tipo de API de cliente que el contexto creado recientemente y no es EGL_NO_CONTEXT.

Es por eso que EGL_CONTEXT_CLIENT_VERSION en el parámetro EGL_CONTEXT_CLIENT_VERSION , pero parece que no produjo ningún efecto.

Lo que estoy viendo es que, a pesar de que estoy recibiendo este error, el contexto parece semi-válido. Puedo usarlo en otro hilo

 egl.eglMakeCurrent(display, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, context); 

Después de esto, crear texturas en ese subproceso no causa un error. Pero veo que los nombres de textura no se comparten, cada hilo parece contar hasta desde 0 sí mismo.


Mi siguiente suposición fue que necesito compartir la superficie entre contextos. Pero, si paso a través de la misma superficie del contexto original en mi eglMakeCurrent , pero fallo completamente con

 E/AndroidRuntime(3210): java.lang.IllegalArgumentException E/AndroidRuntime(3210): at com.google.android.gles_jni.EGLImpl._eglCreateContext(Native Method) E/AndroidRuntime(3210): at com.google.android.gles_jni.EGLImpl.eglCreateContext(EGLImpl.java:54) 

Me siento como si estuviera casi allí, ¿alguien sabe lo que falta?

Resulta, gracias a alguna ayuda de esta pregunta :

Mi contexto secundario requiere una superficie. No es lo mismo que la superficie del contexto original.

Necesitaba crear esa nueva superficie usando eglCreatePbufferSurface . La razón de mis intentos con esto había fallado antes es que por defecto a una anchura y altura de 0. Al establecer que a una superficie 1×1, funcionó perfectamente.

 egl.eglCreatePbufferSurface(display, config, new int[] { EGL10.EGL_WIDTH, 1, EGL10.EGL_HEIGHT, 1, EGL10.EGL_NONE }); 
  • La GPU del emulador no funciona
  • Obtener información de GPU en Android sin SurfaceView
  • Transformación de perspectiva
  • Combinación Android de OpenGL de SurfaceTexture (imagen externa) y textura ordinaria
  • Android Opengl ES Número máximo de texturas
  • ¿Cómo aprender y usar OpenGL ES 2.0? Simplemente no lo entiendo - Qn serio.
  • GLSurfaceView onDrawFrame comportamiento de borrado
  • Vista previa de la cámara más rápida con OpenGL?
  • ¿Cómo se muestra fps con opengl es (android)
  • ¿Cómo puedo extraer las normales, las texturas, los vértices, los índices del archivo .obj de la licuadora al archivo .h?
  • Problema en OpenGLRenderer: ruta de acceso demasiado grande para que se preste a una textura
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.