Фиксация буфера без сигнала с помощью AutoSingleLayer

В Android 13 появилась новая конфигурация AutoSingleLayer для фиксации буферов без сигналов. Эта конфигурация позволяет SurfaceFlinger зафиксировать буфер без сигнала, когда обновляется только один слой. Это не относится к случаям, когда изменения происходят на разных уровнях, например при изменении геометрии или синхронизации транзакций.

Ранее флаг debug.sf.latch_unsignaled в Android Open Source Project (AOSP) позволял SurfaceFlinger блокировать все буферы без сигналов независимо от варианта использования. Если включить эту конфигурацию, могут возникнуть нежелательные побочные эффекты, например прерывание транзакций синхронизации и зависание всего экрана во время ожидания неполных буферов.

В режиме AutoSingleLayer SurfaceFlinger обновляет только буфер одной поверхности в кадре. Этот режим позволяет играм и другим полноэкранным приложениям использовать преимущества фиксации несигнализированных буферов и уменьшать задержки в работе приложений, не подвергаясь влиянию зависаний дисплея.

Настройки режима AutoSingleLayer

В Android 13 режим AutoSingleLayer используется по умолчанию для функции фиксации буфера без сигнала. Этот режим контролируется системным свойством debug.sf.auto_latch_unsignaled.

SurfaceFlinger считывает LatchUnsignaledConfig при загрузке. Возможные конфигурации:

  • LatchUnsignaledConfig::AutoSingleLayer

    В этом режиме по умолчанию AOSP SurfaceFlinger разрешает защелкивание буферов без сигналов, когда в кадре обновляется один слой. Обновление должно включать только буфер без транзакций синхронизации или изменений геометрии. По умолчанию в этом режиме для параметра debug.sf.auto_latch_unsignaled задается значение true.

  • LatchUnsignaledConfig::Disabled

    В этом режиме отключается поведение защелки без сигнала и защелкиваются только транзакции с сигналом. При этом также отключается режим AutoSingleLayer. Чтобы настроить этот режим, задайте для debug.sf.latch_unsignaled и debug.sf.auto_latch_unsignaled значение false.

  • LatchUnsignaledConfig::Always

    В этом режиме SurfaceFlinger блокирует все буферы без сигналов. Чтобы настроить этот режим, задайте для параметра debug.sf.latch_unsignaled значение true.

Test AutoSingleLayer

Чтобы проверить, зафиксирован ли буфер без сигнала, найдите в Perfetto следующие трассировки от SurfaceFlinger:

Трассировка зафиксированного буфера без сигнала

Рисунок 1. Трассировка буфера без сигнала в Perfetto