Bloqueo de búfer sin señalizar con AutoSingleLayer

Android 13 agrega una nueva configuración llamada AutoSingleLayer para bloquear búferes sin señalizar. Esta configuración permite que SurfaceFlinger bloquee un búfer no señalado cuando solo se actualiza una sola capa, y no en los casos que ocurren entre capas, como cambios de geometría o transacciones de sincronización.

Antes de Android 13, el indicador debug.sf.latch_unsignaled en AOSP permite que SurfaceFlinger bloquee todos los búferes sin señalizar, independientemente del caso de uso. Cuando esta configuración está habilitada, hay efectos secundarios no deseados, como interrumpir las transacciones de sincronización y congelar toda la pantalla mientras se esperan búferes incompletos.

Con el modo AutoSingleLayer , solo se actualiza un búfer de una sola superficie en un marco. Este modo permite que los juegos y otras aplicaciones de pantalla completa obtengan el beneficio de bloquear los búferes no señalados y reducir el bloqueo de la aplicación sin verse afectado por los bloqueos de pantalla.

Configuración del modo AutoSingleLayer

En Android 13, AutoSingleLayer es el modo predeterminado para la función de búfer sin señalizar de pestillo. Este modo está controlado por la propiedad del sistema debug.sf.auto_latch_unsignaled .

SurfaceFlinger lee LatchUnsignaledConfig en el arranque. Estas son las configuraciones posibles:

  • LatchUnsignaledConfig::AutoSingleLayer

    En este modo predeterminado de AOSP, se permite enclavar búferes no señalados cuando se actualiza una sola capa en un marco, y la actualización incluye solo una actualización de búfer sin transacciones de sincronización ni cambios de geometría. En este modo, debug.sf.auto_latch_unsignaled se establece en true de forma predeterminada.

  • LatchUnsignaledConfig::Disabled

    Este modo desactiva el comportamiento no señalado del pestillo y bloquea solo las transacciones señaladas. Este modo también desactiva el modo AutoSingleLayer . Para configurar este modo, establezca debug.sf.latch_unsignaled y debug.sf.auto_latch_unsignaled en false .

  • LatchUnsignaledConfig::Always

    En este modo, todos los búferes se bloquean sin señalizar. Para configurar este modo, establezca debug.sf.latch_unsignaled en true .

Prueba AutoSingleLayer

Para probar si un búfer está bloqueado sin señalizar, busque los siguientes rastros de SurfaceFlinger en Perfetto :

Rastro de búfer no señalado bloqueado

Figura 1. Rastreo de un búfer no señalado bloqueado en Perfetto