nixos/preload: init
[NixPkgs.git] / nixos / modules / programs / gamemode.nix
blobc43e2c2296f5add2d6462cc43d8cf33ff71ce1ea
1 { config, lib, pkgs, ... }:
3 with lib;
5 let
6   cfg = config.programs.gamemode;
7   settingsFormat = pkgs.formats.ini { };
8   configFile = settingsFormat.generate "gamemode.ini" cfg.settings;
9 in
11   options = {
12     programs.gamemode = {
13       enable = mkEnableOption (lib.mdDoc "GameMode to optimise system performance on demand");
15       enableRenice = mkEnableOption (lib.mdDoc "CAP_SYS_NICE on gamemoded to support lowering process niceness") // {
16         default = true;
17       };
19       settings = mkOption {
20         type = settingsFormat.type;
21         default = {};
22         description = lib.mdDoc ''
23           System-wide configuration for GameMode (/etc/gamemode.ini).
24           See gamemoded(8) man page for available settings.
25         '';
26         example = literalExpression ''
27           {
28             general = {
29               renice = 10;
30             };
32             # Warning: GPU optimisations have the potential to damage hardware
33             gpu = {
34               apply_gpu_optimisations = "accept-responsibility";
35               gpu_device = 0;
36               amd_performance_level = "high";
37             };
39             custom = {
40               start = "''${pkgs.libnotify}/bin/notify-send 'GameMode started'";
41               end = "''${pkgs.libnotify}/bin/notify-send 'GameMode ended'";
42             };
43           }
44         '';
45       };
46     };
47   };
49   config = mkIf cfg.enable {
50     environment = {
51       systemPackages = [ pkgs.gamemode ];
52       etc."gamemode.ini".source = configFile;
53     };
55     security = {
56       polkit.enable = true;
57       wrappers = mkIf cfg.enableRenice {
58         gamemoded = {
59           owner = "root";
60           group = "root";
61           source = "${pkgs.gamemode}/bin/gamemoded";
62           capabilities = "cap_sys_nice+ep";
63         };
64       };
65     };
67     systemd = {
68       packages = [ pkgs.gamemode ];
69       user.services.gamemoded = {
70         # The upstream service already defines this, but doesn't get applied.
71         # See https://github.com/NixOS/nixpkgs/issues/81138
72         wantedBy = [ "default.target" ];
74         # Use pkexec from the security wrappers to allow users to
75         # run libexec/cpugovctl & libexec/gpuclockctl as root with
76         # the the actions defined in share/polkit-1/actions.
77         #
78         # This uses a link farm to make sure other wrapped executables
79         # aren't included in PATH.
80         environment.PATH = mkForce (pkgs.linkFarm "pkexec" [
81           {
82             name = "pkexec";
83             path = "${config.security.wrapperDir}/pkexec";
84           }
85         ]);
87         serviceConfig.ExecStart = mkIf cfg.enableRenice [
88           "" # Tell systemd to clear the existing ExecStart list, to prevent appending to it.
89           "${config.security.wrapperDir}/gamemoded"
90         ];
91       };
92     };
93   };
95   meta = {
96     maintainers = with maintainers; [ kira-bruneau ];
97   };