GPUDevice: createComputePipelineAsync() 方法

实验性: 这是一个 实验性技术
在生产环境中使用此功能之前,请仔细查看 浏览器兼容性表格

安全上下文: 此功能仅在 安全上下文 (HTTPS) 中可用,在某些或所有 支持的浏览器 中可用。

GPUDevice 接口的 createComputePipelineAsync() 方法返回一个 Promise,该方法在管道可以使用且不会出现任何停滞时,会实现一个 GPUComputePipeline,该管道可以控制计算着色器阶段并用于 GPUComputePassEncoder

注意: 通常情况下,只要有可能,就应该使用此方法而不是 GPUDevice.createComputePipeline(),因为它可以防止在管道编译时阻塞 GPU 操作执行。

语法

js
createComputePipeline(descriptor)

参数

descriptor

请参阅 GPUDevice.createComputePipeline() 方法的描述符定义。

返回值

一个 Promise,当创建的管道准备好在没有额外延迟的情况下使用时,它会实现一个 GPUComputePipeline 对象实例。

验证

如果管道创建失败,并且由此导致生成的管道无效,则返回的 promise 将会拒绝一个 GPUPipelineError

  • 如果这是由于内部错误导致的,则 GPUPipelineErrorreason 将为 "internal"
  • 如果这是由于验证错误导致的,则 GPUPipelineErrorreason 将为 "validation"

如果以下任何一项为假,则会发生验证错误

  • compute 属性中引用的 module 所使用的工作组存储大小小于或等于 GPUDevicemaxComputeWorkgroupStorageSize 限制
  • module 使用的工作组每组计算调用次数小于或等于 GPUDevicemaxComputeInvocationsPerWorkgroup 限制
  • module 的工作组大小小于或等于 GPUDevice 对应的 maxComputeWorkgroupSizeXmaxComputeWorkgroupSizeYmaxComputeWorkgroupSizeZ 限制

示例

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

基本示例

以下示例展示了以下过程:

js
async function init() {
  // ...

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

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

  // ...
}

规范

规范
WebGPU
# dom-gpudevice-createcomputepipelineasync

浏览器兼容性

BCD 表格仅在启用 JavaScript 的浏览器中加载。

另请参阅