Name

    ARB_buffer_storage

Name Strings

    GL_ARB_buffer_storage

Contact

    Graham Sellers (graham.sellers 'at' amd.com)

Contributors

    Jeff Bolz, NVIDIA
    Daniel Koch, NVIDIA
    Jon Leech
    Mark Kilgard, NVIDIA

Notice

    Copyright (c) 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 June 3, 2013.
    Ratified by the Khronos Board of Promoters on July 19, 2013.

Version

    Last Modified Date: April 20, 2015
    Revision: 25

Number

    ARB Extension #144

Dependencies

    This extension is written against version 4.3 of the Core Profile OpenGL
    Specification, dated August 6, 2012.

    The definition of this extension is affected by the presence of
    GL_EXT_direct_state_access.

Overview

    OpenGL has long supported buffer objects as a means of storing data
    that may be used to source vertex attributes, pixel data for textures,
    uniforms and other elements. In un-extended GL, buffer data stores
    are mutable - that is, they may be de-allocated or resized while they
    are in use. The GL_ARB_texture_storage extension added immutable storage
    for texture object (and was subsequently incorporated into OpenGL 4.2).
    This extension further applies the concept of immutable storage to
    buffer objects. If an implementation is aware of a buffer's immutability,
    it may be able to make certain assumptions or apply particular
    optimizations in order to increase performance or reliability.

    Furthermore, this extension allows applications to pass additional
    information about a requested allocation to the implementation which it
    may use to select memory heaps, caching behavior or allocation strategies.

    Finally, this extension introduces the concept of persistent client
    mappings of buffer objects, which allow clients to retain pointers to a
    buffer's data store returned as the result of a mapping, and to issue
    drawing commands while those mappings are in place.

New Procedures and Functions

    void BufferStorage(enum target,
                       sizeiptr size,
                       const void * data,
                       bitfield flags);

    When EXT_direct_state_access is present:

    void NamedBufferStorageEXT(uint buffer,
                               sizeiptr size,
                               const void * data,
                               bitfield flags);

New Tokens

    Accepted in the <flags> parameter of BufferStorage and
    NamedBufferStorageEXT:

        MAP_READ_BIT                                0x0001 (existing)
        MAP_WRITE_BIT                               0x0002 (existing)
        MAP_PERSISTENT_BIT                          0x0040
        MAP_COHERENT_BIT                            0x0080
        DYNAMIC_STORAGE_BIT                         0x0100
        CLIENT_STORAGE_BIT                          0x0200

    Accepted as part of the <access> parameter to MapBufferRange:

        MAP_PERSISTENT_BIT                          0x00000040
        MAP_COHERENT_BIT                            0x00000080

    Accepted by the <pname> parameter of GetBufferParameter{i|i64}v:

        BUFFER_IMMUTABLE_STORAGE                    0x821F
        BUFFER_STORAGE_FLAGS                        0x8220

    Accepted by the <barriers> parameter of MemoryBarrier:

        CLIENT_MAPPED_BUFFER_BARRIER_BIT            0x00004000

IP Status

    No known IP claims.

Additions to Chapter 2 of the OpenGL Core Profile Specification, Version 4.3,
"OpenGL Fundamentals"

    Insert before the last line of Section 2.5.2, "Buffer Objects", p. 26:

    Under certain circumstances, the data store of a buffer object may
    be shared between the client and server and accessed simultaneously
    by both.

Additions to Chapter 6 of the OpenGL Core Profile Specification, Version 4.3,
"Buffer Objects"

    Modify Section 6.2, "Creating and Modifying Buffer Object Data Stores",
    p. 57 as follows:

    The data store of a buffer object is created by calling

        void BufferStorage(enum target,
                           sizeiptr size,
                           const void * data,
                           bitfield flags);

    with <target> set to one of the targets listed in Table 6.1, <size> set to
    the size of the data store in basic machine units and <flags> containing
    a bit-field describing the intended usage of the data store. The data
    store of the buffer object bound to <target> is allocated as a result of
    a call to this function and cannot be de-allocated until the buffer is
    deleted with a call to DeleteBuffers. Such a store may not be
    re-allocated through further calls to BufferStorage or BufferData.

    <data> specifies the address in client memory of the data that should
    be used to initialize the buffer's data store. If <data> is NULL, the
    data store of the buffer is created, but contains undefined data.
    Otherwise, <data> should point to an array of at least <size> basic
    machine units.

    <flags> is the bitwise OR of flags describing the intended usage
    of the buffer object's data store by the application. Valid flags and
    their meanings are as follows:

        DYNAMIC_STORAGE_BIT   The contents of the data store may be
    updated after creation through calls to BufferSubData. If this bit is not
    set, the buffer content may not be directly updated by the client. The
    <data> argument may be used to specify the initial content of the buffer's
    data store regardless of the presence of the DYNAMIC_STORAGE_BIT.
    Regardless of the presence of this bit, buffers may always be updated
    with server-side calls such as CopyBufferSubData and ClearBufferSubData.

        MAP_READ_BIT  The buffer's data store may be mapped by the client for
    read access and a pointer in the client's address space obtained that may
    be read from.

        MAP_WRITE_BIT  The buffer's data store may be mapped by the client for
    write access and a pointer in the client's address space obtained that may
    be written to.

        MAP_PERSISTENT_BIT  The client may request that the server read from
    or write to the buffer while it is mapped. The client's pointer to the
    data store remains valid so long as the data store is mapped, even during
    execution of drawing or dispatch commands.

        MAP_COHERENT_BIT  Shared access to buffers that are simultaneously
    mapped for client access and are used by the server will be coherent, so
    long as that mapping is performed using MapBufferRange. That is, data
    written to the store by either the client or server will be immediately
    visible to the other with no further action taken by the application. In
    particular:

        - If MAP_COHERENT_BIT is not set and the client performs a write
          followed by a call to one of the FlushMapped*BufferRange commands
          with a range including the written range, then in subsequent
          commands the server will see the writes.

        - If MAP_COHERENT_BIT is set and the client performs a write, then in
          subsequent commands the server will see the writes.

        - If MAP_COHERENT_BIT is not set and the server performs a write, the
          application must call MemoryBarrier with the
          CLIENT_MAPPED_BUFFER_BARRIER_BIT set and then call FenceSync with
          SYNC_GPU_COMMANDS_COMPLETE (or Finish). Then the CPU will see the
          writes after the sync is complete.

        - If MAP_COHERENT_BIT is set and the server does a write, the app must
          call FenceSync with SYNC_GPU_COMMANDS_COMPLETE (or Finish). Then the
          CPU will see the writes after the sync is complete.

        CLIENT_STORAGE_BIT  When all other criteria for the buffer storage
    allocation are met, this bit may be used by an implementation to determine
    whether to use storage that is local to the server or to the client to
    serve as the backing store for the buffer.

    If <flags> contains MAP_PERSISTENT_BIT, it must also contain at least one
    of MAP_READ_BIT or MAP_WRITE_BIT.

    It is an error to specify MAP_COHERENT_BIT without also specifying
    MAP_PERSISTENT_BIT.

    BufferStorage deletes any existing data store, and sets the values of
    the buffer object's state variables as shown in table 6.3.

    If any portion of the buffer object is mapped in the current context or
    any context current to another thread, it is as though UnmapBuffer (see
    section 6.3.1) is executed in each such context prior to deleting the
    existing data store.

    Name                     | Value for             | Value for
                             | BufferData            | BufferStorage
    -------------------------+-----------------------+---------------
    BUFFER_SIZE              | <size>                | <size>
    BUFFER_USAGE             | <usage>               | DYNAMIC_DRAW
    BUFFER_ACCESS            | READ_WRITE            | READ_WRITE
    BUFFER_ACCESS_FLAGS      | 0                     | 0
    BUFFER_IMMUTABLE_STORAGE | FALSE                 | TRUE
    BUFFER_MAPPED            | FALSE                 | FALSE
    BUFFER_MAP_POINTER       | NULL                  | NULL
    BUFFER_MAP_OFFSET        | 0                     | 0
    BUFFER_MAP_LENGTH        | 0                     | 0
    BUFFER_STORAGE_FLAGS     | MAP_READ_BIT |        | <flags>
                             | MAP_WRITE_BIT |       |
                             | DYNAMIC_STORAGE_BIT   |
        Table 6.3: Buffer object state after calling BufferData or
        BufferStorage.

    A mutable data store may be allocated for a buffer object by calling

        void BufferData(...)

        <include the remainder of Section 6.2 as written, and then append>.

    Calling BufferData is equivalent to calling BufferStorage with
    <target>, <size> and <data> as specified, and <flags> set to the logical
    OR of DYNAMIC_STORAGE_BIT, MAP_READ_BIT and MAP_WRITE_BIT. The GL will
    use the value of <usage> parameter to BufferData as a hint to further
    determine the intended use of the buffer. However, BufferStorage allocates
    immutable storage whereas BufferData allocates mutable storage. Thus, when
    a buffer's data store is allocated through a call to BufferData, the
    buffer's BUFFER_IMMUTABLE_STORAGE flags is set to FALSE.

    Add the following errors:

    An INVALID_OPERATION error is generated by BufferData and BufferStorage
    if the BUFFER_IMMUTABLE_STORAGE flag of the buffer bound to <target> is
    set to TRUE.

    An INVALID_OPERATION error is generated by BufferSubData if the
    BUFFER_IMMUTABLE_STORAGE flag of the buffer bound to <target> is TRUE
    and the value of BUFFER_STORAGE_FLAGS for the buffer does not have
    the DYNAMIC_STORAGE_BIT set.

    The command:

        void NamedBufferStorageEXT(uint buffer,
                                   sizeiptr size,
                                   const void * data,
                                   bitfield flags);

    behaves similarly to BufferStorage, except that the buffer whose storage
    is to be defined is specified by <buffer> rather than by the current
    binding to <target>.

    Add the following error:

    An INVALID_OPERATION error is generated by NamedBufferStorageEXT if
    the BUFFER_IMMUTABLE_STORAGE flag of <buffer> is set to TRUE.

    Append to Table 6.2, "Buffer object parameters and their values":

        +---------------------------+---------+-----------+------------------+
        |                           |         | Initial   | Legal            |
        | Name                      | Type    | Value     | Values           |
        +---------------------------+---------+-----------+------------------+
        | BUFFER_IMMUTABLE_STORAGE  | boolean | FALSE     | TRUE, FALSE      |
        | BUFFER_STORAGE_FLAGS      | int     | 0         | See section 6.2  |
        +---------------------------+---------+-----------+------------------+

    Append to Table 6.3, "Buffer object initial state":

        +---------------------------+-------------------------------------- +
        | Name                      | Value                                 |
        +---------------------------+---------------------------------------+
        | BUFFER_IMMUTABLE_STORAGE  | TRUE if the buffer's storage is       |
        |                           | immutable, FALSE otherwise            |
        | BUFFER_STORAGE_FLAGS      | 0                                     |
        +---------------------------+---------------------------------------+

    Modify Section 6.3, "Mapping and Unmapping Buffer Data"

    Add to the bulleted list describing flags that modify buffer mappings,
    p.62.

        * MAP_PERSISTENT_BIT indicates that it is not an error for the GL to
          read data from or write data to the buffer while it is mapped (see
          section 6.3.2). If this bit is set, the value of
          BUFFER_STORAGE_FLAGS for the buffer being mapped must include
          MAP_PERSISTENT_BIT.

        * MAP_COHERENT_BIT indicates that the mapping should be performed
          coherently. That is, such a mapping follows the rules set forth in
          section 6.2, "Creating and Modifying Buffer Object Data Stores".
          If the MAP_COHERENT_BIT is set and the buffer's BUFFER_STORAGE_FLAGS
          does not include MAP_COHERENT_BIT, the error INVALID_OPERATION is
          generated.

    Modify Section 6.3.2, "Effects of Mapping Buffers on Other GL Commands"
    to read:

    An INVALID_OPERATION error is generated by most, but not all GL
    commands when an attempt is detected by such a command to read data from
    or write data to a mapped buffer object unless it was allocated with the
    by a call to BufferStorage with MAP_PERSISTENT_BIT set in
    <flags>.

    Any command which does not detect these attempts, and performs such an
    invalid read or write, has undefined results and may result in GL
    interruption or termination.

    Add the following to the description of FlushMappedBufferRange:

    If a buffer range is mapped with both the MAP_PERSISTENT_BIT and
    MAP_FLUSH_EXPLICIT_BIT set, then FlushMappedBufferRange may be called to
    ensure that data written by the client into the flushed region becomes
    visible to the server. Data written to a coherent store will always
    become visible to the server after an unspecified period of time.

    Modify Section 6.8, "Buffer Object State", p. 70:

        Add the following required state to a buffer object:

        ..., a boolean indicating whether or not buffer storage is
    immutable, an unsigned integer storing the flags with which it was
    allocated, ...

Additions to Chapter 7 of the OpenGL Core Profile Specification, Version 4.3,
"Programs and Shaders"

    Add to the list of flags accepted by the <barriers> parameter to
    MemoryBarrier in Section 7.12.2, "Shader Memory Access Synchronization":

        * CLIENT_MAPPED_BUFFER_BARRIER_BIT: Access by the client to persistent
          mapped regions of buffer objects will reflect data written by shaders
          prior to the barrier. Note that this may cause additional
          synchronization operations.

New State

    Append to Table 23.6, "Buffer Object State", p. 511:

    +---------------------------+-----------+----------------------+-------------------+---------------------------------+------------+
    | Get Value                 | Type      | Get Command          | Initial Value     | Description                     | Sec.       |
    +---------------------------+-----------+----------------------+-------------------+---------------------------------+------------+
    | BUFFER_IMMUTABLE_STORAGE  | B         | GetBufferParameteriv | FALSE             | TRUE if buffer's data store is  | 6          |
    |                           |           |                      |                   | immutable, FALSE otherwise      |            |
    | BUFFER_STORAGE_FLAGS      | Z+        | GetBufferParameteriv | 0                 | The buffer object's storage     | 6          |
    |                           |           |                      |                   | flags.                          |            |
    +---------------------------+-----------+----------------------+-------------------+---------------------------------+------------+

