main
 1{lib, ...}: {
 2  den.aspects.core.hardware.graphic.nvidia = {
 3    nixos = {config, ...}: let
 4      inherit (lib) mkIf findFirst optionalAttrs;
 5
 6      allGPU = config.hardware.facter.report.hardware.graphics_card or [];
 7
 8      findByDriver = driver: findFirst (d: d.driver or "" == driver) null allGPU;
 9
10      nvidiaGPU = findByDriver "nvidia";
11      intelGPU = findByDriver "i915";
12      amdGPU = findByDriver "amdgpu";
13
14      formatBusId = dev: "PCI:${toString dev.slot.bus}:${toString dev.slot.number}:${toString dev.detail.function}";
15
16      hasNvidiaGPU = nvidiaGPU != null;
17      hasIntelGPU = intelGPU != null;
18      hasAmdGPU = amdGPU != null;
19
20      enableOffload = hasIntelGPU || hasAmdGPU;
21    in
22      mkIf hasNvidiaGPU {
23        hardware.nvidia = {
24          branch = "stable";
25          open = true;
26          nvidiaSettings = true;
27          powerManagement = {
28            enable = true;
29            finegrained = hasIntelGPU || hasAmdGPU;
30          };
31          dynamicBoost.enable = hasIntelGPU || hasAmdGPU;
32          # Prime only take effects on X11
33          # See https://discourse.nixos.org/t/can-we-solve-the-nvidia-situation/73198
34          prime = mkIf enableOffload ({
35              offload = {
36                enable = true;
37                enableOffloadCmd = true;
38              };
39              nvidiaBusId = formatBusId nvidiaGPU;
40            }
41            // optionalAttrs hasIntelGPU {
42              intelBusId = formatBusId intelGPU;
43            }
44            // optionalAttrs hasAmdGPU {
45              amdgpuBusId = formatBusId amdGPU;
46            });
47        };
48
49        services.xserver.videoDrivers = ["nvidia"];
50        boot.initrd.kernelModules = ["nvidia"];
51
52        nixpkgs.config.cudaSupport = lib.mkDefault true;
53      };
54  };
55}