{ config, lib, pkgs, ... }: let inherit (lib) mkIf mkEnableOption mkOption optionals types; cfg = config.nvidia; in { options.nvidia = { enable = mkEnableOption "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.58"; sha256_64bit = "sha256-bXvcXkg2kQZuCNKRZM5QoTaTjF4l2TtrsKUvyicj5ew="; sha256_aarch64 = "sha256-7XswQwW1iFP4ji5mbRQ6PVEhD4SGWpjUJe1o8zoXYRE="; openSha256 = "sha256-hEAmFISMuXm8tbsrB+WiUcEFuSGRNZ37aKWvf0WJ2/c="; settingsSha256 = "sha256-vWnrXlBCb3K5uVkDFmJDVq51wrCoqgPF03lSjZOuU8M="; persistencedSha256 = "sha256-lyYxDuGDTMdGxX3CaiWUh1IQuQlkI2hPEs5LI20vEVw="; }; }; 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"]; }; }