Files
nix-config-ryan4yin/hosts/idols-ai/hardware-nvidia.nix
T

94 lines
3.0 KiB
Nix

{
config,
pkgs,
...
}:
{
# ===============================================================================================
# for Nvidia GPU
# https://wiki.nixos.org/wiki/NVIDIA
# https://wiki.hyprland.org/Nvidia/
# ===============================================================================================
# Hybrid graphics with PRIME[integrated GPU (iGPU) + dedicated GPU (dGPU)]
hardware.nvidia.prime = {
# puts dGPU(Nvidia) to sleep and lets the iGPU handle all tasks by default.
offload = {
enable = true;
enableOffloadCmd = true; # generate a nvidia-offload command
};
intelBusId = "PCI:0@0:2:0";
nvidiaBusId = "PCI:2@0:0:0";
};
# Games launched through GameScope should use the dGPU. prime.offload keeps the
# Intel iGPU as the default renderer so the dGPU stays free for LLM workloads,
# so opt GameScope games into PRIME render offload here. Games launched outside
# GameScope need `nvidia-offload %command%` in their Steam launch options.
programs.gamescope.env = {
__NV_PRIME_RENDER_OFFLOAD = "1";
__NV_PRIME_RENDER_OFFLOAD_PROVIDER = "NVIDIA-G0";
__GLX_VENDOR_LIBRARY_NAME = "nvidia";
__VK_LAYER_NV_optimus = "NVIDIA_only";
};
boot.kernelParams = [
# Since NVIDIA does not load kernel mode setting by default,
# enabling it is required to make Wayland compositors function properly.
"nvidia-drm.fbdev=1"
];
services.xserver.videoDrivers = [ "nvidia" ]; # will install nvidia-vaapi-driver by default
hardware.nvidia = {
# Open-source kernel modules are preferred over and planned to steadily replace proprietary modules
open = true;
nvidiaSettings = true;
# Optionally, you may need to select the appropriate driver version for your specific GPU.
# https://github.com/NixOS/nixpkgs/blob/nixos-unstable/pkgs/os-specific/linux/nvidia-x11/default.nix
package = config.boot.kernelPackages.nvidiaPackages.production;
# required by most wayland compositors!
modesetting.enable = true;
powerManagement.enable = true;
};
hardware.nvidia-container-toolkit.enable = true;
hardware.graphics = {
enable = true;
# needed by nvidia-docker
enable32Bit = true;
};
# GPU monitoring: CUDA btop (CAP_PERFMON also lets it read the Intel iGPU),
# nvtop, and the community nvidia_gpu_exporter.
modules.btop = {
package = pkgs.btop-cuda;
perfmon = true;
};
environment.systemPackages = [ pkgs.nvtopPackages.full ];
services.prometheus.exporters.nvidia-gpu.enable = true;
services.sunshine.settings = {
adapter_name = "/dev/dri/by-path/pci-0000:00:02.0-render"; # Intel iGPU
encoder = "vaapi";
};
systemd.user.services.sunshine = {
after = [ "niri.service" ];
environment.LIBVA_DRIVER_NAME = "iHD";
preStart = ''
for _ in {1..20}; do
if ${config.programs.niri.package}/bin/niri msg outputs | ${pkgs.gnugrep}/bin/grep -q '^Output '; then
exit 0
fi
sleep 0.5
done
echo "Sunshine requires at least one Niri output" >&2
exit 1
'';
};
}