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 |
瀏覽器相容性
載入中…