fixes for multi gpu

This commit is contained in:
2025-07-19 11:55:49 +02:00
parent 15793a2c42
commit 79aba60947
6 changed files with 86 additions and 75 deletions

View File

@@ -20,7 +20,7 @@
}; };
graphics = { graphics = {
enable = true; enable = true;
vendor = "amd"; vendors = ["amd"];
}; };
logitech = { logitech = {
enable = false; enable = false;

View File

@@ -21,7 +21,7 @@
}; };
graphics = { graphics = {
enable = true; enable = true;
vendor = "amd"; vendors = ["amd"];
}; };
logitech = { logitech = {
enable = true; enable = true;

View File

@@ -21,7 +21,7 @@
}; };
graphics = { graphics = {
enable = true; enable = true;
vendor = "intel"; vendors = ["intel" "amd"];
}; };
logitech = { logitech = {
enable = false; enable = false;

View File

@@ -20,7 +20,7 @@
}; };
graphics = { graphics = {
enable = true; enable = true;
vendor = "nvidia"; vendors = ["nvidia"];
nvidia = { nvidia = {
package = "beta"; package = "beta";
open = { open = {

View File

@@ -1,28 +1,26 @@
{ {
pkgs,
config, config,
lib, lib,
pkgs,
... ...
}: let }: let
inherit (lib) mkEnableOption mkOption types mkIf mkMerge; inherit (lib) mkEnableOption mkOption types mkIf mkMerge flatten concatMap;
cfg = config.nixos.hardware.graphics; cfg = config.nixos.hardware.graphics;
vendor = cfg.vendor;
# Common packages used across all vendors
commonPackages = with pkgs; [ commonPackages = with pkgs; [
libva libva
vaapiVdpau vaapiVdpau
libvdpau-va-gl libvdpau-va-gl
libGL libGL
]; ];
commonPackages32 = with pkgs.pkgsi686Linux; [ commonPackages32 = with pkgs.pkgsi686Linux; [
libva libva
vaapiVdpau vaapiVdpau
libvdpau-va-gl libvdpau-va-gl
]; ];
# Mesa Vulkan packages (used by AMD & Intel only)
mesaVulkanPackages = with pkgs; [ mesaVulkanPackages = with pkgs; [
vulkan-loader vulkan-loader
vulkan-validation-layers vulkan-validation-layers
@@ -30,7 +28,6 @@
vulkan-utility-libraries vulkan-utility-libraries
]; ];
# Extra desktop utilities
tools = with pkgs; [ tools = with pkgs; [
vulkan-tools vulkan-tools
wayland wayland
@@ -48,18 +45,21 @@
export ELECTRON_OZONE_PLATFORM_HINT=auto export ELECTRON_OZONE_PLATFORM_HINT=auto
exec "$@" exec "$@"
''; '';
hasVendor = vendor: builtins.elem vendor cfg.vendors;
in { in {
options.nixos.hardware.graphics = { options.nixos.hardware.graphics = {
enable = mkEnableOption "Enable general graphics support"; enable = mkEnableOption "Enable general graphics support";
vendor = mkOption { vendors = mkOption {
type = types.enum ["amd" "intel" "nvidia"]; type = types.listOf (types.enum ["amd" "intel" "nvidia"]);
default = "amd"; default = ["amd"];
description = "GPU vendor to configure support for."; description = "List of GPU vendors to configure support for.";
}; };
nvidia = { nvidia = {
open.enable = mkEnableOption "Enable NVidia open drivers"; open.enable = mkEnableOption "Enable NVidia open drivers";
package = mkOption { package = mkOption {
type = types.enum ["stable" "beta" "production" "latest"]; type = types.enum ["stable" "beta" "production" "latest"];
default = "stable"; default = "stable";
@@ -68,70 +68,79 @@ in {
}; };
}; };
config = mkIf cfg.enable ( config = mkIf cfg.enable (mkMerge [
mkMerge [ {
{ hardware.graphics = {
hardware.graphics = { enable = true;
enable = true; enable32Bit = true;
enable32Bit = true; extraPackages = flatten (concatMap (
}; vendor:
} if vendor == "amd"
then commonPackages ++ mesaVulkanPackages
else if vendor == "intel"
then
commonPackages
++ mesaVulkanPackages
++ (with pkgs; [
vpl-gpu-rt
intel-media-driver
intel-compute-runtime
])
else if vendor == "nvidia"
then
commonPackages
++ (with pkgs; [
nvidiaOffloadScript
intel-media-driver
nvidia-vaapi-driver
vulkan-tools
])
else []
)
cfg.vendors);
# AMD-specific configuration extraPackages32 = flatten (concatMap (_: commonPackages32) cfg.vendors);
(mkIf (vendor == "amd") { };
hardware.amdgpu.overdrive.enable = true;
hardware.graphics.extraPackages = commonPackages ++ mesaVulkanPackages;
hardware.graphics.extraPackages32 = commonPackages32;
environment.systemPackages = tools;
})
# Intel-specific configuration environment.systemPackages = flatten (concatMap (
(mkIf (vendor == "intel") { vendor:
hardware.graphics.extraPackages = if vendor == "amd"
commonPackages then
++ mesaVulkanPackages tools
++ (with pkgs; [ ++ (with pkgs; [
vpl-gpu-rt # rocmPackages.rpp
intel-media-driver # rocmPackages.clr
intel-compute-runtime ])
]); else if vendor == "intel"
hardware.graphics.extraPackages32 = commonPackages32; then tools
environment.systemPackages = tools; else if vendor == "nvidia"
}) then with pkgs; [egl-wayland libGL]
else []
)
cfg.vendors);
}
# Nvidia-specific configuration (mkIf (hasVendor "amd") {
(mkIf (vendor == "nvidia") { hardware.amdgpu.overdrive.enable = true;
hardware.graphics.extraPackages = })
commonPackages
++ (with pkgs; [
nvidiaOffloadScript
intel-media-driver
nvidia-vaapi-driver
vulkan-tools
]);
hardware.graphics.extraPackages32 = commonPackages32;
environment.systemPackages = with pkgs; [
egl-wayland
libGL
];
hardware.nvidia = { (mkIf (hasVendor "nvidia") {
package = hardware.nvidia = {
if cfg.nvidia.package == "beta" package =
then config.boot.kernelPackages.nvidiaPackages.beta if cfg.nvidia.package == "beta"
else if cfg.nvidia.package == "latest" then config.boot.kernelPackages.nvidiaPackages.beta
then config.boot.kernelPackages.nvidiaPackages.latest else if cfg.nvidia.package == "latest"
else if cfg.nvidia.package == "production" then config.boot.kernelPackages.nvidiaPackages.latest
then config.boot.kernelPackages.nvidiaPackages.production else if cfg.nvidia.package == "production"
else config.boot.kernelPackages.nvidiaPackages.stable; then config.boot.kernelPackages.nvidiaPackages.production
else config.boot.kernelPackages.nvidiaPackages.stable;
modesetting.enable = true; modesetting.enable = true;
powerManagement.enable = false; powerManagement.enable = false;
powerManagement.finegrained = false; powerManagement.finegrained = false;
open = cfg.nvidia.open.enable; open = cfg.nvidia.open.enable;
nvidiaSettings = true; nvidiaSettings = true;
}; };
}) })
] ]);
);
} }

View File

@@ -63,6 +63,8 @@ in {
cloudflared cloudflared
libargon2 libargon2
openssl openssl
xmrig
ocl-icd
] ]
(mkIf cfg.common.enable [ (mkIf cfg.common.enable [