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

Implementación de Hardware Composer HAL

El hardware Compositor (HWC) HAL composites capas recibidas de SurfaceFlinger, reduciendo la cantidad de composición OpenGL ES (GLES) y la GPU realizan.

El HWC abstrae objetos, como superposiciones y blitters 2D, a superficies compuestas y se comunica con hardware especializado en composición de ventanas para componer ventanas. Use el HWC para componer ventanas en lugar de tener SurfaceFlinger compuesto con la GPU. La mayoría de las GPU no están optimizadas para la composición, y cuando la GPU compone capas de SurfaceFlinger, las aplicaciones no pueden usar la GPU para su propia representación.

Las implementaciones de HWC deben admitir:

  • Al menos cuatro superposiciones:
    • Barra de estado
    • Barra del sistema
    • Aplicación
    • Fondo de pantalla / fondo
  • Capas que son más grandes que la pantalla (por ejemplo, un fondo de pantalla)
  • Mezcla alfa simultánea premultiplicada por píxel y combinación alfa por plano
  • Ruta de hardware para reproducción de video protegida
  • Orden de empaque RGBA, formatos YUV y propiedades de mosaico, swizzling y stride

Para implementar el HWC:

  1. Implemente un HWC no operativo y envíe todo el trabajo de composición a GLES.
  2. Implemente un algoritmo para delegar la composición al HWC de forma incremental. Por ejemplo, delegue solo las primeras tres o cuatro superficies al hardware de superposición del HWC.
  3. Optimice la HWC. Esto puede incluir:
    • Seleccionar superficies que maximicen la carga quitada de la GPU y enviarlas al HWC.
    • Detectando si la pantalla se está actualizando. Si no es así, delegue la composición a GLES en lugar de al HWC para ahorrar energía. Cuando la pantalla se actualice de nuevo, continúe descargando la composición al HWC.
    • Preparación para casos de uso comunes como:
      • La pantalla de inicio, que incluye la barra de estado, la barra del sistema, la ventana de la aplicación y fondos de pantalla en vivo.
      • Juegos de pantalla completa en modo vertical y horizontal
      • Video de pantalla completa con subtítulos y control de reproducción
      • Reproducción de video protegida
      • Multiventana de pantalla dividida

Primitivas HWC

El HWC ofrece dos primitivas, capas y pantallas , para representar el trabajo composición y su interacción con el hardware de visualización. El HWC también proporciona control sobre VSYNC y una devolución de llamada para notificar a SurfaceFlinger a que cuando se produce un evento de VSYNC.

Interfaz HIDL

Android 8.0 y superiores utiliza un HIDL interfaz llamada HAL Compositor para IPC revestidas con un aglutinante entre la HWC y SurfaceFlinger. El HAL Compositor reemplaza el legado hwcomposer2.h interfaz. Si los proveedores proporcionan una implementación de Composer HAL de HWC, Composer HAL acepta directamente llamadas HIDL de SurfaceFlinger. Si los vendedores proporcionan una implementación legado de la HWC, compositor cargas HAL funcionan los punteros de hwcomposer2.h , reenvío de llamadas en llamadas HIDL puntero de función.

El HWC proporciona funciones para determinar las propiedades de una pantalla determinada; para cambiar entre diferentes configuraciones de pantalla (como resolución 4k o 1080p) y modos de color (como color nativo o verdadero sRGB); y para encender, apagar o poner la pantalla en modo de bajo consumo si es compatible.

Punteros de función

Si los proveedores implementan Composer HAL directamente, SurfaceFlinger llama a sus funciones a través de HIDL IPC. Por ejemplo, para crear una capa, SurfaceFlinger llama createLayer() en la HAL Compositor.

Si proveedores implementan la hwcomposer2.h interfaz, llamadas compositor Henri en hwcomposer2.h punteros de función. En hwcomposer2.h comentarios, funciones de interfaz de HWC se conocen por los nombres lowerCamelCase que no existen en la interfaz como campos nombrados. Casi todas las funciones se carga mediante la solicitud de un puntero de función usando getFunction proporcionada por hwc2_device_t . Por ejemplo, la función createLayer es un puntero de función de tipo HWC2_PFN_CREATE_LAYER , que se devuelve cuando el valor enumerado HWC2_FUNCTION_CREATE_LAYER se pasa a getFunction .

