summaryrefslogtreecommitdiff
path: root/system/nvidia-legacy96-driver/nvidia-switch
diff options
context:
space:
mode:
Diffstat (limited to 'system/nvidia-legacy96-driver/nvidia-switch')
-rw-r--r--system/nvidia-legacy96-driver/nvidia-switch334
1 files changed, 334 insertions, 0 deletions
diff --git a/system/nvidia-legacy96-driver/nvidia-switch b/system/nvidia-legacy96-driver/nvidia-switch
new file mode 100644
index 0000000000..647c6ef2a9
--- /dev/null
+++ b/system/nvidia-legacy96-driver/nvidia-switch
@@ -0,0 +1,334 @@
+#!/bin/sh
+
+# ***************************************************************************
+# * Copyright (C) 2007-2008 by Heinz Wiesinger *
+# * pprkut@liwjatan.at *
+# * http://www.liwjatan.at *
+# * *
+# * This program is free software; you can redistribute it and/or modify *
+# * it under the terms of the GNU General Public License as published by *
+# * the Free Software Foundation; either version 3 of the License, or *
+# * (at your option) any later version. *
+# * *
+# * This program is distributed in the hope that it will be useful, *
+# * but WITHOUT ANY WARRANTY; without even the implied warranty of *
+# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
+# * GNU General Public License for more details. *
+# * *
+# * You should have received a copy of the GNU General Public License *
+# * along with this program; if not, write to the *
+# * Free Software Foundation, Inc., *
+# * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
+# ***************************************************************************/
+# nvidia-switch utility 0.7.0
+#
+# A tool to switch between nvidia-binary-driver and stock xorg-driver
+# if both are installed in parallel.
+
+set -e
+
+ROOT="/"
+CWD=$(pwd)
+INC="${ROOT}usr/include/GL"
+LIB="${ROOT}usr/lib"
+XMOD="${ROOT}usr/lib/xorg/modules"
+XLIB="$XMOD/extensions"
+NV_VERSION='PKGVERSION' # This will be replaced in the build script
+GL_VERSION="1.2"
+
+remove_link(){
+if [ -L "$1" ]; then
+ rm -f "$1"
+fi
+}
+
+remove_existing(){
+if [ -e "$1" ]; then
+ rm -f $1
+fi
+}
+
+move_existing(){
+if [ -e "$1" ]; then
+ mv $1 $2
+fi
+}
+
+setup_link(){
+ if [ "$1" = "mv" ]; then
+ mv "$2" "$3"
+ else
+ rm -f $2
+ fi
+ ln -s "$3" "$2"
+}
+
+# Move and rename files in /usr/include
+# $1 = from
+# $2 = to
+incs(){
+cd "$INC"
+
+if [ "$2" = "cleanup" ]; then
+ CMD="mv"
+ THREE="$1"
+else
+ CMD="ln -s"
+ THREE="$2"
+fi
+
+for i in glxext.h glext.h glx.h gl.h; do
+ if [ -L "$i" ]; then
+ rm -f "$i"
+ $CMD "$i-$THREE" "$i"
+ elif [ -e "$i" ]; then
+ if [ "$2" = "cleanup" ]; then
+ rm -f "$i-$1"
+ else
+ mv "$i" "$i-$1"
+ ln -s "$i-$THREE" "$i"
+ fi
+ else
+ $CMD "$i-$THREE" "$i"
+ fi
+done
+
+cd "$CWD"
+}
+
+libs(){
+for i in libGLcore.so libGLcore.la libglx.la; do
+ if [ "$1" = "nvidia" ]; then
+ #If this library exists, move it to *-xorg
+ move_existing "$XLIB/$i" "$XLIB/$i-xorg"
+ else
+ #If .so does not exist, and *-xorg does, then remove the -xorg
+ if [ -e "$XLIB/$i" ]; then
+ remove_existing "$XLIB/$i-xorg"
+ else
+ move_existing "$XLIB/$i-xorg" "$XLIB/$i"
+ fi
+ fi
+done
+}
+
+libs_basic(){
+for i in libGL.so libGLcore.so; do
+ #if this link exists, remove it, if it's a file, move it to *.nvidia
+ if [ -L "$LIB/$i.$NV_VERSION" ]; then
+ rm -f "$LIB/$i.$NV_VERSION"
+ elif [ -e "$LIB/$i.$NV_VERSION" ]; then
+ mv "$LIB/$i.$NV_VERSION" "$LIB/$i.$NV_VERSION-nvidia"
+ fi
+ remove_link "$LIB/$i.1"
+done
+}
+
+libgl_nvidia(){
+#if libGL.so.$GL_VERSION does exist, move it to libGL.so.$GL_VERSION-xorg, as it conflicts if nvidia's libGL.so
+# then remove the libGL.so.1 symlink and create a new one pointing to nvidia's libGL.so
+if [ -e "$LIB/libGL.so.$GL_VERSION" ]; then
+ cd "$LIB"
+ mv libGL.so.$GL_VERSION libGL.so.$GL_VERSION-xorg
+ setup_link "" "libGL.so.1" "libGL.so.$NV_VERSION"
+ cd "$CWD"
+fi
+}
+
+libgl_xorg(){
+#if libGL.so.$GL_VERSION does not exist and libGL.so.$GL_VERSION-xorg does, move it to libGL.so.$GL_VERSION
+# then remove the libGL.so.1 symlink and create a new one pointing to nvidia's libGL.so
+if [ -e "$LIB/libGL.so.$GL_VERSION" ]; then
+ remove_existing "$LIB/libGL.so.$GL_VERSION-xorg"
+else
+ if [ -e "$LIB/libGL.so.$GL_VERSION-xorg" ]; then
+ cd "$LIB"
+ mv libGL.so.$GL_VERSION-xorg libGL.so.$GL_VERSION
+ ln -s libGL.so.$GL_VERSION libGL.so.1
+ cd "$CWD"
+ fi
+fi
+}
+
+
+libglcore_nvidia(){
+#If libGLcore.so.$NV_VERSION-nvidia does exists, then remove the -nvidia and make it usable that way
+if [ -e "$LIB/libGLcore.so.$NV_VERSION-nvidia" ]; then
+ cd "$LIB"
+ rm -f libGLcore.so.$NV_VERSION libGLcore.so.1
+ ln -s libGLcore.so.$NV_VERSION-nvidia libGLcore.so.$NV_VERSION
+ ln -s libGLcore.so.$NV_VERSION libGLcore.so.1
+ cd "$CWD"
+fi
+}
+
+lib_nvidia(){
+for i in libGL.so libglx.so; do
+ if [ "$i" = "libGL.so" ]; then
+ cd "$LIB"
+ elif [ "$i" = "libglx.so" ]; then
+ cd "$XLIB"
+ fi
+ #If libGL.so.$NV_VERSION-nvidia does exists, then remove the -nvidia and make it usable that way
+ if [ -e "$i.$NV_VERSION-nvidia" ]; then
+ setup_link "" "$i.$NV_VERSION" "$i.$NV_VERSION-nvidia"
+ fi
+ cd "$CWD"
+done
+}
+
+libglx_base(){
+for i in $(ls libglx.so* | grep -v -); do
+ if ! [ "$i" = "libglx.so.$NV_VERSION" ]; then
+ rm -f $i
+ fi
+done
+ln -s libglx.so.$NV_VERSION libglx.so
+}
+
+libglx_nvidia(){
+# if libglx.so is not a link, back it up to *-xorg, and create a symlink to nvidia's one
+# if it's a link, then remove it and create a new one.
+if ! [ -L "$XLIB/libglx.so" ]; then
+ cd $XLIB
+ mv libglx.so libglx.so-xorg
+ libglx_base
+else
+ cd $XLIB
+ libglx_base
+fi
+cd $CWD
+}
+
+libglx_xorg(){
+if [ "$1" = "xorg" ]; then
+ CMD="ln -s"
+else
+ CMD="mv"
+fi
+
+#if this library exists, move it to *-nvidia
+if [ -L "$XLIB/libglx.so.$NV_VERSION" ]; then
+ rm $XLIB/libglx.so.$NV_VERSION
+elif [ -e "$XLIB/libglx.so.$NV_VERSION" ]; then
+ mv $XLIB/libglx.so.$NV_VERSION $XLIB/libglx.so.$NV_VERSION-nvidia
+fi
+
+# if libglx.so exists and is a link, remove it and create a new one
+# If it does exists and is not a link, remove the old one, and create the new one.
+# if it does not exist, create a symlink
+if [ -L "$XLIB/libglx.so" ]; then
+ cd $XLIB
+ rm libglx.so
+ $CMD libglx.so-xorg libglx.so
+elif [ -e "$XLIB/libglx.so" ]; then
+ if [ "$1" = "xorg" ]; then
+ cd $XLIB
+ setup_link "mv" "libglx.so" "libglx.so-xorg"
+ else
+ remove_existing "$XLIB/libglx.so-xorg"
+ fi
+else
+ cd $XLIB
+ $CMD libglx.so-xorg libglx.so
+fi
+cd $CWD
+}
+
+libwfb_nvidia(){
+#Recreate the link removed by --xorg
+if ! [ -e "$XMOD/libwfb.so" ]; then
+ cd $XMOD
+ ln -s libnvidia-wfb.so.1 libwfb.so
+ cd $CWD
+fi
+}
+
+nvidia_ldconfig(){
+/sbin/ldconfig
+#Generate correct symink for that lib
+/sbin/ldconfig -l $1
+
+if [ "$2" = "xorg" ]; then
+ #Remove so-link, recreated by ldconfig
+ cd $LIB
+ remove_link "libGLcore.so.1"
+ cd $CWD
+fi
+}
+
+nvidia(){
+ echo $'Switching to nvidia-driver files!\n'
+ echo "You have to ENABLE the nvidia driver in /etc/X11/xorg.conf."
+ echo "Otherwise, this may lead to improperly working drivers."
+
+ incs "xorg" "nvidia"
+ lib_nvidia
+ libgl_nvidia
+ libglcore_nvidia
+ libs "nvidia"
+ libglx_nvidia
+ libwfb_nvidia
+
+ LD_NVIDIA="/usr/lib/libGL.so.$NV_VERSION-nvidia"
+ nvidia_ldconfig $LD_NVIDIA
+}
+
+xorg(){
+ echo $'Switching to stock xorg files.\n'
+ if [ "$1" = "cleanup" ]; then
+ echo $'Cleaning up symlinks.\n'
+ fi
+ echo "You have to DISABLE the nvidia driver in /etc/X11/xorg.conf."
+ echo "Otherwise, this may lead to improperly working drivers."
+
+ if [ "$1" = "cleanup" ]; then
+ incs "xorg" "cleanup"
+ else
+ incs "xorg" "xorg"
+ fi
+
+ libs_basic
+ libgl_xorg
+ libs ""
+ if [ "$1" = "cleanup" ]; then
+ libglx_xorg ""
+ else
+ libglx_xorg "xorg"
+ fi
+ remove_link "$XMOD/libwfb.so"
+
+ LD_NVIDIA="/usr/lib/libGL.so.1.2"
+ nvidia_ldconfig $LD_NVIDIA "xorg"
+}
+
+usage(){
+ echo "Usage:"
+ echo " --nvidia Switch to nvidia driver files"
+ echo " --xorg Switch to stock xorg files"
+ echo " --cleanup Switch to stock xorg files and remove all created symlinks"
+ echo " --install Switch to nvidia driver files"
+ echo " This is used on installation to handle installroot correctly"
+ echo " Please use --nvidia for after-install switches instead"
+ echo " --help Show this help message"
+}
+
+if [ "$1" = '--nvidia' ]; then
+ nvidia
+elif [ "$1" = '--install' ]; then
+ ROOT=""
+ CWD=$(pwd)
+ INC="${ROOT}usr/include/GL"
+ LIB="${ROOT}usr/lib"
+ XMOD="${ROOT}usr/lib/xorg/modules"
+ XLIB="$XMOD/extensions"
+ nvidia
+elif [ "$1" = '--xorg' ]; then
+ xorg ""
+elif [ "$1" = '--cleanup' ]; then
+ xorg "cleanup"
+elif [ "$1" = '--help' ]; then
+ usage
+else
+ usage
+fi