New Implementation Dependent State

    None.

Errors

    INVALID_OPERATION is generated by BufferStorage if zero is bound to
    <target>.

    INVALID_OPERATION is generated by BufferStorage, NamedBufferStorageEXT
    and BufferData if the buffer object already owns an immutable data
    store.

    INVALID_VALUE is generated by BufferStorage and NamedBufferStorageEXT
    if <size> is less than or equal to zero.

    INVALID_VALUE is generated by BufferStorage and NamedBufferStorageEXT if
    <flags> contains MAP_PERSISTENT_BIT but does not contain
    at least one of MAP_READ_BIT or
    MAP_WRITE_BIT.

    INVALID_VALUE is generated by BufferStorage and NamedBufferStorageEXT if
    <flags> contains MAP_COHERENT_BIT, but does not also
    contain MAP_PERSISTENT_BIT.

    INVALID_OPERATION is generated by MapBufferRange if any of MAP_READ_BIT,
    MAP_WRITE_BIT, MAP_PERSISTENT_BIT, or MAP_COHERENT_BIT are included in
    <access>, but the same bit is not included in the buffer's storage
    flags.

    INVALID_OPERATION is generated by MapBufferRange if MAP_PERSISTENT_BIT
    is included in <access> but MAP_PERSISTENT_BIT is not
    included in the buffer's storage flags, or if MAP_COHERENT_BIT is included
    in <access> but

    OUT_OF_MEMORY is generated by BufferStorage and NamedBufferStorageEXT if
    the GL is not able to allocate a data store with the properties requested
    in <flags>.

    *REMOVE* all errors generated by any command should they detect access to
    a mapped buffer and replace with language such as:

    INVALID_OPERATION is generated by <command> if the buffer is currently
    mapped by MapBuffer{Range} unless it was mapped with the
    MAP_PERSISTENT_BIT included in <access>.

Dependencies on GL_EXT_direct_state_access

    If GL_EXT_direct_state_access is not supported, remove all references to
    NamedBufferStorageEXT.

Conformance Tests

    TBD

