Mesa , также называемая Mesa3D и библиотекой 3D-графики Mesa , представляет собой реализацию OpenGL , Vulkan и других спецификаций графического API с открытым исходным кодом . Mesa преобразует эти спецификации в драйверы графического оборудования конкретного поставщика.
Его наиболее важными пользователями являются два графических драйвера, в основном разработанные и финансируемые Intel и AMD для соответствующего оборудования (AMD продвигает свои драйверы Mesa Radeon и RadeonSI вместо устаревшего AMD Catalyst , а Intel поддерживает только драйвер Mesa). Собственные графические драйверы (например, драйвер Nvidia GeForce и Catalyst) заменяют все Mesa, обеспечивая собственную реализацию графического API. Попытка написать драйвер Mesa Nvidia под названием Nouveau с открытым исходным кодом разрабатывается в основном сообществом.
Помимо 3D-приложений, таких как игры, современные серверы отображения ( X.org’s Glamour или Wayland ’s Weston ) используют OpenGL/ EGL ; поэтому вся графика обычно проходит через Mesa.
Mesa размещается на сайте freedesktop.org и была инициирована в августе 1993 года Брайаном Полом , который до сих пор активно участвует в проекте. Впоследствии Mesa получила широкое распространение и теперь содержит многочисленные материалы от различных людей и корпораций со всего мира, в том числе от производителей графического оборудования группы Khronos , которые администрируют спецификацию OpenGL. Что касается Linux, то разработка также частично осуществлялась за счет краудфандинга . [3]
Mesa известна как реализация графических API . Исторически основным API, реализованным Mesa, является OpenGL вместе с другими спецификациями, связанными с Khronos Group (такими как OpenVG , OpenGL ES или недавно EGL ). Но Mesa может реализовывать и другие API, и это действительно произошло с Glide (устарело) и Direct3D 9 с июля 2013 года. [5] Mesa также не является специфичной для Unix-подобных операционных систем: например, в Windows Mesa предоставляет API OpenGL поверх DirectX.
Mesa реализует уровень трансляции между графическим API, таким как OpenGL, и драйверами графического оборудования в ядре операционной системы. Поддерживаемая версия различных графических API зависит от драйвера, поскольку каждый драйвер оборудования имеет свою собственную реализацию (и, следовательно, статус). Это особенно актуально для «классических» драйверов, в то время как драйверы Gallium3D имеют общий код, который имеет тенденцию унифицировать поддерживаемые расширения и версии.
Mesa поддерживает матрицу поддержки со статусом текущего соответствия OpenGL [6] [7], визуализированную на mesamatrix.net . Mesa 10 соответствует OpenGL 3.3 для аппаратного обеспечения графических процессоров Intel, AMD/ATI и Nvidia. Mesa 11 была анонсирована с некоторыми драйверами, совместимыми с OpenGL 4.1. [8]
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-Label) и экспериментальная поддержка AMD Vulkan 1.0 через драйвер сообщества. РАДВ. OpenGL ES 3.2 возможен с Intel Skylake (Gen9). [9]
Первая стабильная версия 2017 года — 17.0 (подсчет нового года). [10] [11] [12] Готовые функции сертифицированы OpenGL 4.5, OpenGL 4.5 для Intel Haswell, [13] [14] OpenGL 4.3 для Nvidia Maxwell и Pascal (GM107+). [15] Огромный прирост производительности был измерен при использовании Maxwell 1 (GeForce GTX 750 Ti и более с GM1xx). Карты Maxwell-2 (GeForce GTX 980 и более с GM2xx) разогнаны без информации Nvidia. [16]
Набор тестов Khronos CTS для OpenGL 4.4, 4.5 и OpenGL ES 3.0+ уже доступен (24 января 2017 г.) с открытым исходным кодом, и все тесты для Mesa 13 и 17 теперь возможны без каких-либо затрат. [17]
Вторая стабильная версия 2017 года, 17.1.0, вышла 10 мая 2017 года с некоторыми интересными улучшениями. OpenGL 4.2+ для Intel Ivy Bridge и OpenGL 3.3+ для Intel Open SWR Rasterizer — вот два основных момента. [18] [19]
Благодаря модульной природе OpenGL, Mesa может поддерживать расширения из более новых версий OpenGL, не заявляя о полной поддержке таких версий. Например, в июле 2016 года Mesa поддерживала OpenGL ES 3.1, а также все расширения OpenGL ES 3.2, кроме пяти, а также ряд расширений, не входящих ни в одну версию OpenGL или OpenGL ES. [20]
Третья версия 17.2 доступна с сентября 2017 года и включает в себя некоторые новые функции OpenGL 4.6 и улучшения скорости в 3D для Intel и AMD. Только 1,4% тестов OpenGL 4.5 в Nouveau для Kepler завершаются неудачей. [21]
4-я версия 17.3 готова с декабря 2017 года. Доступно множество улучшений во многих драйверах. OpenGL 4.6 почти полностью доступен (Spir-V еще не готов). Драйвер AMD Vulkan RADV теперь полностью соответствует требованиям Khronos-Test. [22]
Первая версия 2018 года — 18.0 и доступна с марта 2018 года по той же схеме в 2017 году. [23] Полная поддержка OpenGL 4.6 не готова, но многие функции и улучшения были успешно протестированы в RC3. Поддержка 10-битного процессора Intel i965 в цвете также является изюминкой. [24] Новинкой является поддержка Intel Cannon Lake и AMD Vega с актуальной версией Linux. Чипы AMD Evergreen (RV800 или R900) близки к поддержке OpenGL 4.5. Старые чипы AMD R600 или RV700 могут поддерживать только OpenGL 3.3 с некоторыми функциями OpenGL 4.x. Freedreno — это драйвер для оборудования Adreno, близкий к поддержке 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 также внесла значительные улучшения в 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. Дополнительные сведения о Вулкане см. в Mesamatrix. [25]
Четвертая версия 2018 года — 18.3, выпущенная как стабильная версия 18.3.1 в декабре 2018 года. Основными частями являются многие подробные функции и поддержка нового оборудования. Полная поддержка OpenGL 4.6 не готова. [26] [27]
Первая версия 2019 года – 19.0, выпущенная в марте. Полноценная поддержка OpenGL 4.6 не готова, но множество улучшений на этом пути есть во всех драйверах. [28] [29]
Вторая версия 2019 года — 19.1. Переход TGSI на NIR является здесь одной из основных особенностей на пути к OpenGL 4.6 с Spir-V и другими OpenCL. RadeonSI хорошо работает в версии для разработчиков с NIR. [30]
Третья версия 2019 года — 19.2. OpenGL 4.6 готов к бета-версии для нового драйвера Intel Iris. [31]
4-я версия 2019 года — 19.3. OpenGL 4.6 готов для Intel i965 и необязателен для нового драйвера Iris. [32]
Первая версия 2020 года — 20.0. Vulkan 1.2 готов к использованию AMD RADV и Intel ANV. Intel Iris используется по умолчанию для Intel Broadwell Gen 8+. [33] [34] Драйвер RadeonSI по умолчанию переключился на использование NIR вместо TGSI.
Вторая версия 2020 года — 20.1. Многие улучшения готовы во многих драйверах. Zink — это новый виртуальный драйвер для OpenGL поверх Vulkan. [35]
Третья версия 2020 года — 20.2. OpenGL 3.0 для Zink — это одна из новых функций. LLVMpipe будет поддерживать OpenGL 4.3+ (4.5+ в версии 20.3). ARM Panfrost в основном улучшен за счет множества модулей. Общая виртуальная память возможна для OpenCL в Nouveau с Pascal и выше. [36] [37] [38]
4-я версия 2020 года — 20.3. v3d и v3dv — это новые драйверы для OpenGL и Vulkan 1.0 с оборудованием Broadcom, таким как Raspberry Pi 4. OpenCL 1.2 полностью поддерживается в модуле клевера. Zink поддерживает OpenGL 3.3+. Виртуальный драйвер LLVMpipe теперь поддерживает OpenGL 4.5+, планируется версия 4.6. Lavapipe (первоначально называвшийся Vallium [39] ) как дерево Vulkan из LLVMpipe объединено. [40] [41] [42] [43] [44]
В Mesa 21.0 d3d12 будет объединен с OpenGL 3.0–3.3. Microsoft и Collabora разрабатывают новую эмуляцию d3d12 в WSL2 для Windows 10 с Direct 3D 12. OpenCL 1.2 также предназначен для d3d12. Ускорение в 2–5 раз реализовано в Benchmark SPECviewperf с улучшенным кодом OpenGL. [45] [46] [47] [48] Многие функции Mesa 21.0 повышают производительность. [49] Новая версия 21.0.0 доступна для общественности с 11 марта 2021 года.
Mesa 21.1 — второй выпуск 2021 года. [50] Для Zink доступны OpenGL 4.6+ и OpenGL ES 3.1+. AMD Driver 600g можно изменить на NIR с дополнительными возможностями для старых карт Radeon HD 5000 и 6000. [51] Qualcomm Turnip достигает версии Vulkan 1.1+ и программной эмуляции Lavapipe Vulkan 1.1+. Драйвер графического процессора Google VirtIO Venus с Vulkan 1.2+ объединен в экспериментальном состоянии с низкой производительностью в главном дереве Mesa. [52]
Mesa 21.2 — третий выпуск 2021 года. Драйвер Google Virtual Vulkan IO Driver Venus будет официально представлен с полной поддержкой Vulkan 1.2+ (подробнее mesamatrix). ARM Panfrost: доступна поддержка OpenGL ES 3.1+, а panVK — новый драйвер Vulkan. Первоначальная поддержка началась для ARM Apple M1 с новым драйвером Asahi. 21.2 доступна с 4 августа 2021 года. [53]
Старый план состоит в том, чтобы разделить старые драйверы на классическое дерево с множеством преимуществ в программировании, поддержке и исправлении ошибок для современной части Gallium 3D. Одной из проблем здесь является Intel i965 с поддержкой популярного старого оборудования для Intel Haswell, а ранее также с поддержкой Windows 10. [54] Новый драйвер Gallium3D Crocus для графики Intel Gen 4 для Haswell находится в разработке, чтобы завершить область Gallium3D с возможным разделением в следующем году 2021 года. Crocus доступен в качестве опции в версии 21.2. [55] Желтая ветка предназначена для старых драйверов без функций Gallium 3D, таких как Radeon R200, Intel i915 и 965 с актуальной версией 21.3.9. [56]
В версии 22.0 Classic драйверы удалены. Vulkan 1.3 доступен для Intel Anvil и AMD RADV. [57]
Microsoft представляет новый драйвер «Дюжина» для WSL 2 на ранней стадии разработки как Vulkan вместо d3d12 в Mesa 22.1. [58]
RustiCL доступен в версии 22.3 с официальной совместимостью OpenCL 3.0 для графики Intel XE. Производительность равна и даже выше, чем у AMD ROCm с картой AMD 6700 XT. [59] [60]
Основной целью разработки Mesa 23.0 была трассировка лучей для Vulkan. [61] [62]
Microsoft разрабатывает драйвер Dozen для Vulkan в WSL. Vulkan 1.0+ с 80% 1.1 и 1.2 будет доступен в Mesa 23.2 после задержки до 23.1 (см. mesamatrix). [63] RustiCL для оборудования AMD доступен в версии 23.1. [64]
VirGL для виртуальных машин переходит с Mesa 23.2 на OpenGL 4.6. [65] Apple Asahi для Apple Arm Machines переходит с OpenGL 2.1 на 3.1 с 90% функций OpenGL 3.2 и 3.3 и OpenGL ES 2.0 на 3.0. [66]
Microsoft поддерживает WSL OpenGL 4.6+ в Mesa 24.0 (в Mesa 23.3: 4.3+) с драйвером прямой трансляции 12. [67]
Группа 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 и более ранних версиях. [105]
Поскольку Gallium3D принимает TGSI, Vulkan принимает SPIR-V ( версия стандартного переносимого промежуточного представления «V», как в «Vulkan»).
Intel выпустила реализацию драйвера Vulkan для своего оборудования в день официального выпуска спецификации, но она была включена в основной состав только в апреле и поэтому стала частью Mesa 12.0, выпущенной в июле 2016 года. Хотя драйвер i965 уже не был написан в соответствии с спецификациям Gallium3D, для драйвера Vulkan еще меньше смысла подключать его поверх Gallium3D. Точно так же нет никаких технических причин использовать NIR, но сотрудники Intel реализовали свой драйвер Vulkan именно таким образом. [106]
Ожидается, что собственный драйвер Vulkan от AMD, выпущенный в марте [ когда? ] , и было объявлено, что в будущем оно будет выпущено как бесплатное программное обеспечение с открытым исходным кодом и будет включено в Mesa, также отказывается от Gallium3D. [107]
RADV — это бесплатный проект для AMD, доступный начиная с версии 13. [9] Совместимость с Khronos-Test появилась в версии 17.3. Актуально — полная поддержка Vulkan 1.0 и 1.1, начиная с Mesa 18.1.
Nvidia выпустила свой собственный драйвер GeForce с поддержкой Vulkan в день запуска, а Imagination Technologies (PowerVR), Qualcomm (Adreno) и ARM (Мали) сделали то же самое или, по крайней мере, анонсировали собственные драйверы Vulkan для Android и других операционных систем. Но когда и появятся ли дополнительные бесплатные реализации Vulkan с открытым исходным кодом для этих графических процессоров, еще неизвестно.
Программный драйвер Mesa VIRGL запускает разработку Vulkan в 2018 году с проектов GSOC по поддержке виртуальных машин. [108]
Lavapipe — это драйвер программного обеспечения Vulkan на базе ЦП, брат LLVMpipe. Mesa версии 21.1 поддерживает Vulkan 1.1+. [109]
Google представляет драйвер Venus Vulkan для виртуальных машин в Mesa 21.1 с полной поддержкой Vulkan 1.2+. [52]
Qualcomm Turnip и Broadcom v3dv — это новые драйверы для оборудования Qualcomm Adreno и Broadcom Raspberry 4. Turnip — это Vulkan, брат freedreno для OpenGL. V3dv поддерживает Vulkan 1.0+, начиная с Mesa 20.3. В версии 21.1 Turnip поддерживает Vulkan 1.1+. [110] [111] [112]
Panfrost PanVK для ARM Mali находится на пути к Vulkan 1.1, но с Mesa 22.0 доступна только стабильная версия 1.0. [113]
Project Dozen соединяет Direct 3D 12 (d3d12) с Vulkan для эмуляции Linux WSL2 в Windows 10 и 11. В Mesa 23.2 поддерживается полностью совместимый Vulkan 1.0 и 80% версий 1.1 и 1.2 (mesamatrix). [114] [115]
Своего рода барьер памяти, отделяющий один буфер от остальной памяти, называется забором. Ограждения предназначены для того, чтобы гарантировать, что буфер не будет перезаписан до завершения операций рендеринга и отображения. Неявное ограждение используется для синхронизации между графическими драйверами и оборудованием графического процессора. Ограждение сигнализирует, когда буфер больше не используется одним компонентом, поэтому его можно использовать или повторно использовать другим. Раньше ядро Linux имело неявный механизм ограждения, при котором ограждение напрямую прикреплялось к буферу (см. дескрипторы GEM и FD), но пользовательское пространство об этом не знает. Явное ограждение предоставляет ограждения пользовательскому пространству, где пользовательское пространство получает ограждения как от подсистемы Direct Rendering Manager (DRM), так и от графического процессора. Явное ограждение требуется для Vulkan и дает преимущества при трассировке и отладке.
В ядре Linux 4.9 в mainline добавлена платформа синхронизации Android. [116]
Generic Buffer Management (GBM) — это API, который предоставляет механизм выделения буферов для рендеринга графики, привязанный к Mesa. GBM предназначен для использования в качестве собственной платформы для EGL на DRM или openwfd. Создаваемый им дескриптор можно использовать для инициализации EGL и создания целевых буферов рендеринга. [117]
Mesa GBM — это абстракция API-интерфейсов управления буфером, специфичных для графического драйвера (например, различных библиотек libdrm_*), реализованных внутри системы путем вызова драйверов графического процессора Mesa.
Например, композитор Wayland Weston выполняет рендеринг с использованием OpenGL ES 2, который инициализируется путем вызова EGL. Поскольку сервер работает на «голом драйвере KMS », он использует платформу EGL DRM, которую действительно можно было бы назвать платформой GBM, поскольку она опирается на интерфейс Mesa GBM.
На XDC2014 сотрудник Nvidia Энди Ритгер предложил улучшить EGL, чтобы заменить GBM. [118] Это не было воспринято сообществом положительно, и Nvidia в конце концов передумала, [119] и избрала другой подход.
Существует три возможных способа выполнения вычислений, необходимых для кодирования и декодирования видеопотоков:
Например, Nouveau , который был разработан в рамках Mesa, но также включает в себя компонент ядра Linux, который разрабатывается как часть ядра Linux, поддерживает ASIC под брендом PureVideo и обеспечивает доступ к ним через VDPAU и частично через XvMC . . [120]
Бесплатный драйвер Radeon поддерживает Unified Video Decoder и Video Coding Engine через VDPAU и OpenMAX. [121]
V4L2 — это интерфейс между ядром и пользовательским пространством для битовых потоков видео, передаваемых веб-камерами или ТВ-тюнерами.
Из-за проблем с патентами , связанных с изменением версии видеокодеков H.264 , H.265 и VC-1 , Fedora Linux отключила поддержку ускорения VAAPI для тех, кто использовал ее сборку Mesa в сентябре 2022 года. [122]
Доступные бесплатные драйверы устройств с открытым исходным кодом для графических чипсетов «контролируются» Mesa (поскольку существующие бесплатные реализации API с открытым исходным кодом разрабатываются внутри Mesa). В настоящее время существует две платформы для написания графических драйверов: «классическая» и Gallium3D. [123] Обзор некоторых (но не всех) драйверов, доступных в Mesa, представлен на mesamatrix.net .
Существуют драйверы устройств для карт AMD/ATI R100–R800, Intel и Nvidia с 3D-ускорением. Ранее существовали драйверы для процессоров IBM/Toshiba/Sony Cell для наборов микросхем PlayStation 3 , S3 Virge и Savage, наборов микросхем VIA, Matrox G200 и G400 и других. [124]
Бесплатные драйверы с открытым исходным кодом конкурируют с проприетарными драйверами с закрытым исходным кодом. В зависимости от наличия документации по оборудованию и рабочей силы бесплатные драйверы с открытым исходным кодом более или менее отстают в поддержке 3D-ускорения нового оборудования. Кроме того, производительность 3D-рендеринга обычно была значительно ниже, за некоторыми заметными исключениями. [125] [126] [127] [128] Сегодня это по-прежнему справедливо для Nouveau для большинства графических процессоров NVIDIA, в то время как на графических процессорах AMD Radeon открытый драйвер теперь в основном соответствует или превосходит производительность проприетарного драйвера.
В то время, когда 3D- видеокарты стали более распространенными для ПК, люди, частично поддерживаемые некоторыми компаниями, начали работать над добавлением в Mesa большей поддержки аппаратного ускорения 3D-рендеринга. [ когда? ] Инфраструктура прямого рендеринга (DRI) была одним из подходов к взаимодействию Mesa, OpenGL и других библиотек API 3D-рендеринга с драйверами устройств и оборудованием. После достижения базового уровня удобства использования в Mesa была официально добавлена поддержка DRI. Это значительно расширило диапазон доступной аппаратной поддержки при использовании библиотеки Mesa. [129]
После адаптации к DRI библиотека Mesa, наконец, взяла на себя роль внешнего компонента полномасштабной инфраструктуры OpenGL с различными внутренними компонентами, которые могли предлагать различную степень аппаратной поддержки 3D, не отказываясь при этом от полной возможности программного рендеринга. В общей системе использовалось множество различных программных компонентов. [129]
Хотя конструкция требует тщательного взаимодействия всех этих компонентов, интерфейсы между ними относительно фиксированы. Тем не менее, поскольку большинство компонентов, взаимодействующих со стеком Mesa, имеют открытый исходный код, экспериментальная работа часто проводится путем изменения сразу нескольких компонентов, а также интерфейсов между ними. Если такие эксперименты окажутся успешными, их можно будет включить в следующий основной или второстепенный выпуск. Это относится, например, к обновлению спецификации DRI, разработанной в период 2007-2008 годов. Результатом этого эксперимента является DRI2, работающий без блокировок и с улучшенной поддержкой заднего буфера. Для этого была создана специальная git- ветвь Mesa. [130]
DRI3 поддерживается драйвером Intel с 2013 года [131] [132] и используется по умолчанию в некоторых дистрибутивах Linux с 2016 года [133] для включения поддержки Vulkan и многого другого. Он также используется по умолчанию на оборудовании AMD с конца 2016 года (X.Org Server 1.18.3 и новее). [134]
Mesa также содержит реализацию программного рендеринга , называемую swrast , которая позволяет шейдерам запускаться на ЦП в качестве запасного варианта при отсутствии аппаратных графических ускорителей. Программный растеризатор Gallium известен как softpipe или создан с поддержкой LLVM llvmpipe , который генерирует код ЦП во время выполнения. [135] [136] Начиная с 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. [137] С другой стороны, теперь поддерживается OpenGL 3.1+. [138] В некоторых примерах были измерены значения ускорения от 29 до 51, относящиеся к LLVMPIPE. [139] 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. [140] [141] [142 ] [108] [143] [144] [145]
Фактическое состояние virGL в Mesamatrix — это полная поддержка OpenGL 4.6+ и OpenGL ES 3.2+ с некоторым необходимым программным обеспечением Linux. [146]
D3d12 — это проект Microsoft для эмуляции WSL2 OpenGL 3.3+ и OpenCL 1.2+ с Direct3D 12. D3D12 объединен в версии 21.0. [45] Фактическое состояние в Mesa 23.1 — OpenGL 4.2+ с почти 4.4+ и OpenGL ES 3.1+.
Venus — это новый драйвер графического процессора Vulkan VirtIO для графического процессора в виртуальных машинах от Google. Венера добавлена в версию 21.1 и представлена для публики в версии 21.2. [52] Венера поддерживает Vulkan 1.3+ в Mesa 23.1. Аппаратный минимум — Vulkan 1.1 с некоторыми расширениями. [147]
Идея объединения нескольких драйверов в один «мега» была предложена Эммой Анхольт. Он позволяет использовать одну копию общего кода Mesa среди нескольких драйверов (вместо того, чтобы он существовал в каждом драйвере отдельно) и обеспечивает лучшую производительность, чем отдельная общая библиотека, за счет удаления внутреннего интерфейса библиотеки. [148] Трекеры состояния для VDPAU и XvMC стали отдельными библиотеками. [149]
Shader-db — это коллекция из около 20 000 шейдеров , собранных из различных компьютерных игр и тестов, а также некоторых скриптов для их компиляции и сбора статистики. Shader-db предназначен для проверки оптимизации.
Было замечено, что неожиданное количество шейдеров не написаны вручную, а генерируются. Это означает, что эти шейдеры изначально были написаны на HLSL , а затем переведены на GLSL с помощью какой-либо программы-переводчика, например, HLSL2GLSL . Проблема в том, что сгенерированный код зачастую далек от оптимального. Мэтт Тернер сказал, что гораздо проще исправить это в программе-переводчике, чем заставлять компилятор Mesa нести бремя работы с такими раздутыми шейдерами.
Shader-db не может считаться бесплатным программным обеспечением с открытым исходным кодом. Чтобы легально использовать его, необходимо иметь лицензию на все компьютерные игры, в состав которых входят шейдеры.
Так называемые «драйверы графических устройств пользовательского режима» (UMD) в Mesa имеют очень мало общего с тем, что обычно называют драйвером устройства . Есть несколько отличий:
/drivers/gpu/drm/
Каждый UMD взаимодействует со своим аналогом в режиме ядра с помощью специальной библиотеки с именем libdrm_special. и общий вариант с именем libdrm . Этот раздел должен рассматривать исключительно часть пользовательского режима над libdrm.Одной из целей Mesa является оптимизация кода, который должен выполняться соответствующим графическим процессором. Другой вариант — совместное использование кода. Вместо документирования частей программного обеспечения в этой статье будут рассмотрены промежуточные представления, используемые в процессе компиляции и оптимизации. См. Абстрактное синтаксическое дерево (AST) и Статическую форму однократного присваивания (форму SSA).
SPIR-V — это определенная версия Standard Portable Intermediate Representation . Идея состоит в том, что графические приложения выводят SPIR-V вместо GLSL. В отличие от последнего, SPIR-V является двоичным, чтобы избежать различий в реализации между интерфейсами компилятора GLSL разных реализаций драйверов, поскольку это было основным источником несовместимости приложений и ошибок. Также двоичный файл SPIR-V обычно подвергался некоторой общей оптимизации. Двоичное представление SPIR-V также предлагает некоторую степень запутывания, что может понравиться некоторым поставщикам программного обеспечения как форма защиты интеллектуальной собственности; однако SPIR-V содержит достаточно информации для анализа, и существуют инструменты, которые преобразуют SPIR-V обратно в высококачественный, удобочитаемый код высокого уровня. UMD необходимо применять только оптимизации, специфичные для поддерживаемого оборудования.
NIR (Новое внутреннее представление) было введено для преодоления ограничений TGSI. [150] [151] NIR был расширен в последних и актуальных выпусках как основа поддержки Spir-V и с 2016 года является основной областью разработки. LLVMpipe, i965, RadeonSI, Nouveau, freedreno, vc4 заменены на NIR с TGSI. RADV, Zink и другие новые драйверы начинаются с NIR. Все драйверы с полной поддержкой OpenGL 4.6 связаны с NIR поддержкой SPIR-V. Также AMD R600 имеет форк с NIR для лучшей поддержки серий HD5000 и HD6000. Эта опция для r600 используется по умолчанию, начиная с Mesa 21.0.
Инфраструктура шейдеров Tungsten Graphics (TGSI) была представлена в 2008 году компанией Tungsten Graphics. Все UMD в стиле Gallium3D используют TGSI. NIR теперь является основной областью разработки, поэтому TGSI предназначен только для старых драйверов, таких как инфраструктура по умолчанию r300g, и через несколько лет будет устаревшим.
Код GLSL-To-TGSI будет удален в Mesa 22.2. По умолчанию используется более новая версия NIR-to-TGSI с GLSL-to-NIR для всех собственных драйверов NIR. Этот путь кода NIR поддерживает некоторые старые драйверы TGSI. Позже NIR-To-TGSI станет устаревшим только для собственных драйверов NIR. [152]
UMD radeonsi
и llvmpipe
выводят не машинный код, а вместо этого LLVM IR. С этого момента LLVM выполняет оптимизацию и компиляцию в машинный код. Это означает, что также должна быть установлена определенная минимальная версия LLVM.
RADV ACO использует собственный IR, близкий к NIR, для оптимизации и генерации конечного двоичного кода для шейдеров Vulkan SPIR-V поверх графических процессоров Radeon (GCN 1+, также известный как GFX6+). Начиная с версии 20.1.0 ACO используется только в RADV (драйвер Vulkan), а не в RadeonSI.
Компилятор GLSL компании Mesa генерирует собственный IR. Поскольку требования к каждому драйверу сильно отличаются от требований LIR, он различает HIR (IR высокого уровня) и LIR (IR низкого уровня).
Gallium3D — это набор интерфейсов и набор вспомогательных библиотек [154] , предназначенных для упрощения программирования драйверов устройств для наборов микросхем 3D-графики для нескольких операционных систем, API-интерфейсов рендеринга или ускорения видео. Это бесплатное программное обеспечение драйвера графического устройства с открытым исходным кодом.
Матрица функций представлена на mesamatrix.net .
Разработка Gallium3D началась в 2008 году в компании Tungsten Graphics, [155] и ее реализация доступна в виде бесплатного программного обеспечения с открытым исходным кодом как часть Mesa 3D, размещенного на сайте freedesktop.org . Основная цель — упростить разработку драйверов, объединить в одной точке дублированный код нескольких разных драйверов и обеспечить поддержку современных аппаратных архитектур. Это достигается за счет лучшего разделения труда, например, путем передачи управления памятью драйверу DRI ядра .
Gallium3D является частью Mesa с 2009 года [156] и в настоящее время используется бесплатным графическим драйвером с открытым исходным кодом для Nvidia ( проект nouveau ), [157] [158] для AMD R300 – R900 , [159] [160] [161] Драйвер Intel Iris для iGPU поколения 8+ [162] и для других бесплатных драйверов устройств графического процессора с открытым исходным кодом .
Gallium3D упрощает программирование драйверов устройств, разделяя драйвер графического устройства на три части. Это достигается за счет введения двух интерфейсов : интерфейса отслеживания состояния Gallium3D и интерфейса Gallium3D WinSys . Эти три компонента называются:
Gallium3D предоставляет унифицированный API, предоставляющий стандартные аппаратные функции, такие как шейдерные блоки, имеющиеся на современном оборудовании. Таким образом, 3D API, такие как OpenGL 1.x/2.x, OpenGL 3.x, OpenVG , инфраструктура GPGPU или даже Direct3D (как обнаружено на уровне совместимости Wine ), потребуют только одного серверного компонента, называемого трекером состояния. ориентирован на API Gallium3D. Напротив, драйверы устройств DRI в классическом стиле требуют разного внутреннего интерфейса для каждой аппаратной платформы, а некоторые другие API требуют перевода в OpenGL за счет дублирования кода. [163] [164] [165] Все драйверы устройств поставщиков из-за их проприетарного характера и с закрытым исходным кодом написаны таким образом, что означает, что, например, AMD Catalyst реализует как OpenGL , так и Direct3D , а драйверы поставщиков для GeForce имеют свои реализации.
В Gallium3D драйверы ядра Direct Rendering Manager (DRM) будут управлять памятью, а драйверы Direct Rendering Interface (DRI2) будут больше ориентированы на обработку графического процессора. [166] В течение периода перехода от настройки режима пользовательского пространства к настройке режима пространства ядра некоторые драйверы Mesa 3D, такие как драйвер Radeon или драйверы Intel, в конечном итоге стали поддерживать как DRI1, так и DRI2, и использовали DRI2, если он доступен в системе. Gallium3D дополнительно требует уровня поддержки шейдеров, который недоступен на старых картах, таких как, например, ATi r100-r200, поэтому пользователям этих карт необходимо продолжать использовать Mesa 3D с DRI2 для использования 3D.
Инфраструктура шейдеров графики вольфрама ( TGSI ) — это промежуточное представление , такое как промежуточное представление LLVM или новое стандартное переносимое промежуточное представление (SPIR), которое будет использоваться Vulkan API и OpenCL 2.1. Шейдеры, написанные на языке шейдеров OpenGL, транслируются/компилируются в TGSI, затем производятся оптимизации, а затем шейдеры TGSI компилируются в шейдеры для набора команд используемого графического процессора.
NIR — это новое представление слоев в Mesa с полной поддержкой SPIR-V, которое с 2019 года является основной областью разработки всех новых драйверов с поддержкой OpenGL 4.6.
Кроме того, используя модульную структуру Gallium3D, предпринимаются попытки использовать набор компиляторов LLVM и создать модуль для оптимизации кода шейдеров на лету. [167]
Библиотека представляет каждую программу шейдера с помощью расширяемого двоичного промежуточного представления, называемого Tungsten Graphics Shader Infrastructure (TGSI), которое LLVM затем преобразует в шейдеры GLSL , оптимизированные для целевого оборудования.
Несколько бесплатных драйверов графических устройств с открытым исходным кодом , которые были написаны или пишутся на основе информации, полученной в результате обратного проектирования в «чистой комнате» , приняли модель драйвера, предоставленную Gallium3D, например nouveau и других ( см. Свободные графические устройства с открытым исходным кодом). драйвер для получения полного списка ). Основная причина может заключаться в том, что модель драйвера Gallium3D уменьшает объем кода, который необходимо написать. [ оригинальное исследование? ] Конечно, будучи лицензированным по лицензии свободного программного обеспечения, этот код может в любое время быть переписан кем угодно для реализации DRI- или какой-либо другой модели драйвера.
Первоначальными авторами Gallium3D были Кейт Уитвелл и Брайан Пол из Tungsten Graphics (приобретенной VMware в 2008 году). [168]
По состоянию на осень 2011 года существовало как минимум 10 известных, зрелых и работающих драйверов Gallium3D. [169] [ не удалось проверить ] [ нужна ссылка ] Драйверы с открытым исходным кодом для видеокарт Nvidia под названием команда Nouveau разрабатывает свои драйверы с использованием платформы Gallium3D. [158] [170]
13 июля 2008 г.: Разработка Nouveau ведется исключительно для платформы Gallium. Старый драйвер DRI был удален из основной ветки репозитория Mesa на Freedesktop.org. [171]
11 февраля 2009 г.: Ветка галлия-0,2 была объединена с основной основной веткой Mesa. [172] Разработка ведется на магистральной линии Меса.
25 февраля 2009 г.: Gallium3D может работать как на ядрах Linux, так и на ядрах FreeBSD. [173]
01 мая 2009 г.: Зак Русин из Tungsten Graphics добавил в Mesa 3D трекер состояния OpenVG , [174] который позволяет аппаратно ускорять масштабируемую векторную графику с помощью любого драйвера на основе Gallium3D.
17 июля 2009 г.: Выпущена Mesa3D 7.5, первая версия, включающая Gallium3D. [175]
10 сентября 2010 г.: В драйвер r600g добавлена первоначальная поддержка графических процессоров Evergreen. [176]
21 сентября 2010 г.: существуют два драйвера Gallium3D для оборудования ATI, известные как r300g и r600g, для графических процессоров R300-R500 и R600-Evergreen соответственно.
21 сентября 2010 г.: В код были внесены значительные изменения для поддержки Direct3D 10 и 11. [177] Со временем это может дать возможность использовать последние реализации Direct3D в системах Linux.
30 ноября 2011 г.: Драйверы Intel 965g и Cell Gallium были удалены из основной ветки Mesa как неподдерживаемые и сломанные. [178] [179]
30 ноября 2013 г.: Mesa 10 с OpenGL 3.2, 3.3 и OpenCL 1.0+.
18 ноября 2014 г.: В код были внесены существенные изменения для поддержки Direct3D 9. [180]
15 сентября 2015 г.: Mesa 11 с OpenGL 4.0, 4.1 и OpenCL 1.2 (неполная версия)
15 декабря 2015 г.: Mesa 11.1 Драйвер VIRGL для виртуальных машин с OpenGL 3.3
08.07.2016: Mesa 12 с OpenGL 4.2, 4.3 и Vulkan 1.0 (Intel ANV и AMD RADV)
01.11.2016: Mesa 13 с OpenGL 4.4 и OpenGL ES 3.2
13 февраля 2017 г.: Mesa 17.0 с OpenGL 4.5 и драйвер freedreno с OpenGL 3.0 и 3.1.
10 мая 2017 г.: Mesa 17.1 OpenGL 4.2+ для Intel Ivy Bridge (больше, чем драйвер Intel для Windows, OpenGL 3.3+ для Intel Open SWR Rasterizer (важно для кластерного компьютера для масштабного моделирования)
08.12.2017: Драйвер Mesa 17.3 AMD Vulkan RADV полностью совместим с тестом Khronos для Vulkan 1.0.
18 мая 2018 г.: Mesa 18.1 с Vulkan 1.1 (Intel ANV и AMD RADV)
07.09.2018: Mesa 18.2 с OpenGL 4.3 для программного драйвера VIRGL (важно для виртуальных машин в облачном кластерном компьютере), OpenGL ES 3.1 для Freedreno с Adreno A5xx
11 июня 2019 г.: выпущена Mesa 19.1 с графическим драйвером Intel следующего поколения Iris для iGPU поколения 8+ [181]
11 декабря 2019 г.: Mesa 19.3 выпустила OpenGL 4.6 с Intel i965 поколения 7+ и опциональной Iris Gen 8+.
18 марта 2020 г.: Mesa 20.0 выпустила OpenGL 4.6 с AMD GCN и Vulkan 1.2 для Intel.
27 мая 2020 г.: Mesa 20.1 выпустила поддержку векторизации NIR и поддержку общей виртуальной памяти для OpenCL в Clover.
30.11.2020: Mesa 20.3 полная поддержка OpenCL 1.2 в Clover [41]
11 марта 2021 г.: Первоначальная поддержка «D3D12» в Mesa 21.0: Direct 3D 12 для WSL2 в Windows 10 с OpenGL 3.3+, ARM Freedreno: OpenGL 3.3+.
05.05.2021: Mesa 21.1 первоначальная поддержка драйвера Google VirtIO GPU «Venus» с Vulkan 1.2+; Zink: OpenGL 4.6+, OpenGL ES 3.1+; Qualcomm Turnip, Lavapipe: Vulkan 1.1+
04.08.2021: Mesa 21.2 первоначальная поддержка нового драйвера Intel Crocus OpenGL 4.6 на основе Gallium3D для Intel Sandy Bridge для Haswell для старого i965, драйвер Vulkan panVK для ARM Panfrost
09.03.2022: Mesa 22.0 полная поддержка Vulkan 1.3 от Intel Anvil и AMD RADV
10 мая 2023 г.: Mesa 23.1 OpenCL с Rust: доступно оборудование RustiCL для AMD GCN (подробнее об аппаратном обеспечении) [182]
30 сентября 2023 г.: Mesa 23.2 с Apple Asahi OpenGL 3.1 и OpenGL ES 3.0, RADV поддерживает трассировку лучей в AMD RDNA 2 и 3, поддержка декодирования Intel Anvil Vulkan H.265 [183]
Инициатор проекта Брайан Пол был любителем графики. Он подумал, что было бы интересно реализовать простую библиотеку 3D-графики с использованием API OpenGL, которую он затем мог бы использовать вместо VOGL (очень обычная GL Like Library). [184] Начиная с 1993 года, он потратил восемнадцать месяцев на неполный рабочий день, прежде чем выложил программное обеспечение в Интернет в феврале 1995 года. [185] Программное обеспечение было хорошо принято, и люди начали вносить свой вклад в его разработку. Mesa начала с рендеринга всей компьютерной 3D-графики на процессоре . Несмотря на это, внутренняя архитектура Mesa была спроектирована так, чтобы ее можно было подключить к ускоренному графическому процессору 3D-рендерингу. На этом первом этапе рендеринг выполнялся косвенно на сервере отображения , что приводило к некоторым накладным расходам и заметному отставанию скорости от теоретического максимума. Diamond Monster 3D , использующий чипсет Voodoo Graphics , был одним из первых аппаратных 3D-устройств, поддерживаемых Mesa.
Первая настоящая поддержка графического оборудования была добавлена в Mesa в 1997 году на основе Glide API для новых на тот момент видеокарт 3dfx Voodoo I/II и их преемников. [129] Основной проблемой использования Glide в качестве слоя ускорения была привычка Glide работать в полноэкранном режиме, что подходило только для компьютерных игр. Кроме того, Glide взял блокировку экранной памяти, и, таким образом, сервер отображения был заблокирован для выполнения любых других задач графического интерфейса. [186]