LINUX.ORG.RU

Вывод графики с помощью DRI и /dev/fb0

 , , , ,


1

2

Меня довольно давно интересовал вопрос вывода графики на Linux и то, как ИМЕННО это реализовано. И у меня появилась мысль реализовать свою граф. библиотеку с помощью низкоуровневого взаимодействия с драйверами и DRM в целом.

Взглянув на загаловки вроде fb.h можно найти структуры позволяющие взаимодействовать с экраном и тд., но у меня остаются вопросы по взаимодействию с этим

И все примеры, коих, я нашёл не так много(возможно, потому, что искал очень мало) Беря хотя бы эту статейку с вопроса на StackOverflow «Графика на чистом c++?» http://betteros.org/tut/graphics1.php многие примеры просто не запускаются из-за ошибок с mmap, например, или неправильных определений, которые почему-то на статье признаны «рабочими». Возможно, я что-то упускаю, запуская это с ядра? САМ ВОПРОС:

Предположим, мне необходимо с помощью низкоуровневых взаимодействий из юзерспейса с помощью framebuffer сделать линию, допустим, белого цвета на экране от середины левого края до середины правого. Как именно должна выглядеть реализация? Я должен открыть сам буффер,рассчитать занимаемое место в памяти экраном и…Выделить для него место? И mmap вывести записанные данные?

  1. Как реализовывается графика на linux в целом? Как в этом участвует FrameBuffer?
  2. Каким образом X-сервер выводит данные на экран?
  3. Где можно найти документации по подобного рода вопросам?Соурсы?

P.S Первая статья на Linux.org, не судите строго, буду учиться, а конструктивной критике - буду рад :)

UPD: Спустя время, подзабыв этот вопрос, смотрю на него, как на начало-начал. Для тех, кто заинтересуется подобного рода темой:

Графический стек линукс(в целом, система и взаимосвязи графики) работает на основе ресурсов видеокарты(того, что в целом, может отображать графику, как, например, фреймбуффер(/dev/fb*)). И, на основе этого работают все графические подпрограммы(то, что отображает окна на твоей ОС), вроде X-сервер, Wayland и тд., которые и дают начало всяким GTK для прикладной отрисовки. В целом, лучшие графики, которые я смог найти по этому поводу были вот в этом квалификационном документе: https://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=&cad=rja&uact=8&ved=2ahUKEwjxipXqtr77AhWzRvEDHYjzAnAQFnoECBgQAQ&url=https%3A%2F%2Foops.math.spbu.ru%2FSE%2Fdiploma%2F2017%2Fbmo%2F444-Butrova-report.pdf&usg=AOvVaw2gPxiVBjRxUTbSj4wNOrn0

Но, если вы на данный момент находитесь на системе, которая для отрисовки использует X11(X-сервер)(За иные не ручаюсь, не смотрел), то доступа к видеопамяти он вам не даст, как и использовать фреймбуффер(Что очень очевидно, но пишу для таких же недалёких как и я, что несколько радикально и дотошно относятся к этой теме) Поэтому, Ctrl-Alt-F*, для вызова другого ОС окна(Честно говоря, не знаю, как корректно описать подобное на основе TTY драйвера) на котором все примеры из ссылки выше вполне будут работать.

Что ж…Теперь пора занятся разработкой собственной граф. подпрограммы, менеджера окон и..Пожалуй, это будет чем-то вроде наиболее низкоуровнего способа отрисовки графики(практически с нуля)(поправьте, если не прав, ведь знаю про всякие API(подчеркну, API)10h на ассемблере)

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

Вопрос закрыт



Последнее исправление: Doctor_Nazare (всего исправлений: 1)

/dev/fb0 это старый linux фреймбуфер. Не путай их. Сейчас аппаратно-зависимый фреймбуфер(drm fb) можно достать черз /dev/dri/card0(cardX в общем случае). Если идти дальше по примеру ТС, то можно делать mmap через специальный ioctl (DRM_IOCTL_MODE_MAP_DUMB). Смотри любой пример, их на самом деле полно.

arrecck ★★★
()
Ответ на: комментарий от fluorite

/dev/fb0 реализован поверх drm драйвера видеокарты. Какие-то вещи будут работать по старому api. Раньше были отдельные vesafb/uvesafb (по стандарту), сейчас это все legacy. Гарантировать полную совместимость никто не будет.

arrecck ★★★
()
Ответ на: комментарий от Doctor_Nazare

А лого пингвина при загрузке есть? Если нет, надо настроить fbcon.

Я попробовал запустить в virtualbox. Тоже работает. Драйвер VMSVGA.

$ sudo dmesg | grep fb0 
[    1.681473] fbcon: svgadrmfb (fb0) is primary device

Вот тут есть полезная утилита, а тут хорошее введение в drm.

fluorite ★★★★★
()
Ответ на: комментарий от fluorite

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

Очень глупо вышло признаться, при том, что X11-ый не даёт доступа в видеопамять) Просто переключился на другой консольный TTY без запущеного X-сервера. В целом, ещё очень долгое время я просто писал драйвера и выробатывал вопрос этого всем. Я думаю, что тема закрыта - всем спасибо

Doctor_Nazare
() автор топика