# This override makes OpenGL just automagically work with VirtualGL # # Add a setup hook to the mesa package that automatically adds a # libvglfaker.so dependency to executables that depend on libGL.so. { super, stdenv, buildEnv, substituteAll, bash , autoreconfHook, pkgconfig, python2 , xorg, llvmPackages, expat, mesa_glxgallium, mesa, libglvnd }: let autoVirtualGLHook = let # Ugliness required to break the loop created by the fact that # the libGL hook requires VirtualGL which requires libGL. # # This would be clean if super was closed on itself (nixpkgs #15280) libGL = super.libGL; libGLU = super.libGLU.override { inherit libGL; }; libGLU_combined = buildEnv { name = "libGLU-combined"; paths = [ libGL libGLU ]; extraOutputsToInstall = [ "dev" ]; }; virtualglLib = (super.virtualglLib.override { inherit libGL libGLU fltk; }).overrideAttrs (attrs: { postFixup = attrs.postFixup or "" + '' patchelf --set-rpath /usr/lib${stdenv.lib.optionalString stdenv.is64bit "64"}/nvidia:"$(patchelf --print-rpath $out/lib/libvglfaker.so)" $out/lib/libvglfaker.so ''; } ); fltk = super.fltk.override { inherit libGL libGLU freeglut; }; freeglut = super.freeglut.override { inherit libGL libGLU; }; in substituteAll { src = ./insert-virtualgl.sh; bash = "${bash}/bin/bash"; virtualglLib = "${virtualglLib}/lib/libvglfaker.so"; }; in { # Mesa build for glxgallium software rendering (works with all X11 forwarding) mesa_glxgallium = mesa.overrideAttrs (attrs: { mesonFlags = attrs.mesonFlags ++ [ "-Dglx=gallium-xlib" "-Ddri-drivers=" "-Dgallium-drivers=swrast" "-Dglvnd=false" "-Dgallium-nine=false" ]; # No dri drivers so need to drop all the "drivers" output code (ignoring vulkan for now) outputs = [ "out" "dev" "osmesa" ]; postInstall = '' # move libOSMesa to $osmesa, as it's relatively big mkdir -p $osmesa/lib mv -t $osmesa/lib/ $out/lib/libOSMesa* ''; postFixup = ""; } ); # Duplicate mesa/stubs.nix with mesa_glxgallium stuffed in as the libGL source libGL = stdenv.mkDerivation { inherit (libglvnd) version; pname = "libGL"; outputs = [ "out" "dev" ]; nativeBuildInputs = [ xorg.lndir ]; # Use stub libraries from mesa_glxgallium and libglvnd and headers from lib_noglu buildCommand = '' mkdir -p $out/lib lndir -silent ${mesa_glxgallium.out}/lib $out/lib lndir -silent ${libglvnd.out}/lib $out/lib mkdir -p $dev/{,lib/pkgconfig,nix-support} echo "$out" > $dev/nix-support/propagated-build-inputs echo ${autoVirtualGLHook} >> $dev/nix-support/propagated-build-inputs ln -s ${mesa.dev}/include $dev/include genPkgConfig() { local location="$1" local name="$2" local lib="$3" cat <$dev/lib/pkgconfig/$name.pc Name: $name Description: $lib library Version: ${mesa.version} Libs: -L$location/lib -l$lib Cflags: -I${mesa.dev}/include EOF } genPkgConfig ${mesa_glxgallium.out} gl GL genPkgConfig ${libglvnd.out} egl EGL genPkgConfig ${mesa_glxgallium.out} glesv1_cm GLESv1_CM genPkgConfig ${mesa_glxgallium.out} glesv2 GLESv2 ''; }; }