143 lines
3.6 KiB
Nix
143 lines
3.6 KiB
Nix
{
|
|
pkgs,
|
|
lib,
|
|
config,
|
|
...
|
|
}:
|
|
with lib;
|
|
let
|
|
cfg = config.global.gpu;
|
|
|
|
intel =
|
|
cfg.type == "intel" || (cfg.type == "prime" && config.hardware.nvidia.prime.intelBusId != "");
|
|
amdgpu =
|
|
cfg.type == "amdgpu" || (cfg.type == "prime" && config.hardware.nvidia.prime.amdgpuBusId != "");
|
|
nvidia = cfg.type == "nvidia" || cfg.type == "prime";
|
|
in
|
|
{
|
|
imports = [
|
|
./plymouth.nix
|
|
./greetd.nix
|
|
];
|
|
|
|
options.global.gpu = {
|
|
enable = mkEnableOption "various setup required for GUI and support software";
|
|
session = mkEnableOption "software required for a graphical session" // {
|
|
default = true;
|
|
};
|
|
type = mkOption {
|
|
type =
|
|
with types;
|
|
nullOr (enum [
|
|
"intel"
|
|
"amdgpu"
|
|
"nvidia"
|
|
"prime"
|
|
]);
|
|
default = null;
|
|
description = "type of graphics acceleration used";
|
|
};
|
|
arc = mkOption {
|
|
type = with types; nullOr str;
|
|
default = null;
|
|
description = "intel arc PCI ID if installed, enables toggling the arc before boot";
|
|
};
|
|
};
|
|
|
|
config = mkIf cfg.enable {
|
|
hardware.graphics = {
|
|
enable = true;
|
|
enable32Bit = true;
|
|
|
|
# https://nixos.wiki/wiki/Accelerated_Video_Playback
|
|
extraPackages =
|
|
with pkgs;
|
|
optionals intel [
|
|
intel-media-driver # LIBVA_DRIVER_NAME=iHD
|
|
vaapiIntel # LIBVA_DRIVER_NAME=i965 (older but works better for Firefox/Chromium)
|
|
vaapiVdpau
|
|
libvdpau-va-gl
|
|
intel-compute-runtime
|
|
]
|
|
++ optional nvidia nvidia-vaapi-driver
|
|
++ optional (cfg.type == "nvidia") vulkan-validation-layers;
|
|
};
|
|
|
|
services.xserver = mkIf cfg.session {
|
|
videoDrivers = optional nvidia "nvidia" ++ optional (cfg.type == "amdgpu") "amdgpu";
|
|
# inhibits default display manager
|
|
|
|
displayManager.startx.enable = mkDefault true;
|
|
};
|
|
|
|
hardware.nvidia = mkIf nvidia {
|
|
modesetting.enable = true;
|
|
nvidiaSettings = true;
|
|
|
|
prime = mkIf (cfg.type == "prime") {
|
|
offload = {
|
|
enable = true;
|
|
enableOffloadCmd = true;
|
|
};
|
|
};
|
|
|
|
powerManagement.enable = false;
|
|
powerManagement.finegrained = false;
|
|
open = false;
|
|
};
|
|
|
|
environment.variables = {
|
|
# work around broken nvidia hw cursor on wayland
|
|
WLR_NO_HARDWARE_CURSORS = mkIf (cfg.type == "nvidia") "1";
|
|
# work around wlroots flickering on pure nvidia
|
|
#WLR_RENDERER = mkIf (cfg.type == "nvidia") "vulkan";
|
|
};
|
|
|
|
specialisation.integratedGraphics = mkIf (cfg.type == "prime") {
|
|
configuration = {
|
|
global.gpu.type = mkForce (
|
|
if intel then
|
|
"intel"
|
|
else if amdgpu then
|
|
"amdgpu"
|
|
else
|
|
"prime"
|
|
);
|
|
boot.blacklistedKernelModules = [ "nouveau" ];
|
|
};
|
|
};
|
|
|
|
specialisation.withArc = mkIf (cfg.arc != null) {
|
|
configuration = {
|
|
global.gpu.arc = mkForce null;
|
|
powerManagement.cpuFreqGovernor = mkForce "performance";
|
|
};
|
|
};
|
|
|
|
boot.initrd.kernelModules =
|
|
optional amdgpu "amdgpu"
|
|
++ optional (intel && cfg.arc == null) "i915"
|
|
++ optionals nvidia [
|
|
"nvidia"
|
|
"nvidia_drm"
|
|
"nvidia_modeset"
|
|
"nvidia_uvm"
|
|
]
|
|
++ optional (cfg.arc != null) "vfio-pci";
|
|
|
|
boot.extraModulePackages = optional nvidia config.boot.kernelPackages.nvidia_x11;
|
|
|
|
boot.extraModprobeConfig = mkIf (cfg.arc != null) ''
|
|
softdep drm pre: vfio-pci
|
|
options vfio-pci ids=${cfg.arc}
|
|
'';
|
|
|
|
boot.kernelParams =
|
|
optional intel "i915.fastboot=1"
|
|
++ optionals nvidia [
|
|
"nvidia_drm.modeset=1"
|
|
"nvidia_drm.fbdev=1"
|
|
];
|
|
};
|
|
}
|