{ pkgs, config, lib, ... }: let cfg = config.system.graphics; in { options.system.graphics = { enable = lib.mkEnableOption "enables nvidia"; vendor = lib.mkOption { type = lib.types.enum ["intel" "amd" "nvidia"]; default = "intel"; description = '' set the vendor of your graphics device supported options are "intel" "amd" "nvidia" ''; }; }; config = lib.mkIf cfg.enable (lib.mkMerge [ { hardware.graphics.enable = true; hardware.graphics.enable32Bit = true; } (lib.mkIf (cfg.vendor == "intel") { services.xserver.videoDrivers = ["modesetting"]; # userspace tools environment.systemPackages = with pkgs; [ intel-gpu-tools ]; hardware.graphics.extraPackages = with pkgs; [ # Required for modern Intel GPUs (Xe iGPU and ARC) intel-media-driver # VA-API (iHD) userspace vpl-gpu-rt # oneVPL (QSV) runtime # Optional (compute / tooling): intel-compute-runtime # OpenCL (NEO) + Level Zero for Arc/Xe ]; environment.sessionVariables = { LIBVA_DRIVER_NAME = "iHD"; # Prefer the modern iHD backend }; }) (lib.mkIf (cfg.vendor == "amd") { boot.initrd.kernelModules = ["amdgpu"]; services.xserver.videoDrivers = ["amdgpu"]; # userspace tools environment.systemPackages = with pkgs; [ radeontop ]; # enable amd vulkan (program will choose this or regular) hardware.graphics.extraPackages = with pkgs; [ rocmPackages.clr.icd # enable open cl (compute framework like cuda) ]; # ^ but 32 bit hardware.graphics.extraPackages32 = with pkgs; [ ]; # make hip work (extension on cli.icd ^) systemd.tmpfiles.rules = [ "L+ /opt/rocm/hip - - - - ${pkgs.rocmPackages.clr}" ]; }) (lib.mkIf (cfg.vendor == "nvidia") { boot.kernelModules = ["nvidia" "nvidia_modeset" "nvidia_uvm" "nvidia_drm"]; services.xserver.videoDrivers = ["nvidia"]; # enable nvidia proprietary driver hardware.nvidia = { modesetting.enable = true; # required open = false; # use proprietary driver nvidiaSettings = true; # no shit powerManagement.enable = false; # can cause sleep issues package = config.boot.kernelPackages.nvidiaPackages.stable; }; # enable docker gpu passthrough hardware.nvidia-container-toolkit.enable = true; # systemd.services.nvidia-mps = { # description = "NVIDIA CUDA Multi-Process Service"; # after = [ "nvidia-persistenced.service" ]; # requires = [ "nvidia-persistenced.service" ]; # wantedBy = [ "multi-user.target" ]; # path = [ config.hardware.nvidia.package.bin ]; # serviceConfig = { # Type = "forking"; # ExecStart = "${config.hardware.nvidia.package.bin}/bin/nvidia-cuda-mps-control -d"; # ExecStop = "${pkgs.writeShellScript "nvidia-mps-stop" '' # echo quit | ${config.hardware.nvidia.package.bin}/bin/nvidia-cuda-mps-control # ''}"; # Restart = "on-failure"; # RestartSec = 5; # }; # }; }) ]); }