poniedziałek, 26 września 2016

Vulkan na Samsungu Galaxy S7 (Exynos 8890) [Aktualizacja]

Jeśli używasz Galaxy S7 lub S7 Edge, to niemal miesiąc temu powinieneś dostać aktualizację włączającą obsługę API Vulkan. Byłem chyba jednym z pierwszych ludzi, którzy odkryli niespodziankę ukrytą w jednej z aktualizacji;)

Samsung już w lutym twierdził, że S7 jest pierwszym telefonem z obsługą Vulkana. Niestety rzeczywistość nie była tak różowa. Biblioteki były obecne w systemie, ale brakowało rozszerzenia VK_KHR_swapchain, przez co niemożliwe było wyświetlenie czegokolwiek na ekranie smartphone. Brzmi absurdalnie? Dobrego wytłumaczenia dlaczego VK_KHR_swapchain jest opcjonalnym składnikiem Vulkana dostarcza Intel:

In Vulkan, a swap chain is an extension. Why? Isn’t it obvious we want to display an image on the screen in our application’s window?
Well, it’s not so obvious. Vulkan can be used for many different purposes, including performing mathematical operations, boosting physics calculations, and processing a video stream. The results of these actions may not necessarily be displayed on a typical monitor, which is why the core API is OS-agnostic, similar to OpenGL.

Vainglory, pierwsza duża gra korzystająca z Vulkana na Androidzie

Piszę o Vulkanie dopiero dzisiaj, a nie miesiąc temu, bo wtedy brakowało aplikacji do przetestowania nowego API. Dziś każdy posiadacz Galaxy S7, S7 Edge i Note 7 może zainstalować Vainglory: Vulkan Beta. Nie jest konieczna instalacja wersji podstawowej.
Choć nie mogę zrewidować tutaj zapewnień twórców o 30% wyższej wydajności, to muszę przyznać, że ta gra jest ładna, płynna i niezbyt bateriożerna. Mój S7 cały czas pozostawał chłodny, nie stwierdziłem też błędów wyświetlania. Pewnie gdybym lubił MOBA i nie miał alergii na mikrotransakcje, to grałbym godzinami.

vkQuake - wstępny port klasyka

Jeśli nie przeszkadza ci brak dźwięku i (co gorsza) konieczność użycia gamepadu to możesz spróbować portu vkQuake. Uwaga: jeśli nie masz podobnego gamepadu do tego, który używa twórca portu, to masz problem. Działania wyglądają na przypisane sztywno do przycisków.

GearVR

Niestety Vulkan nie może jeszcze zostać wykorzystany do renderowania wirtualnej rzeczywistości.

Aktualizacja

Unity dostało obsługę Vulkana i jak możemy przeczytać Galaxy S7 powinien być w stanie je uruchomić:

Samsung Galaxy S7 (European version, with ARM Mali GPU). Make sure you have the latest firmware, with build date August 2016 or later.

sobota, 27 sierpnia 2016

FreeCAD: TechDraw (rzuty 2D), elementy bazowe PartDesign

Ta krótka notka ma za zadanie przedstawić kilka ciekawych zmian i nowych funkcji programu FreeCAD.

Elementy bazowe i ciało (Body) modułu PartDesign

Wcześniej każdy nowy szkic musiał być umieszczony na geometrii istniejącej części. Stawało się to często bardzo niewygodne, wystarczy sobie wyobrazić dodanie segmentu do wałka przez obrót - na jednej z podstaw trzeba było wyciągnąć najpierw jakiś prostopadłościan, a dopiero potem narysować na nim docelowy szkic.

Niedawno został wprowadzony kontener Body, który likwiduje ten problem. Szkice mogą być umieszczane na dowolnych powierzchniach płaskich, a operacje z nich powstałe oddziałują na całą geometrię wewnątrz jednego kontenera.


Zadanie jeszcze bardziej ułatwiają elementy bazowe: płaszczyzny, osie i punkty. Więcej o budowie nowego PartDesign można przeczytaj na forum tutaj.

TechDraw - rzuty 2D

Wcześniej mieliśmy oficjalny moduł dokumentacji 2D tworzonej z modeli 3D nazwany Drawing i nieoficjalny Drawing Dimensioning. Pierwszy z nich nie umożliwiał łatwego wymiarowania ani tworzenia przekrojów, drugi dawał sobie radę z wymiarami, ale nie były one aktualizowane po zmianie kształtu części.

