Skip to content

Usage guide

A nice and clean start is using the felix86 shell:

felix86 --shell

This will disable logging and start a bash or zsh shell with a custom prompt.

In felix86 26.08 and later, you can start a program with the –shell command, which runs it via bash -c or zsh -c, which means it can find your binary in PATH:

felix86 --shell="steam -no-cef-sandbox"

In older verions you can achieve the same like so:

felix86 /path/to/rootfs/bin/bash -c "steam -no-cef-sandbox"

If you want logging to be enabled, use this command:

felix86 --shell-debug

If you don’t want a shell, you can just run the program directly:

felix86 /path/to/rootfs/usr/bin/nano

If installed in binfmt_misc (handled by install script, or with sudo -E felix86 -b) you can simply run x86 programs that are inside the rootfs:

/path/to/rootfs/MyGame.AppImage

By default /home will be mounted inside the rootfs, so you can also run x86 programs from $HOME.

Compatibility

There’s a compatibility list:

https://felix86.com/compat/

If you want to try a game that is not listed, you can make a compatibility report here:

https://github.com/felix86-emu/compatibility-list/issues

Thunking

There’s thunking support for GLX (OpenGL on X11) and Vulkan. You can enable it using FELIX86_ENABLED_THUNKS=glx,vk. This should improve performance in games.

Desktop shortcuts

Desktop shortcuts in Linux are usually XDG Desktop Entry specification files.

The shorcuts usually exist in the host desktop, since the host $HOME is mounted in the guest $HOME, but the binary usually exists inside the rootfs, not the host filesystem. Even if it does exist in the host filesystem, it may be a script that needs to be explicitly run with the x86 bash, so that filesystem accesses are resolved relative to the rootfs.

In order to be able to use it like a normal shortcut, we need to wrap the executable with felix86 --shell="...".

Here’s a sed one-liner that makes a desktop entry run with felix86:

sed -i -E 's/^Exec=(.*)$/Exec=felix86 --shell="\1"/' myshortcut.desktop

Configuration

The configuration file exists at /etc/opt/felix86/config.toml.

You can get a specific config by specifying its group and value, for example: ROOTFS=$(felix86 --get-config general.rootfs_path)

You can set a specific config in a similar fashion, but it requires administrator privileges: felix86 --set-config logging.print_signals=true

To list all configs, use the -c option.

Each configuration has a respective environment variable. These can be discovered by reading the configuration file.

Profiles

You can set per-game profiles, which are useful for enabling TSO or reduced precision for games that need it, among other options.

If you are running a Steam game, refer to Steam game profiles.

For non-Steam games and other executables, you can use a toml file in ~/.config/felix86/profiles/executables.

Let’s say you want to enable some options for Celeste and TEKKEN 7 so that they are automatically applied when those executables run.

Create a file called ~/.config/felix86/profiles/executables/my_profiles.toml and add the settings there. These profiles are parsed in alphabetical order, and the ones that are loaded last override the ones that are loaded first, if multiple profiles target the same executable.

["Celeste.bin.x86_64"]
General.enabled_thunks = "glx,vk,wl"
Performance.unsafe_flags = true

["TekkenGame-Win64-Shipping.exe"]
General.enabled_thunks = "glx,vk,wl"
Performance.unsafe_flags = true
Performance.inaccurate_minmax = true
Make sure to use the correct executable name. The installer script will add some default profiles in 00-installation-profiles.toml.

There’s also global profiles. Usage:

FELIX86_PROFILE=extreme felix86 --shell

There’s currently the following profiles:

  • extreme - Enables all optimizations, may break some games that rely on TSO.
  • safe - Enables safe optimizations and TSO mode.
  • paranoid - Disable almost all optimizations and enable some slow safety checks.
  • zink - Enables Vulkan thunking and Zink usage in Mesa.

Each of these profiles is a .toml file in $HOME/.config/felix86/profiles. Each profile is a partial or full version of the config file, with some configurations changed. You may create new profiles and pass them to FELIX86_PROFILE as a name (which will look relative to the profile directory) or as an absolute path.

DXVK

Installing DXVK is as simple as installing it on your host system:

# Set $ROOTFS to the rootfs absolute path for convenience
export ROOTFS=$(felix86 --get-config general.rootfs_path)

# Enter felix86 shell
felix86 --shell

# Go to dxvk directory
cd ~/Downloads/dxvk

export WINEPREFIX=$HOME/.wine
cp x64/*.dll $WINEPREFIX/drive_c/windows/system32
cp x32/*.dll $WINEPREFIX/drive_c/windows/syswow64

# Run winecfg from inside felix86 shell and add native DLL overrides for
# d3d8, d3d9, d3d10core, d3d11, dxgi.
winecfg

Note

This is assuming you have FELIX86_MOUNT_HOME enabled, which is on by default, and that the WINEPREFIX already exists.

Make sure to enable Vulkan thunking for better performance:

# Needs to be exported before entering felix86 shell
export FELIX86_ENABLED_THUNKS=vk
felix86 --shell

gl4es

gl4es allows for using OpenGL on iGPUs in RISC-V boards, as those GPUs don’t support desktop OpenGL.

The iGPUs suck

Use a discrete GPU, if possible, as they tend to have way better Linux support and performance. When using a discrete GPU gl4es is not necessary.

You can download a prebuilt version of gl4es: https://cdn.felix86.com/misc/gl4es/gl4es.zip

To build gl4es from source, follow the instructions below.

sudo apt update
sudo apt install libx11-dev
git clone https://github.com/ptitSeb/gl4es
cd gl4es
cmake -B build -DCMAKE_BUILD_TYPE=RelWithDebInfo
cmake --build build -j$(nproc)

Installation

Install the library to a known host location, such as /opt/felix86/gl4es/. From the directory that contains the unzipped/built libGL.so.1, run the following:

export INSTALLATION_DIR="/opt/felix86/gl4es"
sudo mkdir -p $INSTALLATION_DIR
sudo mv ./libGL.so.1 $INSTALLATION_DIR

Make sure to symlink libGLX.so.0, as gl4es exports the libGLX symbols:

sudo ln -s libGL.so.1 "$INSTALLATION_DIR/libGLX.so.0"

Usage

In order to use gl4es you need to set LD_LIBRARY_PATH and enable thunking:

export INSTALLATION_DIR="/opt/felix86/gl4es"
export SDL_VIDEODRIVER=x11 # may be required for some games
export FELIX86_ENABLED_THUNKS=glx,egl
export LIBGL_NOBANNER=1
export LD_LIBRARY_PATH="$INSTALLATION_DIR:$LD_LIBRARY_PATH"
felix86 --shell

Warning

There’s currently no 32-bit thunking, so you need to try 64-bit games if you want to use the iGPU. A discrete GPU, like an AMD one, will be able to use the x86 drivers and not require thunking, so 32-bit games will work fine with a discrete GPU.

MangoHud

felix86 has a custom MangoHud fork that shows some JIT-related information. It may be useful for profiling games.

It is based on the MangoHud FEX integration.

Installation

You can use this script to install it:

bash <(curl -fsSL https://install.felix86.com/mangohud.sh)

Usage

You will need to enable thunking: export FELIX86_ENABLED_THUNKS=vk,wl,glx

Enable the stats in the MangoHud and felix86 side:

export MANGOHUD_CONFIG=fex_stats=status+hotthreads+jitload+smc+softfloat
export FELIX86_STATS_ENABLED=1

Set FELIX86_MANGOHUD=1 for Vulkan apps, or use /opt/felix86/bin/mangohud for both OpenGL and Vulkan apps.