From 163eafb8f0307af540fe8c9a7e9e2f7cc785aec9 Mon Sep 17 00:00:00 2001 From: ItsDrike Date: Wed, 15 May 2024 20:29:28 +0200 Subject: [PATCH] Add gpu settings --- hosts/herugrim/default.nix | 1 + options/device/hardware.nix | 10 ++++ system/shared/hardware/default.nix | 1 + system/shared/hardware/gpu/amd.nix | 39 +++++++++++++ system/shared/hardware/gpu/default.nix | 7 +++ system/shared/hardware/gpu/nvidia.nix | 78 ++++++++++++++++++++++++++ 6 files changed, 136 insertions(+) create mode 100644 system/shared/hardware/gpu/amd.nix create mode 100644 system/shared/hardware/gpu/default.nix create mode 100644 system/shared/hardware/gpu/nvidia.nix diff --git a/hosts/herugrim/default.nix b/hosts/herugrim/default.nix index 7a9b9bb..f4f6269 100644 --- a/hosts/herugrim/default.nix +++ b/hosts/herugrim/default.nix @@ -56,6 +56,7 @@ virtual-machine = false; }; cpu.type = "intel"; + gpu.type = "nvidia"; hasTPM = true; }; diff --git a/options/device/hardware.nix b/options/device/hardware.nix index 3d86d37..cddde3f 100644 --- a/options/device/hardware.nix +++ b/options/device/hardware.nix @@ -14,6 +14,16 @@ in ''; }; + gpu.type = mkOption { + type = with types; nullOr (enum [ "nvidia" "amd" "intel" ]); + default = null; + description = '' + The manifaturer/type of the primary system GPU. + + Allows the correct GPU drivers to be loaded, potentially optimizing video output performance. + ''; + }; + hasTPM = mkOption { type = lib.types.bool; default = false; diff --git a/system/shared/hardware/default.nix b/system/shared/hardware/default.nix index 2dbc2c1..2c3dc2f 100644 --- a/system/shared/hardware/default.nix +++ b/system/shared/hardware/default.nix @@ -1,6 +1,7 @@ _: { imports = [ ./cpu + ./gpu ./tpm.nix ./generic.nix ]; diff --git a/system/shared/hardware/gpu/amd.nix b/system/shared/hardware/gpu/amd.nix new file mode 100644 index 0000000..1a0ec01 --- /dev/null +++ b/system/shared/hardware/gpu/amd.nix @@ -0,0 +1,39 @@ +# WARNING: This file is currently untested +# (I didn't yet run this NixOS config on any AMD GPU systems) +{ config, lib, pkgs, ... }: +let + dev = config.myOptions.device; +in +{ + config = lib.mkIf (dev.gpu.type == "amd") { + services.xserver.videoDrivers = lib.mkDefault ["modesetting" "amdgpu"]; + + boot = { + initrd.kernelModules = ["amdgpu"]; # load amdgpu kernel module as early as initrd + kernelModules = ["amdgpu"]; # if loading somehow fails during initrd but the boot continues, try again later + }; + + environment.systemPackages = with pkgs; [ + mesa + + vulkan-tools + vulkan-loader + vulkan-validation-layers + vulkan-extension-layer + ]; + + # Enable OpenGL + hardware.opengl = { + enable = true; + + # Enable OpenCL and AMDVLK + extraPackages = with pkgs; [ + amdvlk + rcomPackages.clr.icd + ]; + extraPackages32 = with pkgs; [ + driversi686Linux.amdvlk + ]; + }; + }; +} diff --git a/system/shared/hardware/gpu/default.nix b/system/shared/hardware/gpu/default.nix new file mode 100644 index 0000000..4a57cf9 --- /dev/null +++ b/system/shared/hardware/gpu/default.nix @@ -0,0 +1,7 @@ +_: { + imports = [ + ./amd.nix + ./nvidia.nix + ]; +} + diff --git a/system/shared/hardware/gpu/nvidia.nix b/system/shared/hardware/gpu/nvidia.nix new file mode 100644 index 0000000..fed1519 --- /dev/null +++ b/system/shared/hardware/gpu/nvidia.nix @@ -0,0 +1,78 @@ +{ config, lib, pkgs, ... }: +let + dev = config.myOptions.device; +in +{ + config = lib.mkIf (dev.gpu.type == "nvidia") { + # Nvidia drivers are unfree software + nixpkgs.config.allowUnfree = true; + + # Enable nvidia driver for Xorg and Wayland + services.xserver.videoDrivers = ["nvidia"]; + + hardware = { + nvidia = { + # modeestting is required + modesetting.enable = lib.mkDefault true; + + # Nvidia power managerment. Experimental, and can cause sleep/suspend to fail. + # Enable this if you have graphical corruption issues or application crashes after waking + # up from sleep. This fixes it by saving the entire VRAM memory to /tmp/ instead of just + # the bare essentials + powerManagement.enable = lib.mkDefault true; + + # Fine-grained power management. Turns off GPU when not in use. + # Experimental and only works on modern Nvidia GPUs (Turing or newer) + powerManagement.finegrained = lib.mkDefault false; + + # Use the NVidia open source kernel module (not to be confused with the + # independent third-party "nouveau" open source driver). + # Support is limited to the Turing and later architectures. Full list of + # supported GPUs is at: https://github.com/NVIDIA/open-gpu-kernel-modules#compatible-gpus + # + # Enable this by default, hosts may override this option if their gpu is not + # supported by the open source drivers + open = lib.mkDefault true; + + # Add the Nvidia settings package, accessible via `nvidia-settings`. + # (useless on NixOS) + nvidiaSettings = false; + + # This ensures all GPUs stay awake even during headless mode. + nvidiaPersistenced = true; + }; + + # Enable OpenGL + opengl = { + enable = true; + + # VA-API implementation using NVIDIA's NVDEC + extraPackages = with pkgs; [nvidia-vaapi-driver]; + extraPackages32 = with pkgs.pkgsi686Linux; [nvidia-vaapi-driver]; + }; + }; + + # blacklist nouveau module so that it does not conflict with nvidia drm stuff + # also the nouveau performance is horrible in comparison. + boot.blacklistedKernelModules = ["nouveau"]; + + environment = { + systemPackages = with pkgs; [ + mesa + + vulkan-tools + vulkan-loader + vulkan-validation-layers + vulkan-extension-layer + + libva + libva-utils + ]; + + sessionVariables = { + LIBVA_DRIVER_NAME = "nvidia"; + WLR_NO_HARDWARE_CURSORS = "1"; + }; + }; + }; +}