Nowy TechDraw rozwiązuje wszystkie te problemy. Wątek na forum.

 
Jak można zauważyć na powyższym zrzucie, jeszcze nie wszystko da się ustawić tak aby odpowiadało to zasadom rysunku technicznego. No, ale minęło dopiero półtora miesiąca od pierwszego wydania TechDraw - jest on cały czas dopracowywany. 

Nowości w module MES (FEM)

Moduł wspomagający obliczenia metodą elementów skończonych jest tak szybko i tak szeroko rozbudowywany, że trudno byłoby streści wszystkie zmiany.

Na pewno warto zwrócić uwagę na symulacje termomechaniczne opisane w tym wątku na forum.
 

Inną ciekawostką jest zaawansowany postprocesing z wykorzystaniem VTK - więcej tutaj.

Instalacja freecad-daily na Ubuntu

Opisane powyżej nowości (prócz postprocesingu VTK,który wymaga kompilacji ze źródeł) można znaleźć w prekompilowanych paczkach freecad-daily. 

Tematy warte uwagi w przyszłości

"Robust References" Redux - rozwiązanie problemu topologicznego nazewnictwa. Do tej pory było tak, że program do utrzymywania referencji numerował geometrię danego typu nie przejmując się jej położeniem czy znaczeniem. Przykład: płytka z kilkoma otworami, w jednym z nich robimy fazę. Potem zmniejszamy liczbę otworów, co się dzieje z fazą? Pojawia się na jednej z pozostałych krawędzi części, niekoniecznie w którymś z otworów. Ten problem powinien już niedługo być przeszłością.


update on FreeCAD + OpenFOAM fluid dynamic computation - pierwsze kroki w kierunku integracji solwera OpenFOAM i symulacji przepływu płynów.

niedziela, 24 lipca 2016

Emulator Dolphin, port vkQuake i emulator RetroArch na Vulkanie

Po The Talos Principle (starszy post) i Docie 2 pojawiły się kolejne projekty korzystające z Vulkana na Linuksie:

 

Dolphin

Zaledwie miesiąc po pierwotnym ogłoszeniu backend wykorzystujący Vulkana stał się kompletny pod względem funkcjonalności.  Nie jest on jeszcze całkowicie dopracowany, ale już może imponować stabilnością, niewielką liczbą błędów czy wydajnością. Ta wg wczesnych testów dorównuje a nawet przewyższa wydajność D3D12 oraz starszych API (OpenGL, D3D11).

W chwili pisania tego postu backend znajduje się jeszcze w trakcie przeglądu i nie został włączony do głównej gałęzi projektu. Można go pobrać i skompilować bezpośrednio z repozytorium dewelopera:
git clone https://github.com/stenzek/dolphin
cd dolphin
git checkout vulkan-pr
mkdir build
cd build
cmake ..
make
sudo make install 
Zależności są dość standardowe, warto tylko zwrócić uwagę na biblioteki libudev i libevdev, które konieczne są do obsługi gamepadów.

Nvidia ma w tej chwili dość paskudny błąd uniemożliwiający skalowanie okien, można go obejść ustawiając tryb pełnoekranowy i natywną rozdzielczość ekranu.


vkQuake

vkQuake to port oryginalnego Quake'a (a właściwie QuakeSpasm) na Vulkana wykonany przez samego Axela Gneitinga. Axel (obecnie programista id Software, wcześniej Crytek) jest też człowiekiem odpowiedzialnym za spektakularny (wrócę do tego pod koniec postu) port Dooma (2016) na Vulkana.

Pobranie i kompilacja są proste:
git clone https://github.com/Novum/vkQuake
cd vkQuake/Quake
make USE_SDL2=1
W przypadku vkQuake należy zatroszczyć się o obecność deweloperskich wersji bibliotek libogg, libvorbis i libmad odpowiadających za dekodowanie muzyki. No i oczywiście potrzebne jest SDL, jak widać powyżej, proponuję kompilację z SDL2.

W wyniku procesu powstaje pojedynczy plik wykonywalny quakespasm, który należy umieścić w jednym katalogu z katalogiem id1 zawierającym pliki pak0.pak i pak1.pak. Uwaga: wersja steamowa Quake ma pliki PAK0.PAK i PAK1.PAK z którymi vkQuake się nie uruchomi. Jest wrażliwy na wielkość znaków i należy zmienić wielkie na małe litery.

Z podobnego powodu jak w przypadku Dolphina, warto już przy starcie uruchomić tryb pełnoekranowy:
./quakespasm -fullscreen -width 1366 -height 768 
Po chwili powinien ukazać się znajomy widok.

 

RetroArch paraLLEl

