Notebook mit Hybrid-Grafik: beide Grafikkarten gleichzeitig nutzen

Haben Sie auch so einen Laptop mit zwei eingebauten Grafikkarten? Wie das funktionieren soll, war mir anfangs ein vollkommenes Rätsel und eine intensive Internetrecherche brachte nur langsam Klärung. Deshalb versuche ich mal, was ich gelernt habe, hier geordnet wieder zu geben.

 

Das Problem: Notebook mit zwei Grafikkarten

Viele aktuelle Notebooks, vor allem der performance Linien, werden mit zwei Grafikkarten ausgeliefert. Meist wird intern eine auf dem Motherboard integrierte Intel Grafikkarte verwendet, und zusätzlich entweder eine NVidia-Karte oder eine AMD Radeon Karte verbaut, die den eingebauten HDMI-Port bedient.

Warum macht man das?

Der Grund klingt einleuchtend: die Intel spart Strom, kann aber besonders im 3D-Bereich nicht so viel, die zweite Grafikkarte geht ab wie Schmidt’s Katze, auch bei 3D und Spielen, ist dafür aber so richtig stromhungrig und saugt den Akku in null komma nix leer. Anders gesagt, man will dem Kunden beides geben, also nein, nicht miserable Grafikleistung mit kaum Akku sondern, die Auswahl: entweder gediegen und mit guter Akkuleistung, oder so richtig punkig, dann aber am besten mit angeschlossenem Netzteil.

Gut, und was ist das Problem?

Nun, das Problem ist die Lösung, oder besser gesagt, die Umsetzung des Themas: die interne Grafikkarte bedient nur das eingebaute Display, während die zusätzliche Karte (neudeutsch: „discrete card“) nur den Monitoranschluß, oft ein HDMI-Port, bedient. Ohne Zusatzarbeit startet unter Linux fast immer die interne Grafikkarte, was nett und gut ist, aber der HDMI-Port bleibt mausetot. Und wenn man mal Steam anschmeißt, überzeugt das Ergebnis  nicht so wirklich.

Und wie sieht es nun wirklich aus?

Die Frage hätten sie hier wahrscheinlich gar nicht gestellt. Aber: in Wirklichkeit habe ich persönlich im Normalbetrieb gar keinen so großen Unterschied bemerkt, ob ich nun die Intel alleine nutze, und die Nvidia ganz ausschalte, oder die NVidia und Intel zusammen benutze. Das liegt daran, dass meine Nvidia ein ordentliches Power Management kann und nicht wirklich Strom frißt, wenn sie nichts zu tun hat. Beim Zocken mit „Transport Fever“ und Konsorten ist aber ganz schnell Ende Gelände, und whupps, geht der Laptop aus, oft nach nicht einmal einer halben Stunde. Spätestens dann sollte man zum Netzteil greifen.

Was kann man also machen?

Es gibt eine Reihe Ansätze, das Problem zu lösen, und das wirkt anfangs verwirrend. Die meisten Lösungen wie bumblebee finde ich persönlich etwas kompliziert und unbequem. Die Lösung, die ich hier vorstelle ist die in meinen Augen praktikabelste. Die Technologie dahinter nennt sich „PRIME“, neuere Xorg-Implementationen können PRIME mit einem eigenen Treiber, „modesetting“, benutzen. Der Trick ist, jegliche Grafik von der Nvidia-Karte berechnen zu lassen. Die Intel Karte wird mit Hilfe des modesetting Treibers einfach als simpler Framebuffer verwendet, der die vorbereiteten Grafikdaten einfach nur ausgibt.

Jetzt aber mal zur Sache: Hybridgrafik unter Linux betreiben

