OpenGL实现软件-Mesa
2014-01-02 16:35:45 阿炯

Mesa是一个类OpenGL的开源实现,采用C/C++开发并在多协议下授权。


The Mesa 3D Graphics Library.

Mesa is an open-source implementation of the OpenGL specification - a system for rendering interactive 3D graphics.

A variety of device drivers allows Mesa to be used in many different environments ranging from software emulation to complete hardware acceleration for modern GPUs.

Mesa ties into several other open-source projects: the Direct Rendering Infrastructure and X.org to provide OpenGL support to users of X on Linux, FreeBSD and other operating systems.

OpenGL 诞生 30 年


1992年6月30日,Silicon Graphics(SGI,硅谷图形公司)向全世界发布了 OpenGL,用于渲染 2D、3D 矢量图形的跨语言、跨平台的应用程序编程接口 (API)。SGI 牵头成立 OpenGL ARB(OpenGL 架构评审委员会)并发布 OpenGL 1.0 规范,从而引发了一场图形革命。


虽然近年来 Vulkan 备受关注,但 OpenGL 无疑为跨供应商的行业图形 API 标准拉开了序幕。 OpenGL 至今仍被广泛使用,并且继续打造新的扩展、对现有 OpenGL 驱动程序的优化,此外不乏仍然依赖 OpenGL 的软件。尤其是在工作站领域,OpenGL 在未来几年内仍会被使用。通过 ANGLE 和 Zink 等努力,OpenGL 加速支持仍将无限期地在其他图形 API 上运行 OpenGL。

OpenGL 在过去 30 年中取得了长足的进步,现在支持 SPIR-V 着色器、更高效的驱动程序执行、计算着色器、各种形式的纹理压缩等等。OpenGL 当然会有其不足之处,但在 30 岁的软件领域中,仍然看起来相当不错。


最新版本:22.0
Mesa 22.0 已经于2022年3月中旬发布。像往常一样,大部分开源的 3D GPU 驱动活动都是围绕着英特尔和 AMD 的 Radeon graphics drivers —— 英特尔的 Iris Gallium3D、最近推出的英特尔 Crocus Gallium3D 驱动、英特尔 ANV Vulkan、RadeonSI Gallium3D 和 Radeon RADV 驱动。但是,Zink OpenGL-on-Vulkan 实现、Freedreno、Panfrost和其他各种小型驱动程序工作也在持续推进中;在 Nouveau 开源的 NVIDIA 驱动程序方面则没有什么值得关注的。Mesa 22.0 的一些亮点包括:
Vulkan 1.3 适用于 Radeon "RADV" 和 Intel "ANV" Vulkan 驱动程序。Vulkan 1.3 所需的各种扩展在本周期早期添加,包括动态渲染(KHR_dynamic_rendering)和其他功能。
英特尔 Alder Lake N 支持与 starting Raptor Lake一起到位。还有新的但已禁用的 DG2/Alchemist 代码。
适用于英特尔 OpenGL 和 Vulkan 驱动程序的 Adaptive-Sync/VRR。
用于 RADV 和英特尔 ANV 的 DG2/Alchemist 实验性网格着色器。
继续进行 RADV 光线的工作。
更好的 Radeon VCE 视频编码性能。
RadeonSI 稀疏纹理支持。
对 RADV 的模拟 ETC2 支持。
用于 Navi 1x 消费级 GPU 的 RadeonSI NGG 着色器剔除。
Mesa 的 classic drivers 退役。同样,英特尔的 OpenSWR 驱动程序已移至 Mesa 的“Amber”分支。
RadeonSI 和 Zink 现在支持 OpenGL ARB_sparse_texture 扩展。
Microsoft 的 D3D12 代码现在支持 OpenGL ES 3.1 和其他正在努力实现 GL 4.x 支持的功能,例如计算着色器。
使用 Linux 5.17+ 和即将推出的 VMware 虚拟化软件时,VMware SVGA OpenGL 4.3 支持。
Zink OpenGL-on-Vulkan 代码继续变得更加高性能和更好地支持各种 OpenGL 功能。
Raspberry Pi V3DV Vulkan 驱动程序现在可以在 Android 上运行。
Freedreno 对 Clover OpenCL 有基本的支持。
Mesa 的 EGL 代码中的 DMA-BUF 反馈支持。
各种性能优化,包括更多 RadeonSI 优化。

更多详情可查看发行公告

