Cómo implementar OpenGL ES y EGL

OpenGL es una API de gráficos multiplataforma que especifica una interfaz de software estándar para hardware de procesamiento de gráficos 3D. OpenGL ES es un subconjunto de la especificación de OpenGL para dispositivos incorporados.

Para ser compatibles con Android, los dispositivos deben proporcionar controladores para EGL, OpenGL ES 1.x y OpenGL ES 2.0. La compatibilidad con OpenGL ES 3.x es opcional. Las consideraciones clave incluyen lo siguiente:

  • Garantizar que el controlador GL sea sólido y cumpla con los estándares de OpenGL ES.
  • Permite una cantidad ilimitada de contextos de GL. Debido a que Android permite apps en segundo plano y trata de mantener activos los contextos de GL, no debes limitar la cantidad de contextos en tu controlador.
  • Ten en cuenta la cantidad de memoria asignada para cada contexto, ya que es común tener entre 20 y 30 contextos de GL activos a la vez.
  • Admite el formato de imagen YV12 y otros formatos de imagen YUV que provienen de otros componentes del sistema, como los códecs multimedia o la cámara.
  • Admite las extensiones obligatorias EGL_KHR_wait_sync, GL_OES_texture_external, EGL_ANDROID_image_native_buffer y EGL_ANDROID_recordable. Además, Hardware Composer v1.1 y versiones posteriores requieren la extensión EGL_ANDROID_framebuffer_target.

Se recomienda que también sea compatible con EGL_ANDROID_blob_cache, EGL_KHR_fence_sync y EGL_ANDROID_native_fence_sync.

Android 10 implementa la interfaz EGL 1.5. Para obtener información sobre las funciones nuevas en EGL 1.5, consulta la especificación de la versión 1.5 de Khronos.

Carga del controlador

Android espera que se conozcan las GPUs disponibles para el sistema cuando se compila la imagen del sistema. Las rutas preferidas para los controladores de OpenGL ES de 32 y 64 bits son /vendor/lib/egl y /vendor/lib64/egl, respectivamente. El cargador usa dos propiedades del sistema, ro.hardware.egl y ro.board.platform, o el nombre exacto para descubrir y cargar los controladores del sistema. El controlador de OpenGL ES se debe enviar en un objeto binario o dividirse en tres. Si el controlador de OpenGL ES se envía en un objeto binario, usa uno de los siguientes nombres:

libGLES_${ro.hardware.egl}.so
libGLES_${ro.board.platform}.so
libGLES.so

Si el controlador de OpenGL ES se envía en tres objetos binarios, usa uno de los siguientes conjuntos de nombres:

libEGL_${ro.hardware.egl}.so
libGLESv1_CM_${ro.hardware.egl}.so
libGLESv2_${ro.hardware.egl}.so

libEGL_${ro.board.platform}.so
libGLESv1_CM_${ro.board.platform}.so
libGLESv2_${ro.board.platform}.so

libEGL.so
libGLESv1_CM.so
libGLESv2.so

Capas de OpenGL ES

Android 10 introduce un sistema de capas para GLES 2.0 y versiones posteriores. Las capas de GLES son objetos compartidos disponibles desde las apps o proporcionados por herramientas. Las capas de GLES permiten que las apps depurables descubran y carguen capas con los mismos mecanismos de configuración que Vulkan.

GLES LayerLoader, un componente dentro del cargador de EGL, identifica las capas de GLES. Por cada capa que encuentra el LayerLoader de GLES, el LayerLoader de GLES llama a AndroidGLESLayer_Initialize, recorre la lista de funciones de libEGL y llama a AndroidGLESLayer_GetProcAddress para todas las funciones conocidas. Si la capa intercepta una función, hace un seguimiento de la dirección de la función. Si la capa no intercepta una función, AndroidGLESLayer_GetProcAddress muestra la misma dirección de función que le pasaron. Luego, LayerLoader actualiza la lista de contenido de las funciones para que apunte al punto de entrada de la capa.

Cómo habilitar las capas

Puedes habilitar esas capas por app o de forma global. La configuración por app persiste después de los reinicios, mientras que las propiedades globales se borran.

Para habilitar las capas por app, haz lo siguiente:

# Enable layers
adb shell settings put global enable_gpu_debug_layers 1

# Specify target app
adb shell settings put global gpu_debug_app package_name

# Specify layer list (from top to bottom)
adb shell settings put global gpu_debug_layers_gles layer1:layer2:...:layerN

# Specify packages to search for layers
adb shell settings put global gpu_debug_layer_app package1:package2:...:packageN

Para inhabilitar las capas por app, haz lo siguiente:

adb shell settings delete global enable_gpu_debug_layers
adb shell settings delete global gpu_debug_app
adb shell settings delete global gpu_debug_layer_app

Para habilitar las capas de forma global, sigue estos pasos:

# Attempts to load layers for all applications, including native executables
adb shell setprop debug.gles.layers layer1:layer2:...:layerN

Capas de prueba

Las capas de GLES están respaldadas por el CTS de Android y deben aprobar las pruebas de CTS para dispositivos compatibles. Para identificar si las capas están funcionando en un dispositivo, ejecuta $ atest CtsGpuToolsHostTestCases.