40个版本 (1个稳定版)
| 22.0.0 | 2024年7月18日 |
|---|---|
| 0.21.1 | 2024年6月26日 |
| 0.20.0 |
|
| 0.19.3 |
|
| 0.0.1 | 2021年7月15日 |
539 在 图形API 中
每月下载量 246,671
用于 1,423 个软件包 (7 个直接)
5MB
101K SLoC
wgpu_hal:一个跨平台的非安全图形抽象
此软件包定义了一组抽象现代图形API的特性和实现(后端)为Vulkan、Metal、Direct3D和GL。
wgpu_hal是gfx-hal的精神继承者,但范围缩小,并面向WebGPU实现目标。它没有验证或跟踪的开销,并且API转换开销通过WebGPU的设计保持在最低。此API可用于资源密集型应用程序和引擎。
wgpu_hal软件包的主要设计选择
-
我们的特性和可移植性:适当的使用应在任何后端中获得等效的结果。
-
我们的特性和不安全:实现执行最少的验证(如果有的话),并且错误的使用通常会引发未定义的行为。这使我们能够将我们在底层图形系统上强加的开销最小化。如果您需要安全性,
wgpu-core软件包提供了一个安全的API来驱动wgpu_hal,实现了所有必要的验证、资源状态跟踪等。(请注意,wgpu-core是为通过FFI使用的而设计的;wgpu软件包为wgpu-core提供了更符合Rust语法的绑定。)或者,您可以自己进行验证。 -
同样,返回的错误仅覆盖用户无法预料的场景,例如内存不足或设备丢失。用户可以合理预料的任何错误都是他们的责任来避免。例如,
wgpu_hal在映射不可映射的缓冲区时不会返回错误:作为缓冲区创建者,用户应该已经知道他们是否可以映射它。 -
我们使用静态分发。特性通常不是对象安全的。您必须选择特定的后端类型,例如
vulkan::Api或metal::Api,然后根据主特性使用它,或者调用后端特定方法。 -
我们使用惯用的Rust参数传递,通过引用传递对象,通过值返回它们等,这与
wgpu-core不同,后者通过ID引用对象。 -
我们持久性地映射缓冲区内容。这意味着缓冲区可以在CPU上保持映射状态,同时GPU读取或写入它。如果您需要将数据在CPU和GPU之间传输,必须明确指示,如果
wgpu_hal指示映射不可一致(即在两个设备之间自动同步),则必须这样做。 -
您必须在资源的不同使用之间记录显式的屏障。例如,如果缓冲区被计算着色器写入,然后用作绘制调用的索引缓冲区,您必须在两个操作之间使用
CommandEncoder::transition_buffers。 -
设置绑定组时,管道布局被明确指定。不兼容的布局会干扰绑定在较高索引处的组。
-
API接受集合作为迭代器,以避免强制用户将数据存储在特定的容器中。实现不保证任何迭代器都会被耗尽,除非函数文档中另有说明。因此,我们建议迭代器不要执行任何修改操作。
遗憾的是,wgpu_hal的安全要求并未完全记录。理想情况下,所有特性的方法都应该有文档注释,说明用户必须满足的要求,以确保正确和可移植的行为。如果您知道后端强制执行但不由特性文档规定的特定要求,请提交问题。或者,如果您是一位有能力的技术作家,请提交拉取请求!
主要后端
wgpu_hal包在以下平台图形API上实现了功能齐全的后端:
-
Vulkan,可在Linux、Android和Windows上使用,通过
ash包的Vulkan绑定。在安装MoltenVK后,它也可在macOS上使用。 -
macOS上的Metal,使用
metal包的绑定。 -
Windows上的Direct3D 12,使用
d3d12包的绑定。
次要后端
wgpu_hal包基于以下平台图形API实现了部分实现:
- GL后端在任何OpenGL、OpenGL ES或WebGL可用的地方都可用。有关详细信息,请参阅
gles模块文档。
您可以通过检查 DownlevelCapabilities 来了解适配器缺少哪些功能,该功能可在 ExposedAdapter::capabilities 中找到,该功能由 Instance::enumerate_adapters 提供。
该API通常设计得比次要后端更适合主要后端,因此后者可能产生更多的开销。
调试
维基百科 调试 wgpu 应用程序 页面上的大部分信息仍然适用于此API,但API跟踪/重放功能除外,该功能仅在 wgpu-core 中可用。
依赖项
~2–35MB
~528K SLoC