Подтвердить что ты не робот

OpenGL без X.org в Linux

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

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

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

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

4b9b3361

Ответ 1

Обновление (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 еще не внедрила ядро OpenGL 3.2 (по состоянию на сентябрь 2013 года).

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


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

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

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

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

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

Там нет ни одного. Период.

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

Ответ 3

Вы просматривали эту страницу? 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

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

https://gitlab.freedesktop.org/mesa/kmscube/  является хорошей эталонной реализацией аппаратно-ускоренного рендеринга OGL (или OGLES) без зависимости X11 или wayland.