Wie man aus der Einleitung sieht, gibt es verschiedene Möglichkeiten, Hybridkarten unter Linux zu konfigurieren:

  1. interne Grafikkarte alleine
    • Vorteile: spart Strom, funktioniert ohne weitere Konfiguration
    • Nachteile: der HDMI-Port ist nicht nutzbar, bei Spielen hat die Intelgrafik ihre Grenzen
  2. externe Grafikkarte alleine
    • Vorteile: eigtl gar keinen
    • Nachteile: nur der HDMI Port funktioniert. das interne Display bleibt dunkel, der Stromverbrauch ist höher als bei der Intel Karte
  3. beide Karten gleichzeitig: PRIME Betrieb
    • Vorteile: man bekommt die volle Leistung der zusätzlichen Grafikkarte, und kann beide Displays nach Bedarf nutzen
    • Nachteile: evtl erhöhter Stromverbrauch, fällt nach meinen Beobachtungen im Alltag kaum ins Gewicht, beim Spielen ist ein angeschlossenes Netzteil sehr zu empfehlen.

Wer das letzte Quäntchen Akku nutzen will, sollte die NVIDIA/AMD abschalten. Wer das Notebook jedoch wie ich permanent im Einsatz hat, und auch Inhalte projizieren oder aus anderen Gründen den HDMI-Anschluß nutzen will, oder wer gerne mal ein wenig Zocken will, sollte zur dritten Konfiguration greifen. Lösung 2 halte ich für weitgehend sinnfrei. Deshalb beschreibe ich hier nur Lösung 1 und 3.

Nvidia oder AMD

wie erwähnt gibt es zwei aktuelle Hybrid-Setups, Nvidia und AMD Radeon, jeweils mit einer Intelkarte kombiniert. Ich vermute, dass die Lösung für AMD Radeonkarten sehr ähnlich aussieht, testen kann ich aber nur NVIDIA, deshalb die Beschreibung für NVIDIA, wenn jemand sagen kann, ob und wie es mit AMD geht, meldet euch in der Kommentar-Sektion.

Meine Quellen

Ich habe diese Information aus vielen verschiedenen Quellen zusammengesucht, dazu gehören die Webseiten von Ubuntu, Debian, OpenSUSE, ArchLinux und Gentoo, sowie von Nvidia. Letztlich war es aber am Ende das Verstehen, wie das Ding tut, das mich zur richtigen Lösung geführt hat. Dazu eine Anmerkung: natürlich ist es möglich, das unterschiedliche Hardware anders funktioniert, oder zukünftige Xorg-Versionen oder NVIDIA-Treiber anders funktionieren. Diese Anleitung ist aktuell im Oktober 2018, falls sich Änderungen ergeben, werde ich versuchen, sie zu ergänzen.

Die Voraussetzungen:

Man braucht eine aktuelle Xorg-Implementation, vor allem das Helfertool xrandr und die Intel- und Nouveau-Server sollten aktuell sein. Ich benutze:

  • xrandr: V 1.5.0
  • xserver-xorg-core 2:1.20.3-1
  • xserver-xorg-video-intel 2:2.99.917+git20180925-2
  • xserver-xorg-video-nvidia 390.87-2

etwas ältere Versionen gehen auch, aber mit diesen ist das Setup erfolgreich erprobt.

Hybridgrafik: interne Grafikkarte unter Debian nutzen, externe abschalten.

Das geht ganz einfach: man installiert einfach nur den intel Grafiktreiber, und entfernt evtl geladene NVidia-Treiber

$ apt-get install xserver-xorg-video-intel
$ apt-get purge xserver-xorg-video-nouveau

Danach funktioniert nur noch das interne Display. Die Intelkarte liefert aber meist eine sehr brauchbare Leistung im Alltag und der Akku hält etwas länger. Man kann aber keinen Monitor am externen Ausgang anschließen. Wenn man noch weiter gehen will, kann man versuchen, die NVIDIA-Karte abzuschalten. das geht mit einem Tool namens bbswitch. Das ist ein kleines Kernelmodul, mit dem man Zugriff auf den „Powerknopf“ der NVIDIA bekommt:

$ apt-get install bbswitch-dkms

Ob das Modul korrekt geladen wurde kann man mit dmesg überprüfen:

