Введение

Бесплатная и открытая библиотека для рендеринга 3D-графики.

Mesa, также известная как Mesa3D и The Mesa 3D Graphics Library, является реализацией спецификаций OpenGL, Vulkan и других графических API с открытым исходным кодом. Mesa преобразует эти спецификации для работы с аппаратными графическими драйверами конкретных производителей. Основными пользователями Mesa являются два графических драйвера, разрабатываемых и финансируемых в основном компаниями Intel и AMD для их соответствующего оборудования (AMD продвигает свои драйверы Mesa Radeon и RadeonSI вместо устаревшего AMD Catalyst, а Intel поддерживает только драйвер Mesa). Проприетарные графические драйверы (например, драйвер Nvidia GeForce и Catalyst) полностью заменяют Mesa, предоставляя собственную реализацию графического API. Разработка драйвера Mesa для Nvidia под названием Nouveau ведется преимущественно сообществом. Помимо 3D-приложений, таких как игры, современные серверы отображения (Glamor в X.org или Weston в Wayland) используют OpenGL/EGL, поэтому вся графика обычно обрабатывается через Mesa. Mesa размещается на freedesktop.org и была инициирована в августе 1993 года Брайаном Полом, который до сих пор активно участвует в проекте. Впоследствии Mesa получила широкое распространение и теперь содержит множество вкладов от различных частных лиц и корпораций по всему миру, включая производителей графического оборудования из Khronos Group, которые управляют спецификацией OpenGL. Разработка для Linux также частично поддерживалась за счет краудфандинга.

Реализация интерфейсов интерфейсов рендеринга

