| Name | 
 |  | 
 |     ARB_texture_buffer_range | 
 |  | 
 | Name Strings | 
 |  | 
 |     GL_ARB_texture_buffer_range | 
 |  | 
 | Contact | 
 |  | 
 |     Graham Sellers (graham.sellers 'at' amd.com) | 
 |  | 
 | Contributors | 
 |  | 
 |     Jon Leech | 
 |     Mark Kilgard, NVIDIA | 
 |  | 
 | Notice | 
 |  | 
 |     Copyright (c) 2012-2013 The Khronos Group Inc. Copyright terms at | 
 |         http://www.khronos.org/registry/speccopyright.html | 
 |  | 
 | Specification Update Policy | 
 |  | 
 |     Khronos-approved extension specifications are updated in response to | 
 |     issues and bugs prioritized by the Khronos OpenGL Working Group. For | 
 |     extensions which have been promoted to a core Specification, fixes will | 
 |     first appear in the latest version of that core Specification, and will | 
 |     eventually be backported to the extension document. This policy is | 
 |     described in more detail at | 
 |         https://www.khronos.org/registry/OpenGL/docs/update_policy.php | 
 |  | 
 | Status | 
 |  | 
 |     Complete. | 
 |     Approved by the ARB on 2012/06/12. | 
 |  | 
 | Version | 
 |  | 
 |     Last Modified Date: August 7, 2013 | 
 |     Version: 8 | 
 |  | 
 | Number | 
 |  | 
 |     ARB Extension #139 | 
 |  | 
 | Dependencies | 
 |  | 
 |     ARB_texture_buffer_object or OpenGL 3.1 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 | 
 |  | 
 |     ARB_texture_buffer_object (which was promoted to core in OpenGL 3.1) | 
 |     introduced the ability to attach the data store of a buffer object | 
 |     to a buffer texture and access it from shaders. The extension only allows | 
 |     the entire store of the buffer object to the texture. This extension | 
 |     expands on this and allows a sub-range of the buffer's data store to | 
 |     be attached to a texture. This can be used, for example, to allow multiple | 
 |     buffer textures to be backed by independent sub-ranges of the same buffer | 
 |     object, or for different sub-ranges of a single buffer object to be used | 
 |     for different purposes. | 
 |  | 
 | IP Status | 
 |  | 
 |     No known IP claims. | 
 |  | 
 | New Procedures and Functions | 
 |  | 
 |         void TexBufferRange(enum target, | 
 |                             enum internalformat, | 
 |                             uint buffer, | 
 |                             intptr offset, | 
 |                             sizeiptr size); | 
 |  | 
 |     When EXT_direct_state_access is present: | 
 |  | 
 |         void TextureBufferRangeEXT(uint texture, | 
 |                                    enum target, | 
 |                                    enum internalformat, | 
 |                                    uint buffer, | 
 |                                    intptr offset, | 
 |                                    sizeiptr size); | 
 |  | 
 | New Tokens | 
 |  | 
 |     Accepted by the <pname> parameter of GetTexLevelParameter: | 
 |  | 
 |         TEXTURE_BUFFER_OFFSET                               0x919D | 
 |         TEXTURE_BUFFER_SIZE                                 0x919E | 
 |  | 
 |     Accepted by the <pname> parameter of GetBooleanv, GetIntegerv, GetFloatv, | 
 |     and GetDoublev: | 
 |  | 
 |         TEXTURE_BUFFER_OFFSET_ALIGNMENT                     0x919F | 
 |  | 
 | Additions to Chapter 2 of the OpenGL 4.2 (Core Profile) Specification | 
 | (OpenGL Operation) | 
 |  | 
 |     None. | 
 |  | 
 | Additions to Chapter 3 of the OpenGL 4.2 (Core Profile) Specification | 
 | (Rasterization) | 
 |  | 
 | Modifications to Section 3.8.7 "Buffer Textures" | 
 |  | 
 |     Change the description of TexBuffer as follows: | 
 |  | 
 |         The command | 
 |  | 
 |         void TexBufferRange(enum target, | 
 |                             enum internalformat, | 
 |                             uint buffer, | 
 |                             intptr offset, | 
 |                             sizeiptr size); | 
 |  | 
 |     attaches the range of the storage for the buffer object named <buffer> | 
 |     for <size> basic machine units, starting at <offset> (also in basic machine | 
 |     units) to the active buffer texture, and specifies an internal format | 
 |     for the texel array found in the range of the attached buffer object. If | 
 |     <buffer> is zero, then any buffer object attached to the buffer texture | 
 |     is detached, the values <offset> and <size> are ignored and the state for | 
 |     <offset> and <size> for the buffer texture are reset to zero. If <buffer> | 
 |     is non-zero, but is not the name of a buffer object, the error | 
 |     INVALID_OPERATION is generated. If <offset> is negative or if <size> is | 
 |     less than or equal to zero or if <offset> + <size> is greater than the | 
 |     value of BUFFER_SIZE for the buffer bound to <target>, of if <offset> is | 
 |     not an integer multiple of TEXTURE_BUFFER_OFFSET_ALIGNMENT, then the error | 
 |     INVALID_VALUE is generated. <internalformat> specifies the storage format | 
 |     and must be one of the sized internal formats found in Table 3.15. | 
 |  | 
 |         The command | 
 |  | 
 |         void TextureBufferRangeEXT(uint texture, | 
 |                                    enum target, | 
 |                                    enum internalformat, | 
 |                                    uint buffer, | 
 |                                    intptr offset, | 
 |                                    sizeiptr size); | 
 |  | 
 |     behaves identically to TexBufferRange, except rather than updating the | 
 |     currently bound texture object for the texture unit indicated by the current | 
 |     active texture state, the texture object named <texture> is updated | 
 |     directly. <texture> must be a name returned from a previous call to | 
 |     GenTextures or be that of an existing texture matching <target>. If <texture> | 
 |     is not the name of an existing texture, one is created with the name | 
 |     <texture> for <target>. | 
 |  | 
 |         The command | 
 |  | 
 |         void TexBuffer(enum target, | 
 |                        enum internalformat, | 
 |                        uint buffer); | 
 |  | 
 |     is equivalent to calling TexBufferRange with the <target>, <internalformat> | 
 |     and <buffer> parameters as specified, with <offset> set to zero, and | 
 |     <size> set to the value of BUFFER_SIZE for <buffer>. | 
 |  | 
 |         When a range of the storage of a buffer object is attached to a buffer | 
 |     texture, the range of the buffer's data store is taken as the texture's | 
 |     texel array. The number of texels in the buffer texture's texel array is | 
 |     given by | 
 |  | 
 |                     |                 <size>                 | | 
 |                     |  ------------------------------------  | | 
 |                     |_  <components> x sizeof(<base_type>)  _| | 
 |  | 
 |     where <components> and <base_type> are the element count and base type for | 
 |     elements, as specified in Table 3.15. | 
 |  | 
 | Modifications to Section 3.9.15 "Texture and Proxy State" | 
 |  | 
 |     Add to the state required for buffer textures: | 
 |      | 
 |     ... The buffer texture target has associated an integer containing the name | 
 |     of the buffer object that provided the data store for the texture, | 
 |     initially zero, and two pointer sized integers containing the offset and | 
 |     range of the buffer object's data store, also initially zero. | 
 |  | 
 | 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 TexBufferRange if <target> is not | 
 |     TEXTURE_BUFFER. | 
 |  | 
 |     INVALID_VALUE is generated by TexBufferRange if <offset> is less than zero. | 
 |  | 
 |     INVALID_VALUE is generated by TexBufferRange if <size> is less than zero. | 
 |  | 
 |     INVALID_VALUE is generated by TexBufferRange if <offset> + <size> is | 
 |     greater than the value of BUFFER_SIZE for <buffer>. | 
 |  | 
 |     INVALID_VALUE is generated by TexBufferRange if <offset> is not | 
 |     an integer multiple of the value of TEXTURE_BUFFER_OFFSET_ALIGNMENT. | 
 |  | 
 | New State | 
 |  | 
 |     Append to Table 6.17. Textures (state per texture image) | 
 |  | 
 |     +-------------------------+---------+----------------------+---------------+------------------------------------------+ | 
 |     | Get Value               | Type    | Get Command          | Initial Value | Description                              | | 
 |     +-------------------------+---------+----------------------+---------------+------------------------------------------+ | 
 |     | TEXTURE_BUFFER_OFFSET   |  n x Z  | GetTexLevelParameter | 0             | Offset into buffer's data store used for | | 
 |     |                         |         |                      |               | the active image unit's buffer texture   | | 
 |     | TEXTURE_BUFFER_SIZE     |  n x Z  | GetTexLevelParameter | 0             | Size of the buffer's data store used for | | 
 |     |                         |         |                      |               | the active image unit's buffer texture   | | 
 |     +-------------------------+---------+----------------------+---------------+------------------------------------------+ | 
 |  | 
 | New Implementation Dependent State | 
 |  | 
 |     +---------------------------------+------+-------------+------------+----------------------------+---------+-----------+ | 
 |     |                                 |      |             | Minimum    |                            |         |           | | 
 |     | Get Value                       | Type | Get Command | Value      | Description                | Sec     | Attribute | | 
 |     +---------------------------------+------+-------------+------------+----------------------------+---------+-----------+ | 
 |     | TEXTURE_BUFFER_OFFSET_ALIGNMENT | Z+   | GetIntegerv | 1          | Minimum required alignment | 3.8.7   | -         | | 
 |     |                                 |      |             |            | for texture buffer offsets |         |           | | 
 |     +---------------------------------+------+-------------+------------+----------------------------+---------+-----------+ | 
 |  | 
 | Conformance Tests | 
 |  | 
 |     TBD | 
 |  | 
 | Issues | 
 |  | 
 |     1) Do we need to have restrictions on the alignment of <offset> and/or | 
 |        <size> for TexBufferRange? | 
 |  | 
 |        RESOLVED: Yes for offset, no for range. The minimum value here is 1, | 
 |        essentially making it optional for offsets. | 
 |  | 
 | Dependencies on EXT_direct_state_access | 
 |  | 
 |     If EXT_direct_state_access is not supported, remove all references to | 
 |     TextureBufferRangeEXT. | 
 |  | 
 | Revision History | 
 |  | 
 |     Rev.  Date        Author    Changes | 
 |     ----  ----------  --------  ----------------------------------------- | 
 |      8    08/07/2013  mjk       Better indicate DSA entrypoints | 
 |      7    05/29/2012  Jon Leech Fix capitalization of <internalformat>. | 
 |      6    05/02/2012  drakos    Add EXT suffix to TextureBufferRange. | 
 |      5    04/30/2012  gsellers  Assign token values. | 
 |                                 Add more error behavior. | 
 |                                 Minor fixes. | 
 |      4    04/26/2012  gsellers  Clarify that <offset> and <size> are reset for | 
 |                                 TexBOs when a buffer is unbound. | 
 |      3    04/02/2012  gsellers  Update token names. Correct typos. (bug 8131). | 
 |                                 Add TEXTURE_BUFFER_OFFSET_ALIGNMENT. | 
 |                                 Resolve issue (1). | 
 |      2    12/19/2011  gsellers  Document interaction with EXT_dsa. Rename to | 
 |                                 ARB. Remove ARB suffixes from APIs and tokens. | 
 |      1    09/26/2011  gsellers  Initial draft |