$ dmesg |grep bbswitch
[    5.740236] bbswitch: loading out-of-tree module taints kernel.
[    5.740471] bbswitch: version 0.8
[    5.740475] bbswitch: Found integrated VGA device 0000:00:02.0: \_SB_.PCI0.GFX0
[    5.740479] bbswitch: Found discrete VGA device 0000:01:00.0: \_SB_.PCI0.PEG0.PEGP
[    5.740592] bbswitch: detected an Optimus _DSM function
[    5.740681] bbswitch: Succesfully loaded. Discrete card 0000:01:00.0 is on

Danach kann man als Benutzer „root“ mit

$ echo "OFF" > /proc/acpi/bbswitch

die NVidia-Karte ausschalten, oder mit

$ echo "ON" > /proc/acpi/bbswitch

sie wieder anschalten.

Um die Karte beim booten auszuschalten, kann man eine Datei /etc/modprobe.d/bbswitch.conf anlegen:

$ cat /etc/modprobe.d/bbswitch.conf 
options bbswitch load_state=0

Hybridgrafik: Zwei Grafikkarten unter Debian gleichzeitig nutzen

Das ist das eigentlich interessante Setup. Hier für Debian Buster beschrieben, aber sicher leicht auf andere Distributionen zu portieren. Bei der Recherche war ich erstaunt über die Vielfalt eher unkomfortabler Lösungen.  Die hier beschriebene Lösung mit „PRIME“ ist nur mit aktuellen Xorg-Implementationen möglich. Ich rechne damit, dass die Opensource Treiber früher oder später PRIME automatisch bzw mit Hilfe des Linux-Desktops (Gnome, KDE und Konsorten) konfigurieren kann. Aktuell ist meist noch Handarbeit nötig, die ich hier beschreiben will:

Hybridgrafik: nouveau und intel gleichzeitig mit modesetting betreiben

Die Opensource Treiber werden fleißig weiterentwickelt, ich rechne damit, dass diese Konfiguration bald obsolet wird. Die Closed source Treiber sind jedoch in Bezug Xorg-Features meist weit hinten dran, die müssen auf jeden Fall aktuell (Stand November 2018) manuell konfiguriert werden. Hier nun eine schrittweise Anleitung, wie es bei mir mit dem Opensource Nouveau-Treiber funktioniert.

zuerst installiert man beide Xorg-Server:

$ apt-get install xserver-xorg-video-intel xserver-xorg-video-nouveau
Paketlisten werden gelesen... Fertig
Abhängigkeitsbaum wird aufgebaut.       
Statusinformationen werden eingelesen.... Fertig
xserver-xorg-video-intel ist schon die neueste Version (2:2.99.917+git20180925-2).
xserver-xorg-video-nouveau ist schon die neueste Version (1:1.0.15-3).
0 aktualisiert, 0 neu installiert, 0 zu entfernen und 0 nicht aktualisiert.

hier sind beide schon installiert gewesen.

Monitor anschließen

als nächstes ist es geschickt, am externen Ausgang einen Monitor anzuschließen. Geht etwas schief, kann nämlich u.U. das interne Display ausgeschaltet bleiben und nur der externe Anschluß funktioniert. Auch das umgekehrte ist möglich, aber das ist ja kein Problem. Also, erst einmal einen Monitor anschließen. Dann kann man die folgenden Schritte getrost nach und nach machen. Hat man keinen externen Monitor an der Hand, ist das gesamte Setup riskant, man könnte mit einem dunklen Display enden, also immer einen „Weg zurück“, Neudeutsch „Rollback“ mit einplanen.

/etc/x11/xorg.conf:

Für die eigentliche Konfiguration muß man zunächst herausfinden, auf welchen PCI-Steckplätzen die beiden Karten laufen. Das bekommt man z.B. mit

$ lspci|grep VGA
00:02.0 VGA compatible controller: Intel Corporation HD Graphics 530 (rev 06)
01:00.0 VGA compatible controller: NVIDIA Corporation GM204M [GeForce GTX 970M] (rev a1)

Man muß nun bedenken, wie Xorg den PCI Bus darstellt. In diesem Beispiel ist die Intelkarte in Xorg-Notation so zu schreiben:

Section "Device"
    Identifier  "intel"
    Driver      "intel"
    BusID       "PCI:0:2:0"
