GPUAdapter: requestDevice() 方法

实验性: 这是一个实验性技术
在生产环境中使用之前,请仔细查看浏览器兼容性表

安全上下文: 此功能仅在安全上下文(HTTPS)中可用,在一些或所有支持的浏览器中可用。

requestDevice() 方法是 GPUAdapter 接口的一部分,它返回一个 Promise 对象,该对象将使用 GPUDevice 对象进行解析,该对象是用于与 GPU 通信的主要接口。

语法

js
requestDevice()
requestDevice(descriptor)

参数

descriptor 可选

包含以下属性的对象

defaultQueue 可选

提供设备默认 GPUQueue(由 GPUDevice.queue 返回)的信息的对象。此对象具有单个属性 label,它为默认队列提供一个 label 值。如果没有提供值,则默认为空对象,默认队列的标签将为空字符串。

label 可选

一个字符串,提供一个标签,该标签可用于标识 GPUDevice,例如在 GPUError 消息或控制台警告中。

requiredFeatures 可选

一个字符串数组,表示您希望返回的 GPUDevice 支持的附加功能。如果 GPUAdapter 无法提供这些功能,则 requestDevice() 调用将失败。有关可能的特性的完整列表,请参阅 GPUSupportedFeatures。如果没有提供值,则默认为空数组。

requiredLimits 可选

一个包含属性的对象,这些属性表示您希望返回的 GPUDevice 支持的限制。如果 GPUAdapter 无法提供这些限制,则 requestDevice() 调用将失败。每个键必须是 GPUSupportedLimits 成员的名称。如果未提供任何值,则默认为空对象。

注意:并非所有功能和限制都可以在支持它的所有浏览器中的 WebGPU 中使用,即使它们受底层硬件支持。有关更多信息,请参见 featureslimits 页面。

返回值

一个 Promise,它使用 GPUDevice 对象实例完成。

如果您进行重复调用,即在已经调用过 requestDevice()GPUAdapter 上调用 requestDevice(),则承诺使用立即丢失的设备完成。然后,您可以通过 GPUDevice.lost 获取有关设备丢失方式的信息。

异常

OperationError DOMException

如果 requiredLimits 属性中包含的限制不受 GPUAdapter 支持,则承诺使用 OperationError 拒绝,原因是它们不是有效的限制,或者因为它们的价值高于适配器对这些限制的价值。

TypeError DOMException

如果 requiredFeatures 属性中包含的功能不受 GPUAdapter 支持,则承诺使用 TypeError 拒绝。

示例

基本示例

js
async function init() {
  if (!navigator.gpu) {
    throw Error("WebGPU not supported.");
  }

  const adapter = await navigator.gpu.requestAdapter();
  if (!adapter) {
    throw Error("Couldn't request WebGPU adapter.");
  }

  const device = await adapter.requestDevice();

  // ...
}

请求特定功能和限制

在以下代码中,我们

  1. 检查 GPUAdapter 是否具有可用的 texture-compression-astc 功能。如果是,我们将它推送到 requiredFeatures 数组中。
  2. 查询 GPUAdapter.limitsmaxBindGroups 值,以查看它是否等于或大于 6。我们的理论示例应用程序理想情况下需要 6 个绑定组,因此如果返回的值 >= 6,我们将向 requiredLimits 对象添加最大限制 6。
  3. 请求具有这些功能和限制要求以及 defaultQueue 标签的设备。
js
async function init() {
  if (!navigator.gpu) {
    throw Error("WebGPU not supported.");
  }

  const adapter = await navigator.gpu.requestAdapter();
  if (!adapter) {
    throw Error("Couldn't request WebGPU adapter.");
  }

  const requiredFeatures = [];

  if (adapter.features.has("texture-compression-astc")) {
    requiredFeatures.push("texture-compression-astc");
  }

  const requiredLimits = {};

  // App ideally needs 6 bind groups, so we'll try to request what the app needs
  if (adapter.limits.maxBindGroups >= 6) {
    requiredLimits.maxBindGroups = 6;
  }

  const device = await adapter.requestDevice({
    defaultQueue: {
      label: "myqueue",
    },
    requiredFeatures,
    requiredLimits,
  });

  // ...
}

规范

规范
WebGPU
# dom-gpuadapter-requestdevice

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