Usage Examples

    Example 1: Updating the content of a buffer which does not have the
    DYNAMIC flag set:

    // Allocate two buffers, one of which will be our 'staging buffer'.
    GLuint bufs[2];
    glGenBuffers(2, &bufs[0]);

    // Client can map this buffer for write.
    // One could possibly make this mapping persistent.
    glBindBuffer(GL_COPY_READ_BUFFER, bufs[0]);
    glBufferStorage(GL_COPY_READ_BUFFER, size, NULL,
                    GL_MAP_WRITE_BIT);

    // Client cannot read or write this buffer, server can do both.
    glBindBuffer(GL_COPY_WRITE_BUFFER, bufs[1]);
    glBufferStorage(GL_COPY_WRITE_BUFFER, size, NULL, 0);

    // Now, map the staging buffer to put data into it.
    void * data = glMapBufferRange(GL_COPY_READ_BUFFER, 0, size,
                                   GL_MAP_WRITE_BIT |
                                   GL_MAP_INVALIDATE_BUFFER_BIT);
    memcpy(data, source_data, size);
    glUnmapBuffer(GL_COPY_READ_BUFFER);

    // Copy from the staging buffer to the server-side buffer.
    glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, size);

    Example 2: Read from framebuffer into a buffer mapped into client's
    address space:

    // Create buffer, allocate storage, and create a persistent map.
    GLuint pbo;
    glGenBuffers(1, &pbo);
    glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo);
    glBufferStorage(GL_PIXEL_PACK_BUFFER, size, NULL,
                    GL_MAP_READ_BIT |
                    GL_MAP_PERSISTENT_BIT);

    void * data = glMapBufferRange(GL_PIXEL_PACK_BUFFER,
                                   GL_MAP_READ_BIT |
                                   GL_MAP_PERSISTENT_BIT);

    glReadPixels(0, 0, width, height, format, type, NULL);
    glMemoryBarrier(GL_CLIENT_MAPPED_BUFFER_BARRIER_BIT);
    GLsync fence = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);

    // Do stuff to use time...
    ReallyExpensiveFunction();

    glClientWaitSync(fence);

    // Use the data written to the buffer
    UseDataInMemory(data);

    XXX TODO::: MORE EXAMPLES HERE

