SuperAPI AI 工具集

webgpu-impl-buffer-upload

数据与分析

查看项目

更新于 10-15 22:18

技能介绍

用途:在 WebGPU 1.0-stable(Chrome 113+、Safari 26+、Firefox 141+)中把数据从 CPU 上传到 GPU 缓冲区或纹理,以及把 GPU 结果回读到 CPU,重点处理最容易触发验证错误的字节对齐规则。

主要能力:对比三种上传路径的适用场景与所需标志位。queue.writeBuffer 是常规上传的默认选择,目标缓冲区需带 COPY_DST。mappedAtCreation: true 适合创建时写入一次的顶点、索引或 uniform 数据,无需 COPY_DST 且省去内部拷贝。暂存缓冲区环形复用(2-3 个缓冲区)适合每帧重写的大缓冲区,但只有在实测 writeBuffer 成为瓶颈后才应使用。回读方面,缓冲区回读需先 copyBufferToBuffer 到带 COPY_DST | MAP_READ 的缓冲区;纹理回读需 copyTextureToBuffer,且 bytesPerRow 必须是 256 的倍数,目标缓冲区按填充后的行距乘高度分配,映射后在 CPU 侧去掉填充。

必要用法:回读流程为创建 COPY_DST | MAP_READ 目标缓冲区、编码拷贝、queue.submit、await mapAsync(GPUMapMode.READ)、getMappedRange 取视图、用 slice 或 set 把字节复制出来、再 unmap。mapAsync 的 promise 只有在先前提交的相关工作完成后才 resolve,是与 GPU 同步的关键点;若需确认其他提交完成,应 await device.queue.onSubmittedWorkDone()。

对齐规则:writeBuffer 的 bufferOffset 和 size 为 4 的倍数;mappedAtCreation 的 size 为 4 的倍数;mapAsync/getMappedRange 的 offset 为 8 的倍数、size 为 4 的倍数;bytesPerRow 为 256 的倍数。

限制与常见错误:MAP_READ 只能与 COPY_DST 组合,MAP_WRITE 只能与 COPY_SRC 组合,否则验证失败;不得在已映射或已销毁的缓冲区上调用 writeBuffer;不得对 mapState 为 pending 或 mapped 的缓冲区再次 mapAsync;getMappedRange 返回的 ArrayBuffer 在 unmap 后会被分离,必须在 unmap 前复制数据;copyTextureToBuffer 或 copyBufferToTexture 的 bytesPerRow 必须为 256 的倍数;提交 submit 后不可假定数据已就绪。

适用场景:WebGPU 计算或渲染中的缓冲区初始化、逐帧 uniform 更新、存储缓冲区与纹理结果回读、GPU 计算验证与像素下载等。具体性能数据、收费与平台细节资料未提供。