Mesa известен как реализация графических API. Исторически основным API, который Mesa реализовал, является OpenGL, наряду с другими спецификациями, связанными с Khronos Group (например, OpenVG, OpenGL ES или недавно EGL). Но Mesa может реализовывать и другие API, и действительно это было сделано с Glide (устарел) и Direct3D 9 с июля 2013 года. Mesa также не специфичен для Unix-подобных операционных систем: на Windows, например, Mesa предоставляет OpenGL API через DirectX. Mesa реализует слой трансляции между графическим API, таким как OpenGL, и графическими аппаратными драйверами в ядре операционной системы. Поддерживаемая версия различных графических API зависит от драйвера, поскольку каждый аппаратный драйвер имеет свою собственную реализацию (и, следовательно, статус). Это особенно верно для "классических" драйверов, в то время как драйверы Gallium3D используют общий код, который имеет тенденцию к унификации поддерживаемых расширений и версий. Mesa поддерживает матрицу поддержки со статусом текущего соответствия OpenGL, визуализированного в Mesa 10 в соответствии с OpenGL 3.3 для аппаратного обеспечения Intel, AMD/ATI и Nvidia GPU. Mesa 11 был анонсирован с некоторыми драйверами, соответствующими OpenGL 4.1. Mesa 12 содержит поддержку OpenGL 4.2 и 4.3, а также Intel Vulkan 1.0. Mesa 13 привнёс поддержку Intel для OpenGL 4.4 и 4.5 (все функции поддерживаются для Intel Gen 8+, Radeon GCN, Nvidia (Fermi, Kepler), но отсутствует Khronos Test для метки 4.5) и экспериментальную поддержку AMD Vulkan 1.0 через драйвер сообщества RADV. OpenGL ES 3.2 возможен с Intel Skylake (Gen9). Готовые функции сертифицированы OpenGL 4.5, OpenGL 4.5 для Intel Haswell, OpenGL 4.3 для Nvidia Maxwell и Pascal (GM107+). Значительный прирост производительности был измерен с Maxwell 1 (GeForce GTX 750 Ti и более с GM1xx). Карты Maxwell 2 (GeForce GTX 980 и более с GM2xx) работают на пониженной тактовой частоте без информации от Nvidia. Комплекс тестирования Khronos CTS для OpenGL 4.4, 4.5 и OpenGL ES 3.0+ теперь (2017 01 24) имеет открытый исходный код, и все тесты для Mesa 13 и 17 теперь возможны без затрат. Вторая стабильная версия 2017 года, 17.1.0, вышла 10 мая 2017 года с некоторыми интересными улучшениями. OpenGL 4.2+ для Intel Ivy Bridge и OpenGL 3.3+ для Intel Open SWR Rasterizer – два основных момента. Благодаря модульной природе OpenGL, Mesa может поддерживать расширения из более новых версий OpenGL, не заявляя о полной поддержке этих версий. Например, в июле 2016 года Mesa поддерживала OpenGL ES 3.1, а также все расширения OpenGL ES 3.2, за исключением пяти, а также ряд расширений, не входящих ни в одну версию OpenGL или OpenGL ES. 3-я версия 17.2 доступна с сентября 2017 года с некоторыми новыми функциями OpenGL 4.6 и улучшениями скорости в 3D для Intel и AMD. Только 1,4% тестов не проходят для OpenGL 4.5 в Nouveau для Kepler. Четвёртая версия 17.3 готова с декабря 2017 года. Доступно множество улучшений во многих драйверах. OpenGL 4.6 почти полностью доступен (Spir-V не готов). AMD Vulkan Driver RADV теперь полностью соответствует требованиям теста Khronos. Первая версия 2018 года – 18.0 и доступна с марта 2018 года по той же схеме, что и в 2017 году. Полная поддержка OpenGL 4.6 не готова, но многие функции и улучшения были успешно протестированы в RC3. 10-битная поддержка Intel i965 в цветовом пространстве также является важным моментом. Новое – поддержка Intel Cannon Lake и AMD Vega с актуальной версией Linux. Чипы AMD Evergreen (RV800 или R900) близки к поддержке OpenGL 4.5. Старые чипы AMD R600 или RV700 могут поддерживать только OpenGL 3.3 с некоторыми функциями OpenGL 4.x. Freedreno – драйвер для Adreno Hardware и поддерживает OpenGL 3.3. Вторая версия 2018 года – 18.1 и доступна с мая. Цель – Vulkan 1.1.72 с драйверами Intel ANV и AMD RADV. OpenGL 4.6 с spir-V также является основной целью. Постоянная работа ведётся над завершением функций и оптимизацией драйверов для устаревшего оборудования, такого как AMD R600/Evergreen, Nvidia Tesla и более ранние, Fermi, Kepler или Intel Sandybridge, Ivybridge, Haswell или Broadwell. ARM Architecture также внесла значительные улучшения в Adreno 3xx/4xx/5xx и Broadwell VC4/VC5 для Raspi с основной целью OpenGL ES. Третья версия 2018 года – 18.2 и доступна в календаре стабильной в сентябре. OpenGL 4.6 с spir-V и Vulkan 1.1.80 находятся в разработке. Программный драйвер для виртуальных машин VIRGL готов для OpenGL 4.3 и OpenGL ES 3.2. RadeonSI также готов к OpenGL ES 3.2. Поддержка сжатия текстур ASTC и поддержка режима совместимости для OpenGL 4.4 (3.1 в 18.1) – другие важные особенности RadeonSI для карт AMD GCN. Новый Vulkan 1.1 и другие функции для Intel и AMD доступны. Подробности о Vulkan см. в Mesamatrix. Четвёртая версия 2018 года – 18.3 и выпущена как стабильная версия 18.3.1 в декабре 2018 года. Многие функции и поддержка нового оборудования – основные части. Полная поддержка OpenGL 4.6 не готова. Первая версия 2019 года – 19.0 и была выпущена в марте. Полная поддержка OpenGL 4.6 не готова, но многие улучшения в этом направлении есть во всех драйверах. Вторая версия 2019 года – 19.1. Переход TGSI в NIR – одна из основных функций на пути к OpenGL 4.6 с Spir-V и более OpenCL. RadeonSI хорошо работает в dev-версии с NIR. Третья версия 2019 года – 19.2. OpenGL 4.6 готов к бета-тестированию для нового драйвера Intel Iris. Четвёртая версия 2019 года – 19.3. OpenGL 4.6 готов для Intel i965 и опционально для нового драйвера Iris. Первая версия 2020 года – 20.0. Vulkan 1.2 готов для AMD RADV и Intel ANV. Intel Iris является драйвером по умолчанию для Intel Broadwell Gen 8+. Драйвер RadeonSI переключился на использование NIR по умолчанию вместо TGSI. Вторая версия 2020 года – 20.1. Доступно множество улучшений во многих драйверах. Zink – новый виртуальный драйвер для OpenGL через Vulkan. Третья версия 2020 года – 20.2. OpenGL 3.0 для Zink – одна из новых функций. LLVMpipe будет поддерживать OpenGL 4.3+ (4.5+ в 20.3). ARM Panfrost значительно улучшен во многих модулях. Общая виртуальная память возможна для OpenCL в Nouveau с Pascal и выше. Четвёртая версия 2020 года – 20.3. v3d и v3dv – новые драйверы для OpenGL и Vulkan 1.0 с оборудованием Broadcom, таким как Raspberry Pi 4. OpenCL 1.2 полностью поддерживается в модуле clover. Zink поддерживает OpenGL 3.3+. Виртуальный драйвер LLVMpipe теперь поддерживает OpenGL 4.5+ с OpenGL 4.6 в разработке. Lavapipe (первоначально называвшийся Vallium) как Vulkan Tree of LLVMpipe был объединён. В Mesa 21.0 d3d12 будет объединён с OpenGL 3.0–3.3. Microsoft и Collabora разрабатывают новую эмуляцию d3d12 в WSL2 для Windows 10 с Direct 3D 12. OpenCL 1.2 также является целью d3d12. Ускорение в 2–5 раз было достигнуто в бенчмарке SPECviewperf с улучшенным OpenGL-кодом. Многие функции Mesa 21.0 улучшают производительность. Новый релиз 21.0.0 доступен с 11 марта 2021 года. Mesa 21.1 – второй релиз 2021 года. OpenGL 4.6+ и OpenGL ES 3.1+ доступны для Zink. AMD Driver 600g может переключиться на NIR с расширенными возможностями для старых карт Radeon HD 5000 и 6000. Qualcomm Turnip достигает Vulkan 1.1+ и программной эмуляции Lavapipe Vulkan 1.1+. Google VirtIO GPU Driver Venus с Vulkan 1.2+ был объединён в экспериментальном состоянии с низкой производительностью в основном дереве mesa. Mesa 21.2 – третий релиз 2021 года. Google Virtual Vulkan IO Driver Venus будет официально представлен с полной поддержкой Vulkan 1.2+ (см. mesamatrix). ARM Panfrost: доступна поддержка OpenGL ES 3.1+ и panVK – новый Vulkan Driver. Начата поддержка ARM Apple M1 с новым драйвером Asahi. 21.2 доступен с 4 августа 2021 года. Старый план – разделить старые драйверы на классическое дерево со многими преимуществами в программировании, поддержке и исправлении ошибок для современной части Gallium 3D. Одна проблема здесь – Intel i965 с поддержкой популярного старого оборудования до Intel Haswell и ранее, а также с поддержкой Windows 10. Новый Gallium3D драйвер Crocus для Intel Gen 4 Graphics до Haswell находится в разработке, чтобы завершить область Gallium3D с возможным разделением в следующем году 2021. Crocus опционально доступен в 21.2. Amber branch предназначен для старых драйверов без функций Gallium 3D, таких как Radeon R200, intel i915 и 965 с текущей версией 21.3.9. В версии 22.0 классические драйверы устарели. Vulkan 1.3 доступен для Intel Anvil и AMD RADV. Microsoft представляет новый драйвер „Dozen“ для WS…

