## Name

glCopyBufferSubData, glCopyNamedBufferSubData — copy all or part of the data store of a buffer object to the data store of another buffer object

## C Specification

`void glCopyBufferSubData(` | GLenum readTarget,
| GLenum writeTarget,
| GLintptr readOffset,
| GLintptr writeOffset,
| GLsizeiptr size`)`;

`void glCopyNamedBufferSubData(` | GLuint readBuffer,
| GLuint writeBuffer,
| GLintptr readOffset,
| GLintptr writeOffset,
| GLsizei size`)`;

## Parameters

`readTarget`

  Specifies the target to which the source buffer object is bound for `glCopyBufferSubData`

`writeTarget`

  Specifies the target to which the destination buffer object is bound for `glCopyBufferSubData`.

`readBuffer`

  Specifies the name of the source buffer object for `glCopyNamedBufferSubData`.

`writeBuffer`

  Specifies the name of the destination buffer object for `glCopyNamedBufferSubData`.

`readOffset`

  Specifies the offset, in basic machine units, within the data store of the source buffer object at which data will be read.

`writeOffset`

  Specifies the offset, in basic machine units, within the data store of the destination buffer object at which data will be written.

`size`

  Specifies the size, in basic machine units, of the data to be copied from the source buffer object to the destination buffer object.

## Description

`glCopyBufferSubData` and `glCopyNamedBufferSubData` copy part of the data store attached to a source buffer object to the data store attached to a destination buffer object. The number of basic machine units indicated by `size` is copied from the source at offset `readOffset` to the destination at `writeOffset`. `readOffset`, `writeOffset` and `size` are in terms of basic machine units.

For `glCopyBufferSubData`, `readTarget` and `writeTarget` specify the targets to which the source and destination buffer objects are bound, and must each be one of the buffer binding targets in the following table:

Buffer Binding Target | Purpose
--- | ---
`GL_ARRAY_BUFFER` | Vertex attributes
`GL_ATOMIC_COUNTER_BUFFER` | Atomic counter storage
`GL_COPY_READ_BUFFER` | Buffer copy source
`GL_COPY_WRITE_BUFFER` | Buffer copy destination
`GL_DISPATCH_INDIRECT_BUFFER` | Indirect compute dispatch commands
`GL_DRAW_INDIRECT_BUFFER` | Indirect command arguments
`GL_ELEMENT_ARRAY_BUFFER` | Vertex array indices
`GL_PIXEL_PACK_BUFFER` | Pixel read target
`GL_PIXEL_UNPACK_BUFFER` | Texture data source
`GL_QUERY_BUFFER` | Query result buffer
`GL_SHADER_STORAGE_BUFFER` | Read-write storage for shaders
`GL_TEXTURE_BUFFER` | Texture data buffer
`GL_TRANSFORM_FEEDBACK_BUFFER` | Transform feedback buffer
`GL_UNIFORM_BUFFER` | Uniform block storage

Any of these targets may be used, but the targets `GL_COPY_READ_BUFFER` and `GL_COPY_WRITE_BUFFER` are provided specifically to allow copies between buffers without disturbing other GL state.

`readOffset`, `writeOffset` and `size` must all be greater than or equal to zero. Furthermore, $readOffset+size$ must not exceeed the size of the source buffer object, and $writeOffset+size$ must not exceeed the size of the buffer bound to `writeTarget`. If the source and destination are the same buffer object, then the source and destination ranges must not overlap.

## Notes

The `GL_DISPATCH_INDIRECT_BUFFER` and `GL_SHADER_STORAGE_BUFFER` targets are available only if the GL version is 4.3 or greater.

The `GL_QUERY_BUFFER` target is available only if the GL version is 4.4 or greater.

## Errors

`GL_INVALID_ENUM` is generated by `glCopyBufferSubData` if `readTarget` or `writeTarget` is not one of the buffer binding targets listed above.

`GL_INVALID_OPERATION` is generated by `glCopyBufferSubData` if zero is bound to `readTarget` or `writeTarget`.

`GL_INVALID_OPERATION` is generated by `glCopyNamedBufferSubData` if `readBuffer` or `writeBuffer` is not the name of an existing buffer object.

`GL_INVALID_VALUE` is generated if any of `readOffset`, `writeOffset` or `size` is negative, if $readOffset + size$ is greater than the size of the source buffer object (its value of `GL_BUFFER_SIZE`), or if $writeOffset + size$ is greater than the size of the destination buffer object.

`GL_INVALID_VALUE` is generated if the source and destination are the same buffer object, and the ranges $[readOffset,readOffset+size)$ and $[writeOffset,writeOffset+size)$ overlap.

`GL_INVALID_OPERATION` is generated if either the source or destination buffer object is mapped with glMapBufferRange or glMapBuffer, unless they were mapped with the `GL_MAP_PERSISTENT` bit set in the `glMapBufferRange` `access` flags.

## Version Support

| OpenGL Version
--- | ---
Function / Feature Name | 2.0 | 2.1 | 3.0 | 3.1 | 3.2 | 3.3 | 4.0 | 4.1 | 4.2 | 4.3 | 4.4 | 4.5
`glCopyBufferSubData` | - | - | - | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | ✔
`glCopyNamedBufferSubData` | - | - | - | - | - | - | - | - | - | - | - | ✔

## See Also

glGenBuffers, glBindBuffer, glBufferData, glBufferSubData, glGetBufferSubData, glMapBuffer, glMapBufferRange

## Copyright

Copyright © 2010-2014 Khronos Group. This material may be distributed subject to the terms and conditions set forth in the Open Publication License, v 1.0, 8 June 1999. http://opencontent.org/openpub/.