Name

    ARB_vertex_buffer_object

Name Strings

    GL_ARB_vertex_buffer_object
    GLX_ARB_vertex_buffer_object

Contributors

    Ben Ashbaugh
    Bob Beretta
    Pat Brown
    Cass Everitt
    Mandar Godse
    James Jones
    John Kessenich
    Dale Kirkland
    Jon Leech
    Bill Licea-Kane
    Barthold Lichtenbelt
    Bimal Poddar
    Thomas Roell
    Ian Romanick
    Jeremy Sandmel
    Jon Paul Schelter
    John Stauffer
    Nick Triantos
    Daniel Vogel

Contact

    Rick Hammerstone, AMD (rick.hammerstone 'at' amd.com)
    Matt Craighead, NVIDIA Corporation (mcraighead 'at' nvidia.com)
    Kurt Akeley, NVIDIA Corporation (kakeley 'at' nvidia.com)

Notice

    Copyright (c) 2003-2013 The Khronos Group Inc. Copyright terms at
        http://www.khronos.org/registry/speccopyright.html

IP Status

    None.

Status

    Complete. Approved by ARB on February 12, 2003.

Version

    Last Modified Date: October 25, 2010
    Revision: 0.99.6

Number

    ARB Extension #28

Dependencies

    Written based on the wording of the OpenGL 1.4 specification.

    GL_ARB_vertex_blend affects the definition of this extension.

    GL_ARB_vertex_program affects the definition of this extension.

    GL_EXT_vertex_shader affects the definition of this extension.

    GLX_ARB_create_context affects the behavior of this extension.

Overview

    This extension defines an interface that allows various types of data
    (especially vertex array data) to be cached in high-performance
    graphics memory on the server, thereby increasing the rate of data
    transfers.

    Chunks of data are encapsulated within "buffer objects", which
    conceptually are nothing more than arrays of bytes, just like any
    chunk of memory.  An API is provided whereby applications can read
    from or write to buffers, either via the GL itself (glBufferData,
    glBufferSubData, glGetBufferSubData) or via a pointer to the memory.

    The latter technique is known as "mapping" a buffer.  When an
    application maps a buffer, it is given a pointer to the memory.  When
    the application finishes reading from or writing to the memory, it is
    required to "unmap" the buffer before it is once again permitted to
    use that buffer as a GL data source or sink.  Mapping often allows
    applications to eliminate an extra data copy otherwise required to
    access the buffer, thereby enhancing performance.  In addition,
    requiring that applications unmap the buffer to use it as a data
    source or sink ensures that certain classes of latent synchronization
    bugs cannot occur.

    Although this extension only defines hooks for buffer objects to be
    used with OpenGL's vertex array APIs, the API defined in this
    extension permits buffer objects to be used as either data sources or
    sinks for any GL command that takes a pointer as an argument.
    Normally, in the absence of this extension, a pointer passed into the
    GL is simply a pointer to the user's data.  This extension defines
    a mechanism whereby this pointer is used not as a pointer to the data
    itself, but as an offset into a currently bound buffer object.  The
    buffer object ID zero is reserved, and when buffer object zero is
    bound to a given target, the commands affected by that buffer binding
    behave normally.  When a nonzero buffer ID is bound, then the pointer
    represents an offset.

    In the case of vertex arrays, this extension defines not merely one
    binding for all attributes, but a separate binding for each
    individual attribute.  As a result, applications can source their
    attributes from multiple buffers.  An application might, for example,
    have a model with constant texture coordinates and variable geometry.
    The texture coordinates might be retrieved from a buffer object with
    the usage mode "STATIC_DRAW", indicating to the GL that the
    application does not expect to update the contents of the buffer
    frequently or even at all, while the vertices might be retrieved from
    a buffer object with the usage mode "STREAM_DRAW", indicating that
    the vertices will be updated on a regular basis.

    In addition, a binding is defined by which applications can source
    index data (as used by DrawElements, DrawRangeElements, and
    MultiDrawElements) from a buffer object.  On some platforms, this
    enables very large models to be rendered with no more than a few
    small commands to the graphics device.

    It is expected that a future extension will allow sourcing pixel data
    from and writing pixel data to a buffer object.

