Implementa 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 de GL sea sólido y cumpla con los estándares de OpenGL ES
  • Se permite una cantidad ilimitada de contextos de GL. Dado que Android permite que las apps se ejecuten 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 a 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 de medios 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.

También se recomienda admitir 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 conductor

Android espera que las GPUs disponibles para el sistema se conozcan 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 debe enviarse en un solo objeto binario o dividirse en tres. Si el controlador de OpenGL ES se incluye en un solo archivo 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 incluye en tres archivos 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.

LayerLoader de GLES, un componente dentro del cargador de EGL, identifica las capas de GLES. Por 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, hace un seguimiento de 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 le pasó. 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 globalmente, haz lo siguiente:

# 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 del CTS para los dispositivos compatibles. Para identificar si las capas funcionan en un dispositivo, ejecuta $ atest CtsGpuToolsHostTestCases.