Verrouillage de tampon non signalé avec AutoSingleLayer

Android 13 introduit une nouvelle configuration appelée AutoSingleLayer pour les tampons non signalés. Cette configuration permet à SurfaceFlinger d'accrocher un tampon non signalé lorsqu'une seule couche est en cours de mise à jour. Il ne s'applique pas aux cas qui se produisent sur plusieurs couches, par exemple les modifications de géométrie ou les transactions de synchronisation.

Auparavant, l'indicateur debug.sf.latch_unsignaled dans l'Android Open Source Project (AOSP) permettait à SurfaceFlinger de verrouiller tous les tampons non signalés, quel que soit le cas d'utilisation. Lorsque vous activez cette configuration, cela peut entraîner des effets secondaires indésirables, par exemple en interrompant les transactions de synchronisation et en bloquant l'intégralité de l'écran en attendant des tampons incomplets.

En mode AutoSingleLayer, SurfaceFlinger ne met à jour qu'un tampon d'une seule surface dans un frame. Ce mode permet aux jeux et autres applications en plein écran de bénéficier de l'accrochage des tampons non signalés et de réduire les saccades des applications tout en restant insensibles aux blocages de l'écran.

Paramètres du mode AutoSingleLayer

Pour Android 13, AutoSingleLayer est le mode par défaut de la fonctionnalité de tampon de verrou non signalé. Ce mode est contrôlé par la propriété système debug.sf.auto_latch_unsignaled.

SurfaceFlinger lit LatchUnsignaledConfig au démarrage. Voici les configurations possibles :

  • LatchUnsignaledConfig::AutoSingleLayer

    Dans ce mode AOSP par défaut, SurfaceFlinger autorise l'accrochage des tampons non signalés lorsqu'une seule couche est mise à jour dans un frame. La mise à jour ne doit inclure qu'une mise à jour du tampon, sans transactions de synchronisation ni modifications de la géométrie. Par défaut, ce mode définit debug.sf.auto_latch_unsignaled sur true.

  • LatchUnsignaledConfig::Disabled

    Ce mode désactive le comportement de verrouillage non signalé et ne verrouille que les transactions signalées. Ce mode désactive également le mode AutoSingleLayer. Pour configurer ce mode, définissez debug.sf.latch_unsignaled et debug.sf.auto_latch_unsignaled sur false.

  • LatchUnsignaledConfig::Always

    Dans ce mode, SurfaceFlinger verrouille tous les tampons non signalés. Pour configurer ce mode, définissez debug.sf.latch_unsignaled sur true.

Tester AutoSingleLayer

Pour tester si un tampon est verrouillé sans signal, recherchez les traces suivantes de SurfaceFlinger dans Perfetto :

Trace du tampon non signalé verrouillé

Figure 1 : Trace d'un tampon non signalé verrouillé dans Perfetto