Travamento de buffer não sinalizado com AutoSingleLayer

O Android 13 adiciona uma nova configuração chamada AutoSingleLayer para bloquear buffers não sinalizados. Essa configuração permite que SurfaceFlinger trave um buffer não sinalizado quando apenas uma única camada está atualizando, e não para os casos que ocorrem entre camadas, como alterações de geometria ou transações de sincronização.

Antes do Android 13, o sinalizador debug.sf.latch_unsignaled no AOSP permitia que o SurfaceFlinger travasse todos os buffers não sinalizados, independentemente do caso de uso. Quando essa configuração é habilitada, há efeitos colaterais indesejados, como quebrar transações de sincronização e congelar toda a exibição enquanto espera por buffers incompletos.

Com o modo AutoSingleLayer , apenas um buffer de uma única superfície é atualizado em um quadro. Este modo permite que jogos e outros aplicativos em tela cheia obtenham o benefício de travar buffers não sinalizados e reduzir a instabilidade do aplicativo enquanto permanecem inalterados por congelamentos de exibição.

Configurações do modo AutoSingleLayer

No Android 13, AutoSingleLayer é o modo padrão para o recurso de travamento de buffer não sinalizado. Este modo é controlado pela propriedade do sistema debug.sf.auto_latch_unsignaled .

SurfaceFlinger lê LatchUnsignaledConfig na inicialização. Aqui estão as configurações possíveis:

  • LatchUnsignaledConfig::AutoSingleLayer

    Neste modo padrão AOSP, travar buffers não sinalizados é permitido quando uma única camada é atualizada em um quadro e a atualização inclui apenas uma atualização de buffer sem transações de sincronização ou alterações de geometria. Nesse modo, debug.sf.auto_latch_unsignaled é definido como true por padrão.

  • LatchUnsignaledConfig::Disabled

    Este modo desativa o comportamento de trava não sinalizada e trava apenas as transações sinalizadas. Este modo também desativa o modo AutoSingleLayer . Para configurar esse modo, defina debug.sf.latch_unsignaled e debug.sf.auto_latch_unsignaled como false .

  • LatchUnsignaledConfig::Always

    Neste modo, todos os buffers são travados sem sinal. Para configurar esse modo, defina debug.sf.latch_unsignaled como true .

Testar AutoSingleLayer

Para testar se um buffer está travado sem sinal, procure os seguintes traços do SurfaceFlinger no Perfetto :

Rastreamento de buffer não sinalizado travado

Figura 1. Rastreamento de um buffer não sinalizado travado no Perfetto