Resolvendo o screen tearing no Linux, em notebooks com gráfico híbrido (Intel e NVIDIA), rodando Xorg

Introdução

Em novembro de 2023 adquiri um notebook gamer da Dell, modelo G15 5530. Na tabela abaixo um resumo das suas especificações:

Processador13ª geração Intel® Core™ i7-13650HX (14-core, cache de 24MB, até 4.9GHz)
Placa de vídeoNVIDIA® GeForce® RTX™ 4050, 6GB GDDR6
Memória16GB DDR5 (2x8GB) 4800MT/s
ArmazenamentoSSD de 1TB PCIe NVMe M.2
TelaFull HD de 15.6″ (1920 x 1080), 165Hz, 300 nits, sRGB-100%, 3 ms, com NVIDIA G-SYNC e Advanced Optimus

Por se tratar de um modelo com GPU híbrida e uma delas sendo da NVIDIA, as coisas ficam um pouco mais complicadas. No Windows 11 tudo funciona perfeitamente bem (por que será?).

O problema

Assim que o recebi, fiz uma instalação em dual boot, com o Windows 11 e o Arch Linux mas, com o uso diário, notei que algumas aplicações no Linux não rodavam tão suaves quanto no Windows, especialmente o RetroArch. Ocorria uma espécie de screen tearing (efeito que faz com que a imagem fique partida, ou recortada).

Exemplo de screen tearing. Imagem do site Coolblue

No sistema da Microsoft, graças à tecnologia da NVIDIA, o funcionamento é simples e direto: você utiliza a GPU Intel para quase tudo e, quando se faz necessário o uso da força bruta da NVIDIA, ela é acionada através do Advanced Optimus.

Já no Linux as coisas são um pouco diferentes, pelo simples fato de não haver o Advanced Optimus implementado, algumas soluções foram criadas e podem ser vistas lá no Arch Wiki.

A solução

Depois de muito pesquisar e testar diversas configurações e métodos diferentes, cheguei ao resultado que tanto queria. E consegui isso com seguintes passos:

1. Adicione o(s) módulo(s) ao arquivo /etc/mkinitcpio.conf e depois execute como root o comando mkinitcpio -P;

MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm i915)

2. Crie o arquivo /etc/X11/xorg.conf com o conteúdo abaixo;

Section "ServerLayout"
    Identifier "layout"
    Screen 0 "intel"
    Inactive "nvidia"
EndSection

Section "Device"
    Identifier "intel"
    Driver "modesetting"
    BusID "PCI:0:2:0"
EndSection

Section "Screen"
    Identifier "intel"
    Device "intel"
EndSection

Section "Device"
    Identifier "nvidia"
    Driver "nvidia"
    BusID "PCI:1:0:0"
EndSection

Section "Screen"
    Identifier "nvidia"
    Device "nvidia"
    Option "AllowEmptyInitialConfiguration"
EndSection

3. Reinicie o sistema e faça os testes.

Conclusão

Se tudo deu certo, ao digitar o comando xrandr --listproviders, deverá aparecer algo como o texto abaixo:

$ xrandr --listproviders
Providers: number : 2
Provider 0: id: 0x44 cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 4 outputs: 2 associated providers: 1 name:modesetting
Provider 1: id: 0x26f cap: 0x2, Sink Output crtcs: 4 outputs: 2 associated providers: 1 name:NVIDIA-G0

E é isso 😄

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *