at 23.11-pre 2.9 kB view raw
1{ config, lib, pkgs, ... }: 2 3with lib; 4 5let 6 cfg = config.programs.gamemode; 7 settingsFormat = pkgs.formats.ini { }; 8 configFile = settingsFormat.generate "gamemode.ini" cfg.settings; 9in 10{ 11 options = { 12 programs.gamemode = { 13 enable = mkEnableOption (lib.mdDoc "GameMode to optimise system performance on demand"); 14 15 enableRenice = mkEnableOption (lib.mdDoc "CAP_SYS_NICE on gamemoded to support lowering process niceness") // { 16 default = true; 17 }; 18 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 }; 31 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 }; 38 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 }; 48 49 config = mkIf cfg.enable { 50 environment = { 51 systemPackages = [ pkgs.gamemode ]; 52 etc."gamemode.ini".source = configFile; 53 }; 54 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 }; 66 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" ]; 73 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 ]); 86 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 }; 94 95 meta = { 96 maintainers = with maintainers; [ kira-bruneau ]; 97 }; 98}