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
- El método onFrameAvailable () de SurfaceTexture siempre se llama demasiado tarde
- ¿Hay algún punto en el uso de un búfer de índice con una textura en OpenGL ES (Android)?
- Fuente de luz dentro de una habitación que actúa inesperadamente
- Usando Tracer Para opengl en depurador android
- Opengl ES 1.1 / Android - La debacle de la textura-mapeo-a-uno-cuadrado de 2011
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?
- Animación esférica con texto para el uso de la nube de etiquetas en la aplicación para Android
- Cómo configurar / calcular texturebuffer en glTexCoordPointer al importar desde archivo OBJ
- Texturas que sólo se muestran en algunos dispositivos
- Problema en OpenGLRenderer: ruta de acceso demasiado grande para que se preste a una textura
- Texturas en OpenGL ES 2.0 para Android
- Android SIGSEGV al dibujar ruta mediante aceleración de hardware
- Procesamiento lento de lotes de modelos en libGDX
- Android poco convencional y desagradable durante el código de carga de JNI / OpenGL ES
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