Latch del buffer non segnalato con AutoSingleLayer

Android 13 introduce una nuova configurazione chiamata AutoSingleLayer per l'aggancio di buffer non segnalati. Questa configurazione consente a SurfaceFlinger di bloccare un buffer non segnalato quando viene aggiornato un solo livello. Non si applica ai casi che si verificano tra i livelli, ad esempio modifiche alla geometria o transazioni di sincronizzazione.

In precedenza, il flag debug.sf.latch_unsignaled in Android Open Source Project (AOSP) consentiva a SurfaceFlinger di bloccare tutti i buffer non segnalati, indipendentemente dal caso d'uso. Quando abiliti questa configurazione, possono verificarsi effetti collaterali indesiderati, ad esempio l'interruzione delle transazioni di sincronizzazione e il blocco dell'intero display durante l'attesa di buffer incompleti.

In modalità AutoSingleLayer, SurfaceFlinger aggiorna solo un buffer di una singola superficie in un frame. Questa modalità consente ai giochi e ad altre app a schermo intero di sfruttare i buffer agganciati non segnalati e di ridurre i problemi di fluidità delle app senza essere interessati dai blocchi dello schermo.

Impostazioni della modalità AutoSingleLayer

Per Android 13, AutoSingleLayer è la modalità predefinita per la funzionalità di buffer senza segnale del chiavistello. Questa modalità è controllata dalla proprietà di sistema debug.sf.auto_latch_unsignaled.

SurfaceFlinger legge LatchUnsignaledConfig all'avvio. Le configurazioni possibili sono:

  • LatchUnsignaledConfig::AutoSingleLayer

    In questa modalità predefinita AOSP, SurfaceFlinger consente l'aggancio di buffer non segnalati quando un singolo livello viene aggiornato in un frame. L'aggiornamento deve includere solo un aggiornamento del buffer senza transazioni di sincronizzazione o modifiche alla geometria. Per impostazione predefinita, questa modalità imposta debug.sf.auto_latch_unsignaled su true.

  • LatchUnsignaledConfig::Disabled

    Questa modalità disattiva il comportamento di blocco non segnalato e blocca solo le transazioni segnalate. Questa modalità disattiva anche la modalità AutoSingleLayer. Per configurare questa modalità, imposta debug.sf.latch_unsignaled e debug.sf.auto_latch_unsignaled su false.

  • LatchUnsignaledConfig::Always

    In questa modalità, SurfaceFlinger blocca tutti i buffer non segnalati. Per configurare questa modalità, imposta debug.sf.latch_unsignaled su true.

Test AutoSingleLayer

Per verificare se un buffer è agganciato senza segnale, cerca le seguenti tracce da SurfaceFlinger in Perfetto:

Traccia del buffer agganciato senza segnale

Figura 1. Traccia di un buffer agganciato non segnalato in Perfetto