Issues

    1) What is the best strategy to allow 'render while mapped'? Options I
       can think of right now are (a) Allow the application to render when a
       buffer is mapped, so long as the MAP_PERSISTENT_BIT
       was set when it was allocated; (b) Continue to disallow 'render while
       mapped', but say that a client pointer obtained from MapBuffer{Range}
       remains valid even when the buffer is not mapped, so long as it has
       not been destroyed; (c) add a flag to glMapBufferRange's <access>
       parameter to indicate the desire to render with it.

       RESOLVED: We choose a combination of (a) and (c). The application must
       both create the data store with MAP_PERSISTENT_BIT set
       _and_ map it with MAP_PERSISTENT_BIT set in <access>. Did the same
       for coherency too.

    2) The new flags don't directly map to the <usage> parameter for
       glBufferData and one cannot be expressed in terms of the other. Does
       that matter?

       RESOLVED: Most applications get <usage> wrong and they're only hints
       anyway. The flags are hard and fast rules that must be followed. They
       serve a different purpose. The idea here is to allow the
       implementation to not have to second guess the application and to
       perform less tracking, and for the application to have more control.
       We define BufferData in terms of BufferStorage with the most liberal
       allowed flags (essentially, anything goes), but still pass the
       <usage> hint to the implementation to allow it to continue to second
       guess the application.

    3) Do we have all the flags we want? Are any problematic?

       RESOLVED: We don't want any more flags. We don't believe any are
       problematic.

    4) Should we include MULTI_TARGET_BIT? There are legitimate use cases where
       a buffer could be used on two or three targets. However, this bit is an
       'all or nothing' kind of thing.

       RESOLVED: No, not at this time.

    5) How do you get data into a non-dynamic buffer if you can't write to it
       from the client?

       RESOLVED: The server is capable of writing to buffers that were not
       allocated with the DYNAMIC flag set. Therefore, it is possible to
       use CopyBufferSubData to copy from a dynamic buffer to a non-dynamic
       buffer. It's also possible to write to it with any other server-side
       mechanism such as transform feedback, image stores and so on.

    6) If a buffer is allocated without the GL_BUFFER_STORAGE_SERVER_READ_BIT
       (or GL_BUFFER_STORAGE_SERVER_WRITE_BIT), what happens if an attempt is
       made use the buffer in a way that may cause the server to read
       (or write) to the buffer?

       RESOLVED: Nuked the SERVER_READ and SERVER_WRITE bits. They didn't
       serve the purpose for which they were intended.

    7) Which operations are able to update buffers that are not dynamic?

       Non-dynamic buffers effectively don't allow direct transfer of data
       from client to server (i.e., glBufferSubData). Examples of operations
       that may write to non-dynamic buffers are transform feedback, image
       stores, ReadPixels, GetTexImage (PBO), CopyBufferSubData,
       ClearBufferSubData - essentially anything that doesn't transfer
       arbitrary amounts of data from client to server.

    8) Are there any restrictions on calling GetBufferSubData on a buffer
       allocated using BufferStorage?

       RESOLVED: No, there are not.

    9) What is the meaning of CLIENT_STORAGE_BIT? Is it one of those
       silly hint things?

       DISCUSSION: Unfortunately, yes, it is. For some platforms, such as UMA
       systems, it's irrelevant and all memory is both server and client
       accessible. The issue is, that on some platforms and for certain
       combinations of flags, there may be multiple regions of memory that
       can satisfy the request (visible to both server and client and coherent
       to both, for example), but may have substantially different performance
       characteristics for access from either. This bit essentially serves
       as a hint to say that that an application will access the store more
       frequently from the client than from the server. In practice,
       applications will still get it wrong (like setting it all the time or
       never setting it at all, for example), implementations will still have
       to second guess applications and end up full of heuristics to figure out
       where to put data and gobs of code to move things around based on what
       applications do, and eventually it'll make no difference whether
       applications set it or not. But hey, we tried.

    10) Do we want to add flags for MapBufferRange for PERSISTENT and/or
        COHERENT mapping? In their absence, implementations must assume that
        any mapping performed on a buffer whose storage flags include the
        PERSISTENT or COHERENT flags must behave appropriately.

        RESOLVED. Added.

    11) Do we need language to explicitly say that flushes of non-coherent
        mapped buffers need to occur on buffers mapped with the FLUSH_EXPLICIT
        bit?

        RESOLVED: No. The language already states that FlushMappedBufferRange
        should be used to perform the flush, and this command requires that
        the mapping be established with the FLUSH_EXPLICIT bit set.

    12) Which functions can/cannot be used to update the content of a
        non-DYNAMIC buffer? Can the buffer be the target of an update
        operation at all?

        RESOLVED: BufferSubData is only allowed for DYNAMIC buffers. Updates
        through mappings are allowed so long as the STORAGE_MAP_WRITE_BIT is
        set. Server side commands, including CopyBufferSubData,
        ClearBufferSubData, ReadPixels, GetTexImage are allowed. Further,
        shader writes such as image stores, SSBO, atomic counters, transform
        feedback and so on are also allowed.

    13) Why is there a gap between the MAP_WRITE_BIT and MAP_PERSISTENT_BIT
        token values?

        RESOLVED: MAP_PERSISTENT_BIT and MAP_COHERENT_BIT are allocated from
        the bitfield used for MapBufferRange, which include values that
        aren't relevant for BufferStorage. This allows the same tokens
        to be used as flags for BufferStorage and MapBufferRange, hopefully
        reducing confusion.

