Plasma + AMDGPU + X micro stuttering (micro travamentos)

Olá colegas!

Há tempos eu sentia alguns micro travamentos em vídeos a 60fps e não ligava muito. Mas percebi que o mesmo não acontecia no meu notebook bem antigo com vídeo intel onboard. Aí resolvi investigar.

O problema

  • Mesmo usando Firefox com aceleração de hardware, dava umas engasgadas na rolagem suave. Quando desativava o compositor (Shift+Alt+F12) a rolagem suave era perfeita!
  • Os micro travamentos ficavam evidentes no teste da tela piscando. Esse teste consiste em frames alternados, um em preto e outro em branco. Se não houver travamentos a tela vai parecer cinza “constante”, mas se houver micro travamentos vai parecer que a tela fica cinza mas piscando as vezes preto, as vezes branco. (Link vídeo de teste: Monitor/TV test (Blicking, ghost and color test) 1080p 60fps - YouTube Atenção que a tela pisca e pode causar sensação ruim)
  • No teste do pisca (blicking test in english) com o compositor ligado e no firefox dava travamento. Já com compositor desligado e no firefox, não piscava a tela mas aparecia tela cortada (screen tearing). Porém com o google chrome, desativando o compositor, ficava perfeito o teste. Enquanto com o chrome, compositor ativo, piscava a tela.

Hipóteses descartadas

  • Pensei que poderia ter a ver com kernel em real time. Recompilei e apresentou o mesmo problema, independente de ser realtime, ou desktop.
  • Pensei ser opção de compilação do pacote do plasma. Tentei mudar para usar GLES2 mas acabou travando dependências. Desisti de mudar.
  • Pensei ser problema de opções do compositor. Entrei nas opções do Plasma -> Tela e monitor -> Compositor. Tentei OpenGL 2.0, OpenGL 3.1, Xrender, vsync automático, vsync econômico, uma série de combinações entre elas mas sem sucesso.

Solução

Na pesquisa encontrei um bug antigo que nunca foi resolvido 351700 – kwin is frame skipping onde há uma longa discussão. Fiz alguns testes pra verificar se resolvia o problema. O teste é abrir um terminal, alterar algumas variáveis de ambiente, recarregar o kwin e ver o comportamento:

  1. KWIN_TRIPLE_BUFFER=1 kwin_x11 --replace &
  2. KWIN_TRIPLE_BUFFER=0 kwin_x11 --replace &
  3. __GL_SYNC_TO_VBLANK=1 kwin_x11 --replace &
  4. __GL_SYNC_TO_VBLANK=0 kwin_x11 --replace &
  5. __GL_YIELD="USLEEP" kwin_x11 --replace &
    Pode acontecer de combinar as variáveis de ambiente, mas a princípio recomendo testar uma a uma, efetuando log-off após o teste.
  • Outra possibilidade é mudar o framerate do kwin. Em vez de deixar 60 fps, aumentar para 70 fps. Altere/adicione no arquivo ~/.config/kwinrc na parte Compositing conforme abaixo e depois rode kwin_x11 --replace & (eu não fiz esse teste para ver se resolvia)
[Compositing]
# other setting
RefreshRate=70
MaxFPS=70

No meu caso KWIN_TRIPLE_BUFFER=0 resolveu o problema! Para tornar permanente crie um arquivo em ~/.config/plasma-workspace/env/minha-configuração.sh com o conteúdo similar a esse:

export KWIN_TRIPLE_BUFFER
KWIN_TRIPLE_BUFFER=0

Altere o nome da variável e o valor conforme seus testes. Os arquivos nessa localização são executados antes do inicío do Plasma, então a variável de ambiente fica gravada e vc não precisa fazer manualmente toda vez.

Minhas considerações

No meu caso me pareceu que o Xorg habilitou o triple_buffer, mas houve incompatibilidade com o vsync do compositor. Isso causava que alguns frames fossem pulados. Desativando o buffer triplo pro kwin resolveu, mas pode haver outras soluções através de configuração de arquivos no /etc/X11/xorg.conf.d/

Outro fato curioso foi que o Chrome parou de ter aquele bug da textura cortada como descrito no tópico Renderização chrome bugada no Mint 20

5 Curtidas