diff options
Diffstat (limited to 'pkgs/tools/X11/bumblebee/default.nix')
-rw-r--r-- | pkgs/tools/X11/bumblebee/default.nix | 109 |
1 files changed, 83 insertions, 26 deletions
diff --git a/pkgs/tools/X11/bumblebee/default.nix b/pkgs/tools/X11/bumblebee/default.nix index 58db0c13abb..d314c7857ea 100644 --- a/pkgs/tools/X11/bumblebee/default.nix +++ b/pkgs/tools/X11/bumblebee/default.nix @@ -1,101 +1,158 @@ # The bumblebee package allows a program to be rendered on an -# dedicated video card by spawning an additional X11 server -# and streaming the results via VirtualGL to the primary server. +# dedicated video card by spawning an additional X11 server and +# streaming the results via VirtualGL or primus to the primary server. # The package is rather chaotic; it's also quite recent. # As it may change a lot, some of the hacks in this nix expression # will hopefully not be needed in the future anymore. -# To test: make sure that the 'bbswitch' kernel module is installed, -# then run 'bumblebeed' as root and 'optirun glxgears' as user. +# To test: +# 1. make sure that the 'bbswitch' kernel module is installed, +# 2. then run 'bumblebeed' as root +# 3. Then either 'optirun glxinfo' or 'primusrun glxinfo' as user. +# +# The glxinfo output should indicate the NVidia driver is being used +# and all expected extensions are supported. +# # To use at startup, see hardware.bumblebee options. # This nix expression supports for now only the native nvidia driver. # It should not be hard to generalize this approach to support the -# nouveau driver as well (parameterize commonEnv over the module -# package, and parameterize the two wrappers as well) +# nouveau driver as well (parameterize hostEnv, i686Env over the +# module package, and parameterize the two wrappers as well) { stdenv, fetchurl, pkgconfig, help2man , libX11, glibc, glib, libbsd , makeWrapper, buildEnv, module_init_tools -, linuxPackages, virtualgl, xorg, xkeyboard_config +, xorg, xkeyboard_config +, nvidia_x11, virtualgl +# The below should only be non-null in a x86_64 system. On a i686 +# system the above nvidia_x11 and virtualgl will be the i686 packages. +# TODO: Confusing. Perhaps use "SubArch" instead of i686? +, nvidia_x11_i686 ? null +, virtualgl_i686 ? null +, useDisplayDevice ? false +, extraDeviceOptions ? "" }: - +with stdenv.lib; let version = "3.2.1"; name = "bumblebee-${version}"; - # isolated X11 environment with the nvidia module - # it should include all components needed for bumblebeed and + # Isolated X11 environment without the acceleration driver module. + # Includes the rest of the components needed for bumblebeed and # optirun to spawn the second X server and to connect to it. - commonEnv = buildEnv { + x11Env = buildEnv { name = "bumblebee-env"; paths = [ module_init_tools - - linuxPackages.nvidia_x11 xorg.xorgserver xorg.xrandr xorg.xrdb xorg.setxkbmap xorg.libX11 xorg.libXext + xorg.xf86inputevdev + ]; + }; + # The environment for the host architecture. + hostEnv = buildEnv { + name = "bumblebee-x64-env"; + paths = [ + nvidia_x11 virtualgl ]; - - # the nvidia GLX module overwrites the one of xorgserver, - # thus nvidia_x11 must be before xorgserver in the paths. - ignoreCollisions = true; }; + # The environment for the sub architecture, i686, if there is one + i686Env = if virtualgl_i686 != null + then buildEnv { + name = "bumblebee-i686-env"; + paths = [ + nvidia_x11_i686 + virtualgl_i686 + ]; + } + else null; + + allEnvs = [hostEnv] ++ optional (i686Env != null) i686Env; + ldPathString = makeLibraryPath allEnvs; + + # By default we don't want to use a display device + deviceOptions = if useDisplayDevice + then "" + else '' + + # Disable display device + Option "UseEDID" "false" + Option "UseDisplayDevice" "none" + '' + + extraDeviceOptions; + in stdenv.mkDerivation { - inherit name; + inherit name deviceOptions; src = fetchurl { url = "http://bumblebee-project.org/${name}.tar.gz"; sha256 = "03p3gvx99lwlavznrpg9l7jnl1yfg2adcj8jcjj0gxp20wxp060h"; }; - patches = [ ./xopts.patch ]; + patches = [ ./xopts.patch ./nvidia-conf.patch]; preConfigure = '' # Substitute the path to the actual modinfo program in module.c. # Note: module.c also calls rmmod and modprobe, but those just have to # be in PATH, and thus no action for them is required. + substituteInPlace src/module.c \ --replace "/sbin/modinfo" "${module_init_tools}/sbin/modinfo" # Don't use a special group, just reuse wheel. substituteInPlace configure \ --replace 'CONF_GID="bumblebee"' 'CONF_GID="wheel"' + + # Apply configuration options + substituteInPlace conf/xorg.conf.nvidia \ + --subst-var deviceOptions ''; # Build-time dependencies of bumblebeed and optirun. # Note that it has several runtime dependencies. buildInputs = [ stdenv makeWrapper pkgconfig help2man libX11 glib libbsd ]; + # The order of LDPATH is very specific: First X11 then the host + # environment then the optional sub architecture paths. + # + # The order for MODPATH is the opposite: First the environment that + # includes the acceleration driver. As this is used for the X11 + # server, which runs under the host architecture, this does not + # include the sub architecture components. configureFlags = [ "--with-udev-rules=$out/lib/udev/rules.d" "CONF_DRIVER=nvidia" "CONF_DRIVER_MODULE_NVIDIA=nvidia" - "CONF_LDPATH_NVIDIA=${commonEnv}/lib" - "CONF_MODPATH_NVIDIA=${commonEnv}/lib/xorg/modules" + "CONF_LDPATH_NVIDIA=${x11Env}/lib:${ldPathString}" + "CONF_MODPATH_NVIDIA=${hostEnv}/lib/xorg/modules,${x11Env}/lib/xorg/modules" ]; # create a wrapper environment for bumblebeed and optirun postInstall = '' wrapProgram "$out/sbin/bumblebeed" \ - --prefix PATH : "${commonEnv}/sbin:${commonEnv}/bin:\$PATH" \ - --prefix LD_LIBRARY_PATH : "${commonEnv}/lib:\$LD_LIBRARY_PATH" \ + --prefix PATH : "${x11Env}/sbin:${x11Env}/bin:${hostEnv}/bin:\$PATH" \ + --prefix LD_LIBRARY_PATH : "${x11Env}/lib:${hostEnv}/lib:\$LD_LIBRARY_PATH" \ --set FONTCONFIG_FILE "/etc/fonts/fonts.conf" \ --set XKB_BINDIR "${xorg.xkbcomp}/bin" \ --set XKB_DIR "${xkeyboard_config}/etc/X11/xkb" wrapProgram "$out/bin/optirun" \ - --prefix PATH : "${commonEnv}/sbin:${commonEnv}/bin" \ - --prefix LD_LIBRARY_PATH : "${commonEnv}/lib" \ - ''; + --prefix PATH : "${hostEnv}/bin" + '' + (if i686Env == null + then "" + else '' + makeWrapper "$out/bin/.optirun-wrapped" "$out/bin/optirun32" \ + --prefix PATH : "${i686Env}/bin" + ''); meta = { homepage = http://github.com/Bumblebee-Project/Bumblebee; |