files/en-us/web/api/gpucommandencoder/copytexturetobuffer/index.md
{{APIRef("WebGPU API")}}{{SecureContext_Header}}
The copyTextureToBuffer() method of the
{{domxref("GPUCommandEncoder")}} interface encodes a command that copies data from a {{domxref("GPUTexture")}} to a {{domxref("GPUBuffer")}}.
copyTextureToBuffer(source, destination, copySize)
source
copySize, defines the region of the source texture subresource. source can take the following properties:
aspect {{optional_inline}}
: An enumerated value defining which aspects of the texture to copy the data from. Possible values are:
"all"
"depth-only"
"stencil-only"
If omitted, aspect takes a value of "all".
mipLevel {{optional_inline}}
mipLevel defaults to 0.origin {{optional_inline}}
: An object or array specifying the origin of the copy — the minimum corner of the texture region to copy the data from. Together with size, this defines the full extent of the region to copy from. The x, y, and z values default to 0 if any of all of origin is omitted.
For example, you can pass an array [0, 0, 0], or its equivalent object { x: 0, y: 0, z: 0 }.
texture
destination
copySize, it defines the region of the destination buffer. source can take the following properties:
buffer
offset {{optional_inline}}
data to the start position to write the copied data to. If omitted, offset defaults to 0.bytesPerRow {{optional_inline}}
rowsPerImage {{optional_inline}}
bytesPerRow × rowsPerImage will give you the stride, in bytes, between the start of each complete image. This is required if there are multiple images to copy.copySize
: An object or array specifying the width, height, and depth/array layer count of the copied data. The width value must always be specified, while the height and depth/array layer count values are optional and will default to 1 if omitted.
For example, you can pass an array [16, 16, 2], or its equivalent object { width: 16, height: 16, depthOrArrayLayers: 2 }.
None ({{jsxref("Undefined")}}).
The following criteria must be met when calling copyTextureToBuffer(), otherwise a {{domxref("GPUValidationError")}} is generated and the {{domxref("GPUCommandEncoder")}} becomes invalid.
For the source:
mipLevel is less than the {{domxref("GPUTexture.mipLevelCount")}}.origin.x is a multiple of the texel block width of the {{domxref("GPUTexture.format")}}.origin.y is a multiple of the texel block height of the {{domxref("GPUTexture.format")}}.size.source's {{domxref("GPUTexture.usage")}} includes the GPUTextureUsage.COPY_SRC flag.source's {{domxref("GPUTexture.sampleCount")}} is 1.source.aspect refers to a single aspect of the {{domxref("GPUTexture.format")}}.source is compatible with the copySize.For the destination:
destination.bytesPerRow is a multiple of 256.destination.buffer's {{domxref("GPUBuffer.usage")}} includes the GPUBufferUsage.COPY_DST flag.commandEncoder.copyTextureToBuffer(
{
texture: sourceTexture,
},
{
buffer: destinationBuffer,
},
{
width: 16,
height: 16,
depthOrArrayLayers: 2,
},
);
{{Specifications}}
{{Compat}}