at 25.11-pre 4.8 kB view raw
1{ 2 config, 3 lib, 4 pkgs, 5 ... 6}: 7let 8 cfg = config.hardware.graphics; 9 10 driversEnv = pkgs.buildEnv { 11 name = "graphics-drivers"; 12 paths = [ cfg.package ] ++ cfg.extraPackages; 13 }; 14 15 driversEnv32 = pkgs.buildEnv { 16 name = "graphics-drivers-32bit"; 17 paths = [ cfg.package32 ] ++ cfg.extraPackages32; 18 }; 19in 20{ 21 imports = [ 22 (lib.mkRenamedOptionModule 23 [ "services" "xserver" "vaapiDrivers" ] 24 [ "hardware" "graphics" "extraPackages" ] 25 ) 26 (lib.mkRemovedOptionModule [ 27 "hardware" 28 "opengl" 29 "s3tcSupport" 30 ] "S3TC support is now always enabled in Mesa.") 31 (lib.mkRemovedOptionModule [ "hardware" "opengl" "driSupport" ] "The setting can be removed.") 32 33 (lib.mkRenamedOptionModule [ "hardware" "opengl" "enable" ] [ "hardware" "graphics" "enable" ]) 34 (lib.mkRenamedOptionModule 35 [ "hardware" "opengl" "driSupport32Bit" ] 36 [ "hardware" "graphics" "enable32Bit" ] 37 ) 38 (lib.mkRenamedOptionModule [ "hardware" "opengl" "package" ] [ "hardware" "graphics" "package" ]) 39 (lib.mkRenamedOptionModule 40 [ "hardware" "opengl" "package32" ] 41 [ "hardware" "graphics" "package32" ] 42 ) 43 (lib.mkRenamedOptionModule 44 [ "hardware" "opengl" "extraPackages" ] 45 [ "hardware" "graphics" "extraPackages" ] 46 ) 47 (lib.mkRenamedOptionModule 48 [ "hardware" "opengl" "extraPackages32" ] 49 [ "hardware" "graphics" "extraPackages32" ] 50 ) 51 ]; 52 53 options.hardware.graphics = { 54 enable = lib.mkOption { 55 description = '' 56 Whether to enable hardware accelerated graphics drivers. 57 58 This is required to allow most graphical applications and 59 environments to use hardware rendering, video encode/decode 60 acceleration, etc. 61 62 This option should be enabled by default by the corresponding modules, 63 so you do not usually have to set it yourself. 64 ''; 65 type = lib.types.bool; 66 default = false; 67 }; 68 69 enable32Bit = lib.mkOption { 70 description = '' 71 On 64-bit systems, whether to also install 32-bit drivers for 72 32-bit applications (such as Wine). 73 ''; 74 type = lib.types.bool; 75 default = false; 76 }; 77 78 package = lib.mkOption { 79 description = '' 80 The package that provides the default driver set. 81 ''; 82 type = lib.types.package; 83 }; 84 85 package32 = lib.mkOption { 86 description = '' 87 The package that provides the 32-bit driver set. Used when {option}`enable32Bit` is enabled. 88 ''; 89 type = lib.types.package; 90 }; 91 92 extraPackages = lib.mkOption { 93 description = '' 94 Additional packages to add to the default graphics driver lookup path. 95 This can be used to add OpenCL drivers, VA-API/VDPAU drivers, etc. 96 97 ::: {.note} 98 intel-media-driver supports hardware Broadwell (2014) or newer. Older hardware should use the mostly unmaintained intel-vaapi-driver driver. 99 ::: 100 ''; 101 type = lib.types.listOf lib.types.package; 102 default = [ ]; 103 example = lib.literalExpression "with pkgs; [ intel-media-driver intel-ocl intel-vaapi-driver ]"; 104 }; 105 106 extraPackages32 = lib.mkOption { 107 description = '' 108 Additional packages to add to 32-bit graphics driver lookup path on 64-bit systems. 109 Used when {option}`enable32Bit` is set. This can be used to add OpenCL drivers, VA-API/VDPAU drivers, etc. 110 111 ::: {.note} 112 intel-media-driver supports hardware Broadwell (2014) or newer. Older hardware should use the mostly unmaintained intel-vaapi-driver driver. 113 ::: 114 ''; 115 type = lib.types.listOf lib.types.package; 116 default = [ ]; 117 example = lib.literalExpression "with pkgs.pkgsi686Linux; [ intel-media-driver intel-vaapi-driver ]"; 118 }; 119 }; 120 121 config = lib.mkIf cfg.enable { 122 assertions = [ 123 { 124 assertion = cfg.enable32Bit -> pkgs.stdenv.hostPlatform.isx86_64; 125 message = "`hardware.graphics.enable32Bit` is only supported on an x86_64 system."; 126 } 127 { 128 assertion = cfg.enable32Bit -> (config.boot.kernelPackages.kernel.features.ia32Emulation or false); 129 message = "`hardware.graphics.enable32Bit` requires a kernel that supports 32-bit emulation"; 130 } 131 ]; 132 133 systemd.tmpfiles.settings.graphics-driver = { 134 "/run/opengl-driver"."L+".argument = toString driversEnv; 135 "/run/opengl-driver-32" = 136 if pkgs.stdenv.hostPlatform.isi686 then 137 { "L+".argument = "opengl-driver"; } 138 else if cfg.enable32Bit then 139 { "L+".argument = toString driversEnv32; } 140 else 141 { "r" = { }; }; 142 }; 143 144 hardware.graphics.package = lib.mkDefault pkgs.mesa; 145 hardware.graphics.package32 = lib.mkDefault pkgs.pkgsi686Linux.mesa; 146 }; 147}