Google se compromete a impulsar la igualdad racial para las comunidades afrodescendientes. Obtén información al respecto.

Manejo de conexión en caliente en Composer HAL

Las capacidades de visualización (como los modos de visualización y los tipos de HDR compatibles) pueden cambiar dinámicamente en dispositivos que tienen pantallas conectadas externamente (a través de HDMI o DisplayPort), como decodificadores de Android TV (STB) y over-the-top (OTT) dispositivos. Este cambio puede ocurrir como resultado de una señal de conexión en caliente HDMI, como cuando el usuario cambia de una pantalla a otra o inicia el dispositivo sin una pantalla conectada. Desde Android 12 en adelante, se han realizado cambios en el marco para manejar la conexión en caliente y las capacidades de visualización dinámica.

Esta página cubre cómo manejar las conexiones en caliente de pantalla y los cambios en las capacidades de visualización en la implementación de Composer HAL. Además, analiza cómo administrar el framebuffer asociado y prevenir condiciones de carrera en estas situaciones.

Actualización de las capacidades de visualización

Esta sección describe cómo el marco de Android maneja los cambios en las capacidades de visualización iniciados por Composer HAL.

Antes de Android puede manejar cambios en las capacidades de la pantalla correctamente, el OEM debe aplicar HAL Compositor tal que utiliza un onHotplug(display, connection=CONNECTED) para notificar el marco de cualquier cambio en las capacidades de visualización. Una vez que se implementa, Android maneja los cambios para mostrar las capacidades de la siguiente manera:

  1. Al detectar un cambio en las capacidades de visualización, el marco recibe un onHotplug(display, connection=CONNECTED) notificación.
  2. Al recibir la notificación, el marco deja caer su estado de visualización y lo vuelve a crear con las nuevas capacidades de la HAL mediante el uso de las getActiveConfig , getDisplayConfigs , getDisplayAttribute , getColorModes , getHdrCapabilities y getDisplayCapabilities métodos.
  3. Una vez que el marco recrea un nuevo estado de visualización, envía el onDisplayChanged devolución de llamada para las aplicaciones que están escuchando para tales eventos.

El marco reasigna las framebuffers sobre subsiguiente onHotplug(display, connection=CONNECTED) eventos. Ver Administrar la memoria framebuffer para obtener más información sobre cómo manejar esto.

Manejo de escenarios de conexión comunes

Esta sección cubre cómo manejar adecuadamente varios escenarios de conexión en sus implementaciones cuando la pantalla principal está conectada y desconectada.

Habiendo sido construido para dispositivos móviles, el marco de Android no tiene soporte integrado para una pantalla principal desconectada. En su lugar, HAL debe reemplazar la pantalla principal con una pantalla de marcador de posición en sus interacciones con el marco en el caso de que una pantalla principal esté físicamente desconectada.

Los siguientes escenarios pueden ocurrir en decodificadores y llaves de TV que tienen pantallas conectadas externamente que se pueden desconectar. Para implementar el soporte para estos escenarios, utilice la información de la siguiente tabla:

Guión Manejo
No hay pantalla conectada en el momento del arranque
  • Enviar un onHotplug(display, connection=CONNECTED) señal de la HAL Compositor al marco.
  • Reemplace el estado de visualización física dentro de Composer HAL con un estado de visualización de marcador de posición.

    Nota: Recomendamos que la pantalla de marcador de posición tenga un único modo compatible con una resolución de 1080x1920 y una frecuencia de actualización de 60 hz, ya que este modo de visualización es compatible con la mayoría de las aplicaciones.

La pantalla principal está conectada físicamente
La pantalla principal está físicamente desconectada
  • Enviar otro onHotplug(display, connection=CONNECTED) evento desde la HAL Compositor al marco.
  • Reemplace el estado de visualización física dentro de Composer HAL con un estado de visualización de marcador de posición. La pantalla marcador de posición debe tener un solo modo de visualización, de modo que el marco envía el onDisplayChanged devolución de llamada para aplicaciones (ya que el conjunto de modos soportados han cambiado). Este modo de pantalla única debe coincidir con el último modo activo de la pantalla física antes de la desconexión, por lo que las aplicaciones no reciben eventos de cambio de configuración .

Administrar la memoria de framebuffer

Cuando una pantalla ya conectado recibe una subsiguiente onHotplug(display, connection=CONNECTED) evento de notificación, el marco reasigna las framebuffers asociados a esta pantalla. Las implementaciones de dispositivos deben anticipar este comportamiento y administrar adecuadamente la memoria framebuffer. Utilice las siguientes pautas en su implementación:

  • Antes de enviar su posterior onHotplug(display, connection=CONNECTED) eventos de notificación, asegúrese de liberar a los mangos framebuffers por lo que el sistema puede cancelar la asignación adecuada de ellos, antes de la reasignación de ellos. Si la desasignación no se realiza correctamente, la reasignación puede fallar debido a la falta de memoria.

  • Recomendamos asignar un grupo de memoria dedicado para los framebuffers que esté separado del resto del búfer de memoria gráfica.