Таблица интерфейсов интерфейсов рендеринга

Версия Mesa, Дата первого выпуска, Последнее обновление, Vulkan, OpenCL, OpenGL, OpenGL ES, OpenVG, EGL, GLX, Direct3D
1.3.2642023 09 08, 3.02020 11 30, 4.62017 07 31, 3.2.62019 07 10, 1.12008 12 03, 1.52014 03 19, 1.42005 12 16, 1.22015 07 29, 2023 05 10, 23.1.81.3.244: 1.3+ (Intel Gen8+ to XE, AMD GCN Gen2+ to RDNA3, Lavapipe, Google Venus), 1.1+ (Qualcomm Turnip), 1.0+ (AMD GCN1, Broadcom v3dv, ARM Mali PanVK)1.0, 1.1, 1.2 (полная поддержка), 3.0 (в разработке, некоторые функции в 21.1), 1.5, 1.4, 9.0c, 2023 02 23, 23.0.41.3.232: в основном соответствует 23.1, 2022 11 30, 22.3.722.3: 1.3.225: 1.3+ (Intel Gen8+, AMD GCN Gen2+, Lavapipe), 1.2+ (Google Venus), 1.1+ (Qualcomm Turnip, Lavapipe (22.2)), 1.0+ (AMD GCN1, Broadcom v3dv, ARM Mali PanVK), 2022 09 21, 22.2.5, 2022 05 20, 22.1.7, 2022 03 09, 22.0.5, 2021 11 17, 21.3.921.3: 1.2.190 (Intel Gen8+, AMD GCN Gen2+, Google Venus (21.3), Lavapipe), 1.0+ (AMD GCN1, Broadcom v3dv), 1.1+ (Qualcomm Turnip, Lavapipe (21.1)), 2021 08 04, 21.2.6, 2021 05 05, 21.1.8, 2021 03 11, 21.0.3, 2020 12 03, 20.3.520.3: 1.2.158 (Intel Gen8+, AMD GCN Gen2+), 1.0+ (AMD GCN1, Broadcom v3dv (20.3)), 2020 09 28, 20.2.61.0, 1.1, 1.2 (в разработке) некоторые тесты на соответствие не пройдены, 2020 05 27, 20.1.101.2+ (Intel Gen8+, AMD GCN Gen2+), 2019 12 11, 19.3.51.1+ (Intel Gen8+, AMD GCN Gen2+) (19.1: 1.1.104, 19.0: 1.1.102, 18.3: 1.1.90, 18.2: 1.1.84), 2019 09 25, 19.2.8, 4.5, 2019 06 11, 19.1.8, 2019 03 13, 19.0.8, 2018 12 07, 18.3.6, 2018 09 07, 18.2.8, 1.1 (Intel Gen8+, AMD GCN Gen2+)(1.1.73), 2018 03 27, 18.0.5, 1.0+ (1.0.66), 2017 12 08, 17.3.9, 1.0 (PC: ANV Intel Gen7+ Ivy Bridge, RADV AMD GCN only) (header: 17.3: 1.0.63, 17.2: 1.0.54, 17.1: 1.0.42, 17.0: 1.0.38, 13.0: 1.0.6, 12.0: 1.0.3), в разработке Gallium, Compute (Clover): некоторые CTS тесты не пройдены, в 1.0 и 1.1, 1.2 (в разработке), таким образом 1.0, 1.1, 1.2 неполные, 2017 09 04, 17.2.8, 2017 05 10, 17.1.10, 2017 02 13, 17.0.7, 2016 11 01, 13.0.6, 4.4, (4.5 Без метки теста), 2016 07 08, 3.1, 2016 04 04, 11.2.2, rowspan="19", 4.1 (Intel 3.3+), 2015 12 15, 11.1.4, 3.0, 2015 09 12, 11.0.9, 2015 06 15, 10.6.9, 3.3, 1.4, 2015 03 06, 10.5.9, 1.1, 2014 12 14, 10.4.7, 2014 09 19, 10.3.7, rowspan="13", 2014 06 06, 10.2.9, 2014 03 04, 10.1.6, 2013 11 30, 10.0.5, 2012 10 08, 9.0.3, 9.1.7, 9.2.5, rowspan="9", 3.1, 2.0, 2012 02 08, 8.0.5, 3.0, 2007 06 22, 7.0.4, 7.11.2, 2.1, rowspan="7", rowspan="7", rowspan="7", 2004 01 06, 6.0.1, 1.5, 1.3, 2002 11 13, 5.0.2, 1.4, 2001 10 22, 4.0.4, 1.3, 1998 09, 3.1, 3.2.1, 3.4.2.1, 1.2, 1996 10, 2.6, 1.1, 1995 02, 1.2.8, 1.0

