GPUCommandEncoder: copyBufferToBuffer() 方法

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

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

copyBufferToBuffer() 方法是 GPUCommandEncoder 接口的一个方法,它用于编码将数据从一个 GPUBuffer 复制到另一个 GPUBuffer 的命令。

语法

js
copyBufferToBuffer(source, sourceOffset, destination, destinationOffset, size)

参数

source

要从中复制的 GPUBuffer

sourceOffset

以字节为单位的偏移量,表示从 source 中开始复制的位置。

destination

要复制到的 GPUBuffer

destinationOffset

destination 中开始复制到的偏移量(以字节为单位)。

size

要复制的字节数。

返回值

无 (Undefined)。

验证

调用 copyBufferToBuffer() 时必须满足以下条件,否则会生成 GPUValidationError 并且 GPUCommandEncoder 将变为无效

  • sourceGPUBuffer.usage 包含 GPUBufferUsage.COPY_SRC 标志。
  • destinationGPUBuffer.usage 包含 GPUBufferUsage.COPY_DST 标志。
  • sizesourceOffsetdestinationOffset 都是 4 的倍数。
  • sourceGPUBuffer.size 大于或等于 sourceOffset + size
  • destinationGPUBuffer.size 大于或等于 destinationOffset + size
  • sourcedestination 是不同的 GPUBuffer(不能从同一个缓冲区复制到同一个缓冲区)。

示例

在我们 基本的计算演示 中,我们使用 copyBufferToBuffer()output 缓冲区的内容复制到 stagingBuffer

js
// ...

// Create an output buffer to read GPU calculations to, and a staging buffer to be mapped for JavaScript access

const output = device.createBuffer({
  size: BUFFER_SIZE,
  usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_SRC,
});

const stagingBuffer = device.createBuffer({
  size: BUFFER_SIZE,
  usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,
});

// ...

// Create GPUCommandEncoder to encode commands to issue to the GPU
const commandEncoder = device.createCommandEncoder();

// ...

// Copy output buffer to staging buffer
commandEncoder.copyBufferToBuffer(
  output,
  0, // Source offset
  stagingBuffer,
  0, // Destination offset
  BUFFER_SIZE,
);

// ...

规范

规范
WebGPU
# dom-gpucommandencoder-copybuffertobuffer

浏览器兼容性

BCD 表格仅在浏览器中加载

另请参阅