Para obtener documentación detallada sobre las funciones de HAL compositor y la función de paso a través HWC funciones, consulte composer . Para obtener documentación detallada sobre los punteros de función HWC, ver el hwcomposer2.h .

Tiradores de capa y visualización

Las capas y las pantallas se manipulan mediante identificadores generados por la HWC. Los mangos son opacos para SurfaceFlinger.

Cuando SurfaceFlinger crea una nueva capa, que llama createLayer , que devuelve el tipo de Layer para las implementaciones directas o hwc2_layer_t para las implementaciones de paso a través. Cuando SurfaceFlinger modifica una propiedad de esa capa, SurfaceFlinger pasa el hwc2_layer_t valor en la función de modificación apropiada junto con cualquier otra información necesaria para hacer la modificación. El hwc2_layer_t tipo es lo suficientemente grande como para contener o bien un puntero o un índice.

Las pantallas físicas se crean mediante conexión en caliente. Cuando una pantalla física se conecta en caliente, el HWC crea un identificador y pasa el identificador a SurfaceFlinger a través de la devolución de llamada de conexión en caliente. Pantallas virtuales son creados por SurfaceFlinger llamando createVirtualDisplay() para solicitar una pantalla. Si la HWC admite la composición de pantalla virtual, devuelve un identificador. Luego, SurfaceFlinger delega la composición de las pantallas al HWC. Si el HWC no admite la composición de pantalla virtual, SurfaceFlinger crea el identificador y compone la pantalla.

Mostrar operaciones de composición

Una vez por VSYNC, SurfaceFlinger se activa si tiene contenido nuevo para componer. Este nuevo contenido puede ser un búfer de imagen nuevo de aplicaciones o un cambio en las propiedades de una o más capas. Cuando SurfaceFlinger lo despierta:

  1. Maneja transacciones, si están presentes.
  2. Bloquea nuevos búferes gráficos, si están presentes.
  3. Realiza una nueva composición, si el paso 1 o 2 resultó en un cambio en el contenido de la pantalla.

Para realizar una nueva composición, SurfaceFlinger crea y destruye capas o modifica los estados de las capas, según corresponda. También actualiza capas con sus contenidos actuales, utilizando llamadas como setLayerBuffer o setLayerColor . Después de todas las capas se actualizan, SurfaceFlinger llama validateDisplay , que cuenta la HWC para examinar el estado de las capas y determinar cómo la composición procederá. De forma predeterminada, SurfaceFlinger intenta configurar cada capa de modo que la capa esté compuesta por el HWC; aunque en algunas circunstancias, SurfaceFlinger compone capas a través del respaldo de la GPU.

Después de la llamada a validateDisplay , SurfaceFlinger llama getChangedCompositionTypes para ver si el HWC quiere cualquiera de los tipos de composición de capa cambiado antes de realizar la composición. Para aceptar los cambios, SurfaceFlinger llama acceptDisplayChanges .

Si hay capas marcadas para la composición de SurfaceFlinger, SurfaceFlinger las combina en el búfer de destino. SurfaceFlinger continuación, llama setClientTarget para dar el tampón a la pantalla de manera que la memoria intermedia se puede visualizar en la pantalla o composited adicionalmente con capas que no han sido marcados para la composición SurfaceFlinger. Si no hay capas marcadas para la composición de SurfaceFlinger, SurfaceFlinger omite el paso de composición.

Por último, llama a SurfaceFlinger presentDisplay para contar la HWC para completar el proceso de composición y visualizar el resultado final.

Varias pantallas

