33let
44 inherit ( lib ) mkIf ;
55 cfg = config . desktop ;
6+ gaming = config . desktop . gaming ;
67in {
78 options . desktop . gaming = let inherit ( lib ) mkOption mkEnableOption ;
89 in with lib . types ; {
910 enable = mkEnableOption "Enable gaming-related settings." ;
1011
11- prime = mkOption {
12- type = bool ;
13- default = cfg . isLaptop ;
14- defaultText = "config.desktop.isLaptop" ;
15- description = "Enable NVIDIA PRIME support." ;
12+ prime = {
13+ enable = mkOption {
14+ type = bool ;
15+ default = cfg . isLaptop ;
16+ defaultText = "config.desktop.isLaptop" ;
17+ description = "Enable NVIDIA PRIME support." ;
18+ } ;
19+
20+ internal = mkOption {
21+ type = nullOr str ;
22+ default = null ;
23+ description = "PCI ID of the internal GPU." ;
24+ } ;
25+
26+ dedicated = mkOption {
27+ type = nullOr str ;
28+ default = null ;
29+ description = "PCI ID of the dedicated GPU." ;
30+ } ;
1631 } ;
1732
1833 amd = mkOption {
4964 } ;
5065 } ;
5166
52- config = mkIf ( cfg . enable && cfg . gaming . enable ) {
67+ config = mkIf ( cfg . enable && gaming . enable ) {
68+ assertions = [
69+ {
70+ assertion = gaming . prime . enable -> gaming . prime . internal != null ;
71+ message = "prime.internal must be set if prime.enable is true" ;
72+ }
73+ {
74+ assertion = gaming . prime . enable -> gaming . prime . dedicated != null ;
75+ message = "prime.dedicated must be set if prime.enable is true" ;
76+ }
77+ ] ;
78+
5379 programs = {
5480 steam = {
5581 enable = true ;
5682
5783 remotePlay . openFirewall = true ;
5884 dedicatedServer . openFirewall = true ;
59- gamescopeSession . enable = true ;
85+ extest . enable = true ;
86+ gamescopeSession = {
87+ enable = true ;
88+ env . DRI_PRIME = mkIf gaming . prime . enable gaming . prime . dedicated ;
89+ } ;
6090 } ;
6191
6292 gamescope = {
6393 enable = true ;
6494 capSysNice = true ;
6595
6696 # requires `hardware.nvidia.prime.offload.enable`.
67- env = mkIf cfg . gaming . prime {
97+ env = mkIf ( gaming . nvidia && gaming . prime . enable ) {
6898 __NV_PRIME_RENDER_OFFLOAD = "1" ;
6999 __VK_LAYER_NV_optimus = "NVIDIA_only" ;
70100 __GLX_VENDOR_LIBRARY_NAME = "nvidia" ;
@@ -81,15 +111,15 @@ in {
81111 gpu = {
82112 apply_gpu_optimisations = "accept-responsibility" ;
83113 gpu_device = 0 ;
84- amd_performance_level = mkIf cfg . gaming . amd "high" ;
114+ amd_performance_level = mkIf gaming . amd "high" ;
85115 } ;
86116 } ;
87117 } ;
88118 } ;
89119
90120 services . udev . packages = [ pkgs . game-devices-udev-rules ] ;
91121
92- services . sunshine = mkIf cfg . gaming . sunshine . enable {
122+ services . sunshine = mkIf gaming . sunshine . enable {
93123 enable = true ;
94124 openFirewall = true ;
95125 capSysAdmin = true ;
105135 in ( firstChar + ( lib . concatStrings restChars ) ) ;
106136 in ( capitalize config . networking . hostName ) ;
107137
108- output_name = cfg . gaming . sunshine . monitorIndex ;
138+ output_name = gaming . sunshine . monitorIndex ;
109139 } ;
110140
111141 applications = {
120150 # name = "Desktop (Resized)";
121151 # prep-cmd = [{
122152 # do = ''
123- # ${pkgs.bash}/bin/bash -c "${pkgs.xorg.xrandr}/bin/xrandr --output ${cfg. gaming.sunshine.monitor} --mode \"''${SUNSHINE_CLIENT_WIDTH}x''${SUNSHINE_CLIENT_HEIGHT}\" --rate ''${SUNSHINE_CLIENT_FPS}"
153+ # ${pkgs.bash}/bin/bash -c "${pkgs.xorg.xrandr}/bin/xrandr --output ${gaming.sunshine.monitor} --mode \"''${SUNSHINE_CLIENT_WIDTH}x''${SUNSHINE_CLIENT_HEIGHT}\" --rate ''${SUNSHINE_CLIENT_FPS}"
124154 # '';
125155 # undo = "${pkgs.autorandr}/bin/autorandr --change";
126156 # }];
@@ -140,14 +170,20 @@ in {
140170 } ;
141171 } ;
142172
143- # hardware.bumblebee.enable = mkIf cfg. gaming.prime true;
144- hardware . nvidia . prime . offload . enable = mkIf cfg . gaming . prime true ;
173+ # hardware.bumblebee.enable = mkIf gaming.prime.enable true;
174+ hardware . nvidia . prime . offload . enable = mkIf gaming . prime . enable true ;
145175 hardware . steam-hardware . enable = true ;
146176 hardware . xpadneo . enable = true ;
147177 hardware . xone . enable = true ;
148178 hardware . logitech . wireless . enable = true ;
149179 hardware . logitech . wireless . enableGraphical = true ;
150180
181+ environment . sessionVariables = mkIf ( gaming . amd && gaming . prime . enable ) {
182+ DRI_PRIME = gaming . prime . internal ;
183+ DRI_PRIME_INTERNAL = gaming . prime . internal ;
184+ DRI_PRIME_DEDICATED = gaming . prime . dedicated ;
185+ } ;
186+
151187 environment . systemPackages = with pkgs ;
152188 [
153189 # steam
@@ -159,16 +195,18 @@ in {
159195 game-devices-udev-rules
160196
161197 # games
198+ heroic
162199 prismlauncher
163200
164201 # tools
165202 mangohud
166- ] ++ ( lib . optional cfg . gaming . sunshine . enable pkgs . moondeck-buddy ) ;
203+ ] ++ ( lib . optional gaming . sunshine . enable pkgs . moondeck-buddy ) ;
167204
168205 nixpkgs . config . nvidia . acceptLicense = true ;
169206
170207 nixpkgs . config . packageOverrides = pkgs : {
171208 steam = pkgs . steam . override {
209+ extraEnv . DRI_PRIME = mkIf gaming . prime . enable gaming . prime . dedicated ;
172210 extraPkgs = pkgs :
173211 with pkgs ; [
174212 xorg . libXcursor
0 commit comments