ComputePass
计算派发的记录单元:绑定一条计算管线,按工作组数量发起 dispatch, 结束后交回编码器统一提交。
创建参数
| 参数 | 说明 |
|---|---|
timestampQuerySet | 写入起止时间戳的查询集 |
beginTimestampIndex | 开始时间戳的槽位,未提供则不写 |
endTimestampIndex | 结束时间戳的槽位,未提供则不写 |
id | 调试标识 |
方法
| 方法 | 说明 |
|---|---|
setPipeline(pipeline) | 选择后续派发使用的计算管线 |
dispatch(x, y?, z?) | 按工作组数量派发,三个方向可分别指定 |
dispatchIndirect(buffer, offset?) | 从缓冲区读取三个 32 位无符号整数作为工作组数量 |
pushDebugGroup(label) / popDebugGroup() | 给命令流打标签 |
insertDebugMarker(label) | 插入单点标记 |
end() | 结束通道 |
核心层的计算通道只暴露管线与派发命令,缓冲区、纹理绑定在管线之外准备。
需要完整的 GPU 数据流封装时,看 @luma.gl/gpgpu 模块。
工作组数量的算法
workgroup_size(64) 表示每个工作组 64 个调用。
处理 n 个元素要派发 Math.ceil(n / 64) 个工作组:
const COUNT = 65536;
const WORKGROUP_SIZE = 64;
const pass = device.beginComputePass();
pass.setPipeline(pipeline);
pass.dispatch(Math.ceil(COUNT / WORKGROUP_SIZE));
pass.end();
device.submit();
少派一个工作组会漏掉尾部元素,多派则必须让着色器自己判断下标越界。
上面 WGSL 里的 if (i < arrayLength(&values)) 就是为此准备的。
间接派发
/* 缓冲区里依次是 x、y、z 三个 u32 工作组数量 */
const args = device.createBuffer({
data: new Uint32Array([1024, 1, 1])
});
const pass = device.beginComputePass();
pass.setPipeline(pipeline);
pass.dispatchIndirect(args, 0);
pass.end();
device.submit();
间接派发让 GPU 根据缓冲区内容决定工作量,适合前缀和、剔除后计数这类 结果规模在运行期才能确定的任务。缓冲区必须是紧密排列的 12 个字节。
后端限制
WebGL 2 没有计算通道,beginComputePass 在该后端直接抛错。
WebGPU 才支持 dispatch 与间接派发。
另外 dispatchIndirect 需要存储缓冲用途,WebGL 无法模拟。
派发不会自动等待前序结果。 两段计算需要串行时,放在同一编码器的两次通道里按顺序记录; 跨帧或跨提交的依赖要自己拆成两次提交,中间用回读或栅栏同步。
经纬志(2026)。《ComputePass》。https://www.jingweizhi.com/lumagl/api/compute-pass.html(访问日期 2026-11-03)。