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 changements 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, il existe des effets secondaires indésirables, tels que l'interruption des transactions de synchronisation et le gel de l'intégralité 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 plein écran de bénéficier du verrouillage des tampons non signalés et de la réduction des erreurs d'application tout en restant insensibles au gel de l'affichage.
Paramètres du mode AutoSingleLayer
Dans Android 13, AutoSingleLayer
est le mode par défaut pour la fonctionnalité de tampon non signalé de 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 AOSP, le verrouillage des tampons non signalés est autorisé lorsqu'une seule couche est mise à jour dans une trame, et la mise à jour inclut simplement une mise à jour du tampon sans transactions de synchronisation ni modifications de géométrie. Dans ce mode,
debug.sf.auto_latch_unsignaled
est défini surtrue
par défaut.LatchUnsignaledConfig::Disabled
Ce mode désactive le comportement de verrouillage non signalé et verrouille uniquement les transactions signalées. Ce mode désactive également le mode
AutoSingleLayer
. Pour configurer ce mode, définissezdebug.sf.latch_unsignaled
etdebug.sf.auto_latch_unsignaled
surfalse
.LatchUnsignaledConfig::Always
Dans ce mode, tous les tampons sont verrouillés sans signal. Pour configurer ce mode, définissez
debug.sf.latch_unsignaled
surtrue
.
Tester AutoSingleLayer
Pour tester si un tampon est verrouillé sans signal, recherchez les traces suivantes de SurfaceFlinger dans Perfetto :
Figure 1. Trace d'un tampon verrouillé non signalé dans Perfetto