Files
ccpkgs/pkgs/opengl/default.nix
2021-01-28 17:16:11 -05:00

105 lines
3.3 KiB
Nix

# 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 <<EOF >$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
'';
};
}