Erstens LIBGL_ALWAYS_INDIRECT
ist 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 -X
Ihre 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_INDIRECT
indirekte Rendern auf Ihrem lokalen X-Server erzwungen wird. Dies ändert anscheinend entweder kwin
das 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.