RetroArch jest frontendem dla wielu emulatorów (nazywanych tutaj rdzeniami) zbudowanych wokół libretro. paraLLEl to jeden z tych rdzeni, zajmuje się on emulacją Nintendo 64, tylko w odróżnieniu od Mupen64plus używa do renderingu API Vulkan.

Kompilację należy przeprowadzić zgodnie z instrukcjami zawartymi na stronie projektu. Domyślnie budowane są wszystkie rdzenie, ale ten krok można pominąć, bo paraLLEl i tak trzeba ściągnąć osobno.
 
W trakcie procesu trafiłem na ostrzeżenie:
Checking function vkCreateInstance in -lvulkan ... yes
Warning: glslang submodule not loaded, can't use Vulkan.
To fix, use:  git submodule init && git submodule update
By to naprawić wystarczyło skorzystać z powyższej wskazówki:
cd retroarch/deps/glslang/
git submodule init && git submodule update
cd ../../..
./retroarch-build.sh
Pozostaje teraz ściągnąć potrzebny rdzeń przez menu Online Updater->Core Updater->parallel_libretro.so.zip


Uwaga: RetroArch do poruszania się po menu wykorzystuje strzałki i klawisze X oraz Z (Enter nic nie robi).
Ostatecznie trzeba też zmienić sterownik Settings->Driver na vulkan i dopiero teraz załadować rdzeń Load Core.


Niestety na tym etapie RetroArch na mojej maszynie przestaje reagować. No, ale może będziesz miał więcej szczęścia.

Dwa grosze o Doomie na Vulkanie

id Software opuszczone przez Carmacka i kilku innych kluczowych programistów (m.in.: J.M.P. van Waveren, Gloria Kennickell) zmuszone zostało do wyssania ludzi z podupadającego studia Crytek. Miejsce Johna zajął Tiago Sousa, który od samego początku stał za rozwojem CryEngine. Odpowiedzialnym za optymalizację id Tech 6 i implementację obsługi Vulkana jest Axel Gneiting.  Opinię Gneitinga o Vulkanie i Direct3D12 możesz przeczytać w artykule id Software Dev Puzzled By Devs Choosing DX12 Over Vulkan, Claims Xbox One DX12 Is Different Than PC ‘Don’t buy all Microsoft propaganda.’

Efekty pracy Axela są doskonałe. Starsze Nvidie są porównywalne na Vulkanie do OpenGL, Nvidia Pascal jest kilka procent szybsza, a AMD Radeon zyskuje od kilkudziesięciu do nawet ponad 100%.

Imponujące osiągi id Tech 6 nie są przypadkiem, korzysta on z funkcji, które nie zostały jeszcze zaimplementowane ani w Source 2 ani w Serious Engine 4. Jest m.in.: pierwszym silnikiem, który korzysta z Shader Intrisic Functions - film AMD nieco rozjaśniający sytuację.

Niestety, pomimo, że Wine potrafi uruchamiać windowsowe aplikacje oparte o Vulkana, to nie zadziała w przypadku Dooma. Tutaj prawdopodobnie winny jest DRM Denuvo. Pozostaje mieć nadzieję, że id wróci do tradycji wydawania łatek usuwających DRM, bo na linuksową wersję nie liczę...

Dwa grosze o Androidzie, Samsungu i Vulkanie

Ekipa Johna Carmacka po opuszczeniu id utworzyła Oculus VR Dallas. Jako oddział Oculusa odpowiedzialny za Gear VR, pośrednio pracują oni dla Samsunga. Być może to właśnie przez ten projekt Galaxy S7 miał być pierwszym telefonem z obsługą Vulkana. Exynos 8890 potrafi korzystać do 8 rdzeni jednocześnie, co wraz z wielowątkową naturą Vulkana może pozwolić uzyskać wyższą wydajność, ograniczyć zużycie energii i opóźnienia w porównaniu do OpenGL ES.

Niestety, do tej pory żadna wersja S7 nie dostała aktualizacji z obsługą nowego API. Jednocześnie mamy zapowiedziane 3 gry oparte o Vulkana no i oczywiście porty RetroArch i Dolphina. Czekam.

piątek, 10 czerwca 2016

Otwarta fotogrametria: openMVG i openMVS

Fotogrametria pozwala na przeniesienie kształtu rzeczywistego do wirtualnego środowiska 3D za sprawą zaledwie kilku zdjęć i mocy obliczeniowej, której jest pod dostatkiem w w twoim czy moim domu. Specjalnie odniosłem się do naszych komputerów, bo chcę pokazać, że nie trzeba wykorzystywać oprogramowania w stylu Autodesk 123D Catch i obliczeń "w chmurze".

