portfolio: 0.71.2 -> 0.72.2 (#360387)
[NixPkgs.git] / nixos / modules / services / hardware / monado.nix
blob137b63c77420081f5118a6abfec1d5f3579bb4cf
2   config,
3   lib,
4   pkgs,
5   ...
6 }:
7 let
8   inherit (lib)
9     mkDefault
10     mkEnableOption
11     mkIf
12     mkOption
13     mkPackageOption
14     types
15     ;
17   cfg = config.services.monado;
19   runtimeManifest = "${cfg.package}/share/openxr/1/openxr_monado.json";
22   options.services.monado = {
23     enable = mkEnableOption "Monado user service";
25     package = mkPackageOption pkgs "monado" { };
27     defaultRuntime = mkOption {
28       type = types.bool;
29       description = ''
30         Whether to enable Monado as the default OpenXR runtime on the system.
32         Note that applications can bypass this option by setting an active
33         runtime in a writable XDG_CONFIG_DIRS location like `~/.config`.
34       '';
35       default = false;
36       example = true;
37     };
39     forceDefaultRuntime = mkOption {
40       type = types.bool;
41       description = ''
42         Whether to ensure that Monado is the active runtime set for the current
43         user.
45         This replaces the file `XDG_CONFIG_HOME/openxr/1/active_runtime.json`
46         when starting the service.
47       '';
48       default = false;
49       example = true;
50     };
52     highPriority =
53       mkEnableOption "high priority capability for monado-service"
54       // mkOption { default = true; };
55   };
57   config = mkIf cfg.enable {
58     security.wrappers."monado-service" = mkIf cfg.highPriority {
59       setuid = false;
60       owner = "root";
61       group = "root";
62       # cap_sys_nice needed for asynchronous reprojection
63       capabilities = "cap_sys_nice+eip";
64       source = lib.getExe' cfg.package "monado-service";
65     };
67     services.udev.packages = with pkgs; [ xr-hardware ];
69     systemd.user = {
70       services.monado = {
71         description = "Monado XR runtime service module";
72         requires = [ "monado.socket" ];
73         conflicts = [ "monado-dev.service" ];
75         unitConfig.ConditionUser = "!root";
77         environment = {
78           # Default options
79           # https://gitlab.freedesktop.org/monado/monado/-/blob/4548e1738591d0904f8db4df8ede652ece889a76/src/xrt/targets/service/monado.in.service#L12
80           XRT_COMPOSITOR_LOG = mkDefault "debug";
81           XRT_PRINT_OPTIONS = mkDefault "on";
82           IPC_EXIT_ON_DISCONNECT = mkDefault "off";
83         };
85         preStart = mkIf cfg.forceDefaultRuntime ''
86           XDG_CONFIG_HOME="''${XDG_CONFIG_HOME:-$HOME/.config}"
87           targetDir="$XDG_CONFIG_HOME/openxr/1"
88           activeRuntimePath="$targetDir/active_runtime.json"
90           echo "Note: Replacing active runtime at '$activeRuntimePath'"
91           mkdir --parents "$targetDir"
92           ln --symbolic --force ${runtimeManifest} "$activeRuntimePath"
93         '';
95         serviceConfig = {
96           ExecStart =
97             if cfg.highPriority then
98               "${config.security.wrapperDir}/monado-service"
99             else
100               lib.getExe' cfg.package "monado-service";
101           Restart = "no";
102         };
104         restartTriggers = [ cfg.package ];
105       };
107       sockets.monado = {
108         description = "Monado XR service module connection socket";
109         conflicts = [ "monado-dev.service" ];
111         unitConfig.ConditionUser = "!root";
113         socketConfig = {
114           ListenStream = "%t/monado_comp_ipc";
115           RemoveOnStop = true;
117           # If Monado crashes while starting up, we want to close incoming OpenXR connections
118           FlushPending = true;
119         };
121         restartTriggers = [ cfg.package ];
123         wantedBy = [ "sockets.target" ];
124       };
125     };
127     environment.systemPackages = [ cfg.package ];
128     environment.pathsToLink = [ "/share/openxr" ];
130     hardware.graphics.extraPackages = [ pkgs.monado-vulkan-layers ];
132     environment.etc."xdg/openxr/1/active_runtime.json" = mkIf cfg.defaultRuntime {
133       source = runtimeManifest;
134     };
135   };
137   meta.maintainers = with lib.maintainers; [ Scrumplex ];