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 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:
- 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, porque es común tener entre 20 y 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 códecs multimedia o la cámara.
- Admite las extensiones obligatorias
EGL_KHR_wait_sync
,GL_OES_texture_external
,EGL_ANDROID_image_native_buffer
yEGL_ANDROID_recordable
. Además, Hardware Composer v1.1 y superiores requieren la extensiónEGL_ANDROID_framebuffer_target
.
Se recomienda encarecidamente 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 funciones de EGL 1.5, consulte la especificación Khronos Releases 1.5 .
Cargando controlador
Android espera que las GPU disponibles para el sistema se conozcan 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 utiliza 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 dividido en tres binarios. Si el controlador OpenGL ES se envía en un binario, utilice 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 archivos binarios, utilice 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 OpenGL ES
Android 10 introduce un sistema de capas para GLES 2.0+. Las capas GLES son objetos compartidos disponibles desde 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 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 que apunte al punto de entrada de la capa.
Habilitar capas
Puede habilitar capas GLES por aplicación o globalmente. La configuración por aplicación persiste durante los reinicios, mientras que las propiedades globales se borran al reiniciar.
Para habilitar capas por aplicación :
# Enable layersadb shell settings put global enable_gpu_debug_layers 1
# Specify target appadb 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 layersadb 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 están funcionando en un dispositivo, ejecute $ atest CtsGpuToolsHostTestCases
.