Verrouillage de tampon non signalé avec AutoSingleLayer

Android 13 ajoute une nouvelle configuration appelée AutoSingleLayer pour les tampons non signalés. Cette configuration permet à SurfaceFlinger de verrouiller un tampon non signalé lorsqu'une seule couche est mise à jour, et non pour les cas qui se produisent sur plusieurs couches, tels que les modifications de géométrie ou les transactions de synchronisation.

Avant Android 13, l'indicateur debug.sf.latch_unsignaled dans AOSP permettait à SurfaceFlinger de verrouiller tous les tampons non signalés, quel que soit le cas d'utilisation. Lorsque cette configuration est activée, des effets secondaires indésirables se produisent, comme l'interruption des transactions de synchronisation et le blocage de l'ensemble de l'affichage en attendant des tampons incomplets.

Avec le mode AutoSingleLayer, seul un tampon d'une seule surface est mis à jour 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'affichage.

Paramètres du mode AutoSingleLayer

Dans Android 13, AutoSingleLayer est le mode par défaut pour la fonctionnalité de tampon de verrouillage 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, l'accrochage des tampons non signalés est autorisé lorsqu'une seule couche est mise à jour dans un frame, et que la mise à jour inclut uniquement une mise à jour de tampon sans transactions de synchronisation ni modifications de géométrie. Dans ce mode, debug.sf.auto_latch_unsignaled est défini sur true par défaut.

  • 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, tous les tampons sont verrouillés sans signalisation. Pour configurer ce mode, définissez debug.sf.latch_unsignaled sur true.

Test 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