momo zone

调核人的blog

分析一下compiz-manager 的脚本

前面讲过用这个脚本可以自动配置compiz 的启动参数。之所以需要一个单独的脚本设定启动参数是因为compiz 牵扯的东西太多,内核dri/drm ,GPU driver, Xorg,GL 渲染方式,桌面环境 等等。
#!/bin/sh
# Compiz Manager wrapper script
# Copyright (c) 2007 Kristian Lyngstøl <kristian@bohemians.org>
#
# 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 2 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., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
#
#
# Contributions by: Treviño (3v1n0) <trevi55@gmail.com>, Ubuntu Packages
#
# Much of this code is based on Beryl code, also licensed under the GPL.
# This script will detect what options we need to pass to compiz to get it
# started, and start a default plugin and possibly window decorator.
ARCH=`arch`
if [ $ARCH == "x86_64" ]; then
     LIB=lib64
else
     LIB=lib
fi
PREFIX=$(dirname $(dirname $(which compiz)))
COMPIZ_BIN_PATH="${PREFIX}/bin/" # For window decorators and compiz
PLUGIN_PATH="${PREFIX}/${LIB}/compiz/"
GLXINFO=$(which glxinfo)
KWIN=$(which kwin)
METACITY="/usr/bin/metacity"
XFWM="/usr/bin/xfwm"
COMPIZ_NAME="compiz" # Final name for compiz (compiz.real) 
# For Xgl LD_PRELOAD
LIBGL_NVIDIA="/usr/lib/nvidia/libGL.so.1.2.xlibmesa"
LIBGL_FGLRX="/usr/lib/fglrx/libGL.so.1.2.xlibmesa"
# Minimum amount of memory (in kilo bytes) that nVidia cards need
# to be allowed to start
# Set to 262144 to require 256MB
NVIDIA_MEMORY="65536" # 64MB
NVIDIA_SETTINGS="nvidia-settings" # Assume it’s in the path by default
# For detecting what driver is in use, the + is for one or more /’s
XORG_DRIVER_PATH="/usr/${LIB}/+xorg/+modules/+drivers/+"
FALLBACKWM="xterm"
if [ x"$KDE_FULL_SESSION" = x"true" ]; then 
        FALLBACKWM="${KWIN}";
elif [ x"$GNOME_DESKTOP_SESSION_ID" != x"" ]; then 
        FALLBACKWM="${METACITY}"
elif xprop -root _DT_SAVE_MODE | grep ‘ = "xfce4"$’ >/dev/null 2>&1; then 
        FALLBACKWM="${XFWM}"
fi
FALLBACKWM_OPTIONS="–replace $@"
# Driver whitelist
WHITELIST="nvidia intel ati radeon i810 nouveau"
# blacklist based on the pci ids 
T="   1002:5954 1002:5854 1002:5955" # ati rs480
T="$T 1002:4153" # ATI Rv350
T="$T 8086:2982 8086:2992 8086:29a2 8086:2a02 8086:2a12"  # intel 965
BLACKLIST_PCIIDS="$T"
unset T
COMPIZ_OPTIONS="–ignore-desktop-hints –replace"
# Those are bare minimum plugins. anything else might want to be enabled / disabled by users.
COMPIZ_PLUGINS="core decoration move minimize resize"
ENV=""
#If the user does not yet have a populated Default.ini, we’ll drop a default in his config folder
if [ ! -s "$HOME/.config/compiz/compizconfig-1/Default.ini" ]; then #file exist and not zero size
  install -D "/usr/share/compiz-manager/config.skel" "$HOME/.config/compiz/compizconfig-1/Default.ini"
