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