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

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

    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.