Esto es importante porque entre la desasignación y la reasignación de los framebuffers, un proceso de terceros puede intentar asignar la memoria gráfica. Si el framebuffer utiliza el mismo grupo de memoria gráfica y si la memoria gráfica está llena, el proceso de terceros puede ocupar la memoria gráfica previamente asignada por un framebuffer, dejando así memoria insuficiente para la reasignación del framebuffer (o posiblemente fragmentando el espacio de memoria) .

Uso de ID de configuración secuenciales para evitar condiciones de carrera

Las condiciones de carrera pueden surgir si el compositor Henri actualiza las configuraciones de visualización compatibles simultáneamente con el marco llamar setActiveConfig o setActiveConfigWithConstraints . La solución es implementar Composer HAL para usar ID secuenciales y evitar este problema.

Esta sección describe cómo pueden ocurrir las condiciones de carrera, seguida de detalles sobre cómo implementar Composer HAL para que use ID secuenciales para prevenir tales condiciones.

Considere la siguiente secuencia de eventos, cuando NO se asignan nuevos ID secuenciales a las nuevas configuraciones de pantalla, lo que provoca una condición de carrera:

  1. Los ID de configuración de pantalla admitidos son:

    • id = 1, 1080x1920 60Hz
    • id = 2, 50Hz 1080x1920
  2. El marco de trabajo llama setActiveConfig(display, config=1) .

  3. Al mismo tiempo, Composer HAL procesa un cambio de configuración de pantalla y actualiza su estado interno a un nuevo conjunto de configuraciones de pantalla, que se muestra a continuación:

    • id = 1, 2160x3840 60Hz
    • id = 2, 50Hz 2160x3840
    • id = 3, 1080x1920 60Hz
    • id = 4, 50Hz 1080x1920
  4. Compositor HAL envía un onHotplug evento para el marco, para notificar que el conjunto de modos soportados ha cambiado.

  5. El HAL Compositor recibe setActiveConfig(display, config=1) (de la etapa 2).

  6. Se desea, los interpreta HAL que el marco ha solicitado un cambio de configuración de 2160x3840 a 60 Hz, aunque en realidad 1080x1920 60hz.

El proceso que utiliza asignaciones de ID no secuenciales termina aquí con una mala interpretación del cambio de configuración deseado.

Configuración de Composer HAL para usar ID secuenciales

Para evitar tales condiciones de carrera, el OEM debe implementar Composer HAL de la siguiente manera:

  • Cuando Composer HAL actualiza las configuraciones de pantalla admitidas, asigna nuevas ID secuenciales a las nuevas configuraciones de pantalla.
  • Cuando el marco llama setActiveConfig o setActiveConfigWithConstraints con un ID de configuración no válido, el compositor Henri ignora la llamada.

Estos pasos sirven para prevenir condiciones de carrera como se muestra en la siguiente discusión.

Considere la siguiente secuencia de eventos, cuando se asignen nuevos ID secuenciales a las nuevas configuraciones de pantalla:

  1. Los ID de configuración de pantalla admitidos son:

    • id = 1, 1080x1920 60Hz
    • id = 2, 50Hz 1080x1920
  2. El marco de trabajo llama setActiveConfig(display, config=1) .

  3. Cuando se procesa un cambio de configuración de pantalla, el siguiente conjunto de ID de configuración se asigna a partir del siguiente entero no utilizado, que se muestra a continuación:

    • id = 3, 2160x3840 60Hz

    • id = 4, 50Hz 2160x3840

    • id = 5, 60Hz 1080x1920

    • id = 6, 50Hz 1080x1920

  4. El HAL Compositor envía un onHotplug evento para el marco, para notificar que el conjunto de modos soportados ha cambiado.

  5. El HAL Compositor recibe setActiveConfig(display, config=1) (de la etapa 2).

  6. Composer HAL ignora la llamada porque el ID ya no es válido.

  7. El marco recibe y procesa la onHotplug evento desde el paso 4. Se pone en la HAL Compositor utilizando las funciones getDisplayConfigs y getDisplayAttribute . Con estas funciones, el marco identifica el nuevo ID (5) para la resolución deseada y la frecuencia de actualización de 1080x1920 y 60Hz.

  8. El marco envía otro setActiveConfig evento con una identificación actualizada de 5.

  9. El HAL Compositor recibe setActiveConfig(display, config=5) de la etapa 5.

  10. El HAL interpreta correctamente que el marco ha solicitado un cambio de configuración a 1080x1920 60hz.

Como se muestra en el ejemplo anterior, el proceso que utiliza asignaciones de ID secuenciales garantiza que se evite la condición de carrera y se actualice el cambio de configuración de pantalla correcto.