Was macht LIBGL_ALWAYS_INDIRECT = 1 eigentlich?

22

KDE SC 4.5.0 hat einige Probleme mit einigen Grafikkarten, einschließlich meiner. Nach der Veröffentlichung empfahl Arch mehrere Problemumgehungen . Eines davon war

Exportieren Sie "LIBGL_ALWAYS_INDIRECT = 1", bevor Sie KDE starten

Ich entschied, dass es die einfachste und beste Methode war. Aber ich weiß nicht, was es macht oder wie es sich auf mein System auswirkt. Ist es langsamer als die Standardeinstellung? sollte ich daran denken, das Problem im Auge zu behalten und es später zu deaktivieren, sobald es behoben ist?

Xenoterracid
quelle

Antworten:

13

Indirektes Rendern bedeutet, dass das GLX-Protokoll zum Übertragen von OpenGL-Befehlen verwendet wird und X.org das eigentliche Zeichnen ausführt.

Direktes Rendern bedeutet, dass die Anwendung direkt auf die Hardware zugreifen kann, ohne zuerst über Mesa mit X.org zu kommunizieren.

Das direkte Rendern ist schneller, da der Kontext nicht in den X.org-Prozess geändert werden muss.

Klarstellung: In beiden Fällen wird das Rendern von der GPU durchgeführt (oder technisch - kann von der GPU durchgeführt werden). Beim indirekten Rendern sieht der Prozess jedoch folgendermaßen aus:

  1. Programm ruft einen oder mehrere Befehle auf
  2. Befehl (e) werden per GLX-Protokoll an X.org gesendet
  3. X.org ruft Hardware (zB GPU) zum Zeichnen auf

Im direkten Rendering

  1. Programm ruft einen oder mehrere Befehle auf
  2. Befehl (e) werden an die GPU gesendet

Bitte beachten Sie, dass OpenGL so konzipiert wurde, dass es möglicherweise über das Netzwerk ausgeführt werden kann. Das indirekte Rendern ist schneller als eine naive Implementierung der Architektur, dh es ermöglicht das Senden einer Reihe von Befehlen auf einmal. Es gibt jedoch einen gewissen Overhead in Bezug auf die CPU-Zeit, die für Kontextwechsel und Verarbeitungsprotokolle aufgewendet wird.

Maciej Piechotka
quelle
Bedeutet dies, dass meine CPU den Render-ATM anstelle meines Videochips ausführt?
Xenoterracide
3
Nein. In beiden Fällen zeichnet die GPU, wenn Sie über eine Beschleunigung verfügen. Es entsteht jedoch zusätzlicher Overhead. Nicht beschleunigtes Zeichnen ist extrem langsam und es funktionieren keine Effekte, die dies erfordern LIBGL_ALWAYS_INDIRECT=1würden (dh für die erweiterte Verwendung von OpenGL wie Composite WM ist normalerweise eine Umgehung des indirekten Renderns erforderlich).
Maciej Piechotka
14

Erstens LIBGL_ALWAYS_INDIRECTist dies ein Flag, das sich auf die clientseitige OpenGL-Implementierung von Mesa 3D bezieht (libGL.so). Es funktioniert nicht mit Binärtreibern anderer Hersteller (z. B. NVIDIA).

Zweitens, um Ihre Frage direkt zu beantworten, habe ich mir zuletzt den Mesa-Code angesehen, mit dem die Flagge so funktioniert:

Vor 2008, als Mesa mit einem indirekten X-Server arbeitete (z. B. Sie haben ssh -XIhre Anzeige explizit auf einen nicht lokalen Server eingestellt), wurde die Liste der vom Remote-X-Server bereitgestellten GLX-Grafiken für Ihre GLX-Anwendung verfügbar gemacht. Die Anwendungsaufrufe, z. B. glXChooseVisual () und Mesa, würden eine sinnvolle Übereinstimmung finden, und nachfolgende glFoo()Aufrufe würden an den Remote-X-Server gesendet, wo sie von der libGL ausgeführt wurden, an die der Remote-X-Server angeschlossen war (wahrscheinlich Ihre GPU).

