środa, 14 sierpnia 2019

Migotanie monitora 75Hz - łatanie kernela

Post ten opisuje sposób łatania jądra Linuksa na przykładzie łatki usuwającej błąd w sterowniku dla kart AMD Radeon (Polaris).
Błąd ten ujawnia się tylko w przypadku monitorów o  częstotliwości odświeżania 75 Hz (i prawdopodobnie wyższych). Na ekranie okresowo widoczny jest poziomy migoczący pasek. Problem znika po ustawieniu stałej częstotliwości pamięci karty graficznej lub całkowitym wyłączeniu zarządzania energią. To skuteczne obejście problemu, ale niestety niezbyt wygodne.

Pojawiła się łatka naprawiająca błąd - aby ją wykorzystać trzeba skompilować kernel.

Łatanie kernela (Ubuntu)

Zrobimy to na przykładzie jądra 5.3-rc4, które było najnowszym w chili pisania postu. Aktualne źródła można znaleźć na kernel.org.

Przygotowujemy środowisko do zbudowania jądra, instalując potrzebne pakiety:

sudo apt-get install git fakeroot build-essential ncurses-dev xz-utils libssl-dev bc flex libelf-dev bison

Pobieramy źródła jądra i rozpakowujemy je:

wget https://git.kernel.org/torvalds/t/linux-5.3-rc4.tar.gz

tar xvzf linux-5.3-rc4.tar.gz

Pobieramy łatkę i zapisujemy ją jako 0001-drm-amd-powerplay-enforce-minimal-VBITimeout.patch

Dopiero teraz wchodzimy do rozpakowanego katalogu z jądrem: 

cd kernel/linux-5.3-rc4/

Aplikujemy łatkę:

patch -p1 < ../0001-drm-amd-powerplay-enforce-minimal-VBITimeout.patch 

Kopiujemy konfigurację jądra z naszej dystrybucji:

cp /boot/config-$(uname -r) .config

Konfigurujemy interesujące nas opcje ręcznie:

make menuconfig

Kompilujemy i instalujemy jądro oraz moduły (wartość po -j należy dostosować do liczby rdzeni procesora):

make -j16
sudo make modules_install
sudo make install

W tym miejscu okazuje się, że plik initrd jest bardzo duży. Musimy go zmniejszyć usuwając niepotrzebne symbole z modułów jądra:

cd /lib/modules/5.3.0-rc4/
sudo find . -name *.ko -exec strip --strip-unneeded {} +
sudo update-initramfs -c -k 5.3.0-rc4
sudo update-grub

Po tym wszystkim wystarczy zrestartotwać komputer i cieszyć się prawidłowo wyświetlanym obrazem.

poniedziałek, 12 sierpnia 2019

Wymuszanie uruchamiania windowsowej wersji gry na Steamie dla Linuksa (na przykładzie Black Mesy Xen beta update)

Porty niektórych gier na Linuksa są niskiej jakości/działają wolno lub wręcz nie działają w ogóle. W międzyczasie DXVK (translator Direct3D11-Vulkan) i D9VK (Direct3D9-Vulkan) stały się na tyle niezawodne i wydajne, że potrafią z powodzeniem z natywnymi "buildami" gier. W skrajnych wypadkach (np. Dying Light) gra uruchomiona przez DXVK potrafi być ponad dwa razy wydajniejsza niż port Linuksowy.

Jako przykład wybrałem betę Xen dla Black Mesy, bo nie działa ona na Linuksie w ogóle, oraz jest to gra korzystająca z DirectX9, przez co konfiguracja jest nieco bardziej skomplikowana.


Pierwszy krok to wybranie właściwości gry (prawy przycisk myszy na nazwie gry w liście gier):



Należy zaznaczyć opcję: "Wymuś użycie określonego narzędzia Steam Play" i wybrać najnowszą wersję Proton z listy rozwijanej. To sprawia, że gra będzie uruchamiana przez Proton i DXVK.  Dla gier korzystających z DirectX11 nie potrzeba robić nic więcej.
Black Mesa to jednak gra działająca w oparciu o D3D9 i potrzebuje D9VK, które jest zintegrowane z Protonem, ale nie zostało włączone domyślnie. Wybieramy "USTAW OPCJE URUCHAMIANIA..." i wpisujemy:

PROTON_USE_D9VK=1 %command% 

Oczywiście musimy też wybrać gałąź public-beta by mieć dostęp do bety Xen.


Teraz wystarczy zaakceptować ustawienia i poczekać na pobranie plików specyficznych dla Windows.

Valve ACO

Użytkownicy Radeonów mogą spróbować nowego kompilatora shaderów przygotowanego przez Valve. Obecnie współpracuje z implementacją Vulkan, wpływając zarówno na gry natywne jak i DXVK i D9VK. W zdecydowanej większości przypadków ACO skraca czas ładowania gier i zwiększa liczbę klatek na sekundę, a także redukuję "cięcie" spowodowane kompilacją shaderów.

Dla Ubuntu 19.04 instalacja wygląda następująco:

sudo add-apt-repository ppa:valve-experimental/mesa
sudo apt-get update
 
Uwaga, przed instalacją ACO należy usunąć inne "graficzne" PPA jak Padoka czy Oibaf jeśli takie były zainstalowane.

Po wpisaniu w opcje uruchamiania gry:

DXVK_HUD=1 PROTON_USE_D9VK=1 %command%

w lewym górnym rogu powinniśmy zobaczyć informację o użyciu ACO:


Nie działa?

Po pierwsze sprawdźmy czy są zainstalowane wszystkie potrzebne biblioteki:

sudo apt install libvulkan1 libvulkan1:i386 mesa-vulkan-drivers mesa-vulkan-drivers:i386

Jakie wydajności się spodziewać?

Bardzo bliskiej (czasami wręcz równej) wydajności Windows. Xen beta niestety działa niezbyt szybko, niezależnie od systemu operacyjnego. Uwidaczniają się tutaj ograniczenia Source.

Bonus

Kilka zrzutów ekranów gier uruchomionych z zmienną DXVK_HUD=full

Black Mesa (D9VK)

Hard Reset (D9VK)

Ride 2 (DXVK)