EndSection

Die nvidia Karte läuft in obigen Beispiel wie folgt:

Section "Device"
    Identifier  "nouveau"
    Driver      "nouveau"
    BusID       "PCI:1:0:0"
EndSection

Nun der nächste, entscheidende Schritt: damit der intel-Treiber die Möglichkeit bekommt, Grafik nicht selbst zu rendern, sondern von der NVIDIA zu übernehmen, lädt man einen weiteren Xorg-Treiber, den modesetting Treiber, der letztlich aus der Intelkarte einen Framebuffer machen wird:

Section "Module"
        Load "modesetting"
EndSection

und hier jetzt die vollständige xorg.conf, wie ich sie erfolgreich getestet habe:

$ cat /etc/X11/xorg.conf
Section "ServerLayout"
    Identifier "layout"
    Screen 0 "intel"
EndSection

Section "Device"
    Identifier  "nouveau"
    Driver      "nouveau"
    BusID       "PCI:1:0:0"
    Option "GLXVBlank" "On"
EndSection

Section "Screen"
    Identifier "nouveau"
    Device "nouveau"
EndSection

Section "Device"
    Identifier  "intel"
    Driver      "intel"
    BusID       "PCI:0:2:0"
EndSection

Section "Screen"
    Identifier "intel"
    Device "intel"
EndSection

Section "Module"
        Load "modesetting"
EndSection

Der Eintrag der intel als aktivem Screen 0 sorgt dafür, dass in jedem Fall das interne Display funktioniert. Der Intel-Treiber ist in der Lage, mit dem folgenden xrandr-Kommando in den modesetting Betrieb umzuschalten. Das geht nur in Zusammenarbeit mit anderen Opensource Treibern, für den closed source Treiber werden wir eine andere, unbequemere Lösung umsetzen müssen.

xrandr setup

Aktuell weiß Xorg noch nicht, dass nur die nouveau rendern soll und die intel als Framebuffer benutzt werden soll. Um das einzustellen, kommt jetzt das kleine, aber unglaublich nützliche Tool „xrandr“ zum Einsatz. Der Nachteil: man muß einen Ort finden, an dem dieses Program beim Laden der X-Oberfläche gestartet wird. Bewährt hat sich die Datei Xsetup, damit wird gleich beim Start alles richtig gemacht. Details dazu am Ende des Artikels.

Zuerst muß man ermitteln, wie die verschiedenen Anschlüsse in Xorg heißen. Die Namen ändern sich je nach verwendeten Treibern und verwendeter Hardware:

$ xrandr |grep connect  
HDMI-1 connected 1920x1080+0+0 (normal left inverted right x axis y axis) 531mm x 298mm
eDP1 connected primary 1920x1080+1920+0 (normal left inverted right x axis y axis) 344mm x 194mm

Der externe Anschluß heißt also hier HDMI-1, der interne Monitor eDP1. Erscheint hier nur ein Ausgang so hat das Laden der Xorg-Treiber nicht funktioniert. In diesem Fall die xorg.conf noch mal überprüfen.

Als nächstes müssen wir herausfinden, wie unsere Grafikkarten miteinander verbunden sind

$ xrandr --listproviders
Providers: number : 2
Provider 0: id: 0x249 cap: 0x1, Source Output crtcs: 4 outputs: 5 associated providers: 1 name:nouveau
Provider 1: id: 0x43 cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 3 outputs: 1 associated providers: 1 name:intel

Die Intel heißt also „Intel“, die Nvidia heißt „nouveau“. Die Nouveau und die Intel können beide als Rendering-Quelle (Source) genutzt werden, aber nur intel kann als Ziel (Sink) benutzt werden. Damit können wir also nur in eine Richtung arbeiten: die Nouveau kann rendern und auf die Intel ausgeben, das ist es was wir wollen.

Damit haben wir jetzt alle notwendigen Informationen zusammen und können unser kleines Skript basteln:

$ cat /usr/local/bin/Xsetup.nouveau 
#!/bin/sh # Xsetup - run as root before the login dialog appears 
xrandr --setprovideroutputsource Intel nouveau
xrandr --output HDMI-1 --auto --right-of eDP1 
sleep 1 
xrandr --auto

