GPUDevice: createComputePipeline() 方法

可用性有限

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

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

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

GPUDevice 介面的 createComputePipeline() 方法會建立一個 GPUComputePipeline,該物件可以控制計算著色器階段,並能在 GPUComputePassEncoder 中使用。

語法

js
createComputePipeline(descriptor)

引數

描述符(descriptor)

包含以下屬性的物件:

compute

一個描述流水線計算著色器入口點的物件。該物件可以包含以下屬性

constants 可選

一系列記錄型別,結構為 (id, value),代表 可在流水線中覆蓋的 WGSL 常量 的覆蓋值。它們表現得像有序對映。在每種情況下,id 是用於標識或選擇記錄的鍵,constant 是表示 WGSL 的列舉值。

根據您要覆蓋的常量,id 可以採用常量的數值 ID(如果指定了)的形式,否則就是常量的識別符號名稱。

提供幾個可覆蓋常量的值的程式碼片段可能如下所示

js
({
  // …
  constants: {
    0: false,
    1200: 3.0,
    1300: 2.0,
    width: 20,
    depth: -1,
    height: 15,
  },
});
entryPoint 可選

module 中用於執行其工作的函式的名稱。相應的著色器函式必須具有 @compute 屬性才能被識別為該入口點。有關更多資訊,請參閱 入口點宣告

如果您的著色器程式碼包含一個帶有 @compute 屬性的單個函式,您可以省略 entryPoint 屬性 — 瀏覽器將使用該函式作為預設入口點。如果省略 entryPoint 且瀏覽器無法確定預設入口點,則會生成 GPUValidationError,並且生成的 GPUComputePipeline 將無效。

模組

一個 GPUShaderModule 物件,包含此可程式設計階段將執行的 WGSL 程式碼。

label 可選

一個字串,提供可用於識別物件的標籤,例如在 GPUError 訊息或控制檯警告中。

layout

定義流水線執行期間使用的所有 GPU 資源(緩衝區、紋理等)的佈局(結構、用途和型別)。可能的值是

  • 一個 GPUPipelineLayout 物件,使用 GPUDevice.createPipelineLayout() 建立,它允許 GPU 提前計算出如何最高效地執行流水線。
  • 字串 "auto",這會導致流水線根據著色器程式碼中定義的任何繫結生成一個隱式的繫結組佈局。如果使用 "auto",生成的繫結組佈局只能與當前流水線一起使用。

返回值

一個 GPUComputePipeline 物件例項。

驗證

呼叫 createComputePipeline() 時必須滿足以下標準,否則將生成 GPUValidationError 並返回一個無效的 GPUComputePipeline 物件

  • compute 屬性中引用的 module 使用的工作組儲存大小小於或等於 GPUDevicemaxComputeWorkgroupStorageSize 限制
  • module 使用的每個工作組的計算呼叫次數小於或等於 GPUDevicemaxComputeInvocationsPerWorkgroup 限制
  • module 的工作組大小小於或等於 GPUDevice 相應的 maxComputeWorkgroupSizeXmaxComputeWorkgroupSizeYmaxComputeWorkgroupSizeZ 限制
  • 如果省略了 entryPoint 屬性,則著色器程式碼包含一個計算著色器入口點函式,供瀏覽器用作預設入口點。

示例

注意:WebGPU 示例 提供了更多示例。

基本示例

我們的 基本計算演示 展示了一個過程,包括

js
// …

const bindGroupLayout = device.createBindGroupLayout({
  entries: [
    {
      binding: 0,
      visibility: GPUShaderStage.COMPUTE,
      buffer: {
        type: "storage",
      },
    },
  ],
});

const computePipeline = device.createComputePipeline({
  layout: device.createPipelineLayout({
    bindGroupLayouts: [bindGroupLayout],
  }),
  compute: {
    module: shaderModule,
    entryPoint: "main",
  },
});

// …

規範

規範
WebGPU
# dom-gpudevice-createcomputepipeline

瀏覽器相容性

另見