Mesa 22.2.0 原计划应在8月底或9月初发布,在2022年9月下旬 22.2 正式发布,主要更新内容包括:
英特尔 DG2 Vulkan 光线追踪代码的性能得到了很大的改善,达到了约 100 倍
用于 Radeon HD 2000 到 HD 6000 系列硬件的旧 R600g 驱动程序已经重写了 NIR 支持
RadeonSI EGL 背景下的高优先级支持,用于帮助 Wayland
Radeon RADV 驱动增加了新的扩展
RADV 已经默认启用了光线查询
对 Windows 上的 Mesa 进行了改进
Nouveau 开始在其 OpenGL 驱动中进行 RTX 30 "Ampere" 支持工作
Lavapipe 驱动已经增加了对新扩展的支持
Panfrost 中初步的 Arm Mali Valhall OpenGL 支持
用于 Vivante graphics IP 的 Etnaviv Gallium3D 驱动使用 ARB_parallel_shader_compile 增加了异步着色器编译功能
继续进行今年早些时候合并的 PowerVR 开源 Vulkan 驱动的工作
删除了旧的 GLSL-to-TGSI 路径,更多的 GLSL IR 代码被 NIR 代码取代
出于软件专利的考虑,支持在构建 Mesa 时禁用某些视频编解码器

Mesa 22.3 应该在 11 月底或 12 月初发布,RadeonSI 默认启用 OpenGL 线程以增强性能。AMD 开发人员一直在 RadeonSI Gallium3D 驱动程序中默认使用 OpenGL 线程,如今这一变化已适用于下季度的 Mesa 22.3 版本,这个提交已默认在 RadeonSI 启用 “glthread”(一种线程化的 OpenGL 调度),以增强性能。

长期以来, RadeonSI 一直支持在单独的 CPU 线程上执行 OpenGL 调用的 “glthread” 选项。这种线程化的 OpenGL 调度支持对 CPU 密集型游戏有很大帮助。 “ glthread ” 选项已通过 DriConf 或通过环境变量覆盖,在每个游戏的基础上作为一种优化的选择。如今,在最近一轮的修复 / 改进之后, glthread 已经是 “完整的” 和 “高性能的”,足以在默认情况下为 AMD RadeonSI 驱动程序启用。测试结果显示,带有 glthread 的 RadeonSI 可为 Minecraft(我的世界) 和大量其他游戏带来了约 30% 的提升,这些优化过的游戏已在过去几年中被 DriConf 列入白名单。作为默认启用的优化选项,“glthread” 不会对已被列入白名单的游戏产生影响,这个 OpenGL 线程选项有可能帮助一些其他未经用户或开发人员测试的游戏,作进一步的性能优化。

Mesa 在 2022 年净增长 72 万行代码

每到年底就会有各种项目、软件来回顾他们过去一年的发展历程,现在不妨回顾一下过去这一年 Mesa 的变化与发展。根据 Mesa 的 GitStats 显示,在2022年 Mesa 的代码提交次数创下了历史第二好的成绩,代码增长更是达到了前所未有的高度。经过 20 多年的发展,截止去年,这个开源 3D 驱动集合获得的总提交次数已达 14.9 万次。今年 Mesa 的总提交次数已经达到了 16.4 万次之多。在过去 20 多年,一共有 1306 名不同的开发者为项目作出过贡献。Mesa 代码库的代码行数则是达到了 450 万行。


从上面的图片来看,如果按单年的提交数量来计算,2021 年 Mesa 的提交数量达到了 15026 次,超过了 2020 年的 14729 次,打破了 2020 年创下的记录,成为有史以来提交量最多的一年。在经历了高产的一年后,今年 Mesa 的提交数量为 14830,虽然不及去年的成绩,但也略微领先于 2020 年的成绩,成为了历史提交数量排名第二的年份。从上图也能看出,自 2010 年之后,Mesa 经历了一段不短的低产期,近三年则是特别高产,社区变得非常活跃。

虽然提交数量不及去年,不过 Mesa 在今年也创造了一个新的增长记录,那就是新增加的代码行。2021年Mesa增加了 1125814 行代码,删除了 943405 行代码,即净增长约 18.2 万行代码。而2022年 Mesa 增加了 1382754 行新代码,删除了 665472 行代码,也就是说净增长了约 71.7 万行代码。这比以往任何一年的代码净增长都大得多。无论如何,从提交次数、代码增加方面的这些数字来看,Mesa 在 2022 年的发展状况非常良好,实现了创记录的增长。

