| Name |
| |
| ARB_clear_buffer_object |
| |
| Name Strings |
| |
| GL_ARB_clear_buffer_object |
| |
| Contact |
| |
| Graham Sellers (graham.sellers 'at' amd.com) |
| |
| Contributors |
| |
| Jon Leech |
| Piers Daniell, NVIDIA |
| Mark Kilgard, NVIDIA |
| |
| Notice |
| |
| Copyright (c) 2012-2014 The Khronos Group Inc. Copyright terms at |
| http://www.khronos.org/registry/speccopyright.html |
| |
| Status |
| |
| Complete. |
| Approved by the ARB on 2012/06/12. |
| |
| Version |
| |
| Last Modified Date: February 18, 2014 |
| Version: 13 |
| |
| Number |
| |
| ARB Extension #121 |
| |
| Dependencies |
| |
| OpenGL 1.5 is required. |
| |
| The definition of this extension is dependent on EXT_direct_state_access. |
| |
| This extension is written against the OpenGL 4.2 (Core) Specification. |
| |
| Overview |
| |
| Buffer objects are fundamental to the operation of OpenGL. Buffers are used |
| as a source of data for vertices and indices, read through buffer textures |
| in shaders, used to transfer texture and image data into and out of |
| textures and framebuffers, and may be written to by operations such as |
| transform feedback. OpenGL contains mechanisms to copy sections of buffers |
| from one to another, but it has no mechanism to initialize the content |
| of a buffer to a known value. In effect, it has memcpy, but not memset. |
| |
| This extension adds such a mechanism and has several use cases. Examples |
| include clearing a pixel unpack buffer before transferring data to |
| a texture or resetting buffer data to a known value before sparse updates |
| through shader image stores or transform feedback. |
| |
| IP Status |
| |
| No known IP claims. |
| |
| New Procedures and Functions |
| |
| void ClearBufferData(enum target, |
| enum internalformat, |
| enum format, |
| enum type, |
| const void * data); |
| |
| void ClearBufferSubData(enum target, |
| enum internalformat, |
| intptr offset, |
| sizeiptr size, |
| enum format, |
| enum type, |
| const void * data); |
| |
| When EXT_direct_state_access is present: |
| |
| void ClearNamedBufferDataEXT(uint buffer, |
| enum internalformat, |
| enum format, |
| enum type, |
| const void * data); |
| |
| void ClearNamedBufferSubDataEXT(uint buffer, |
| enum internalformat, |
| intptr offset, |
| sizeiptr size, |
| enum format, |
| enum type, |
| const void * data); |
| |
| New Tokens |
| |
| None. |
| |
| Additions to Chapter 2 of the OpenGL 4.2 (Core Profile) Specification |
| (OpenGL Operation) |
| |
| Append to the end of Section 2.9.2, "Creating Buffer Object Stores" |
| |
| To fill all or part of an existing buffer object's data store with a |
| constant value, call |
| |
| void ClearBufferSubData(enum target, |
| enum internalformat, |
| sizeiptr offset, |
| sizeiptr size, |
| enum format, |
| enum type, |
| const void * data); |
| |
| with <target> set to the target to which the destination buffer is bound. |
| <target> must be one of the targets listed in Table 2.8. |
| <internalformat> must be set to one of the format tokens listed in Table |
| 3.15, "Internal formats for buffer textures". <format> and <type> specify |
| the format and type of the source data and are interpreted as described in |
| Section 3.7.2. <offset> set to the offset, measured in basic |
| machine units, into the buffer object's data store from which to begin |
| filling, and <size> set to the size, also in basic machine units, of the |
| range to fill. Both <offset> and <range> must be multiples of the number |
| of basic machine units per-element for that internal format specified by |
| <internalformat>, otherwise the error INVALID_VALUE is generated. |
| <data> is a pointer to an array of between one and four components |
| containing the data to be used as the source of the constant fill value. |
| The elements of <data> are converted by the GL into the format specified by |
| <internalformat> in the manner described in section 2.3.1, and then used to |
| fill the specified range of the destination buffer. If <data> is NULL, then |
| the pointer is ignored and the sub-range of the buffer is filled with zeros. |
| |
| If <offset> or <size> is less than zero, or if <offset> + <size> is |
| greater than the value of BUFFER_SIZE for the buffer bound to <target> |
| then the error INVALID_VALUE is generated. The command |
| |
| An INVALID_OPERATION error is generated if any part of the specified |
| range of the buffer bound to <target> is currently mapped. |
| |
| void ClearBufferData(enum target, |
| enum internalformat, |
| enum format, |
| enum type, |
| const void * data); |
| |
| is equivalent to calling ClearBufferSubData with <target>, |
| <internalformat> and <data> as specified, with <offset> set to zero, |
| and <size> set to the value of BUFFER_SIZE for the buffer bound to |
| <target>. |
| |
| The commands: |
| |
| void ClearNamedBufferDataEXT(uint buffer, |
| enum internalformat, |
| enum format, |
| enum type, |
| const void * data); |
| |
| and |
| |
| void ClearNamedBufferSubDataEXT(uint buffer, |
| enum internalformat, |
| sizeiptr offset, |
| sizeiptr size, |
| enum format, |
| enum type, |
| const void * data); |
| |
| are equivalent to calling ClearBufferData and ClearBufferSubData, |
| respectively, except that the buffer object to be accessed is specified |
| in the <buffer> parameter rather than being derived from the <target> |
| buffer binding point. |
| |
| Additions to Chapter 3 of the OpenGL 4.2 (Core Profile) Specification |
| (Rasterization) |
| |
| None. |
| |
| Additions to Chapter 4 of the OpenGL 4.2 (Core Profile) Specification |
| (Per-Fragment Operations and the Frame Buffer) |
| |
| None. |
| |
| Additions to Chapter 5 of the OpenGL 4.2 (Core Profile) Specification |
| (Special Functions) |
| |
| None. |
| |
| Additions to Chapter 6 of the OpenGL 4.2 (Core Profile) Specification |
| (State and State Requests) |
| |
| None. |
| |
| Errors |
| |
| INVALID_ENUM is generated by ClearBufferSubData if <internalformat> |
| is not one of the sized internal format identifiers listed in Table 3.15. |
| |
| INVAILD_ENUM is generated by ClearBufferSubData <target> is not a legal |
| buffer binding point. |
| |
| INVALID_ENUM is generated by ClearBufferSubData if <format> or <type> is |
| not one of the supported format or type tokens. |
| |
| INVALID_VALUE is generated by ClearBufferSubData if <offset> |
| or <size> is less than zero. |
| |
| INVALID_VALUE is generated by ClearBufferSubData if no buffer is bound |
| to the binding point indicated by <target>. |
| |
| INVALID_VALUE is generated by ClearBufferSubData if <offset> + |
| <size> is greater than the value of BUFFER_SIZE for the buffer bound to |
| <target>. |
| |
| INVALID_VALUE is generated by ClearBufferSubData if <offset> or <size> |
| is not an integer multiple of the element size indicated by |
| <internalformat>. The element size is the number of components for |
| <internalformat> from table 3.15 multiplied by the size of the base type |
| for <internalformat> in that table. |
| |
| INVALID_OPERATION is generated by ClearBufferSubData if any part of the |
| specified range of the buffer bound to <target> is currently mapped. |
| |
| New State |
| |
| None. |
| |
| Dependencies on EXT_direct_state_access |
| |
| If EXT_direct_state_access is not supported, then remove all references to |
| ClearNamedBufferDataEXT and ClearNamedBufferSubDataEXT. |
| |
| Conformance Tests |
| |
| TBD |
| |
| Issues |
| |
| 1) Do we need to have restrictions on the alignment of <offset> and/or |
| <size> for ClearBufferSubData |
| |
| RESOLVED: Yes, we restrict both <offset> and <size> to be integer |
| multiples of the element size for the format indicated by |
| <internalformat>. |
| |
| 2) Should the ClearBufferObject take int/float/uint types, or take |
| format + type poarameters more like glTexImage2D etc.? |
| |
| RESOLVED: ClearBufferSubData takes an <internalformat> parameter |
| to indicate the internal storage format for the buffer, and |
| a <format> and <type> parameter for the application-supplied data. |
| This is consistent with APIs such as TexSubImagenD. |
| |
| 3) Currently, the legal tokens for <internalformat> are taken from the |
| texture internal format types in table 3.12. Is this sufficient? |
| Do we need to also allow other formats such as those in table 3.22 |
| (image formats), or table 3.2 (packed pixel formats). |
| |
| RESOLVED: Updated in revision 4 to use table 3.15, which is actually |
| more concise than 3.12. However, it represents the complete list |
| of formats that are reasonably easily filled by existing hardware. |
| If the application bit-packs other formats, this should be sufficient |
| for the intended use-cases of this extension. |
| |
| 4) Do we want DSA-style ClearNamedBufferSubData, ClearNamedBufferData? |
| |
| RESOLVED: Yes. Documented dependency on EXT_dsa. |
| |
| 5) How do we specify data formats that are not supported for buffer |
| textures - for example, R3_G3_B2 or RGB10_A2? |
| |
| RESOLVED: It is the application's responsibility to bit-pack the |
| components of the source data into a number of native types (unsigned |
| bytes, shorts or ints), and then pass them using a supported internal |
| format. |
| |
| Revision History |
| |
| Rev. Date Author Changes |
| ---- ---------- -------- --------------------------------------------- |
| 13 02/18/2014 Jon Leech Change order of ClearBufferSubData arguments |
| in spec body to be consistent with New |
| Procedures declaration ((offset,size,format, |
| type) instead of the erroneous (format,type, |
| offset,size)) (Public Bug 1122). |
| |
| 12 12/12/2013 Jon Leech Change order of ClearNamedBufferSubDataEXT |
| arguments in spec body to be consistent with |
| New Procedures declaration ((offset, |
| size,format,type) instead of the erroneous |
| (format,type,offset,size)) (Bug 11378). |
| |
| 11 08/07/2013 mjk Better indicate DSA entrypoints |
| |
| 10 09/12/2012 Jon Leech Modify error condition when the target buffer |
| is mapped to only be generated when the |
| mapped region intersects the region being |
| cleared (bug 9343). |
| |
| 9 07/25/2012 Jon Leech Fix typos from bug 8935. |
| |
| 8 07/23/2012 Jon Leech Clarify offset/alignment constraints as |
| based on the total size of a texel in |
| <internalformat>. |
| |
| 7 06/28/2012 pdaniell Modify the parameter order of the *SubData |
| functions to match the ordering of |
| TexSubImage parameters. Also change the |
| <offset> parameter to intptr. |
| |
| 6 05/29/2012 Jon Leech Fix capitalization of <internalformat>. |
| |
| 5 05/15/2012 Jon Leech Fix typo in error condition. |
| |
| 4 04/26/2012 gsellers Add interaction with EXT_dsa, resolve issue 4. |
| Document <format> and <type> parameters. |
| Correct reference to Table 3.15 (Internal |
| formats for buffer textures). |
| Resolve issue 3. Add issue 5. |
| Change behavior of NULL for <data> to fill the |
| buffer subrange with zeros. |
| 3 04/02/2012 gsellers Delete 'either/or' approach. |
| Change API to texture-like ClearBufferSubData. |
| Resolve issues (1) + (2). |
| Address feedback from bug 8132. |
| Add issues (3) and (4). |
| 2 12/19/2011 gsellers Rename to ARB. Strip suffixes from APIs. |
| Add format + type versions of APIs for |
| consideration. Allow NULL for <data> in |
| ClearBufferRange. |
| 1 09/27/2011 gsellers Initial draft |