GPUAdapter: requestDevice() 方法

可用性有限

此特性不是基線特性,因為它在一些最廣泛使用的瀏覽器中不起作用。

安全上下文: 此功能僅在安全上下文(HTTPS)中可用,且支援此功能的瀏覽器數量有限。

注意:此功能在 Web Workers 中可用。

GPUAdapter 介面的 requestDevice() 方法返回一個 Promise,該 Promise 解析(fulfills)為一個 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() 呼叫將失敗。每個具有非 undefined 值的鍵必須是 GPUSupportedLimits 中成員的名稱。

注意:您可以在請求 GPU 裝置時請求未知限制,而不會導致錯誤。這些限制將為 undefined。這很有用,因為它使 WebGPU 程式碼更加健壯——程式碼庫不會因為某個限制在介面卡中不再存在而停止工作。

並非所有瀏覽器都支援 WebGPU 中的所有功能和限制,即使底層硬體支援它們。有關更多資訊,請參閱 featureslimits 頁面。

返回值

一個 Promise,它解析(fulfills)為一個 GPUDevice 物件例項。

如果您進行了重複呼叫,即在已經呼叫過 requestDevice()GPUAdapter 上再次呼叫 requestDevice(),則該 Promise 將會解析(fulfill)為一個立即丟失的裝置。然後,您可以透過 GPUDevice.lost 獲取有關裝置丟失的資訊。

異常

OperationError DOMException

如果 requiredLimits 屬性中包含的限制未被 GPUAdapter 支援(因為它們不是有效限制,或者它們的值高於介面卡中這些限制的值),則該 Promise 會以 OperationError 拒絕(reject)。

TypeError DOMException

如果 requiredFeatures 屬性中包含的特徵未被 GPUAdapter 支援,則該 Promise 會以 TypeError 拒絕(reject)。

示例

基本示例

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,我們將最大限制 6 新增到 requiredLimits 物件中。
  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: "my_queue",
    },
    requiredFeatures,
    requiredLimits,
  });

  // …
}

規範

規範
WebGPU
# dom-gpuadapter-requestdevice

瀏覽器相容性

另見