Issues

    What should this extension be called?

        RESOLVED: By unanimous consent among the working group members,
        the name was chosen to be "ARB_vertex_buffer_object".  A large
        number of other names were considered throughout the lifetime of
        the proposal, especially "vertex_array_object" (originally),
        "buffer_object" (later on), and "memory_object" (near the end),
        but the name "vertex_buffer_object" was ultimately chosen.

        In particular, this name emphasizes not only that we have created
        a new type of object that encapsulates arbitrary data (buffer
        objects), but also, in particular, that these objects are used in
        this extension to source vertex data.  The name also is
        intentionally similar to "vertex buffers", although it should be
        emphasized that there is no such thing as a "vertex buffer" in
        the terminology of this extension.  The term "buffer object" is
        the correct noun.

    How is this extension different from ATI_vertex_array_object plus
    ATI_map_object_buffer?

        The following summarizes the major differences.
        - VAOs renamed to "buffer objects", to signify that they can be
          used for more than just vertex data.  Other renaming and API
          changes to try to better match OpenGL conventions.
        - The standard GL pointer APIs have been overloaded to be able to
          refer to offsets within these buffers, rather than adding new
          entry points.
        - The usage modes permitted for buffers have been augmented
          significantly, to reflect a broader class of application
          behaviors.
        - A new entry point allows reading back the contents of a buffer
          object.

    How is this extension different from NV_vertex_array_range?

        The following summarizes the major differences.
        - Applications are no longer responsible for memory management
          and synchronization.
        - Applications may still access high-performance memory, but
          this is optional, and such access is more restricted.
        - Buffer changes (glBindBufferARB) are generally expected to
          be very lightweight, rather than extremely heavyweight
          (glVertexArrayRangeNV).
        - A platform-specific allocator such as wgl/glXAllocateMemoryNV
          is no longer required.

    How does this extension relate to NV_pixel_data_range?

        A future extension could be created based on the framework
        created here that would support analogous functionality to that
        provided by NV_pixel_data_range.  Presumably, this extension
        would require little more than two new targets for BindBuffer,
        named (say) UNPACK_PIXELS and PACK_PIXELS.  The lists of commands
        affected by these bindings could easily be taken verbatim out of
        the NV_pixel_data_range specification.

    Should this extension include support for allowing vertex indices
    to be stored in buffer objects?
    
        RESOLVED: YES.  It is easily and cleanly added with just the
        addition of a binding point for the index buffer object.  Since
        our approach of overloading pointers works for any pointer in GL,
        no additional APIs need be defined, unlike in the various
        *_element_array extensions.

        Note that it is expected that implementations may have different
        memory type requirements for efficient storage of indices and
        vertices.  For example, some systems may prefer indices in AGP
        memory and vertices in video memory, or vice versa; or, on
        systems where DMA of index data is not supported, index data must
        be stored in (cacheable) system memory for acceptable
        performance.  As a result, applications are strongly urged to
        put their models' vertex and index data in separate buffers, to
        assist drivers in choosing the most efficient locations.

    Should the layout of an array store be defined at array store
    creation time?

        RESOLVED: NO.  This could provide better performance if the
        client specifies a data type that the hardware doesn't support,
        but this isn't a performance path anyways, and it adds a
        cumbersome interface on top of the extension.

    Should there be some sort of scheme for allowing applications to
    stream vertex data efficiently?

        RESOLVED: YES.  Applications that generate their data on the
        fly end up doing an extra data copy unless they are given a
        pointer into memory that the graphics hardware can DMA from.  The
        performance win from doing this can be significant.

    Should the client be able to retrieve a pointer to a buffer object?

        RESOLVED: YES.  This solves the previous problem.  Since GL
        vertex array formats are already user-visible, this does not
        suffer from the sorts of formatting issues that would arise if
        the GL allowed applications to retrieve pointers to texture
        objects or to the framebuffer.  Synchronization can be a concern,
        but proper usage of this extension will minimize its overhead.

    Should this extension sit on top of the existing vertex array
    implementation, instead of introducing a new set of API calls?

        RESOLVED: YES.  This simplifies the API, and separating out the
        buffer binding from the offset/stride within the buffer leads to
        an elegant "BindBufferARB" command that can be used for other
        parts of GL like the pixel path.

    Should buffer object state overlap with existing vertex array pointer
    state, or should there be new drawing commands, e.g.,
    DrawArrayObject?

        RESOLVED: OVERLAP.  The exponential growth in drawing commands
        is problematic.  Even without this, there is already
        ArrayElement, DrawArrays, DrawElements, DrawRangeElements,
        MultiDrawArrays, and MultiDrawElements.

    Does the buffer binding state push/pop?

        RESOLVED: YES.  It pushes/pops on the client with the rest of
        the vertex array state.  Some revisions of the ATI VAO spec
        listed a push/pop attrib "objbuf", but no new bit was defined;
        all this has been moved into the standard "vertex-array" bit.

        Note that both the user-controlled binding ARRAY_BUFFER_ARB
        binding point and the per-array bindings push and pop.

        Note that additional binding points, such as ones for pixel or
        texture transfers, would not be part of the vertex array state,
        and thus would likely push and pop as part of the pixel store
        (client) state when they are defined.

    How is the decision whether to use the array pointer as an offset or
    as a real pointer made?

        RESOLVED: When the default buffer object (object zero) is
        bound, all pointers behave as real pointers.  When any other
        object is bound, all pointers are treated as offsets.
        Conceptually, one can imagine that buffer object zero is a buffer
        object sitting at base NULL and with an extent large enough that
        it covers all of the system's virtual address space.

        Note that this approach essentially requires that binding points
        be client (not server) state.

    Can buffer objects be shared between contexts in the same way that
    display lists are?

        RESOLVED: YES.  All potentially large OpenGL objects, such as
        display lists and textures, can be shared, and this is an
        important capability.  Note, however, that sharing requires that
        buffer objects be server (not client) state, since it is not
        possible to share client state.

    Should buffer objects be client state or server state?

        RESOLVED: Server state.  Arguments for client state include:

          - Buffer data are stored in client-side format, making server
            storage complex when client and server endianness differ.
          - Vertex arrays are client state.

        These arguments are outweighed by the significant advantages
        of server state, including:

          - Server state can be shared between contexts, and this is
            expected to be an important capability (sharing of texture
            objects is very common).
          - In the case of indirect rendering, performance may be
            very significantly greater for data stored on the server
            side of the wire.

    How is synchronization enforced when buffer objects are shared by
    multiple OpenGL contexts?

        RESOLVED: It is generally the clients' responsibility to
        synchronize modifications made to shared buffer objects.  GL
        implementations will make some effort to avoid deletion of in-use
        buffer objects, but may not be able to ensure this handling.

    What happens if a currently bound buffer object is deleted?

        RESOLVED: Orphan.  To avoid chasing invalid pointers OpenGL
        implementations will attempt to defer the deletion of any buffer
        object until that object is not bound by any client in the share
        list.  It should be possible to implement this behavior
        efficiently in the direct rendering case, but the implementation
        may be difficult/impossible in the indirect rendering case.
        Since synchronization during sharing is a client responsibility,
        this behavior is acceptable.

    Should there be a way to query the data in a buffer object?

        RESOLVED: YES.  Almost all objects in OpenGL are fully
        queriable, and since these objects are simply byte arrays, there
        does not seem to be any reason to do things otherwise here.  The
        primary exceptions to GL queriability are cases where such
        functionality would be extremely burdensome to provide, as is the
        case with display lists.

    Do buffer objects survive screen resolution changes, etc.?

        RESOLVED: YES.  This is not mentioned in the spec, so by
        default they behave just like other OpenGL state, like texture
        objects -- the data is unmodified by external events like
        modeswitches, switching the system into standby or hibernate
        mode, etc.

    What happens to a mapped buffer when a screen resolution change or
    other such window-system-specific system event occurs?

        RESOLVED: The buffer's contents may become undefined.  The
        application will then be notified at Unmap time that the buffer's
        contents have been destroyed.  However, for the remaining
        duration of the map, the pointer returned from Map must continue
        to point to valid memory, in order to ensure that the application
        cannot crash if it continues to read or write after the system
        event has been handled.

    What happens to the pointer returned by MapBufferARB after a call to
    UnmapBufferARB?

        RESOLVED: The pointer becomes totally invalid.  Note that
        drivers are free to move the underlying buffer or even unmap the
        memory, leaving the virtual addresses in question pointing at
        nothing.  Such flexibility is necessary to enable efficient
        implementations on systems with no virtual memory; with limited
        control over virtual memory from graphics drivers; or where
        virtual address space is at a premium.

    Are any of these commands allowed inside Begin/End?

        RESOLVED: NO, with the possible exception of BindBuffer, which
        should not be used inside a Begin/End but will have undefined
        error behavior, like most vertex array commands.

    What happens when an attempt is made to access data outside the
    bounds of the buffer object with a command that dereferences the
    arrays?

        RESOLVED: ALLOW PROGRAM TERMINATION.  In the event of a
        software fallback, bounds checking can become impractical.  Since
        applications don't know the actual address of the buffer object
        and only provide an offset, they can't ever guarantee that
        out-of-bounds offsets will fall on valid memory.  So it's hard to
        do any better than this.

        Of course, such an event should not be able to bring down the
        system, only terminate the program.

    What type should <offset> and <size> arguments use?

        RESOLVED: We define new types that will work well on 64-bit
        systems, analogous to C's "intptr_t".  The new type "GLintptrARB"
        should be used in place of GLint whenever it is expected that
        values might exceed 2 billion.  The new type "GLsizeiptrARB"
        should be used in place of GLsizei whenever it is expected
        that counts might exceed 2 billion.  Both types are defined as
        signed integers large enough to contain any pointer value.  As a
        result, they naturally scale to larger numbers of bits on systems
        with 64-bit or even larger pointers.

        The offsets introduced in this extension are typed GLintptrARB,
        consistent with other GL parameters that must be non-negative,
        but are arithmetic in nature (not uint), and are not sizes; for
        example, the xoffset argument to TexSubImage*D is of type GLint.
        Buffer sizes are typed GLsizeiptrARB.

        The idea of making these types unsigned was considered, but was
        ultimately rejected on the grounds that supporting buffers larger
        than 2 GB was not deemed important on 32-bit systems.

    Should buffer maps be client or server state?

        RESOLVED: Server.  If a buffer is being shared by multiple
        clients, it will also be desirable to share the mappings of that
        buffer.  In cases where the mapping cannot shared (for example,
        in the case of indirect rendering) queries of the map pointer by
        clients other than the one that created the map will return a
        null pointer.

    Should "Unmap" be treated as one word or two?

        RESOLVED: One word.

    Should "usage" be a parameter to BufferDataARB, or specified
    separately using a parameter specification command, e.g.,
    BufferParameteriARB?

        RESOLVED: Parameter to BufferDataARB.  It is desirable for the
        implementation to know the usage when the buffer is initialized,
        so including it in the initialization command makes sense.  This
        avoids manpage notes such as "Please specify the usage before you
        initialize the buffer".

    Should it be possible to change the usage of an initialized buffer?

        RESOLVED: NO.  Unless it is shown that this flexibility is
        necessary, it will be easier for implementations to be efficient
        if usage cannot be changed.  (Except by re-initializing the
        buffer completely.)

    Should we allow for the possibility of multiple simultaneous maps for
    a single buffer?

        RESOLVED: NO.  If multiple maps are allowed, the mapping
        semantics become very difficult to understand and to specify.
        It is also unclear that there are any benefits to offering such
        functionality.  Therefore, only one map per buffer is permitted.

        Note: the limit of one map per buffer eliminates any need for
        "sub-region" mapping.  The single map always maps the entire
        data store of the buffer.

    Should it be an error to render from a currently mapped buffer?

        RESOLVED: YES.  Making this an error rather than undefined makes
        the API much more bulletproof.

    Should it be possible for the application to query the "viability" of
    the data store of a buffer?

        RESOLVED: NO.  UnmapBuffer can return FALSE to indicate this, but
        there is no additional query to check whether the data has been
        lost.  In general, most/all GL state is queriable, unless there
        is a compelling reason otherwise.  However, on examination, it
        appears that there are several compelling reasons otherwise in
        this case.  In particular, the default for this state variable is
        non-obvious (is the data "valid" when no data has been specified
        yet?), and it's unclear when it should be reset (BufferData only?
        BufferSubData?  A successful UnmapBuffer?).  After these issues
        came to light, the query was removed from the spec.

    What should the error behavior of BufferDataARB and MapBufferARB be?

        RESOLVED: BufferDataARB returns no value and sets OUT_OF_MEMORY
        if the buffer could not be created, whereas MapBufferARB returns
        NULL and also sets OUT_OF_MEMORY if the buffer could not be
        mapped.

    Should UnmapBufferARB return a boolean indicating data integrity?

        RESOLVED: YES, since the Unmap is precisely the point at which
        the buffer can no longer be lost.

    How is unaligned data handled?

        RESOLVED: All client restrictions on data alignment must be met,
        and in addition to that, all offsets must be multiples of the
        size of the underlying data type.  So, for example, float data in
        a buffer object must have an offset that is (typically) a
        multiple of 4.  This should make the server implementation
        easier, since this additional rule will guarantee that no 
        alignment checking is required on most platforms.

    Should MapBufferARB return the pointer to the map, or should there be
    a separate call to ask for the pointer?

        RESOLVED: BOTH.  For convenience, MapBufferARB returns a pointer
        or NULL in the event of failure; but since most/all GL state is
        queriable, you can also query the pointer at a later point in
        time.  If the buffer is not mapped, querying the pointer should
        return NULL.

    Should there be one binding point for all arrays or several binding
    points, one for each array?

        RESOLVED: One binding point for all arrays.  Index data uses a
        separate target.

    Should there be a PRESERVE/DISCARD option on BufferSubDataARB?  On
    MapBufferARB?

        RESOLVED: NO, NO.  ATI_vertex_array_object had this option for
        UpdateObjectBufferATI, which is the equivalent of
        BufferSubDataARB, but it's unclear whether this has any utility.
        There might be some utility for MapBufferARB, but forcing the
        user to call BufferDataARB again with a NULL data pointer has
        some advantages of its own, such as forcing the user to respecify
        the size.

    Should there be an option for MapBufferARB that guarantees
    nonvolatile memory?

        RESOLVED: NO.  On systems where volatile memory spaces are a
        concern, there is little or no way to supply nonvolatile memory
        without crippling performance badly.  In some cases, it might
        not even be possible to implement Map except by returning system
        memory.  Systems that do not have problems with volatility are,
        of course, welcome to return TRUE from UnmapBufferARB all the
        time.  If applications want the ease of use that results from not
        having to check for lost data, they can still use BufferDataARB
        and BufferSubDataARB, so the burden is not too great.

    What new usages do we need to add?

        RESOLVED.  We have defined a 3x3 matrix of usages.  The
        pixel-related terms draw, read, and copy are used to distinguish
        between three basic data paths: application to GL (draw), GL to
        application (read), and GL to GL (copy).  The terms stream,
        static, and dynamic are used to identify three data access
        patterns: specify once and use once or perhaps only a few times
        (stream), specify once and use many times (static), and specify
        and use repeatedly (dynamic).

        Note that the "copy" and "read" usage token values will become
        meaningful only when pixel transfer capability is added to
        buffer objects by a (presumed) subsequent extension.

        Note that the data paths "draw", "read", and "copy" are analogous
        in both name and meaning to the GL commands DrawPixels,
        ReadPixels, and CopyPixels, respectively.

    Is it legal C to use pointers as offsets?

        We haven't come to any definitive conclusion about this.  The
        proposal is to convert to pointer as:

            pointer = (char *)NULL + offset;

        And convert back to offset as:

            offset = (char *)pointer - (char *)NULL;

        Varying opinions have been expressed as to whether this is legal,
        although no one could provide an example of a real system where
        any problems would occur.

    Should we add new Offset commands, e.g., VertexOffset, if the pointer
    approach has some compatibility concerns?

        RESOLVED: NO.  The working group voted that the existing pointer-
        as-offset approach is acceptable.

    Which commands are compiled into display lists?

        RESOLVED: None of the commands in this extension are compiled
        into display lists.  The reasoning is that the server may not
        have up-to-date buffer bindings, since BindBuffer is a client
        command.

        Just as without this extension, vertex data is dereferenced
        when ArrayElement, etc. are compiled into a display list.

    Should there be a new command "DiscardAndMapBuffer" that is
    equivalent to BufferDataARB with NULL pointer followed by
    MapBufferARB?

        RESOLVED: NO, no one has come up with a clearly superior proposal
        that everyone can agree on.

     Are any GL commands disallowed when at least one buffer object is
     mapped?

        RESOLVED: NO.  In general, applications may use whatever GL
        commands they wish when a buffer is mapped.  However, several
        other restrictions on the application do apply: the application
        must not attempt to source data out of, or sink data into, a
        currently mapped buffer.  Furthermore, the application may not
        use the pointer returned by Map as an argument to a GL command.
        (Note that this last restriction is unlikely to be enforced in
        practice, but it violates reasonable expectations about how the
        extension should be used, and it doesn't seem to be a very
        interesting usage model anyhow.  Maps are for the user, not for
        the GL.)

        More restrictive rules were considered (for example, "after
        calling MapBuffer, all GL commands except for UnmapBuffer produce
        errors"), but this was considered far too restrictive.  The
        expectation is that an application might map a buffer and start
        filling it in a different thread, but continue to render in its
        main thread (using a different buffer or no buffer at all).  So
        no commands are disallowed simply because a buffer happens to be
        mapped.

    Should the usage and data arguments to BufferDataARB be swapped?

        RESOLVED: NO.  This would be more consistent with other things in
        GL if they were swapped, but no one seems to care.  If we had
        caught this earlier, maybe, but it's just too late.

    How does MultiDrawElements work?

        The language gets a little confusing, but I believe it is quite
        clearly specified in the end.  The argument <indices> to
        MultiDrawElements, which is of type "const void **", is an
        honest-to-goodness pointer to regular old system memory, no
        matter whether a buffer is bound or not.  That memory in turn
        consists of an array of <primcount> pointers.  If no buffer is
        bound, each of those <primcount> pointers is a regular pointer.
        If a buffer is bound, each of those <primcount> pointers is a
        fake pointer that represents an offset in the buffer object.

        If you wanted to put the array of <primcount> offsets in a buffer
        object, you'd have to define a new extension with a new target.

    When is the binding between a buffer object and a specific vertex array
    (e.g., VERTEX_ARRAY_BUFFER_BINDING_ARB) established?

        The array's buffer binding is set when the array pointer is specified.
        Using the vertex array as an example, this is when VertexPointer is
        called.  At that time, the current array buffer binding is used for
        the vertex array.  The current array buffer binding is set by calling
        BindBufferARB with a <target> of ARRAY_BUFFER_ARB.  Changing the
        current array buffer binding does not affect the bindings used by
        already established arrays.

          BindBufferARB(ARRAY_BUFFER_ARB, 1);
          VertexPointer(...);   // vertex array data points to buffer 1
          BindBufferARB(ARRAY_BUFFER_ARB, 2);
          // vertex array data still points to buffer 1

    What happens when a single ArrayElement call within a large sequence of
    ArrayElement calls specifies an element that is outside the range of the
    bound buffer objects?

        UNRESOLVED.  The three suggestions from the ARB meeting are to either
        ignore just that ArrayElement call, set an error bit and ignore all
        ArrayElement calls until End, or treat the ArrayElement call as
        ArrayElement(0).

    How should EnableClientState and DisableClientState be handled when using
    indirect rendering?

        RESOLVED:  EnableVertexAttribArray and DisableVertexAttribArray
        commands are used to inform the server of new enable/disable state.

    When using indirect rendering, how is DrawElements handled when the
    element array is in a buffer object but one or more of the enabled arrays
    are not?

        RESOLVED:  There are two commands that can be used to implement
        DrawElements and related calls.  If all of the data resides on the
        server, the element pointer is set by using a BindBufferToArray
        command with array set to ELEMENT_ARRAY_ATI.  This command is
        followed by the appropriate EnableVertexAttribArray and
        DisableVertexAttribArray calls, making sure to enable the element
        array, and either a DrawElements call or a DrawRangeElements call.

        If any arrays reside on the client, including the element array,
        the sequence is essentially the same except the DrawRangeElements
        protocol must be used.  If the element array resides on the
        server, the client must issue a GetElementRange command to determine
        the range of array data (and the values for 'start' and 'end') that
        must be sent to the server.

    Is a "provoke" flag needed in the ArrayElement command protocol to switch
    between the case where the VERTEX_ARRAY is client-side vs. server-side?
    
        NO.  The server will know whether or not the ArrayElement command
        will provoke a vertex because it knows whether or not a buffer object
        is bound to VERTEX_ARRAY.

    How does the server know which arrays with buffer objects bound are
    enabled in ArrayElement?

        RESOLVED:  The array bindings are configured using BindBuffer and
        BindBufferToArray commands.  The arrays are enabled and disabled
        using EnableVertexAttribArray and DisableVertexAttribArray.

    Can't the server-side array bindings just be sent in a the ARRAY_INFO
    when DrawArrays is called?
    
        NO.  The only way to do that would be to transmit the offset, type,
        size, stride, etc. parameters and the buffer ID.  However, the buffer
        may have been deleted in the meantime.  The binding information must
        be sent when the pointer function (e.g., VertexPointer) is called.

    What about byte-ordering?  The format of the data, and therefore what
    byte-swapping may need to be done, is not know when the data is
    uploaded to the server.  In fact, since it is legal (though probably
    nonsensical) to have the same bytes in the buffer be used as multiple
    datatypes, a single byte-ordering may not exist.  What happens when
    two clients with different byte ordering share one buffer object?  Is
    it valid to not expose the extension if the byte-ordering of the
    client and server do not match?

        RESOLVED:  It is the client's responsibility to convert buffer data
        to and from the server's byte order.  Since only the client knows
        the correct format of the data, and there may be multiple clients
        with different byte orderings sharing a single buffer object, it is
        unreasonable to ask the GL to handle buffer object byte-swapping.
        To avoid errors caused by naive clients attempting to use buffer
        objects without performing the appropriate byte swapping, clients
        must opt in to buffer object support at context creation time using
        the GLX_CONTEXT_ALLOW_BUFFER_BYTE_ORDER_MISMATCH_ARB context attrib.  
        If this attribute is not specified and the byte ordering of the client
        and server differ, the VBO extension must not be exposed and the
        maximum context version that can be reported is 1.4.

    Should Enable/DisableVertexAttribArray and VertexAttribPointer handle
    both indexed and legacy arrays?

        RESOLVED: Yes.  Send GL_NONE for <array> when referring to
        indexed arrays.  For all other values of <array> except
        GL_TEXTURE??, <index> is ignored.  For GL_TEXTURE??, see next
        issue.

    How is the client-side state client active texture, needed by
    glTexCoordPointer, communicated to the server?

        RESOLVED: Send the active texture index using the <index>
        parameter normally used for indexed arrays.  The value of
        <index> will be an offset from GL_TEXTURE0.

        OTHER OPTIONS CONSIDERED: Add a separate parameter to 
        VertexAttribPointer rather than alias the index parameter.
        Only advantage is slightly improved clarity.

        Add ClientActiveTexture protocol.  This would cause problems
        because the active texture is client state.  If two GLX processes
        were maintaining their own client state for one server-side
        context, it would be hard to reliably keep the active texture
        state in sync between the client and server.  It would need to be
        tracked per client on the server.

    How are Push/PopClientAttrib handled?

        RESOLVED: Specify protocol for these commands.  Some state
        affected by these commands needs to be duplicated in the server
        now, so these operations need to be duplicated there as well.

        OTHER OPTIONS CONSIDERED: Break the commands down into the
        individual commands required to perform the operation and send the
        appropriate protocol for those commands.  This is insufficient
        because it could cause deleted buffer objects to be destroyed by
        the server while they are still in use by a non-current entry in
        the client's attribute stack.

    How are integer arrays differentiated from floating point or fixed
    point arrays?

        RESOLVED: Added an "is_integer" boolean field to ARRAY_INFO and
        VertexAttribPointer.

    Is separate protocol needed for MapBuffer/UnmapBuffer?

        RESOLVED: Yes.  Buffers can only be mapped once.  Buffers need
        not be bound for the duration of their mapping, and whether a
        buffer is mapped or not is server state, so to properly track
        this state and generate related errors when there are multiple
        clients sharing the same buffer object, protocol must be sent
        to the server to duplicate the state there.

    Should the MapBuffer/UnmapBuffer protocol handle transferring of
    the buffer data when needed, or should implementations transfer the
    data using the BufferSubData and GetBufferSubData protocol?

        RESOLVED: Using the BufferSubData and GetBufferSubData protocol.
        This simplifies the Map and Unmap protocol and allows
        implementations to break up large data transfers into chunks.
        For example, the buffer data may be larger than the maximum size
        of a GLX single command.  Sending the data as part of the
        UnmapBuffer protocol would fail, but sending it in one or more
        BufferSubData commands would still be possible.  Implementations
        should take care to retreive the data, if needed, before mapping
        and send it back after unmapping.  This does not introduce race
        conditions because it is already up to the application to ensure
        proper mutexing of buffer object operations is done, and the
        protocol will still all happen within one application-visible GL
        command.

    Should client array data sent to the server in DrawArraysNew and
    DrawRangeElements be aligned?  Should individual arrays be separately
    aligned?  Should the arrays be sent be sent in order of largest
    element type to smallest?

        RESOLVED: No.  The client shall send the data as one contiguous
        array of bytes.  The server shall be responsible for aligning
        the individual entries as they are extracted if such alignment
        is needed.

    EXT_vertex_array allows enabling/disabling vertex arrays with
    Enable/Disable.  This state needs to be intercepted by the client
    to properly manage buffer object state.  Should protocol for Enable
    and Disable still be sent when these enums are used, or should the
    EnableClientState/DisableClientState protocol be sent instead?

        RESOLVED: Send the EnableClientState/DisableClientState protocol.
        The server may need to take additional actions for these special
        Enable/Disable enums.  Since the client already needs to
        intercept and handle them specially, keep the protocol separate
        for the server's benefit.

New Procedures and Functions

    void BindBufferARB(enum target, uint buffer);
    void DeleteBuffersARB(sizei n, const uint *buffers);
    void GenBuffersARB(sizei n, uint *buffers);
    boolean IsBufferARB(uint buffer);

    void BufferDataARB(enum target, sizeiptrARB size, const void *data,
                       enum usage);
    void BufferSubDataARB(enum target, intptrARB offset, sizeiptrARB size,
                          const void *data);
    void GetBufferSubDataARB(enum target, intptrARB offset,
                             sizeiptrARB size, void *data);

    void *MapBufferARB(enum target, enum access);
    boolean UnmapBufferARB(enum target);

    void GetBufferParameterivARB(enum target, enum pname, int *params);
    void GetBufferPointervARB(enum target, enum pname, void **params);

New Tokens

    Accepted as an attribute name in the <attrib_list> parameter of
    glXCreateContextAttribsARB:

        GLX_CONTEXT_ALLOW_BUFFER_BYTE_ORDER_MISMATCH_ARB 0x2095

    Accepted by the <target> parameters of BindBufferARB, BufferDataARB,
    BufferSubDataARB, MapBufferARB, UnmapBufferARB,
    GetBufferSubDataARB, GetBufferParameterivARB, and
    GetBufferPointervARB:

        ARRAY_BUFFER_ARB                             0x8892
        ELEMENT_ARRAY_BUFFER_ARB                     0x8893

    Accepted by the <pname> parameter of GetBooleanv, GetIntegerv,
    GetFloatv, and GetDoublev:

        ARRAY_BUFFER_BINDING_ARB                     0x8894
        ELEMENT_ARRAY_BUFFER_BINDING_ARB             0x8895
        VERTEX_ARRAY_BUFFER_BINDING_ARB              0x8896
        NORMAL_ARRAY_BUFFER_BINDING_ARB              0x8897
        COLOR_ARRAY_BUFFER_BINDING_ARB               0x8898
        INDEX_ARRAY_BUFFER_BINDING_ARB               0x8899
        TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB       0x889A
        EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB           0x889B
        SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB     0x889C
        FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB      0x889D
        WEIGHT_ARRAY_BUFFER_BINDING_ARB              0x889E

    Accepted by the <pname> parameter of GetVertexAttribivARB:

        VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB       0x889F

    Accepted by the <usage> parameter of BufferDataARB:

        STREAM_DRAW_ARB                              0x88E0
        STREAM_READ_ARB                              0x88E1
        STREAM_COPY_ARB                              0x88E2
        STATIC_DRAW_ARB                              0x88E4
        STATIC_READ_ARB                              0x88E5
        STATIC_COPY_ARB                              0x88E6
        DYNAMIC_DRAW_ARB                             0x88E8
        DYNAMIC_READ_ARB                             0x88E9
        DYNAMIC_COPY_ARB                             0x88EA

    Accepted by the <access> parameter of MapBufferARB:

        READ_ONLY_ARB                                0x88B8
        WRITE_ONLY_ARB                               0x88B9
        READ_WRITE_ARB                               0x88BA

    Accepted by the <pname> parameter of GetBufferParameterivARB:

        BUFFER_SIZE_ARB                              0x8764
        BUFFER_USAGE_ARB                             0x8765
        BUFFER_ACCESS_ARB                            0x88BB
        BUFFER_MAPPED_ARB                            0x88BC

    Accepted by the <pname> parameter of GetBufferPointervARB:

        BUFFER_MAP_POINTER_ARB                       0x88BD


Additions to Chapter 2 of the 1.4 Specification (OpenGL Operation)

    Add to Table 2.2:

       "GL Type        Minimum       Description
                       Bit Width
        -----------------------------------------------------------------
        intptrARB      <ptrbits>     signed 2's complement binary integer
        sizeiptrARB    <ptrbits>     Non-negative binary integer size"

    Add to the paragraph under Table 2.2:

    "<ptrbits> is the number of bits required to represent a pointer
    type; in other words, types intptrARB and sizeiptrARB must be
    sufficiently large as to store any address."

    Add a new section "Buffer Objects" between sections 2.8 and 2.9:

    "2.8A  Buffer Objects
     --------------------

    The vertex data arrays described in section 2.8 are stored in client
    memory.  It is sometimes desirable to store frequently used client
    data, such as vertex array data, in high-performance server memory.
    GL buffer objects provide a mechanism that clients can use to
    allocate, initialize, and render from such memory.

    The name space for buffer objects is the unsigned integers, with zero
    reserved for the GL.  A buffer object is created by binding an unused
    name to ARRAY_BUFFER_ARB.  The binding is effected by calling

        void BindBufferARB(enum target, uint buffer);

    with <target> set to ARRAY_BUFFER_ARB and <buffer> set to the unused
    name.  The resulting buffer object is a new state vector, initialized
    with a zero-sized memory buffer, and comprising the state values
    listed in Table BufObj1.

        Name                   Type         Initial Value   Legal Values
        ----                   ----         -------------   ------------
        BUFFER_SIZE_ARB        integer      0               any non-negative
                                                            integer
        BUFFER_USAGE_ARB       enum         STATIC_DRAW_ARB STREAM_DRAW_ARB,
                                                            STREAM_READ_ARB,
                                                            STREAM_COPY_ARB,
                                                            STATIC_DRAW_ARB,
                                                            STATIC_READ_ARB,
                                                            STATIC_COPY_ARB,
                                                            DYNAMIC_DRAW_ARB,
                                                            DYNAMIC_READ_ARB,
                                                            DYNAMIC_COPY_ARB
        BUFFER_ACCESS_ARB      enum         READ_WRITE_ARB  READ_ONLY_ARB,
                                                            WRITE_ONLY_ARB,
                                                            READ_WRITE_ARB
        BUFFER_MAPPED_ARB      boolean      FALSE           TRUE, FALSE
        BUFFER_MAP_POINTER_ARB void*        NULL            address

        Table BufObj1: Buffer object parameters and their values.

    BindBufferARB may also be used to bind an existing buffer object.
    If the bind is successful no change is made to the state of the
    newly bound buffer object, and any previous binding to <target> is
    broken.

    While a buffer object is bound, GL operations on the target to which
    it is bound affect the bound buffer object, and queries of the target
    to which a buffer object is bound return state from the bound object.

    In the initial state the GL-reserved name zero is bound to
    ARRAY_BUFFER_ARB.  There is no buffer object corresponding to the
    name zero, so client attempts to modify or query buffer object state
    for the target ARRAY_BUFFER_ARB while zero is bound will generate
    GL errors.

    Buffer objects are deleted by calling

        void DeleteBuffersARB(sizei n, const uint *buffers);

    <buffers> contains <n> names of buffer objects to be deleted.  After
    a buffer object is deleted it has no contents, and its name is again
    unused.  Unused names in <buffers> are silently ignored, as is the
    value zero.

    The command

        void GenBuffersARB(sizei n, uint *buffers);

    returns <n> previously unused buffer object names in <buffers>.
    These names are marked as used, for the purposes of GenBuffersARB
    only, but they acquire buffer state only when they are first bound,
    just as if they were unused.

    While a buffer object is bound, any GL operations on that object
    affect any other bindings of that object.  If a buffer object is
    deleted while it is bound, all bindings to that object in the current
    context (i.e. in the thread that called DeleteBuffers) are reset to
    bindings to buffer zero.  Bindings to that buffer in other contexts
    and other threads are not affected, but attempting to use a deleted
    buffer in another thread produces undefined results, including but
    not limited to possible GL errors and rendering corruption.  Using a
    deleted buffer in another context or thread may not, however, result
    in program termination.

    The data store of a buffer object is created and initialized by
    calling

        void BufferDataARB(enum target, sizeiptrARB size,
                           const void *data, enum usage);

    with <target> set to ARRAY_BUFFER_ARB, <size> set to the size of the
    data store in basic machine units, and <data> pointing to the
    source data in client memory.  If <data> is non-null, then the source
    data is copied to the buffer object's data store.  If <data> is null,
    then the contents of the buffer object's data store are undefined.

    <usage> is specified as one of nine enumerated values, indicating
    the expected application usage pattern of the data store.  The
    values are:

        STREAM_DRAW_ARB    The data store contents will be specified once
                           by the application, and used at most a few
                           times as the source of a GL (drawing) command.
        STREAM_READ_ARB    The data store contents will be specified once
                           by reading data from the GL, and queried at
                           most a few times by the application.
        STREAM_COPY_ARB    The data store contents will be specified once
                           by reading data from the GL, and used at most
                           a few times as the source of a GL (drawing)
                           command.
        STATIC_DRAW_ARB    The data store contents will be specified once
                           by the application, and used many times as the
                           source for GL (drawing) commands.
        STATIC_READ_ARB    The data store contents will be specified once
                           by reading data from the GL, and queried many
                           times by the application. 
        STATIC_COPY_ARB    The data store contents will be specified once
                           by reading data from the GL, and used many
                           times as the source for GL (drawing) commands.
        DYNAMIC_DRAW_ARB   The data store contents will be respecified
                           repeatedly by the application, and used many
                           times as the source for GL (drawing) commands.
        DYNAMIC_READ_ARB   The data store contents will be respecified
                           repeatedly by reading data from the GL, and
                           queried many times by the application.
        DYNAMIC_COPY_ARB   The data store contents will be respecified
                           repeatedly by reading data from the GL, and
                           used many times as the source for GL (drawing)
                           commands.

    <usage> is provided as a performance hint only.  The specified usage
    value does not constrain the actual usage pattern of the data store.

    BufferDataARB deletes any existing data store, and sets the values of
    the buffer object's state variables to:

        Name                   Value
        ----                   -----
        BUFFER_SIZE_ARB        <size>
        BUFFER_USAGE_ARB       <usage>
        BUFFER_ACCESS_ARB      READ_WRITE_ARB
        BUFFER_MAPPED_ARB      FALSE
        BUFFER_MAP_POINTER_ARB NULL

    Clients must align data elements consistent with the requirements
    of the client platform, with an additional base-level requirement
    that an offset within a buffer to a datum comprising N basic machine
    units be a multiple of N.

    If the GL is unable to create a data store of the requested size,
    the error OUT_OF_MEMORY is generated.

    To modify some or all of the data contained in a buffer object's data
    store, the client may use the command

        void BufferSubDataARB(enum target, intptrARB offset,
                              sizeiptrARB size, const void *data);

    with <target> set to ARRAY_BUFFER_ARB.  <offset> and <size> indicate
    the range of data in the buffer object that is to be replaced, in
    terms of basic machine units.  <data> specifies a region of client
    memory <size> basic machine units in length, containing the data that
    replace the specified buffer range.  An error is generated if
    <offset> or <size> is less than zero, or if <offset> + <size> is
    greater than the value of BUFFER_SIZE_ARB.

    The entire data store of a buffer object can be mapped into the
    client's address space by calling

        void *MapBufferARB(enum target, enum access);

    with <target> set to ARRAY_BUFFER_ARB.  If the GL is able to map the
    buffer object's data store into the client's address space,
    MapBufferARB returns the pointer value to the data store.  Otherwise
    MapBufferARB returns NULL, and the error OUT_OF_MEMORY is generated.
    <access> is specified as one of READ_ONLY_ARB, WRITE_ONLY_ARB, or
    READ_WRITE_ARB, indicating the operations that the client may perform
    on the data store through the pointer while the data store is mapped.

    MapBufferARB sets the following buffer object state values:

        Name                   Value
        ----                   -----
        BUFFER_ACCESS_ARB      <access>
        BUFFER_MAPPED_ARB      TRUE
        BUFFER_MAP_POINTER_ARB pointer to the data store

    It is an INVALID_OPERATION error to map a buffer data store that is
    in the mapped state.

    Non-null pointers returned by MapBufferARB may be used by the client
    to modify and query buffer object data, consistent with the access
    rules of the mapping, while the mapping remains valid.  No GL error
    is generated if the pointer is used to attempt to modify a
    READ_ONLY_ARB data store, or to attempt to read from a WRITE_ONLY_ARB
    data store, but operation may be slow and system errors (possibly
    including program termination) may result.  Pointer values returned
    by MapBufferARB may not be passed as parameter values to GL commands.
    For example, they may not be used to specify array pointers, or to
    specify or query pixel or texture image data; such actions produce
    undefined results, although implementations may not check for such
    behavior for performance reasons.

    It is an INVALID_OPERATION error to call BufferSubDataARB to modify
    the data store of a mapped buffer.

    Mappings to the data stores of buffer objects may have nonstandard
    performance characteristics.  For example, such mappings may be
    marked as uncacheable regions of memory, and in such cases reading
    from them may be very slow.  To ensure optimal performance, the
    client should use the mapping in a fashion consistent with the values
    of BUFFER_USAGE_ARB and BUFFER_ACCESS_ARB.  Using a mapping in a
    fashion inconsistent with these values is liable to be multiple
    orders of magnitude slower than using normal memory.

    After the client has specified the contents of a mapped data store,
    and before the data in that store are dereferenced by any GL commands,
    the mapping must be relinquished by calling

        boolean UnmapBufferARB(enum target);

    with <target> set to ARRAY_BUFFER_ARB.  Unmapping a mapped buffer
    object invalidates the pointers to its data store and sets the
    object's BUFFER_MAPPED_ARB state to FALSE and its
    BUFFER_MAP_POINTER_ARB state to NULL.

    UnmapBufferARB returns TRUE unless data values in the buffer's data
    store have become corrupted during the period that the buffer was
    mapped.  Such corruption can be the result of a screen resolution
    change or other window-system-dependent event that causes system
    heaps such as those for high-performance graphics memory to be
    discarded.  GL implementations must guarantee that such corruption
    can occur only during the periods that a buffer's data store is
    mapped.  If such corruption has occurred, UnmapBufferARB returns
    FALSE, and the contents of the buffer's data store become undefined.

    It is an INVALID_OPERATION error to explicitly unmap a buffer data
    store that is in the unmapped state.  Unmapping that occurs as a side
    effect of buffer deletion or reinitialization is not an error,
    however."


    2.8A.1 Vertex Arrays in Buffer Objects
    --------------------------------------

    Blocks of vertex array data may be stored in buffer objects with the
    same format and layout options supported for client-side vertex
    arrays.  However, it is expected that GL implementations will (at
    minimum) be optimized for data with all components represented as
    floats, as well as for color data with components represented as
    either floats or unsigned bytes.

    A buffer object binding point is added to the client state associated
    with each vertex array type.  The client does not directly specify
    the bindings to with these new binding points.  Instead, the commands
    that specify the locations and organizations of vertex arrays
    copy the buffer object name that is bound to ARRAY_BUFFER_ARB to the
    binding point corresponding to the vertex array of the type being
    specified.  For example, the NormalPointer command copies the value
    of ARRAY_BUFFER_BINDING_ARB (the queriable name of the buffer binding
    corresponding to the target ARRAY_BUFFER_ARB) to the client state
    variable NORMAL_ARRAY_BUFFER_BINDING_ARB.

    If EXT_vertex_shader is defined, then the command
    VariantArrayEXT(uint id, ...) copies the value of
    ARRAY_BUFFER_BINDING_ARB to the buffer object binding point
    corresponding to variant array <id>.

    If ARB_vertex_program is defined, then the command
    VertexAttribPointerARB(int attrib, ...) copies the value of
    ARRAY_BUFFER_BINDING_ARB to the buffer object binding point
    corresponding to vertex attrib array <attrib>.

    If ARB_vertex_blend is defined, then the command WeightPointerARB
    copies the value of ARRAY_BUFFER_BINDING_ARB to
    WEIGHT_ARRAY_BUFFER_BINDING_ARB.

    Rendering commands ArrayElement, DrawArrays, DrawElements,
    DrawRangeElements, MultiDrawArrays, and MultiDrawElements operate as
    previously defined, except that data for enabled vertex, variant, and
    attrib arrays are sourced from buffers if the array's buffer binding
    is non-zero.  When an array is sourced from a buffer object, the
    pointer value of that array is used to compute an offset, in basic
    machine units, into the data store of the buffer object.  This offset
    is computed by subtracting a null pointer from the pointer value,
    where both pointers are treated as pointers to basic machine units.

    It is acceptable for vertex, variant, or attrib arrays to be sourced
    from any combination of client memory and various buffer objects
    during a single rendering operation.

    It is an INVALID_OPERATION error to source data from a buffer object
    that is currently mapped.


    2.8B.1 Array Indices in Buffer Objects
    ----------------------------------------------

    Blocks of array indices may be stored in buffer objects with the
    same format options that are supported for client-side index arrays.
    Initially zero is bound to ELEMENT_ARRAY_BUFFER_ARB, indicating that
    DrawElements and DrawRangeElements are to source their indices from
    arrays passed as their <indices> parameters, and that
    MultiDrawElements is to source its indices from the array of pointers
    to arrays passed in as its <indices> parameter.

    A buffer object is bound to ELEMENT_ARRAY_BUFFER_ARB by calling

        void BindBufferARB(enum target, uint buffer);

    with <target> set to ELEMENT_ARRAY_BUFFER_ARB, and <buffer> set to
    the name of the buffer object.  If no corresponding buffer object
    exists, one is initialized as defined in Section 2.8A.

    The commands BufferDataARB, BufferSubDataARB, MapBufferARB, and
    UnmapBufferARB may all be used with <target> set to
    ELEMENT_ARRAY_BUFFER_ARB.  In such event, these commands operate in
    the same fashion as described in section 2.8A, but on the buffer
    currently bound to the ELEMENT_ARRAY_BUFFER_ARB target.

    While a non-zero buffer object name is bound to
    ELEMENT_ARRAY_BUFFER_ARB, DrawElements and DrawRangeElements source
    their indices from that buffer object, using their <indices>
    parameters as offsets into the buffer object in the same fashion as
    described in section 2.8A1.  MultiDrawElements also sources its
    indices from that buffer object, using its <indices> parameter as a
    pointer to an array of pointers that represent offsets into the
    buffer object.

    Buffer objects created by binding an unused name to ARRAY_BUFFER_ARB
    and to ELEMENT_ARRAY_BUFFER_ARB are formally equivalent, but the GL
    may make different choices about storage implementation based on
    the initial binding.  In some cases performance will be optimized
    by storing indices and array data in separate buffer objects, and by
    creating those buffer objects with the corresponding binding points."


Additions to Chapter 3 of the 1.4 Specification (Rasterization)

    None


Additions to Chapter 4 of the 1.4 Specification (Per-Fragment
Operations and the Frame Buffer)

    None


Additions to Chapter 5 of the 1.4 Specification (Special Functions)

    Added to section 5.4, as part of the discussion of what commands
    are compiled into display lists:

    "Commands that are used to create, manage, and query buffer objects
    are not included in display lists, but are executed immediately.
    These commands are BindBufferARB, DeleteBuffersARB, GenBuffersARB,
    IsBufferARB, BufferDataARB, BufferSubDataARB, MapBufferARB,
    UnmapBufferARB, GetBufferParameterivARB, GetBufferSubDataARB,
    and GetBufferPointervARB.

    GL commands that source data from buffer objects dereference the
    buffer object data in question at display list compile time, rather
    than encoding the buffer ID and buffer offset into the display list.
    Only GL commands that are executed immediately, rather than being
    compiled into a display list, are permitted to use a buffer object as
    a data sink."


Additions to Chapter 6 of the 1.4 Specification (State and State
Requests)

    Added to section 6.1 in a subsection titled Buffer Object Queries:

    "The command

        boolean IsBufferARB(uint buffer);

    returns TRUE if <buffer> is the name of an buffer object. If
    <buffer> is zero, or if <buffer> is a non-zero value that is not
    the name of an buffer object, IsBufferARB return FALSE.

    The command

        void GetBufferSubDataARB(enum target, intptrARB offset,
                                 sizeiptrARB size, void *data);

    queries the data contents of a buffer object.  <target> is
    ARRAY_BUFFER_ARB.  <offset> and <size> indicate the range of data
    in the buffer object that is to be queried, in terms of basic machine
    units.  <data> specifies a region of client memory, <size> basic
    machine units in length, into which the data is to be retrieved.

    An error is generated if GetBufferSubDataARB is executed for a buffer
    object that is currently mapped.

    While the data store of a buffer object is mapped, the pointer to
    the data store can be queried by calling

        void GetBufferPointervARB(enum target, enum pname, void **params);

    with <target> set to ARRAY_BUFFER_ARB and <pname> set to
    BUFFER_MAP_POINTER_ARB.  The single buffer map pointer is returned
    in <params>.  GetBufferPointervARB returns the NULL pointer value if
    the buffer's data store is not currently mapped, or if the requesting
    client did not map the buffer object's data store, and the
    implementation is unable to support mappings on multiple clients."

    Added to the list of queries in section 6.1.3, Enumerated Queries:

        "void GetBufferParameterivARB(enum target, enum pname, int *params);"


Errors

    INVALID_ENUM is generated if the <target> parameter of BindBufferARB,
    BufferDataARB, BufferSubDataARB, MapBufferARB, UnmapBufferARB,
    GetBufferSubDataARB, GetBufferParameterivARB, or GetBufferPointervARB
    is not ARRAY_BUFFER_ARB or ELEMENT_ARRAY_BUFFER_ARB.

    INVALID_VALUE is generated if the <n> parameter of DeleteBuffersARB or
    GenBuffersARB is negative.

    INVALID_VALUE is generated if the <size> parameter of BufferDataARB,
    BufferSubDataARB, or GetBufferSubDataARB is negative.

    INVALID_OPERATION is generated if BufferDataARB, BufferSubDataARB,
    MapBufferARB, UnmapBufferARB, GetBufferSubDataARB,
    GetBufferParameterivARB, or GetBufferPointervARB is executed while
    zero is bound to the <target> parameter.

    OUT_OF_MEMORY may be generated if the data store of a buffer object
    cannot be allocated because the <size> argument of BufferDataARB is
    too large.

    OUT_OF_MEMORY may be generated when MapBufferARB is called if the
    data store of the buffer object in question cannot be mapped.  This
    may occur for a variety of system-specific reasons, such as the
    absence of sufficient remaining virtual memory.

    INVALID_ENUM is generated if the <usage> parameter of BufferDataARB is
    not STREAM_DRAW_ARB, STREAM_READ_ARB, STREAM_COPY_ARB, STATIC_DRAW_ARB,
    STATIC_READ_ARB, STATIC_COPY_ARB, DYNAMIC_DRAW_ARB, DYNAMIC_READ_ARB,
    or DYNAMIC_COPY_ARB.

    INVALID_VALUE is generated if the <offset> parameter to BufferSubDataARB
    or GetBufferSubDataARB is negative.

    INVALID_VALUE is generated if the <offset> and <size> parameters of
    BufferSubDataARB or GetBufferSubDataARB define a region of memory that
    extends beyond that allocated by BufferDataARB.

    INVALID_OPERATION is generated if MapBufferARB is executed for a
    buffer that is already mapped.

    INVALID_OPERATION is generated if UnmapBufferARB is executed for a
    buffer that is not currently mapped.

    INVALID_ENUM is generated if the <access> parameter of MapBufferARB
    is not READ_ONLY_ARB, WRITE_ONLY_ARB, or READ_WRITE_ARB.

    INVALID_ENUM is generated if the <pname> parameter of
    GetBufferParameterivARB is not BUFFER_SIZE_ARB, BUFFER_USAGE_ARB,
    BUFFER_ACCESS_ARB, or BUFFER_MAPPED_ARB.

    INVALID_ENUM is generated if the <pname> parameter of
    GetBufferPointervARB is not BUFFER_MAP_POINTER_ARB.

    INVALID_OPERATION may be generated if any of the commands
    defined in this extension is executed between the execution of Begin
    and the corresponding execution of End.

    INVALID_OPERATION is generated if a buffer object that is currently
    mapped is used as a source of GL render data, or as a destination of
    GL query data.

    INVALID_OPERATION is generated if BufferSubDataARB is used to modify
    the data store contents of a mapped buffer, or if GetBufferSubDataARB
    is used to query to data store contents of a mapped buffer.


New State

(table 6.7, Vertex Array Data, p. 222)

    Get Value                                 Type      Get Command              Initial Value   Sec     Attribute
    ---------                                 ----      -----------              -------------   ---     ---------
    ARRAY_BUFFER_BINDING_ARB                  Z+        GetIntegerv              0               2.8A    vertex-array
    VERTEX_ARRAY_BUFFER_BINDING_ARB           Z+        GetIntegerv              0               2.8A    vertex-array
    NORMAL_ARRAY_BUFFER_BINDING_ARB           Z+        GetIntegerv              0               2.8A    vertex-array
    COLOR_ARRAY_BUFFER_BINDING_ARB            Z+        GetIntegerv              0               2.8A    vertex-array
    INDEX_ARRAY_BUFFER_BINDING_ARB            Z+        GetIntegerv              0               2.8A    vertex-array
    TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB    Z+        GetIntegerv              0               2.8A    vertex-array
    EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB        Z+        GetIntegerv              0               2.8A    vertex-array
    SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB  Z+        GetIntegerv              0               2.8A    vertex-array
    FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB   Z+        GetIntegerv              0               2.8A    vertex-array
    WEIGHT_ARRAY_BUFFER_BINDING_ARB           Z+        GetIntegerv              0               2.8A    vertex-array
    ELEMENT_ARRAY_BUFFER_BINDING_ARB          Z+        GetIntegerv              0               2.8A.2  vertex-array

    VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB    16+ x Z+  GetVertexAttribivARB     0               2.8A    vertex-array

    XXX need to add buffer state for variant arrays

(new table for buffer objects)

    Get Value                   Type    Get Command                  Initial Value   Sec     Attribute
    ---------                   ----    -----------                  -------------   ---     ---------
    (buffer data)               BMU     GetBufferSubDataARB                          2.8A    none
    BUFFER_SIZE_ARB             Z+      GetBufferParameterivARB      0               2.8A    none
    BUFFER_USAGE_ARB            Z9      GetBufferParameterivARB      STATIC_DRAW_ARB 2.8A    none
    BUFFER_ACCESS_ARB           Z3      GetBufferParameterivARB      READ_WRITE_ARB  2.8A    none
    BUFFER_MAPPED_ARB           B       GetBufferParameterivARB      FALSE           2.8A    none
    BUFFER_MAP_POINTER_ARB      Y       GetBufferPointervARB         NULL            2.8A    none


New Implementation Dependent State

    (none)

Additions to the GLX Specification

    Add new section "2.X Buffer Objects" between sections "2.5 Texture Objects"
    and "2.6 Aligning Multiple Drawables".

    "Unformatted data may be stored in the OpenGL server using named buffer
    objects.  The storage associated with a buffer object may be used as the
    input or output of various commands by binding the buffer to a target
    associated with the command.  For example, if a buffer object is bound to
    the GL_ARRAY_BUFFER_ARB target before calling glVertexPointer vertex
    data will be sourced from the buffer object's storage.

    "Buffer objects may be shared by rendering contexts, as long as the server
    portion of the contexts share the same address space.  (Like display lists
    and texture objects, buffer objects are part of the server context state.)
    OpenGL makes no attempt to synchronize access to buffer objects.  If a
    buffer object is bound to more than one context, then it is up to the
    programmer to ensure that the contents of the object are not being changed
    via one context while another context is using the buffer object for
    rendering.  The results of changing a buffer object while another context
    is using it are undefined.

    "A buffer object is considered to be bound to a context if it is either
    currently bound to a particular target (e.g., most recently selected for a
    target via glBindBufferARB) or if some portion of the buffer will be
    accessed by a GL operation.  For example, a buffer object is considered
    bound to a context if the most recent call of glVertexPointer was made
    while the buffer object was bound to the GL_ARRAY_BUFFER_ARB target.

    "As a result, any client-state that attaches the contents of a buffer object
    to the GL state must be duplicated on the server.  At a minimum the
    following client-state must be replicated on the server:

        - All vertex array size, type, stride and pointer information.
        - All vertex array enables.

    "All modifications to shared context state as a result of executing
    glBindBufferARB are atomic.  Also, a buffer object will not be deleted
    until it is no longer bound to any rendering context."

    If GLX_ARB_create_context is present, add the following between
    paragraphs 8 and 9 of section 3.3.7 "Rendering Contexts":

    "The attribute name GLX_CONTEXT_ALLOW_BUFFER_BYTE_ORDER_MISMATCH_ARB
    specifies whether the application wishes to use buffer objects even
    if the byte ordering of the client and server do not match.  If this
    attribute is True the client is responsible for byte swapping any data
    it stores in or reads from buffer objects.  If this attribute is False
    and the client and server have different byte orderings, the server
    will not expose any extensions that require buffer object support and
    the maximum values allowed for GLX_CONTEXT_MAJOR_VERSION_ARB and
    GLX_CONTEXT_MINOR_VERSION_ARB are 1 and 4 respectively.  The default
    value for GLX_CONTEXT_ALLOW_BUFFER_BYTE_ORDER_MISMATCH_ARB is False."

    Add to the following paragraph to the end of section 4.3:

    "Because the GL views buffer objects as unformatted data, the above byte
    swapping rules do not apply to them.  Data to be stored in buffer objects
    must be byte swapped by the application to match the server's byte ordering
    before the data is presented to the GL."

GLX Protocol

    The following rendering commands are sent to the server as part of a
    glXRender request:

        BindBufferARB
            2           12              rendering command length
            2           290             rendering command opcode
            4           ENUM            target
            4           CARD32          buffer

        VertexAttribPointer
            2           36              rendering command length
            2           291             rendering command opcode
            8           CARD64          offset
            4           ENUM            array
            4           CARD32          index
            4           ENUM            type
            4           CARD32          size
            4           CARD32          stride
            1           BOOL            is_integer
            1           BOOL            normalized
            2                           unused

        EnableVertexAttribArray
            2           12              rendering command length
            2           292             rendering command opcode
            4           ENUM            array
            4           CARD32          index

        DisableVertexAttribArray
            2           12              rendering command length
            2           293             rendering command opcode
            4           ENUM            array
            4           CARD32          index

        ArrayElement
            2           8               rendering command length
            2           294             rendering command opcode
            4           CARD32          index

        DrawElements
            2           24               rendering command length
            2           295              rendering command opcode
            8           CARD64           indices_offset
            4           ENUM             mode (GL_POINTS, etc.)
            4           CARD32           count
            4           CARD32           type

        PushClientAttrib
            2           8                rendering command length
            2           296              rendering command opcode
            4           CARD32           mask

        PopClientAttrib
            2           4                rendering command length
            2           297              rendering command opcode

    The following rendering commands are sent to the server as part of a
    glXRender request, or as a glXRenderLarge request.

        BufferDataARB
            2           24+n+p          rendering command length
            2           298             rendering command opcode
            8           INT64           size
            4           ENUM            target
            4           ENUM            usage
            1           BOOL            null_data
            3                           unused
            n           LISTofBYTE      data
            p                           unused, p=pad(n)

        If the command is encoded in a glXRenderLarge request, the command
        opcode and command length fields are expanded to 4 bytes each.

            4           28+n+p          rendering command length
            4           298             rendering command opcode

        BufferSubDataARB
            2           24+n+p          rendering command length
            2           299             rendering command opcode
            8           CARD64          offset
            8           CARD64          size
            4           ENUM            target
            n           LISTofBYTE      data, where n = size
            p                           unused, p=pad(n)

        If the command is encoded in a glXRenderLarge request, the command
        opcode and command length fields are expanded to 4 bytes each.

            4           28+n+p          rendering command length
            4           299             rendering command opcode

        DrawArraysNew
            2           20+(20*m)+n+p    rendering command length
            2           300              rendering command opcode
            4           ENUM             mode (GL_POINTS, etc.)
            4           CARD32           first
            4           CARD32           count
            4           CARD32           m
            20*m        LISTofARRAY_INFO client_array_info
            n           LISTofBYTE       client_arrays
            p                            unused, p=pad(n)

        If the command is encoded in a glXRenderLarge request, the command
        opcode and command length fields are expanded to 4 bytes each.

            4           24+(20*m)+n+p   rendering command length
            4           300             rendering command opcode

        Where <m> is the number of enabled vertex arrays that do not have
        buffer objects bound to them, <n> is <count> * <s>, and <s> is the
        sum of all client array element sizes, as defined below.

        ARRAY_INFO
            4           ENUM             data type
                        0x1400 i=1       GL_BYTE
                        0x1401 i=1       GL_UNSIGNED_BYTE
                        0x1402 i=2       GL_SHORT
                        0x1403 i=2       GL_UNSIGNED_SHORT
                        0x1404 i=4       GL_INT
                        0x1405 i=4       GL_UNSIGNED_INT
                        0x1406 i=4       GL_FLOAT
                        0x140A i=8       GL_DOUBLE
                        0x140B i=2       GL_HALF_FLOAT
            4           CARD32           j (number of values in array element)
            4           ENUM             array type
                        0x8074 j=2/3/4   VERTEX_ARRAY
                        0x8075 j=3       NORMAL_ARRAY
                        0x8076 j=3/4     COLOR_ARRAY
                        0x8077 j=1       INDEX_ARRAY
                        0x8078 j=1/2/3/4 TEXTURE_COORD_ARRAY
                        0x8079 j=1       EDGE_FLAG_ARRAY
                        0x8457 j=1       FOG_COORD_ARRAY
                        0x845E j=3       SECONDARY_COLOR_ARRAY
                        0x0000 j=1/2/3/4 VERTEX_ATTRIB_ARRAY
                        0x86AD j>=1      WEIGHT_ARRAY_ARB
                        0x8844 j>=1      MATRIX_INDEX_ARRAY_ARB
                        0x850C j=1       VERTEX_WEIGHT_ARRAY_EXT
                        0x8768 j=1       ELEMENT_ARRAY_ATI
            4           CARD32           index
            1           BOOL             normalized
            1           BOOL             is_integer
            2                            unused

        For each client array, the client array element size is <i>*<j>.
        The <index> field is the generic attribute array index when
        <array type> is VERTEX_ATTRIB_ARRAY and the client active texture
        unit's offset from GL_TEXTURE0 when <array_type> is
        <TEXTURE_COORD_ARRAY>.  For all other values of <array type>,
        <index> must be 0.

        The DrawArraysNew protocol differs from the DrawArrays protocol
        defined in EXT_vertex_array in the following ways:

          1) The ARRAY_INFO structure has been expanded to include
             <index>, <normalized>, and <is_integer>.

          2) ARRAY_INFO and associated array data are only sent for arrays
             that do not have buffer objects bound to them.

          3) The data for each array is sent contiguously rather than
             interleaved with the other arrays.

          4) The array data is tightly packed.  Rather than containing
             padding after each array, a single pad field is added on the
             end.

        DrawRangeElements
            2           36+(20*m)+n+p    rendering command length
            2           301              rendering command opcode
            8           CARD64           indices_offset
            4           ENUM             mode (GL_POINTS, etc.)
            4           CARD32           start
            4           CARD32           end
            4           CARD32           count
            4           CARD32           type
            4           CARD32           m
            20*m        LISTofARRAY_INFO client_array_info
            n           LISTofBYTE       client_arrays
            p                            unused, p=pad(n)

        If the command is encoded in a glXRenderLarge request, the command
        opcode and command length fields are expanded to 4 bytes each.

            4           40+(20*m)+n+p    rendering command length
            4           301              rendering command opcode

        Where <n> is defined as it is for DrawArraysNew.

    The remaining commands are non-rendering commands.  These commands are
    sent separately (i.e., not as part of a glXRender or glXRenderLarge
    request), using glx single requests:

        DeleteBuffersARB
            1           CARD8           opcode (X assigned)
            1           186             GLX opcode
            2           3+n             request length
            4           GLX_CONTEXT_TAG context tag
            4           CARD32          n
            n*4         LISTofCARD32    ids

        GenBuffersARB
            1           CARD8           opcode (X assigned)
            1           187             GLX opcode
            2           3               request length
            4           GLX_CONTEXT_TAG context tag
            4           CARD32          n
          =>
            1           1               reply
            1                           unused
            2           CARD16          sequence number
            4           n               reply length
            24                          unused
            n*4         LISTofCARD32    buffers

        IsBufferARB
            1           CARD8           opcode (X assigned)
            1           188             GLX opcode
            2           3               request length
            4           GLX_CONTEXT_TAG context tag
            4           CARD32          id
          =>
            1           1               reply
            1                           unused
            2           CARD16          sequence number
            4           0               reply length
            4           BOOL32          return value
            20                          unused

        GetBufferSubDataARB
            1           CARD8           opcode (X assigned)
            1           189             GLX opcode
            2           7               request length
            4           GLX_CONTEXT_TAG context tag
            8           CARD64          offset
            8           CARD64          size
            4           ENUM            target
          =>
            1           1               reply
            1           1               unused
            2           CARD16          sequence number
            4           m               reply length, m = (n + p) / 4
            4                           unused
            4           CARD32          n
            16                          unused
            n           LISTofBYTE      buffer subdata
            p                           unused, p=pad(n)

        GetBufferParameterivARB
            1           CARD8           opcode (X assigned)
            1           190             GLX opcode
            2           4               request length
            4           GLX_CONTEXT_TAG context tag
            4           ENUM            target
            4           ENUM            pname
          =>
            1           1               reply
            1           1               unused
            2           CARD16          sequence number
            4           m               reply length, m = (n == 1 ? 0 : n)
            4                           unused
            4           CARD32          n (number of parameter components)

            if (n == 1) this follows:

            4           CARD32          params
            12                          unused

            otherwise this follows:

            16                          unused
            4*n         LISTofCARD32    params

            Note that n may be 0, indicating that a GL error occurred.

        GetElementRange
            1           CARD8           opcode (X assigned)
            1           191             GLX opcode
            2           6               request length
            4           GLX_CONTEXT_TAG context tag
            8           CARD64          offset
            4           ENUM            type
            4           INT32           count
          =>
            1           1               reply
            1                           unused
            2           CARD16          sequence number
            4           0               reply length
            8                           unused
            4           CARD32          lowest element
            4           CARD32          highest element
            8                           unused

         GetBufferPointerv
            1           CARD8           opcode (X assigned)
            1           192             GLX opcode
            2           4               request length
            4           GLX_CONTEXT_TAG context tag
            4           ENUM            target
            4           ENUM            pname
          =>
            1           1               reply
            1                           unused
            2           CARD16          sequence number
            4           m               reply length, m = (n==1 ? 0 : n*2)
            4                           unused
            4           CARD32          n

            if (n=1) this follows:

            8           CARD64          params
            8                           unused

            otherwise this follows:

            16                          unused
            n*8         LISTofCARD64    params

            Note that n may be 0, indicating that a GL error occurred.

         MapBuffer
            1           CARD8           opcode (X assigned)
            1           193             GLX opcode
            2           4               request length
            4           GLX_CONTEXT_TAG context tag
            4           ENUM            target
            4           ENUM            access
          =>
            1           1               reply
            1                           unused
            2           CARD16          sequence number
            4           0               reply length
            4                           unused
            4           CARD32          0 on error, otherwise 1.
            8           CARD64          mapping address
            8                           unused

         UnmapBuffer
            1           CARD8           opcode (X assigned)
            1           194             GLX opcode
            2           3               request length
            4           GLX_CONTEXT_TAG context tag
            4           ENUM            target
          =>
            1           1               reply
            1                           unused
            2           CARD16          sequence number
            4           0               reply length
            4           CARD32          return value
           20                           unused

