Implementando 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 OpenGL para dispositivos integrados.

Para ser compatible 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:

  • Garantizar que el controlador GL sea robusto y cumpla con los estándares OpenGL ES.
  • Permitiendo un número ilimitado de contextos GL. Debido a que Android permite aplicaciones en segundo plano e intenta mantener vivos los contextos GL, no debe limitar la cantidad de contextos en su controlador.
  • Tenga en cuenta la cantidad de memoria asignada para cada contexto, ya que es común tener de 20 a 30 contextos 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 de medios o la cámara.
  • Compatibilidad con 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 superior requieren la extensión EGL_ANDROID_framebuffer_target .

Se recomienda enfáticamente admitir también 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 nuevas características de EGL 1.5, consulte la Especificación de la versión 1.5 de Khronos .

Carga del controlador

Android espera que se conozcan las GPU disponibles para el sistema cuando se crea la imagen del sistema. Las rutas preferidas para los controladores 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 OpenGL ES debe enviarse en un binario o dividirse en tres binarios. Si el controlador OpenGL ES se envía en un binario, use uno de los siguientes nombres:

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

Si el controlador OpenGL ES se envía en tres binarios, use 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 presenta un sistema de capas para GLES 2.0+. Las capas GLES son objetos compartidos disponibles dentro de las aplicaciones o proporcionados por herramientas. Las capas GLES permiten que las aplicaciones depurables descubran y carguen capas utilizando los mismos mecanismos de configuración que Vulkan .

GLES LayerLoader, un componente dentro del cargador EGL, identifica las capas GLES. Para cada capa que encuentra GLES LayerLoader, GLES LayerLoader llama a AndroidGLESLayer_Initialize , recorre las listas de funciones de libEGL y llama a AndroidGLESLayer_GetProcAddress para todas las funciones conocidas. Si la capa intercepta una función, rastrea la dirección de la función. Si la capa no intercepta una función, AndroidGLESLayer_GetProcAddress devuelve la misma dirección de función que se pasó. Luego, LayerLoader actualiza la lista de enlaces de funciones para señalar el punto de entrada de la capa.

Habilitación de capas

Puede habilitar capas GLES por aplicación o globalmente. La configuración por aplicación persiste en los reinicios, mientras que las propiedades globales se borran al reiniciar.

Para habilitar capas por aplicación :

# 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 deshabilitar capas por aplicación :

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 capas globalmente :

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

Capas de prueba

Las capas GLES están respaldadas por Android CTS y deben pasar las pruebas CTS para dispositivos compatibles . Para identificar si las capas funcionan en un dispositivo, ejecute $ atest CtsGpuToolsHostTestCases .