Вулкан

Группа Khronos официально объявила о Vulkan API в марте 2015 года и официально выпустила Vulkan 1.0 16 февраля 2016 года. Vulkan несовместим с OpenGL и полностью отказывается от концепции монолитной машины состояний. Разработчики Gallium3D назвали Vulkan чем-то вроде Gallium3D 2.0 – Gallium3D разделяет код, реализующий машину состояний OpenGL, и код, специфичный для аппаратного обеспечения. Версия 1.3 сразу доступна с Mesa 22.0. Оборудование с поддержкой OpenGL ES 3.1 должно работать на уровне Vulkan 1.3 и ниже. Поскольку Gallium3D обрабатывает TGSI, Vulkan обрабатывает SPIR V (Standard Portable Intermediate Representation, версия "V" как в "Vulkan"). Intel выпустила свою реализацию драйвера Vulkan для своего оборудования в день официального выпуска спецификации, но он был включен в основную ветку разработки только в апреле и стал частью Mesa 12.0, выпущенной в июле 2016 года. Хотя драйвер i965 и не был написан в соответствии со спецификациями Gallium3D, для драйвера Vulkan еще менее целесообразно надстраивать его поверх Gallium3D. Аналогично, нет технической причины использовать NIR, но сотрудники Intel реализовали свой драйвер Vulkan именно таким образом. Ожидается, что проприетарный драйвер Vulkan от AMD, выпущенный в марте и анонсированный как свободное и открытое программное обеспечение в будущем, также откажется от Gallium3D и будет включен в Mesa. RADV – это свободный проект для AMD, доступный начиная с версии 13. Соответствие тестам Khronos появилось в версии 17.3. Полная поддержка Vulkan 1.0 и 1.1 реализована с Mesa 18.1. Nvidia выпустила свой проприетарный драйвер GeForce с поддержкой Vulkan в день запуска, а Imagination Technologies (PowerVR), Qualcomm (Adreno) и ARM (Mali) сделали то же самое или, по крайней мере, объявили о разработке проприетарных драйверов Vulkan для Android и других операционных систем. Однако, когда и появятся дополнительные свободные и открытые реализации Vulkan для этих графических процессоров, покажет время. Mesa Software Driver VIRGL начала разработку Vulkan в 2018 году с проектами GSOC для поддержки виртуальных машин. Lavapipe – это программный драйвер Vulkan на базе ЦП, "брат" LLVMpipe. Mesa 21.1 поддерживает Vulkan 1.1+. Google представила Venus Vulkan Driver для виртуальных машин в Mesa 21.1 с полной поддержкой Vulkan 1.2+. Panfrost PanVK для ARM Mali движется к Vulkan 1.1, но только 1.0 стабильно доступен с Mesa 22.0. Проект Dozen соединяет Direct3D 12 (d3d12) с Vulkan для эмуляции Linux в WSL2 под Windows 10 и 11. В Mesa 23.2 Vulkan 1.0 полностью соответствует спецификации, а поддержка 1.1 и 1.2 составляет 80% (по данным mesamatrix).

Явная ограда

Одним из видов барьера памяти, который отделяет один буфер от остальной памяти, называется "fence" (барьер). "Fences" (барьеры) используются для того, чтобы гарантировать, что буфер не будет перезаписан до завершения операций рендеринга и отображения на нем. Неявные "fences" (барьеры) используются для синхронизации между графическими драйверами и аппаратным обеспечением GPU. "Fence" (барьер) сигнализирует о том, что буфер больше не используется одним компонентом и может быть использован или повторно использован другим. Ранее ядро Linux имело механизм неявных "fences" (барьеров), при котором "fence" (барьер) напрямую привязывался к буферу (например, GEM handles и FDs), но пользовательское пространство об этом не знало. Явные "fences" (барьеры) предоставляют "fences" (барьеры) пользовательскому пространству, где пользовательское пространство получает "fences" (барьеры) как от подсистемы Direct Rendering Manager (DRM), так и от GPU. Vulkan требует использования явных "fences" (барьеров) и предоставляет преимущества для трассировки и отладки. В ядре Linux 4.9 была добавлена система синхронизации Android в основную ветку разработки.