die Zeilen im Einzelnen:

xrandr --setprovideroutputsource Intel nouveau

Damit sagt man xrandr, dass die Intel Grafikkarte zur Ausgabe der nouveau-Daten mit benutzt werden soll

xrandr --output HDMI-1 --auto --right-of eDP1

diese Zeile ist optional. Sie sagt Xorg, dass der Monitor am HDMI-Port rechts neben dem internen Display steht. Die meisten Linux-Desktops erlauben diese Einstellung beliebig zu verändern. Xrandr erlaubt neben präzisen Angeben auch einige einfache Einstellungen:

--right-of
--left-of
--above
--below
--same-as

sleep 1

warte eine Sekunde, damit sich das Ding konfigurieren kann.

xrandr --auto

xrandr hat jetzt alle Informationen, um die Monitore automatisch zu konfigurieren und einzuschalten. Das geht am besten mit dieser Zeile. Man kann auch von Hand, das geht aber schnell schief.

Zuletzt muß noch das Xsetup Skript dem Display Manager bekannt gemacht werden. Das funktioniert für beide Setups gleich, weshalb ich es unten unter „Displaymanager konfigurieren“ gemeinsam beschreibe.

Hybridgrafik: nvidia und intel gleichzeitig mit modesetting betreiben

Will man den closed source Treiber nutzen, wird es etwas komplizierter, aber als Ergebnis hat man einen sehr leistungsfähigen Laptop mit super schneller Grafik, die auch vor Flugsimulatoren oder Steam nicht einknickt. Man muß allerdings zuerst den Treiber laden. Dazu muß in den apt-sourcen der non-free Zweig eingetragen werden:

$ cat /etc/apt/sources.list
deb http://ftp.de.debian.org/debian/ buster main contrib non-free
deb http://security.debian.org/debian-security buster/updates main contrib non-free

Dann:

$ apt-get update
$ apt-get install nvidia-driver

Danach wird der Rechner wahrscheinlich eine Weile beschäftigt sein, denn es wird nicht nur die nötige Software installiert, auch der Treiber muß kompiliert und gegen den laufenden Kernel gelinkt werden. Weil das mit nur einem thread geschieht, dauert das gewöhnlich eine Weile. Debian macht auch gleich passende Änderungen, dass von jetzt an der nouveau-Treiber nicht mehr geladen wird. Falls nouveau gerade aktiv ist, wird Debian ein entsprechende Warnung ausgeben. Dann sollte man den Rechner neu starten, damit der Austausch der Treiber erfolgen kann. Da der Text-Framebuffer nouveau benutzt, ist der Austausch nur per Neustart möglich. Ist nouveau nicht installiert, kann man sofort weiter machen.

Um sicher zu gehen, dass die im nächsten Schritt erfolgende modesetting-Konfiguration möglich ist, sollte man prüfen, ob die passenden Einträge von Debian gemacht wurde. Fehlen diese, hat man einen zu alten Nvidia-Treiber, dann funktioniert dieses Setup nicht, und man muß auf Technologien wie  bumblebee zurückgreifen:

$ grep modeset /etc/modprobe.d/nvidia.conf 
install nvidia-modeset modprobe nvidia ; modprobe -i nvidia-current-modeset $CMDLINE_OPTS
install nvidia-drm modprobe nvidia-modeset ; modprobe -i nvidia-current-drm $CMDLINE_OPTS
remove nvidia modprobe -r -i nvidia-drm nvidia-modeset nvidia-uvm nvidia
remove nvidia-modeset modprobe -r -i nvidia-drm nvidia-modeset

Monitor anschließen

wieder ist es ratsam, einen externen Monitor anzuschließen. Ich habe beobachtet, dass der nvidia Treiber deutlich kritischer ist als der nouveau. Während Xorg mit nouveau eigtl immer eine geeignete, funktionstüchtige Konfiguration baut, kann das mit dem von nvidia gründlich in die Hose gehen, und man hat einen dunklen Bildschirm. Dann ist der externe Monitor unerläßlich. Im schlimmsten Fall muß man in den singleuser mode und das System reparieren.

