Latch del buffer non segnalato con AutoSingleLayer

Android 13 aggiunge 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 e non per i casi che si verificano tra i livelli, come modifiche alla geometria o transazioni di sincronizzazione.

Prima di Android 13, il flag debug.sf.latch_unsignaled in AOSP consente a SurfaceFlinger di bloccare tutti i buffer non segnalati, indipendentemente dal caso d'uso. Quando questa configurazione è abilitata, si verificano effetti collaterali indesiderati, ad esempio l'interruzione delle transazioni di sincronizzazione e il blocco dell'intero display durante l'attesa di buffer incompleti.

Con la modalità AutoSingleLayer, in un frame viene aggiornato solo un buffer di una singola superficie. Questa modalità consente ai giochi e ad altre app a schermo intero di sfruttare i vantaggi dell'aggancio dei buffer non segnalati e di ridurre i problemi delle app senza essere interessati dai blocchi dello schermo.

Impostazioni della modalità AutoSingleLayer

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

SurfaceFlinger legge LatchUnsignaledConfig all'avvio. Ecco le possibili configurazioni:

  • LatchUnsignaledConfig::AutoSingleLayer

    In questa modalità predefinita AOSP, l'aggancio di buffer non segnalati è consentito quando un singolo livello viene aggiornato in un frame e l'aggiornamento include solo un aggiornamento del buffer senza transazioni di sincronizzazione o modifiche alla geometria. In questa modalità, debug.sf.auto_latch_unsignaled è impostato su true per impostazione predefinita.

  • 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à, tutti i buffer vengono agganciati senza segnale. 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