{ pkgs , lib , config , ... }: with lib; let cfg = config.global.gui; 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.gui = { 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; enum [ "intel" "amdgpu" "nvidia" "prime" ]; description = "type of graphics acceleration used"; }; }; config = mkIf cfg.enable { hardware.opengl = { enable = true; driSupport = true; driSupport32Bit = 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 ] ++ optional nvidia nvidia-vaapi-driver; }; services.xserver.videoDrivers = optional nvidia "nvidia" ++ optional (cfg.type == "amdgpu") "amdgpu"; # inhibits default display manager services.xserver.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; }; specialisation.integratedGraphics = mkIf (cfg.type == "prime") { configuration = { global.gui.type = mkForce (if intel then "intel" else if amdgpu then "amdgpu" else "prime"); boot.blacklistedKernelModules = [ "nouveau" ]; }; }; boot.initrd.kernelModules = optional amdgpu "amdgpu" ++ optional intel "i915"; boot.kernelParams = optional intel "i915.fastboot=1"; }; }