纵观 Mesa 的整个历史,单独查看各个开发者的贡献状况的话,Mesa 的创始人 Brian Paul 仍然是提交次数最多的人,不过他目前的工作重心都在 VMware 上,近些年已不再活跃;紧随其后的就是 Marek Olsak(AMD)、Emma Anholt(Google)、Jason Ekstrand(Collabora)和 Ken Graunke(英特尔)。如果单单看 2022 年的贡献,今年对 Mesa 代码库贡献最大的是 Mike Blumenkrantz,他一个人的贡献就占了今年全部提交次数的 10.3%(1538 次个人提交 / 14830 次总提交)。去年这一殊荣也同样是属于 Mike Blumenkrantz,而且去年他的提交比例为 10.5%,还略高于今年的成绩。Blumenkrantz 目前就职于 Valve,不知道在 2023 年能否还有如此高的产出比例。在 Blumenkrantz 之后,2022年提交次数排名前列的开发者分别是 Alyssa Rosenzweig(Collabora,Rosenzweig 也是这些开发者中少有的女性开发者)、Samuel Pitoiset(Valve)、Marek Olsak(AMD)、Jason Ekstrand(Collabora)和 Emma Anholt(Google)。

2022年约有 299 名不同的开发者向 Mesa 提交了代码,这也是 Mesa 的一个新纪录。相比之下,2021 年大约有 264 名、2020 年则有 246 名、2019 年则是 252 名。Mesa 代码库在 2021 年约有 370 万行代码,在 2022 年结束时约有 450 万行。按照近些年的发展趋势来看,如果 2023 年依然保持这样的增长速度,2023 年的代码行数将有望突破 500 万行。

Mesa Zink 驱动的一个改进补丁降低了 50% 内存占用

Zink 是基于 Vulkan 的 OpenGL 实现,Valve 公司 Linux 图形驱动程序团队的 Mike Blumenkrantz 最近在研究 Zink 过度使用内存问题的来源。他在2023年4月上旬为 Mesa 23.1 提交了一个 Zink 驱动内存优化补丁,这个改动使 Mesa Zink 驱动程序的内存使用率在大多数游戏中减少一半,但不会对性能产生任何负面影响。

OpenGL 的游戏很多都是 x86 二进制文件,它们在 32 位进程中运行,而 32 位地址空间意味着可寻址内存有 4GB 限制,这个限制包括游戏的可寻址内存(例如,游戏的内部 malloc 调用)以及驱动程序的可寻址内存(例如,所有 GPU 映射内存),一旦内存占用临界或者超过该限制,应用就会崩溃。之前 Mesa RADV 驱动程序就出现过内存问题,在打开 Dota 2 时,RADV 驱动程序占用了 3GB 主机内存。其中大部分内存占用都来自于内存着色器 IR,最后通过序列化内存中的着色器,节省了 85% 的内存,解决了内存占用异常问题。

Mesa Zink 驱动程序的内存使用和 RADV 驱动的问题有点相似。、Mike 在一篇博文中讲述了自己的内存优化过程,这次作为实验的游戏是古墓丽影三,最初打开游戏时内存占用 2.4 G,而且几乎全部由驱动程序分配:


第一步是着手序列化所有 NIR 着色器(NIR 是一种中间表示 (IR),专为满足 Mesa 中图形驱动程序的需求而设计。)。因为克隆 NIR 着色器会消耗过多的 RAM,对于创建大量图形的游戏来说,这很容易导致内存爆炸。序列化 NIR 比对象形式的 NIR 更紧凑,内存占用量小了一个数量级,使用序列化的 NIR 着色器对内存问题有很大帮助。第二步是压缩链接着色器时发生的 NIR 副本。最后将 Mesa RADV 的修复程序应用到 Mesa Zink 中。最终将古墓丽影 3 的内存使用量降到 482.7 MB,减少了 79.9% 。


目前该内存优化补丁已成功合并到 Mesa 23.1 主线,感兴趣的便宜可以在 Mike 的博客中阅读技术细节

微软 Xbox 主机成功运行 OpenGL 游戏:借助 Mesa 图形库移植 UWP

2024年3月上旬消息,Mesa 适配微软 UWP 平台方面取得了突破性进展。Mesa 3D 是一个在 MIT 许可证下开放源代码的三维计算机图形库,以开源形式实现了 OpenGL 的应用程序接口。

独立开发者 Aerisarn 一直致力于这项适配工作,并在 GitHub 上线了 Mesa-UWP 存储库。基于这项工作,另一名开发者 Daniel Worley 成功将开源《毁灭战士 3》项目 Dhewm3 运行在 Xbox 上。Daniel Worley 已在 GitHub 发布了 Dhewm3 HDR-Alpha 版本,支持开启 HDR,并承诺未来的版本可能会有更好的色调映射。不过Daniel Worley 也表示,该版本游戏存在已知的缺陷。

该项目还使用了SDL-uwp-gl 开源项目。SDL(Simple DirectMedia Layer)是一个跨平台开发库,旨在通过 OpenGL 和 Direct3D 提供对音频、键盘、鼠标、手柄和图形硬件的低级访问。当然这只是 Mesa 移植 Xbox 成功的第一个例子,大家可以期待一下后续还会有哪些移植游戏新成果。


官方主页:http://www.mesa3d.org/