Управление универсальным буфером

Generic Buffer Management (GBM) — это API, предоставляющий механизм для выделения буферов для графической отрисовки, связанной с Mesa. GBM предназначен для использования в качестве нативной платформы для EGL на DRM или openwfd. Дескриптор, создаваемый GBM, может быть использован для инициализации EGL и создания буферов кадра. Mesa GBM — это абстракция API управления буферами, специфичных для графических драйверов (например, различных библиотек libdrm*), реализованная внутри путем вызова драйверов GPU Mesa. Например, композитор Wayland Weston выполняет отрисовку, используя OpenGL ES 2, который инициализируется вызовом EGL. Поскольку сервер работает на "базовом драйвере KMS", он использует платформу EGL DRM, которую можно рассматривать как платформу GBM, поскольку она опирается на интерфейс Mesa GBM. На XDC2014 сотрудник Nvidia Энди Ритгер предложил расширить EGL для замены GBM. Это предложение не было положительно воспринято сообществом, и Nvidia в конечном итоге изменила свое решение, выбрав другой подход.

Драйверы устройств

Доступные свободные и открытые драйверы устройств для графических чипсетов находятся под управлением Mesa (поскольку существующие свободные и открытые реализации API разрабатываются внутри Mesa). В настоящее время существует два фреймворка для написания графических драйверов: "classic" и Gallium3D. Обзор некоторых (но не всех) драйверов, доступных в Mesa, представлен по адресу. Существуют драйверы устройств для карт AMD/ATI R100–R800, Intel и Nvidia с 3D-ускорением. Ранее драйверы существовали для процессора IBM/Toshiba/Sony Cell в PlayStation 3, чипсетов S3 Virge & Savage, VIA, Matrox G200 & G400 и других. Свободные и открытые драйверы конкурируют с проприетарными закрытыми драйверами. В зависимости от доступности аппаратной документации и ресурсов, свободные и открытые драйверы в большей или меньшей степени отстают в поддержке 3D-ускорения нового оборудования. Кроме того, производительность 3D-рендеринга обычно была значительно ниже, за некоторыми заметными исключениями. Сегодня это по-прежнему верно для Nouveau на большинстве графических процессоров NVIDIA, в то время как на графических процессорах AMD Radeon открытый драйвер теперь в основном соответствует или превосходит производительность проприетарного драйвера.

Инфраструктура прямого рендеринга (DRI)

В то время, когда 3D-графические карты стали более распространёнными на ПК, отдельные разработчики, частично финансируемые компаниями, начали работу над расширением поддержки аппаратного ускорения 3D-рендеринга в Mesa. Direct Rendering Infrastructure (DRI) был одним из подходов к организации взаимодействия Mesa, OpenGL и других библиотек API для 3D-рендеринга с драйверами устройств и аппаратным обеспечением. После достижения базовой работоспособности поддержка DRI была официально включена в Mesa, что значительно расширило спектр поддерживаемого оборудования при использовании библиотеки Mesa. DRI3 поддерживается драйвером Intel с 2013 года и используется по умолчанию в некоторых дистрибутивах Linux с 2016 года для обеспечения поддержки Vulkan и других функций. Он также используется по умолчанию на оборудовании AMD с конца 2016 года (X.Org Server 1.18.3 и новее).

Программное обеспечение для рендеринга

Mesa также содержит реализацию программного рендеринга, позволяющую шейдерам выполняться на центральном процессоре в качестве резервного варианта при отсутствии графических аппаратных ускорителей. Программный растеризатор Gallium известен как softpipe или, при сборке с поддержкой LLVM, как llvmpipe, который генерирует код для ЦП во время выполнения. Начиная с Mesa 10.x, поддержка OpenGL 3.3+ доступна для Softpipe (10.3) и LLVMpipe (10.2). Фактически, около 80% функций OpenGL 4.x реализовано в Mesa 17.3 (см. Mesamatrix). В Mesa 12.0 представлен новый Intel Rasterizer OpenSWR, обладающий значительными преимуществами в кластерах при работе с большими наборами данных. Он больше ориентирован на инженерную визуализацию, чем на игровые или художественные изображения, и может работать только на процессорах x86. При этом поддерживается OpenGL 3.1+. В некоторых примерах были зафиксированы значения ускорения от 29 до 51 относительно LLVMPIPE. Поддержка OpenGL 3.3+ для OpenSWR появилась в Mesa 17.1. VirGL – это растеризатор для виртуальных машин, реализованный в Mesa 11.1 с 2015 года с поддержкой OpenGL 3.3 и представленный в Mesamatrix начиная с Mesa 18. В новой версии Mesa 18.2 он обеспечивает большую поддержку, чем другие, для OpenGL 4.3 и OpenGL ES 3.2. Около 80% функций OpenGL 4.4 и 4.5 также готовы к использованию. Разработка Vulkan началась с проектов GSOC 2018. Текущее состояние virGL в Mesamatrix – полная поддержка OpenGL 4.6+ и OpenGL ES 3.2+ с необходимым программным обеспечением Linux. D3d12 – это проект Microsoft для эмуляции OpenGL 3.3+ и OpenCL 1.2+ с использованием Direct3D 12 в WSL2. D3D12 включен в Mesa 21.0.

