Travamento de buffer não sinalizado com AutoSingleLayer, travamento de buffer não sinalizado com AutoSingleLayer

O Android 13 adiciona uma nova configuração chamada AutoSingleLayer para travar buffers não sinalizados. Essa configuração permite que o SurfaceFlinger bloqueie um buffer não sinalizado quando apenas uma única camada está sendo atualizada, 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 esta configuração está habilitada, há efeitos colaterais indesejados, como interrupção de transações de sincronização e congelamento de toda a exibição enquanto aguarda 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 bloquear buffers não sinalizados e reduzir a instabilidade do aplicativo, sem serem afetados por congelamentos de exibição.

Configurações do modo AutoSingleLayer

No Android 13, AutoSingleLayer é o modo padrão para o recurso de buffer não sinalizado de trava. 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 do AOSP, o travamento de 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. Neste modo, debug.sf.auto_latch_unsignaled é definido como true por padrão.

  • LatchUnsignaledConfig::Disabled

    Este modo desativa o comportamento não sinalizado do latch e bloqueia apenas transações sinalizadas. Este modo também desativa o modo AutoSingleLayer . Para configurar este 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 sinalização. Para configurar este modo, defina debug.sf.latch_unsignaled como true .

Teste AutoSingleLayer

Para testar se um buffer está travado sem sinalização, procure os seguintes rastreamentos de SurfaceFlinger em Perfetto :

Rastreamento de buffer não sinalizado travado

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