GPUQueue: copyExternalImageToTexture() method
Limited availability
This feature is not Baseline because it does not work in some of the most widely-used browsers.
Secure context: This feature is available only insecure contexts (HTTPS), in some or allsupporting browsers.
Note: This feature is available inWeb Workers.
ThecopyExternalImageToTexture() method of theGPUQueue interface copies a snapshot taken from a source image, video, or canvas into a givenGPUTexture.
Using this function allows the user agent to determine the most efficient way to copy the data over for each source type.
In this article
Syntax
copyExternalImageToTexture(source, destination, copySize)Parameters
sourceAn object representing the source to write to the destination, and its origin. This can take the following properties:
sourceAn object providing the source of the snapshot to copy. This can be an
HTMLCanvasElement,HTMLImageElement,HTMLVideoElement,ImageBitmap,ImageData,OffscreenCanvas, orVideoFrameobject. The image source data is captured at the exact momentcopyExternalImageToTexture()is invoked.originOptionalAn object or array specifying the origin of the copy — the top-left corner of the source sub-region to copy from. Together with
copySize, this defines the full extent of the source sub-region. Thexandyvalues default to 0 if any of all oforiginis omitted.For example, you can pass an array like
[0, 0], or its equivalent object{ x: 0, y: 0 }.flipYOptionalA boolean. If set to
true, the image capture is flipped vertically. If omitted,flipYdefaults tofalse.
destinationAn object defining the texture subresource and origin to write the captured image to, plus encoding metadata. This can take the following properties:
aspectOptionalAn enumerated value defining which aspects of the texture to write the image to. Possible values are:
"all"All available aspects of the texture format will be written to, which can mean all or any of color, depth, and stencil, depending on what kind of format you are dealing with.
"depth-only"Only the depth aspect of adepth-or-stencil format will be written to.
"stencil-only"Only the stencil aspect of a depth-or-stencil format will be written to.
If omitted,
aspecttakes a value of"all".colorSpaceOptionalAn enumerated value describing the color space and encoding used to encode data into the destination texture. Possible values are
"srgb"and"display-p3". If omitted,colorSpacedefaults to"srgb".Note:The encoding may result in values outside of the range
[0, 1]being written to the target texture, if its format can represent them. Otherwise, the results are clamped to the target texture format's range. Conversion may not be necessary ifcolorSpacematches the source image color space.mipLevelOptionalA number representing the mip-map level of the texture to write the image to. If omitted,
mipLeveldefaults to 0.originOptionalAn object or array specifying the origin of the copy — the minimum corner of the texture region to write the image data to. Together with
copySize, this defines the full extent of the region to copy to. Thex,y, andzvalues default to 0 if any of all oforiginis omitted.For example, you can pass an array like
[0, 0, 0], or its equivalent object{ x: 0, y: 0, z: 0 }.premultipliedAlphaOptionalA boolean. If set to
true, the image data written into the texture will have its RGB channels premultiplied by the alpha channel. If omitted,premultipliedAlphadefaults tofalse.Note:If this option is set to
trueand thesourceis also premultiplied, the source RGB values must be preserved even if they exceed their corresponding alpha values.textureA
GPUTextureobject representing the texture to write the data to.
copySizeAn object or array specifying
width,height, anddepthOrArrayLayers— of the region to copy from/to.For example, you can pass an array like
[16, 1, 1], or its equivalent object{ width: 16, height: 1, depthOrArrayLayers: 1 }.The
widthvalue has to be included. If theheightordepthOrArrayLayersvalues are omitted, they default to 1.
Return value
None (Undefined).
Exceptions
OperationErrorDOMExceptionThe method throws an
OperationErrorif the following criteria are not met:source.origin.x+ the width of the region to copy to is less than or equal to the width of the source image.source.origin.y+ the height of the region to copy to is less than or equal to the height of the source image.source.origin.z+ the depthOrArrayLayers of the region to copy to is less than or equal to 1.dataOffsetis equal to or smaller than the size ofdata.- The size of
data(when converted to bytes, in the case ofTypedArrays) is a multiple of 4.
SecurityErrorDOMExceptionThrown if the image source data is cross-origin.
Validation
The following criteria must be met when callingwriteTexture(), otherwise aGPUValidationError is generated and theGPUQueue becomes invalid:
mipLevelis less than the destinationGPUTexture.mipLevelCount.origin.xis a multiple of the texel block width of the destinationGPUTexture.format.origin.yis a multiple of the texel block height of the destinationGPUTexture.format.- If the destination
GPUTexture.formatis adepth-or-stencil format, the image capture size is equal tosize. - The destination
GPUTexture.usageincludes theGPUTextureUsage.COPY_DSTandGPUTextureUsage.RENDER_ATTACHMENTflags. - The destination
GPUTexture.dimensionis"2d". - The destination
GPUTexture.sampleCountis 1. - The destination
GPUTexture.formatis one of the following (which supportGPUTextureUsage.RENDER_ATTACHMENTusage):"r8unorm""r16float""r32float""rg8unorm""rg16float""rg32float""rgba8unorm""rgba8unorm-srgb""bgra8unorm""bgra8unorm-srgb""rgb10a2unorm""rgba16float""rgba32float"
destination.origin.x+copySize.widthis less than or equal to thedestinationGPUTexturewidth.destination.origin.y+copySize.heightis less than or equal to thedestinationGPUTextureheight.destination.origin.z+copySize.depthOrArrayLayersis less than or equal to thedestinationGPUTexturedepthOrArrayLayers.- The
destinationGPUTexture.widthis a multiple of the texel block width of the destinationGPUTexture.format. - The
destinationGPUTexture.heightis a multiple of the texel block height of the destinationGPUTexture.format.
Examples
In the WebGPU SamplesTextured Cube example, the following snippet is used to fetch an image and upload it into aGPUTexture:
let cubeTexture;{ const img = document.createElement("img"); img.src = new URL( "../../../assets/img/Di-3d.png", import.meta.url, ).toString(); await img.decode(); const imageBitmap = await createImageBitmap(img); cubeTexture = device.createTexture({ size: [imageBitmap.width, imageBitmap.height, 1], format: "rgba8unorm", usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST | GPUTextureUsage.RENDER_ATTACHMENT, }); device.queue.copyExternalImageToTexture( { source: imageBitmap }, { texture: cubeTexture }, [imageBitmap.width, imageBitmap.height], );}Specifications
| Specification |
|---|
| WebGPU> # dom-gpuqueue-copyexternalimagetotexture> |
Browser compatibility
See also
- TheWebGPU API