XR Devices#

Support Table#

A non-comprehensive table of various VR/XR devices and the drivers that support them.

Devices are generally ranked under the following medals on their compatibility with Linux. This ranking system is adapted from ProtonDB’s ranking, and is defined as follows:

Platinum Perfect out of the box.
Gold Perfect after tweaking.
Silver Usable after tweaks.
Bronze Barely usable, even after tweaks.
Borked Broken/Unusable, no matter what.
Unknown Uncategorized, feel free to contribute!

PCVR#

⚠️ Warning

SteamVR is not recommended for any devices, due to general unreliability.

ℹ️ Note

Wired headset experiences with Nvidia GPUs may be affected by the DRM lease presentation latency issue - see the Monado troubleshooting section. Results on SteamVR have been mixed.

Device Medal/Rating Monado SteamVR
(not recommended)
Valve Index Platinum*
HTC Vive/Pro/Pro Eye Platinum
HTC Vive Pro 2 Platinum* ✅ (With kernel patches required for full resolution on AMD) ✅ (custom driver and patches)
Bigscreen Beyond 1/2(e) Gold ✅ (refer to the BSB Kernel page) ✅ (refer to the BSB Kernel page)
Sony PSVR 1 Bronze ? ?
Sony PSVR 2 Gold* 🚧
Bronze Monado driver
Gold Ignition driver
✅ (Ignition SteamVR driver)
Oculus Rift CV1 Silver ✅ (OpenHMD plugin based support) ✅ (OpenHMD SteamVR plugin)
Oculus Rift S Bronze ✅ (experimental 6dof controllers) ✅ (Monado SteamVR plugin)
Pimax 4K Gold 🚧 (WIP, with kernel patches, Nvidia requires patching EDID) ❌ (Planned)
Pimax 5K Plus/XR/Super Gold ✅ (WIP, with kernel patches, Nvidia requires patching EDID) ❌ (Planned)
Pimax 8K Gold ✅ (WIP, with kernel patches, Nvidia requires patching EDID) ❌ (Planned)
Pimax Vision 8K X Gold ✅ (WIP, with kernel patches) ❌ (Planned)
Pimax Vision 8K PLUS Gold ✅ (WIP, with kernel patches, Nvidia requires patching EDID) ❌ (Planned)
Pimax Crystal OG Borked
Pimax Crystal Light Borked
Pimax Crystal Super Borked
Pimax Dream Air Borked
Pimax Dream Air SE Borked
HP Reverb G1 Bronze ✅ (experimental 6dof controllers) ✅ (Monado SteamVR plugin)
HP Reverb G2 Bronze ✅ (experimental 6dof controllers, 60Hz-only on Nvidia) ✅ (Monado SteamVR plugin, 60Hz-only on Nvidia)
Varjo VR-1/2/3 Unknown ? ?
Varjo Aero Borked
Lenovo Explorer Bronze ✅ (experimental 6dof controllers) ✅ (Monado SteamVR plugin)
Dell Visor Bronze ✅ (experimental 6dof controllers) ✅ (Monado SteamVR plugin)
HP WMR headset Bronze ✅ (experimental 6dof controllers) ✅ (Monado SteamVR plugin)
Samsung Odyssey Bronze ✅ (experimental 6dof controllers) ✅ (Monado SteamVR plugin)
Samsung Odyssey+ Bronze ✅ (experimental 6dof controllers) ✅ (Monado SteamVR plugin)
Asus HC102 Bronze ✅ (experimental 6dof controllers) ✅ (Monado SteamVR plugin)
Acer AH101 Bronze ✅ (experimental 6dof controllers) ✅ (Monado SteamVR plugin)
Acer OJO 500 Bronze ✅ (experimental 6dof controllers) ✅ (Monado SteamVR plugin)
Somnium VR1 Borked
VRgineers XTAL Borked
StarVR One Borked
Arpara 5K Borked

Standalone#

Generally, all standalone headsets are considered to be Platinum .

⚠️ Warning

ALVR is not recommended for use due to the project’s lack of focus on Linux support, which has lead to it becoming effectively deprecated. ALVR on Linux does not work with SteamVR versions 2.16.7 or later.
It is highly recommended to use WiVRn or Steam Link instead.

