#surface #opengl #texture #gpu #cross-platform #low-level #thread

surfman

一个跨平台的低级 GPU 表面管理工具包

28 个版本

0.9.7 2024 年 8 月 19 日
0.9.4 2024 年 6 月 11 日
0.9.2 2024 年 3 月 20 日
0.8.1 2023 年 10 月 31 日
0.1.2 2019 年 11 月 19 日

65图形 API

Download history 1289/week @ 2024-05-02 779/week @ 2024-05-09 1239/week @ 2024-05-16 1273/week @ 2024-05-23 1179/week @ 2024-05-30 1024/week @ 2024-06-06 1777/week @ 2024-06-13 1503/week @ 2024-06-20 1288/week @ 2024-06-27 2124/week @ 2024-07-04 1300/week @ 2024-07-11 1276/week @ 2024-07-18 1463/week @ 2024-07-25 2082/week @ 2024-08-01 2834/week @ 2024-08-08 3387/week @ 2024-08-15

10,051 每月下载量
用于 9 个 crate(2 个直接使用)

MIT 或 Apache-2.0 或 MPL-2.0

610KB
12K SLoC

包含(JAR 文件,55KB) gradle-wrapper.jar

surfman 构建状态

surfman logo

surfman 是一个低级、跨平台的 Rust 库,用于管理 表面,即 GPU 内存中的图像数据块。使用此库,您可以

  • 在 CPU 上的窗口(可能是使用 winit 创建的)中绘制。

  • 使用 OpenGL 在窗口(通过 winit 或其他方式创建)中渲染。

  • 使用 OpenGL 在离屏表面中渲染。

  • 使用在另一个线程上创建的表面作为另一个线程上的 OpenGL 纹理。

  • 使用特定平台的 GPU API(如 Metal)在表面上绘制。

surfman 构成了 Servo 项目的低级图形基础设施,其中它允许轻松地将浏览器的 WebGL 和 WebXR 代码移植到各种平台。

surfman 不是什么

surfman 不是一个功能齐全的 GPU 渲染 API。它不尝试抽象 OpenGL、Metal 和 Direct3D 等渲染库。为此,请尝试 gfx-rs

surfman 也不是一个窗口解决方案。它只能渲染到已打开的窗口,并且需要与 winit 等crate配合使用才能实际打开窗口。

同样,surfman 不是一个 UI 工具包。对于这个,请参见 GTK+ 和许多其他库。但是,可以与任何这些 UI 工具包一起使用 surfman,以有效地将 GPU 渲染集成到应用程序中。

为什么使用 surfman

大部分这些功能都可以使用其他库实现,例如 glutin 和 SDL。然而,对于一些用例,使用 surfman 可以实现更好的性能和/或正确性。例如

  • 在多 GPU 系统上,游戏通常想要使用独立 GPU 而不是集成 GPU 以获得更好的性能,而 UI 应用程序则相反,为了更好的能耗。然而,大多数面向游戏的开源 OpenGL 窗口库最终在 Linux 和 macOS 上使用独立 GPU,在 Windows 上使用集成 GPU。在这样的系统上,surfman 明确允许您选择想要渲染的 GPU。

  • OpenGL 的 共享上下文共享列表 功能允许您在不同的上下文中共享纹理。然而,这通常会导致驱动程序错误,并且即使它工作,也会导致大多数操作需要互斥锁。有效的纹理共享需要使用平台特定的 API,而 surfman 抽象了这些 API。

  • Windows 上 OpenGL 的 ANGLE 实现通常不是线程安全的,因此尝试在后台线程上进行渲染通常会崩溃。surfman 仔细地绕过所有安全问题,以确保库可以从任何线程安全使用。

  • 一些像模拟器和视频播放器这样的应用程序,它们在 CPU 上绘制,想要尽可能避免复制像素。像 glTexImage2DXPutImage 这样的经典 API 会导致数据被复制多次。相比之下,surfman 允许您尽可能少地复制屏幕渲染——有时甚至为零,具体取决于平台。

平台支持

库支持以下平台

  • Windows,通过本机 WGL 框架使用 OpenGL。

  • Windows,通过 Google 的 ANGLE 库使用 OpenGL。

  • macOS,通过本机 CGL 框架使用 OpenGL。

  • macOS,使用 Metal。

  • Linux/其他 Unix,通过 Wayland 使用 OpenGL。

  • Linux/其他 Unix,通过 X11 的 GLX 使用 OpenGL。

  • Android P 及以上版本,使用 OpenGL。

  • 通过 OSMesa 框架的 OpenGL 通用 CPU 渲染。

未来工作

以下功能可能稍后添加

  • 支持 Android Marshmallow、Nougat 和 Oreo。

  • 部分呈现,允许操作系统仅合成窗口已更改的区域。

  • 在更多平台上支持 CPU 渲染。(目前,CPU 渲染功能仅在 macOS 上工作。)

  • 支持 Vulkan。

  • Windows 上的 Direct3D 11 支持。

  • YUV 表面,用于软件视频编解码器。

  • 支持使用 WebAssembly 在浏览器中运行。

许可证

surfman 的许可条款与 Rust 本身相同。

surfman 遵守 Rust 本身的相同行为准则。

依赖关系

~2–13MB
~166K SLoC