По-перше, LIBGL_ALWAYS_INDIRECT
це прапор, пов'язаний з реалізацією OpenGL на стороні клієнта Mesa 3D (libGL.so). Він не працюватиме з бінарними драйверами інших постачальників (наприклад, NVIDIA).
По-друге, щоб відповісти прямо на ваше запитання, востаннє я подивився на код Mesa, прапор працює так:
До ~ 2008 року, коли Mesa працював з непрямим сервером X (наприклад, ви зробили ssh -X
або явно встановив ваш дисплей на не локальний сервер), це зробить список графічних зображень GLX, наданих віддаленим сервером X, доступним для вашої програми GLX. Виклики програми, наприклад, glXChooseVisual () та Mesa знайдуть щось розумне для узгодження, а наступні glFoo()
дзвінки будуть відправлені на віддалений сервер X, де вони виконуються будь-яким libGL, до якого підключений віддалений сервер X (швидше за все, ваш GPU).
Наприкінці 2008 року Mesa було змінено настільки, що він хотів використовувати свій внутрішній програмний рендер OpenGL ( драйвер Xlib ) для віддалених підключень X. (Деякі дистрибутиви на зразок SuSE спеціально зафіксували це, щоб повернутися до старої поведінки.) Це спричинило б лише, якщо віддалений сервер X запропонував GLX-візуальне зображення, що точно відповідає одному із внутрішніх програмного рендерінгу. (В іншому випадку ви отримаєте загальне: " Помилка: не вдалося отримати RGB, подвійний буфер візуального ".) Якщо такий візуальний файл був знайдений, Mesa видасть усі glFoo()
команди з локальним (для додатків) процесором і натисне результат на віддалений сервер X через растрові зображення ( XPutImage()
); Налаштування LIBGL_ALWAYS_INDIRECT=1
(до Mesa 17.3 будь-яке значення спрацювало б, оскільки тоді ви повинні використовувати 1 або true) повідомляє Mesa ігнорувати звичайну пряму візуалізацію або внутрішній програмний рендер і використовувати непряме візуалізацію, як раніше.
Вибір непрямої візуалізації або прямого програмного відображення вплине на дві речі:
Версія OpenGL
- Непряме візуалізація, як правило, обмежується OpenGL 1.4.
- Пряме візуалізація програмного забезпечення підтримуватиме все, що підтримує растерзатор програмного забезпечення Mesa, можливо, OpenGL 2.1+
Продуктивність
- Якщо ваша програма призначена для непрямих з'єднань (вона використовує списки дисплеїв, мінімізує запити в обидва кінці), ви можете отримати розумну ефективність.
- Якщо ваша програма робить щось нерозумно, як
glGetInteger()
100 разів на кадр, то навіть у швидкій локальній мережі кожен із цих запитів може зайняти 1 мс, або загалом 100 мс на кадр, тобто ви ніколи не зможете отримати більше 10 FPS у вашій програмі.
- Цей самий додаток, якщо навантаження рендерінгу не надто важке, може спрацювати дуже добре при прямому програмному відтворенні, оскільки всі ці
glGetInteger()
дзвінки відповідають безпосередньо через мікро або наносекунд.
- Якщо ваша програма створює мільйонний список вершин, а потім робить багато обертових, то непряме візуалізація з реальним графічним процесором на іншому кінці дасть набагато кращі показники.
- Додаток також може повернутися до іншого кодового шляху, коли він має лише OpenGL 1.4 проти 2.x, що також може вплинути на продуктивність.
Таким чином, ви можете бачити без точних деталей вашої програми та ваших мережевих характеристик, неможливо сказати, чи пряма візуалізація програмного забезпечення або непряма візуалізація краща для будь-якої ситуації.
У вашому випадку здається, що ви використовуєте локальний екземпляр kwin, тому ефект LIBGL_ALWAYS_INDIRECT
полягає в тому, щоб змусити непряме візуалізацію на ваш локальний X-сервер. Це, очевидно, або змінює kwin
поведінку (лише OpenGL 1.4), або уникає інших помилок.
Безумовно, ви хочете видалити цей прапор, коли основну проблему виправлено.