OpenGL без X.org в Linux - PullRequest
       41

OpenGL без X.org в Linux

31 голосов
/ 24 июля 2010

Я хотел бы открыть контекст OpenGL без X в Linux.Есть ли какой-нибудь способ сделать это?

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

Если нет другого пути, кроме как через встроенное аппаратное обеспечение Intel, я думаю, было бы неплохо узнать, как это сделать с ними.Протокол 1006 * X11 и сам протокол слишком велики и сложны.Обеспечиваемое им мультиплексирование ввода мыши / клавиатуры / планшета слишком подавлено для современных программ.Я думаю, что это худший контрольно-пропускной пункт, препятствующий улучшению Linux, поэтому я ищу альтернативы.

Ответы [ 5 ]

30 голосов
/ 26 июля 2010

Обновление (17 сентября 2017 г.):

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

В итоге:

  • Ссылка на libOpenGL.so и libEGL.so вместо libGL.so.(Следовательно, ваши параметры компоновщика должны быть -lOpenGL -lEGL
  • Вызов eglGetDisplay, затем eglInitialize для инициализации EGL.
  • Вызов eglChooseConfig с атрибутом конфигурации EGL_SURFACE_TYPE, за которым следует EGL_PBUFFER_BIT.
  • Позвоните eglCreatePbufferSurface, затем eglBindApi(EGL_OPENGL_API);, затем eglCreateContext и eglMakeCurrent.

С этого момента выполните рендеринг OpenGL как обычно, и выможет отбрасывать поверхность вашего пиксельного буфера куда угодно. Эта дополнительная статья от NVIDIA содержит базовый пример и пример для нескольких графических процессоров. Поверхность PBuffer также можно заменить поверхностью окна или поверхностью растрового изображения, в зависимости отпотребности приложения.

Я сожалею, что не проводил больше исследований по этому вопросу в моем предыдущем редактировании, ну да ладно. Лучшие ответы - лучшие ответы.


Со времени моего ответа в 2010 году былиряд серьезных потрясений в графическом пространстве Linux. Итак, обновленный ответ:

Сегодня nouveau и другие драйверы DRI достигли такой степени, что программное обеспечение OpenGL стабильно и работает разумно.в целом хорошо.С введением EGL API в Mesa теперь можно писать приложения OpenGL и OpenGL ES даже на рабочих столах Linux.

Вы можете написать свое приложение для целевого EGL, и оно может быть запущено без присутствияоконный менеджер или даже композитор.Чтобы сделать это, вы должны вызывать eglGetDisplay, eglInitialize и, в конечном итоге, eglCreateContext и eglMakeCurrent, вместо обычных вызовов GLX, чтобы сделать то же самое.

Я не знаю конкретного пути кодадля работы без сервера дисплея, но EGL принимает дисплеи X11 и Wayland, и я знаю, что EGL может работать без него.Вы можете создавать контексты GL ES 1.1, ES 2.0, ES 3.0 (если у вас Mesa 9.1 или новее) и OpenGL 3.1 (Mesa 9.0 или новее).В Mesa (по состоянию на сентябрь 2013 г.) пока не реализовано ядро ​​OpenGL 3.2.

В частности, на Raspberry Pi и на Android EGL и GL ES 2.0 (1.1 на Android <3.0) поддерживаются по умолчанию.На Raspberry Pi я не думаю, что Wayland еще работает (по состоянию на сентябрь 2013 года), но вы получаете EGL без сервера дисплея с использованием включенных двоичных драйверов.Ваш EGL-код также должен быть переносимым (с минимальными изменениями) на iOS, если это вас интересует. </p>


Ниже приведен устаревший, ранее принятый пост:

Я бы хотел открыть контекст OpenGL без X в Linux.Есть ли вообще способ сделать это?

Я считаю, что Mesa предоставляет цель для кадрового буфера.Если он вообще обеспечивает какое-либо аппаратное ускорение, то это будет только с аппаратным обеспечением, для которого есть драйверы с открытым исходным кодом, которые были адаптированы для поддержки такого использования.

Gallium3D также является незрелым, и поддержка этого не являетсянасколько мне известно, даже в плане.

Я бы хотел получить решение, которое работает с картами NVIDIA.

Не существует.Точка.

NVIDIA предоставляет только драйвер X, а проект Nouveau все еще незрелый и не поддерживает тот вид использования, который вам нужен, поскольку в настоящее время он ориентирован только на драйвер X11.

7 голосов
/ 25 июля 2010

Вас может заинтересовать проект под названием Wayland

http://en.wikipedia.org/wiki/Wayland_%28display_server%29

4 голосов
/ 26 сентября 2013

Вы смотрели на эту страницу? http://virtuousgeek.org/blog/index.php/jbarnes/2011/10/31/writing_stanalone_programs_with_egl_and_

Вероятно, это немного устарело. Я еще не пробовал, но я был бы признателен за дополнительную документацию этого типа.

Вероятно, на сегодняшний день хорошей идеей будет следовать реализации Wayland compositor-drm.c: http://cgit.freedesktop.org/wayland/weston/tree/src/compositor-drm.c

3 голосов
/ 25 июля 2010

Просто используйте Mesa .

1 голос
/ 26 апреля 2012

Вы можете посмотреть, как Android решил эту проблему.Смотрите проект Android-x86.

Android использует mesa с egl и opengles.Android имеет собственный простой компонент Gralloc для настройки режима и выделения графики.Вдобавок к этому у них есть компонент SurfaceFlinger, который является механизмом композиции, который использует OpenGLES для ускорения.

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

...