Primero, LIBGL_ALWAYS_INDIRECT
hay una bandera relacionada con la implementación de OpenGL del lado del cliente de Mesa 3D (libGL.so). No funcionará con controladores binarios de otros proveedores (por ejemplo, NVIDIA).
En segundo lugar, para responder a su pregunta directamente, la última vez que miré el código de Mesa la bandera funciona así:
Antes de ~ 2008, cuando Mesa estaba trabajando con un servidor X indirecto (por ejemplo, si ssh -X
configuró su pantalla de forma explícita en un servidor no local), la lista de imágenes GLX proporcionadas por el servidor X remoto estaba disponible para su aplicación GLX. La aplicación llama, por ejemplo, glXChooseVisual () y Mesa encontraría algo razonable para que coincida, y las glFoo()
llamadas posteriores se enviarían al servidor X remoto donde fueron ejecutadas por cualquier libGL al que se conectó el servidor X remoto (probablemente su GPU).
Alrededor de finales de 2008, Mesa cambió para que quisiera usar su software interno Renderizador OpenGL ( controlador Xlib ) para conexiones X remotas. (Algunas distribuciones como SuSE parchearon específicamente esto para volver al comportamiento anterior). Esto solo se activaría si el servidor X remoto ofreciera un visual GLX que coincidiera exactamente con uno de los renderizadores de software internos. (De lo contrario, obtendría el común " Error: no se pudo obtener un RGB, visual de doble búfer "). Si se encontrara tal visual, Mesa representaría todos los glFoo()
comandos con la CPU local (a la aplicación) y presionaría resultado al servidor X remoto a través de imágenes ráster ( XPutImage()
); Configuración LIBGL_ALWAYS_INDIRECT=1
(antes de Mesa 17.3 cualquier valor funcionaría, ya que debe usar 1 o verdadero) le dice a Mesa que ignore el renderizado directo normal o el renderizador de software interno y use el renderizado indirecto como solía hacerlo.
Elegir la representación indirecta o la representación directa del software afectará dos cosas:
Versión OpenGL
- La representación indirecta generalmente está restringida a OpenGL 1.4.
- La representación directa del software admitirá lo que sea compatible con el rasterizador de software Mesa, probablemente OpenGL 2.1+
Actuación
- Si su aplicación está diseñada para conexiones indirectas (utiliza listas de visualización, minimiza las consultas de ida y vuelta), puede obtener un rendimiento razonable.
- Si su aplicación hace algo estúpido como
glGetInteger()
100 veces por fotograma, incluso en una LAN rápida, cada una de esas consultas ocupará fácilmente 1 ms, o 100 ms en total por fotograma, lo que significa que nunca podría obtener más de 10 FPS en su aplicación.
- Esa misma aplicación, si la carga de representación no es demasiado pesada, puede funcionar muy bien con la representación directa de software, ya que todas esas
glGetInteger()
llamadas se responden directamente en cuestión de micro o nanosegundos.
- Si su aplicación crea una lista de visualización de un millón de vértices y luego gira mucho, la representación indirecta con una GPU real en el otro extremo dará un rendimiento mucho mejor.
- Una aplicación también puede recurrir a una ruta de código diferente cuando solo tiene OpenGL 1.4 vs 2.x disponible, lo que también puede afectar el rendimiento.
Por lo tanto, puede ver sin los detalles exactos de su aplicación y las características de su red, es imposible decir si la representación directa del software o la representación indirecta es mejor para cualquier situación dada.
En su caso, parece que está ejecutando una instancia de kwin local, por lo que el efecto LIBGL_ALWAYS_INDIRECT
es forzar el procesamiento indirecto a su servidor X local. Aparentemente, esto cambia kwin
el comportamiento (solo OpenGL 1.4) o evita algún otro error.
Definitivamente desea eliminar este indicador cuando se soluciona el problema subyacente.