AIDL para la HAL de Hardware Composer

A partir de Android 13, la HAL de Hardware Composer (HWC) se define en AIDL, y las versiones HIDL que van de android.hardware.graphics.composer@2.1 a android.hardware.graphics.composer@2.4 dejaron de estar disponibles.

En esta página, se describen las diferencias entre el AIDL y el HIDL HAL para el HWC, y la implementación y prueba del AIDL HAL.

Debido a las ventajas que ofrece AIDL, se recomienda a los proveedores que implementen la HAL de compositor AIDL a partir de Android 13 en lugar de la versión HIDL. Consulta la sección Implementación para obtener más información.

Diferencias entre los HAL de AIDL y HIDL

La nueva HAL de Composer de AIDL, llamada android.hardware.graphics.composer3, se define en IComposer.aidl. Expone una API similar a la HAL de HIDL android.hardware.graphics.composer@2.4 con los siguientes cambios:

  • Se quitó la cola de mensajes rápidos (FMQ) en favor de los comandos parcelables.

    La HAL de AIDL define la interfaz de comandos basada en tipos parcelables con escritura segura, a diferencia de los comandos serializados a través de FMQ en HIDL. Esto proporciona una interfaz estable para los comandos y una definición más legible de cómo se interpreta la carga útil del comando.

    El método executeCommands se define en IComposerClient.aidl como

    CommandResultPayload[] executeCommands(in DisplayCommand[] commands);
    

    donde cada comando es un tipo parcelable con escritura segura definido en DisplayCommand.aidl. Las respuestas de comandos son objetos Parcelable escritos de forma sólida que se definen en CommandResultPayload.aidl.

  • Se quita IComposerClient.getClientTargetSupport, ya que no hay clientes activos para este método.

  • Representación de colores como números de punto flotante en lugar de bytes para alinearse mejor con la pila de gráficos superior en Android, como se define en ASurfaceTransaction_setColor.

  • Se agregaron campos nuevos para controlar el contenido HDR.

    En el HAL de AIDL, las pilas de capas mixtas de SDR/HDR admiten la atenuación perfecta de las capas de SDR cuando una capa de HDR está simultáneamente en la pantalla.

    El campo brightness en LayerCommand permite que SurfaceFlinger especifique un brillo por capa, de modo que el HWC atenúe el contenido de la capa en el espacio de luz lineal, en lugar del espacio gamma.

    El campo brightness en ClientTargetPropertyWithBrightness permite que el HWC especifique el espacio de brillo para la composición del cliente y le indique a RenderEngine si debe atenuar las capas SDR en la composición del cliente.

    El campo dimmingStage permite que el HWC configure cuándo RenderEngine debe atenuar el contenido. Esto admite el ColorModes definido por el proveedor, que podría preferir atenuar en el espacio gamma para permitir mejoras de contraste definidas por el proveedor en sus canalizaciones de color.

  • Se agregó un nuevo tipo de composición DISPLAY_DECORATION en Composition.aidl para las decoraciones de pantalla.

    Algunos dispositivos tienen hardware dedicado para optimizar el dibujo de la máscara alfa que suaviza las esquinas redondeadas y los cortes en las pantallas. Los dispositivos con ese hardware deben implementar IComposerClient.getDisplayDecorationSupport para devolver una estructura DisplayDecorationSupport como se define en el nuevo DisplayDecorationSupport.aidl. Esta estructura describe las enumeraciones PixelFormat y AlphaInterpretation que requiere el dispositivo. Con esta implementación, la IU del sistema marca la capa de máscara alfa como DISPLAY_DECORATION, un nuevo tipo de composición que aprovecha el hardware dedicado.

  • Se agregó un nuevo campo expectedPresentTime a DisplayCommand.aidl.

    El campo expectedPresentTime permite que SurfaceFlinger establezca el tiempo de presentación esperado para el momento en que se debe mostrar el contenido actual en la pantalla. Con esta función, SurfaceFlinger envía un comando de presentación a la implementación con anticipación, lo que le permite canalizar más trabajo de composición.

  • Se agregaron nuevas APIs para controlar la configuración de la pantalla de inicio.

    Con BOOT_DISPLAY_CONFIG, los proveedores pueden especificar que se admite la configuración de pantalla de arranque. Los métodos setBootDisplayConfig, clearBootDisplayConfig y getPreferredBootDisplayConfig usan BOOT_DISPLAY_CONFIG de la siguiente manera:

    • Con setBootDisplayConfig, el framework informa a los proveedores sobre la configuración de pantalla del tiempo de arranque. Los proveedores deben almacenar en caché la configuración de pantalla de arranque y arrancar en esta configuración en el próximo reinicio. Si el dispositivo no puede iniciarse con esta configuración, el proveedor debe encontrar una configuración que coincida con la resolución y la frecuencia de actualización de esta configuración. Si no existe tal configuración, el proveedor debe usar su configuración de pantalla preferida.

    • Con clearBootDisplayConfig, el framework informa a los proveedores que borren la configuración de pantalla de inicio y que inicien el sistema con su configuración de pantalla preferida durante el próximo reinicio.

    • Con getPreferredBootDisplayConfig, el framework consulta el modo de arranque preferido del proveedor.

    Cuando no se admite la configuración de pantalla de arranque, estos métodos devuelven un valor de UNSUPPORTED.

  • Se agregaron nuevas APIs para controlar el temporizador de inactividad de la pantalla.

    • Con DISPLAY_IDLE_TIMER, los proveedores pueden especificar que implementaron un temporizador de inactividad para esta pantalla. Cuando está inactiva, esta capacidad cambia la frecuencia de actualización a un parámetro de configuración más bajo para conservar la batería. La plataforma usa setIdleTimerEnabled para controlar el tiempo de espera del temporizador y, en algunos casos, para inhabilitarlo y evitar cambios no deseados en la frecuencia de actualización cuando está inactivo.

    • El uso de la devolución de llamada IComposerCallback.onVsyncIdle indica a la plataforma que la pantalla está inactiva y que cambió la cadencia de vsync. La plataforma responde a esta devolución de llamada restableciendo su modelo vsync. Fuerza una resincronización de vsync en el siguiente fotograma y aprende la nueva cadencia de vsync.

Implementación

Los proveedores no tienen la obligación de implementar la HAL del AIDL para Android 13. Sin embargo, se recomienda que implementen el HAL de compositor de AIDL en lugar de la versión de HIDL para usar las nuevas funciones y APIs.

En los emuladores de Android, se implementa una implementación de referencia para la HAL de HWC de AIDL.

Prueba

Para probar tu implementación, ejecuta VtsHalGraphicsComposer3_TargetTest.