Как работает вывод графического интерфейса от приложения к аппаратному уровню? - PullRequest
11 голосов
/ 08 января 2012

Я вхожу в программирование GUI и сделал некоторое исследование. Сейчас мне не все понятно. Если бы я использовал GTK + в качестве инструментария, как он взаимодействует с видеокартой?

В системе Linux, я полагаю, это будет GTK -> X Server - (OpenGL) -> видеокарта. Это правильно?

Я читал, что некоторые графические интерфейсы напрямую рисуют OpenGL (например, Blender3D), так как другие приложения рисуют свои графические интерфейсы?

Если единственными API (которые мне известны) для видеокарт являются Direct3D и OpenGL, в чем разница между программным рендерингом и аппаратным ускорением?

Может ли программное обеспечение, которое выполняет «программный рендеринг», напрямую записывать в кадровый буфер видеокарты, так что OpenGL остается нетронутым?

PS: извините за многие вопросы, но я не понимаю, как все это работает, спасибо за каждый ответ:)

Ответы [ 2 ]

14 голосов
/ 08 января 2012

В системе Linux, я полагаю, это будет GTK -> X Server - (OpenGL) -> видеокарта. Это правильно?

Нет. GTK + на Linux выходит

                                              /-[ if direct context ]---\
                     /--> OpenGL >-+---------/                           \
                    /              \-> GLX -+--------------\              \
                   /                         \              \              \
GTK+ -+-> cairo >-+---> XRender >--------+----+-> Xlib/xcb >-+-> X server >-+-> Kernel Module >-> GPU
       \           \–-> pixmap buffer >–/
        \                              /
         \―---------------------------/

Я читал, что некоторые графические интерфейсы напрямую рисуют OpenGL (например, Blender3D), так как другие приложения рисуют свои графические интерфейсы?

Это просто "Блендер" (без трейлинга в 3D). GUI-инструментарий Blender использует OpenGL в качестве единственного бэкэнда, да. Но графический интерфейс не рисуется напрямую с использованием OpenGL, с которым было бы неудобно работать (рисуйте каждую кнопку с помощью вызовов OpenGL. Blender имеет свой собственный инструментарий. GTK + - это еще один инструментарий, но не привязанный к Blender (на самом деле один из моих любимых проектов - извлечение инструментария Blender GUI, чтобы его можно было использовать в независимых проектах).

Наборы инструментов, такие как GTK + и Qt, разработаны для максимальной мобильности. Blender может позволить себе роскошь знать, что OpenGL будет доступен. Приложения, разработанные для GTK + или Qt, могут работать на системах, не поддерживающих 3D, поэтому дизайн GTK + и Qt позволяет работать на нескольких бэкэндах. GTK + теперь в версии 3 использует графический движок Cairo в качестве графического бэкэнда. Cairo снова имеет свои собственные бэкэнды, а именно программный растеризатор, рисующий в растровые изображения (пиксельные изображения), или проксирующий команды рисования для базовой графической архитектуры. В случае Cairo в Linux это может быть OpenGL или X11 (расширения ядра и протокола XRender).

Если единственными API (которые я знаю) для видеокарт являются Direct3D и OpenGL, в чем разница между программным рендерингом и аппаратным ускорением?

Ни OpenGL, ни Direct3D не общаются с видеокартой. Они разговаривают с драйверами видеокарты. Таким образом, у вас будет возможность поговорить с самими драйверами, минуя OpenGL и Direct3D. Но зачем ты это делаешь? Это утомительно.

Кроме того, в Windows у вас есть GDI и / или WPF (Windows Presentation Foundation) для рисования, а также Direct2D.

В Linux вы получаете ядро ​​X11 и протокол расширения XRender для рисования красивых картинок.

Еще одним API, находящимся в стадии разработки, является OpenVG, целью которого является стандартизация всех этих API-интерфейсов 2D-рисования. И, по крайней мере, в Linux OpenGL и OpenVG были выбраны, чтобы стать единственными доступными API абстрактного рисования в долгосрочной перспективе, с некоторой оконной системой для управления кадровым буфером и пользовательским вводом. В разработке находится Wayland (дизайн которого мне совершенно не нравится) и X11, который, я думаю, имеет лучший дизайн (это сетевая система, которая позволяет распределенное выполнение, что я считаю очень важным в будущем), но нуждается в полная перестройка в некоторый «X12» - очистка устаревшего кода, заставить его работать в цветовом пространстве контакта, сделать соединения переходными (чтобы можно было переносить клиентов между X-серверами, что позволило бы гораздо более элегантный способ блокировки X-сеансов путем перемещения всех подключений к теневому X-серверу вместо попытки заблокировать доступ с помощью экранной заставки блокировки).

Может ли программное обеспечение, которое выполняет «программный рендеринг», напрямую записывать в кадровый буфер видеокарты, так что OpenGL остается нетронутым?

Не в современной операционной системе. Однако ОС может предоставить вам абстрактный доступ к графической карте через некоторый API кадрового буфера (/ dev / fb0 в Linux). Однако кадровый буфер неуправляем, поэтому, если запущен X-сервер или Wayland, любой из них занимается управлением FB, и тогда это не ваше дело.

2 голосов
/ 08 января 2012

Может ли программное обеспечение, которое выполняет «программный рендеринг», напрямую записывать в кадровый буфер видеокарты, так что OpenGL остается нетронутым?

Не совсем или точнее: зависит от драйвера,Системы отображения, такие как XServer (или эквиваленты Windows и MacOS), не используют API, а скорее описывают API.Специально называемая модель драйвера (или в случае XServers одна из множества моделей, таких как XAA, EXA, UXA и DRI), которой должен удовлетворять драйвер дисплея.

Все, что не определено в этих моделях, должно быть сделано в«программное обеспечение» и рассчитано на процессор.Кроме того, некоторые операции, определяемые моделями, также могут рассчитываться на процессоре драйвером.

Раньше OpenGL был совершенно отдельным стандартом от этих моделей.Графические драйверы вообще не должны были реализовывать OpenGL для использования в ОС.Но с продолжающейся интеграцией трехмерной графики и более сложной компоновкой в ​​современных ОС, модели драйверов начали опираться на те же парадигмы, что и OpenGL и Direct3D.Например, WDDM (модель драйвера дисплея Windows) напрямую требует поддержки Direct3D 9.

...