Revision History

    Rev.    Date      Author    Changes
    ----  --------    --------  -----------------------------------------

     1    01/16/2013  gsellers  Initial draft

     2    01/21/2013  gsellers  Updates

     3    01/22/2013  gsellers  Change static->dynamic. Remove target
                                restrictions. Get a little closer to expressing
                                BufferData in terms of BufferStorage.

     4    04/22/2013  gsellers  Add CLIENT_MAPPED_BUFFER_ACCESS_BIT for
                                MemoryBarrier.
                                Add BUFFER_STORAGE_{READ|WRITE}_BIT and issue 6.
                                Add example usage for non-dynamic buffers.
                                Add issue 7.

     5    04/23/2013  gsellers  Nuked the BUFFER_STORAGE_{READ|WRITE}_BIT
                                flags again.
                                Make DYNAMIC and MAP_WRITE_BIT
                                orthogonal.
                                Rename CLIENT_MAPPED_BUFFER_ACCESS_BIT to
                                CLIENT_MAPPED_BUFFER_BARRIER_BIT.
                                Add another example.
                                Update values of tokens.
                                Add (and resolve) issue 8.

     6    05/14/2013  gsellers  Add BUFFER_STORAGE_SERVER_BIT.
                                Define value of <usage> for buffers allocated
                                with BufferStorage. Issue 9.

     7    05/22/2013  gsellers  Address several issues from bug 10246.

     8    05/23/2013  gsellers  Address issues from bug 10288.
                                * Change BUFFER_STORAGE_SERVER_BIT to
                                  CLIENT_STORAGE_BIT (inverting its
                                  sense), which makes 0 'fast'.
                                * Clarify that DYNAMIC_BIT only affects
                                  BufferSubData (i.e., direct, arbitrary
                                  client->server transfers).
                                * Add issues 11 + 12.

     9    05/28/2013  Jon Leech Fix various typos resulting from changes
                                in token names, tweak language to match API
                                spec, some paragraph reflowing, insert some
                                questions marked by '**' inline.

    10    05/29/2013  gsellers  Remove <target> parameter from
                                NamedBufferStorageEXT.
                                Incorporate new rules for coherency.
                                Add COHERENT_MAP_BIT for MapBufferRange.

    11    05/30/2013  Jon Leech Fix typos including COHERENT_MAP_BIT
                                -> MAP_COHERENT_BIT and PERSISTENT_MAP_BIT
                                -> MAP_PERSISTENT_BIT.

    12    05/30/2013  gsellers  Resolve issues 3 and 10. Fix typos.
                                Resolve issues from bug 10326.
                                Add (and resolve) issue 13.

    13    05/30/2013  gsellers  Change names of flags (again).
                                Use same values for MapBufferRange flags
                                and BufferStorage flags.

    14    05/30/2013  Jon Leech Clean up language describing flags and
                                some indentation issues.

    15    05/31/2013  Jon Leech Add BUFFER_IMMUTABLE_STORAGE to table
                                6.2 (Bug 10288).

    16    06/06/2013  Jon Leech Change default BUFFER_IMMUTABLE_STORAGE
                                value in table 6.2 to FALSE, matching API
                                spec, since these are values when created
                                with BindBuffer. Fix typo from bug 10326.

    17    06/27/2013  Jon Leech Add error for BufferSubData and fix
                                example code (Bug 10326)

    18    07/03/2013  gsellers  Fix language describing DYNAMIC_STORAGE_BIT
                                (mutated -> updated), and typo in description
                                of usage parameter when storage is allocated
                                with BufferStorage. (Bug 10471)

    19    07/18/2013  gsellers  Added missing values for MAP_PERSISTENT_BIT
                                and MAP_COHERENT_BIT.

    20    07/18/2013  Jon Leech Add BufferStorage initial state to table
                                6.3 and add error when zero is bound to
                                <target> (Bug 10335).

    21    07/19/2013  Jon Leech Clean up table 6.3 captions to match
                                API spec (Bug 10335).

    22    08/15/2013  Jon Leech Remove error for BufferStorage and
                                NamedBufferStorageEXT if <flags> contains
                                MAP_WRITE_BIT but does not contain
                                DYNAMIC_STORAGE_BIT (Bug 10561, public Bug
                                925).

    23    08/16/2013  mjk       Better indicate DSA entrypoints

    24    06/09/2014  Jon Leech Change query commands for buffer storage
                                state to GetBufferParameteriv (Bug 12307).

    25    04/20/2015  Jon Leech Change description of MAP_COHERENT_BIT for
                                buffer storage so that barriers with
                                CLIENT_MAPPED_BUFFER_BARRIER_BIT do not need
                                to make CPU writes visible to the GPU in
                                this case without an explicit flush (Bug
                                13578).
