Jump to content

VR

From NixOS Wiki
Revision as of 10:35, 8 October 2025 by Ardenet (talk | contribs) (Created page with "为了在 SteamVR 以外的任何平台上运行 OpenVR 游戏,您需要配置 <code>~/.config/openvr/openvrpaths.vrpath</code> 中定义的 OpenVR 运行时路径。一个可靠的方法是使用 Home Manager 创建此文件。")

Monado

Monado 是一个开源的 OpenXR 运行时。它使用内置驱动程序支持各种硬件,使其可以运行任何 OpenXR 程序,并且在 OpenComposite 的帮助下,还可以运行大多数 OpenVR 应用程序。

可以使用其 NixOS 选项 services.monado.enable 配置 Monado:

❄︎ /etc/nixos/configuration.nix
services.monado = {
  enable = true;
  defaultRuntime = true; # Register as default OpenXR runtime
};

为了配置 Monado,您可能需要添加其他环境变量:

❄︎ /etc/nixos/configuration.nix
systemd.user.services.monado.environment = {
  STEAMVR_LH_ENABLE = "1";
  XRT_COMPOSITOR_COMPUTE = "1";
};

配置完成后,Monado 可以在 systemd 用户会话中启动和停止。

例如,以下命令将启动 Monado,然后打印其日志输出:

$ systemctl --user start monado.service
$ journalctl --user --follow --unit monado.service

手部追踪

您可能会注意到,由于缺少手部追踪数据,运行 monado-services 会失败。有两种方法可以解决这个问题:完全禁用手部追踪,或下载手部追踪数据。

要禁用手部追踪,请修改环境变量以包含 WMR_HANDTRACKING = "0";,使其如下所示。

❄︎ /etc/nixos/configuration.nix
systemd.user.services.monado.environment = {
  STEAMVR_LH_ENABLE = "1";
  XRT_COMPOSITOR_COMPUTE = "1";
  WMR_HANDTRACKING = "0";
};

要使手部追踪功能正常工作,您需要启用 git-lfs。启用 git-lfs 的标准方法是通过以下配置

❄︎ /etc/nixos/configuration.nix
programs.git = {
  enable = true;
  lfs.enable = true;
};

确保 git-lfs 功能启用后,运行以下命令并重新启动 monado-service

$ mkdir -p ~/.local/share/monado
$ cd ~/.local/share/monado
$ git clone https://gitlab.freedesktop.org/monado/utilities/hand-tracking-models

For further information about available environment variables and tweaks, read the Linux VR Adventures wiki and the Monado documentation about environment variables


OpenComposite

OpenComposite is a compatibility layer for running OpenVR applications on an OpenXR runtime like Monado. It is comparable to tools like DXVK or vkd3d, but for translating OpenVR calls to OpenXR.

为了在 SteamVR 以外的任何平台上运行 OpenVR 游戏,您需要配置 ~/.config/openvr/openvrpaths.vrpath 中定义的 OpenVR 运行时路径。一个可靠的方法是使用 Home Manager 创建此文件。

⚠︎
Warning: Older versions of Proton will always query the current OpenVR and OpenXR runtime. If you use OpenComposite, and it fails to initialize an OpenXR context, Proton will fail to launch. A workaround is to delete the ~/.config/openvr/openvrpaths.vrpath file and then retry launching the game.

If this file is not set to read-only, SteamVR will add its runtime path back, hence the use for Home Manager.

An example configuration for enabling OpenComposite may look like this:

❄︎ ~/.config/home-manager/home.nix
# For Monado:
xdg.configFile."openxr/1/active_runtime.json".source = "${pkgs.monado}/share/openxr/1/openxr_monado.json";

# For WiVRn v0.22 and below:
xdg.configFile."openxr/1/active_runtime.json".source = "${pkgs.wivrn}/share/openxr/1/openxr_wivrn.json";

xdg.configFile."openvr/openvrpaths.vrpath".text = ''
  {
    "config" :
    [
      "${config.xdg.dataHome}/Steam/config"
    ],
    "external_drivers" : null,
    "jsonid" : "vrpathreg",
    "log" :
    [
      "${config.xdg.dataHome}/Steam/logs"
    ],
    "runtime" :
    [
      "${pkgs.opencomposite}/lib/opencomposite"
    ],
    "version" : 1
  }
'';

If you are planning to play any OpenVR game on Steam or OpenXR games through Proton, you will have to use OpenComposite in this manner. In most cases you also have to allow access to the socket path of your OpenXR runtime to Steam's runtime, by using the following launch options for XR applications on Steam: env PRESSURE_VESSEL_FILESYSTEMS_RW=$XDG_RUNTIME_DIR/monado_comp_ipc %command%. This example is for Monado, while other XR runtimes might differ.

