Mesa , также называемая Mesa3D и Mesa 3D Graphics Library , является реализацией 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 Glamor или Wayland 's Weston ) используют OpenGL/ EGL ; поэтому вся графика обычно проходит через Mesa.
Mesa размещена на freedesktop.org и была инициирована в августе 1993 года Брайаном Полом , который до сих пор принимает активное участие в проекте. Mesa впоследствии получила широкое распространение и теперь содержит многочисленные вклады от различных лиц и корпораций по всему миру, включая производителей графического оборудования Khronos Group , которые администрируют спецификацию 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 через драйвер сообщества RADV. 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.01.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]
3-я версия 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 в Colors также является изюминкой. [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 и поддержка Modus совместимости для OpenGL 4.4 (3.1 в 18.1) — другие важные моменты в RadeonSI для карт AMD GCN. Доступны новый Vulkan 1.1 и другие функции для Intel и AMD. Подробнее о Vulkan см. в Mesamatrix. [25]
4-я версия 2018 года — 18.3, выпущенная как стабильная версия 18.3.1 в декабре 2018 года. Многие функции в Detail и поддержка нового оборудования являются основными частями. Полная поддержка 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 хорошо работает в dev-версии с 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.
2-я версия 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 полностью поддерживается в модуле Clover. Zink поддерживает OpenGL 3.3+. Виртуальный драйвер LLVMpipe теперь поддерживает OpenGL 4.5+ с 4.6 в перспективе. Lavapipe (первоначально называвшийся Vallium [39] ) как Vulkan Tree 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] OpenGL 4.6+ и OpenGL ES 3.1+ доступны для Zink. Драйвер AMD 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 Venus будет официально представлен с полной поддержкой Vulkan 1.2+ (больше mesamatrix). ARM Panfrost: доступна поддержка OpenGL ES 3.1+, а panVK — новый драйвер Vulkan. Первоначальная поддержка началась для ARM Apple M1 с новым драйвером Asahi. 21.2 доступен с 4 августа 2021 года. [53]
Старый план заключается в разделении старых драйверов в классическом дереве со множеством преимуществ в программировании, поддержке, исправлении ошибок для современной части Galium 3D. Одной из проблем здесь является Intel i965 с поддержкой популярного старого оборудования для Intel Haswell, а ранее также с поддержкой Windows 10. [54] Новый драйвер Gallium3D Crocus для графики Intel Gen 4 для Haswell находится в разработке, чтобы завершить область Galium3D с возможным разделением в следующем году 2021. Crocus является опциональным и доступен в 21.2. [55] Ветка Amber предназначена для старых драйверов без функций Gallium 3D, таких как Radeon R200, Intel i915 и 965 с актуальной версией 21.3.9. [56]
В версии 22.0 Classic драйверы упразднены. Vulkan 1.3 доступен для Intel Anvil и AMD RADV. [57]
Microsoft представляет новый драйвер «Dozen» для WSL 2 на ранней стадии разработки как Vulkan поверх d3d12 в Mesa 22.1. [58]
RustiCL доступен в версии 22.3 с официальным OpenCL 3.0 Conformance для Intel XE Graphics. Производительность равна и лучше 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 Group официально анонсировала 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 Level 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 (Mali) сделали то же самое или, по крайней мере, анонсировали фирменные драйверы Vulkan для Android и других операционных систем. Но когда и появятся ли дополнительные бесплатные и открытые реализации Vulkan для этих графических процессоров, еще предстоит увидеть.
Mesa Software Driver VIRGL начинает разработку Vulkan в 2018 году с проектов GSOC для поддержки виртуальных машин. [108]
Lavapipe — это драйвер программного обеспечения Vulkan на базе CPU и брат 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 — это брат freedreno для OpenGL на Vulkan. V3dv поддерживает Vulkan 1.0+ с Mesa 20.3. В версии 21.1 Turnip поддерживает Vulkan 1.1+. [110] [111] [112]
Panfrost PanVK для ARM Mali находится на пути к Vulkan 1.1, но только 1.0 стабильна и доступна с Mesa 22.0. [113]
Project Dozen напрямую соединяет 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 добавлена синхронизационная структура 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 -графические карты стали более распространенными для ПК, отдельные лица, частично поддерживаемые некоторыми компаниями, начали работать над добавлением большей поддержки аппаратно-ускоренного 3D-рендеринга в Mesa. [ когда? ] Инфраструктура прямого рендеринга (DRI) была одним из таких подходов к интерфейсу Mesa, OpenGL и других библиотек API 3D-рендеринга с драйверами устройств и оборудованием. После достижения базового уровня удобства использования поддержка DRI была официально добавлена в Mesa. Это значительно расширило доступный диапазон аппаратной поддержки, достижимой при использовании библиотеки Mesa. [129]
С адаптацией к DRI библиотека Mesa наконец взяла на себя роль компонента front-end полномасштабной среды OpenGL с различными компонентами back-end, которые могли предложить различные степени поддержки 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 также содержит реализацию программного рендеринга, называемого swarst , который позволяет шейдерам работать на CPU в качестве резерва, когда отсутствуют графические аппаратные ускорители. Программный растеризатор Gallium известен как softpipe или, если он построен с поддержкой LLVM, llvmpipe , который генерирует код CPU во время выполнения. [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 GPU для GPU в виртуальных машинах от Google. Venus объединен в 21.1 и представлен для общественности в 21.2. [52] Venus поддерживает 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_specific , и общей, называемой libdrm . В этом разделе будет рассматриваться исключительно часть пользовательского режима над libdrmОдной из целей Mesa является оптимизация кода, который должен быть выполнен соответствующим GPU. Другой целью является совместное использование кода. Вместо документирования частей программного обеспечения, эта статья вместо этого рассмотрит промежуточные представления, используемые в процессе компиляции и оптимизации. См. Абстрактное синтаксическое дерево (AST) и Статическая форма одиночного присваивания (форма SSA).
SPIR-V — это определенная версия стандартного переносимого промежуточного представления . Идея заключается в том, что графические приложения выводят 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 (TGSI) была представлена в 2008 году компанией Tungsten Graphics. Все UMD-устройства в стиле Gallium3D принимают TGSI. NIR в настоящее время является основной областью разработки, поэтому TGSI предназначен только для старых драйверов, таких как инфраструктура по умолчанию r300g, и будет устаревшим через несколько лет.
Код GLSL-To-TGSI будет удален в Mesa 22.2. По умолчанию используется более новый NIR-to-TGSI с GLSL-to-NIR для всех собственных драйверов NIR. Некоторые старые драйверы TGSI поддерживаются с этим путем кода NIR. Позже 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.
Компилятор Mesa GLSL генерирует свой собственный 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 State Tracker Interface и Gallium3D WinSys Interface . Эти три компонента называются:
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) будут больше ориентированы на обработку GPU. [166] В течение переходного периода от настройки режимов пользовательского пространства к настройке режимов пространства ядра некоторые драйверы Mesa 3D, такие как драйвер radeon или драйверы Intel, в конечном итоге поддерживали как DRI1, так и DRI2 и использовали DRI2, если он был доступен в системе. Gallium3D дополнительно требует уровня поддержки шейдеров, который недоступен на старых картах, таких как, например, ATi r100-r200, поэтому пользователям этих карт необходимо продолжать использовать Mesa 3D с DRI2 для использования 3D.
Tungsten Graphics Shader Infrastructure ( TGSI ) — это промежуточное представление , подобное промежуточному представлению LLVM или новому стандартному переносимому промежуточному представлению (SPIR), которое будет использоваться API Vulkan и 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 team разрабатывают свои драйверы с использованием фреймворка Gallium3D. [158] [170]
2008-07-13: Разработка Nouveau ведется исключительно для фреймворка Gallium. Старый драйвер DRI был удален из главной ветки репозитория Mesa на Freedesktop.org. [171]
2009-02-11: Ветка gallium-0.2 была объединена с основной веткой Master Mesa. [172] Разработка ведется в основной ветке Mesa.
2009-02-25: Gallium3D может работать как на ядрах Linux, так и на ядрах FreeBSD. [173]
2009-05-01: Зак Русин из Tungsten Graphics добавил в Mesa 3D трекер состояний OpenVG [174] , который позволяет аппаратно ускорять масштабируемую векторную графику с помощью любого драйвера на базе Gallium3D.
2009-07-17: Выпущена Mesa3D 7.5, первая версия, включающая Gallium3D. [175]
2010-09-10: Первоначальная поддержка графических процессоров Evergreen была добавлена в драйвер r600g. [176]
2010-09-21: Существуют два драйвера Gallium3D для оборудования ATI, известных как r300g и r600g для графических процессоров R300-R500 и R600-Evergreen соответственно.
2010-09-21: Внесены существенные изменения в код для поддержки Direct3D 10 и 11. [177] Со временем это может предоставить возможность использовать последние реализации Direct3D в системах Linux.
2011-11-30: Драйверы Intel 965g и Cell Gallium были удалены из основной ветки Mesa как неподдерживаемые и сломанные. [178] [179]
2013-11-30: Mesa 10 с OpenGL 3.2, 3.3 и OpenCL 1.0+
2014-11-18: Внесены существенные изменения в код для поддержки Direct3D 9. [180]
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 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 для программного драйвера VIRGL (важно для виртуальных машин в облачном кластерном компьютере), OpenGL ES 3.1 для Freedreno с Adreno A5xx
2019-06-11: Mesa 19.1 выпущена с графическим драйвером Intel следующего поколения «iris» для iGPU поколения 8+ [181]
2019-12-11: Mesa 19.3 выпустила OpenGL 4.6 с Intel i965 с поколением 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 [41]
2021-03-11: Начальная поддержка Mesa 21.0 «D3D12»: Direct 3D 12 для WSL2 в Windows 10 с OpenGL 3.3+, ARM Freedreno: OpenGL 3.3+
2021-05-05: начальная поддержка Mesa 21.1 драйвера графического процессора Google VirtIO «Venus» с Vulkan 1.2+; Zink: OpenGL 4.6+, OpenGL ES 3.1+; Qualcomm Turnip, Lavapipe: Vulkan 1.1+
2021-08-04: начальная поддержка Mesa 21.2 нового драйвера Intel Crocus OpenGL 4.6 на основе gallium3D для Intel Sandy Bridge и Haswell для старого i965, драйвер Vulkan panVK для ARM Panfrost
2022-03-09: Mesa 22.0 полностью поддерживает Vulkan 1.3 от Intel Anvil и AMD RADV
2023-05-10: Mesa 23.1 OpenCL с Rust: RustiCL для AMD GCN Оборудование доступно (еще больше оборудования в разработке) [182]
2023-09-30: 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-графики на CPU . Несмотря на это, внутренняя архитектура Mesa была разработана так, чтобы быть открытой для подключения к ускоренному графическим процессором 3D-рендерингу. На этом первом этапе рендеринг выполнялся косвенно на сервере отображения , что приводило к некоторым накладным расходам и заметному отставанию скорости от теоретического максимума. Diamond Monster 3D , использующий чипсет Voodoo Graphics , был одним из первых 3D-аппаратных устройств, поддерживаемых Mesa.
Первая настоящая поддержка графического оборудования была добавлена в Mesa в 1997 году на основе API Glide для новых тогда графических карт 3dfx Voodoo I/II и их преемников. [129] Основной проблемой использования Glide в качестве слоя ускорения была привычка Glide работать на весь экран, что подходило только для компьютерных игр. Кроме того, Glide блокировал память экрана, и, таким образом, сервер отображения был заблокирован от выполнения любых других задач GUI. [186]