Usage Examples

    These examples illustrate various usages.  In all cases a rendering
    loop is included, and array parameters are initialized inside the
    loop as would be required if multiple array rendering operations
    were performed in the loops.  (Though only one operation is shown.)

    Convenient macro definition for specifying buffer offsets:

        #define BUFFER_OFFSET(i) ((char *)NULL + (i))

    Traditional vertex arrays:

        // Create system memory buffer
        data = malloc(320);

        // Fill system memory buffer
        ...

        // Frame rendering loop
        while (...) {

            // Define arrays
            VertexPointer(4, FLOAT, 0, data);
            ColorPointer(4, UNSIGNED_BYTE, 0, data+256);

            // Enable arrays
            EnableClientState(VERTEX_ARRAY);
            EnableClientState(COLOR_ARRAY);

            // Draw arrays
            DrawArrays(TRIANGLE_STRIP, 0, 16);

            // Disable arrays
            DisableClientState(VERTEX_ARRAY);
            DisableClientState(COLOR_ARRAY);

            // Other rendering commands
            ...

        }

        // Free system memory buffer
        free(data);


    Vertex arrays using a buffer object:

        // Create system memory buffer
        data = malloc(320);

        // Fill system memory buffer
        ...

        // Create buffer object
        BindBufferARB(ARRAY_BUFFER_ARB, 1);

        // Initialize data store of buffer object
        BufferDataARB(ARRAY_BUFFER_ARB, 320, data, STATIC_DRAW_ARB);

        // Free system memory buffer
        free(data);

        // Frame rendering loop
        while (...) {

            // Define arrays
            BindBufferARB(ARRAY_BUFFER_ARB, 1);
            VertexPointer(4, FLOAT, 0, BUFFER_OFFSET(0));
            ColorPointer(4, UNSIGNED_BYTE, 0, BUFFER_OFFSET(256));

            // Enable arrays
            EnableClientState(VERTEX_ARRAY);
            EnableClientState(COLOR_ARRAY);

            // Draw arrays
            DrawArrays(TRIANGLE_STRIP, 0, 16);

            // Disable arrays
            DisableClientState(VERTEX_ARRAY);
            DisableClientState(COLOR_ARRAY);

            // Other rendering commands
            ...

        }

        // Delete buffer object
        int buffer[1] = {1};
        DeleteBuffersARB(1, buffer);


    Code that works with and without buffer objects:

        // Create system memory buffer
        data = malloc(320);

        // Fill system memory buffer
        ...

        // Initialize buffer object, and null the data pointer
