| 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 |
| |