Nie potrzebny będzie też żaden drogi sprzęt, ani nawet wysokiej klasy aparat cyfrowy. Zdjęcia na potrzeby wygenerowania modelu rękawiczki, który powinieneś widzieć poniżej, zostały zrobione tym antykiem. Kosztował on mnie  450 zł jakieś 12 lat temu. Telefon, który masz w kieszeni, pewnie robi znacznie lepsze zdjęcia.


Uwaga: poniższy tekst nie jest tutorialem, a raczej luźnymi notatkami, które mają tak samo służyć mi za kilka miesięcy lub lat, jak i innym czytelnikom. Może przestawiać nieoptymalny przebieg procesu.

Jeśli nie widzisz obracalnego modelu 3D (bo przeglądarka nie obsługuje WebGL lub serwis ShareMy3D padł), to poniżej znajduje się statyczny zrzut ekranu.


Oprogramowanie - kompilacja

Opis bazuje na założeniu, że użytkownik korzysta z jakiejś współczesnej dystrybucji Linuksa. W moim przypadku jest to Kubuntu 16.04 64-bit.

Utworzyłem jeden katalog dla całego oprogramowania do fotogrametrii. W tym katalogu skompilowałem dwa pakiety:
  1. openMVG, zgodnie z oficjalnymi instrukcjami,
  2. openMVS, zgodnie z oficjalnymi instrukcjami,
  3. dodatkowo zainstalowałem MeshLab - wygodną przeglądarkę i edytor chmur punktów oraz modeli 3D, znajdziesz go w swoim ulubionym menedżerze pakietów.
O ile openMVG nie powinno sprawić problemów, to openMVS może zrobić niemiłą niespodziankę.
Pierwszym problemem w Ubuntu 16.04 jest niestabilna wersja (3.3-beta) pakietu libeigen-dev. Obszedłem ten problem pożyczając od Debiana paczkę deb w wersji 3.2.
Drugim okazało się vcglib i błąd związany z przestrzenią nazw:
error: ‘isinf’ was not declared in this scope
error: ‘isnan’ was not declared in this scope
Wystarczyło odszukać plik vcglib/vcg/math/base.h i zamienić
template int IsNAN(T t) { return isnan(t) || isinf(t); }
na
template int IsNAN(T t) { return std::isnan(t) || std::isinf(t); }

Ogólny model postępowania

Pakiet oprogramowania openMVG będzie karmiony wykonanymi przez nas zdjęciami, próbując znaleźć położenie punktów składających się na obiekt i stworzyć rzadką chmurę. Etap ten opisany jest w dokumentacji SfM: Structure from Motion. Chmura punktów będzie podstawą do pracy openMVS, które kolejno zagęści chmurę, utworzy siatkę wielokątów i w końcu oteksturuje ją.

Na początek potrzebujemy kilku zdjęć przy dobrym oświetleniu, bez użycia flesza, najlepiej z niezbyt dużym przesunięciem między nimi.

Sprytnym trikiem jest podłożenie pod obiekt czegoś o charakterystycznym wzorze, jak gazeta, czy (w moim przypadku) mapa. To znacznie poprawia skuteczność algorytmów SfM. Problematyczne okazują się za to obiekty o znacznych powierzchniach w jednolitym kolorze, odbijających światło lub częściowo przezroczystych.

Proces krok po kroku

Zakładam że openMVS i openMVG zostały skompilowane w wspólnym katalogu:
ls -l
razem 28
drwxrwxr-x  7 adi adi 4096 cze 10 20:49 ceres_build
drwxrwxr-x 12 adi adi 4096 cze  9 18:54 ceres-solver
drwxrwxr-x  6 adi adi 4096 cze  9 19:44 openMVG
drwxrwxr-x 12 adi adi 4096 cze  9 21:07 openMVG_Build
drwxrwxr-x  8 adi adi 4096 cze  9 18:42 openMVS
drwxrwxr-x  8 adi adi 4096 cze  9 19:41 openMVS_build
drwxrwxr-x  9 adi adi 4096 cze  9 18:34 vcglib
Wykonałem 10 zdjęć rękawiczki położonej na mapie Polski i wrzuciłem je (niezbyt elegancko) do katalogu openMVG_Build/software/SfM/lapka_in

Kolejny krok to uruchomienie skryptu Pythona:
python SfM_GlobalPipeline.py lapka_in lapka_global_out
I już tutaj pojawił się pierwszy zgrzyt. OpenMVG poinformowało o braku modelu aparatu cyfrowego w bazie:
Warning & Error messages:
IM000217" model "Photosmart M407" doesn't exist in the database
Wystarczyło otworzyć plik openMVG/src/openMVG/exif/sensor_width_database/sensor_width_camera_database.txt i dodać odpowiednią pozycję.

