Контекст OpenGL без окон в модуле Apache2

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

Apache2 работает на машине с Ubuntu 12.04, и я создал тестовый модуль, который отображает четырехугольник и сохраняет фрейм как изображение на диск с помощью OpenGL / GLX. Но когда модуль получает запрос клиента, он вылетает на XOpenDisplay(0) с ошибкой сегментации. Есть идеи, что может пойти не так?

Изменить: Все примеры, которые я видел, говорят об использовании пиксельного буфера (PBuffer). Насколько мне известно, они устарели, и вместо них следует использовать FBO. Может кто-нибудь объяснить, как создать контекст и использовать FBO для выполнения внеэкранного рендеринга?


person informer2000    schedule 17.03.2014    source источник


Ответы (1)


Хотя технически вполне возможно сделать безоконный рендеринг без графического ускорителя вне экрана с помощью OpenGL без сервера отображения, в наши дни это практически невозможно, потому что вам нужна среда отображения, чтобы фактически получить доступ к графическому процессору. К счастью, в наши дни структура графических систем меняется (гибридная графика, экранные композиторы). Mesa уже предоставляет режим создания контекста вне экрана (OSMesa), но это далеко не полная функциональность.

Итак, прямо сейчас вам понадобится какой-то отображаемый сервер, с которым можно будет работать, к которому вы можете привязать контекст. X11 предлагает два типа графических элементов, ускоряемых графическим процессором: Windows и PBuffers. Вы можете использовать FBO с любым из них (PBuffers - это технически Windows, которые не могут быть сопоставлены с корневым окном и имеют холст вне экрана). Самый простой способ - создать обычное окно на X-сервере, но не показывать его; вы по-прежнему можете создавать на нем контекст OpenGL и создавать FBO, как показано в многочисленных руководствах. Но для OpenGL для работы X-сервер, который вы используете, должен быть активным, удерживать консоль и быть настроен на использование графического процессора (теоретически с новыми X-серверами и драйверами с поддержкой гибридной графики должна быть возможность настроить X-сервер. использовать фиктивное устройство отображения и настроить графический процессор в качестве дополнительного устройства для ускоренного рендеринга, но я никогда этого не пробовал).

person datenwolf    schedule 17.03.2014
comment
Это действительно очень полезно. Но не могли бы вы уточнить эту часть: для работы OpenGL используемый вами X-сервер должен быть активным, содержать консоль и быть настроен на использование графического процессора. Основная проблема, с которой я столкнулся, - это невозможность открыть дисплей, поскольку XOpenDisplay() всегда дает сбой. Я попытался передать NULL, чтобы получить число из переменной окружения, но это все равно не удалось. Я протестировал, запустив Apache2 из командной строки как единый процесс, чтобы я мог отслеживать вывод на консоли. - person informer2000; 18.03.2014
comment
@ informer2000: Сначала убедитесь, что действительно работает X-сервер. В таком случае вы должны предоставить клиентам номер ДИСПЛЕЯ и путь к информации авторизации. При запуске X-сервера используйте параметр -auth …, чтобы указать путь для размещения данных авторизации (где-то в /var/run или около того) и сделать их доступными для чтения процессом веб-сервера. Затем установите для переменной среды XAUTHORITY этот путь. - person datenwolf; 18.03.2014
comment
Спасибо, datenwolf. Но я не вижу, что я делаю иначе, чем вы упомянули. Я проверил переменную DISPLAY в своем коде, и она действительно получает правильное значение (: 0.0). Итак, я предполагаю, что XOpenDisplay() вызывается с этим значением. Клиентское приложение для X-сервера будет моим модулем (или в основном Apache). XAUTHORITY указывает на .Xauthority файл в доме моего пользователя. Поскольку я запускаю Apache из командной строки как единый процесс, мой пользователь, вероятно, является владельцем этого процесса. - person informer2000; 18.03.2014
comment
Единственное, что я могу придумать, это то, что, возможно, владелец дочернего процесса скажет www-data, у которого нет доступа к .Xauthority файлу! - person informer2000; 18.03.2014
comment
@ informer2000: Да, очень вероятно. Файлы .Xauthority пользователя обычно имеют режим 600, то есть доступны только пользователю-владельцу. Однако вполне возможно скопировать содержимое этого файла в другое место. - person datenwolf; 18.03.2014
comment
Еще раз спасибо, datenwolf. Вот и все! Я установил XAUTHORITY и запустил другой X-сервер на другом дисплее и изменил владельца сгенерированного файла .Xauthority на www-data. В модуле я передал номер дисплея нового X-сервера XOpenDisplay() и запустил сервер. После запроса из браузера все заработало! По крайней мере, установка OpenGL работала. Отрендеренный кадр, который был сохранен, был полностью черным. Но я думаю, это потому, что в моем примере использовался PBuffer. Я попробую использовать вместо этого FBO и посмотрю. - person informer2000; 18.03.2014
comment
@ informer2000: Кадр, вероятно, вернулся, потому что X-серввер, который вы использовали, не был тем, который удерживал терминал в момент выполнения рендеринга OpenGL. Чтобы OpenGL мог работать с текущими X-серверами, используемый X-сервер должен быть тем, который в настоящее время производит вывод на разъеме дисплея. Если вы запускаете второй X-сервер на своем компьютере, но затем переключаетесь обратно на сеанс, другой X-сервер не может производить вывод OpenGL (с текущими драйверами). - person datenwolf; 18.03.2014
comment
Вы снова правы! В получившейся рамке теперь отображается цвет заливки фона, который я установил. Я все еще не вижу четырехугольника, который рисует код. Но я снова просматриваю команды OpenGL, чтобы дважды проверить. - person informer2000; 19.03.2014