# mhwd Driver Config

NAME="video-hybrid-intel-nvidia-390xx-bumblebee"
INFO="Hybrid bumblebee solution for NVIDIA Optimus Technology - Closed source NVIDIA driver & open source intel driver."
VERSION="2025.09.28"
FREEDRIVER="false"
PRIORITY="8"

# NVIDIA cards
CLASSIDS="0300 0302"
VENDORIDS="10de"
DEVICEIDS=">/var/lib/mhwd/ids/pci/nvidia-390xx.ids"

# Intel cards
CLASSIDS="0300"
VENDORIDS="8086"
DEVICEIDS="*"
BLACKLISTEDDEVICEIDS="0be1 8108"

# Conflicts
CONFLICTS="nvidia-470x-utils nvidia-470xx-settings libxnvctrl-470xx nvidia-570xx-utils nvidia-570xx-settings nvidia-575xx-utils nvidia-575xx-settings nvidia-utils nvidia-settings"
CONFLICTS_64="lib32-nvidia-470xx-utils lib32-nvidia-570xx-utils lib32-nvidia-575xx-utils lib32-nvidia-utils"
CONKMOD="nvidia-470xx nvidia-570xx nvidia-575xx nvidia"

# Conflicts with other mhwd configs
MHWDCONFLICTS="video*nvidia*"

# Dependencies
DEPENDS="bumblebee nvidia-390xx-utils nvidia-390xx-settings libxnvctrl-390xx xf86-video-intel"
[[ -d /run/openrc ]] && DEPENDS="bumblebee-openrc nvidia-390xx-utils xf86-video-intel"
DEPENDS_64="lib32-primus lib32-nvidia-390xx-utils"
DEPKMOD="nvidia-390xx bbswitch"

XORGFILE="/etc/X11/mhwd.d/intel.conf"
BXORGFILE="/etc/bumblebee/xorg.conf.nvidia"
MODULESFILE="/etc/modprobe.d/mhwd-bbswitch.conf"
MODULESBLACKLIST="/etc/modprobe.d/mhwd-nvidia.conf"

make_bumblebee_xorg_config()
{
	MHWD_HEADING "${BXORGFILE}"

	echo 'Section "ServerLayout"' >> "${BXORGFILE}"
	echo '    Identifier "Layout0"' >> "${BXORGFILE}"
	echo '    Option "AutoAddDevices" "false"' >> "${BXORGFILE}"
	echo 'EndSection' >> "${BXORGFILE}"
	echo '' >> "${BXORGFILE}"
	echo 'Section "ServerFlags"' >> "${BXORGFILE}"
	echo '  Option "IgnoreABI" "1"' >> "${BXORGFILE}"
	echo 'EndSection' >> "${BXORGFILE}"
	echo '' >> "${BXORGFILE}"

	MHWD_ADD_DEVICE_SECTION_FOR_EACH_BUSID "nvidia" "${BXORGFILE}" 10de "VendorName \"NVIDIA Corporation\"|Option \"NoLogo\" \"true\"|Option \"UseEDID\" \"false\"|Option \"ConnectedMonitor\" \"DFP\""
}

post_install()
{
	# Create intel xorg configuration with enabled sna acceleration method
	MHWD_HEADING "${XORGFILE}"
	MHWD_ADD_DEVICE_SECTION_FOR_EACH_BUSID "intel" "${XORGFILE}" 8086 "Option      \"AccelMethod\" \"sna\""
	MHWD_ADD_DRI "${XORGFILE}"
	MHWD_ADD_COMPOSITING "${XORGFILE}"
	MHWD_ADD_BACKSPACE "${XORGFILE}"

	# Create nvidia bumblebee xorg configuration
	make_bumblebee_xorg_config

	MHWD_HEADING "${MODULESFILE}"
	echo "options bbswitch load_state=0 unload_state=0" >> "${MODULESFILE}"


	MHWD_HEADING "${MODULESBLACKLIST}"
	echo "blacklist nouveau" >> "${MODULESBLACKLIST}"
	echo "blacklist nvidia" >> "${MODULESBLACKLIST}"
	echo "blacklist nvidia-modeset" >> "${MODULESBLACKLIST}"
	echo "blacklist nvidia-uvm" >> "${MODULESBLACKLIST}"
	echo "blacklist ttm" >> "${MODULESBLACKLIST}"
	echo "blacklist drm_kms_helper" >> "${MODULESBLACKLIST}"
	echo "blacklist drm" >> "${MODULESBLACKLIST}"

	# Unload modules if X is not running
	if [ ! "$(pgrep X)" ];	then
		rmmod -f nouveau
		rmmod -f nvidia
		rmmod -f nvidia-modeset
		rmmod -f nvidia-uvm
		rmmod -f ttm
		rmmod -f drm_kms_helper
		rmmod -f drm
	fi

	modprobe bbswitch

	set_bumblebee_driver "nvidia"

	mhwd-gpu --setxorg "${XORGFILE}"

	if [[ -d /run/openrc ]];then
		rc-update add bumblebee default
		rc-service bumblebee start
	else
		systemctl enable bumblebeed.service
		systemctl start bumblebeed.service
	fi
}

pre_remove()
{
	modprobe -r bbswitch

	if [[ -d /run/openrc ]];then
		rc-update del bumblebee default
		rc-service bumblebee stop
	else
		systemctl disable bumblebeed.service
		systemctl stop bumblebeed.service
	fi
}

post_remove()
{
	if [ -e "${XORGFILE}" ]; then
		rm "${XORGFILE}"
	fi
	if [ -e "${MODULESFILE}" ]; then
		rm "${MODULESFILE}"
	fi
	if [ -e "${MODULESBLACKLIST}" ]; then
		rm "${MODULESBLACKLIST}"
	fi

	mhwd-gpu --check
}

set_bumblebee_driver()
{
	sed -i "/(#)/!s/^[ ]*Driver[ ]*=.*/Driver=$1/g" /etc/bumblebee/bumblebee.conf
}