W konsoli powinniśmy zobaczyć m.in.:
Structure estimation took (s): 1.861.
#landmark found: 12600
...Generating SfM_Report.html
Found a sfm_data scene with:
 #views: 10
 #poses: 10
 #intrinsics: 1
 #tracks: 12600
10 zdjęć i 10 rozpoznanych pozycji, to dobry znak. Otwierając chmurę punktów lapka_global_out/reconstruction_global/colorized.ply w programie MeshLab zobaczymy coś takiego:

To chmura rzadka, stąd nie przypomina jeszcze naszego fotografowanego obiektu, ale warto zwrócić uwagę na zielone punkty. To pozycje aparatu podczas robienia zdjęć.

Musimy wyeksportować wyniki z openMVG do formatu przyjaznego openMVS (dokumentacja):
../../Linux-x86_64-RELEASE/openMVG_main_openMVG2openMVS -i \
lapka_global_out/reconstruction_global/sfm_data.bin -d lapka_out -o lapka_out/scene.mvs
Teraz, już używając openMVS, zagęszczamy chmurę:
../../../openMVS_build/bin/DensifyPointCloud lapka_out/scene.mvs
Tak wygląda chmura gęsta otwarta w MeshLab (plik lapka_out/scene_dense.ply):

Pozostało tylko wygenerować siatkę wielokątów i oteksturować ją:
../../../openMVS_build/bin/ReconstructMesh lapka_out/scene_dense.mvs
../../../openMVS_build/bin/TextureMesh lapka_out/scene_dense_mesh.mvs
Efekt końcowy powinien być taki jak na początku wpisu.

 

Q&A:

Q: Ile trwa cały proces?
A: Kilkanaście sekund do kilku minut, dla zadań jak w powyższym opisie.

Q: Nie masz ładniejszego przykładu niż zmiętoszona rękawiczka?
A: 30-letni misiu może być?

 
Q: W czym jest to lepsze od popularnych rozwiązań "w chmurze"?
A: Nie ma ograniczenia co do liczby zdjęć (np. Autodesk 123D Catch pozwala tylko na 70 zdjęć), nie trzeba czekać na wysłanie zdjęć na serwer, łatwiej zdiagnozować problem w razie niepowodzenie i nie trzeba zaptaszać żadnych cyrografów podczas instalacji. Bardziej zaawansowani użytkownicy mogą usprawnić proces pisząc skrypty czy przyjazne GUI (pewnie już ktoś to zrobił).

Q: Czy opisywane oprogramowanie działa na Windows?
A: Oczywiście, że tak.

Q: Coś jeszcze?
A: Obracaj modelem rękawiczki lub misia od patrząc na niego od wewnątrz a ulegniesz złudzeniu optycznemu.

niedziela, 10 kwietnia 2016

Vulkan na mobilnym GeForce (Optimus)

Nie każdy sterownik Nvidii obsługujący API Vulkan pod Linuksem, potrafi to robić również w przypadku kart mobilnych do zastosowań domowych (o dziwo to ograniczenie nie dotyczy profesjonalnej serii Quadro). Mój układ graficzny może działać przy wykorzystaniu sterownika 364.15, którego opis zawiera:

GeForce 600M Series (Notebooks):GeForce GTX 680MX, GeForce GTX 680M, GeForce GTX 675MX, GeForce GTX 675M, GeForce GTX 670MX, GeForce GTX 670M, GeForce GTX 660M, GeForce GT 650M, GeForce GT 645M, GeForce GT 640M, GeForce GT 640M LE, GeForce GT 635M, GeForce GT 630M, GeForce GT 625M, GeForce GT 620M, GeForce 610M

Uruchomienie sterownika Vulkan na Kubuntu 16.04

Zdecydowanie najprostszą metodą na zdobycie tego sterownika jest dodanie dedykowanego repozytorium:
sudo apt-add-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt install vulkan-utils nvidia-364 nvidia-prime

Kolejnym krokiem powinno być zawsze zajrzenie do dokumentacji Nvidii, która nakazuje nam stworzenie tak wyglądającego /etc/X11/xorg.conf:
Section "Module"
    Load "modesetting"
EndSection

Section "Device"
    Identifier "nvidia"
    Driver "nvidia"
    BusID "BusID for NVIDIA device here"
    Option "AllowEmptyInitialConfiguration"
EndSection