Мега драйверы

Идея объединения нескольких драйверов в один "мега" драйвер была предложена Эммой Анхолт. Это позволяет использовать единый экземпляр общего кода Mesa для нескольких драйверов (вместо его дублирования в каждом драйвере по отдельности) и обеспечивает более высокую производительность по сравнению с отдельной общей библиотекой за счет устранения внутреннего библиотечного интерфейса. Отслеживающие модули состояний для VDPAU и XvMC стали отдельными библиотеками.

шейдер-db

shader db – это коллекция, состоящая примерно из 20 000 шейдеров, собранных из различных компьютерных игр и бенчмарков, а также скриптов для их компиляции и сбора статистики. Shader db предназначен для валидации оптимизаций. Было замечено, что неожиданно большое количество шейдеров не создается вручную, а генерируется. Это означает, что эти шейдеры изначально были написаны на HLSL, а затем преобразованы в GLSL с помощью программы-транслятора, такой как, например, HLSL2GLSL. Проблема заключается в том, что сгенерированный код часто далек от оптимального. Мэтт Тернер отметил, что гораздо проще исправить это в программе-трансляторе, чем возлагать эту задачу на компилятор Mesa при работе с такими громоздкими шейдерами. Shader db нельзя считать свободным и открытым программным обеспечением. Для его легального использования необходимо иметь лицензию на все компьютерные игры, содержащие эти шейдеры.

Архитектура программного обеспечения

Так называемые "драйверы графических устройств пользовательского режима" (UMD) в Mesa имеют очень мало общего с тем, что обычно подразумевается под драйвером устройства. Существует несколько отличий:
они предназначены для работы поверх дополнительных драйверов графических устройств режима ядра, которые, например, доступны как часть ядра Linux и находятся в исходном коде по адресу /drivers/gpu/drm/. Каждый UMD взаимодействует со своим аналогом в режиме ядра с помощью специфической библиотеки, названной libdrm, и общей библиотеки, также названной libdrm. В этом разделе рассматривается исключительно часть пользовательского режима, работающая поверх libdrm.
в них реализована конечная автоматная машина, как это определено, например, в спецификации OpenGL; эта реализация конечного автомата OpenGL может быть общей для нескольких UMD или нет.
они в значительной степени состоят из компилятора, который принимает на вход, например, GLSL и в конечном итоге выдает машинный код. Парсеры могут быть общими для нескольких UMD или специфичными для конкретного UMD.

Меса - промежуточные представления

Одной из целей Mesa является оптимизация кода для выполнения на соответствующем графическом процессоре. Другая – совместное использование кода. Вместо описания отдельных программных компонентов, в этой статье будет рассмотрено промежуточное представление, используемое в процессе компиляции и оптимизации. См. Абстрактное синтаксическое дерево (AST) и форму статического однократного присваивания (SSA-форма).

TGSI

Инфраструктура шейдеров Tungsten Graphics (TGSI) была представлена в 2008 году компанией Tungsten Graphics. Все UMD типа Gallium3D принимают TGSI. NIR сейчас является основной областью разработки, поэтому TGSI используется только для устаревших драйверов, таких как r300g, и будет выведена из эксплуатации через несколько лет. Код преобразования GLSL в TGSI будет удален в Mesa 22.2. По умолчанию для всех нативных драйверов NIR используется новый путь NIR -> TGSI, с преобразованием GLSL в NIR. Некоторые старые драйверы TGSI поддерживаются через этот путь кода NIR. В дальнейшем преобразование NIR в TGSI будет отменено только для нативных драйверов NIR.

LLVM IR

UMD radeonsi и llvmpipe не выдают машинный код, а вместо этого генерируют LLVM IR. Далее LLVM выполняет оптимизации и компиляцию в машинный код. Это значит, что также требуется установить определенную минимальную версию LLVM.

RADV ACO IR

RADV ACO использует промежуточное представление (IR), близкое к NIR, для оптимизации и генерации конечного двоичного кода для шейдеров Vulkan SPIR-V на графических процессорах Radeon (GCN 1+, также известный как GFX6+). По состоянию на версию 20.1.0, ACO используется только в RADV (драйвере Vulkan) и пока не используется в RadeonSI.

Компилятор GLSL от Mesa

Компилятор GLSL Mesa генерирует собственное промежуточное представление (IR). Поскольку требования к каждому драйверу к низкоуровневому IR (LIR) сильно различаются, он разделяет промежуточное представление на высокоуровневое (HIR) и низкоуровневое (LIR).

Галлий3D

