Verrouillage du tampon non signalé avec AutoSingleLayer

Android 13 ajoute une nouvelle configuration appelée AutoSingleLayer pour verrouiller les tampons non signalés. Cette configuration permet à SurfaceFlinger de verrouiller un tampon non signalé lorsqu'une seule couche est mise à jour, et non dans les cas qui se produisent entre les 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 permet à 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 peuvent se produire, tels que l'interruption des transactions de synchronisation et le gel de l'intégralité de l'écran en attendant que des tampons soient incomplets.

Avec le mode AutoSingleLayer, seul un tampon d'une seule surface est mis à jour dans un frame. Ce mode permet aux jeux et aux autres applications en plein écran de bénéficier du verrouillage des tampons non signalés et de réduire les à-coups de l'application, tout en restant insensible aux blocages de l'écran.

Paramètres du mode AutoSingleLayer

Dans Android 13, AutoSingleLayer est le mode par défaut de la fonctionnalité de tampon non signalé par verrouillage. 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 par défaut d'AOSP, le verrouillage des tampons non signalés est autorisé lorsqu'une seule couche est mise à jour dans un frame, et que la mise à jour ne comprend qu'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 par défaut sur true.

  • LatchUnsignaledConfig::Disabled

    Ce mode désactive le comportement non signalé du verrouillage 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 signal. Pour configurer ce mode, définissez debug.sf.latch_unsignaled sur true.

Test AutoSingleLayer

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

Trace du tampon non signalé à l'état "latched"

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