首先看下WebGPU的目标:
同时支持实时屏幕渲染和离屏渲染。
使通用计算能够在 GPU 上高效执行。
支持针对各种原生 GPU API 的实现:Microsoft 的 D3D12、Apple 的 Metal 和 Khronos 的 Vulkan。
提供一种人类可创作的语言来指定在 GPU 上运行的计算。
可在浏览器的多进程架构中实现,维护Web的安全性。
尽可能让应用程序在不同的用户系统和浏览器之间可移植地工作。
以有用但范围仔细的方式与 Web 平台的其余部分交互(基本上以一种或另一种方式共享图像)。
提供在 Web 上公开现代 GPU 功能的基础。 WebGPU 的结构类似于所有当前的原生 GPU API,即使它不提供它们的所有功能。 有计划稍后扩展它以具有更现代的功能。
非目标:
公开对根本不可编程或灵活性较差的硬件的支持,例如 DSP 或专门的机器学习硬件。
公开支持不能进行通用计算的硬件(如旧手机 GPU 甚至旧台式机 GPU)。
彻底公开本机 GPU API 上可用的所有功能(某些功能仅在单一供应商的 GPU 上可用,或者太小众而无法添加到 WebGPU)。
允许广泛混合和匹配 WebGL 和 WebGPU 代码。
与 CSS Houdini 等页面渲染流程紧密集成。
适配器和设备
WebGPU“适配器”(GPUAdapter
)是一个对象,用于标识系统上的特定 WebGPU 实现(例如,集成或离散 GPU 上的硬件加速实现,或软件实现)。 同一页面上的两个不同的“GPUAdapter”对象可以指代同一个底层实现,或指两个不同的底层实现(例如集成和离散 GPU)。
页面可见的适配器集由用户代理决定。
WebGPU“设备”(GPUDevice
)表示与WebGPU适配器的逻辑连接。 之所以称为“设备”,是因为它抽象了底层实现(例如视频卡)并封装了单个连接:拥有设备的代码可以充当适配器的唯一用户。
作为这种封装的一部分,设备是从它创建的所有 WebGPU 对象(纹理等)的根所有者,只要设备丢失或损坏,就可以(内部)释放这些对象。 单个网页上的多个组件可以各自拥有自己的 WebGPU 设备。
所有 WebGPU 的使用都是通过 WebGPU 设备或从它创建的对象完成的。 从这个意义上说,它服务于“WebGLRenderingContext”目的的一个子集; 然而,与 WebGLRenderingContext
不同的是,它不与画布对象相关联,并且大多数命令是通过“子”对象发出的。