Gallium3D — это набор интерфейсов и коллекция вспомогательных библиотек, предназначенных для упрощения программирования драйверов устройств для 3D-графических чипсетов, работающих в различных операционных системах и использующих различные API рендеринга или ускорения видео. Это бесплатное и открытое программное обеспечение для графических драйверов. Разработка Gallium3D началась в 2008 году в компании Tungsten Graphics, а реализация доступна как свободное и открытое программное обеспечение в составе Mesa 3D, размещенного на freedesktop.org. Основная цель Gallium3D — облегчить разработку драйверов, объединив дублирующийся код нескольких различных драйверов в единой точке и поддерживая современные аппаратные архитектуры. Это достигается за счет лучшего разделения труда, например, передачи управления памятью драйверу DRI ядра. Gallium3D является частью Mesa с 2009 года и в настоящее время используется в бесплатных и открытых графических драйверах для Nvidia (проект Nouveau), для графических процессоров AMD серий R300–R900, в драйвере Intel "Iris" для iGPU поколения 8+ и для других бесплатных и открытых драйверов GPU.

Отличия от классических графических драйверов

Gallium3D предоставляет унифицированный API, раскрывающий стандартные аппаратные функции, такие как шейдерные блоки, присутствующие на современном оборудовании. Таким образом, 3D API, такие как OpenGL 1.x/2.x, OpenGL 3.x, OpenVG, инфраструктура GPGPU или даже Direct3D (как это реализовано в слое совместимости Wine), потребуют только одного бэкэнда, называемого отслеживателем состояния, ориентированного на API Gallium3D. В отличие от этого, драйверы устройств DRI классического типа требуют отдельного бэкэнда для каждой аппаратной платформы, а для ряда других API требуется трансляция в OpenGL, что приводит к дублированию кода. Все проприетарные драйверы устройств, в силу своей закрытости, написаны именно так: например, AMD Catalyst реализует как OpenGL, так и Direct3D, а драйверы GeForce от производителя также имеют собственные реализации. При использовании Gallium3D, драйверы ядра Direct Rendering Manager (DRM) будут управлять памятью, а драйверы Direct Rendering Interface (DRI2) будут больше ориентированы на GPU-вычисления. В период перехода от управления режимами из пользовательского пространства к управлению из пространства ядра, некоторые драйверы Mesa 3D, такие как драйвер Radeon или драйверы Intel, оказались поддерживающими как DRI1, так и DRI2, и использовали DRI2, если он был доступен в системе. Gallium3D также требует определенного уровня поддержки шейдеров, которого нет на старых видеокартах, например, ATi r100 и r200, поэтому пользователям этих карт необходимо продолжать использовать Mesa 3D с DRI2 для работы с 3D-графикой.

Инфраструктура шейдера графики вольфрама

Инфраструктура шейдеров Tungsten Graphics (TGSI) — это промежуточное представление, подобное промежуточному представлению LLVM или новому стандартному переносимому промежуточному представлению (SPIR), предназначенное для использования с API Vulkan и OpenCL 2.1. Шейдеры, написанные на языке шейдерного программирования OpenGL, преобразуются/компилируются в TGSI, затем выполняются оптимизации, после чего шейдеры TGSI компилируются в шейдеры для набора команд используемого графического процессора. NIR — это новое уровневое представление в Mesa с полной поддержкой SPIR-V и с 2019 года является основной областью разработки для всех новых драйверов с поддержкой OpenGL 4.6.

Использование LLVM

Кроме того, благодаря модульной структуре Gallium3D, ведется работа над использованием компиляторного набора LLVM и созданием модуля для оптимизации шейдерного кода в реальном времени. Библиотека представляет каждую программу шейдера с помощью расширяемого бинарного промежуточного представления, называемого Tungsten Graphics Shader Infrastructure (TGSI), который LLVM затем преобразует в шейдеры GLSL, оптимизированные для целевого аппаратного обеспечения.

Усыновление

Несколько бесплатных и открытых драйверов графических устройств, которые были разработаны или разрабатываются на основе информации, полученной путем обратной разработки в условиях чистой комнаты, приняли модель драйверов, предоставляемую Gallium3D, например nouveau и другие (см. статью «Свободные и открытые драйверы графических устройств» для полного списка). Основная причина может заключаться в том, что модель драйверов Gallium3D позволяет уменьшить объем необходимого кода. Разумеется, поскольку этот код лицензирован под лицензией свободного программного обеспечения, любой может переписать его в любое время для реализации DRI или какой-либо другой модели драйверов.

История

Первоначальными авторами Gallium3D были Кит Уитвелл и Брайан Пол из Tungsten Graphics, приобретенной VMware в 2008 году.

Важные события

