GPUAdapter: requestDevice() 方法
注意:此功能在 Web Workers 中可用。
GPUAdapter 接口的 requestDevice() 方法返回一个 Promise,该 Promise 解析(fulfills)为一个 GPUDevice 对象。该对象是与 GPU 通信的主要接口。
语法
requestDevice()
requestDevice(descriptor)
参数
descriptor可选-
包含以下属性的对象:
defaultQueue可选-
一个对象,为设备的默认
GPUQueue(由GPUDevice.queue返回)提供信息。此对象有一个名为label的属性,为默认队列提供一个label值。如果未提供值,则默认为一个空对象,默认队列的标签将是一个空字符串。 label可选requiredFeatures可选-
一个字符串数组,表示您希望返回的
GPUDevice支持的附加功能。如果GPUAdapter无法提供这些功能,requestDevice()调用将失败。有关可能的功能的完整列表,请参阅GPUSupportedFeatures。如果未提供值,则默认为一个空数组。 requiredLimits可选-
一个对象,包含表示您希望返回的
GPUDevice支持的限制的属性。如果GPUAdapter无法提供这些限制,requestDevice()调用将失败。每个具有非undefined值的键必须是GPUSupportedLimits中成员的名称。注意:您可以在请求 GPU 设备时请求未知限制,而不会导致错误。这些限制将为
undefined。这很有用,因为它使 WebGPU 代码更加健壮——代码库不会因为某个限制在适配器中不再存在而停止工作。
并非所有浏览器都支持 WebGPU 中的所有功能和限制,即使底层硬件支持它们。有关更多信息,请参阅 features 和 limits 页面。
返回值
一个 Promise,它解析(fulfills)为一个 GPUDevice 对象实例。
如果您进行了重复调用,即在已经调用过 requestDevice() 的 GPUAdapter 上再次调用 requestDevice(),则该 Promise 将会解析(fulfill)为一个立即丢失的设备。然后,您可以通过 GPUDevice.lost 获取有关设备丢失的信息。
异常
OperationErrorDOMException-
如果
requiredLimits属性中包含的限制未被GPUAdapter支持(因为它们不是有效限制,或者它们的值高于适配器中这些限制的值),则该 Promise 会以OperationError拒绝(reject)。 TypeErrorDOMException-
如果
requiredFeatures属性中包含的特征未被GPUAdapter支持,则该 Promise 会以TypeError拒绝(reject)。
示例
基本示例
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,我们将最大限制 6 添加到requiredLimits对象中。 - 使用这些功能和限制要求以及
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: "my_queue",
},
requiredFeatures,
requiredLimits,
});
// …
}
规范
| 规范 |
|---|
| WebGPU # dom-gpuadapter-requestdevice |
浏览器兼容性
加载中…