======Vulkan sous Linux avec Wine avec une carte NVIDIA======
\\
\\
Cela peut sembler complexe mais finalement cela se révèle assez simple une fois que l'on a saisi le fonctionnement et les impératifs. Il est bon d'avoir les connaissances de base d'utilisation de Play on Linux tels que décrit ici :\\ [[http://www.gamersonlinux.com/forum/threads/playonlinux-explained-wine-versions-manager.261/]]\\
====Procédure====
**1.** Installer **Vulkan** :
sudo apt update
sudo apt install libvulkan1 libvulkan-dev vulkan-tools
(25 oct 2018 : **vulkan-utils** a été remplacé par **vulkan-tools**)
**2.** **Mesa** récent __impératif__ pour les pilotes libres (intel, nouveau, AMD) + **Mesa Vulkan** donc ajout du dépôt des dernières versions sinon pour les pilotes propriétaires passer à l'étape 4 :
sudo add-apt-repository ppa:oibaf/graphics-drivers
sudo apt update
sudo apt upgrade
sudo apt install mesa-vulkan-drivers
**3.** **Pilotes propriétaires NVIDIA** avec gestion de Vulkan donc ajout du dépôt proposant les versions récentes et installation de ces dernières :
sudo add-apt-repository ppa:graphics-drivers/ppa
sudo apt update
sudo apt upgrade
Vérifier la version des pilotes et si besoin installer les pilotes propriétaires NVIDIA avec une version égale ou supérieure à 396.51, les pilotes de la branche 390 et inférieures **NE fonctionneront PAS** avec Vulkan !
**4.**
C'est une bonne idée de tester tout de suite si Vulkan est fonctionnel sur la machine hôte linux en tapant dans la console
vkcube
Une fenêtre devrait s'ouvrir et afficher un cube en rotation. Dans le cas contraire redémarrer et tester à nouveau. Si cela ne fonctionne toujours pas reprendre depuis le début.
**5.** Installer **Play on Linux** & **Winetricks** :
wget https://www.playonlinux.com/script_files/PlayOnLinux/4.2.12/PlayOnLinux_4.2.12.deb
sudo dpkg -i PlayOnLinux_4.2.12.deb
sudo apt install winetricks
Une vieille version de Wine sera installée aussi en dépendance mais on ne s'en préoccupe pas.
**6.** Récupérer une version de **WINE** compatible Vulkan :
wget https://lutris.nyc3.digitaloceanspaces.com/runners/wine/wine-esync-staging-pba-3.17-x86_64.tar.gz
unzip wine-esync-staging-pba-3.17-x86_64.tar.gz -d $HOME/.PlayOnLinux/wine/linux-amd64
Le dépôt https://lutris.net/files/runners/ n'est PLUS utilisable, depuis fin septembre 2018.\\ https://github.com/Kron4ek/Wine-Builds/releases est la nouvelle référence qui propose les versions stagging+esync+pba(lorsqu'elle est fonctionnelle) en x86 & amd64.
**7.** Lancer **PoL** -> Tools -> manage Wine versions -> Wine version (amd64) et vérifier qu'elle est listée, la sélectionner, puis fermer la fenêtre de gestion des versions.\\
**8.** Installer un jeu DirectX 11, par exemple **Path of Exile** que nous utiliserons par la suite :
wget https://web.poecdn.com/downloads/PathOfExileInstaller.exe
**9.** File -> install -> install a non-listed programm -> OS 64 bits, sélectionner //PathOfExileInstaller.exe// et suivre les instructions.\\
\\
**10.** Indiquer utiliser la version //esync-3.14-x86_64// et nommer le système **Path_of_Exile**. Une fois terminée, pas plus d’icônes/programmes.\\
\\
**11.** Dans **PoL** cliquer sur le **gros engrenage** avec dessous **CONFIGURE**, sous **Help**\\
\\
**12.** Sélectionner //Path_of_Exile// dans la liste, onglet **GENERAL** -> **Wine version**, vérifier que //wine-esync-3.14-x86_64// est bien attribué à PoE et que l'exécutable est bien //PathOfExile_x64//\\
\\
**13.** Placer dans le champ **Arguments** :
--waitforpreload --nologo --garbage-generation 2
**14.** Onglet **Miscellaneous** -> dans le champs **Commands to exec before running the program** mettre :
export DXVK_HUD=devinfo,fps,memory,version
export DXVK_USE_PIPECOMPILER=1
export WINEESYNC=1
export CSMT=enabled
export DXVK_ASYNC=1
export __GL_YIELD=NOTHING
L'optimisation **export LD_PRELOAD="libpthread.so.0 libGL.so.1" et GL_THREADED_OPTIMIZATIONS=1** souvent conseillée n'est valide que pour OpenGL or nous voudrons employer Vulkan, nul besoin de placer une optimisation rendue inutile quelques étapes plus loin.
**15.** Onglet **Display** -> **GLSL support** désactivé, **Video Memory Size** 2048 puis fermer la fenêtre, les changement seront directement pris en compte.\\
\\
**16.** Lancer PoE pour tester en mode DX9. Si tout se passe bien après une vingtaine de secondes du fait des arguments forçant le préchargement on arrivera à l'écran pour se loger, confirmant que le jeu fonctionne en DX9 et que nous pouvons continuer. Fermer alors le jeu.\\
\\
**17.** Taper dans la console :
export $WINEPREFFIX=$HOME/.PlayOnLinux/wineprefix/Path_of_Exile
**18.** Charger les librairies de conversion **DXVK** 0.70 ou supérieures pour le PoE sous Wine et les installer avec Winetricks :
wget https://github.com/doitsujin/dxvk/releases/download/v0.71/dxvk-0.71.tar.gz
unzip dxvk-0.71.tar.gz
cd dxvk-0.71
winetricks --force setup_dxvk.verb
**L'étape 17 est essentielle** parce qu'elle défini dans quel système seront installées les librairies **DXVK** via **Winetricks**.\\
Il y aura des messages venant de **WINE**, refuser l'installation de **Gecko** et **MONO** qui ne servent à rien ici.
Si il y a eu l'installation d'une version antérieure à 0.70 de **DXVK** il faudra aller dans
//$HOME/.PlayOnLinux/wineprefix/Path_of_Exile/drive_c/windows/system32// ainsi que dans //syswow64// et retirer TOUS les SYMLINKS AVANT d'exécuter Winetricks **sinon l'opération échouera SANS message d'erreur**
Si besoin pour installer les librairies DLL manuellement il faut prendre celles dans //dxvk-0.71/x64// (ou toutes version ultérieure) et les placer dans //$HOME/.PlayOnLinux/wineprefix/Path_of_Exile/drive_c/windows/system32//\\
Note : l'étape 17 permet à Winetricks de savoir dans quel système installer les DLL ad-hoc.\\
**19.** Sous **PoL** sélectionner **Path of Exile**, clic droit -> **Configure Wine**. Il peut y avoir de nouveau des fenêtres **Wine** et des propositions d'installation de **Gecko** et **Mono** à refuser.\\
Onglet **Librairies** vérifier que d3d10 (native), d3d10_1 (native), d3d10core (native), d3d11 (native), dxgi (native) soient présentes et uniquement celles-ci. Dans le cas contraire retour à l'étape 18.
d3dcompiler_47 **pourrait** être nécessaire, à tester [EDIT] À priori non
**20.** Onglet **Graphics** tout décocher. Puis cliquer sur **OK**.\\
\\
**21.** Lancer **PoE** et aller dans les **OPTIONS**, sélectionner DirectX 11 dans le champs **DirectX version**. Redémarrer\\
\\
**22.** Si tout se passe bien PoE se lance en mode VULKAN et donc on voit en haut à gauche le nom de la carte graphique employée, la version du pilote vidéo (396.51 et au-delà), la version des librairies VULKAN, le nombre d'images par seconde, la quantité de mémoire vidéo utilisée et la version de VULKAN utilisée.\\
Si la version de **VULKAN** ne correspond pas à celle attendue, par exemple une mise à jour effectuée mais le système emploie toujours la version précédente, se référer à l'installation manuelle de l'étape 18 cette fois-ci en effaçant les fichiers de la version ancienne de VULKAN situés dans //system32// et //syswow64// avant de les remplacer par les nouveaux: d3d10.dll, d3d10_1.dll, d3d10core.dll, d3d11.dll, dxgi.dll
\\
**23.** Dans les **OPTIONS** mettre **ENGINE MULTITHREADING** sur **Disabled** (au début tout au moins, quelquefois cela stabilise les images par secondes lors des scenes chargées mais d'autres fois cela fait baisser la moyenne c'est donc à tester selon les configurations) et de même pour le **VSYNC**. Il existe un bug qui se manifeste par un blocage des images par seconde à la fréquence du moniteur comme si le VSYNC était activé alors qu'il ne l'est pas. Dans ce cas pour ne plus en être victime changer le **niveau détail de textures** dans les options. De même il arrive que certaines zones fassent tomber les images par seconde à 4-5 dans ce cas changer les **OMBRES**. Depuis peu PoE permet en DX11 d'utiliser une gestion de l'illumination globale pour les gestion des lumières et ombres, succinctement par l'inclusion d'un shader englobant tout l'écran, mais avec une perte important du taux d'images par seconde, de l'ordre de 2 à 4 fois, donc réservé à des cartes assez puissantes (>750Ti).
BON JEU !
\\
Si le jeu ne fonctionne pas il faut tester si Vulkan fonctionne déjà avec la version de Wine employée
Pour cela charger le test VulkanCube :
wget https://haagch.frickel.club/files/cube-vulkansdk1.0.65.tar.xz
unzip cube-vulkansdk1.0.65.tar.xz
cd cube-vulkansdk1.0.65/
$HOME/.PlayOnLinux/wine/linux-amd64/esync-3.14-x86_64/bin/wine64 cube.exe
**NOTE** : il est important de lancer cube.exe depuis son répertoire avec ses ressources sinon il produit une erreur.
Si tout se passe bien une fenêtre s'ouvre et présente un cube en rotation.
Si ce n'est pas le cas c'est que VULKAN n'est pas opérationnel et donc __**il FAUT reprendre toutes les étapes depuis le départ**__
Pour une compatibilité (très limitée) avec DX10 dans d'autres jeux tels //Crysis// ou //Assassin's Creed// il est impératif d'installer **d3dcompiler_43.dll** :
export $WINEPREFFIX=$HOME/.PlayOnLinux/wineprefix/nom_du_jeu_installé
winetricks d3dcompiler_43
Voir [[https://github.com/doitsujin/dxvk/issues/551]]
----
====Explications====
* **Wine** est un émulateur de système Microsoft Windows permettant d'exécuter des programmes Windows sous Linux (ou Mac).
* Les versions **Wine-staging** inclues des améliorations expérimentales et des correctifs que ne possèdent pas les versions classiques de **Wine**.
* **Wine-esync** est une variante basée sur **Wine-staging** incluant des optimisations plus poussées pouvant autant aider que freiner. Ici elles aident mais certains jeux demandent une version spécialisée pour fonctionner correctement. À partir de la version 3.12 Wine-staging est capable de faire transiter les instructions Vulkan à l'hôte comme si il s'agissait d'une application Vulkan native mais reste un simple TRANSPORTEUR et nécessite l'installation de librairies Vulkan sur le système hôte pour faire la conversion. Wine classique ne gère pas correctement Vulkan.
* **Vulkan** est le petit frère d'OpenGL mais contrairement à son vieux frangin il est moins générique mais modernisé et très optimisé pour moins utiliser le CPU permettant de meilleures performances lorsque ce dernier est le facteur limitant.
* La commande bash **export** permet d'assigner un contenu à une variable comme il aurait été le cas avec une simple déclaration mais met à disposition cette variable et son contenu AUX AUTRES PROCESSS, y compris ceux n'ayant aucun lien de parenté. C'est obligatoire pour que les options soient exploitables par WINE sinon il ne voit rien.\\
* **$WINEPREFFIX=** définie à Wine l'emplacement du système (PoE ici) à lancer. Pour lancer un autre système il faut changer $WINEPREFFIX= pour pointer vers ce système.\\
* **DXVK** est un ensemble de librairies convertissant les commandes DirectX 11 en commandes Vulkan qui sont ici ensuite transportées par Wine jusqu'au système hôte puis par Vulkan sur ce dernier et enfin interprétées par les pilotes de la carte graphique.\\
* **VKD3D** est la partie de Vulkan sous Wine qui converti les instructions DIRECTX 12 en VULKAN.\\
* **VK9** est la partie de Vulkan sous Wine qui converti les instructions DIRECTX 9 en VULKAN.\\
[[https://www.phoronix.com/scan.php?page=news_item&px=VKD3D-Taking-Flight]]\\
**Gallium Nine** est un système **dédié aux pilotes graphiques libres** qui leur envoie les commandes **D3D9** sans conversion vers OpenGL, d'où un gain de performance les mettant plus ou moins au niveau des pilotes propriétaires. Incompatible avec VULKAN.
\\
Les étapes 1, 2, 3 et 4 sont nécessaires parce que :\\
1. L'ensemble **libvulkan1 libvulkan-dev vulkan-utils** est le noyau dur interfaçant les applications et les pilotes utilisant Vulkan.\\
2. **Mesa** est une bibliothèque 3D gérant OpenGL & Vulkan et est employée par les serveurs d'affichage type Wayland, Xorg et les pilotes libres Nouveau (pour cartes graphiques NVIDIA par la communauté libre) et Intel. Bien qu’apparemment optionnelle elle garantie une cohérence de la pile graphique et donc la stabilité du système lors du passage de l'environnement du bureau à une application, fenêtrée ou non, utilisant Vulkan. Une version récente permet aussi d'avoir la correction d'éventuels bugs.\\
3. **Mesa-vulkan-drivers** est la partie gérant spécifiquement Vulkan en envoyant les commandes Vulkan au pilote de la carte graphique.\\
4. Les Pilotes **NVIDIA 396.51** et au-delà prennent en charge les instructions Vulkan pour piloter la carte graphique.\\
\\
====Détails des commandes à exécuter avant de lancer le programme (dans PoL)===
* Pour ne plus avoir les informations dans les applications employant Vulkan quand à la carte graphique et les pilotes il suffit d'éditer **export DXVK_HUD=** et de retirer **devinfo** il ne restera donc plus que l'affichage des images par seconde.\\
* **DXVK_USE_PIPECOMPILER=1** active la compilation asynchrone des shaders et est nécessaire pour limiter les lags dans PoE du fait des compilations en temps réel des shaders au fur et à mesure que l'on arrive dans de nouveaux environnements. https://www.phoronix.com/scan.php?page=news_item&px=DXVK-0.51-Released \\
* **WINEESYNC=1** active un chemin alternatif des appels (excessifs) vers wineserver, réduisant de manière drastique l'usage du CPU dans de nombreux jeux. https://github.com/zfigura/wine/blob/esync/README.esync \\
* ** __GL_YIELD=NOTHING__** (2 x _ avant le GL !!) désactive les fonctions de mise en attente des pilotes de la carte graphique lorsqu'elle attend les réponses du système lors de certaines opérations. Remplacer **NOTHING** par **USLEEP** a un effet dévastateur sur les images par seconde ( divisés par 2 et même plus ). http://us.download.nvidia.com/XFree86/Linux-x86/177.82/README/chapter-11.html\\
* Il est possible de rajouter **export LD_PRELOAD="libpthread.so.0 libGL.so.1" export __GL_THREADED_OPTIMIZATIONS=1** afin d'activer la gestion 'optimisée' des instructions dans les pilotes **NVIDIA** mais cela abouti souvent à une perte de performances donc à tester au cas par cas.
====Détails des arguments dans l'onglet général===
**--waitforpreload --nologo -gc 2**\\
Le plus simple est de lire ce qui est écrit dans la page dédiée :\\
https://pathofexile.gamepedia.com/Launch_options
----
====NOTES====
Attention en spécifiant que l'OS est Windows 10 il est possible que certains jeux ( World of Tanks notamment ) se lancent EXCLUSIVEMENT en DIRECTX 11 et donc plantent dès l'accès aux menus sans messages d'erreur si VULKAN, DXVK et Wine Staging ne sont pas déjà installés et utilisés. Rien de rédhibitoire mais il faut y penser plutôt que de passer des heures dessus ou de décréter que ça ne marche pas.\\
\\
Il faut aussi pour permettre à la fonction **ESYNC** de fonctionner convenablement éditer (avec sudo) :\\
**/etc/systemd/system.conf**\\
**/etc/systemd/user.conf**\\
Et rajouter dans chaque, à la fin :\\
**DefaultLimitNOFILE=1048576**\\
[[https://github.com/lutris/lutris/wiki/How-to:-Esync]]