Осенью 2011 года существовало как минимум 10 известных, зрелых и функционирующих драйверов Gallium3D. Драйверы с открытым исходным кодом для графических карт Nvidia, разрабатываемые командой Nouveau, используют фреймворк Gallium3D. 2008 07 13: Разработка Nouveau ведется исключительно для фреймворка Gallium. Старый драйвер DRI был удален из основной ветки репозитория Mesa на Freedesktop.org. 2009 02 11: Ветвь Gallium 0.2 была объединена с основной ветвью Mesa. Разработка ведется в основной ветке Mesa. 2009 02 25: Gallium3D может работать как на ядрах Linux, так и на FreeBSD. 2009 05 01: Зак Русин из Tungsten Graphics добавил отслеживание состояния OpenVG в Mesa 3D, что обеспечивает аппаратное ускорение масштабируемой векторной графики любым драйвером на основе Gallium3D. 2009 07 17: Выпущена Mesa3D 7.5 – первая версия, включающая Gallium3D. 2010 09 10: Добавлена первоначальная поддержка графических процессоров Evergreen в драйвер r600g. 2010 09 21: Существует два драйвера Gallium3D для оборудования ATI: r300g и r600g, предназначенные для графических процессоров R300, R500 и R600 Evergreen соответственно. 2010 09 21: В код были внесены значительные изменения для поддержки Direct3D 10 и 11. В будущем это может предоставить возможность использования последних реализаций Direct3D в системах Linux. 2011 11 30: Драйверы Intel 965g и Cell Gallium были удалены из основной ветки Mesa как неподдерживаемые и неработоспособные. 2013 11 30: Mesa 10 с OpenGL 3.2, 3.3 и OpenCL 1.0+.

2014 11 18: В код были внесены значительные изменения для поддержки Direct3D 9. 2015 09 15: Mesa 11 с OpenGL 4.0, 4.1 и OpenCL 1.2 (неполная реализация).

2015 12 15: Mesa 11.1 – драйвер VIRGL для виртуальных машин с OpenGL 3.3.

2016 07 08: Mesa 12 с OpenGL 4.2, 4.3 и Vulkan 1.0 (Intel ANV и AMD RADV).

2016 11 01: Mesa 13 с OpenGL 4.4 и OpenGL ES 3.2.

2017 02 13: Mesa 17.0 с OpenGL 4.5 и драйвером freedreno с OpenGL 3.0 и 3.1.

2017 05 10: Mesa 17.1 – OpenGL 4.2+ для Intel Ivy Bridge (больше, чем драйвер Intel для Windows), OpenGL 3.3+ для Intel Open SWR Rasterizer (важно для кластерных компьютеров для масштабного моделирования).

2017 12 08: Mesa 17.3 – AMD Vulkan Driver RADV полностью соответствует тесту Khronos на Vulkan 1.0.

2018 05 18: Mesa 18.1 с Vulkan 1.1 (Intel ANV и AMD RADV).

2018 09 07: Mesa 18.2 с OpenGL 4.3 для Soft Driver VIRGL (важно для виртуальных машин в облачных кластерных компьютерах), OpenGL ES 3.1 для Freedreno с Adreno A5xx.

2019 06 11: Выпущена Mesa 19.1 с графическим драйвером Intel нового поколения 'iris' для iGPU 8-го поколения и выше.

2019 12 11: Выпущена Mesa 19.3 с OpenGL 4.6 для Intel i965 с Gen 7+ и опциональным Iris Gen 8+.

2020 03 18: Выпущена Mesa 20.0 с OpenGL 4.6 для AMD GCN и Vulkan 1.2 для Intel.

2020 05 27: Выпущена Mesa 20.1 с поддержкой векторизации NIR и поддержкой общей виртуальной памяти для OpenCL в Clover.

2020 11 30: Mesa 20.3 – полная поддержка OpenCL 1.2 в Clover.

2023 09 30: Mesa 23.2 с Apple Asahi OpenGL 3.1 и OpenGL ES 3.0, RADV поддерживает трассировку лучей в AMD RDNA 2 и 3, Intel Anvil – поддержку декодирования H.265 в Vulkan.

История

Инициатор проекта Брайан Пол был увлеченным любителем компьютерной графики. Ему пришла в голову идея реализовать простую библиотеку 3D-графики с использованием OpenGL API, которую он мог бы использовать вместо VOGL (очень простая GL-подобная библиотека). Начиная с 1993 года, он потратил восемнадцать месяцев на разработку в свободное время, прежде чем опубликовал программное обеспечение в Интернете в феврале 1995 года. Программа была хорошо принята, и люди начали вносить свой вклад в её развитие. Изначально Mesa осуществляла рендеринг всей 3D-компьютерной графики на центральном процессоре. Однако внутренняя архитектура Mesa была спроектирована с возможностью подключения к графическому процессору для ускорения 3D-рендеринга. На этом первом этапе рендеринг выполнялся опосредованно через сервер отображения, что приводило к определенным накладным расходам и заметному отставанию скорости от теоретического максимума. Diamond Monster 3D, использующий чипсет Voodoo Graphics, был одним из первых 3D-устройств, поддерживаемых Mesa. Первая полноценная поддержка графического оборудования была добавлена в Mesa в 1997 году на основе Glide API для новых на тот момент графических карт 3dfx Voodoo I/II и их преемников. Основной проблемой использования Glide в качестве слоя ускорения было то, что Glide работала в полноэкранном режиме, что подходило только для компьютерных игр. Более того, Glide блокировала память экрана, из-за чего сервер отображения не мог выполнять другие задачи графического интерфейса.