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
- Zoom in OpenGL ES 2.0 - desapareciendo objeto
- Límites de memoria de Android Graphics
- Escribir una aplicación Java portátil utilizando JOGL y Android OpenGL
- Cómo dibujar círculo básico en OpenGL ES 2.0 Android
- Dónde almacenar código de sombreado en la aplicación para Android
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?
- ¿Qué tipo de efectos secundarios tiene libgdx numSamples?
- Ayuda para rectificar escalas de línea en Android OpenGL 2.0 con RQAR
- ¿Puede OpenGL ES renderizar texturas de dimensiones no básicas 2?
- OpenGL ES 3.0. Textura de punto flotante
- Mapeando una textura en un cuadrado: ¿Por qué se rota la imagen?
- Memoria insuficiente al asignar memoria nativa
- Android NDK OpenGL ES 2.0 Tono de textura
- Cómo hacer un Libgdx Bitmapfont de modo que es el color de los píxeles es la inversa del fondo?
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 });
- Android: el diálogo personalizado tarda demasiado tiempo en abrirse
- Instalar el apk de origen desconocido en ChromeOs