Brak sygnału zatrzaśnięcia bufora w przypadku funkcji AutoSingleLayer

Android 13 dodaje nową konfigurację o nazwie AutoSingleLayer, która służy do blokowania niesygnalizowanych buforów. Ta konfiguracja umożliwia SurfaceFlingerowi zablokowanie nie sygnalizowanego bufora, gdy aktualizowana jest tylko jedna warstwa, a nie w przypadkach, które występują na różnych warstwach, takich jak zmiany geometrii czy transakcje synchronizacji.

Przed Androidem 13 flaga debug.sf.latch_unsignaled w AOSP pozwalała usługom SurfaceFlinger przechwytywać wszystkie niesygnalizowane bufory niezależnie od przypadku użycia. Włączenie tej konfiguracji powoduje niepożądane skutki uboczne, takie jak przerywanie transakcji synchronizacji i zawieszanie całego wyświetlacza podczas oczekiwania na niekompletne bufory.

W trybie AutoSingleLayer aktualizowany jest tylko bufor pojedynczej powierzchni w ramce. Tryb ten umożliwia korzystanie z buforów bez sygnalizacji w przypadku gier i innych aplikacji pełnoekranowych, a także ogranicza zacięcia aplikacji, nie wpływając na wyświetlacz.

Ustawienia trybu AutoSingleLayer

W Androidzie 13 domyślnym trybem funkcji bufora z niezablokowanym sygnałem jest AutoSingleLayer. Ten tryb jest kontrolowany przez właściwość systemową debug.sf.auto_latch_unsignaled.

Podczas uruchamiania SurfaceFlinger odczytuje LatchUnsignaledConfig. Możliwe konfiguracje:

  • LatchUnsignaledConfig::AutoSingleLayer

    W tym trybie domyślnym AOSP blokowanie niesygnalizowanych buforów jest dozwolone, gdy w ramce jest aktualizowana pojedyncza warstwa, a aktualizacja obejmuje tylko aktualizację bufora bez transakcji synchronizacji ani zmian geometrii. W tym trybie parametr debug.sf.auto_latch_unsignaled jest domyślnie ustawiony na true.

  • LatchUnsignaledConfig::Disabled

    W tym trybie wyłączone jest zachowanie blokady bez sygnału, a blokada dotyczy tylko transakcji z sygnałem. Tryb ten wyłącza też tryb AutoSingleLayer. Aby skonfigurować ten tryb, ustaw debug.sf.latch_unsignaleddebug.sf.auto_latch_unsignaled na false.

  • LatchUnsignaledConfig::Always

    W tym trybie wszystkie bufory są blokowane bez sygnalizacji. Aby skonfigurować ten tryb, ustaw wartość debug.sf.latch_unsignaled na true.

Test AutoSingleLayer

Aby sprawdzić, czy bufor jest zablokowany bez sygnału, poszukaj tych śladów w SurfaceFlinger w Perfetto:

Ślad zablokowanego niesygnalizowanego bufora

Rysunek 1. Ślad zablokowanego bufora bez sygnału w Perfetto