#ifdef USE_BUFFER_OBJECTS
        BindBufferARB(ARRAY_BUFFER_ARB, 1);
        BufferDataARB(ARRAY_BUFFER_ARB, 320, data, STATIC_DRAW_ARB);
        free(data);
        data = NULL;
#endif

        // Frame rendering loop
        while (...) {

            // Define arrays
#ifdef USE_BUFFER_OBJECTS
            BindBufferARB(ARRAY_BUFFER_ARB, 1);
#endif
            VertexPointer(4, FLOAT, 0, data);
            ColorPointer(4, UNSIGNED_BYTE, 0, data+256);

            // Enable arrays
            EnableClientState(VERTEX_ARRAY);
            EnableClientState(COLOR_ARRAY);

            // Draw arrays
            DrawArrays(TRIANGLE_STRIP, 0, 16);

            // Disable arrays
            DisableClientState(VERTEX_ARRAY);
            DisableClientState(COLOR_ARRAY);

            // Other rendering commands
            ...

        }

        // Delete buffer object
#ifdef USE_BUFFER_OBJECTS
        int buffer[1] = {1};
        DeleteBuffersARB(1, buffer);
#else
        // Free system memory buffer
        free(data);
#endif


    Vertex arrays using a mapped buffer object:

        // Frame rendering loop
        while (...) {

            // Define arrays (and create buffer object in first pass)
            BindBufferARB(ARRAY_BUFFER_ARB, 1);
            VertexPointer(4, FLOAT, 0, BUFFER_OFFSET(0));
            ColorPointer(4, UNSIGNED_BYTE, 0, BUFFER_OFFSET(256));

            // Enable arrays
            EnableClientState(VERTEX_ARRAY);
            EnableClientState(COLOR_ARRAY);

            // Initialize data store of buffer object
            BufferDataARB(ARRAY_BUFFER_ARB, 320, NULL, STREAM_DRAW_ARB);

            // Map the buffer object
            float *p = MapBufferARB(ARRAY_BUFFER_ARB, WRITE_ONLY);

            // Compute and store data in mapped buffer object
            ...

            // Unmap buffer object and draw arrays
            if (UnmapBufferARB(ARRAY_BUFFER_ARB)) {
                DrawArrays(TRIANGLE_STRIP, 0, 16);
            }

            // Disable arrays
            DisableClientState(VERTEX_ARRAY);
            DisableClientState(COLOR_ARRAY);

            // Other rendering commands
            ...

        }

        // Delete buffer object
        int buffer[1] = {1};
        DeleteBuffersARB(1, buffer);


    Vertex arrays using a mapped buffer object for array data and an
    unmapped buffer object for indices:

        // Create system memory buffer for indices
        indexdata = malloc(400);

        // Fill system memory buffer with 100 indices
        ...

        // Create index buffer object
        BindBufferARB(ELEMENT_ARRAY_BUFFER_ARB, 2);
        BufferDataARB(ELEMENT_ARRAY_BUFFER_ARB, 400, indexdata,
                STATIC_DRAW_ARB);

        // Free system memory buffer
        free(indexdata);

        // Frame rendering loop
        while (...) {

            // Define arrays (and create buffer object in first pass)
            BindBufferARB(ARRAY_BUFFER_ARB, 1);
            VertexPointer(4, FLOAT, 0, BUFFER_OFFSET(0));
            ColorPointer(4, UNSIGNED_BYTE, 0, BUFFER_OFFSET(256));
            BindBufferARB(ELEMENT_ARRAY_BUFFER_ARB, 2);

            // Enable arrays
            EnableClientState(VERTEX_ARRAY);
            EnableClientState(COLOR_ARRAY);

            // Initialize data store of buffer object
            BufferDataARB(ARRAY_BUFFER_ARB, 320, NULL, STREAM_DRAW_ARB);

            // Map the buffer object
            float *p = MapBufferARB(ARRAY_BUFFER_ARB, WRITE_ONLY);

            // Compute and store data in mapped buffer object
            ...

            // Unmap buffer object and draw arrays
            if (UnmapBufferARB(ARRAY_BUFFER_ARB)) {
                DrawElements(TRIANGLE_STRIP, 100, UNSIGNED_INT,
                             BUFFER_OFFSET(0));
            }

            // Disable arrays
            DisableClientState(VERTEX_ARRAY);
            DisableClientState(COLOR_ARRAY);

            // Other rendering commands
            ...

        }

        // Delete buffer objects
        int buffers[2] = {1, 2};
        DeleteBuffersARB(1, buffers);


    Mapping multiple buffers simultaneously:

        // Map buffers
        BindBuffer(ARRAY_BUFFER_ARB, 1);
        float *a = MapBuffer(ARRAY_BUFFER_ARB, WRITE_ONLY);
        BindBuffer(ARRAY_BUFFER_ARB, 2);
        float *b = MapBuffer(ARRAY_BUFFER_ARB, WRITE_ONLY);

        // Fill buffers
        ...

        // Unmap buffers
        BindBuffer(ARRAY_BUFFER_ARB, 1);
        if (!UnmapBufferARB(ARRAY_BUFFER_ARB)) {
            // Handle error case
        }
        BindBuffer(ARRAY_BUFFER_ARB, 2);
        if (!UnmapBufferARB(ARRAY_BUFFER_ARB)) {
            // Handle error case
        }

    Revision  Date         Author  Changes
    --------  -----------  ------  ---------------------------------------
    0.99.7    18-Jan-2012  mgodse  Fixed typos.

    0.99.6    25-Oct-2010  jrj     Fixed 'context tag' location in
                                   GetBufferSubDataARB GLX protocol.

    0.99.5    14-Apr-2010  Jon Leech Added ARB suffix to GLX token.

    0.99.4    07-Apr-2010  jrj     Added the GLX_ARB_vertex_buffer_object
                                   string to identify GLX implementations
                                   that support the new context attribute.

    0.99.3    10-Feb-2010  jrj     Fixed GetBufferSubData reply layout and
                                   cleaned up the field descriptions.
                                   Added GetBufferPointerv protocol.
                                   Added an issue describing why the
                                   MapBuffer and UnmapBuffer protocol do
                                   not transmit buffer data.

    0.99.2    02-Feb-2010  jrj     Removed <n> field from DrawArraysNew
                                   and DrawRangeElements.  Its value can
                                   be computed from <m> and the data in
                                   <client_array_info>.
                                   Added more language describing
                                   DrawArraysNew fields and differences
                                   from the existing DrawArrays protocol.

    0.99.1    15-Jan-2010  jrj     Added more issues.
                                   Use 64 bits for offsets and sizes where
                                   appropriate.
                                   Added is_integer to ARRAY_INFO and
                                   VertexAttribPointer
                                   Added PushClientAttrib and
                                   PopClientAttrib protocol.
                                   Added MapBuffer/UnmapBuffer protocol.
                                   Defined VERTEX_ATTRIB_ARRAY = GL_NONE =
                                   0.
                                   Added padding to DrawArraysNew and
                                   DrawRangeElements.
                                   Changed resolution to the byte ordering
                                   issue.

    0.99      16-May-2008  idr     Added "Additions to the GLX Specification"
                                   Minor updates to protocol encoding
    0.98      01-Sep-2006  idr     Resolved the byte-ordering issue.
    0.97      16-Mar-2005  idr     Added 'null_data' field to BufferData.
                                   This works like the 'null_image' in
                                   TexImage3D.
                                   Removed the 'type' field from
                                   DrawRangeElements and DrawElements.
                                   Added the 'count' field to GetElementRange.
    0.96      09-Mar-2005  idr     Modified the EnableBufferObject and
                                   DisableBufferObject commands.
                                   Changed the parameter ordering and the
                                   client-side data specification for
                                   DrawArraysNew.
                                   Replaced the existing DrawElements-type
                                   commands with DrawRangeElements and
                                   DrawElements.
                                   Added the GetElementRange query.
                                   Added a proposed resolution for the
                                   EnableClientState issue.
    0.95      04-Mar-2005  idr     Fixed the size of BindBufferToArray.
                                   Added several issues.
    0.94      09-Dec-2004  idr     Typo corrections.
                                   Fixed the sizes of several LISTofBYTE and
                                   BOOL elements.
                                   Removed the 'provoke' field from the
                                   ArrayElement command.
                                   Added commands to support DrawElements.
    0.93      08-Dec-2004  idr     Added several issues.
    0.92      27-Oct-2004  idr     Initial pass at GLX protocol.