Um Ende 2008 wurde Mesa so geändert, dass es seine interne Software OpenGL-Renderer ( Xlib-Treiber ) für Remote-X-Verbindungen verwenden wollte. (Einige Distributionen wie SuSE haben dies speziell gepatcht, um zum alten Verhalten zurückzukehren.) Dies würde nur dann eintreten, wenn der Remote-X-Server ein GLX-Visual anbietet, das genau mit einem der internen Software-Renderer übereinstimmt. (Andernfalls erhalten Sie die allgemeine Meldung " Fehler: Es konnte kein doppelt gepuffertes RGB-Bild abgerufen werden ".) Wenn ein solches Bild gefunden wird, rendert Mesa alle glFoo()Befehle mit der lokalen (zur Anwendung) CPU und drückt die Taste Ergebnis an den Remote-X-Server über Rasterbilder ( XPutImage()); Einstellung LIBGL_ALWAYS_INDIRECT=1(vor Mesa 17.3 würde jeder Wert funktionieren, da Sie dann 1 oder true verwenden müssen) weist Mesa an, das normale direkte Rendern oder den internen Software-Renderer zu ignorieren und das indirekte Rendern wie früher zu verwenden.

Die Auswahl von indirektem Rendering oder direktem Software-Rendering hat zwei Auswirkungen:

OpenGL-Version

  • Das indirekte Rendern ist generell auf OpenGL 1.4 beschränkt.
  • Direct Software Rendering unterstützt alles, was der Mesa-Software-Rasterizer unterstützt, wahrscheinlich OpenGL 2.1+

Performance

  • Wenn Ihre Anwendung für indirekte Verbindungen ausgelegt ist (sie verwendet Anzeigelisten, minimiert Roundtrip-Abfragen), können Sie eine angemessene Leistung erzielen.
  • Wenn Ihre Anwendung etwas Dummes macht, wie glGetInteger()100-mal pro Frame, nimmt jede dieser Abfragen auch in einem schnellen LAN leicht 1 ms oder 100 ms pro Frame in Anspruch, was bedeutet, dass Ihre Anwendung niemals mehr als 10 FPS erreichen kann.
  • Dieselbe Anwendung kann mit direktem Software-Rendering sehr gut funktionieren, wenn die Rendering-Belastung nicht zu hoch ist, da alle diese glGetInteger()Anrufe direkt innerhalb von Mikro- oder Nanosekunden beantwortet werden.
  • Wenn Ihre Anwendung eine Millionen-Scheitelpunkt-Anzeigeliste erstellt und dann viel rotiert, führt das indirekte Rendern mit einer echten GPU am anderen Ende zu einer viel besseren Leistung.
  • Eine Anwendung greift möglicherweise auch auf einen anderen Codepfad zurück, wenn nur OpenGL 1.4 vs. 2.x verfügbar ist, was sich auch auf die Leistung auswirken kann.

Sie können also ohne die genauen Details Ihrer Anwendung und Ihrer Netzwerkmerkmale nicht sagen, ob direktes oder indirektes Rendern in einer bestimmten Situation besser ist.

In Ihrem Fall scheint es so, als würden Sie eine lokale kwin-Instanz ausführen. Dies hat zur Folge, dass das LIBGL_ALWAYS_INDIRECTindirekte Rendern auf Ihrem lokalen X-Server erzwungen wird. Dies ändert anscheinend entweder kwindas Verhalten (nur OpenGL 1.4) oder vermeidet einen anderen Fehler.

Auf jeden Fall möchten Sie dieses Flag entfernen, wenn das zugrunde liegende Problem behoben ist.

Nathan Kidd
quelle
Als Hinweis: Andere Benutzer können dies möglicherweise mit nVidia tun, mit: __GL_ALLOW_UNOFFICIAL_PROTOCOL ... Ich verwende dies für gnome-session-wayland (3.18) Remote-App Proof of Concept.
Elika Kohen