BusID uzyskamy wykorzystując lspci:
lspci | grep VGA
00:02.0 VGA compatible controller: Intel Corporation 3rd Gen Core processor Graphics Controller (rev 09)
01:00.0 VGA compatible controller: NVIDIA Corporation GK107M [GeForce GT 645M] (rev a1)

Stąd w moim przypadku xorg.conf będzie wyglądać tak:
Section "Module"
    Load "modesetting"
EndSection

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

Wydaje mi się, że modyfikacje .xinitrc opisane w dokumentacji nie są potrzebne, bo xrandr wywoływany jest przez skrypt /sbin/prime-offload będący częścią pakietu nvidia-prime (który zainstalowaliśmy wcześniej).

Warto sprawdzić konfigurację dla OpenGL, która wygląda u mnie następująco:
sudo update-alternatives --config x86_64-linux-gnu_gl_conf
Są 3 dostępne alternatywy dla x86_64-linux-gnu_gl_conf (dostarczające /etc/ld.so.conf.d/x86_64-linux-gnu_GL.conf).

  Wybór       Ścieżka                                  Priorytet  Status
------------------------------------------------------------
  0            /usr/lib/nvidia-364/ld.so.conf              8604      tryb auto
  1            /usr/lib/nvidia-364-prime/ld.so.conf        8603      tryb ręczny
* 2            /usr/lib/nvidia-364/ld.so.conf              8604      tryb ręczny
  3            /usr/lib/x86_64-linux-gnu/mesa/ld.so.conf   500       tryb ręczny

W tym momencie pozostaje restart i uruchomienie vulkaninfo by sprawdzić poprawność instalacji.

Test wydajności

Obecnie jedyną wydaną grą wykorzystującą API Vulkan jest The Talos Principle. Aby uruchomić ją na Vulkanie, trzeba wykonać kilka kroków:
  1. Włączyć kanał beta "publicbeta": PPM na grę w kliencie Steam-Właściwości-BETA-publicbeta
  2. W opcjach uruchamiania (PPM-Właściwości-Ustaw Opcje uruchamiania) wpisać %command% +gfx_strAPI = "VLK"
  3. Podczas startu gry wybrać wersję 64-bitową
  4. Jeśli chcemy używać nakładki Steam (Steam overlay) to musimy również klienta Steam zaktualizować do kanału beta
Poniżej znajdują się wyniki wbudowanego benchmarku dla kilku konfiguracji. Szersze omówienie w dalszej części posta.


Dane sprzętu testowego (zapisane w pliku Talos.log):
11:34:00 LOG:  Power saving settings:
11:34:00 WRN:  CPU Power saving is enabled and performance governor is not used.
11:34:00 LOG:  
11:34:00 LOG:  XDG_CURRENT_DESKTOP: KDE
11:34:00 LOG:  GDMSESSION: (null)
11:34:00 LOG:  DESKTOP_SESSION: /usr/share/xsessions/plasma
11:34:00 LOG:  KDE_SESSION_VERSION: 5
11:34:00 LOG:  
11:34:00 LOG:  * CPU...
11:34:00 LOG:  Vendor: GenuineIntel
11:34:00 LOG:  Name: Intel(R) Core(TM) i7-3632QM CPU @ 2.20GHz
11:34:00 LOG:  Type: 0, Family: 6, Model: 10, Stepping: 9
11:34:00 LOG:  Clock: 2.20 GHz
11:34:00 LOG:  Cores: 8
11:34:00 LOG:  CMOV: Yes
11:34:00 LOG:  SSE: Yes
11:34:00 LOG:  Invariant TSC: Yes


1:34:00 INF:  * Desktop settings...
11:34:00 INF:  Color depth: 32-bit
11:34:00 INF:  Desktop resolution: 1366 x 768
11:34:00 LOG:  Loaded "/home/adi/.local/share/Steam/steamapps/common/The Talos Principle/Bin/x64/GfxVLK.so".
11:34:01 LOG:    Content/CachedShaders_PC_Talos.gro: 14905 files, signature: OFFICIAL
11:34:01 LOG:  Zip file system updated in 0.37 seconds.
11:34:01 LOG:  Setting fullscreen flag on the window.
11:34:01 LOG:  Loaded "libvulkan.so.1".
11:34:01 LOG:  Device memory used: 771 MB in 9 block(s)
11:34:01 LOG:    Host memory used: 2000 MB
11:34:04 INF:  
11:34:04 INF:  Gfx API: Vulkan
11:34:04 INF:  Resolution: 1366 x 768
11:34:04 INF:  Vendor: nVidia (0x10DE)
11:34:04 INF:  Driver: Vulkan (0x0FD9)
11:34:04 INF:  Renderer: GT 645M
11:34:04 INF:  Version: 1526972416
11:34:04 INF:  Video memory size: 2048 MB
11:34:04 INF:  Available for textures: 1365 MB
11:34:04 INF:  Shader model version: 5.0
11:34:04 INF:  Active GPU(s): 1
11:34:04 INF:  GPU architecture: forward conventional rendering
11:34:04 INF:  Allowed memory size used for streaming: 136

