sobota, 23 sierpnia 2014

Prosta instalacja natywnego Direct3D9 (Gallium Nine) na Ubuntu

Użytkownik Ubuntu zwykle nie musi znać metod kompilacji, systemów kontroli wersji czy nakładania łatek. Życie ratują mu repozytoria PPA. Tak jest i tym razem.

Omówię tutaj instalację i uruchomienie implementacji Direct3D dla sterowników korzystających z modelu Gallium, czyli niemal wszystkich (AMD - R600g/radeonsi, Nvidia -  nouveau) otwartych za wyjątkiem oficjalnego sterownika Intela (i965). W tym ostatnim przypadku również istnieje furtka, czyli sterownik LunarG ilo.

O co chodzi z Gallium Nine

Model sterowników Gallium 3D rozdziela część odpowiedzialną za współpracę ze sprzętem od implementacji API graficznego. Dzięki temu można małym nakładem sił dodać kolejne API do wszystkich sterowników korzystających z tego modelu. Do tej pory jedynym zaimplementowanym API było OpenGL, Gallium Nine wprowadziło obsługę (znanego dotychczas z Windows) Direct3D 9.

Oczywiście na chwilę obecną nie ma na Linuksie natywnych gier korzystających z D3D. Za to Gallium Nine przynosi znaczące korzyści w grach i aplikacjach z Windows uruchamianych pod Wine. Dotychczas działały one w następujący sposób:

Program->D3D(Wine)->OpenGL->Sterownik(Gallium)->Sprzęt

Teraz pozbyto się etapu tłumaczenia D3D an OpenGL i zostało:

Program->D3D(Wine)->Sterownik(Gallium)->Sprzęt

Korzyścią jest przede wszystkim zwiększona ok. dwukrotnie wydajność i czasami uniknięcie błędów wyświetlania. Np. Bioshock przyspieszył z 20-50 kl/.s (1920x1080, wysokie detale, HD6670)) do 35-100 kl./s, a bąble powietrza w wodzie przestały powodować artefakty. Oczywiście ta implementacja nie jest jeszcze dopracowana i niektóre gry, jak Metro 2033, odmawiają współpracy.

Instalacja

Potrzebujemy dwóch repozytoriów PPA: ppa:oibaf/graphics-drivers zawierającego sterowniki z Gallium Nine i ppa:commendsarnex/ppa ze zmodyfikowaną wersją Wine. Uwaga: repozytoria przeznaczone są dla Ubuntu 14.04 i 14.10.


Dodajemy repozytoria, aktualizujemy sterowniki i instalujemy Wine:

sudo apt-add-repository ppa:oibaf/graphics-drivers
sudo apt-add-repository ppa:commendsarnex/ppa
sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install wine1.7 

Aktualizacja (31.08.2014): w tym momencie koniecznie jest dodanie jeszcze repozytorium ppa:commendsarnex/galliumnine, bo Nine jest tymczasowo usunięte z PPA Oibafa na skutek problemów ze sterownikiem nouveau.

sudo apt-add-repository ppa:commendsarnex/galliumnine

Oczywiście wszystkie powyższe kroki można wyklikać w Synapticu (Ustawienia->Repozytoria->Inne Oprogramowanie->Dodaj itd.)

Jeśli coś pójdzie nie tak, to repozytoria PPA można całkowicie usunąć korzystając z ppa-purge:

sudo apt-get install ppa-purge
sudo ppa-purge ppa:oibaf/graphics-drivers
sudo ppa-purge ppa:commendsarnex/ppa 

Pozostaje jeszcze jeden ważny krok, czyli modyfikacja rejestru Wine. Uruchamiamy Regedit:

wine regedit

i tworzymy klucz:

HKEY_CURRENT_USER->Software->Wine->Direct3D

a w nim wartość DWORD równą 1


Pozostaje zrestartować komputer i zabrać się za testy.

Sprawdzenie działania

Zacznijmy od sprawdzenia czy sterownik Gallium został prawidłowo zaktualizowany:

glxinfo | grep OpenGL

powinno dać coś w stylu (zwróć uwagę na "gallium-nine"):

OpenGL vendor string: X.Org
OpenGL renderer string: Gallium 0.4 on AMD TURKS
OpenGL core profile version string: 3.3 (Core Profile) Mesa 10.4.0-devel (git-e7f2f2d 2014-08-22 trusty-oibaf-ppa+gallium-nine)
OpenGL core profile shading language version string: 3.30
OpenGL core profile context flags: (none)
OpenGL core profile profile mask: core profile
OpenGL core profile extensions:
OpenGL version string: 3.0 Mesa 10.4.0-devel (git-e7f2f2d 2014-08-22 trusty-oibaf-ppa+gallium-nine)
OpenGL shading language version string: 1.30
OpenGL context flags: (none)
OpenGL extensions:
OpenGL ES profile version string: OpenGL ES 3.0 Mesa 10.4.0-devel (git-e7f2f2d 2014-08-22 trusty-oibaf-ppa+gallium-nine)
OpenGL ES profile shading language version string: OpenGL ES GLSL ES 3.0
OpenGL ES profile extensions:

Teraz można uruchomić jakąś grę korzystającą z Direct3D, można od razu włączyć wyświetlanie klatek na sekundę:

GALLIUM_HUD=fps wine naszagra

Jak sprawdzić czy Gallium Nine na pewno jest używane? Wystarczy zobaczyć czy nasza program/gra korzysta z pliku libd3dadapter:

lsof | grep libd3d

co powinno dać wynik jak na poniższym zrzucie:



Może zdarzyć się, że jakiś program nie chce współpracować z Gallium Nine. Wtedy zmiana wcześniej utworzonej przez nas w Regedicie wartości DWORD na 0 przywróci tradycyjną warstwę tłumaczenia D3D-OGL.

Co ze sterownikami binarnymi?

Te oczywiście nie korzystają i raczej nigdy nie będą korzystać z Gallium. Receptą na poprawę wydajności Wine są łatki CSMT, które rozdzielają tłumaczenie D3D->OGL na kilka wątków procesora.

Podziękowania dla /u/sarnex za utworzenie repozytorium i opis konfiguracji Wine.

2 komentarze:

  1. Czy ma to sens ? Czy sterowniki binarne nVidia + WINE nie dają lepszego efektu ?

    OdpowiedzUsuń
    Odpowiedzi
    1. Zależy jakie konkretnie GPU i co jest wąskim gardłem. Jak ktoś ma szybkie CPU i GPU bardzo źle obsługiwane przez otwarte sterowniki (jak np. GF4xx-GF5xx), to Wine z CSMT będzie lepsze.

      Usuń