Как определить, что Indirect GLX необходим, но отключен? - PullRequest
1 голос
/ 16 февраля 2020

Уже несколько лет косвенный GLX (IGLX) по умолчанию отключен в xorg и других X-серверах. Я пишу приложение, которое будет использовать OpenGL, если доступно, но может использовать другую графику, если это не так. Есть ли стандартный способ обнаружить, что он потерпит неудачу, кроме как попробовать и отреагировать на ошибки?

Мой текущий тест (написанный около 20 лет go) просто проверяет, работают ли XOpenDisplay и glXQueryExtension, но этого недостаточно: позже происходит сбой при вызове glXCreateContext и других функций.

Я бы предпочел не пытаться открывать окно и проверять его на успешность, потому что в то время, когда я хочу провести тест, я не знаю, понадобится ли он пользователю. Я предпочитаю делать невидимый тест при запуске, чтобы я мог предупредить пользователя, что он будет использовать резервные графические методы.

1 Ответ

1 голос
/ 17 февраля 2020

Создание контекста OpenGL с GLX не требует окна. Нейтер glxCreateContext, ни glxCreateNewContext возьмите нарисованный параметр. И даже если они это сделали, вы можете создать окно, не отображая его, т.е. сделать его видимым, или даже вызвать какое-либо действие из оконного менеджера.

В X11 создание windows - довольно дешевая операция, особенно если начальный размер окна равен 0 × 0, и окно никогда не отображается. Вы по-прежнему можете выполнять весь диапазон операций X11 и GLX.

Результатом всего этого является то, что для проверки доступности возможностей OpenGL обычным подходом является попытка создать окно и OpenGL. создайте контекст с требуемыми атрибутами и посмотрите, удастся ли это.

Поскольку ресурсы X11, используемые для зондирования, не должны отображаться, это не создаст видимых выходных данных; и, кроме постоянного опроса X-сервера для дерева окон, даже диспетчер окон не заметит этого (поскольку это зависит от отображения окна).

Конечно, чтобы держать все дешево и быстро, такие тесты должны быть запрограммирован непосредственно для X11 / Xlib, без каких-либо промежуточных наборов инструментов (поскольку GLX написан для Xlib, даже если Xcb используется, вам придется использовать Xlib, по крайней мере, для этой части, но вам все равно придется это делать).

...