Blocco del buffer non segnalato con AutoSinglelayer

Android 13 aggiunge una nuova configurazione chiamata AutoSingleLayer per bloccare i buffer non segnalati. Questa configurazione consente a SurfaceFlinger di bloccare un buffer non segnalato quando viene aggiornato un solo livello, non nei casi in cui si verificano tra i livelli, come le modifiche alla geometria o le transazioni di sincronizzazione.

Prima di Android 13, il flag debug.sf.latch_unsignaled in AOSP consentiva a SurfaceFlinger di bloccare tutti i buffer non segnalati, indipendentemente dal caso d'uso. Quando questa configurazione è attivata, si verificano effetti collaterali indesiderati, come la rottura delle transazioni di sincronizzazione e il blocco dell'intero display in attesa di buffer incompleti.

Con la modalità AutoSingleLayer, viene aggiornato solo un buffer di una singola superficie in un frame. Questa modalità consente a giochi e altre app a schermo intero di usufruire del vantaggio di bloccare i buffer non segnalati e di ridurre il ritardo dell'app, senza essere interessata dai blocchi del display.

Impostazioni della modalità AutoSingleLayer

In Android 13, AutoSingleLayer è la modalità predefinita per la funzionalità del buffer latch non segnalato. Questa modalità è controllata dalla proprietà di sistema debug.sf.auto_latch_unsignaled.

SurfaceFlinger legge LatchUnsignaledConfig all'avvio. Di seguito sono riportate le possibili configurazioni:

  • LatchUnsignaledConfig::AutoSingleLayer

    In questa modalità predefinita AOSP, il latching dei 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 latch 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 bloccati non segnalati. Per configurare questa modalità, imposta debug.sf.latch_unsignaled su true.

Test AutoSingleLayer

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

Traccia del buffer non segnalato bloccato

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