{ config, lib, pkgs, ... }: let inherit (lib) mdDoc mkIf mkEnableOption mkOption optionals types; cfg = config.nvidia; in { options.nvidia = { enable = mkEnableOption (mdDoc "nvidia"); enableNvidiaSettings = mkOption { type = types.bool; default = false; }; enableWayland = mkOption { type = types.bool; default = false; }; enableCUDA = mkOption { type = types.bool; default = false; }; }; config = mkIf cfg.enable { hardware.graphics = { enable = true; enable32Bit = true; extraPackages = with pkgs; [ vaapiVdpau libvdpau-va-gl nvidia-vaapi-driver ]; extraPackages32 = with pkgs; [vaapiVdpau]; }; services.xserver.videoDrivers = ["nvidia"]; hardware.nvidia = { modesetting.enable = true; # Enable the Nvidia settings menu, # accessible via `nvidia-settings`. nvidiaSettings = cfg.enableNvidiaSettings; # Nvidia power management. Experimental, and can cause sleep/suspend to fail. powerManagement = { enable = false; # Fine-grained power management. Turns off GPU when not in use. # Experimental and only works on modern Nvidia GPUs (Turing or newer). finegrained = false; }; open = false; package = if !cfg.enableWayland then config.boot.kernelPackages.nvidiaPackages.stable else # Get newest beta driver version for better Wayland support config.boot.kernelPackages.nvidiaPackages.mkDriver { version = "555.52.04"; sha256_64bit = "sha256-nVOubb7zKulXhux9AruUTVBQwccFFuYGWrU1ZiakRAI="; sha256_aarch64 = "sha256-Kt60kTTO3mli66De2d1CAoE3wr0yUbBe7eqCIrYHcWk="; openSha256 = "sha256-wDimW8/rJlmwr1zQz8+b1uvxxxbOf3Bpk060lfLKuy0="; settingsSha256 = "sha256-PMh5efbSEq7iqEMBr2+VGQYkBG73TGUh6FuDHZhmwHk="; persistencedSha256 = "sha256-KAYIvPjUVilQQcD04h163MHmKcQrn2a8oaXujL2Bxro="; }; }; environment.systemPackages = optionals cfg.enableCUDA [pkgs.cudaPackages.cudatoolkit] ++ (with pkgs; [ libva-utils nvidia-vaapi-driver nvtopPackages.nvidia pciutils vdpauinfo ]); boot.kernelModules = optionals cfg.enableCUDA ["nvidia-uvm"] ++ ["nvidia" "nvidia-drm"]; }; }