* X server autoconfiguration. Rather than specifying a fixed video
driver (in services.xserver.videoDriver), the X server is now given a set of drivers, and will use PCI ids to find the right one. The only problem is that the choice of OpenGL driver (the /var/run/opengl-driver symlink) depends on what driver is selected at runtime (i.e. the NVIDIA implementation for "nvidia", and Mesa for all other drivers). However this isn't a big problem right now since "nvidia" isn't included in the default set of drivers anyway for legal reasons. * `services.xserver.resolutions' now defaults to [], meaning that the X server should figure out the desired resolution(s) itself. Likewise, `services.xserver.defaultDepth' defaults to 0 to let the X server figure it out. * Removed some options from xorg.conf that no longer appear needed ("Composite" and the DRI "Mode"). svn path=/nixos/trunk/; revision=18176
This commit is contained in:
parent
fe1f084728
commit
3e9665dd96
2 changed files with 113 additions and 115 deletions
|
@ -11,27 +11,29 @@ let
|
|||
xorg = pkgs.xorg;
|
||||
|
||||
|
||||
# Map the video driver setting to a driver.
|
||||
# Map video driver names to driver packages.
|
||||
knownVideoDrivers = {
|
||||
nvidia = { modules = [ kernelPackages.nvidia_x11 ]; };
|
||||
nvidiaLegacy = { modules = [ kernelPackages.nvidia_x11_legacy ]; };
|
||||
vesa = { modules = [ xorg.xf86videovesa ]; };
|
||||
vga = { modules = [ xorg.xf86videovga ]; };
|
||||
sis = { modules = [ xorg.xf86videosis ]; };
|
||||
i810 = { modules = [ xorg.xf86videoi810 ]; };
|
||||
intel = { modules = [ xorg.xf86videointel ]; };
|
||||
nv = { modules = [ xorg.xf86videonv ]; };
|
||||
ati = { modules = [ xorg.xf86videoati ]; };
|
||||
openchrome = { modules = [ xorg.xf86videoopenchrome ]; };
|
||||
unichrome = { modules = [ pkgs.xorgVideoUnichrome ]; };
|
||||
cirrus = { modules = [ xorg.xf86videocirrus ]; };
|
||||
vmware = { modules = [ xorg.xf86videovmware ]; };
|
||||
virtualbox = { modules = [ kernelPackages.virtualboxGuestAdditions ]; };
|
||||
ati = { modules = [ xorg.xf86videoati ]; };
|
||||
cirrus = { modules = [ xorg.xf86videocirrus ]; };
|
||||
i810 = { modules = [ xorg.xf86videoi810 ]; };
|
||||
intel = { modules = [ xorg.xf86videointel ]; };
|
||||
nv = { modules = [ xorg.xf86videonv ]; };
|
||||
nvidia = { modules = [ kernelPackages.nvidia_x11 ]; };
|
||||
nvidiaLegacy = { modules = [ kernelPackages.nvidia_x11_legacy ]; name = "nvidia"; };
|
||||
openchrome = { modules = [ xorg.xf86videoopenchrome ]; };
|
||||
sis = { modules = [ xorg.xf86videosis ]; };
|
||||
unichrome = { modules = [ pkgs.xorgVideoUnichrome ]; };
|
||||
vesa = { modules = [ xorg.xf86videovesa ]; };
|
||||
virtualbox = { modules = [ kernelPackages.virtualboxGuestAdditions ]; name = "vboxvideo"; };
|
||||
vmware = { modules = [ xorg.xf86videovmware ]; };
|
||||
};
|
||||
|
||||
videoDriver = cfg.videoDriver;
|
||||
driverNames =
|
||||
optional (cfg.videoDriver != null) cfg.videoDriver ++ cfg.videoDrivers;
|
||||
|
||||
videoDriverInfo = attrByPath [videoDriver] (throw "unknown video driver: `${videoDriver}'") knownVideoDrivers;
|
||||
drivers = flip map driverNames
|
||||
(name: { inherit name; } //
|
||||
attrByPath [name] (throw "unknown video driver `${name}'") knownVideoDrivers);
|
||||
|
||||
|
||||
fontsForXServer =
|
||||
|
@ -158,17 +160,30 @@ in
|
|||
};
|
||||
|
||||
resolutions = mkOption {
|
||||
default = [ {x = 1024; y = 768;} {x = 800; y = 600;} {x = 640; y = 480;} ];
|
||||
default = [];
|
||||
description = ''
|
||||
The screen resolutions for the X server. The first element is the default resolution.
|
||||
The screen resolutions for the X server. The first element
|
||||
is the default resolution. If this list is empty, the X
|
||||
server will automatically configure the resolution.
|
||||
'';
|
||||
};
|
||||
|
||||
videoDriver = mkOption {
|
||||
default = "vesa";
|
||||
default = null;
|
||||
example = "i810";
|
||||
description = ''
|
||||
The name of the video driver for your graphics card.
|
||||
The name of the video driver for your graphics card. This
|
||||
option is obsolete; please set the
|
||||
<option>videoDrivers</option> instead.
|
||||
'';
|
||||
};
|
||||
|
||||
videoDrivers = mkOption {
|
||||
example = [ "vesa" ];
|
||||
description = ''
|
||||
The names of the video drivers that the X server should
|
||||
support. The X server will try all of the drivers listed
|
||||
here until it finds one that supports your video card.
|
||||
'';
|
||||
};
|
||||
|
||||
|
@ -190,14 +205,6 @@ in
|
|||
'';
|
||||
};
|
||||
|
||||
isClone = mkOption {
|
||||
default = true;
|
||||
example = false;
|
||||
description = ''
|
||||
Whether to enable the X server clone mode for dual-head.
|
||||
'';
|
||||
};
|
||||
|
||||
layout = mkOption {
|
||||
default = "us";
|
||||
description = ''
|
||||
|
@ -266,7 +273,7 @@ in
|
|||
};
|
||||
|
||||
defaultDepth = mkOption {
|
||||
default = 24;
|
||||
default = 0;
|
||||
example = 8;
|
||||
description = "Default colour depth.";
|
||||
};
|
||||
|
@ -321,9 +328,9 @@ in
|
|||
};
|
||||
|
||||
boot.extraModulePackages =
|
||||
optional (cfg.videoDriver == "nvidia") kernelPackages.nvidia_x11 ++
|
||||
optional (cfg.videoDriver == "nvidiaLegacy") kernelPackages.nvidia_x11_legacy ++
|
||||
optional (cfg.videoDriver == "virtualbox") kernelPackages.virtualboxGuestAdditions;
|
||||
optional (elem "nvidia" driverNames) kernelPackages.nvidia_x11 ++
|
||||
optional (elem "nvidiaLegacy" driverNames) kernelPackages.nvidia_x11_legacy ++
|
||||
optional (elem "virtualbox" driverNames) kernelPackages.virtualboxGuestAdditions;
|
||||
|
||||
environment.etc = optionals cfg.exportConfiguration
|
||||
[ { source = "${configFile}";
|
||||
|
@ -344,13 +351,13 @@ in
|
|||
xorg.xsetroot
|
||||
xorg.xprop
|
||||
]
|
||||
++ optional (videoDriver == "nvidia") kernelPackages.nvidia_x11
|
||||
++ optional (videoDriver == "nvidiaLegacy") kernelPackages.nvidia_x11_legacy;
|
||||
++ optional (elem "nvidia" driverNames) kernelPackages.nvidia_x11
|
||||
++ optional (elem "nvidiaLegacy" driverNames) kernelPackages.nvidia_x11_legacy;
|
||||
|
||||
environment.systemPackages = config.environment.x11Packages;
|
||||
|
||||
services.hal.packages = halConfigFiles ++
|
||||
optional (videoDriver == "virtualbox") kernelPackages.virtualboxGuestAdditions;
|
||||
optional (elem "virtualbox" driverNames) kernelPackages.virtualboxGuestAdditions;
|
||||
|
||||
jobs.xserver =
|
||||
{ startOn = if cfg.autorun then "hal" else "never";
|
||||
|
@ -358,11 +365,12 @@ in
|
|||
environment =
|
||||
{ FONTCONFIG_FILE = "/etc/fonts/fonts.conf"; # !!! cleanup
|
||||
XKB_BINDIR = "${xorg.xkbcomp}/bin"; # Needed for the Xkb extension.
|
||||
} // optionalAttrs (videoDriver != "nvidia") {
|
||||
} # !!! Depends on the driver selected at runtime.
|
||||
// optionalAttrs (!elem "nvidia" driverNames) {
|
||||
XORG_DRI_DRIVER_PATH = "${pkgs.mesa}/lib/dri";
|
||||
} // optionalAttrs (videoDriver == "nvidia") {
|
||||
} // optionalAttrs (elem "nvidia" driverNames) {
|
||||
LD_LIBRARY_PATH = "${xorg.libX11}/lib:${xorg.libXext}/lib:${kernelPackages.nvidia_x11}/lib";
|
||||
} // optionalAttrs (videoDriver == "nvidiaLegacy") {
|
||||
} // optionalAttrs (elem "nvidiaLegacy" driverNames) {
|
||||
LD_LIBRARY_PATH = "${xorg.libX11}/lib:${xorg.libXext}/lib:${kernelPackages.nvidia_x11_legacy}/lib";
|
||||
} // cfg.displayManager.job.environment;
|
||||
|
||||
|
@ -377,16 +385,15 @@ in
|
|||
done
|
||||
|
||||
rm -f /var/run/opengl-driver
|
||||
${if videoDriver == "nvidia"
|
||||
then ''
|
||||
${# !!! The OpenGL driver depends on what's detected at runtime.
|
||||
if elem "nvidia" driverNames then ''
|
||||
ln -sf ${kernelPackages.nvidia_x11} /var/run/opengl-driver
|
||||
''
|
||||
else if videoDriver == "nvidiaLegacy"
|
||||
then ''
|
||||
else if elem "nvidiaLegacy" driverNames then ''
|
||||
ln -sf ${kernelPackages.nvidia_x11_legacy} /var/run/opengl-driver
|
||||
''
|
||||
else if cfg.driSupport
|
||||
then "ln -sf ${pkgs.mesa} /var/run/opengl-driver"
|
||||
else if cfg.driSupport then
|
||||
"ln -sf ${pkgs.mesa} /var/run/opengl-driver"
|
||||
else ""
|
||||
}
|
||||
|
||||
|
@ -409,8 +416,11 @@ in
|
|||
"-xkbdir" "${pkgs.xkeyboard_config}/etc/X11/xkb"
|
||||
] ++ optional (!cfg.enableTCP) "-nolisten tcp";
|
||||
|
||||
services.xserver.modules = videoDriverInfo.modules
|
||||
++ [ xorg.xorgserver xorg.xf86inputevdev ];
|
||||
services.xserver.modules =
|
||||
concatLists (catAttrs "modules" drivers) ++
|
||||
[ xorg.xorgserver
|
||||
xorg.xf86inputevdev
|
||||
];
|
||||
|
||||
services.xserver.config =
|
||||
''
|
||||
|
@ -423,85 +433,71 @@ in
|
|||
EndSection
|
||||
|
||||
Section "Monitor"
|
||||
Identifier "Monitor[0]"
|
||||
${cfg.monitorSection}
|
||||
EndSection
|
||||
|
||||
Section "Device"
|
||||
${cfg.deviceSection}
|
||||
EndSection
|
||||
|
||||
Section "ServerLayout"
|
||||
Identifier "Layout[all]"
|
||||
${cfg.serverLayoutSection}
|
||||
# Reference the Screen sections for each driver. This will
|
||||
# cause the X server to try each in turn.
|
||||
${flip concatMapStrings drivers (d: ''
|
||||
Screen "Screen-${d.name}[0]"
|
||||
'')}
|
||||
EndSection
|
||||
|
||||
Section "Screen"
|
||||
Identifier "Screen[0]"
|
||||
Device "Device[0]"
|
||||
Monitor "Monitor[0]"
|
||||
# For each supported driver, add a "Device" and "Screen"
|
||||
# section.
|
||||
${flip concatMapStrings drivers (driver: ''
|
||||
|
||||
Section "Device"
|
||||
Identifier "Device-${driver.name}[0]"
|
||||
Driver "${driver.name}"
|
||||
${optionalString (driver.name == "nvidiaLegacy") ''
|
||||
# This option allows suspending with a nvidiaLegacy card
|
||||
Option "NvAGP" "1"
|
||||
''}
|
||||
${cfg.deviceSection}
|
||||
EndSection
|
||||
|
||||
${optionalString (cfg.defaultDepth != 0) ''
|
||||
DefaultDepth ${toString cfg.defaultDepth}
|
||||
''}
|
||||
Section "Screen"
|
||||
Identifier "Screen-${driver.name}[0]"
|
||||
Device "Device-${driver.name}[0]"
|
||||
|
||||
${optionalString (cfg.videoDriver == "nvidia") ''
|
||||
Option "RandRRotation" "on"
|
||||
''}
|
||||
${optionalString (cfg.defaultDepth != 0) ''
|
||||
DefaultDepth ${toString cfg.defaultDepth}
|
||||
''}
|
||||
|
||||
${if cfg.videoDriver != "virtualbox" then
|
||||
let
|
||||
f = depth:
|
||||
''
|
||||
SubSection "Display"
|
||||
Depth ${toString depth}
|
||||
Modes ${concatMapStrings (res: ''"${toString res.x}x${toString res.y}"'') cfg.resolutions}
|
||||
${cfg.extraDisplaySettings}
|
||||
${optionalString (cfg.virtualScreen != null)
|
||||
"Virtual ${toString cfg.virtualScreen.x} ${toString cfg.virtualScreen.y}"}
|
||||
EndSubSection
|
||||
'';
|
||||
in concatMapStrings f [8 16 24]
|
||||
else
|
||||
"" # The VirtualBox driver does not support dynamic resizing if resolutions are defined
|
||||
}
|
||||
${optionalString (driver.name == "nvidia") ''
|
||||
Option "RandRRotation" "on"
|
||||
''}
|
||||
|
||||
EndSection
|
||||
|
||||
Section "Extensions"
|
||||
${optionalString (cfg.videoDriver == "nvidia" || cfg.videoDriver == "nvidiaLegacy" || cfg.videoDriver == "i810" || cfg.videoDriver == "ati" || cfg.videoDriver == "radeonhd") ''
|
||||
Option "Composite" "Enable"
|
||||
''}
|
||||
EndSection
|
||||
|
||||
Section "DRI"
|
||||
Mode 0666 # !!! FIX THIS!
|
||||
EndSection
|
||||
${optionalString
|
||||
(driver.name != "virtualbox" && (cfg.resolutions != []
|
||||
|| cfg.extraDisplaySettings != "" || cfg.virtualScreen != null)) (
|
||||
let
|
||||
f = depth:
|
||||
''
|
||||
SubSection "Display"
|
||||
Depth ${toString depth}
|
||||
${optionalString (cfg.resolutions != [])
|
||||
"Modes ${concatMapStrings (res: ''"${toString res.x}x${toString res.y}"'') cfg.resolutions}"}
|
||||
${cfg.extraDisplaySettings}
|
||||
${optionalString (cfg.virtualScreen != null)
|
||||
"Virtual ${toString cfg.virtualScreen.x} ${toString cfg.virtualScreen.y}"}
|
||||
EndSubSection
|
||||
'';
|
||||
in concatMapStrings f [8 16 24]
|
||||
)}
|
||||
|
||||
EndSection
|
||||
'')}
|
||||
'';
|
||||
|
||||
services.xserver.monitorSection =
|
||||
''
|
||||
Identifier "Monitor[0]"
|
||||
'';
|
||||
|
||||
services.xserver.deviceSection =
|
||||
''
|
||||
Identifier "Device[0]"
|
||||
Driver "${if cfg.videoDriver == "nvidiaLegacy" then "nvidia"
|
||||
else if cfg.videoDriver == "virtualbox" then "vboxvideo"
|
||||
else cfg.videoDriver}"
|
||||
|
||||
${if cfg.videoDriver == "nvidiaLegacy" then ''
|
||||
# This option allows suspending with a nvidiaLegacy card
|
||||
Option "NvAGP" "1"''
|
||||
else ""}
|
||||
# !!! Is the "Clone" option still useful?
|
||||
Option "Clone" "${if cfg.isClone then "on" else "off"}"
|
||||
'';
|
||||
|
||||
services.xserver.serverLayoutSection =
|
||||
''
|
||||
Identifier "Layout[all]"
|
||||
Screen "Screen[0]"
|
||||
'';
|
||||
# The default set of supported video drivers. !!! We'd like "nv"
|
||||
# here, but it segfaults the X server. Idem for "vmware".
|
||||
services.xserver.videoDrivers = [ "ati" "cirrus" "intel" "vesa" ];
|
||||
|
||||
};
|
||||
|
||||
|
|
|
@ -135,8 +135,10 @@ in
|
|||
|
||||
# When building a regular system configuration, override whatever
|
||||
# video driver the host uses.
|
||||
services.xserver.videoDriver = pkgs.lib.mkOverride 50 {} "vesa";
|
||||
services.xserver.defaultDepth = pkgs.lib.mkOverride 50 {} 16;
|
||||
services.xserver.videoDriver = pkgs.lib.mkOverride 50 {} null;
|
||||
services.xserver.videoDrivers = pkgs.lib.mkOverride 50 {} [ "cirrus" "vesa" ];
|
||||
services.xserver.defaultDepth = pkgs.lib.mkOverride 50 {} 0;
|
||||
services.xserver.resolutions = pkgs.lib.mkOverride 50 {} [];
|
||||
|
||||
# Wireless won't work in the VM.
|
||||
networking.enableWLAN = pkgs.lib.mkOverride 50 {} false;
|
||||
|
|
Loading…
Reference in a new issue