EGLSurfaces y OpenGL ES

Android usa la API OpenGL ES (GLES) para representar gráficos. Para crear contextos GLES y proporcionar un sistema de ventanas para las representaciones GLES, Android usa la biblioteca EGL . Las llamadas GLES renderizan polígonos texturizados, mientras que las llamadas EGL ponen renderizaciones en pantallas.

Antes de dibujar con GLES, debe crear un contexto GL. En EGL, esto significa crear un EGLContext y un EGLSurface. Las operaciones de GLES se aplican al contexto actual, al que se accede a través del almacenamiento local de subprocesos en lugar de pasarlo como un argumento. El código de representación debe ejecutarse en un subproceso GLES actual, no en el subproceso de la interfaz de usuario.

EGLSurfaces

EGLSurface puede ser un búfer fuera de pantalla asignado por EGL, llamado pbuffer , o una ventana asignada por el sistema operativo. Llamar a la función eglCreateWindowSurface() crea superficies de ventana EGL. eglCreateWindowSurface() toma un objeto de ventana como argumento, que en Android es una superficie. Una superficie es el lado del productor de un BufferQueue. Los consumidores , que son SurfaceView, SurfaceTexture, TextureView o ImageReader, crean superficies. Cuando llama a eglCreateWindowSurface() , EGL crea un nuevo objeto EGLSurface y lo conecta a la interfaz del productor del BufferQueue del objeto de ventana. A partir de ese momento, la representación en ese EGLSurface da como resultado que un búfer se retire de la cola, se procese y se ponga en cola para que lo use el consumidor.

EGL no proporciona llamadas de bloqueo/desbloqueo. Emita comandos de dibujo y luego llame a eglSwapBuffers() para enviar el marco actual. El nombre del método proviene del intercambio tradicional de búfer frontal y posterior, pero la implementación real puede ser diferente.

Solo se puede asociar una EGLSurface con una superficie a la vez (solo puede tener un productor conectado a una BufferQueue), pero si destruye la EGLSurface, se desconecta de la BufferQueue y permite que otra cosa se conecte.

Un subproceso dado puede cambiar entre múltiples EGLSurfaces cambiando lo que es actual . Una EGLSurface debe estar actualizada en solo un subproceso a la vez.

EGL no es otro aspecto de una superficie (como SurfaceHolder). EGLSurface es un concepto relacionado pero independiente. Puede dibujar en una EGLSurface que no está respaldada por una superficie y puede usar una superficie sin EGL. EGLSurface solo proporciona a GLES un lugar para dibujar.

Consulte el Documento de definición de compatibilidad de Android para conocer los requisitos de OpenGL ES y EGL.

ANativeWindow

La clase de superficie pública se implementa en el lenguaje de programación Java. El equivalente en C/C++ es la clase ANativeWindow, semiexpuesta por el NDK de Android . Puede obtener ANativeWindow de una superficie con la llamada ANativeWindow_fromSurface() . Al igual que su primo del lenguaje Java, puede bloquearlo, renderizarlo en software y desbloquearlo y publicarlo. El tipo de ventana nativo básico es el lado del productor de un BufferQueue.

Para crear una superficie de ventana EGL a partir de código nativo, pase una instancia de EGLNativeWindowType a eglCreateWindowSurface() . EGLNativeWindowType es un sinónimo de ANativeWindow, por lo que puede convertir uno en otro.