Cómo implementar OpenGL ES y EGL

OpenGL es un entorno de gráficos multiplataforma API que especifica un software estándar para hardware de procesamiento de gráficos 3D. OpenGL ES es un subconjunto del Especificación de OpenGL para dispositivos incorporados.

Para ser compatibles con Android, los dispositivos proporcionar controladores para EGL, OpenGL ES 1.x y OpenGL ES 2.0. Asistencia para 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.
  • Se permite una cantidad ilimitada de contextos de GL. Como Android permite apps en segundo plano e intenta mantener activos los contextos de GL, limitar la cantidad de contextos en tu conductor.
  • Tener en cuenta la cantidad de memoria asignada a cada contexto, porque es común tener entre 20 y 30 contextos de GL activos a la vez.
  • Compatibilidad con el formato de imagen YV12 y otros formatos de imagen YUV que vienen de otros componentes del sistema, como códecs multimedia 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 versiones posteriores requieren el elemento EGL_ANDROID_framebuffer_target .

Te recomendamos que también admitas 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 de EGL 1.5, consulta la especificación de la versión 1.5 de Khronos.

Cargando controlador

Android espera que se conozcan las GPU disponibles para el sistema cuando este cómo se compila esta imagen. Las rutas preferidas para los controladores de OpenGL ES de 32 y 64 bits son las siguientes: /vendor/lib/egl y /vendor/lib64/egl respectivamente. El cargador usa dos propiedades del sistema: ro.hardware.egl y ro.board.platform, o el mismo para descubrir y cargar los controladores del sistema. El controlador de OpenGL ES debe tener enviarse en un objeto binario o dividirse en tres. Si la biblioteca OpenGL ES El controlador 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 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 o superior. Las capas de GLES son objetos compartidos disponibles dentro de las apps o proporcionados por con herramientas de visualización. Las capas de GLES permiten que apps depurables descubran y carguen capas con el con los mismos mecanismos de configuración Vulkan

GLES LayerLoader, un componente del cargador EGL, identifica capas de GLES. Por cada capa que GLES LayerLoader encuentra, 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 función. dirección de correo electrónico. Luego, LayerLoader actualiza la lista de hooks de funciones a apuntan al punto de entrada de la capa.

Cómo habilitar las capas

Puedes habilitar esas capas por app o de forma global. Configuración por app persisten 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 pasar las pruebas del CTS para dispositivos compatibles. Para identificar si las capas funcionan en un dispositivo, ejecuta $ atest CtsGpuToolsHostTestCases.