Name

    NV_copy_buffer

Name Strings

    GL_NV_copy_buffer

Contact

    Mathias Heyer, NVIDIA Corporation (mheyer 'at' nvidia.com)

Contributors

    From ARB_copy_buffer:
    Rob Barris, Blizzard Entertainment
    Bruce Merry, ARM
    Eric Werness, NVIDIA
    Greg Roth, NVIDIA
    Daniel Koch, NVIDIA

Status

    Shipping on Tegra

Version

    Last Modified Date: September 20, 2013
    Author Revision: 3

Number

    OpenGL ES Extension #158

Dependencies

    Written based on the wording of the OpenGL ES 2.0.25 (Nov, 2010)
    specification.
    
    OES_mapbuffer extension affects the definition of this extension.

Overview

    This extension provides a mechanism to do an accelerated copy from one
    buffer object to another. This may be useful to load buffer objects
    in a "loading thread" while minimizing cost and synchronization effort
    in the "rendering thread."

New Tokens

    Accepted by the target parameters of BindBuffer, BufferData,
    BufferSubData, MapBufferOES, UnmapBufferOES, 
    GetBufferPointervOES, GetBufferParameteriv and CopyBufferSubDataNV:

    COPY_READ_BUFFER_NV                    0x8F36
    COPY_WRITE_BUFFER_NV                   0x8F37

New Procedures and Functions

    void CopyBufferSubDataNV(enum readtarget, enum writetarget,
                             intptr readoffset, intptr writeoffset,
                             sizeiptr size);

Additions to Chapter 2 of the OpenGL ES 2.0 Specification (Rasterization)

    Add a new subsection "Copying Between Buffers" to section 2.9:

    All or part of one buffer object's data store may be copied to the
    data store of another buffer object by calling

    void CopyBufferSubDataNV(enum readtarget, enum writetarget,
                             intptr readoffset, intptr writeoffset,
                             sizeiptr size);

    with readtarget and writetarget each set to one of the targets
    ARRAY_BUFFER, COPY_READ_BUFFER_NV, COPY_WRITE_BUFFER_NV or
    ELEMENT_ARRAY_BUFFER. While any of these targets may be used,
    the COPY_READ_BUFFER_NV and COPY_WRITE_BUFFER_NV targets are
    provided specifically for copies, so that they can be done without
    affecting other buffer binding targets that may be in use.
    writeoffset and size specify the range of data in the buffer object
    bound to writetarget that is to be replaced, in terms of basic machine
    units. readoffset and size specify the range of data in the buffer
    object bound to readtarget that is to be copied to the corresponding
    region of writetarget.
    
    A buffer object is bound to COPY_READ_BUFFER_NV or COPY_WRITE_BUFFER_NV
    by calling BindBuffer with target set to COPY_READ_BUFFER_NV or
    COPY_WRITE_BUFFER_NV and buffer set to the name of the buffer object.
    If no corresponding buffer object exists, one is initialized as
    defined in section 2.9.
    
    The commands BufferData, BufferSubData, MapBufferOES, UnmapBufferOES, 
    GetBufferPointervOES, GetBufferParameteriv (section 6.1.3)  may be used
    with target set to COPY_READ_BUFFER_NV or COPY_WRITE_BUFFER_NV. In such
    event, these commands operate in the same fashion as described in section
    2.9 and 6.3.1 but on the buffer currently bound to target
    COPY_READ_BUFFER_NV or COPY_WRITE_BUFFER_NV respectively.

    An INVALID_VALUE error is generated if any of readoffset,
    writeoffset, or size are negative, if readoffset+size exceeds the
    size of the buffer object bound to readtarget, or if
    writeoffset+size exceeds the size of the buffer object bound to
    writetarget.

    An INVALID_VALUE error is generated if the same buffer object is
    bound to both readtarget and writetarget, and the ranges
    [readoffset, readoffset+size) and [writeoffset, writeoffset+size)
    overlap.

    An INVALID_OPERATION error is generated if zero is bound to
    readtarget or writetarget.
    
    An INVALID_OPERATION error is generated if the buffer objects
    bound to either readtarget or writetarget are mapped.

Additions to the AGL/EGL/GLX/WGL Specifications

    None

Errors

    The error INVALID_VALUE is generated by CopyBufferSubDataNV if
    readoffset, writeoffset, or size are less than zero, or if
    readoffset+size is greater than the value of BUFFER_SIZE of
    readtarget/readBuffer, or if writeoffset+size is greater than the
    value of BUFFER_SIZE of writetarget/writeBuffer.
    
    The error INVALID_OPERATION is generated by CopyBufferSubDataNV if
    either readtarget/readBuffer or writetarget/writeBuffer are mapped.

    The error INVALID_VALUE is generated by CopyBufferSubDataNV if
    readtarget/readBuffer and writetarget/writeBuffer are the same
    buffer object, and the ranges [readoffset, readoffset+size) and
    [writeoffset, writeoffset+size) overlap.

New State

    (add to table 6.2, Vertex Array State)

                                            Initial
    Get Value              Type    Get Command Value   Description                 Sec.    
    ----------------       ----    ----------- ------- --------------------------- ------  
    COPY_READ_BUFFER_NV    Z+      GetIntegerv 0       Buffer object bound to the  2.9     
                                                       copy buffer "read" binding
                                                       point
    COPY_WRITE_BUFFER_NV   Z+      GetIntegerv 0       Buffer object bound to the  2.9     
                                                       copy buffer "write"
                                                       binding point

Issues

    1) How is this extension useful?
        
    This can be a desirable replacement to BufferSubData if there are
    large updates that will pollute the CPU cache. If generating the data
    can be offloaded to another thread, then the CPU cost of the update
    in the rendering thread can be very small.

    Finally, if an implementation supports concurrent data transfers in
    one context/thread while doing rendering in another context/thread,
    this extension may be used to move data from system memory to video
    memory in preparation for copying it into another buffer in the
    rendering thread.
       

Dependencies on OES_mapbuffer

    If OES_mapbuffer is not present, references to MapBufferOES and
    UnmapBufferOES should be ignored and language referring to mapped
    buffer objects should be removed.
    
Revision History

    Revision 3, 2013/08/20
    - minor edits for publishing
    Revision 2, 2012/04/19
    - Added explicit interaction with BufferData, BufferSubData, MapBufferOES,
      UnmapBufferOES, GetBufferPointervOES and GetBufferParameteriv
    Revision 1, 2012/04/18
     - Initial draft by starting with a copy of ARB_copy_buffer and stripping
       it to ES

