GPUAdapter: requestDevice() 方法
requestDevice()
方法是 GPUAdapter
接口的一部分,它返回一个 Promise
对象,该对象将使用 GPUDevice
对象进行解析,该对象是用于与 GPU 通信的主要接口。
语法
requestDevice()
requestDevice(descriptor)
参数
descriptor
可选-
包含以下属性的对象
defaultQueue
可选-
提供设备默认
GPUQueue
(由GPUDevice.queue
返回)的信息的对象。此对象具有单个属性label
,它为默认队列提供一个label
值。如果没有提供值,则默认为空对象,默认队列的标签将为空字符串。 label
可选requiredFeatures
可选-
一个字符串数组,表示您希望返回的
GPUDevice
支持的附加功能。如果GPUAdapter
无法提供这些功能,则requestDevice()
调用将失败。有关可能的特性的完整列表,请参阅GPUSupportedFeatures
。如果没有提供值,则默认为空数组。 requiredLimits
可选-
一个包含属性的对象,这些属性表示您希望返回的
GPUDevice
支持的限制。如果GPUAdapter
无法提供这些限制,则requestDevice()
调用将失败。每个键必须是GPUSupportedLimits
成员的名称。如果未提供任何值,则默认为空对象。
返回值
一个 Promise
,它使用 GPUDevice
对象实例完成。
如果您进行重复调用,即在已经调用过 requestDevice()
的 GPUAdapter
上调用 requestDevice()
,则承诺使用立即丢失的设备完成。然后,您可以通过 GPUDevice.lost
获取有关设备丢失方式的信息。
异常
OperationError
DOMException
-
如果
requiredLimits
属性中包含的限制不受GPUAdapter
支持,则承诺使用OperationError
拒绝,原因是它们不是有效的限制,或者因为它们的价值高于适配器对这些限制的价值。 TypeError
DOMException
-
如果
requiredFeatures
属性中包含的功能不受GPUAdapter
支持,则承诺使用TypeError
拒绝。
示例
基本示例
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();
// ...
}
请求特定功能和限制
在以下代码中,我们
- 检查
GPUAdapter
是否具有可用的texture-compression-astc
功能。如果是,我们将它推送到requiredFeatures
数组中。 - 查询
GPUAdapter.limits
的maxBindGroups
值,以查看它是否等于或大于 6。我们的理论示例应用程序理想情况下需要 6 个绑定组,因此如果返回的值 >= 6,我们将向requiredLimits
对象添加最大限制 6。 - 请求具有这些功能和限制要求以及
defaultQueue
标签的设备。
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 的浏览器中加载。