Android 10 admite varias pantallas físicas. Al diseñar una implementación de HWC pensada para su uso en Android 7.0 y superior, existen algunas restricciones que no están presentes en la definición de HWC:

  • Se supone que hay exactamente una pantalla interna. La pantalla interna es la pantalla que informa el hotplug inicial durante el arranque. Una vez que la pantalla interna está conectada en caliente, no se puede desconectar.
  • Además de la pantalla interna, se puede conectar en caliente cualquier cantidad de pantallas externas durante el funcionamiento normal del dispositivo. El marco supone que todos los hotplugs después de la primera pantalla interna son pantallas externas, por lo que si se añaden las pantallas más internos, que están categorizadas incorrectamente como Display.TYPE_HDMI en lugar de Display.TYPE_BUILT_IN .

Si bien las operaciones de SurfaceFlinger descritas anteriormente se realizan por pantalla, se realizan de forma secuencial para todas las pantallas activas, incluso si se actualiza el contenido de una sola pantalla.

Por ejemplo, si se actualiza la pantalla externa, la secuencia es:

// In Android 9 and lower:

// Update state for internal display
// Update state for external display
validateDisplay(<internal display>)
validateDisplay(<external display>)
presentDisplay(<internal display>)
presentDisplay(<external display>)

// In Android 10 and higher:

// Update state for internal display
// Update state for external display
validateInternal(<internal display>)
presentInternal(<internal display>)
validateExternal(<external display>)
presentExternal(<external display>)

Composición de pantalla virtual

La composición de la pantalla virtual es similar a la composición de la pantalla externa. La diferencia entre la composición de la pantalla virtual y la composición de la pantalla física es que las pantallas virtuales envían la salida a un búfer de Gralloc en lugar de a la pantalla. Hardware Composer (HWC) escribe la salida en un búfer, proporciona el límite de finalización y envía el búfer a un consumidor (como el codificador de video, GPU, CPU, etc.). Las pantallas virtuales pueden usar 2D / blitter o superposiciones si la canalización de la pantalla escribe en la memoria.

Modos

Cada marco está en uno de tres modos después de SurfaceFlinger llama a la validateDisplay() método HWC:

  • GLES - La GPU composites todas las capas, escrito directamente al buffer de salida. El HWC no participa en la composición.
  • MIXTO - La GPU composites algunas capas para el uso de este dispositivo y HWC composites el uso de este dispositivo y las capas restantes, escribiendo directamente al buffer de salida.
  • HWC - HWC composites todas las capas y escribe directamente en la memoria intermedia de salida.

Formato de salida

Los formatos de salida del búfer de pantalla virtual dependen de su modo:

  • Modo GLES - El conductor EGL establece el formato de búfer de salida en dequeueBuffer() , típicamente RGBA_8888 . El consumidor debe poder aceptar el formato de salida que establece el controlador o no se podrá leer el búfer.
  • Los modos mixtos y HWC - Si el consumidor tiene acceso a la CPU, el consumidor establece el formato. De lo contrario, el formato se IMPLEMENTATION_DEFINED y Gralloc establece el mejor formato basado en los indicadores de uso. Por ejemplo, Gralloc establece un formato YCbCr si el consumidor es un codificador de video y HWC puede escribir el formato de manera eficiente.

Vallas de sincronización

Las vallas de sincronización (sync) son un aspecto crucial del sistema de gráficos de Android. Las vallas permiten que el trabajo de la CPU proceda de forma independiente del trabajo simultáneo de la GPU, bloqueando solo cuando hay una verdadera dependencia.

Por ejemplo, cuando una aplicación envía un búfer que se está produciendo en la GPU, también envía un objeto de valla de sincronización. Esta valla señala cuando la GPU ha terminado de escribir en el búfer.

La HWC requiere que la GPU termine de escribir búferes antes de que se muestren. Las vallas de sincronización se pasan a través de la canalización de gráficos con búferes y señalan cuándo se escriben los búferes. Antes de que se muestre un búfer, el HWC verifica si la barrera de sincronización ha señalado y, si lo ha hecho, muestra el búfer.

Para obtener más información sobre las cercas de sincronización ver Integración de hardware Compositor .