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

浏览器兼容性

另见