/etc/x11/xorg.conf

den PCI bus ermittelt man wie oben mit:

# lspci|grep VGA
00:02.0 VGA compatible controller: Intel Corporation HD Graphics 530 (rev 06)
01:00.0 VGA compatible controller: NVIDIA Corporation GM204M [GeForce GTX 970M] (rev a1)

Daraus ergibt sich wieder eine eigene xorg.conf.  Einige wichtige Details erkläre ich anschließend:

$ cat /etc/X11/xorg.conf
Section "Module"
        Load "modesetting"
EndSection

Section "ServerLayout"
    Identifier "layout"
    Screen 0 "nvidia" 
    Inactive "intel"
EndSection

Section "Device"
    Identifier  "nvidia"
    Driver      "nvidia"
    BusID       "PCI:1:0:0"
    Option "AllowEmptyInitialConfiguration"
EndSection

Section "Screen"
    Identifier "nvidia"
    Device "nvidia"
EndSection

Section "Device"
    Identifier  "intel"
    Driver       "modesetting"
    BusID       "PCI:0:2:0"
EndSection

Section "Screen"
    Identifier "intel"
    Device "intel"
EndSection

einige wichtige Details aus dieser Datei:

Section "Module"
        Load "modesetting"
EndSection

wieder soll ja modesetting benutzt werden, deshalb müssen wir ihn laden.

Section "Device"
   Identifier "intel"
   Driver "modesetting"
   BusID "PCI:0:2:0"
EndSection

Das ist evtl verwirrend. Der Intel-Teil darf nicht mit dem intel-Treiber betrieben werden, da nvidia und intel Treiber nicht gut kommunizieren. Die Lösung ist, modesetting direkt zu benutzen und als Treiber für die Karte zu verwenden. Damit deutlich wird, dass modesetting die Intelhardware benutzt, habe ich das Device „intel“ benannt.

Section "ServerLayout"
   Identifier "layout"
   Screen 0 "nvidia" 
   Inactive "intel"
EndSection

Modesetting ist nicht in der Lage, einen Screen selbst zu rendern. Deshalb müssen wir die Grundkonfiguration so einstellen, dass xorg es gar nicht erst versucht, sonst wird es nicht erfolgreich starten können. Außerdem erlauben wir der nvidia, als Standardbildschirm zu funktionieren. Geht später etwas schief, wird nur der externe Bildschirm funktionieren, das interne Display wird dunkel bleiben.

Section "Device"
    Identifier  "nvidia"
    Driver      "nvidia"
    BusID       "PCI:1:0:0"
    Option "AllowEmptyInitialConfiguration"
EndSection

Die Nvidia wird nicht starten, wenn kein Monitor angeschlossen ist, und man hat einen schönen Schlamassel, Xorg startet einfach nicht, wenn man keinen externen Monitor angeschlossen hat. Deshalb müssen wir dem Treiber sagen, dass er die Karte auch dann starten soll, wenn kein Monitor angeschlossen ist. Die Option

Option "AllowEmptyInitialConfiguration"

ist also für den Betrieb absolut essentiell.

ACHTUNG: startet man den Rechner mit dieser Konfiguration ohne die folgende xrandr-Konfiguration, so wird das interne Display dunkel bleiben, und nur ein extern angeschlossener Monitor funktioniert. Deshalb unbedingt vor dem Austesten auch das folgende einfach xrandr-Skript installieren. Man sollte für alle Fälle eine funktionierende xorg.conf bereit halben, die man über den Single User Mode einspielen kann.

xrandr setup

hat man keinen externen Monitor parat, so muß man die folgenden Schritte machen, OHNE Xorg neu zu starten. Sonst bekommt man einen dunklen Bildschirm. Wenn einem das passiert, mit CTRL-ALT-F2 auf eine Textkonsole gehen, über die Datei /var/log/Xorg.0.log prüfen ob beide Karten erfolgreich aktiviert wurden, und dann das xrandr-Skript unten installieren. Die Devicenamen sollten auch aus dem Log ersichtlich sein. Ich empfehle aber den Weg über einen externen Monitor, das ist deutlich streßfreier:

man kann dann an dieser Stelle mit neuer xorg.conf den Displaymanager durchstarten und feststellen, wer Source und wer Sink ist, also welche Karte das Rendern übernehmen kann, und welche Karte als einfacher Framebuffer dienen kann:

$ xrandr --listproviders
Providers: number : 2
Provider 0: id: 0x249 cap: 0x1, Source Output crtcs: 4 outputs: 5 associated providers: 1 name:NVIDIA-0
Provider 1: id: 0x43 cap: 0xf, Source Output, Sink Output, Source Offload, Sink Offload crtcs: 3 outputs: 1 associated providers: 1 name:modesetting

Unser Provider, also die Karte die den Bildschirm rendern wird, heißt also „NVIDIA-0“, der framebuffer heißt erwartungsgemäß „modesetting“. Damit haben wir alle Informationen für unser xrandr Skript:

$ cat Xsetup.nvidia 
#!/bin/sh
# Xsetup - run as root before the login dialog appears
xrandr --setprovideroutputsource modesetting NVIDIA-0
sleep 1
xrandr --auto

Das Skript weist Xorg an, die beiden Karten per „PRIME“-Technologie zusammenzuschalten: die NVIDIA übernimmt also das rendering für das interne und evtl angeschlossene externe Display, modesetting sorgt dafür, dass die Daten auf dem internen Display ausgegeben werden. Anschließend wird das Setup wieder aktiviert. Auch hier kann man optional die Anordnung der Bildschirme wie in obigem Beispiel festlegen.

Displaymanager konfigurieren

Im letzten Schritt muß unser xrandr-Skript gestartet werden. Verwenden sie wie die meisten einen Displaymanager wie lightdm, so müssen wir dem unser Skript übergeben. Ich habe das hier exemplarisch für lightdm und sddm mal umgesetzt:

lightdm:

Lightdm kann man über /etc/lightdm/lightdm.conf oder über /usr/share/lightdm/lightdm.conf.d/ konfigurieren. In jedem Falle muß man:

Ligthdm sagen, wo das Skript liegt:

$ grep nouveau /etc/lightdm/lightdm.conf
display-setup-script = /usr/local/bin/Xsetup.hybrid

Das Skript muß dazu unter /usr/local/bin/Xsetup.hybrid abgelegt sein.

sddm:

dieser Displaymanager holt sich seine Startskripten aus einem vordefinierten Verzeichnis. Dazu obiges Skript nach /usr/share/sddm/scripts kopieren:

$ cp Xsetup.hybrid /usr/share/sddm/scripts/Xsetup

und sddm bzw den Rechner neu starten.

Grafikbeschleunigung GLX aktivieren

Unter Debian wird die Grafikbeschleunigung GLX mit dem Helferprogram „update-glx“ gesteuert. Um sicher zu gehen, dass GLX auch auf der NVIDIA-Karte läuft, zum schluß noch folgendes Kommando ausführen:

$ update-glx --config nvidia

Damit erst wird die volle Leistung der NVidia Grafikkarte zur Verfügung gestellt. Gleiches gild entsprechend für den nouveau Treiber.

Zusammenfassung:

das Setup eines Hybridlaptops erfordert einige wenige Schritte die es möglich machen, beide Anschlüsse, internes Display und externes Display am HDMI, jederzeit beliebig zu nutzen. Die aktuell modernste Technologie dafür, PRIME, wird von Xorg unterstützt. Die closed Source Treiber erfordern jedoch eine sorgfältige Konfiguration. Die Konfiguration erfolgt in zwei Schritten:

  • Installation einer geeigneten xorg.conf mit modesetting Framebuffer Treiber
  • Aufruf von xrandr um die Ausgabe der diskreten Grafikkarte auf modesetting umzuleiten.
  • Konfigurieren von glx mit update-glx

Das Ergebnis ist ein stabiles, performantes Grafiksetup.