I dla OpenGL:
11:40:03 LOG:  GPU #1: GeForce GT 645M/PCIe/SSE2 from NVIDIA Corporation
11:40:03 INF:  [OpenGL] Detected GLSL 4.50
11:40:18 INF:  
11:40:18 INF:  Gfx API: OpenGL
11:40:18 INF:  Resolution: 1366 x 768
11:40:18 INF:  Vendor: nVidia (0x10DE)
11:40:18 INF:  Driver: NVIDIA Corporation (0x0FD9)
11:40:18 INF:  Renderer: GeForce GT 645M/PCIe/SSE2
11:40:18 INF:  Version: 4.5.0 NVIDIA 364.15
11:40:18 INF:  Video memory size: 2048 MB
11:40:18 INF:  Available for textures: 2048 MB
11:40:18 INF:  Shader model version: 5.0
11:40:18 INF:  Active GPU(s): 1
11:40:18 INF:  GPU architecture: forward conventional rendering
11:40:18 INF:  Allowed memory size used for streaming: 256.0 MB

Przy standardowych ustawieniach (zalecanych przez autodetekcję gry) CPU średnie, GPU średnie, pamięć GPU wysokie, Vulkan jest nieco szybszy (34,7 kl./s) od OpenGL (32,4 kl./s):
11:36:53 INF:    Gfx API: Vulkan
11:36:53 INF:   Duration: 60.0 seconds (2083 frames)
11:36:53 INF:    Average: 34.7 FPS (35.4 w/o extremes)
11:36:53 INF:   Extremes: 66.3 max, 21.7 min
11:36:53 INF:   Sections: AI=3%, physics=1%, sound=1%, scene=86%, shadows=6%, misc=3%
11:36:53 INF:      Highs: 317 in 7.3 seconds (43.5 FPS)
11:36:53 INF:       Lows: 441 in 15.3 seconds (28.8 FPS)
11:36:53 INF:  20-30 FPS: 18%
11:36:53 INF:  30-60 FPS: 82%

11:43:12 INF:    Gfx API: OpenGL
11:43:12 INF:   Duration: 60.0 seconds (1941 frames)
11:43:12 INF:    Average: 32.4 FPS (33.1 w/o extremes)
11:43:12 INF:   Extremes: 106.7 max, 16.5 min
11:43:12 INF:   Sections: AI=3%, physics=1%, sound=1%, scene=82%, shadows=10%, misc=3%
11:43:12 INF:      Highs: 286 in 5.4 seconds (53.0 FPS)
11:43:12 INF:       Lows: 328 in 14.4 seconds (22.7 FPS)
11:43:12 INF:   < 20 FPS:  3%
11:43:12 INF:  20-30 FPS: 32%
11:43:12 INF:  30-60 FPS: 62%
11:43:12 INF:   > 60 FPS:  3%

Sytuację zmienia włączenie nakładki Steam, która wpływa negatywnie tylko na renderer korzystający z Vulkana. Tu widać, że ktoś z trójki: Croteam, Valve, Nvidia ma błąd do naprawy:
11:48:20 INF:    Gfx API: Vulkan
11:48:20 INF:   Duration: 60.0 seconds (1640 frames)
11:48:20 INF:    Average: 27.3 FPS (27.8 w/o extremes)
11:48:20 INF:   Extremes: 39.4 max, 12.0 min
11:48:20 INF:   Sections: AI=3%, physics=1%, sound=1%, scene=89%, shadows=4%, misc=2%
11:48:20 INF:      Highs: 244 in 7.2 seconds (33.8 FPS)
11:48:20 INF:       Lows: 292 in 13.0 seconds (22.4 FPS)
11:48:20 INF:  20-30 FPS: 69%
11:48:20 INF:  30-60 FPS: 31%