Device WiVRn Steam Link ALVR
(not recommended)
Quest
Quest 2
Quest Pro
Quest 3/3s
Pico Neo 3
Pico 4/4 Ultra
HTC Vive Focus 3
HTC Vive Focus Vision
HTC Vive XR Elite
Lynx R1
Apple Vision Pro

Headset Notes#

Vive Pro quirks#

  • The Vive Pro microphone’s sample rate should be set at 44.1khz, as feeding in 48khz raises the pitch of the audio.
  • The Vive Pro creates an HDMI Output Source after startup of SteamVR/Monado. Use it instead of the Vive Pro USB Audio Source, since the audio might appear distorted.

Vive Pro 2 quirks#

  • On Monado, the Vive Pro 2 defaults to a lower resolution (3680x1836@90hz). Please see the Vive Pro 2 documentation on how to change this. Kernel patches may be required.

Valve Index quirks#

  • The Valve Index uses your GPU’s DisplayPort for audio output. If you are unable to hear audio after switching to the GPU output, try changing the output port in an application like pavucontrol.
  • The Valve Index audio output sample rate should be set to 48khz, or else no audio will be output.
  • The Valve Index may be put in a bad state the first time it is connected to the system, or when plugged in before the system boots up, causing symptoms such as DRM lease failing. You should try replugging the power connector to reset the HMD.

Other HMD hardware notes#

  • Vive Pro Eye: HMD functional, eye tracking functionality with ReVision
  • Pimax: Initialization code WIP. Distortion matrix dump work in progress.
  • Bigscreen Beyond 2e: To use eyetracking on your headset, please follow the guide in the Bigscreen Beyond eyetracking page.
  • Sony Playstation VR2: HMD is functional with minor jitter on lateral movements. A guide on how to set it up for use with the Ignition driver, the Monado driver, Eye tracking and for headsets on Pre-PC firmware (V5.00) is in the PSVR2 page.
  • Oculus Rift CV1: Controllers jitter heavily (and HMD to a lesser extent) if using more than one sensor camera.
  • Eyetrack VR and Project Babble will both be implemented through oscavmgr to emit proper unified flexes over OSC.
  • Tracking technologies can be mixed Monado/WiVRn by using motoc.

Trackers#

See the trackers page for information on face, eye, and full-body trackers.

Troubleshooting#

Desktop hangs on start of SteamVR or Monado#

ℹ️ Note

Only applies to kernel versions before linux-6.19!

Symptoms:

  • When starting the SteamVR or Monado for the first time after a reboot, the desktop freezes and after 15 seconds the SteamVR window is open but the Headset does not show a picture.
    • Restarting SteamVR solves this.
    • Unplugging the headset and plugging it back in solves this.
  • dmesg | grep amdgpu prints a line containing ERROR dc_stream_state is NULL for crtc '1'! (or some other number).

This is an issue with the RADV driver, and is fixed in linux-6.19. A kernel patch (for versions 6.18 and below) is available on this GitLab issue. See the section on how to apply a kernel patch.

Applying a kernel patch (for Vive Pro 2, Bigscreen Beyond, Pimax)#

Jump to your distro: Arch / Fedora / NixOS / Gentoo

If your distro is not listed here, please refer to your distro’s official documentation on applying kernel patches.

Arch#

ℹ️ Note

To speed up compilation, it is highly recommended to compile with all available cores. Specify MAKEFLAGS wherever shown. This tells makepkg to utilize all cores.

makepkg defaults to use a single core, which can take a long time. See makepkg - ArchWiki to learn how to set this option by default.

Bigscreen Beyond#

You can install the latest kernel pre-configured with patches for the Beyond with the linux-bsbAUR package.

First install yay (or another AUR helper like paru), then install linux-bsbAUR:

MAKEFLAGS="--jobs=$(nproc)" yay -S linux-bsb

Your boot loader needs to know about this new kernel in order to boot it. Your next steps depend on which boot loader you are using.

  • EndeavourOS users - generates a boot entry automatically thanks to the reinstall-kernels concept; no action needed.
  • GRUB - generates a boot entry automatically; no action needed.
  • systemd-boot - read this ArchWiki article.
    • In short, you should create a loader entry for linux-bsb in e.g. /boot/loader/entries/. You can duplicate one of the .conf files in there and make some edits:
      • Replace /vmlinuz-linux with /vmlinuz-linux-bsb
      • Replace /initramfs-linux.img with /initramfs-linux-bsb.img
      • Edit the title to your liking
  • If you are not sure which boot loader you are using:
    • Run bootctl status. If “Current Boot Loader” reads “Product: systemd-boot” followed by a version number, you are using systemd-boot.
    • Your ESP (which can be mounted at /boot or /efi) should contain references to “grub” or “systemd-boot”.