fi
# Use emerald by default if it exist
USE_EMERALD="yes"
# No indirect by default
INDIRECT="no"
# Default X.org log if xset q doesn’t reveal it
XORG_DEFAULT_LOG="/var/log/Xorg.0.log"
# Set to yes to enable verbose
VERBOSE="yes"
# Echos the arguments if verbose
verbose()
{
if [ "x$VERBOSE" = "xyes" ]; then
printf "$*"
fi
}
# abort script and run fallback windowmanager
abort_with_fallback_wm()
{
if [ "x$SKIP_CHECKS" = "xyes" ]; then
verbose "SKIP_CHECKS is yes, so continuing despite problems.n"
return 0;
fi
if [ "x$CM_DRY" = "xyes" ]; then
verbose "Dry run failed: Problems detected with 3D support.n"
exit 1;
fi
verbose "aborting and using fallback: $FALLBACKWM n"
if [ -x $FALLBACKWM ]; then
exec $FALLBACKWM $FALLBACKWM_OPTIONS
else
printf "no $FALLBACKWM found, exitingn"
exit 1
fi
}
# Check for non power of two texture support(pass when any item applied)
check_npot_texture()
{
verbose "Checking for non power of two support: "
if glxinfo 2> /dev/null | egrep -q ‘(GL_ARB_texture_non_power_of_two|GL_NV_texture_rectangle|GL_EXT_texture_rectangle|GL_ARB_texture_rectangle)’ ; then
verbose "present. n";
return 0;
else
verbose "Not present. n"
return 1;
fi
}
# Check for presence of FBConfig .For radeon drvier , indirect and direct rendering as no difference result for GLX.*fbconfig
check_fbconfig()
{
verbose "Checking for FBConfig: "
if [ "$INDIRECT" = "yes" ]; then
$GLXINFO -i | grep -q GLX.*fbconfig 
FB=$?
else
$GLXINFO | grep -q GLX.*fbconfig 
FB=$?
fi
if [ $FB = "0" ]; then
unset FB
verbose "present. n"
return 0;
else
unset FB
verbose "not present. n"
return 1;
fi
}
# Check for TFP. 
#!!!Attention , var LIBGL_ALWAYS_INDIRECT will affect glxinfo content as GLX_EXT_texture_from_pixmap
#!!!
check_tfp()
{
verbose "Checking for texture_from_pixmap: "
if [ $($GLXINFO 2>/dev/null | grep GLX_EXT_texture_from_pixmap -c) -gt 2 ] ; then
verbose "present. n"
return 0;
else
verbose "not present. n"
if [ "$INDIRECT" = "yes" ]; then
unset LIBGL_ALWAYS_INDIRECT
INDIRECT="no"
return 1;
else
verbose "Trying again with indirect rendering:n";
INDIRECT="yes"
export LIBGL_ALWAYS_INDIRECT=1
check_tfp;
return $?
fi
fi
}
# Check for Software Rasterizer
check_sw()
{
verbose "Checking for software rasterizer: "
if $GLXINFO 2>/dev/null | egrep -q ‘Software Rasterizer’ ; then 
verbose "present. n"
return 1;
else
verbose "not present. n"
return 0;
fi
}
# Check wether the composite extension is present
check_composite()
{
verbose "Checking for Composite extension: "
if xdpyinfo -queryExtensions | grep -q Composite ; then
verbose "present. n";
return 0;
else
verbose "not present. n";
return 1;
fi
}
# Detects if Xgl is running
check_xgl()
{
verbose "Checking for Xgl: "
if xvinfo | grep -q Xgl ; then
verbose "present. n"
return 0;
else
verbose "not present. n"
return 1;
fi
}
# Check if the nVidia card has enough video ram to make sense
check_nvidia_memory()
{
MEM=$(${NVIDIA_SETTINGS} -q VideoRam | egrep Attribute ‘VideoRam’ .*: | cut -d: -f3 | sed ‘s/[^0-9]//g’)
if [ $MEM -lt $NVIDIA_MEMORY ]; then
verbose "Less than ${NVIDIA_MEMORY}kb of memory and nVidia";
return 1;
fi
return 0;
}
# Check for existence if NV-GLX
check_nvidia()
{
if [ ! -z $NVIDIA_INTERNAL_TEST ]; then
return $NVIDIA_INTERNAL_TEST;
fi
verbose "Checking for nVidia: "
if xdpyinfo | grep -q NV-GLX ; then
verbose "present. n"
NVIDIA_INTERNAL_TEST=0
return 0;
else
verbose "not present. n"
NVIDIA_INTERNAL_TEST=1
return 1;
fi
}
# Check if the max texture size is large enough compared to the resolution
check_texture_size()
{
TEXTURE_LIMIT=$(glxinfo -l | grep GL_MAX_TEXTURE_SIZE | sed ‘s/.*=[^0-9]//g’)
RESOLUTION=$(xdpyinfo  | grep -i dimensions: | sed ‘s/[^0-9]*pixels.*(.*).*//’ | sed ‘s/[^0-9x]*//’)
for res in $RESOLUTION; do
   VRES=$(echo $res | sed ‘s/.*x//’)
   HRES=$(echo $res | sed ‘s/x.*//’)
   verbose "Comparing resolution ($res) to maximum 3D texture size ($TEXTURE_LIMIT): ";
   if [ $VRES -gt $TEXTURE_LIMIT ] || [ $HRES -gt $TEXTURE_LIMIT ]; then
verbose "Failed.n"
return 1;
   fi
done
verbose "Passed.n"
return 0
}
# check driver whitelist
running_under_whitelisted_driver()
{
LOG=$(xset q|grep "Log file"|awk ‘{print $3}’)
if [ "$LOG" = "" ]; then
   verbose "xset q doesn’t reveal the location of the log file. Using fallback $XORG_DEFAULT_LOG n"
   LOG=$XORG_DEFAULT_LOG;
fi
if [ -z "$LOG" ];then
verbose "AIEEEEH, no Log file found n"
verbose "$(xset q) n"
return 0
fi
for DRV in ${WHITELIST}; do
if egrep -q "Loading ${XORG_DRIVER_PATH}${DRV}_drv.so" $LOG &&
  ! egrep -q "Unloading ${XORG_DRIVER_PATH}${DRV}_drv.so" $LOG; 
then
return 0
fi
done
verbose "No whitelisted driver foundn"
return 1
}
# check pciid blacklist
have_blacklisted_pciid()
{
OUTPUT=$(/sbin/lspci -n)
for ID in ${BLACKLIST_PCIIDS}; do
if echo "$OUTPUT" | egrep -q "$ID"; then
verbose "Blacklisted PCIID ‘$ID’ found n"
return 0
fi
done
OUTPUT=$(/sbin/lspci -vn | grep -i VGA)
verbose "Detected PCI ID for VGA: $OUTPUTn"
return 1
}
build_env()
{
if check_nvidia; then
ENV="__GL_YIELD=NOTHING "
fi
if [ "$INDIRECT" = "yes" ]; then
ENV="$ENV LIBGL_ALWAYS_INDIRECT=1 "
fi
if check_xgl; then
if [ -f ${LIBGL_NVIDIA} ]; then
ENV="$ENV LD_PRELOAD=${LIBGL_NVIDIA}"
verbose "Enabling Xgl with nVidia drivers…n"
fi
if [ -f ${LIBGL_FGLRX} ]; then
ENV="$ENV LD_PRELOAD=${LIBGL_FGLRX}"
verbose "Enabling Xgl with fglrx ATi drivers…n"
fi
fi
ENV="$ENV FROM_WRAPPER=yes"
if [ -n "$ENV" ]; then
export $ENV
fi
}
build_args()
{
if [ "x$INDIRECT" = "xyes" ]; then
COMPIZ_OPTIONS="$COMPIZ_OPTIONS –indirect-rendering "
fi
if [ ! -z "$DESKTOP_AUTOSTART_ID" ]; then
COMPIZ_OPTIONS="$COMPIZ_OPTIONS –sm-client-id $DESKTOP_AUTOSTART_ID"
fi
if check_nvidia; then
if [ "x$INDIRECT" != "xyes" ]; then
COMPIZ_OPTIONS="$COMPIZ_OPTIONS –loose-binding"
fi
fi
}
####################
# Execution begins here.
# Read configuration from XDG paths
if [ -z "$XDG_CONFIG_DIRS" ]; then
test -f /etc/xdg/compiz/compiz-manager && . /etc/xdg/compiz/compiz-manager
else
test -f $XDG_CONFIG_DIRS/compiz/compiz-manager && . $XDG_CONFIG_DIRS/compiz/compiz-manager
fi
if [ -z "$XDG_CONFIG_HOME" ]; then
test -f $HOME/.config/compiz/compiz-manager && . $HOME/.config/compiz/compiz-manager
else
test -f $XDG_CONFIG_HOME/compiz/compiz-manager && .  $XDG_CONFIG_HOME/compiz/compiz-manager
fi
# Don’t use compiz when running the failsafe session
if [ "x$GNOME_DESKTOP_SESSION_ID" = "xFailsafe" ]; then
abort_with_fallback_wm
fi
if [ "x$LIBGL_ALWAYS_INDIRECT" = "x1" ]; then
INDIRECT="yes";
fi
# if we run under Xgl, we can skip some tests here
if ! check_xgl; then
# if vesa or vga are in use, do not even try glxinfo (LP#119341)
if ! running_under_whitelisted_driver || have_blacklisted_pciid; then
abort_with_fallback_wm
fi
# check if we have the required bits to run compiz and if not, 
# fallback
if ! check_sw || ! check_tfp || ! check_npot_texture || ! check_composite || ! check_texture_size; then
abort_with_fallback_wm
fi
if check_nvidia && ! check_nvidia_memory; then
abort_with_fallback_wm
fi
if ! check_fbconfig; then
abort_with_fallback_wm
fi
fi
# load the ccp plugin if present and fallback to plain gconf if not
if [ -f ${PLUGIN_PATH}libccp.so ]; then
COMPIZ_PLUGINS="$COMPIZ_PLUGINS ccp"
elif [ -f ${PLUGIN_PATH}libgconf.so ]; then
COMPIZ_PLUGINS="$COMPIZ_PLUGINS glib gconf"
fi
# get environment
build_env
build_args
if [ "x$CM_DRY" = "xyes" ]; then
verbose "Dry run finished: everything should work with regards to Compiz and 3D.n"
verbose "Execute: ${COMPIZ_BIN_PATH}${COMPIZ_NAME} $COMPIZ_OPTIONS "$@" $COMPIZ_PLUGINS n"
exit 0;
fi
# start the gtk-window-decorator if present
if [ -x ${COMPIZ_BIN_PATH}emerald ] && [ "$USE_EMERALD" = "yes" ]; then
verbose "Starting emeraldn"
${COMPIZ_BIN_PATH}emerald –replace &
elif [ -x ${COMPIZ_BIN_PATH}gtk-window-decorator ] && [ -n "$GNOME_DESKTOP_SESSION_ID" ]; then
verbose "Starting gtk-window-decoratorn"
${COMPIZ_BIN_PATH}gtk-window-decorator –replace &
elif [ -x ${COMPIZ_BIN_PATH}kde-window-decorator ] && [ -n "$KDE_FULL_SESSION" ]; then
verbose "Starting kde-window-decoratorn"
${COMPIZ_BIN_PATH}kde-window-decorator –replace &
FALLBACKWM="${KWIN}"
fi
# In case we are in a gnome session, we always want gnomecompat plugin loaded (session registering, key bindings)
if [ -f ${PLUGIN_PATH}libgnomecompat.so ] && [ -n "$GNOME_DESKTOP_SESSION_ID" ] ; then
  COMPIZ_PLUGINS="$COMPIZ_PLUGINS gnomecompat"
fi
echo ‘compiz command:’ ${COMPIZ_BIN_PATH}${COMPIZ_NAME} $COMPIZ_OPTIONS "$@" $COMPIZ_PLUGINS
echo ‘fallback WM:’ $FALLBACKWM $FALLBACKWM_OPTIONS
(${COMPIZ_BIN_PATH}${COMPIZ_NAME} $COMPIZ_OPTIONS "$@" $COMPIZ_PLUGINS & )|| $FALLBACKWM $FALLBACKWM_OPTIONS 

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com 徽标

You are commenting using your WordPress.com account. Log Out /  更改 )

Google+ photo

You are commenting using your Google+ account. Log Out /  更改 )

Twitter picture

You are commenting using your Twitter account. Log Out /  更改 )

Facebook photo

You are commenting using your Facebook account. Log Out /  更改 )

Connecting to %s

%d 博主赞过: