| Name | 
 |  | 
 |     ARB_texture_buffer_object | 
 |  | 
 | Name Strings | 
 |  | 
 |     GL_ARB_texture_buffer_object | 
 |  | 
 | Contact | 
 |  | 
 |     Pat Brown, NVIDIA Corporation (pbrown 'at' nvidia.com) | 
 |  | 
 | Notice | 
 |  | 
 |     Copyright (c) 2008-2013 The Khronos Group Inc. Copyright terms at | 
 |         http://www.khronos.org/registry/speccopyright.html | 
 |  | 
 | Status | 
 |  | 
 |     Approved by the ARB on July 11, 2008 | 
 |  | 
 | Version | 
 |  | 
 |     Last Modified Date:         06/04/2015 | 
 |     Revision:                   8 | 
 |  | 
 | Number | 
 |  | 
 |     ARB Extension #51 | 
 |  | 
 | Dependencies | 
 |  | 
 |     OpenGL 2.0 is required. | 
 |  | 
 |     NV_gpu_program4 or EXT_gpu_shader4 is required. | 
 |  | 
 |     This extension is written against the OpenGL 2.0 specification. | 
 |  | 
 |     This extension depends trivially on EXT_texture_array. | 
 |  | 
 |     This extension depends trivially on NV_texture_shader. | 
 |  | 
 |     This extension depends trivially on EXT_texture_integer. | 
 |  | 
 |     This extension depends trivially on ARB_texture_float. | 
 |  | 
 |     This extension depends trivially on ARB_half_float_pixel. | 
 |  | 
 |     This extension interacts with ARB_map_buffer_range. | 
 |  | 
 | Overview | 
 |  | 
 |     This extension provides a new texture type, called a buffer texture. | 
 |     Buffer textures are one-dimensional arrays of texels whose storage comes | 
 |     from an attached buffer object.  When a buffer object is bound to a buffer | 
 |     texture, a format is specified, and the data in the buffer object is | 
 |     treated as an array of texels of the specified format. | 
 |  | 
 |     The use of a buffer object to provide storage allows the texture data to | 
 |     be specified in a number of different ways:  via buffer object loads | 
 |     (BufferData), direct CPU writes (MapBuffer), framebuffer readbacks | 
 |     (EXT_pixel_buffer_object extension).  A buffer object can also be loaded | 
 |     by transform feedback (NV_transform_feedback extension), which captures | 
 |     selected transformed attributes of vertices processed by the GL.  Several | 
 |     of these mechanisms do not require an extra data copy, which would be | 
 |     required when using conventional TexImage-like entry points. | 
 |  | 
 |     Buffer textures do not support mipmapping, texture lookups with normalized | 
 |     floating-point texture coordinates, and texture filtering of any sort, and | 
 |     may not be used in fixed-function fragment processing.  They can be | 
 |     accessed via single texel fetch operations in programmable shaders.  For | 
 |     assembly shaders (NV_gpu_program4), the TXF instruction is used.  For GLSL | 
 |     (EXT_gpu_shader4), a new sampler type and texel fetch function are used. | 
 |  | 
 |     While buffer textures can be substantially larger than equivalent | 
 |     one-dimensional textures; the maximum texture size supported for buffer | 
 |     textures in the initial implementation of this extension is 2^27 texels, | 
 |     versus 2^13 (8192) texels for otherwise equivalent one-dimensional | 
 |     textures.  When a buffer object is attached to a buffer texture, a size is | 
 |     not specified; rather, the number of texels in the texture is taken by | 
 |     dividing the size of the buffer object by the size of each texel. | 
 |  | 
 | New Procedures and Functions | 
 |  | 
 |     void TexBufferARB(enum target, enum internalformat, uint buffer); | 
 |      | 
 | New Tokens | 
 |  | 
 |     Accepted by the <target> parameter of BindBuffer, BufferData, | 
 |     BufferSubData, MapBuffer, MapBufferRangeARB, BindTexture, UnmapBuffer, | 
 |     GetBufferSubData, GetBufferParameteriv, GetBufferPointerv, and TexBufferARB, | 
 |     and the <pname> parameter of GetBooleanv, GetDoublev, GetFloatv, and | 
 |     GetIntegerv: | 
 |  | 
 |         TEXTURE_BUFFER_ARB                              0x8C2A | 
 |  | 
 |     Accepted by the <pname> parameters of GetBooleanv, GetDoublev, | 
 |     GetFloatv, and GetIntegerv: | 
 |  | 
 |         MAX_TEXTURE_BUFFER_SIZE_ARB                     0x8C2B | 
 |         TEXTURE_BINDING_BUFFER_ARB                      0x8C2C | 
 |         TEXTURE_BUFFER_DATA_STORE_BINDING_ARB           0x8C2D | 
 |         TEXTURE_BUFFER_FORMAT_ARB                       0x8C2E | 
 |  | 
 | Additions to Chapter 2 of the OpenGL 2.0 Specification (OpenGL Operation) | 
 |  | 
 |     None. | 
 |  | 
 | Additions to Chapter 3 of the OpenGL 2.0 Specification (Rasterization) | 
 |  | 
 |     (Insert new Section 3.8.4, Buffer Textures.  Renumber subsequent | 
 |     sections.) | 
 |  | 
 |     In addition to one-, two-, and three-dimensional and cube map textures | 
 |     described in previous sections, one additional type of texture is | 
 |     supported.  A buffer texture is similar to a one-dimensional texture. | 
 |     However, unlike other texture types, the texel array is not stored as part | 
 |     of the texture.  Instead, a buffer object is attached to a buffer texture | 
 |     and the texel array is taken from the data store of an attached buffer | 
 |     object.  When the contents of a buffer object's data store are modified, | 
 |     those changes are reflected in the contents of any buffer texture to which | 
 |     the buffer object is attached.  Also unlike other textures, buffer | 
 |     textures do not have multiple image levels; only a single data store is | 
 |     available. | 
 |  | 
 |     The command | 
 |  | 
 |       void TexBufferARB(enum target, enum internalformat, uint buffer); | 
 |  | 
 |     attaches the storage for the buffer object named <buffer> to the active | 
 |     buffer texture, and specifies an internal format for the texel array found | 
 |     in the attached buffer object.  If <buffer> is zero, any buffer object | 
 |     attached to the buffer texture is detached, and no new buffer object is | 
 |     attached.  If <buffer> is non-zero, but is not the name of an existing | 
 |     buffer object, the error INVALID_OPERATION is generated.  <target> must be | 
 |     TEXTURE_BUFFER_ARB.  <internalformat> specifies the storage format, and | 
 |     must be one of the sized internal formats found in Table X.1. | 
 |  | 
 |     When a buffer object is attached to a buffer texture, the buffer object'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  | 
 |  | 
 |       floor(<buffer_size> / (<components> * sizeof(<base_type>)), | 
 |  | 
 |     where <buffer_size> is the size of the buffer object, in basic machine | 
 |     units and <components> and <base_type> are the element count and base data | 
 |     type for elements, as specified in Table X.1.  The number of texels in the | 
 |     texel array is then clamped to the implementation-dependent limit | 
 |     MAX_TEXTURE_BUFFER_SIZE_ARB.  When a buffer texture is accessed in a | 
 |     shader, the results of a texel fetch are undefined if the specified texel | 
 |     number is greater than or equal to the clamped number of texels in the | 
 |     texel array. | 
 |  | 
 |     When a buffer texture is accessed in a shader, an integer is provided to | 
 |     indicate the texel number being accessed.  If no buffer object is bound to | 
 |     the buffer texture, the results of the texel access are undefined. | 
 |     Otherwise, the attached buffer object's data store is interpreted as an | 
 |     array of elements of the GL data type corresponding to <internalformat>. | 
 |     Each texel consists of one to four elements that are mapped to texture | 
 |     components (R, G, B, A, L, and I).  Element <m> of the texel numbered <n> | 
 |     is taken from element <n> * <components> + <m> of the attached buffer | 
 |     object's data store.  Elements and texels are both numbered starting with | 
 |     zero.  For texture formats with normalized components, the extracted | 
 |     values are converted to floating-point values according to Table 2.9.  The | 
 |     components of the texture are then converted to an (R,G,B,A) vector | 
 |     according to Table X.21, and returned to the shader as a four-component | 
 |     result vector with components of the appropriate data type for the | 
 |     texture's internal format.  The base data type, component count, | 
 |     normalized component information, and mapping of data store elements to | 
 |     texture components is specified in Table X.1. | 
 |      | 
 |                                                              Component | 
 |       Sized Internal Format     Base Type  Components  Norm   0 1 2 3 | 
 |       ------------------------  ---------  ----------  ----   ------- | 
 |       ALPHA8                     ubyte         1        Y     A . . . | 
 |       ALPHA16                    ushort        1        Y     A . . . | 
 |       ALPHA16F_ARB               half          1        N     A . . . | 
 |       ALPHA32F_ARB               float         1        N     A . . . | 
 |       ALPHA8I_EXT                byte          1        N     A . . . | 
 |       ALPHA16I_EXT               short         1        N     A . . . | 
 |       ALPHA32I_EXT               int           1        N     A . . . | 
 |       ALPHA8UI_EXT               ubyte         1        N     A . . . | 
 |       ALPHA16UI_EXT              ushort        1        N     A . . . | 
 |       ALPHA32UI_EXT              uint          1        N     A . . . | 
 |  | 
 |       LUMINANCE8                 ubyte         1        Y     L . . . | 
 |       LUMINANCE16                ushort        1        Y     L . . . | 
 |       LUMINANCE16F_ARB           half          1        N     L . . . | 
 |       LUMINANCE32F_ARB           float         1        N     L . . . | 
 |       LUMINANCE8I_EXT            byte          1        N     L . . . | 
 |       LUMINANCE16I_EXT           short         1        N     L . . . | 
 |       LUMINANCE32I_EXT           int           1        N     L . . . | 
 |       LUMINANCE8UI_EXT           ubyte         1        N     L . . . | 
 |       LUMINANCE16UI_EXT          ushort        1        N     L . . . | 
 |       LUMINANCE32UI_EXT          uint          1        N     L . . . | 
 |  | 
 |       LUMINANCE8_ALPHA8          ubyte         2        Y     L A . . | 
 |       LUMINANCE16_ALPHA16        ushort        2        Y     L A . . | 
 |       LUMINANCE_ALPHA16F_ARB     half          2        N     L A . . | 
 |       LUMINANCE_ALPHA32F_ARB     float         2        N     L A . . | 
 |       LUMINANCE_ALPHA8I_EXT      byte          2        N     L A . . | 
 |       LUMINANCE_ALPHA16I_EXT     short         2        N     L A . . | 
 |       LUMINANCE_ALPHA32I_EXT     int           2        N     L A . . | 
 |       LUMINANCE_ALPHA8UI_EXT     ubyte         2        N     L A . . | 
 |       LUMINANCE_ALPHA16UI_EXT    ushort        2        N     L A . . | 
 |       LUMINANCE_ALPHA32UI_EXT    uint          2        N     L A . . | 
 |  | 
 |       INTENSITY8                 ubyte         1        Y     I . . . | 
 |       INTENSITY16                ushort        1        Y     I . . . | 
 |       INTENSITY16F_ARB           half          1        N     I . . . | 
 |       INTENSITY32F_ARB           float         1        N     I . . . | 
 |       INTENSITY8I_EXT            byte          1        N     I . . . | 
 |       INTENSITY16I_EXT           short         1        N     A . . . | 
 |       INTENSITY32I_EXT           int           1        N     A . . . | 
 |       INTENSITY8UI_EXT           ubyte         1        N     A . . . | 
 |       INTENSITY16UI_EXT          ushort        1        N     A . . . | 
 |       INTENSITY32UI_EXT          uint          1        N     A . . . | 
 |  | 
 |       RGBA8                      ubyte         4        Y     R G B A | 
 |       RGBA16                     ushort        4        Y     R G B A | 
 |       RGBA16F_ARB                half          4        N     R G B A | 
 |       RGBA32F_ARB                float         4        N     R G B A | 
 |       RGBA8I_EXT                 byte          4        N     R G B A | 
 |       RGBA16I_EXT                short         4        N     R G B A | 
 |       RGBA32I_EXT                int           4        N     R G B A | 
 |       RGBA8UI_EXT                ubyte         4        N     R G B A | 
 |       RGBA16UI_EXT               ushort        4        N     R G B A | 
 |       RGBA32UI_EXT               uint          4        N     R G B A | 
 |  | 
 |       Table X.1, Internal Formats for Buffer Textures.  For each format, the | 
 |       data type of each element is indicated in the "Base Type" column and the | 
 |       element count is in the "Components" column.  The "Norm" column | 
 |       indicates whether components should be treated as normalized | 
 |       floating-point values.  The "Component 0, 1, 2, and 3" columns indicate | 
 |       the mapping of each element of a texel to texture components. | 
 |  | 
 |     In addition to attaching buffer objects to textures, buffer objects can be | 
 |     bound to the buffer object target named TEXTURE_BUFFER_ARB, in order to | 
 |     specify, modify, or read the buffer object's data store.  The buffer | 
 |     object bound to TEXTURE_BUFFER_ARB has no effect on rendering.  A buffer | 
 |     object is bound to TEXTURE_BUFFER_ARB by calling BindBuffer with <target> | 
 |     set to TEXTURE_BUFFER_ARB.  If no corresponding buffer object exists, one | 
 |     is initialized as defined in section 2.9. | 
 |  | 
 |     The commands BufferData, BufferSubData, MapBuffer, and UnmapBuffer may all | 
 |     be used with <target> set to TEXTURE_BUFFER_ARB.  In this case, these | 
 |     commands operate in the same fashion as described in section 2.9, but on | 
 |     the buffer currently bound to the TEXTURE_BUFFER_ARB target. | 
 |  | 
 |     Modify Section 3.8.11, Texture State and Proxy State (p. 178) | 
 |  | 
 |     (insert into the first paragraph of the section, p. 178) ... a zero | 
 |     compressed size, and zero-sized components).  The buffer texture target | 
 |     contains an integer identifying the buffer object that buffer that | 
 |     provided the data store for the texture, initially zero, and an integer | 
 |     identifying the internal format of the texture, initially LUMINANCE8. | 
 |     Next, there are the two sets of texture properties; ... | 
 |  | 
 |     Modify Section 3.8.12, Texture Objects (p. 180) | 
 |  | 
 |     (modify first paragraphs of section, p. 180, simply adding references to | 
 |      buffer textures, which are treated as texture objects) | 
 |  | 
 |     In addition to the default textures TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, | 
 |     TEXTURE_CUBE_MAP, and TEXTURE_BUFFER_ARB, named one-, two-, and | 
 |     three-dimensional, cube map, and buffer texture objects can be created and | 
 |     operated upon. The name space for texture objects is the unsigned | 
 |     integers, with zero reserved by the GL. | 
 |  | 
 |     A texture object is created by binding an unused name to TEXTURE_1D, | 
 |     TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP, or TEXTURE_BUFFER_ARB. The | 
 |     binding is effected by calling | 
 |  | 
 |       void BindTexture( enum target, uint texture ); | 
 |  | 
 |     with target set to the desired texture target and texture set to the | 
 |     unused name.  The resulting texture object is a new state vector, | 
 |     comprising all the state values listed in section 3.8.11, set to the same | 
 |     initial values. If the new texture object is bound to TEXTURE_1D, | 
 |     TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP, or TEXTURE_BUFFER_ARB, it is and | 
 |     remains a one-, two-, three-dimensional, cube map, or buffer texture | 
 |     respectively until it is deleted. | 
 |  | 
 |     BindTexture may also be used to bind an existing texture object to either | 
 |     TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP, or | 
 |     TEXTURE_BUFFER_ARB. The error INVALID_OPERATION is generated if an attempt | 
 |     is made to bind a texture object of different dimensionality than the | 
 |     specified target. If the bind is successful no change is made to the state | 
 |     of the bound texture object, and any previous binding to target is broken. | 
 |  | 
 |     ... | 
 |  | 
 |     In the initial state, TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, | 
 |     TEXTURE_CUBE_MAP, and TEXTURE_BUFFER_ARB have one-, two-, | 
 |     three-dimensional, cube map, and buffer texture state vectors respectively | 
 |     associated with them. In order that access to these initial textures not | 
 |     be lost, they are treated as texture objects all of whose names are 0. The | 
 |     initial one-, two-, three-dimensional, cube map, and buffer texture is | 
 |     therefore operated upon, queried, and applied as TEXTURE_1D, TEXTURE_2D, | 
 |     TEXTURE_3D, TEXTURE_CUBE_MAP, or TEXTURE_BUFFER_ARB respectively while 0 | 
 |     is bound to the corresponding targets. | 
 |  | 
 |     Texture objects are deleted by calling | 
 |  | 
 |       void DeleteTextures( sizei n, uint *textures ); | 
 |  | 
 |     textures contains n names of texture objects to be deleted. After a | 
 |     texture object is deleted, it has no contents or dimensionality, and its | 
 |     name is again unused. If a texture that is currently bound to one of the | 
 |     targets TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP, or | 
 |     TEXTURE_BUFFER_ARB is deleted, it is as though BindTexture had been | 
 |     executed with the same target and texture zero. Unused names in textures | 
 |     are silently ignored, as is the value zero. | 
 |  | 
 |     (modify second paragraph, p. 182, adding buffer textures, plus cube map | 
 |     textures, which is an oversight in the core specification) | 
 |  | 
 |     The texture object name space, including the initial one-, two-, and | 
 |     three-dimensional, cube map, and buffer texture objects, is shared among | 
 |     all texture units. A texture object may be bound to more than one texture | 
 |     unit simultaneously. After a texture object is bound, any GL operations on | 
 |     that target object affect any other texture units to which the same | 
 |     texture object is bound. | 
 |  | 
 | Additions to Chapter 4 of the OpenGL 2.0 Specification (Per-Fragment | 
 | Operations and the Frame Buffer) | 
 |  | 
 |     None. | 
 |  | 
 | Additions to Chapter 5 of the OpenGL 2.0 Specification (Special Functions) | 
 |  | 
 |     Modify Section 5.4, Display Lists (p. 237) | 
 |  | 
 |     (modify "Vertex buffer objects" portion of the list of non-listable | 
 |     commands, p. 241) | 
 |  | 
 |       Buffer objects: GenBuffers, DeleteBuffers, BindBuffer, BufferData, | 
 |       BufferSubData, MapBuffer, UnmapBuffer, and TexBufferARB. | 
 |  | 
 | Additions to Chapter 6 of the OpenGL 2.0 Specification (State and | 
 | State Requests) | 
 |  | 
 |     Modify Section 6.1.13, Buffer Object Queries (p. 255) | 
 |  | 
 |     (modify the first paragraph on p. 256) The command | 
 |      | 
 |       void GetBufferSubData( enum target, intptr offset, | 
 |                              sizeiptr size, void *data ); | 
 |  | 
 |     queries the data contents of a buffer object. target is ARRAY_BUFFER, | 
 |     ELEMENT_ARRAY_BUFFER, or TEXTURE_BUFFER_ARB. ... | 
 |  | 
 |     (modify the last paragraph of the section, p. 256) While the data store of | 
 |     a buffer object is mapped, the pointer to the data store can be queried by | 
 |     calling | 
 |  | 
 |       void GetBufferPointerv( enum target, enum pname, void **params ); | 
 |  | 
 |     with target set to ARRAY_BUFFER, ELEMENT_ARRAY_BUFFER, or | 
 |     TEXTURE_BUFFER_ARB, and pname set to BUFFER MAP POINTER. | 
 |  | 
 | Additions to Appendix A of the OpenGL 2.0 Specification (Invariance) | 
 |  | 
 |     None. | 
 |  | 
 | Additions to the AGL/GLX/WGL Specifications | 
 |  | 
 |     None. | 
 |  | 
 | Dependencies on EXT_texture_array | 
 |  | 
 |     If EXT_texture_array is supported, the introductory language describing | 
 |     buffer textures should acknowledge the existence of array textures.  Other | 
 |     than that, there are no dependencies between the two extensions. | 
 |  | 
 | Dependencies on NV_texture_shader | 
 |  | 
 |     If NV_texture_shader is not supported, references to the signed normalized | 
 |     internal formats provided by that extension should be removed, and such | 
 |     formats may not be passed to TexBufferARB. | 
 |  | 
 | Dependencies on EXT_texture_integer | 
 |  | 
 |     If EXT_texture_integer is not supported, references to the signed and | 
 |     unsigned integer internal formats provided by that extension should be | 
 |     removed, and such formats may not be passed to TexBufferARB. | 
 |  | 
 | Dependencies on ARB_texture_float | 
 |  | 
 |     If ARB_texture_float is not supported, references to the floating-point | 
 |     internal formats provided by that extension should be removed, and such | 
 |     formats may not be passed to TexBufferARB. | 
 |  | 
 | Dependencies on ARB_half_float_pixel | 
 |  | 
 |     If ARB_texture_float is not supported, references to the 16-bit | 
 |     floating-point internal formats provided by ARB_texture_float should be | 
 |     removed, and such formats may not be passed to TexBufferARB.  If an | 
 |     implementation supports ARB_texture_float, but does not support | 
 |     ARB_half_float_pixel, 16-bit floating-point texture formats may be | 
 |     available using normal texture mechanisms, but not with buffer textures. | 
 |  | 
 | GLX Protocol | 
 |  | 
 |     The following rendering command is sent to the server as | 
 |     a part of glXRender request: | 
 |  | 
 |     TexBufferARB | 
 |  | 
 |         2       16              rendering command length | 
 |         2       367             rendering command opcode | 
 |         4       ENUM            target | 
 |         4       ENUM            internalformat | 
 |         4       CARD32          buffer | 
 |  | 
 | Errors | 
 |  | 
 |     INVALID_OPERATION is generated by TexBufferARB if <buffer> is non-zero and | 
 |     is not the name of an existing buffer object. | 
 |  | 
 | New State | 
 |  | 
 |     (add to table 6.15, Texture State Per Texture Unit/Binding Point p. 276) | 
 |  | 
 |                                                             Initial | 
 |     Get Value                           Type    Get Command  Value  Description                 Sec.    Attribute | 
 |     ---------------------------------   ----    ----------- ------- --------------------------- ------  --------- | 
 |     TEXTURE_BINDING_BUFFER_ARB          2*xZ+   GetIntegerv    0    Texture object bound to     3.8.12  texture | 
 |                                                                     TEXTURE_BUFFER_ARB | 
 |  | 
 |     (add to table 6.16, Texture State Per Texture Object, p. 276) | 
 |  | 
 |                                                             Initial | 
 |     Get Value                           Type    Get Command  Value  Description                 Sec.    Attribute | 
 |     ---------------------------------   ----    ----------- ------- --------------------------- ------  --------- | 
 |     TEXTURE_BUFFER_DATA_STORE_          nxZ+    GetIntegerv    0    Buffer object bound as      3.8.12  texture | 
 |       BINDING_ARB                                                   the data store for the  | 
 |                                                                     active image unit's buffer | 
 |                                                                     texture | 
 |     TEXTURE_BUFFER_FORMAT_ARB           nxZ+    GetIntegerv  LUMIN- Internal format for the     3.8.12  texture | 
 |                                                              ANCE8  active image unit's buffer | 
 |                                                                     texture | 
 |  | 
 |     (add to table 6.37, Miscellaneous State, p. 298) | 
 |  | 
 |                                                             Initial | 
 |     Get Value                           Type    Get Command  Value  Description                 Sec.    Attribute | 
 |     ---------------------------------   ----    ----------- ------- --------------------------- ------  --------- | 
 |     TEXTURE_BUFFER_ARB                   Z+     GetIntegerv    0    Buffer object bound to      3.8.12  texture | 
 |                                                                     the generic buffer texture | 
 |                                                                     binding point | 
 |  | 
 | New Implementation Dependent State | 
 |  | 
 |     (modify Table 6.32, p. 293) | 
 |                                                     Minimum | 
 |     Get Value                    Type  Get Command   Value   Description            Sec.   Attribute | 
 |     ---------------------------  ----  -----------  -------  ---------------------  -----  --------- | 
 |     MAX_TEXTURE_BUFFER_SIZE_ARB   Z+   GetIntegerv   65536   number of addressable  3.8.4      - | 
 |                                                              texels for buffer | 
 |                                                              textures | 
 |  | 
 | Issues | 
 |  | 
 |     (1) Buffer textures are potentially large one-dimensional arrays that can | 
 |         be accessed with single-texel fetches.  How should this functionality | 
 |         be exposed? | 
 |  | 
 |       RESOLVED:  Several options were considered.  The final approach creates | 
 |       a new type of texture object, called a buffer texture, whose texel array | 
 |       is taken from the data store from a buffer object.  The combined set of | 
 |       extensions using buffer objects provides numerous locations where the GL | 
 |       can read and write data to a buffer object: | 
 |  | 
 |         EXT_vertex_buffer_object allows vertex attributes to be pulled from a | 
 |         buffer object. | 
 |  | 
 |         EXT_pixel_buffer_object allows pixel operations (DrawPixels, | 
 |         ReadPixels, TexImage) to read or write data to a buffer object. | 
 |  | 
 |         EXT_parameter_buffer_object and EXT_bindable_uniform allows assembly | 
 |         vertex, fragment, and geometry programs, and all GLSL shaders to read | 
 |         program parameter / uniform data from a buffer object. | 
 |  | 
 |         ARB_texture_buffer_object allows programs to read texture data from a | 
 |         buffer object. | 
 |  | 
 |         NV_transform_feedback allows programs to write transformed vertex | 
 |         attributes to a buffer object. | 
 |  | 
 |       When combined, interesting feedback paths are possible, where large | 
 |       arrays of data can be generated by the GPU and the consumed by it in | 
 |       multi-pass algorithms, using the buffer object's storage to hold | 
 |       intermediate data.  This allows applications to run complicated | 
 |       algorithms on the GPU without necessarily pulling data back to host CPU | 
 |       for additional processing. | 
 |  | 
 |       Given that buffer object memory is visible to users as raw memory, all | 
 |       uses of the memory must have well-defined data formats.  For VBO and | 
 |       PBO, those formats are explicitly given by calls such as VertexPointer, | 
 |       TexImage2D, or ReadPixels.  When used as a buffer texture, it is | 
 |       necessary to specify an internal format with which the bytes of the | 
 |       buffer object's data store are interpreted. | 
 |  | 
 |       Another option considered was to greatly increase the maximum texture | 
 |       size for 1D texture.  This has the advantage of not requiring new | 
 |       mechanisms.  However, there are a couple limitations of this approach. | 
 |       First, conventional textures have their own storage that is not | 
 |       accessible elsewhere, which limits some of the sharing opportunities | 
 |       described above.  Second, buffer textures do have slightly different | 
 |       hardware implementations than 1D textures.  In the hardware of interest, | 
 |       "normal" 1D textures can be mipmapped and filtered, but have a maximum | 
 |       size that is considerably smaller than that supported for buffer | 
 |       textures.  If both texture types used the same API mechanism, it might | 
 |       be necessary to reprogram texture hardware and/or shaders depending on | 
 |       the size of the textures used.  This will incur CPU overhead to | 
 |       determine if such reprogramming is necessary and to perform the | 
 |       reprogramming if so. | 
 |  | 
 |     (2) Since buffer textures borrow storage from buffer objects, whose | 
 |         storage is visible to applications, a format must be imposed on the | 
 |         bytes of the buffer object.  What texture formats are supported for | 
 |         buffer objects? | 
 |  | 
 |       RESOLVED:  All sized one-, two-, and four-component internal formats | 
 |       with 8-, 16-, and 32-bit components are supported.  Unsized internal | 
 |       formats, and sized formats with other component sizes are also not | 
 |       supported.  Three-component (RGB) formats are not supported due to | 
 |       hardware limitations. | 
 |  | 
 |       All component data types supported for normal textures are also | 
 |       supported for buffer textures.  This includes unsigned [0,1] normalized | 
 |       components (e.g., RGBA8), floating-point components from | 
 |       ARB_texture_float (e.g., RGBA32F_ARB), signed and unsigned integer | 
 |       components from EXT_texture_integer (e.g., RGBA8I_EXT, RGBA16UI_EXT), | 
 |       and signed [-1,+1] normalized components from NV_texture_shader (e.g., | 
 |       SIGNED_RGBA8_NV). | 
 |  | 
 |     (3) How can arrays of three-component vectors be accessed by applications? | 
 |  | 
 |       RESOLVED:  Several approaches are possible.   | 
 |  | 
 |       First, the vectors can be padded out to four components (RGBA), with an | 
 |       extra unused component for each texel.  This has a couple undesirable | 
 |       properties:  it adds 33% to the required storage and adding the extra | 
 |       component may require reformatting of original data generated by the | 
 |       application.  However, the data in this format can be retrieved with a | 
 |       single 32-, 64-, or 128-bit lookup.   | 
 |  | 
 |       Alternately, the buffer texture can be defined using a single component, | 
 |       and a shader can perform three lookups to separately fetch texels 3*N, | 
 |       3*N+1, and 3*N+2, combining the result in a three-component vector | 
 |       representing "RGB" texel N.  This doesn't require extra storage or | 
 |       reformatting and doesn't require additional bandwidth for texture | 
 |       fetches.  But it does require additional shader instructions to obtain | 
 |       each texel. | 
 |  | 
 |     (4) Does this extension support fixed-function fragment processing, | 
 |         somehow allowing buffer textures to be accessed without programmable | 
 |         shaders? | 
 |  | 
 |       RESOLVED:  No.  We expect that it would be difficult to properly access | 
 |       a buffer texture and combine the returned texel with other color or | 
 |       texture data, given the extremely limited programming model provided by | 
 |       fixed-function fragment processing. | 
 |  | 
 |       Note also that the single-precision floating-point representation | 
 |       commonly used by current graphics hardware is not sufficiently precise | 
 |       to exactly represent all texels in a large buffer texture.  For example, | 
 |       it is not possible to represent 2^24+1 using the 32-bit IEEE | 
 |       floating-point representation. | 
 |  | 
 |     (5) What happens if a buffer object is deleted or respecified when bound | 
 |         to a buffer texture? | 
 |  | 
 |       RESOLVED: BufferData is allowed to be used to update a buffer object that | 
 |       has already been bound to a texture with TexBuffer. The update to the data | 
 |       is not guaranteed to affect the texture until next time it is bound to a | 
 |       texture image unit.  When DeleteBuffers is called, any buffer that is | 
 |       bound to a texture is removed from the names array, but remains as long as | 
 |       it is bound to a texture.  The buffer is fully removed when the texture | 
 |       unbinds it or when the texture buffer object is deleted. | 
 |  | 
 |     (6) Should applications be able to modify the data store of a buffer | 
 |         object while it is bound to a buffer texture? | 
 |  | 
 |       RESOLVED: An application is allowed to update the data store for a buffer | 
 |       object when the buffer object is bound to a texture. | 
 |  | 
 |     (7) Do buffer textures support texture parameters (TexParameter) or | 
 |         queries (GetTexParameter, GetTexLevelParameter, GetTexImage)? | 
 |  | 
 |       RESOLVED:  No.  None of the existing parameters apply to buffer | 
 |       textures, and this extension doesn't introduce the need for any new | 
 |       ones.  Buffer textures have no levels, and the size in texels is | 
 |       implicit (based on the data store).  Given that the texels themselves | 
 |       are obtained from a buffer object, it seems more appropriate to retrieve | 
 |       such data with buffer object queries.  The only "parameter" of a buffer | 
 |       texture is the internal format, which is specified at the same time the | 
 |       buffer object is bound. | 
 |  | 
 |       Note that the spec edits above don't add explicit error language for any | 
 |       of these cases.  That is because each of the functions enumerate the set | 
 |       of valid <target> parameters.  Not editing the spec to allow | 
 |       TEXTURE_BUFFER_ARB in these cases means that target is not legal, and an | 
 |       INVALID_ENUM error should be generated. | 
 |  | 
 |     (8) What about indirect rendering with a mix of big- and little-endian | 
 |         clients?  If components are 16- or 32-bit, how are they interpreted? | 
 |  | 
 |       RESOLVED:  Buffer object data are interpreted according to the native | 
 |       representation of the server.  If the server and client have different | 
 |       endianness, applications must perform byte swapping as needed to match | 
 |       the server's representation.  No mechanism is provided to perform this | 
 |       byte swapping on buffer object updates or when texels are fetched. | 
 |  | 
 |       The same problem also exists when buffer objects are used for vertex | 
 |       arrays (VBO).  For buffer objects used for pixel packing and unpacking | 
 |       (ARB_pixel_buffer_object), the PixelStore byte swapping parameters | 
 |       (PACK_SWAP_BYTES, UNPACK_SWAP_BYTES) would presumably apply and could be | 
 |       used to perform the necessary byte swapping. | 
 |  | 
 |     (9) Should the set of formats supported for buffer textures be enumerated, | 
 |         or should the extension instead nominally support all formats, but | 
 |         accept only an implementation-dependent subset? | 
 |  | 
 |       RESOLVED:  Provide a specified set of supported formats.  This | 
 |       extension simply enumerates all 8-, 16-, and 32-byte internal formats | 
 |       with 1, 2, or 4 components, and specifies the mapping of unformatted | 
 |       buffer object data to texture components.  A follow-on extension could | 
 |       be done to support 3-component texels when better native hardware | 
 |       support is available.   | 
 |  | 
 |       Other than 3-component texels, the set of formats supported seems pretty | 
 |       compehensive.  We expect that buffer textures would be used for general | 
 |       computational tasks, where there is little need for formats with smaller | 
 |       components (e.g., RGBA4444).  Such formats are generally not supported | 
 |       natively on CPUs today.  With the general computational model provided | 
 |       by NV_gpu_program4 and EXT_gpu_shader4, it would be possible to treat | 
 |       such "packed" formats as larger single-component formats and unpack them | 
 |       with a small number of shader instructions. | 
 |  | 
 |       If and when double-precision floats or 64-bit integers are supported as | 
 |       basic types usable by shaders, we would expect that an extension would | 
 |       add new texture internal formats with 64-bit components and that those | 
 |       formats would also be supported for general-purpose textures and buffer | 
 |       textures as well. | 
 |  | 
 |     (10) How are buffer textures supported in GLSL? | 
 |  | 
 |       RESOLVED:  Create a new sampler type (samplerBuffer) for buffer textures | 
 |       and add a new lookup function (texelFetchBuffer) to explicitly access | 
 |       them using texture hardware. | 
 |  | 
 |       Other possibilities considered included extending the notion of bindable | 
 |       uniforms to support uniforms whose corresponding buffer objects can be | 
 |       bound to texture resources (e.g., "texture bindable uniform" instead of | 
 |       "bindable uniform").  We also considered automatically assigning | 
 |       bindable uniforms to texture or shader resources as appropriate.  Note | 
 |       that the restrictions, size limits, and performance characterstics of | 
 |       buffer textures and parameter buffers (NV_parameter_buffer_object) | 
 |       differ.  Automatic handling of uniforms adds driver complexity and may | 
 |       tend to hide performance characteristics since it isn't clear what | 
 |       resource would be used for what variable.  Additionally, it could | 
 |       require shader recompilation if the size of a uniform array is variable, | 
 |       and the hardware resource used depended on the size.   | 
 |  | 
 |       In the end, the texture approach seemed the simplest, and we chose that. | 
 |       It might be worth doing something more complex in the future. | 
 |  | 
 |     (11) What is the TEXTURE_BUFFER_ARB buffer object binding point good for? | 
 |  | 
 |       RESOLVED:  It can be used for loading data into buffer objects, and for | 
 |       mapping and unmapping buffers, both without disturbing other binding | 
 |       points.  Otherwise, it has no effect on GL operations, since buffer | 
 |       objects are bound to textures using the TexBufferARB() command that does | 
 |       not affect the buffer object binding point. | 
 |  | 
 |       Buffer object binding points have mixed usage.  In the | 
 |       EXT_vertex_buffer_object extension (OpenGL 1.5), there are two binding | 
 |       points.  The ELEMENT_ARRAY_BUFFER has a direct effect on rendering, as | 
 |       it modifies DrawElements() calls.  The effect of ARRAY_BUFFER is much | 
 |       more indirect; it is only used to affect subsequent vertex array calls | 
 |       (e.g., VertexPointer) and has no direct effect on rendering.  The reason | 
 |       for this is that the API was retrofitted on top of existing vertex array | 
 |       APIs.  If a new vertex array API were created that emphasized or even | 
 |       required the use of buffer objects, it seems likely that the buffer | 
 |       object would be included in the calls equivalent to today's | 
 |       VertexPointer() call. | 
 |  | 
 |     (12) How is the various buffer texture-related state queried? | 
 |  | 
 |       RESOLVED:  There are three pieces of state that can be queried:  (a) the | 
 |       texture object bound to buffer texture binding point for the active | 
 |       texture image unit, (b) the buffer object whose data store was used by | 
 |       that texture object, and (c) the buffer object bound to the | 
 |       TEXTURE_BUFFER_ARB binding point. | 
 |  | 
 |       All three are queried with GetIntegerv, because it didn't seem worth the | 
 |       trouble to add one or more new query functions.  Note that for (a) and | 
 |       (b), the texture queried is the one bound to TEXTURE_BUFFER_ARB on the | 
 |       active texture image unit. | 
 |  | 
 |     (13) Should we provide a new set of names for the signed normalized | 
 |          textures introduced in NV_texture_shader that match the convention | 
 |          used for floating-point and integer textures? | 
 |  | 
 |       RESOLVED: No. | 
 |  | 
 |     (14) Can a buffer object be attached to more than one buffer texture at | 
 |          once? | 
 |  | 
 |       RESOLVED: Multiple buffer textures may attach to the same buffer object | 
 |       simultaneously. | 
 |  | 
 |     (15) How does this extension interact with display lists? | 
 |  | 
 |       RESOLVED:  Buffer object commands can't be compiled into a display list. | 
 |       The new command in this extension uses buffer objects, so we specify | 
 |       that it also can't be compiled into a display list. | 
 |  | 
 | Revision History | 
 |  | 
 |     Rev.    Date    Author    Changes | 
 |     ----  --------  --------  ----------------------------------------- | 
 |       8   06/04/15  srahman   Add GLX protocol specification. | 
 |  | 
 |       7   07/09/13  Jon Leech Correct suffix on | 
 |                               TEXTURE_BUFFER_DATA_STORE_BINDING_ARB | 
 |                               (was EXT). | 
 |  | 
 |       6   6/30/08   js        Trivial conversion to ARB from EXT | 
 |  | 
 |  | 
 |       5   04/16/08  pbrown    Clarify that either NV_gpu_program4 or  | 
 |                               EXT_gpu_shader4 is required, not simply | 
 |                               NV_gpu_program4. | 
 |  | 
 |       4   10/30/07  ewerness  Add resolutions to various issues | 
 |  | 
 |       3      --               Pre-release revisions. |