#!/bin/bash

# Output:

# CardStatus CardName
#   where CardStatus is: G(ood), B(ad), S(low), or U(nknown)
# 3DStatus [MissingPackages] [SetupScript]
#   where 3DStatus is 0 or 1, MissingPackages are packages that might
#   need to be installed, and SetupScript is a script for additional
#   X configuration. (SetupScript starts with a "/", MissingPackages
#   doesn't.)
# XglStatus [RecommendedOptions]
#   where XglStatus is 0 or 1 and RecommendedOptions is set if
#   XglStatus is 0 OR it doesn't match /etc/sysconfig/displaymanager

driver=""
packages=""
setup=""
xgl_opts=""
card_status=""

card_info=$(/usr/sbin/hwinfo --gfxcard | \
	awk '/0300 VGA compatible controller/ { dev = gensub(/^([^:]*):.*/, "\\1", "g"); } \
	     /^  Vendor:/ { vendor[dev] = gensub(/.*pci 0x(....).*/, "\\1", "g"); \
	    	name[dev] = gensub(/^.* "(.*)"$/, "\\1", "g"); } \
	     /^  Device:/ { device[dev] = gensub(/.*pci 0x(....).*/, "\\1", "g"); \
	    	name[dev] = name[dev] " " gensub(/^.* "(.*)"$/, "\\1", "g"); } \
	     /^  SubVendor:/ { subvendor[dev] = gensub(/.*pci 0x(....).*/, "\\1", "g"); } \
	     /^  SubDevice:/ { subdevice[dev] = gensub(/.*pci 0x(....).*/, "\\1", "g"); } \
	     /^  Revision:/ { revision[dev] = gensub(/.*0x(..).*/, "\\1", "g"); } \
	     /^Primary display adapter: #/ { dev = gensub(/.*#/, "", "g"); \
		print vendor[dev] ":" device[dev] ":" revision[dev] ":" subvendor[dev] ":" \
			subdevice[dev] " " name[dev] "\n"; }');

card_id=${card_info%% *}
card_name=${card_info#* }

cur_driver=$(perl -ne 'if (/^Section\s+"Device"/../^EndSection/) { if (/^\s*Driver\s+"(.*)"/) { print "$1\n"; } }' /etc/X11/xorg.conf)

if [ -n "$card_id" ]; then
    IFS=" 	=" # That's "SPACE TAB ="
    while read tag data; do
	data=$(sed -ne 's/[[:space:]]*#.*//' -e '/./p' <<< $data)
	case $tag in
	DRIVER)
	    driver="$data"
	    ;;
	PACKAGES)
	    packages="$data"
	    ;;
	SETUP)
	    setup="$data"
	    ;;
	XGL_OPTS)
	    xgl_opts="$data"
	    ;;
	G|B|S|U)
	    if [[ $card_id =~ ^$data ]]; then
		card_status=$tag
		break
	    fi
	    ;;
	esac
    done < /etc/X11/xgl-hardware-list
    unset IFS
fi

if [ -z "$card_status" ]; then
    card_status=U
    driver=""
    packages=""
    setup=""
    xgl_opts=""
fi

if [ -z "$driver" -o "$driver" = "$cur_driver" ]; then
    if /usr/bin/3Ddiag-result &>/dev/null; then
	accel_status=1
    else
	accel_status=0
    fi
else
    # FIXME: we should eventually distinguish this
    accel_status=0
fi

missing_packages=""
for pkg in $packages; do
    case $pkg in
    *-kmp)
	pkg="$pkg-`rpm -qf /boot/vmlinuz --qf '%{NAME}' | sed -ne 's/^kernel-//p'`"
	;;
    esac
    rpm -q $pkg >/dev/null || missing_packages="$missing_packages$pkg "
done

if [ -n "$setup" ]; then
    if ! $setup -n; then
	missing_packages="$missing_packages $setup"
    fi
fi

. /etc/sysconfig/displaymanager
case "$DISPLAYMANAGER_XSERVER" in
Xgl)
    x_status=1
    if [ "$DISPLAYMANAGER_XGL_OPTS" == "$xgl_opts" ]; then
	xgl_opts=""
    fi
    ;;
*)
    x_status=0
    ;;
esac

echo $card_status $card_name
echo $accel_status $missing_packages
echo $x_status $xgl_opts