When you reboot, select the option labeled linux-bsb in the menu.

The output of the command uname -r should mention “bsb”. Consider making linux-bsb your default boot entry, so you don’t mistakenly/automatically boot into the unpatched kernel.

Manual kernel build#

This section explains how to manually build the kernel with patches on Arch Linux.

Download the patch file(s), then follow the steps on Kernel/Arch build system - ArchWiki. Each section in this article roughly corresponds the steps printed below.

  1. (Section 1 of the above link)

    mkdir ~/build/
    cd ~/build/
    sudo pacman -S --needed devtools base-devel pacman-contrib
    pkgctl repo clone --protocol=https linux
    cd linux
  2. (Section 2 of the above link) Open the PKGBUILD in that directory and modify the pkgbase line (at the top) to read e.g. “pkgbase=linux-customvr”. Then add a line containing your patch file(s) to the sources array:

    source=(
      https://cdn.kernel.org/pub/linux/kernel/v${pkgver%%.*}.x/${_srcname}.tar.{xz,sign}
      <patchfilename>.patch
      $url/releases/download/$_srctag/linux-$_srctag.patch.zst{,.sig}
      config  # the main kernel config file
    )

    Close the PKGBUILD, then run:

    updpkgsums
  3. (Sections 3 and 4 of the above link) Run this to build and install the kernel package.

    MAKEFLAGS="--jobs=$(nproc)" makepkg -sir --skippgpcheck
  4. Follow section 5 to tell your boot loader about the custom kernel, and restart. Make sure you select the custom kernel in the boot menu if prompted. Consider setting it as your default boot loader entry.

Fedora#

  1. Prepare the kernel

    git clone https://src.fedoraproject.org/rpms/kernel.git
    cd kernel
    
    # replace 41 with your fedora version
    git switch f41
    
    # install the build dependencies for the kernel, if you haven't already
    sudo dnf builddep kernel.spec
    
    # name this the 'bsb' build
    sed -i 's/# define buildid .*/%define buildid .bsb/g' kernel.spec
  2. Add patch files to the root of the cloned folder, find these blocks in the kernel.spec and add the commented patches:

    ## Patches needed for building this package
    
    %if !%{nopatches}
    
    Patch1: patch-%{patchversion}-redhat.patch
    # Add your custom patches below:
    #Patch2: your-first-patch.patch
    #Patch3: your-second-patch.patch
    
    %endif
    %{log_msg "Start of patch applications"}
    %if !%{nopatches}
    
    ApplyOptionalPatch patch-%{patchversion}-redhat.patch
    # Add your custom patches below:
    #ApplyOptionalPatch your-first-patch.patch
    #ApplyOptionalPatch your-second-patch.patch
    
    %endif
  3. Build RPMs:

    fedpkg local
  4. Install kernel:

    sudo dnf install --nogpgcheck ./x86_64/kernel-${version}.rpm
  5. Reboot and check that using uname -a that the bsb kernel is running.

Official guide: Building a Kernel from the Fedora dist-git

NixOS#

  1. Download the patch(es)

  2. Add this to your configuration.nix or other nix file you use:

      boot.kernelPatches = [
        {
          name = "type what the patch is for here";
          patch = /path/to/patch/file.patch;
        }
      ];

Gentoo#

While manually patching your /usr/src/linux directory and performing a normal kernel build and install will work, you can use the /etc/portage/patches system with a source kernel package for a more robust solution that will survive version upgrades.

These instructions use gentoo-sources, replace that with gentoo-kernel or whatever kernel sources you are using in the directory names and emerge commands.

⚠️ Warning

These instructions will not work with gentoo-kernel-bin because it has no local source to patch.

  1. Download the patch(es)
  2. Create the directory /etc/portage/patches/sys-kernel/gentoo-sources/ and copy the patches there.
    • If desired, you can limit to a specific version by appending the version number to the directory, e.g. /gentoo-sources-6.18.18/.
  3. Run sudo emerge -a gentoo-sources, which will overwrite the existing sources with the patched source.
  4. Perform your normal kernel build and install, if any.
    • For gentoo-kernel, this will have been done by the previous step.