After 8+ years of running EVE Online on Linux with great success, recently there have been major changes to the nvidia and vulkan libraries causing some issues. Along with the changes on EVE Client towards DX11 and 64bit upgrades there has been a few hurdles to keep EVE running smoothly.
On the 26th Feb 2020 CCP turned off the ability to launch and use 32bit clients so any reference to 32bit installations here is for historical purposes and won't work.
DX11 performs reasonably now on both wine DX11 and through the DXVK vulkan library. The only main issue I've experienced with DX11 are clouds in sites / anomalies appear as semi transparent squares:
The only way I've found to stop this from happening in DX11 is to set the shaders to low. Interestingly Vulkan through DXVK instead of DX11 renders the clouds perfectly:
Personally I've been running optimus nvidia laptops for 8+ years with varying levels of success.
Using bumblebee, bbswitch and optirun/primusrun commands to run games on the discrete graphics card worked, but was a pain and broke regularly. Windows runs differently and silently passes graphic intensive workloads off to the discrete card for processing, there is a similar implementation on Linux called PRIME Sync (https://forums.developer.nvidia.com/t/prime-and-prime-synchronization/44423).
PRIME Sync works by keeping the nvidia discrete graphic card on/running which will impact battery life, however you'll find the laptop performs better and even IDEs and slightly graphic intensive applications / desktop environments start to run smoother.
Firstly one of the following drivers will need installing:
Alternatively you can go with the NVIDIA base package with no dkms hook for the kernel however you'll need to make sure the NVIDIA package is installed in each kernel. Currently i've got the standard Arch Linux kernel along with Zen and LTS all installed and bootable via separate bootctl loader files. If you have multiple kernels dkms works great and reduces the amount of manual intervention needed after each update.
Quick search for installed packages for me gives:
lib32-nvidia-vulkan-utils 440.66.08-1 lib32-opencl-nvidia-vulkan 440.66.08-1 nvidia-prime 1.0-1 nvidia-vulkan-dkms 440.66.08-1 nvidia-vulkan-utils 440.66.08-1 opencl-nvidia-vulkan 440.66.08-1
Next you'll need to make sure the nvidia-drm module is loaded in the kernel:
vim /etc/modprobe.d/nvidia-drm-modeset.conf options nvidia-drm modeset=1
vim /boot/loader/entries/arch.conf options root=PARTUUID=xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxx rw nvidia-drm.modeset=1
Make sure to have the Intel graphic drivers (https://www.archlinux.org/packages/?name=mesa) installed as well, otherwise the passthrough to intel won't work:
lib32-mesa 20.0.4-1 lib32-mesa-vdpau 20.0.4-1 mesa 20.0.4-1 mesa-demos 8.4.0-2 vulkan-mesa-layer 20.0.4-1
Additionally wayland on gnome doesn't appear to support PRIME Sync yet, so make sure to disable inside:
vim /etc/gdm/custom.conf WaylandEnable=false
More information on this setup and other options can be found on the Arch Linux Wiki (https://wiki.archlinux.org/index.php/PRIME#Closed-source_drivers). To check prime sync is working either run the following command or check inside the nvidia-settings app:
xrandr --prop | grep PRIME
Once the proprietary NVIDIA drivers are installed and the discrete graphics card is running under PRIME Sync, setting up EVE Online can be done in one of two ways. Either by DirectX 9/11 or alternatively Vulkan with the DXVK library.
Firstly install the required packages for wine-staging and other required libraries, only run the second line if you want to run a vulkan + dxvk setup:
sudo pacman -S wine-staging wine_gecko winetricks wine-mono ttf-ms-fonts samba gnutls mpg123 sdl libpulse libldap sudo pacman -S vulkan-icd-loader vulkan-intel vulkan-tools vkd3d
EVE Online 32bit legacy client (deprecated):
Enable multilib see https://wiki.archlinux.org/index.php/Multilib (uncomment BOTH lines)
sudo vim /etc/pacman.conf [multilib] Include = /etc/pacman.d/mirrorlist
Next install the 32 bit libraries:
sudo pacman -S lib32-gnutls lib32-mpg123 lib32-sdl lib32-libldap lib32-libpulse sudo pacman -S lib32-vulkan-icd-loader lib32-vulkan-intel
Create a "wine prefix", think of this as the installation area for your windows based application, in this case EVE Online. Using winecfg we create a new prefix:
WINEARCH=win64 WINEPREFIX=~/.eve64 winecfg WINEARCH=win64 WINEPREFIX=~/.eve64-dxvk winecfg OR WINEARCH=win32 WINEPREFIX=~/.eve32 winecfg
Here there are a few different ways to run EVE Online which heavily depends on the software you choose next. In order of current recommendation:
DX9/DX11 Stanard (no Vulkan dxvk)
This is still currently the most stable way to run EVE Online on Linux, however note the graphics issue with dust clouds at the start of this post.
Next use winetricks to install the required wine packages:
WINEARCH=win64 WINEPREFIX=~/.eve64 winetricks vcrun2017 7zip d3dcompiler_43 d3dx11_43 d3dx9_43 OR WINEARCH=win32 WINEPREFIX=~/.eve32 winetricks vcrun2017 7zip d3dcompiler_43 d3dx11_43 d3dx9_43
Once EVE Online has been installed inside this newly created prefix you can switch the DirectX version being used inside the launcher settings. DX9 has better performance, however DX11 supports newer shadings and looks better (apart from the black cube clouds).
DXVK / Vulkan for DX11/12
WINEARCH=win64 WINEPREFIX=~/.eve64-dxvk winetricks vcrun2017 7zip dxvk OR WINEARCH=win32 WINEPREFIX=~/.eve32-dxvk winetricks vcrun2017 7zip dxvk
DXVK / Vulkan for DX9
A more performant way to run EVE Online with a conversion layer from DX9 to Vulkan
WINEARCH=win64 WINEPREFIX=~/.eve64-dxvk9 winetricks vcrun2017 7zip d3dcompiler_43 d9vk040 OR WINEARCH=win32 WINEPREFIX=~/.eve32 winetricks vcrun2017 7zip d3dcompiler_43 d9vk040
Download installer and full offline zip into the same folder
Make the exe file executable:
chmod +x ~/Downloads/EveLauncher-xxxxxxx.exe
Launch with the correct wine prefix:
DX11/12 WINEARCH=win64 WINEPREFIX=~/.eve64 ~/Downloads/EveLauncher-xxxxxxx.exe OR Vulkan DXVK WINEARCH=win64 WINEPREFIX=~/.eve64-dxvk ~/Downloads/EveLauncher-xxxxxxx.exe OR WINEARCH=win32 WINEPREFIX=~/.eve32 ~/Downloads/EveLauncher-xxxxxxx.exe
If the installation has created a desktop file, it may need amending:
vim ~/.local/share/applications/wine/Programs/EVE\ Launcher/EVE\ Launcher.desktop [Desktop Entry] Name=EVE Launcher Exec=env SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS=0 __GL_MaxFramesAllowed=1 WINEESYNC=1 WINEDEBUG=-all WINEARCH=win64 WINEPREFIX=/home/user/.eve64 wine /home/user/.eve64/drive_c/EVE/eve.exe Type=Application StartupNotify=true Path=/home/user/.eve64/dosdevices/c:/EVE Icon=539E_evelauncher.0 StartupWMClass=evelauncher.exe OR [Desktop Entry] Name=EVE Launcher Exec=env SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS=0 __GL_MaxFramesAllowed=1 WINEESYNC=1 WINEDEBUG=-all WINEARCH=win64 WINEPREFIX=/home/user/.eve64-dxvk wine /home/user/.eve64-dxvk/drive_c/EVE/eve.exe Type=Application StartupNotify=true Path=/home/user/.eve64-dxvk/dosdevices/c:/EVE Icon=539E_evelauncher.0 StartupWMClass=evelauncher.exe OR [Desktop Entry] Name=EVE Launcher Exec=env SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS=0 __GL_MaxFramesAllowed=1 WINEESYNC=1 WINEDEBUG=-all WINEARCH=win64 WINEPREFIX=/home/user/.eve64-dxvk9 wine /home/user/.eve64-dxvk9/drive_c/EVE/eve.exe Type=Application StartupNotify=true Path=/home/user/.eve64-dxvk9/dosdevices/c:/EVE Icon=539E_evelauncher.0 StartupWMClass=evelauncher.exe OR [Desktop Entry] Name=EVE Launcher Exec=env SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS=0 __GL_MaxFramesAllowed=1 WINEESYNC=1 WINEDEBUG=-all WINEARCH=win64 WINEPREFIX=/home/user/.eve32 wine /home/user/.eve32/drive_c/EVE/eve.exe Type=Application StartupNotify=true Path=/home/user/.eve32/dosdevices/c:/EVE Icon=539E_evelauncher.0 StartupWMClass=evelauncher.exe
More info: https://wiki.archlinux.org/index.php/Desktop_entries
chmod +x ~/.local/share/applications/wine/Programs/EVE\ Launcher/EVE\ Launcher.desktop update-desktop-database ~/.local/share/applications
Strangle is a useful library to limit down the FPS without relying on intervals (vsync) inside EVE Online (and other games/programs). At the moment with DX11/9 and NVIDIA PRIME Sync only Interval 1 works inside EVE Online which will enable vsync restricting down the FPS to the same as the panel's refresh. Having bought a laptop with a 144HZ panel this give 144 FPS on every EVE Online client, which puts significant load on the laptop and generates lots of heat. When running DXVK and Vulkan instead of straight DX11 the additional 2,3 and 4 Intervals work, restricting down the client's FPS further, however with vsync enabled in DXVK and NVIDIA PRIME Sync there is a freezing bug which will make using more than one client impossible (https://forums.developer.nvidia.com/t/prime-and-prime-synchronization/44423). Strangle has resolved this bug for my setup, so please get in touch if this resolves it for you as well!
Strangle FPS to 30 with DX11:
__GL_THREADED_OPTIMIZATIONS=1 SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS=0 __GL_MaxFramesAllowed=1 WINEESYNC=1 WINEDEBUG=-all WINEARCH=win64 WINEPREFIX=/home/user/.eve64 strangle 30 wine /home/user/.eve64/drive_c/EVE/eve.exe
Strangle FPS to 30 with DXVK/Vulkan:
__GL_THREADED_OPTIMIZATIONS=1 SDL_VIDEO_MINIMIZE_ON_FOCUS_LOSS=0 __GL_MaxFramesAllowed=1 DXVK_HUD=1 DXVK_STATE_CACHE=0 DXVK_LOG_LEVEL=none WINEESYNC=1 WINEDEBUG=-all WINEARCH=win64 WINEPREFIX=/home/user/.eve64-dxvk strangle 30 wine /home/user/.eve64-dxvk/drive_c/EVE/eve.exe
https://aur.archlinux.org/packages/libstrangle-git/ - https://gitlab.com/torkel104/libstrangle
~ strangle --help Usage: strangle [OPTION]... [FPS] PROGRAM or: strangle [OPTION]... [FPS]:[BATTERY_FPS] PROGRAM Limit the framerate of PROGRAM to FPS Mandatory arguments to long options are mandatory for short options too. -a, --aniso AF sets the anisotropic filtering level. Makes textures sharper at an angle. Limited OpenGL support -b, --battery-fps FPS alternative framerate cap for when running on battery power. See --fps -f, --fps FPS limit the framerate to FPS. A value of 0 will disable the limiter. -k, --vulkan-only prevent the OpenGL libs from loading -n, --no-dlsym disable dlsym hijacking in the OpenGL library -p, --picmip PICMIP set the mipmap LoD bias to PICMIP. A higher value means blurrier textures. Can be negative -t, --trilinear force trilinear filtering. Vulkan only -v, --vsync VSYNC Force vertical synchronisation on or off. For OpenGL the following rules apply: 0 - Force off 1 - Force on n - Sync to refresh rate / n For Vulkan the following rules apply: 0 - Force off 1 - Mailbox mode. Uncapped framerate 2 - Traditional vsync. Capped framerate 3 - Adaptive vsync. tearing at low framerates Short options may not be combined into one string. Options will override environment variables. Some programs will crash, freeze or behave unexpectedly when dlsym is hijacked If a program is exhibiting these symptoms when run with strangle try using the '--no-dlsym' option. Or if the program uses the Vulkan API you can disable strangle's OpenGL libs altogether with the '--vulkan-only' option. Strangle home page: <https://gitlab.com/torkel104/libstrangle>
- DX9 (enable in launcher settings) make sure to set interval one in eve client settings for smoother performance (enables vsync)
- DX11 make sure to set interval immediate or switching applications (alt+tab) freezes for long periods when dxvk (vulkan) is enabled (install wine prefix without dxvk to disable and use vsync) https://devtalk.nvidia.com/default/topic/1044496/linux/hangs-freezes-when-vulkan-v-sync-vk_present_mode_fifo_khr-is-enabled/ - update or combine with libstrangel for DXVK + PRIME Sync and vsync/restricted FPS
- Kernel 5.4 breaks PRIME Sync which then prevents vsync from working (restricts FPS to monitior frame rate) https://devtalk.nvidia.com/default/topic/957814/linux/prime-and-prime-synchronization/25 advisable to switch to the LTS kernel or look at patching the nvidia driver: https://devtalk.nvidia.com/default/topic/1068045/5-4-kernel-breaks-prime-synchronization-/
- kernel 5.4 apparently works with the nvidia beta vk driver
- kernel 5.4 has now fixed vsync with NVIDIA PRIME Sync
- For Arch Linux at the moment i would highly recommend switching to the nvidia vulkan drivers for a newer driver that works with kernel 5.4 and PRIME Sync out of the box. This makes sure vsync is working on dual GPU laptops with and without vulkan.
yay -S nvidia-vulkan-dkms lib32-nvidia-vulkan-utils lib32-opencl-nvidia-vulkan opencl-nvidia-vulkan
Disabling Gnome Left-Alt + F1 + Left-Alt + F2 combo, Left Alt + F* is used by eve for activating and deactivating mid slot items. Slightly annoying to be forced out of the game to the window switcher:
gsettings set org.gnome.desktop.wm.keybindings panel-main-menu "" # disable Alt+F1 gsettings set org.gnome.desktop.wm.keybindings panel-run-dialog "" # disable Alt-F2
If using opensource drivers (intel/nouveua/mesa) use wine-staging-nine for the gallium-nine native direct x 9 implementation for a good performance boost. Set DX9 in the eve launcher settings. To enable run in that particular wine prefix:
WINEARCH=win32 WINEPREFIX=~/.wine32 winecfg Staging Tab Check "Enable Gallium Nine for better D3D9 graphic performance"
- Currently wine 4.10 breaks all games requiring a chromium embedded browser, fixed in 4.11 https://bugs.winehq.org/show_bug.cgi?id=47167 Recommend to downgrade back to 4.9 if possible via the pacman cache files: pacman -U /var/cache/pacman/pkg/package_name_here
- Since Wine 4.9 adding WINEESYNC=1 has significantly increased performance and smoothed a lot of loading lag out of the game, would highly recommend adding this flag to the desktop/start commands.
- Kernel 5.4 breaks PRIME Sync which then prevents vsync from working (restricts FPS to monitior frame rate) https://devtalk.nvidia.com/default/topic/957814/linux/prime-and-prime-synchronization/25 advisable to switch to the LTS kernel or look at patching the nvidia driver: https://devtalk.nvidia.com/default/topic/1068045/5-4-kernel-breaks-prime-synchronization-/ - now fixed
- PRIME Sync with DXVK and vsync causes system wide freezing when switching windows or workspaces (https://devtalk.nvidia.com/default/topic/1044496/linux/hangs-freezes-when-vulkan-v-sync-vk_present_mode_fifo_khr-is-enabled/) not fixed, however libstrangle appears to work around this issue.