WiVRn

WiVRn is an OpenXR streaming application built around Monado. It wirelessly connects a standalone VR headset to a Linux computer. If your headset is not wireless, look at Monado instead. Example usage of the WiVRn module:

⚠︎
Warning: As of WiVRn version 0.23, WiVRn now manages the opencomposite paths itself. Only use the above opencomposite configuration when using versions below v0.23.
❄︎ /etc/nixos/configuration.nix
services.wivrn = {
  enable = true;
  openFirewall = true;

  # Write information to /etc/xdg/openxr/1/active_runtime.json, VR applications
  # will automatically read this and work with WiVRn (Note: This does not currently
  # apply for games run in Valve's Proton)
    defaultRuntime = true;

  # Run WiVRn as a systemd service on startup
  autoStart = true;

  # Config for WiVRn (https://github.com/WiVRn/WiVRn/blob/master/docs/configuration.md)
  config = {
    enable = true;
    json = {
      # 1.0x foveation scaling
      scale = 1.0;
      # 100 Mb/s
      bitrate = 100000000;
      encoders = [
        {
          encoder = "vaapi";
          codec = "h265";
          # 1.0 x 1.0 scaling
          width = 1.0;
          height = 1.0;
          offset_x = 0.0;
          offset_y = 0.0;
        }
      ];
    };
  };
};

Like Monado, you will also have to add the launch argument for WiVRn to allow access to the socket: PRESSURE_VESSEL_FILESYSTEMS_RW=$XDG_RUNTIME_DIR/wivrn/comp_ipc %command%

Envision

Envision is an orchestrator for the FOSS VR stack. It handles the building and configuration of Monado, WiVRn, OpenComposite, and other utilities of the FOSS VR stack such as the Lighthouse driver, OpenHMD, Survive, and WMR. You can enable it with the Envision module:

❄︎ /etc/nixos/configuration.nix
programs.envision = {
  enable = true;
  openFirewall = true; # This is set true by default
};

SteamVR

SteamVR is a proprietary OpenVR runtime with compatibility for OpenXR. It is part of Steam and doesn't need any additional setup on NixOS apart from enabling Steam.

After installing SteamVR through Steam and plugging in a SteamVR-compatible headset, SteamVR should work for the most part.

On initial setup, SteamVR will ask for elevated permissions, to set up a file capability for one of its binaries. This is needed to allow asynchronous reprojection to work. Clients need the CAP_SYS_NICE capability to acquire a high-priority context, which is a requirement for asynchronous reprojection.

Note: Steam is run in a bubblewrap-based FHS environment. This environment runs Steam in a user namespace, which prevents it from using any capabilities or setuid binaries. This means that asynchronous reprojection can not be used on NixOS, without patching the kernel to remove these restrictions completely. See this Nixpkgs issue

修补 AMDGPU 以允许高优先级队列

By applying this patch, the AMDGPU kernel driver will ignore process privileges and allow any application to create high priority contexts.

⚠︎
Warning: This removes intentional restrictions from the kernel, and it could cause scheduling issues. While it has not been reported that it does cause issues, this should be considered an unsupported configuration.

作为 NixOS 内核补丁进行应用

To workaround the CAP_SYS_NICE requirement, we can apply a kernel patch using the following NixOS configuration snippet:

❄︎ /etc/nixos/configuration.nix
boot.kernelPatches = [
  {
    name = "amdgpu-ignore-ctx-privileges";
    patch = pkgs.fetchpatch {
      name = "cap_sys_nice_begone.patch";
      url = "https://github.com/Frogging-Family/community-patches/raw/master/linux61-tkg/cap_sys_nice_begone.mypatch";
      hash = "sha256-Y3a0+x2xvHsfLax/uwycdJf3xLxvVfkfDVqjkxNaYEo=";
    };
  }
];

It is also possible to just patch amdgpu and build it as an out-of-tree module, as described in Linux_kernel#Patching_a_single_In-tree_kernel_module

wlx-overlay-s

wlx-overlay-s is a lightweight OpenXR/OpenVR overlay for Wayland and X11 desktops. It works with SteamVR as well as Monado/WiVRn natively.

SteamVR 自动启动

When launching wlx-overlay-s in SteamVR (or any OpenVR compositor) it will register an autostart manifest. Currently, this manifest will reference a Nix store path of wlx-overlay-s, which might get garbage collected after rebuilds of your NixOS/Nix profile. A workaround is to regularly run the following command to update the manifest's store path:
# Run wlx-overlay-s and replace any running instance
$ wlx-overlay-s --replace

另见