diff --git a/hardware.nix b/hardware.nix index 5ea39ae..f923730 100644 --- a/hardware.nix +++ b/hardware.nix @@ -5,14 +5,7 @@ let desktopCfg = config.aviallon.desktop; in { - options.aviallon.hardware = { - gpuVendor = mkOption { - default = null; - example = "amd"; - description = "Enable GPU vendor specific options"; - type = types.enum [ "amd" "nvidia" "intel" ]; - }; - }; + options.aviallon.hardware = { }; imports = [ ./hardware/amd.nix diff --git a/hardware/amd.nix b/hardware/amd.nix index 2a60458..102a357 100644 --- a/hardware/amd.nix +++ b/hardware/amd.nix @@ -1,10 +1,14 @@ { config, pkgs, lib, ... }: with lib; let - hardwareCfg = config.aviallon.hardware; + cfg = config.aviallon.hardware.amd; in { - config = mkIf (hardwareCfg.gpuVendor == "amd") { + options.aviallon.hardware.amd = { + enable = mkEnableOption "AMD gpus"; + }; + + config = mkIf (cfg.enable) { boot.initrd.kernelModules = [ "amdgpu" ]; aviallon.boot.cmdline = {} diff --git a/hardware/intel.nix b/hardware/intel.nix index df24272..45fc5ef 100644 --- a/hardware/intel.nix +++ b/hardware/intel.nix @@ -1,10 +1,14 @@ { config, pkgs, lib, ... }: with lib; let - hardwareCfg = config.aviallon.hardware; + cfg = config.aviallon.hardware.intel; in { - config = mkIf (hardwareCfg.gpuVendor == "intel") { + options.aviallon.hardware.intel = { + enable = mkEnableOption "Intel GPUs"; + }; + + config = mkIf cfg.enable { boot.initrd.kernelModules = [ "i915" ]; hardware.opengl = { enable = true; diff --git a/hardware/nvidia.nix b/hardware/nvidia.nix index d1f1e63..363aea5 100644 --- a/hardware/nvidia.nix +++ b/hardware/nvidia.nix @@ -1,50 +1,20 @@ { config, pkgs, lib, ... }: with lib; let - cfg = config.aviallon.hardware; + cfg = config.aviallon.hardware.nvidia; in { imports = [ ./nvidia ]; - options.aviallon.hardware.useProprietary = mkEnableOption "nvidia proprietary drivers"; + options.aviallon.hardware.nvidia = { + enable = mkEnableOption "enable Nvidia hardware config"; + useProprietary = mkEnableOption "nvidia proprietary drivers"; + saveAllVram = mkEnableOption "back up all VRAM in /tmp before going to sleep. May reduce artifacts after resuming"; + }; - config = mkIf (cfg.gpuVendor == "nvidia") { - boot.initrd.kernelModules = if cfg.useProprietary then [ - "nvidia" - "nvidia_drm" - "nvidia_uvm" - "nvidia_modeset" - ] else [ "nouveau" ]; - # boot.blacklistedKernelModules = optional cfg.useProprietary "nouveau"; - services.xserver.videoDrivers = optional cfg.useProprietary "nvidia"; + config = mkIf cfg.enable { hardware.opengl.driSupport32Bit = true; - hardware.nvidia = { - powerManagement.enable = true; - modesetting.enable = true; - }; - - aviallon.programs.allowUnfreeList = mkIf (cfg.useProprietary) [ - "nvidia-x11" - "nvidia-settings" - ]; - - hardware.opengl.extraPackages = with pkgs; [ - libvdpau-va-gl - vaapiVdpau - ]; - - hardware.opengl.extraPackages32 = with pkgs.pkgsi686Linux; [ - libvdpau-va-gl - vaapiVdpau - ]; - - # See documentation here: https://download.nvidia.com/XFree86/Linux-x86_64/510.60.02/README/openglenvvariables.html - environment.variables = ifEnable cfg.useProprietary { - "__GL_YIELD" = "USLEEP"; # use usleep(0) instead of sched_yield() -> better performance in most cases - "__GL_ALLOW_UNOFFICIAL_PROTOCOL" = "1"; # allow unofficial GLX protocol if also set in Xorg conf - "__GL_VRR_ALLOWED" = "1"; # Try to enable G-SYNC VRR if screen AND app is compatible - }; }; } diff --git a/hardware/nvidia/default.nix b/hardware/nvidia/default.nix index 7a63d84..451b5cd 100644 --- a/hardware/nvidia/default.nix +++ b/hardware/nvidia/default.nix @@ -2,5 +2,7 @@ { imports = [ ./vgpu.nix + ./proprietary.nix + ./opensource.nix ]; } diff --git a/hardware/nvidia/opensource.nix b/hardware/nvidia/opensource.nix new file mode 100644 index 0000000..bb41fa7 --- /dev/null +++ b/hardware/nvidia/opensource.nix @@ -0,0 +1,9 @@ +{ config, pkgs, lib, ... }: +with lib; +let + cfg = config.aviallon.hardware.nvidia; +in { + config = mkIf (cfg.enable && !cfg.useProprietary) { + boot.initrd.kernelModules = [ "nouveau" ]; + }; +} diff --git a/hardware/nvidia/proprietary.nix b/hardware/nvidia/proprietary.nix new file mode 100644 index 0000000..1690cfd --- /dev/null +++ b/hardware/nvidia/proprietary.nix @@ -0,0 +1,62 @@ +{ config, pkgs, lib, ... }: +with lib; +let + cfg = config.aviallon.hardware.nvidia; +in { + config = mkIf (cfg.enable && cfg.useProprietary) { + boot.initrd.kernelModules = [ + "nvidia" + "nvidia_drm" + "nvidia_uvm" + "nvidia_modeset" + ]; + # boot.blacklistedKernelModules = [ "nouveau" ]; + services.xserver.videoDrivers = [ + "nvidia" + ]; + + hardware.nvidia = { + powerManagement.enable = true; + powerManagement.finegrained = ifEnable config.hardware.nvidia.prime.offload.enable true; + modesetting.enable = true; + #package = with config.boot.kernelPackages.nvidiaPackages; + # if (cfg.driver == "stable") then + # stable + # else if (cfg.driver == "390") then + # legacy_390 + # else if (cfg.driver == "340") then + # legacy_340 + # else + # null + # ; + }; + services.xserver.displayManager.gdm.nvidiaWayland = mkDefault true; + + aviallon.boot.cmdline = mkIf cfg.saveAllVram { + NVreg_PreserveVideoMemoryAllocations = 1; + NVreg_TemporaryFilePath = "/tmp/nvidia-gpu.vram.img"; + }; + + aviallon.programs.allowUnfreeList = [ + "nvidia-x11" + "nvidia-settings" + ]; + + hardware.opengl.extraPackages = with pkgs; [ + libvdpau-va-gl + vaapiVdpau + ]; + + hardware.opengl.extraPackages32 = with pkgs.pkgsi686Linux; [ + libvdpau-va-gl + vaapiVdpau + ]; + + # See documentation here: https://download.nvidia.com/XFree86/Linux-x86_64/510.60.02/README/openglenvvariables.html + environment.variables = { + "__GL_YIELD" = "USLEEP"; # use usleep(0) instead of sched_yield() -> better performance in most cases + "__GL_ALLOW_UNOFFICIAL_PROTOCOL" = "1"; # allow unofficial GLX protocol if also set in Xorg conf + "__GL_VRR_ALLOWED" = "1"; # Try to enable G-SYNC VRR if screen AND app is compatible + }; + }; +} diff --git a/hardware/nvidia/vgpu.nix b/hardware/nvidia/vgpu.nix index 0fe8d5b..da4daf3 100644 --- a/hardware/nvidia/vgpu.nix +++ b/hardware/nvidia/vgpu.nix @@ -1,15 +1,21 @@ {config, pkgs, lib, ...}: with lib; let - cfg = config.aviallon.hardware; - nixos-nvidia-vgpu = import (builtins.fetchTarball "https://github.com/danielfullmer/nixos-nvidia-vgpu/archive/master.tar.gz") { + cfg = config.aviallon.hardware.nvidia; + vgpu-git = fetchGit { + url = "https://github.com/danielfullmer/nixos-nvidia-vgpu.git"; + rev = "a4be77969dc2a8acbe3a4882ba5f0324cca138b6"; + ref = "master"; + }; + nixos-nvidia-vgpu = import vgpu-git { inherit config; inherit pkgs; inherit lib; }; - useVgpu = (cfg.useProprietary && - (cfg.gpuVendor == "nvidia") && - (versionOlder config.boot.kernelPackages.kernel.version "5.10")); + useVgpu = ( + cfg.enable && cfg.useProprietary && + (versionOlder config.boot.kernelPackages.kernel.version "5.10") + ); in { imports = [