Wie ich SDL-Games unter TwinView auf nur einem Bildschirm spiele

6 minute read Published:

Dieser Artikel stammt aus meinen früheren Wordpress-Instanzen und steht hier aus Gründen der Nostalgie.

Wie ich bereits in einem früheren Post schrieb, nenne ich jetzt eine Dell Precision M4500 Mobile Workstation mein Eigen. Ich betreibe das Gerät gedockt mit dem Euro 1 Port Replicatorvon Dell an zwei Full HD-Displays. Auf dem Gerät läuft Fedora 14, die nVidia Corporation GT216 [Quadro FX 880M] treibt der Herstellertreiber an (nvidia.ko) den ich von rpmfusion nachinstalliert habe.

Nachdem ich anfängliche Problemen mit dem Compositing (Desktop-Effekte) im KDE Windowmanager gelöst hatte, wollte ich zur Entspannung eine kleine Spielsession einlegen, allerdings kam schnell Ernüchterung. Spiele die im Vollbildmodus starteten, breiteten sich über die voll Breite von 3840×1080 Pixeln über die beiden Displays aus. Dies hatte zum Effekt, dass die Spielhandlung von der Lücke zwischen den Displays unterbrochen wurde – unschön.

Eine erste Suche brachte zutage, dass das Problem ein Protokoll namens „TwinView“ ist, welches mehrere Displays an der selben Karte zu einem einzigen Desktop zusammenfasst. Während KWin hier noch die einzelnen Displays zu differenzieren vermag, sehen XRandR basierte Programme, vor allem also auch SDL-basierte Spiele, nur ein Display, wovon man sich durch folgenden Shell-Befehl überzeugen kann:

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
$ xrandr --query
xrandr: Failed to get size of gamma for output default
Screen 0: minimum 3840 x 1080, current 3840 x 1080, maximum 3840 x 1080
default connected 3840x1080+0+0 0mm x 0mm
3840x1080      50.0*
[(/cc]

Ich startete die Konfigurationssoftware von NVidia um die Optionen zu prüfen, die diese mir zur Verfügung stellt. Als erstes probierte ich die X11-Erweiterung Xinerama, welche vor TwinView die einzige offizielle Möglichkeit für den Mehrmonitorbetrieb war. Leider war das nicht von Erfolg gekrönt, da der 3D-Beschleunigung und Xinerama sich im Moment gegenseitig ausschließen.

Also versuchte ich das Problem mit TwinView zu lösen. Ich habe es letztendlich damit umgesetzt, indem ich weitere MetaModes in die Datei /etc/X11/xorg,conf eingetragen habe:

[cc]

# nvidia-settings: X configuration file generated by nvidia-settings
# nvidia-settings:  version 260.19.29  (mockbuild@hephaestus.wilsonet.com)  Thu Dec 16 04:43:59 EST 2010

# nvidia-xconfig: X configuration file generated by nvidia-xconfig
# nvidia-xconfig:  version 260.19.36  (mockbuild@)  Sat Jan 22 06:36:47 EST 2011
# RPM Fusion - nvidia-xorg.conf
#

Section "ServerLayout"

Identifier     "Default Layout"
Screen      0  "Screen0" 0 0
InputDevice    "Keyboard0" "CoreKeyboard"
InputDevice    "Mouse0" "CorePointer"
Option         "Xinerama" "0"
EndSection

Section "InputDevice"

# generated from data in "/etc/sysconfig/keyboard"
Identifier     "Keyboard0"
Driver         "keyboard"
Option         "XkbLayout" "de"
Option         "XkbModel" "pc105"
Option         "XkbVariant" "nodeadkeys"
EndSection

Section "InputDevice"

# generated from default
Identifier     "Mouse0"
Driver         "mouse"
Option         "Protocol" "auto"
Option         "Device" "/dev/input/mice"
Option         "Emulate3Buttons" "no"
Option         "ZAxisMapping" "4 5"
EndSection

Section "Monitor"
Identifier     "Monitor0"
VendorName     "Unknown"
ModelName      "LG Electronics W2443"
HorizSync       30.0 - 83.0
VertRefresh     56.0 - 75.0
Option         "DPMS"
EndSection

Section "Monitor"
Identifier     "Monitor1"
VendorName     "Unknown"
ModelName      "LG Electronics W2443"
HorizSync       30.0 - 83.0
VertRefresh     56.0 - 75.0
Option         "DPMS"
EndSection

Section "Device"
Identifier     "Videocard0"
Driver         "nvidia"
EndSection

Section "Device"
Identifier     "Device0"
Driver         "nvidia"
VendorName     "NVIDIA Corporation"
BoardName      "Quadro FX 880M"
Option         "RenderAccel" "true"
Option         "AllowGLXWithComposite" "true"
EndSection

Section "Device"
Identifier     "Device1"
Driver         "nvidia"
VendorName     "NVIDIA Corporation"
BoardName      "Quadro FX 880M"
BusID          "PCI:1:0:0"
Screen          1
Option         "RenderAccel" "true"
Option         "AllowGLXWithComposite" "true"
EndSection

Section "Screen"
Identifier     "Default Screen"
Device         "Videocard0"
Monitor        "Monitor0"
SubSection     "Display"
Modes      "nvidia-auto-select"
EndSubSection
EndSection

Section "Screen"

Identifier     "Screen0"
Device         "Device0"
Monitor        "Monitor0"
DefaultDepth    24
Option         "TwinView" "1"
Option         "metamodes" "DFP-0: nvidia-auto-select +0+0, DFP-1: nvidia-auto-select +1920+0;NULL, DFP-1: nvidia-auto-select +0+0"
SubSection     "Display"
Depth       24
EndSubSection
EndSection

Section "Screen"
Identifier     "Screen1"
Device         "Device1"
Monitor        "Monitor1"
DefaultDepth    24
Option         "TwinView" "0"
Option         "metamodes" "DFP-1: nvidia-auto-select +0+0"
SubSection     "Display"
Depth       24
EndSubSection
EndSection

Section "Extensions"
Option         "Composite" "Enabled"
EndSection

Der wesentliche Eintrag findet sich in Zeile 111:

1
2
3
4
5
...

Option "metamodes" "DFP-0: nvidia-auto-select +0+0, DFP-1: nvidia-auto-select +1920+0;NULL, DFP-1: nvidia-auto-select +0+0"

...

Das Semikolon trennt dabei die verfügbaren Modi. Für jeden Modus sind die aktiven Displays, deren Auflösung und deren Relative Position zueinander angegeben. Nehmen wir also die erste Definition „DFP-0: nvidia-auto-select +0+0, DFP-1: nvidia-auto-select +1920+0“, so sagt diese, dass es zwei Displays – DFP-0 und DFP-1 – gibt, deren Auflösung automatisch ermittelt werden soll und wobei das Display DFP-1 das Gesamtbild ab dem 1920. Pixel horizontal darstellt. Diese Angabe ist der Standard und sagt nichts weiter, als dass das Display DFP-1 rechts von DFP-0 steht, wobei DFP-0 eine horizontale Auflösung von 1920 Pixeln hat.

Für die Lösung meines Eingangs beschriebenen Problems ist die rechte Defintion die interessantere. „NULL, DFP-1: nvidia-auto-select +0+0“ sagt nämlich, dass das erste Display – das Linke – ausgeschaltet werden soll (NULL) und das rechte den Bildinhalt ab der linken oberen Ecke des Gesamtbildes mit der automatisch ermittelten Auflösung darstellen soll.

Mit dieser Defintion gibt XRandR folgendes aus:

1
2
3
4
5
6
7
$ xrandr --query

xrandr: Failed to get size of gamma for output default
Screen 0: minimum 1920 x 1080, current 3840 x 1080, maximum 3840 x 1080
default connected 3840x1080+0+0 0mm x 0mm
3840x1080      50.0*
1920x1080      51.0

Wie man sieht stehen nun zwei Auflösungen bereit. Einmal die (derzeit aktive) Auflösung über beide Displays (Doppeltes horizontales Full-HD) und einmal nur die normale Full-HD-Auflösung. Über die Tastenkombination Strg-Alt-+ lässt sich auf die nächste verfügbare Auflösung umschalten, mit Strg-Alt– (Minus) auf die Vorherige. Auch in Spielen und anderen Programme, welche XRandR verwenden, stehen diese Auflösungen nun in den Optionen zur Auswahl.

Und damit wünsche ich viel Spaß beim Zocken (Oder Arbeiten) 🙂