From 8e13adac78135593baf56fad595960b1080ba73d Mon Sep 17 00:00:00 2001 From: DACHXY Date: Sat, 4 Jan 2025 14:22:13 +0800 Subject: [PATCH] feat: nvidia prime mode --- home/user/environment.nix | 5 +- system/dev/dn-lap/default.nix | 1 + system/dev/dn-pre7780/boot.nix | 20 +++--- system/dev/dn-pre7780/default.nix | 11 +++- system/modules/default.nix | 1 - system/modules/environment.nix | 12 ---- system/modules/hardware.nix | 28 ++++---- system/modules/nvidia.nix | 104 +++++++++++++++++++++++++++--- system/modules/users.nix | 1 - 9 files changed, 133 insertions(+), 50 deletions(-) diff --git a/home/user/environment.nix b/home/user/environment.nix index b0af410..081c499 100644 --- a/home/user/environment.nix +++ b/home/user/environment.nix @@ -12,7 +12,7 @@ QT_WAYLAND_DISABLE_WINDOWDECORATION = "1"; QT_AUTO_SCREEN_SCALE_FACTOR = "1"; GTK_CSD = "0"; - WLR_DRM_DEVICES = "/dev/dri/card0"; + WLR_DRM_DEVICES = "/dev/dri/card1"; WLR_NO_HARDWARE_CURSORS = "1"; CLUTTER_BACKEND = "wayland"; WLR_RENDERER = "vulkan"; @@ -29,8 +29,5 @@ ELECTRON_OZONE_PLATFORM_HINT = "auto"; GDK_BACKEND = "wayland"; - # GPU - LIBVA_DRIVER_NAME = "nvidia"; - __GLX_VENDOR_LIBRARY_NAME = "nvidia"; }; } diff --git a/system/dev/dn-lap/default.nix b/system/dev/dn-lap/default.nix index b848c51..6aac80b 100644 --- a/system/dev/dn-lap/default.nix +++ b/system/dev/dn-lap/default.nix @@ -19,6 +19,7 @@ in ./boot.nix ../../modules ../../modules/wireguard.nix + ../../modules/dn-ca.nix ]; # Overrides diff --git a/system/dev/dn-pre7780/boot.nix b/system/dev/dn-pre7780/boot.nix index 2ff81b5..fd3aaa5 100644 --- a/system/dev/dn-pre7780/boot.nix +++ b/system/dev/dn-pre7780/boot.nix @@ -1,25 +1,27 @@ { ... }: { + + fileSystems."/mnt/storage" = { + device = "router.dn:/mnt/storage"; + fsType = "nfs"; + options = [ + "x-systemd.automount" + "noauto" + "x-systemd.idle-timeout=600" + ]; + }; + boot.loader.systemd-boot.enable = true; - boot.kernelParams = [ - "nvidia-drm.fbdev=1" - "nvidia.NVreg_PreserveVideoMemoryAllocations=1" - ]; # Enable F keys in some wireless keyboard (Ex. neo65) boot.extraModprobeConfig = '' options hid_apple fnmode=2 - options nvidia_drm modeset=1 dbdev=1 ''; boot.initrd.systemd.enable = true; boot.initrd.kernelModules = [ - "nvidia" "i915" - "nvidia_modeset" - "nvidia_uvm" - "nvidia_drm" ]; boot.swraid.enable = true; boot.swraid.mdadmConf = "\n MAILADDR smitty\n ARRAY /dev/md126 metadata=1.2 name=stuff:0\n UUID=3b0b7c51-2681-407e-a22a-e965a8aeece7\n "; diff --git a/system/dev/dn-pre7780/default.nix b/system/dev/dn-pre7780/default.nix index 22e9ec3..229410e 100644 --- a/system/dev/dn-pre7780/default.nix +++ b/system/dev/dn-pre7780/default.nix @@ -11,6 +11,10 @@ let hyprcursor-size = "32"; xcursor-size = "24"; + nvidia-mode = "rsync"; + # Get bus id with `lshw` + intel-bus-id = "PCI:0:2:0"; + nvidia-bus-id = "PCI:1:0:0"; in { imports = [ @@ -18,9 +22,14 @@ in ./hardware-configuration.nix ./boot.nix ../../modules - ../../modules/nvidia.nix + (import ../../modules/nvidia.nix { + nvidia-mode = nvidia-mode; + intel-bus-id = intel-bus-id; + nvidia-bus-id = nvidia-bus-id; + }) ../../modules/gaming.nix ../../modules/wireguard.nix + ../../modules/dn-ca.nix ]; # Overrides diff --git a/system/modules/default.nix b/system/modules/default.nix index a3e8e79..ccef64d 100644 --- a/system/modules/default.nix +++ b/system/modules/default.nix @@ -18,7 +18,6 @@ ./time.nix ./theme.nix ./users.nix - ./dn-ca.nix ./environment.nix ./virtualization.nix ./display-manager.nix diff --git a/system/modules/environment.nix b/system/modules/environment.nix index d4140bc..690c7db 100644 --- a/system/modules/environment.nix +++ b/system/modules/environment.nix @@ -1,18 +1,6 @@ { pkgs, ... }: -# Nvidia only -let - offload = pkgs.writeShellScriptBin "offload" '' - #!/bin/bash - export __NV_PRIME_RENDER_OFFLOAD=1 - export __NV_PRIME_RENDER_OFFLOAD_PROVIDER=NVIDIA-G0 - export __GLX_VENDOR_LIBRARY_NAME=nvidia - export __VK_LAYER_NV_optimus=NVIDIA_only - exec "$@" - ''; -in { - environment.systemPackages = [ offload ]; environment.variables = { ELECTRON_OZONE_PLATFORM_HINT = "auto"; GSETTINGS_SCHEMA_DIR = "${pkgs.gtk3}/share/gsettings-schemas/${pkgs.gtk3.name}/glib-2.0/schemas"; diff --git a/system/modules/hardware.nix b/system/modules/hardware.nix index c1878b0..91cf68a 100644 --- a/system/modules/hardware.nix +++ b/system/modules/hardware.nix @@ -1,12 +1,17 @@ -{ config, pkgs, nixpkgs, inputs, system, ... }: +{ + config, + pkgs, + inputs, + system, + ... +}: let pkgs-unstable = inputs.hyprland.inputs.nixpkgs.legacyPackages.${system}; in { nixpkgs.config.packageOverrides = pkgs: { - intel-vaapi-driver = - pkgs.intel-vaapi-driver.override { enableHybridCodec = true; }; + intel-vaapi-driver = pkgs.intel-vaapi-driver.override { enableHybridCodec = true; }; }; hardware = { @@ -30,15 +35,14 @@ in enable32Bit = true; package32 = pkgs-unstable.pkgsi686Linux.mesa.drivers; package = pkgs-unstable.mesa.drivers; - extraPackages = with pkgs; - [ - intel-media-driver # LIBVA_DRIVER_NAME=iHD - vaapiVdpau - (vaapiIntel.override { - enableHybridCodec = true; - }) - libvdpau-va-gl - ]; + extraPackages = with pkgs; [ + intel-media-driver # LIBVA_DRIVER_NAME=iHD + vaapiVdpau + (vaapiIntel.override { + enableHybridCodec = true; + }) + libvdpau-va-gl + ]; }; enableRedistributableFirmware = true; diff --git a/system/modules/nvidia.nix b/system/modules/nvidia.nix index 4f3026f..cc2ad05 100644 --- a/system/modules/nvidia.nix +++ b/system/modules/nvidia.nix @@ -1,7 +1,58 @@ -{ config, ... }: - { + nvidia-mode ? "sync", + nvidia-bus-id, + intel-bus-id, + ... +}: +let + validModes = [ + "offload" + "sync" + "rsync" + ]; +in +{ + config, + pkgs, + lib, + ... +}: + +# Nvidia offload mode +let + validString = lib.concatStringsSep ", " validModes; + + offload = pkgs.writeShellScriptBin "offload" '' + #!/bin/bash + export __NV_PRIME_RENDER_OFFLOAD=1 + export __NV_PRIME_RENDER_OFFLOAD_PROVIDER=NVIDIA-G0 + export __GLX_VENDOR_LIBRARY_NAME=nvidia + export __VK_LAYER_NV_optimus=NVIDIA_only + exec "$@" + ''; +in +lib.checkListOfEnum "Nvidia Prime Mode" validModes [ nvidia-mode ] { + environment.systemPackages = [ offload ]; + + # Enable nvidia on wayland or xserver services.xserver.videoDrivers = [ "nvidia" ]; + + boot.extraModprobeConfig = '' + options nvidia_drm modeset=1 dbdev=1 + ''; + + boot.initrd.kernelModules = [ + "nvidia" + "nvidia_modeset" + "nvidia_uvm" + "nvidia_drm" + ]; + + boot.kernelParams = [ + "nvidia-drm.fbdev=1" + "nvidia.NVreg_PreserveVideoMemoryAllocations=1" + ]; + hardware = { nvidia.open = false; nvidia.modesetting.enable = true; @@ -11,16 +62,49 @@ nvidia.nvidiaSettings = true; nvidia.dynamicBoost.enable = true; - nvidia.package = config.boot.kernelPackages.nvidiaPackages.stable; + nvidia.package = config.boot.kernelPackages.nvidiaPackages.beta; - nvidia.prime = { - offload = { - enable = true; - enableOffloadCmd = true; + nvidia.prime = + ( + # Reverse Sync Mode + if nvidia-mode == "rsync" then + { + reverseSync.enable = true; + allowExternalGpu = false; + } + # Offload mode + else if nvidia-mode == "offload" then + { + offload = { + enable = true; + enableOffloadCmd = true; + }; + } + # Sync Mode + else + { + sync.enable = true; + } + ) + // { + intelBusId = intel-bus-id; + nvidiaBusId = nvidia-bus-id; }; - # This may different between devices - intelBusId = "PCI:0:2:0"; - nvidiaBusId = "PCI:1:0:0"; + + graphics = { + enable = true; + enable32Bit = true; + extraPackages = with pkgs; [ + nvidia-vaapi-driver + ]; }; }; + + environment.variables = { + # GPU + LIBVA_DRIVER_NAME = "nvidia"; + __GLX_VENDOR_LIBRARY_NAME = "nvidia"; + NVD_BACKEND = "direct"; + MOZ_DISABLE_RDD_SANDBOX = 1; + }; } diff --git a/system/modules/users.nix b/system/modules/users.nix index 2459a25..d25f95b 100644 --- a/system/modules/users.nix +++ b/system/modules/users.nix @@ -9,7 +9,6 @@ "input" "networkmanager" "docker" - "libvirtd" "kvm" ]; };