main
 1{
 2  den.aspects.hardware.gpu.nvidia = {
 3    nixos = {
 4      lib,
 5      config,
 6      ...
 7    }: let
 8      allGPU = config.hardware.facter.report.hardware.graphics_card or [];
 9
10      findByDriver = driver: lib.findFirst (d: d.driver or "" == driver) null allGPU;
11
12      nvidiaGPU = findByDriver "nvidia";
13      intelGPU = findByDriver "i915";
14      amdGPU = findByDriver "amdgpu";
15
16      formatBusId = dev: "PCI:${toString dev.slot.bus}:${toString dev.slot.number}:${toString dev.detail.function}";
17
18      hasIntelGPU = intelGPU != null;
19      hasAmdGPU = amdGPU != null;
20
21      enableOffload = hasIntelGPU || hasAmdGPU;
22    in {
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 = lib.mkIf enableOffload ({
35            offload = {
36              enable = true;
37              enableOffloadCmd = true;
38            };
39            nvidiaBusId = formatBusId nvidiaGPU;
40          }
41          // lib.optionalAttrs hasIntelGPU {
42            intelBusId = formatBusId intelGPU;
43          }
44          // lib.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}