{ config, options, lib, pkgs, ... }: let gpuConfig = config.modules.hardware.gpu; device = config.modules.device; in { options.modules.hardware.gpu = { enable = lib.mkOption { type = lib.types.bool; default = true; }; }; config = lib.mkIf (gpuConfig.enable) (lib.mkMerge [ { hardware.graphics = { enable = true; }; } (lib.mkIf (device.gpu == "intel") { boot.initrd.kernelModules = ["i915"]; services.xserver.videoDrivers = ["modesetting"]; hardware.opengl.extraPackages = [ pkgs.intel-compute-runtime pkgs.intel-media-driver pkgs.vaapiIntel pkgs.vaapiVdpau pkgs.libvdpau-va-gl ]; environment.variables.VDPAU_DRIVER = "va_gl"; }) (lib.mkIf (device.gpu == "nvidia") { boot = { extraModulePackages = [ config.boot.kernelPackages.nvidia_x11_beta ]; initrd.kernelModules = [ "nvidia" "nvidia_modeset" "nvidia_uvm" "nvidia_drm" ]; blacklistedKernelModules = [ "nouveau" ]; }; environment.systemPackages = with pkgs; [ pkgs.nvidia-vaapi-driver ]; services.xserver.videoDrivers = ["nvidia"]; hardware.nvidia = { modesetting.enable = true; powerManagement.enable = true; open = false; nvidiaSettings = true; package = config.boot.kernelPackages.nvidiaPackages.beta; }; }) ]); }