GPUDevice: createComputePipeline() 方法
注意:此功能在 Web Workers 中可用。
GPUDevice 接口的 createComputePipeline() 方法会创建一个 GPUComputePipeline,该对象可以控制计算着色器阶段,并能在 GPUComputePassEncoder 中使用。
语法
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使用的工作组存储大小小于或等于GPUDevice的maxComputeWorkgroupStorageSize限制。module使用的每个工作组的计算调用次数小于或等于GPUDevice的maxComputeInvocationsPerWorkgroup限制。module的工作组大小小于或等于GPUDevice相应的maxComputeWorkgroupSizeX、maxComputeWorkgroupSizeY或maxComputeWorkgroupSizeZ限制。- 如果省略了
entryPoint属性,则着色器代码包含一个计算着色器入口点函数,供浏览器用作默认入口点。
示例
注意:WebGPU 示例 提供了更多示例。
基本示例
我们的 基本计算演示 展示了一个过程,包括
- 使用
GPUDevice.createBindGroupLayout()创建绑定组布局。 - 将
bindGroupLayout输入到GPUDevice.createPipelineLayout()中以创建GPUPipelineLayout。 - 在
createComputePipeline()调用中立即使用该值来创建GPUComputePipeline。
// …
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 |
浏览器兼容性
加载中…