summaryrefslogtreecommitdiffstats
path: root/abs/core/tweaker/bin/twk_graphics.pl
blob: 22b668856ed99c0c9fe90bcfeb4f508f77025c6c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#!/usr/bin/perl -w

# Copyright 2007-2009 Robert ("Bob") Igo of StormLogic, LLC and mythic.tv.
#
# 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, see <http://www.gnu.org/licenses/>.

use Switch;
use Tweaker::Script;
package Tweaker::Script;

# List all the options that this script supports.  Make sure it matches what's in
# the corresponding .tcf entry.
set_known_options( 'low', 'medium', 'high' );

sub check_for_GL() {
    # ??? Need to make this update a class variable instead of a temp file.
    my $fps = execute_shell_command("[ -e /tmp/fps ] && cat /tmp/fps") || -1;

    # We think that any nVidia cards at or below NV25 are not well-supported
    # for GL.  Newer cards are NV34 or above, or have a different starting letter.
    my $generation = execute_shell_command("lspci -v | grep \"nVidia Corporation\" | grep VGA | awk -FCorporation '{ print \$2 }' | awk '{ print \$1 }'");
    my $letters = substr($generation,0,2);
    if (("$letters" eq "NV") && ("$generation" lt "NV24")) {
	$fps = 0;
    }
    
    if ($fps == -1) {
	my $result = execute_shell_command("glxinfo | grep 'direct rendering'");
	if ($result =~ m/direct rendering: Yes/) {
	    my $logger = get_logger('tweaker.script');
	    $logger->info("Hardware OpenGL rendering ability detected.");
	    # Now poll the strength, returning the FPS from glxgears, run at the default resolution.
	    # I would love to be able to poll this in a way that 1) doesn't pop up a GUI window and
	    # 2) doesn't rely on manually making a database that maps video cards to performance levels.
	    $result = execute_shell_command("script -q -c \"glxgears -fullscreen &  sleep 11 ;  pkill -15 glxgears\" | grep FPS | tail -1");
	    if ($result =~ m/ (\d+)\.\d+ FPS/) {
		$fps = $1;
		execute_shell_command("echo $fps > /tmp/fps");
	    }
	} else {
	    $fps = 0;
	    execute_shell_command("echo $fps > /tmp/fps");
	}
    }
    return $fps;
}

# Try to implement the given option.
sub implement_option {
    my($option) = @_;
    
    $dbconnectionstring = get_mythtv_connection_string();
	
    if (connect_to_db("DBI:mysql:$dbconnectionstring")) {
	switch ($option) {
	    # List all the options that this script supports.  You can have as many as you like.
	    case "low" {
		change_or_make_setting('ThemePainter', 'Qt') || exit -1;
		change_or_make_setting('SlideshowUseOpenGL', '0') || exit -1;
		change_or_make_setting('SlideshowOpenGLTransition', 'none') || exit -1;
		change_or_make_setting('SlideshowTransition', 'none') || exit -1;
	    }
	    case "medium" {
		change_or_make_setting('ThemePainter', 'Qt') || exit -1;
		change_or_make_setting('SlideshowUseOpenGL', '1') || exit -1;
		change_or_make_setting('SlideshowOpenGLTransition', 'random (gl)') || exit -1;
		change_or_make_setting('SlideshowTransition', 'random') || exit -1;
	    }
	    case "high" {
		change_or_make_setting('ThemePainter', 'opengl') || exit -1;
		change_or_make_setting('SlideshowUseOpenGL', '1') || exit -1;
		change_or_make_setting('SlideshowOpenGLTransition', 'random (gl)') || exit -1;
		change_or_make_setting('SlideshowTransition', 'random') || exit -1;
	    }

	    # In all cases, do the following:

	    # enable anti-aliased fonts
	    my $qtrc="/home/mythtv/.qt/qtrc";
	    # clean out old Xft settings
	    my $command = "sed -i 's/.*Xft=.*//g' $qtrc";

	    if (my $error = execute_shell_command($command)) {
		my $logger = get_logger('tweaker.script');
		$logger->error("ERROR: $error");
		$logger->error("ERROR: Unable to implement option $option.");
		exit(-1);
	    } else {
		# Add Xft settings
		my $command = "sed -i 's/embedFonts=true/embedFonts=true\nenableXft=true\nuseXft=true/g' $qtrc";
		if  (my $error = execute_shell_command($command)) {
		    my $logger = get_logger('tweaker.script');
		    $logger->error("ERROR: $error");
		    $logger->error("ERROR: Unable to implement option $option.");
		    exit(-1);
		} else {
		    # Make sure to use an AA-capable font
		    my $command = "sed -i 's/font=.*/font=Sans Serif,12,-1,5,50,0,0,0,0,0/g' $qtrc";
		    if  (my $error = execute_shell_command($command)) {
			my $logger = get_logger('tweaker.script');
			$logger->error("ERROR: $error");
			$logger->error("ERROR: Unable to implement option $option.");
			exit(-1);
		    }
		}
	    }
	}
    } else {
	exit -1;
    }
    disconnect_from_db();
}

# Poll the system to see what recommendationlevel the given option has on the system.
sub poll_options {
    my($option) = @_;
    
    # These are somewhat arbitrary at this point.  Note that they correspond to
    # _full screen_ glxgears results in Frames Per Second (FPS), since GL is used
    # at full screen resolution in MythTV.
    my $low_threshold = 350; # at or below $low_threshold FPS, GL is not considered good enough to use in MythTV
    my $medium_threshold = 425; # GL is pretty usable here
    my $high_threshold = 500;

    threshold_test($option, check_for_GL(), "video card", $low_threshold, $medium_threshold, $high_threshold);
}

# Unimplemented in 0.7
sub check_option {
    help;
}

# Unimplemented in 0.7
sub count_iterations {
    help;
}

process_parameters;