Cómo bloquear búferes sin indicar con AutoSingleLayer

En Android 13, se agrega una configuración nueva llamada AutoSingleLayer para bloquear búferes sin indicar. Esta configuración permite que SurfaceFlinger bloquee un búfer sin indicar cuando 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, la marca debug.sf.latch_unsignaled en AOSP permitía que SurfaceFlinger bloqueara todos los búferes sin señal, independientemente del caso de uso. Cuando se habilita esta configuración, se producen efectos secundarios no deseados, como la interrupción de las transacciones de sincronización y la inmovilización de 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 fotograma. Este modo permite que los juegos y otras apps de pantalla completa obtengan el beneficio de bloquear los búferes sin señal y reducir el bloqueo de la app sin verse afectados por las congelaciones de la pantalla.

Configuración del modo AutoSingleLayer

En Android 13, AutoSingleLayer es el modo predeterminado para la función de búfer sin indicar de bloqueo. La propiedad del sistema debug.sf.auto_latch_unsignaled controla este modo.

SurfaceFlinger lee LatchUnsignaledConfig durante el inicio. Estos son los parámetros de configuración posibles:

  • LatchUnsignaledConfig::AutoSingleLayer

    En este modo predeterminado de AOSP, se permite el bloqueo de búferes sin indicar cuando se actualiza una sola capa en un fotograma, y la actualización solo incluye 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 configura en true de forma predeterminada.

  • LatchUnsignaledConfig::Disabled

    Este modo inhabilita el comportamiento del seguro sin indicar y solo bloquea las transacciones señalizadas. Este modo también inhabilita el modo AutoSingleLayer. Para configurar este modo, establece 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ñal. Para configurar este modo, establece debug.sf.latch_unsignaled en true.

Prueba AutoSingleLayer

Para probar si un búfer está bloqueado sin señal, busca los siguientes registros de SurfaceFlinger en Perfetto:

Registro del búfer sin indicar bloqueado

Figura 1: Registro de un búfer sin indicar bloqueado en Perfetto