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