summaryrefslogtreecommitdiff
path: root/x11/nvidia-hybrid-graphics
diff options
context:
space:
mode:
authorTheron Tarigo <theron.tarigo@gmail.com>2021-06-15 12:27:11 -0700
committerKevin Bowling <kbowling@FreeBSD.org>2021-06-15 12:30:22 -0700
commit2ee6acf85a98de36269d3a727b4c45675b0eb9c3 (patch)
tree84e4edfc2db35373ca125b7a1954f55136df0205 /x11/nvidia-hybrid-graphics
parentdns/hetzner_ddns: New port for Hetzner Dynamic DNS (diff)
x11/nvidia-hybrid-graphics: Optimus Technology
PR: 192617 Reported by: David Mackay <davidjx8p@gmail.com> Reviewed by: many Tested by: many Approved by: portmgr (maintainer timeout: 15 days) Differential Revision: https://reviews.freebsd.org/D22521
Diffstat (limited to 'x11/nvidia-hybrid-graphics')
-rw-r--r--x11/nvidia-hybrid-graphics/Makefile78
-rw-r--r--x11/nvidia-hybrid-graphics/files/nvidia_xorg.in48
-rw-r--r--x11/nvidia-hybrid-graphics/files/pkg-message.in24
-rw-r--r--x11/nvidia-hybrid-graphics/files/src/bin/Xorg-nvidia-headless.in17
-rw-r--r--x11/nvidia-hybrid-graphics/files/src/bin/nvidia-headless-xconfig.in9
-rw-r--r--x11/nvidia-hybrid-graphics/files/src/bin/nvrun-vgl.in8
-rw-r--r--x11/nvidia-hybrid-graphics/files/src/bin/nvrun.in7
-rw-r--r--x11/nvidia-hybrid-graphics/files/src/etc/X11/xorg-nvidia-headless-template.conf.in39
-rw-r--r--x11/nvidia-hybrid-graphics/files/src/etc/nvidia-headless.conf.in1
-rw-r--r--x11/nvidia-hybrid-graphics/files/src/etc/nvidia-hybrid.conf.in1
-rw-r--r--x11/nvidia-hybrid-graphics/files/src/libexec/nvidia-headless-utils/readconf.in5
-rw-r--r--x11/nvidia-hybrid-graphics/files/src/libexec/nvidia-settings-hybrid.in4
-rw-r--r--x11/nvidia-hybrid-graphics/pkg-descr8
-rw-r--r--x11/nvidia-hybrid-graphics/pkg-plist11
14 files changed, 260 insertions, 0 deletions
diff --git a/x11/nvidia-hybrid-graphics/Makefile b/x11/nvidia-hybrid-graphics/Makefile
new file mode 100644
index 000000000000..0e99e9c99e1d
--- /dev/null
+++ b/x11/nvidia-hybrid-graphics/Makefile
@@ -0,0 +1,78 @@
+# Created by: Theron Tarigo <theron.tarigo@gmail.com>
+
+PORTNAME= nvidia-hybrid-graphics
+PORTVERSION= 0.5
+CATEGORIES= x11
+MASTER_SITES= # none
+DISTFILES= # none
+
+MAINTAINER= theron.tarigo@gmail.com
+COMMENT= NVIDIA secondary GPU configuration - Optimus Technology support
+
+LICENSE= BSD2CLAUSE
+
+RUN_DEPENDS= nvidia-xconfig:x11/nvidia-xconfig \
+ ${LOCALBASE}/bin/Xorg:x11-servers/xorg-server
+
+FLAVORS= default 390
+
+NO_ARCH= yes
+NO_BUILD= yes
+WRKSRC= ${WRKDIR}/src
+
+default_RUN_DEPENDS= \
+ nvidia-secondary-driver>=440.64:x11/nvidia-secondary-driver
+390_RUN_DEPENDS= \
+ nvidia-secondary-driver-390>=390.87:x11/nvidia-secondary-driver-390
+
+VIRTUALGL_RUN_DEPENDS= ${LOCALBASE}/VirtualGL/bin/vglrun:x11/virtualgl
+
+390_PKGNAMESUFFIX= -390
+
+OPTIONS_DEFINE= VIRTUALGL OPTIRUN
+OPTIONS_DEFAULT= VIRTUALGL OPTIRUN
+OPTIONS_SUB= OPTIRUN
+VIRTUALGL_DESC= Use VirtualGL for OpenGL redirection support
+OPTIRUN_DESC= Install "optirun" alias for nvrun-vgl
+OPTIRUN_IMPLIES= VIRTUALGL
+
+scripts= \
+ bin/Xorg-nvidia-headless \
+ bin/nvidia-headless-xconfig \
+ bin/nvrun \
+ bin/nvrun-vgl \
+ libexec/nvidia-headless-utils/readconf \
+ libexec/nvidia-settings-hybrid
+configs= \
+ etc/X11/xorg-nvidia-headless-template.conf \
+ etc/nvidia-headless.conf \
+ etc/nvidia-hybrid.conf \
+
+SUB_FILES= pkg-message ${scripts:%=src/%} ${configs:%=src/%}
+SUB_LIST+= VGLRUN=${LOCALBASE}/VirtualGL/bin/vglrun
+
+USE_RC_SUBR= nvidia_xorg
+
+do-extract:
+.for f in ${SUB_FILES}
+ ${MKDIR} ${WRKDIR}/${f:H}
+.endfor
+
+do-install:
+.for f in ${scripts}
+ @${MKDIR} ${STAGEDIR}${PREFIX}/${f:H}
+ ${INSTALL_SCRIPT} ${WRKSRC}/${f} ${STAGEDIR}${PREFIX}/${f}
+.endfor
+.for f in ${configs}
+ @${MKDIR} ${STAGEDIR}${PREFIX}/${f:H}
+ ${INSTALL_DATA} ${WRKSRC}/${f} ${STAGEDIR}${PREFIX}/${f}.sample
+.endfor
+
+post-install:
+ @${MKDIR} ${STAGEDIR}${PREFIX}/etc/X11/xorg-nvidia-headless.conf.d
+
+post-install-OPTIRUN-on:
+ @${RLN} ${STAGEDIR}${PREFIX}/bin/nvrun-vgl \
+ ${STAGEDIR}${PREFIX}/bin/optirun
+
+.include <bsd.port.mk>
diff --git a/x11/nvidia-hybrid-graphics/files/nvidia_xorg.in b/x11/nvidia-hybrid-graphics/files/nvidia_xorg.in
new file mode 100644
index 000000000000..34e3e0a5f95b
--- /dev/null
+++ b/x11/nvidia-hybrid-graphics/files/nvidia_xorg.in
@@ -0,0 +1,48 @@
+#!/bin/sh
+#
+# $FreeBSD$
+#
+# PROVIDE: nvidia_xorg
+# REQUIRE: LOGIN
+# KEYWORD: shutdown
+
+. /etc/rc.subr
+
+name=nvidia_xorg
+rcvar=nvidia_xorg_enable
+desc="Nvidia GPU Dedicated Xorg"
+
+load_rc_config $name
+
+: ${nvidia_xorg_enable:=NO}
+: ${nvidia_modeset:=NO}
+: ${nvidia_manage_kld:=YES}
+
+command=/usr/sbin/daemon
+pidfile=/var/run/${name}.pid
+procname="%%LOCALBASE%%/bin/Xorg"
+command_args="-p ${pidfile} -f %%PREFIX%%/bin/Xorg-nvidia-headless"
+start_precmd="${name}_prestart"
+stop_postcmd="${name}_poststop"
+
+if checkyesno nvidia_modeset; then
+ kmod=nvidia-modeset
+else
+ kmod=nvidia
+fi
+
+nvidia_xorg_prestart()
+{
+ if checkyesno nvidia_manage_kld; then
+ kldload -n ${kmod} || return 1
+ fi
+}
+
+nvidia_xorg_poststop()
+{
+ if checkyesno nvidia_manage_kld; then
+ kldunload -f ${kmod} || return 1
+ fi
+}
+
+run_rc_command "$1"
diff --git a/x11/nvidia-hybrid-graphics/files/pkg-message.in b/x11/nvidia-hybrid-graphics/files/pkg-message.in
new file mode 100644
index 000000000000..2e3b6e2c2904
--- /dev/null
+++ b/x11/nvidia-hybrid-graphics/files/pkg-message.in
@@ -0,0 +1,24 @@
+Running Xorg-nvidia-headless at startup is recommended especially on mobile
+systems since leaving Nvidia GPU powered on with no Xorg may consume
+significantly more power.
+
+# sysrc nvidia_xorg_enable=YES
+# service nvidia_xorg start
+
+The Xorg instance uses separate configuration files from the defaults for Xorg:
+
+ %%PREFIX%%/etc/X11/xorg-nvidia-headless.conf.d/
+
+ %%PREFIX%%/etc/X11/xorg-nvidia-headless-template.conf
+ Only used if xorg-nvidia-headless.conf does not exist.
+ This file is passed through nvidia-xconfig, which does not preserve
+ all options.
+
+ %%PREFIX%%/etc/X11/xorg-nvidia-headless.conf
+ Created by manually invoking %%PREFIX%%/bin/nvidia-headless-xconfig.
+ Once created, this configuration is not passed through nvidia-xconfig.
+
+Configuration is not normally needed for typical OpenGL acceleration usage.
+
+A properly configured xorg-nvidia-headless.conf will allow Xorg-nvidia-headless
+to be started by non-superuser if Xorg has been installed setuid.
diff --git a/x11/nvidia-hybrid-graphics/files/src/bin/Xorg-nvidia-headless.in b/x11/nvidia-hybrid-graphics/files/src/bin/Xorg-nvidia-headless.in
new file mode 100644
index 000000000000..b89819168842
--- /dev/null
+++ b/x11/nvidia-hybrid-graphics/files/src/bin/Xorg-nvidia-headless.in
@@ -0,0 +1,17 @@
+#!/bin/sh
+conf=%%PREFIX%%/etc/nvidia-headless.conf
+. %%PREFIX%%/libexec/nvidia-headless-utils/readconf
+if [ -z "$NVDISPLAY" ]; then printf %s\\n "NVDISPLAY required in environment or in $conf" >&2 ; exit 1; fi
+xconfig=%%LOCALBASE%%/etc/X11/xorg-nvidia-headless.conf
+xconfarg=xorg-nvidia-headless.conf
+if [ ! -e "$xconfig" ]; then
+if [ "$(id -u)" != 0 ]; then
+printf %s\\n "nvidia-headless must be configured by superuser" >&2
+exit 1
+fi
+xconfig=/var/cache/nvidia-headless/xorg.conf
+mkdir -p /var/cache/nvidia-headless
+xconfarg="$xconfig"
+%%PREFIX%%/bin/nvidia-headless-xconfig -o "$xconfig"
+fi
+exec %%LOCALBASE%%/bin/Xorg -sharevts -novtswitch -noreset -config "$xconfarg" -configdir "xorg-nvidia-headless.conf.d" "$NVDISPLAY" "$@"
diff --git a/x11/nvidia-hybrid-graphics/files/src/bin/nvidia-headless-xconfig.in b/x11/nvidia-hybrid-graphics/files/src/bin/nvidia-headless-xconfig.in
new file mode 100644
index 000000000000..29f06a2c4dd8
--- /dev/null
+++ b/x11/nvidia-hybrid-graphics/files/src/bin/nvidia-headless-xconfig.in
@@ -0,0 +1,9 @@
+#!/bin/sh
+exec %%LOCALBASE%%/bin/nvidia-xconfig \
+ --enable-all-gpus \
+ --preserve-busid \
+ --allow-empty-initial-configuration \
+ --connected-monitor=DFP \
+ --no-use-edid \
+ -c %%PREFIX%%/etc/X11/xorg-nvidia-headless-template.conf \
+ -o %%LOCALBASE%%/etc/X11/xorg-nvidia-headless.conf "$@"
diff --git a/x11/nvidia-hybrid-graphics/files/src/bin/nvrun-vgl.in b/x11/nvidia-hybrid-graphics/files/src/bin/nvrun-vgl.in
new file mode 100644
index 000000000000..ecb5b256005f
--- /dev/null
+++ b/x11/nvidia-hybrid-graphics/files/src/bin/nvrun-vgl.in
@@ -0,0 +1,8 @@
+#!/bin/sh
+conf=%%PREFIX%%/etc/nvidia-headless.conf
+. %%PREFIX%%/libexec/nvidia-headless-utils/readconf
+conf=%%PREFIX%%/etc/nvidia-hybrid.conf
+. %%PREFIX%%/libexec/nvidia-headless-utils/readconf
+if [ -z "$NVDISPLAY" ]; then printf %s\\n "NVDISPLAY required in environment or in $conf" >&2 ; exit 1; fi
+if [ -z "$VGLRUN" ]; then printf %s\\n "VGLRUN required in environment or in $conf" >&2 ; exit 1; fi
+exec "$VGLRUN" -ld "%%LOCALBASE%%/lib/libGL-NVIDIA" -d "$NVDISPLAY" "$@"
diff --git a/x11/nvidia-hybrid-graphics/files/src/bin/nvrun.in b/x11/nvidia-hybrid-graphics/files/src/bin/nvrun.in
new file mode 100644
index 000000000000..9f214ca9c523
--- /dev/null
+++ b/x11/nvidia-hybrid-graphics/files/src/bin/nvrun.in
@@ -0,0 +1,7 @@
+#!/bin/sh
+conf=%%PREFIX%%/etc/nvidia-headless.conf
+. %%PREFIX%%/libexec/nvidia-headless-utils/readconf
+if [ -z "$NVDISPLAY" ]; then printf %s\\n "NVDISPLAY required in environment or in $conf" >&2 ; exit 1; fi
+export DISPLAY="$NVDISPLAY"
+export LD_LIBRARY_PATH="${LD_LIBRARY_PATH}:%%LOCALBASE%%/lib/libGL-NVIDIA"
+exec "$@"
diff --git a/x11/nvidia-hybrid-graphics/files/src/etc/X11/xorg-nvidia-headless-template.conf.in b/x11/nvidia-hybrid-graphics/files/src/etc/X11/xorg-nvidia-headless-template.conf.in
new file mode 100644
index 000000000000..96fce627063e
--- /dev/null
+++ b/x11/nvidia-hybrid-graphics/files/src/etc/X11/xorg-nvidia-headless-template.conf.in
@@ -0,0 +1,39 @@
+
+Section "ServerLayout"
+ Identifier "nvidia"
+ Screen 0 "Screen0"
+ InputDevice "fake" "CorePointer" "CoreKeyboard"
+ Option "AutoAddDevices" "false"
+EndSection
+
+Section "Files"
+ ModulePath "%%LOCALBASE%%/lib/xorg/modules-NVIDIA"
+ ModulePath "%%LOCALBASE%%/lib/xorg/modules"
+EndSection
+
+Section "Module"
+ Load "dri3"
+ Load "glx"
+ Disable "efifb"
+EndSection
+
+Section "InputDevice"
+ Identifier "fake"
+ Driver ""
+EndSection
+
+Section "Monitor"
+ Identifier "Monitor0"
+EndSection
+
+Section "Device"
+ Identifier "Device0"
+ Driver "nvidia"
+EndSection
+
+Section "Screen"
+ Identifier "Screen0"
+ Device "Device0"
+ Monitor "Monitor0"
+EndSection
+
diff --git a/x11/nvidia-hybrid-graphics/files/src/etc/nvidia-headless.conf.in b/x11/nvidia-hybrid-graphics/files/src/etc/nvidia-headless.conf.in
new file mode 100644
index 000000000000..0b1bfdb982a3
--- /dev/null
+++ b/x11/nvidia-hybrid-graphics/files/src/etc/nvidia-headless.conf.in
@@ -0,0 +1 @@
+NVDISPLAY=:8
diff --git a/x11/nvidia-hybrid-graphics/files/src/etc/nvidia-hybrid.conf.in b/x11/nvidia-hybrid-graphics/files/src/etc/nvidia-hybrid.conf.in
new file mode 100644
index 000000000000..6b578c8d1b40
--- /dev/null
+++ b/x11/nvidia-hybrid-graphics/files/src/etc/nvidia-hybrid.conf.in
@@ -0,0 +1 @@
+VGLRUN=%%VGLRUN%%
diff --git a/x11/nvidia-hybrid-graphics/files/src/libexec/nvidia-headless-utils/readconf.in b/x11/nvidia-hybrid-graphics/files/src/libexec/nvidia-headless-utils/readconf.in
new file mode 100644
index 000000000000..620a9b8efcbd
--- /dev/null
+++ b/x11/nvidia-hybrid-graphics/files/src/libexec/nvidia-headless-utils/readconf.in
@@ -0,0 +1,5 @@
+while IFS== read -r _var _val ; do
+ expr "$_var" : '[a-zA-Z][a-zA-Z0-9_]*$' >&- && \
+ eval [ -z \${$_var+UNSET} ] '&&' $_var="\$_val" '||' true || \
+ printf %s\\n "$conf: $_var: bad variable name" >&2
+done < "$conf" ; unset _var _val
diff --git a/x11/nvidia-hybrid-graphics/files/src/libexec/nvidia-settings-hybrid.in b/x11/nvidia-hybrid-graphics/files/src/libexec/nvidia-settings-hybrid.in
new file mode 100644
index 000000000000..d4740ff05484
--- /dev/null
+++ b/x11/nvidia-hybrid-graphics/files/src/libexec/nvidia-settings-hybrid.in
@@ -0,0 +1,4 @@
+#!/bin/sh
+conf=%%PREFIX%%/etc/nvidia-headless.conf
+. %%PREFIX%%/libexec/nvidia-headless-utils/readconf
+exec nvrun-vgl %%LOCALBASE%%/libexec/nvidia-settings -c "$NVDISPLAY" "$@"
diff --git a/x11/nvidia-hybrid-graphics/pkg-descr b/x11/nvidia-hybrid-graphics/pkg-descr
new file mode 100644
index 000000000000..560f9e8a04ae
--- /dev/null
+++ b/x11/nvidia-hybrid-graphics/pkg-descr
@@ -0,0 +1,8 @@
+This port integrates the Nvidia graphics driver and supporting utilities with
+VirtualGL, enabling use of Nvidia acceleration on a system with hybrid graphics
+hardware configuration, aka "Optimus".
+
+Applications to be run with Nvidia acceleration should be started using
+`nvrun-vgl`.
+
+WWW: https://github.com/therontarigo/freebsd-gpu-headless
diff --git a/x11/nvidia-hybrid-graphics/pkg-plist b/x11/nvidia-hybrid-graphics/pkg-plist
new file mode 100644
index 000000000000..be2a1fb8d97f
--- /dev/null
+++ b/x11/nvidia-hybrid-graphics/pkg-plist
@@ -0,0 +1,11 @@
+bin/Xorg-nvidia-headless
+bin/nvidia-headless-xconfig
+bin/nvrun
+libexec/nvidia-headless-utils/readconf
+%%VIRTUALGL%%bin/nvrun-vgl
+%%OPTIRUN%%bin/optirun
+libexec/nvidia-settings-hybrid
+@sample etc/X11/xorg-nvidia-headless-template.conf.sample
+@sample etc/nvidia-headless.conf.sample
+@sample etc/nvidia-hybrid.conf.sample
+@dir etc/X11/xorg-nvidia-headless.conf.d