11:50:21 INF:    Gfx API: OpenGL
11:50:21 INF:   Duration: 60.0 seconds (1938 frames)
11:50:21 INF:    Average: 32.3 FPS (33.1 w/o extremes)
11:50:21 INF:   Extremes: 99.9 max, 10.6 min
11:50:21 INF:   Sections: AI=3%, physics=1%, sound=1%, scene=82%, shadows=10%, misc=3%
11:50:21 INF:      Highs: 263 in 5.0 seconds (53.1 FPS)
11:50:21 INF:       Lows: 306 in 13.7 seconds (22.3 FPS)
11:50:21 INF:   < 20 FPS:  3%
11:50:21 INF:  20-30 FPS: 32%
11:50:21 INF:  30-60 FPS: 63%
11:50:21 INF:   > 60 FPS:  2% 

Warto zwrócić uwagę na tzw. stuttering, czyli nierównomierności w czasie trwania klatek. Górny zrzut ekranu przedstawia grę na Vulkanie z włączonym wykresem kl./s (można to zrobić wpisując w konsoli prf_bShowFPSGraph = 1).
Dolny przedstawia analogiczną sytuację na OpenGL.



Różnica jest druzgocząca i pokazuje jak gra na OpenGL może sprawiać wrażenie niepłynnej nawet przy wysokiej średniej liczbie klatek na sekundę.

Pozostała jeszcze jedna rzecz do zbadania, a mianowicie sprawdzenie wydajności gdy gra ograniczana jest przez procesor a nie kartę graficzną. Ustawiłem w tym celu: GPU najniższe, pamięć GPU najniższe, pozostawiając pozostałe ustawienia niezmienione. W tym wypadku Vulkan był aż o jedną piątą szybszy niż OpenGL!
11:39:48 INF:    Gfx API: Vulkan
11:39:48 INF:   Duration: 60.0 seconds (7502 frames)
11:39:48 INF:    Average: 125.1 FPS (126.0 w/o extremes)
11:39:48 INF:   Extremes: 251.1 max, 78.7 min
11:39:48 INF:   Sections: AI=10%, physics=3%, sound=2%, scene=76%, shadows=0%, misc=9%
11:39:48 INF:      Highs: 1266 in 7.5 seconds (168.0 FPS)
11:39:48 INF:       Lows: 1239 in 12.8 seconds (96.8 FPS)
11:39:48 INF:   > 60 FPS: 100%
 
11:45:55 INF:    Gfx API: OpenGL
11:45:55 INF:   Duration: 60.0 seconds (6116 frames)
11:45:55 INF:    Average: 101.9 FPS (109.2 w/o extremes)
11:45:55 INF:   Extremes: 220.9 max, 29.1 min
11:45:55 INF:   Sections: AI=9%, physics=2%, sound=1%, scene=80%, shadows=0%, misc=8%
11:45:55 INF:      Highs: 657 in 3.9 seconds (168.3 FPS)
11:45:55 INF:       Lows: 862 in 14.0 seconds (61.6 FPS)
11:45:55 INF:  30-60 FPS:  5%
11:45:55 INF:   > 60 FPS: 95% 

Co z Intelem? 

Chcąc użyć Vulkana na otwartym sterowniku Intela potrzebujemy innego repozytorium.

Instalacja sterownika:
sudo apt-add-repository ppa:canonical-x/vulkan
sudo apt update
sudo apt install vulkan-utils mesa-vulkan-drivers vkcube

Konieczne jest też włączenie DRI3 w xorg.conf:
Section "Device"
    Identifier "Intel Graphics"
    Driver "intel"
    Option "DRI" "3"
EndSection

Niestety w na moim sprzęcie już najprostsze demo vkcube alarmowało:
vkcube 
WARNING: Ivy Bridge Vulkan support is incomplete

by zaraz po starcie się wysypać. Podobny problem dotyczył również Talosa. Co gorsza, tak długo jak był zainstalowany sterownik Intela, aplikacje nie potrafiły wykorzystywać implementacji dostaczonej przez Nvidię. Nie pozostało mi nic innego jak usunąć repozytorium:
sudo ppa-purge canonical-x/vulkan

Słowo podsumowania 

Już dziś gra działająca na Vulkanie potrafi dostarczyć znacznie lepszych doznań niż na dopieszczanym przez lata rendererze wykorzystującym OpenGL. Szczególne brawa należą się za stabilną prędkość wyświetlania, coś co można osiągnąć gdy aplikacja ma ścisłą kontrolę nad sprzętem. Za Vulkanem stoi hipoteza twierdząca, że twórca aplikacji wie lepiej co ona robi niż twórca sterownika.

Pozostało parę drobnych błędów, jak spadek wydajności po włączeniu nakładki Steam czy zawodne przełączanie API w menu TTP (stąd użyliśmy opcji przy starcie). Pozostaje mieć tylko jedno życzenie: więcej gier korzystających z Vulkana!