#!/bin/sh
# bumblebee.sh
# 2024-05-12

# Bumblebee - NVIDIA Optimus support for Linux
# https://docs.slackware.com/howtos:hardware:nvidia_optimus

# exit on error
set -e

SLACKVER=$(awk '{print $2}' /etc/slackware-version)

REPO="https://github.com/WhiteWolf1776/Bumblebee-SlackBuilds.git"
if [ "$SLACKVER" = "14.0" ]; then
  REPO="https://github.com/jgeboski/Bumblebee-SlackBuilds.git"
fi

if [ ! -d Bumblebee-SlackBuilds ]; then
  git clone "$REPO"
fi
cd Bumblebee-SlackBuilds
git fetch
if [ "$SLACKVER" = "14.1" ]; then
  git checkout 14.1
else
  git checkout master
fi
echo "Press Enter to continue or CTRL-C to cancel."
read CONTINUE

DIR=$(pwd)

./download.sh

# http://slackbuilds.org/uid_gid.txt
if [ "$(grep bumblebee /etc/group)" = "" ]; then
  groupadd -g 261 bumblebee
fi

if [ ! -f /etc/modprobe.d/BLACKLIST-nouveau.conf ]; then
  cat > /etc/modprobe.d/BLACKLIST-nouveau.conf <<EOF
# Do not load the kernel nouveau dri module, since it interferes with both
# the nv and binary nvidia drivers.

blacklist nouveau

EOF
fi

if [ ! -f /etc/modprobe.d/bbswitch.conf ]; then
  cat > /etc/modprobe.d/bbswitch.conf <<EOF
# Disable card on boot
blacklist nvidia
blacklist nvidia_drm
blacklist nvidia_modeset
blacklist nouveau
options bbswitch load_state=0
EOF
fi

PKGS="libbsd bumblebee bbswitch"
if [ "$SLACKVER" = "14.0" -o "$SLACKVER" = "14.1" ]; then
  PKGS="$PKGS libvdpau"
fi
PKGS="$PKGS nvidia-kernel nvidia-bumblebee"
if [ "$SLACKVER" = "14.0" ]; then
  PKGS="$PKGS libjpeg-turbo VirtualGL"
else
  PKGS="$PKGS primus"
fi
for PKG in $PKGS; do
  cd "$DIR/$PKG"
  COMPAT32=yes ./$PKG.SlackBuild || exit 1
  NEWEST=$(ls -rv /tmp/$PKG-*.t?z | head -n1)
  upgradepkg --install-new --reinstall $NEWEST
done

chmod +x /etc/rc.d/rc.bumblebeed

if [ "$(grep bumblebee /etc/rc.d/rc.local)" = "" ]; then
  cat >> /etc/rc.d/rc.local << EOF
if [ -x /etc/rc.d/rc.bumblebeed ]; then
  /etc/rc.d/rc.bumblebeed start
fi
EOF
fi

if [ ! -f /etc/rc.d/rc.local_shutdown ]; then
  cat >> /etc/rc.d/rc.local_shutdown << EOF
#!/bin/sh
EOF
  chmod +x /etc/rc.d/rc.local_shutdown
fi

if [ "$(grep bumblebee /etc/rc.d/rc.local_shutdown)" = "" ]; then
  cat >> /etc/rc.d/rc.local_shutdown << EOF
if [ -x /etc/rc.d/rc.bumblebeed ]; then
  /etc/rc.d/rc.bumblebeed stop
fi
EOF
fi