Name

    ARB_direct_state_access

Name Strings

    GL_ARB_direct_state_access

Contact

    Graham Sellers (graham.sellers 'at' amd.com)
    Christophe Riccio (christophe.riccio 'at' unity3d.com)

Contributors

    Graham Sellers, AMD
    Piers Daniell, NVIDIA
    Christophe Riccio, Unity
    Daniel Rákos, AMD
    Daniel Koch, NVIDIA
    Pat Brown, NVIDIA
    Jon Leech
    Members of the OpenGL ARB working group
    Contributors to GL_EXT_direct_state_access

Notice

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

Specification Update Policy

    Khronos-approved extension specifications are updated in response to
    issues and bugs prioritized by the Khronos OpenGL Working Group. For
    extensions which have been promoted to a core Specification, fixes will
    first appear in the latest version of that core Specification, and will
    eventually be backported to the extension document. This policy is
    described in more detail at
        https://www.khronos.org/registry/OpenGL/docs/update_policy.php

Status

    Complete.
    Approved by the ARB on June 26, 2014.
    Ratified by the Khronos Board of Promoters on August 7, 2014.

Version

    Last Modified Date:         June 14, 2018
    Author Revision:            50

Number

    ARB Extension #164

Dependencies

    OpenGL 2.0 is required.

    This extension is written against the OpenGL 4.4 (core) specification.

Overview

    In unextended OpenGL, most mutation of state contained in objects is through
    an indirection known as a binding. Objects are attached to a context (either
    directly or indirectly via a container) and then commands to modify or
    query their state are issued on that context, indirecting through its
    attachments and into the underlying object. This is known as `bind-to-edit'.

    This extension derives from the GL_EXT_direct_state_access extension, which
    added accessors for most state on most objects, allowing it to be queried
    and modified without the object needing to be bound to a context. In cases
    where a single property of an object is to be modified, directly accessing
    its state can be more efficient than binding the object to the context and
    then indirecting through it. Further, directly accessing the state of
    objects through their names rather than by bind-to-edit does not disturb
    the bindings of the current context, which is useful for tools, middleware
    and other applications that are unaware of the outer state but it can also
    avoid cases of redundant state changes.

    There are several subtle differences between this extension and the older
    GL_EXT_direct_state_access extension. First, this extension only expands
    functionality that still exists in core profile OpenGL. Second, any function
    that only partially avoids bind-to-edit (for example, explicitly specifying
    a texture unit, bypassing the active texture selector but still indirecting
    through a texture binding) has been omitted. Finally, the original extension
    effectively allowed any function to create new objects whereas in unextended
    OpenGL, only binding functions created objects (bind-to-create), even if
    their names were obtained through one of the glGen* functions. This
    extension does not allow on-the-spot creation of objects. Rather than rely
    on bind-to-create (which would defeat the purpose of the extension), we add
    glCreate* functions that produce new names that represent state vectors
    initialized to their default values. Due to this last change, several
    functions no longer require their <target> parameters, and so where
    applicable, this parameter is absent from this extension.

New Procedures and Functions

    /* Transform Feedback object functions */

    void CreateTransformFeedbacks(sizei n, uint *ids);

    void TransformFeedbackBufferBase(uint xfb, uint index,
                                     uint buffer);

    void TransformFeedbackBufferRange(uint xfb, uint index,
                                      uint buffer, intptr offset, sizeiptr size);

    void GetTransformFeedbackiv(uint xfb, enum pname, int *param);

    void GetTransformFeedbacki_v(uint xfb, enum pname, uint index,
                                 int *param);

    void GetTransformFeedbacki64_v(uint xfb, enum pname, uint index,
                                   int64 *param);


    /* Buffer object functions */

    void CreateBuffers(sizei n, uint *buffers);

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

    void NamedBufferData(uint buffer,
                         sizeiptr size,
                         const void *data,
                         enum usage);

    void NamedBufferSubData(uint buffer,
                            intptr offset, sizeiptr size,
                            const void *data);

    void CopyNamedBufferSubData(uint readBuffer, uint writeBuffer,
                                intptr readOffset, intptr writeOffset,
                                sizeiptr size);

    void ClearNamedBufferData(uint buffer,
                              enum internalformat,
                              enum format,
                              enum type,
                              const void *data);

    void ClearNamedBufferSubData(uint buffer,
                                 enum internalformat,
                                 intptr offset,
                                 sizeiptr size,
                                 enum format,
                                 enum type,
                                 const void *data);

    void *MapNamedBuffer(uint buffer, enum access);

    void *MapNamedBufferRange(uint buffer,
                              intptr offset, sizeiptr length,
                              bitfield access);

    boolean UnmapNamedBuffer(uint buffer);

    void FlushMappedNamedBufferRange(uint buffer, intptr offset,
                                     sizeiptr length);

    void GetNamedBufferParameteriv(uint buffer,
                                   enum pname, int *params);

    void GetNamedBufferParameteri64v(uint buffer,
                                   enum pname, int64 *params);

    void GetNamedBufferPointerv(uint buffer,
                                enum pname, void **params);

    void GetNamedBufferSubData(uint buffer,
                               intptr offset, sizeiptr size, void *data);


    /* Framebuffer object functions */

    void CreateFramebuffers(sizei n, uint *framebuffers);

    void NamedFramebufferRenderbuffer(uint framebuffer,
                                      enum attachment,
                                      enum renderbuffertarget,
                                      uint renderbuffer);

    void NamedFramebufferParameteri(uint framebuffer,
                                    enum pname,
                                    int param);

    void NamedFramebufferTexture(uint framebuffer,
                                 enum attachment,
                                 uint texture, int level);

    void NamedFramebufferTextureLayer(uint framebuffer,
                                      enum attachment,
                                      uint texture, int level, int layer);

    void NamedFramebufferDrawBuffer(uint framebuffer, enum mode);

    void NamedFramebufferDrawBuffers(uint framebuffer, sizei n,
                                     const enum *bufs);

    void NamedFramebufferReadBuffer(uint framebuffer, enum mode);

    void InvalidateNamedFramebufferData(uint framebuffer,
                                        sizei numAttachments,
                                        const enum *attachments);

    void InvalidateNamedFramebufferSubData(uint framebuffer,
                                           sizei numAttachments,
                                           const enum *attachments,
                                           int x, int y,
                                           sizei width, sizei height);

    void ClearNamedFramebufferiv(uint framebuffer, enum buffer,
                                 int drawbuffer, const int *value);

    void ClearNamedFramebufferuiv(uint framebuffer, enum buffer,
                                  int drawbuffer, const uint *value);

    void ClearNamedFramebufferfv(uint framebuffer, enum buffer,
                                 int drawbuffer, float *value);

    void ClearNamedFramebufferfi(uint framebuffer, enum buffer,
                                 int drawbuffer, float depth, int stencil);

    void BlitNamedFramebuffer(uint readFramebuffer,
                              uint drawFramebuffer,
                              int srcX0,
                              int srcY0,
                              int srcX1,
                              int srcY1,
                              int dstX0,
                              int dstY0,
                              int dstX1,
                              int dstY1,
                              bitfield mask,
                              enum filter);

    enum CheckNamedFramebufferStatus(uint framebuffer, enum target);

    void GetNamedFramebufferParameteriv(uint framebuffer,
                                        enum pname,
                                        int *param);

    void GetNamedFramebufferAttachmentParameteriv(uint framebuffer,
                                                  enum attachment,
                                                  enum pname,
                                                  int *params);


    /* Renderbuffer object functions */

    void CreateRenderbuffers(sizei n, uint *renderbuffers);

    void NamedRenderbufferStorage(uint renderbuffer,
                                  enum internalformat,
                                  sizei width, sizei height);

    void NamedRenderbufferStorageMultisample(uint renderbuffer,
                                             sizei samples,
                                             enum internalformat,
                                             sizei width, sizei height);

    void GetNamedRenderbufferParameteriv(uint renderbuffer,
                                         enum pname, int *params);


    /* Texture object functions */

    void CreateTextures(enum target, sizei n, uint *textures);

    void TextureBuffer(uint texture,
                       enum internalformat, uint buffer);

    void TextureBufferRange(uint texture,
                            enum internalformat, uint buffer,
                            intptr offset, sizeiptr size);

    void TextureStorage1D(uint texture, sizei levels,
                          enum internalformat,
                          sizei width);

    void TextureStorage2D(uint texture, sizei levels,
                          enum internalformat,
                          sizei width, sizei height);

    void TextureStorage3D(uint texture, sizei levels,
                          enum internalformat,
                          sizei width, sizei height, sizei depth);

    void TextureStorage2DMultisample(uint texture, sizei samples,
                                     enum internalformat, sizei width,
                                     sizei height,
                                     boolean fixedsamplelocations);

    void TextureStorage3DMultisample(uint texture, sizei samples,
                                     enum internalformat, sizei width,
                                     sizei height, sizei depth,
                                     boolean fixedsamplelocations);

    void TextureSubImage1D(uint texture, int level,
                           int xoffset, sizei width,
                           enum format, enum type,
                           const void *pixels);

    void TextureSubImage2D(uint texture, int level,
                           int xoffset, int yoffset,
                           sizei width, sizei height,
                           enum format, enum type,
                           const void *pixels);

    void TextureSubImage3D(uint texture, int level,
                           int xoffset, int yoffset, int zoffset,
                           sizei width, sizei height, sizei depth,
                           enum format, enum type,
                           const void *pixels);

    void CompressedTextureSubImage1D(uint texture, int level,
                                     int xoffset,
                                     sizei width,
                                     enum format,
                                     sizei imageSize, const void *data);

    void CompressedTextureSubImage2D(uint texture, int level,
                                     int xoffset, int yoffset,
                                     sizei width, sizei height,
                                     enum format,
                                     sizei imageSize, const void *data);

    void CompressedTextureSubImage3D(uint texture, int level,
                                     int xoffset, int yoffset, int zoffset,
                                     sizei width, sizei height, sizei depth,
                                     enum format,
                                     sizei imageSize, const void *data);

    void CopyTextureSubImage1D(uint texture,
                               int level,
                               int xoffset,
                               int x, int y,
                               sizei width);

    void CopyTextureSubImage2D(uint texture,
                               int level,
                               int xoffset, int yoffset,
                               int x, int y,
                               sizei width, sizei height);

    void CopyTextureSubImage3D(uint texture,
                               int level,
                               int xoffset, int yoffset, int zoffset,
                               int x, int y,
                               sizei width, sizei height);

    void TextureParameterf(uint texture,
                           enum pname, float param);

    void TextureParameterfv(uint texture,
                            enum pname, const float *param);

    void TextureParameteri(uint texture,
                           enum pname, int param);

    void TextureParameterIiv(uint texture,
                             enum pname, const int *params);

    void TextureParameterIuiv(uint texture,
                              enum pname, const uint *params);

    void TextureParameteriv(uint texture,
                            enum pname, const int *param);

    void GenerateTextureMipmap(uint texture);

    void BindTextureUnit(uint unit, uint texture);

    void GetTextureImage(uint texture, int level,
                         enum format, enum type,
                         sizei bufSize,
                         void *pixels);

    void GetCompressedTextureImage(uint texture, int level,
                                   sizei bufSize,
                                   void *pixels);

    void GetTextureLevelParameterfv(uint texture,
                                    int level,
                                    enum pname, float *params);

    void GetTextureLevelParameteriv(uint texture,
                                    int level,
                                    enum pname, int *params);

    void GetTextureParameterfv(uint texture,
                               enum pname, float *params);

    void GetTextureParameterIiv(uint texture,
                                enum pname, int *params);

    void GetTextureParameterIuiv(uint texture,
                                 enum pname, uint *params);

    void GetTextureParameteriv(uint texture,
                               enum pname, int *params);


    /* Vertex Array object functions */

    void CreateVertexArrays(sizei n, uint *arrays);

    void DisableVertexArrayAttrib(uint vaobj, uint index);

    void EnableVertexArrayAttrib(uint vaobj, uint index);

    void VertexArrayElementBuffer(uint vaobj, uint buffer);

    void VertexArrayVertexBuffer(uint vaobj, uint bindingindex, uint buffer,
                                 intptr offset, sizei stride);

    void VertexArrayVertexBuffers(uint vaobj, uint first, sizei count,
                                  const uint *buffers,
                                  const intptr *offsets,
                                  const sizei *strides);

    void VertexArrayAttribFormat(uint vaobj, uint attribindex, int size,
                                 enum type, boolean normalized,
                                 uint relativeoffset);

    void VertexArrayAttribIFormat(uint vaobj, uint attribindex, int size,
                                  enum type, uint relativeoffset);

    void VertexArrayAttribLFormat(uint vaobj, uint attribindex, int size,
                                  enum type, uint relativeoffset);

    void VertexArrayAttribBinding(uint vaobj, uint attribindex,
                                  uint bindingindex);

    void VertexArrayBindingDivisor(uint vaobj, uint bindingindex,
                                   uint divisor);

    void GetVertexArrayiv(uint vaobj,
                          enum pname,
                          int *param);

    void GetVertexArrayIndexediv(uint vaobj,
                                 uint index,
                                 enum pname,
                                 int *param);

    void GetVertexArrayIndexed64iv(uint vaobj,
                                   uint index,
                                   enum pname,
                                   int64 *param);

    /* Sampler object functions */

    void CreateSamplers(sizei n, uint *samplers);


    /* Program Pipeline object functions */

    void CreateProgramPipelines(sizei n, uint *pipelines);


    /* Query object functions */

    void CreateQueries(enum target, sizei n, uint *ids);
    void GetQueryBufferObjectiv(uint id, uint buffer, enum pname,
                                intptr offset);
    void GetQueryBufferObjectuiv(uint id, uint buffer, enum pname,
                                 intptr offset);
    void GetQueryBufferObjecti64v(uint id, uint buffer, enum pname,
                                  intptr offset);
    void GetQueryBufferObjectui64v(uint id, uint buffer, enum pname,
                                   intptr offset);


New Tokens

    Accepted by the <pname> parameter of GetTextureParameter{if}v and
    GetTextureParameterI{i ui}v:

        TEXTURE_TARGET                                      0x1006

    Accepted by the <pname> parameter of GetQueryObjectiv:

        QUERY_TARGET                                        0x82EA

    Accepted by the <pname> parameter of GetIntegeri_v:

        TEXTURE_BINDING_1D                                  <existing>
        TEXTURE_BINDING_1D_ARRAY                            <existing>
        TEXTURE_BINDING_2D                                  <existing>
        TEXTURE_BINDING_2D_ARRAY                            <existing>
        TEXTURE_BINDING_2D_MULTISAMPLE                      <existing>
        TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY                <existing>
        TEXTURE_BINDING_3D                                  <existing>
        TEXTURE_BINDING_BUFFER                              <existing>
        TEXTURE_BINDING_CUBE_MAP                            <existing>
        TEXTURE_BINDING_CUBE_MAP_ARRAY                      <existing>
        TEXTURE_BINDING_RECTANGLE                           <existing>

Additions to Chapter 2 of the OpenGL 4.4 (core) Specification (OpenGL
Fundamentals)

    Replace the final paragraph of Section 2.5.1.1, "Name Spaces, Name
    Generation and Object Creation" with the following:

    Objects may also be created directly by functions that return a new
    name or names representing a freshly initialized object. Some functions
    return a single object name directly whereas others are able to create a
    large number of new objects, returning their names in an array. Examples of
    the former are CreateProgram for program objects and FenceSync for fence
    sync objects. Examples of the latter are CreateBuffers, CreateTextures and
    CreateVertexArrays for buffers, textures and vertex arrays, respectively.

Additions to Chapter 4 of the OpenGL 4.4 (core) Specification (Event Model)

    Modifications to Section 4.2, "Query Objects and Asynchronous Queries"

    (Insert the following after the description of GenQueries and before the
    introduction of DeleteQueries, p 39)

    Query objects may also be created with the command

        void CreateQueries(enum target, sizei n, uint *ids);

    CreateQueries returns <n> previously unused query object names in <ids>,
    each representing a new query object with the specified <target>.
    <target> must be one of the query object targets described in section
    4.2.

    The initial state of the resulting query object is that the result is
    marked available (the value of QUERY_RESULT_AVAILABLE) for the query
    object is TRUE) and the result value (the value of QUERY_RESULT) is
    zero.

    Errors

    An INVALID_ENUM error is generated if <target> is not one of the query
    object targets described in section 4.2.

    An INVALID_VALUE error is generated if <n> is negative.


    (Modify the introduction of GetQueryObject* as follows, p. ??, to add
    the QUERY_TARGET <pname> and the GetQueryBufferObject* commands)

    The state of a query object may be queried with the commands

    void GetQueryObjectiv(uint id,enum pname,int *params);
    void GetQueryObjectuiv(uint id,enum pname,uint *params);
    void GetQueryObjecti64v(uint id,enum pname,int64 *params);
    void GetQueryObjectui64v(uint id,enum pname,uint64 *params);
    void GetQueryBufferObjectiv(uint id,uint buffer,enum pname,intptr offset);
    void GetQueryBufferObjectuiv(uint id,uint buffer,enum pname,intptr offset);
    void GetQueryBufferObjecti64v(uint id,uint buffer,enum pname,intptr offset);
    void GetQueryBufferObjectui64v(uint id,uint buffer,enum pname,intptr offset);

    <id> is the name of a query object.

    For GetQueryBufferObject*, <buffer> is the name of a buffer object and
    <offset> is an offset into <buffer> at which the queried value is
    written.

    For GetQueryObject*, the queried value may be returned either in client
    memory or in a buffer object. If zero is bound to the current query
    result buffer binding point (see QUERY_RESULT in
    section~\ref{vert:vbo:bind), then <params> is treated as a pointer into
    client memory at which the queried value is written. Otherwise, <params>
    is treated as an offset into the query result buffer object at which the
    queried value is written.

    There may be an indeterminate delay ...

    If <pname> is QUERY_TARGET, then the target of the query object is
    returned as a single integer.

    If <pname> is QUERY_RESULT, then the query object's result value is
    returned as a single integer. If the value ...

    If <pname> is QUERY_RESULT_NO_WAIT, then the query object's result value
    is returned as a single integer if the result ...

    If multiple queries are issued using the same object name prior to
    calling these query commands, the result and availability information
    returned ...

    Errors

    An INVALID_OPERATION error is generated if <id> is not the name of a
    query object, or if the query object named by <id> is currently active.

    An INVALID_OPERATION error is generated by GetQueryBufferObject* if
    <buffer> is not the name of an existing buffer object.

    An INVALID_ENUM error is generated if <pname> is not QUERY_RESULT,
    QUERY_RESULT_AVAILABLE, QUERY_RESULT_NO_WAIT, or QUERY_TARGET.

    An INVALID_OPERATION error is generated if the query writes to a buffer
    object, and the specified buffer offset would cause data to be written
    beyond the bounds of that buffer object.

    An INVALID_VALUE error is generated by GetQueryBufferObject* if <offset>
    is negative.


    Modifications to Section 4.3, "Time Queries"

    (Add following the description of QueryCounter on p. 45)

    A timer query object is created with the commands

        void QueryCounter(uint id, enum target);

    ... <id> must be the name of an existing query object of that type.

    Alternatively, TIMESTAMP query objects can be created by calling
    CreateQueries with <target> set to TIMESTAMP.

    When QueryCounter is called ... for that object is marked available.
    Timer queries can be used within a BeginQuery / EndQuery block where the
    <target> is ...

    (Retain the remainder of the section.)

Additions to Chapter 6 of the OpenGL 4.4 (core) Specification (Buffer Objects)

    (Insert the following before the introduction of DeleteBuffers, p. 53)

    In addition to generating an unused name and then binding it to a target
    with BindBuffer, a buffer object may also be created with the command

        void CreateBuffers(sizei n, uint *buffers);

    CreateBuffers returns <n> previously unused buffer names in <buffers>, each
    representing a new buffer object initialized as if it had been bound to
    an unspecified target.

    Errors

    An INVALID_VALUE error is generated if <n> is negative.


    Modifications to Section 6.2, "Creating and Modifying Buffer Object Data Stores"

    (Modify the introduction of BufferStorage as follows, p. 59)

    The data store of a buffer object is created with the commands

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

    For BufferStorage, the data store belongs to the buffer object bound to
    <target>, which must be one of the values listed in table 6.1. For
    NamedBufferStorage, <buffer> is the name of the buffer object. <size> is
    the size of the data store in basic machine units, and <flags> contains
    a bitfield describing the intended usage of the data store.

    The data store of the buffer object is allocated as a result of these
    commands, and cannot be de-allocated ...

    (Retain the remainder of the section, but replace references to
    "BufferStorage" with "*BufferStorage").

    Errors

    An INVALID_OPERATION error is generated by NamedBufferStorage if
    <buffer> is not the name of an existing buffer object.


    (Modify the introduction of BufferData as follows, p. 61)

    A mutable data store may be allocated for a buffer object with the
    commands

        void BufferData(enum target, sizeiptr size,
                        const void *data, enum usage);
        void NamedBufferData(uint buffer, sizeiptr size,
                             const void *data, enum usage);

    For BufferData, the buffer object is that bound to <target>, which must
    be one of the targets listed in table 6.1. For NamedBufferData, <buffer>
    is the name of the buffer object.

    <size> is the size of the data store in basic machine units, <data>
    points to the source data in client memory, and <usage> indicates the
    expected application usage pattern of the data store.

    If <data> is non-NULL ...

    (Retain the remainder of the section, but replace references to
    "BufferData" with "*BufferData").

    Errors

    An INVALID_OPERATION error is generated by NamedBufferData if <buffer>
    is not the name of an existing buffer object.


    (Modify the introduction of BufferSubData as follows, p. 63)

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

        void BufferSubData(enum target, intptr offset,
                           sizeiptr size, const void *data);
        void NamedBufferSubData(uint buffer, intptr offset,
                                sizeiptr size, const void *data);

    For BufferSubData, <target> specifies the target to which the buffer
    object is bound, and must be one of the values listed in table 6.1. For
    NamedBufferSubData, <buffer> is the name of the buffer object.

    (Retain the remainder of the section.)

    Errors

    An INVALID_OPERATION error is generated by NamedBufferSubData if
    <buffer> is not the name of an existing buffer object.


    Modifications to Section 6.2.1, "Clearing Buffer Object Data Stores"

    (Modify the introduction of ClearBufferSubData as follows, p. 64)

    To fill all or part of a buffer object's data store with constant
    values, use the commands

        void ClearBufferSubData(enum target, enum internalformat, intptr offset,
                                sizeiptr size, enum format, enum type,
                                const void *data);
        void ClearNamedBufferSubData(uint buffer, enum internalformat,
                                     intptr offset, sizeiptr size, enum format,
                                     enum type, const void *data);

    For ClearBufferSubData, the buffer object is that bound to <target>,
    which must be one of the values listed in table 6.1. For
    ClearNamedBufferSubData, <buffer> is the name of the buffer object.

    (Retain the remainder of the section.)

    Errors

    An INVALID_OPERATION error is generated by ClearNamedBufferSubData if
    <buffer> is not the name of an existing buffer object.


    (Retain the remainder of the section.)

    (Modify the introduction of ClearBufferData as follows, p. 65)

    The commands

        void ClearBufferData(enum target, enum internalformat, enum format,
                             enum type, const void *data);
        void ClearNamedBufferData(uint buffer, enum internalformat, enum format,
                                  enum type, const void *data);

    are respectively equivalent to

        ClearBufferSubData(target, internalformat, 0, size,
                           format, type, data);

    and

        ClearNamedBufferSubData(buffer, internalformat, 0, size,
                                format, type, data);

    where <size> is the value of BUFFER_SIZE for the destination buffer
    object.


    Modifications to Section 6.3, "Mapping and Unmapping Buffer Data"

    (Modify the introduction of MapBufferRange as follows, p. 65)

    All or part of the data store of a buffer object may be mapped into the
    client's address space with the commands

        void *MapBufferRange(enum target, intptr offset, sizeiptr length,
                             bitfield acesss);
        void *MapNamedBufferRange(uint buffer, intptr offset, sizeiptr length,
                                  bitfield access);

    For MapBufferRange, the buffer object is that bound to <target>, which
    and must be one of the values listed in table 6.1. For
    MapNamedBufferRange, <buffer> is the name of the buffer object.

    <offset> and <length> indicate the range of data in the buffer object
    that is to be mapped, in terms of basic machine units. <access> is a
    bitfield containing flags which describe the requested mapping. These
    flags are described below.

    (Retain the remainder of the section, but replace further references
    to "MapBufferRange" with "Map*BufferRange").

    Errors

    An INVALID_OPERATION error is generated by MapNamedBufferRange if
    <buffer> is not the name of an existing buffer object.


    (Modify the introduction of MapBuffer with the following, p. 69)

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

        void *MapBuffer(enum target, enum access);
        void *MapNamedBuffer(uint buffer, enum access);

    These commands are respectively equivalent to

        MapBufferRange(target, 0, length, flags);

    and

        MapNamedBufferRange(buffer, 0, length, flags);

    where <length> is ...

    (Retain remainder of the section.)


    (Modify the introduction of FlushMappedBufferRange as follows, p. 69)

    If a buffer object is mapped with the MAP_FLUSH_EXPLICIT_BIT flag,
    modifications to the mapped range may be indicated with the commands

        void FlushMappedBufferRange(enum target,
                                    intptr offset,
                                    sizeiptr length);
        void FlushMappedNamedBufferRange(uint buffer,
                                         intptr offset,
                                         sizeiptr length);

    For FlushMappedBufferRange, the buffer object is that bound to <target>,
    which must be one of the targets listed in Table 6.1. For
    FlushMappedNamedBufferRange, <buffer> is the name of the buffer object.

    <offset> and <length> ...

    Retain the remainder of Section 6.3, but replace the two further references
    to FlushMappedBufferRange with "FlushMapped*BufferRange").

    Errors

    An INVALID_OPERATION error is generated by FlushMappedNamedBufferRange
    if <buffer> is not the name of an existing buffer object.


    Modifications to Section 6.3.1, "Unmapping Buffers"

    (Modify the introduction of UnmapBuffer as follows, p. 70)

    After the client ..., the mapping must be relinquished with one
    of the commands

        boolean UnmapBuffer(enum target);
        boolean UnmapNamedBuffer(uint buffer);

    For UnmapBuffer, the buffer object is that bound to <target>, which must
    be one of the targets listed in table 6.1. For UnmapNamedBuffer,
    <buffer> is the name of the buffer object.

    Unmapping a mapped buffer ...

    (Retain the remainder of Section 6.3.1, but replace any further
    reference to "UnmapBuffer" with "Unmap*Buffer").

    If an error is generated, FALSE is returned.

    Errors

    An INVALID_OPERATION error is generated by UnmapNamedBuffer if <buffer>
    is not the name of an existing buffer object.

    An INVALID_OPERATION error is generated if the buffer object's
    data store is already in the unmapped state.


    Modifications to Section 6.6, "Copying Between Buffers"

    (Modify the introduction of CopyBufferSubData as follows, p. 72)

    All or part of the data store of a buffer object may be copied to the
    data store of another buffer object with the commands

        void CopyBufferSubData(enum readTarget, enum writeTarget,
                               intptr readOffset, intptr writeOffset,
                               sizeiptr size);
        void CopyNamedBufferSubData(uint readBuffer, uint writeBuffer,
                                    intptr readOffset, intptr writeOffset,
                                    sizeiptr size);

    For CopyBufferSubData, <readTarget> and <writeTarget> are the targets to
    which the source and destination buffers are bound, and each must be one
    of the targets listed in table 6.1. For CopyNamedBufferSubData,
    <readBuffer> and <writeBuffer> are the names of the source and
    destination buffers, respectively.

    While any of these targets may be used, COPY_READ_BUFFER and
    COPY_WRITE_BUFFER are provided specifically for copies, so that they can
    be used without affecting other buffer binding targets that may be in
    use.

    <writeOffset> and <size> specify the range of data in the destination
    buffer object that is to be replaced, in terms of basic machine units.
    <readOffset> and <size> specify the range of data in the source buffer
    object that is to be copied to the corresponding region of the
    destination buffer object.

    (Replace references in the Errors section of "the buffer object bound to
    <readTarget> / <writeTarget>" with "the source / destination buffer
    object", respectively).

    Errors

    An INVALID_OPERATION error is generated by CopyNamedBufferSubData if
    <readBuffer> or <writeBuffer> is not the name of an existing buffer
    object.


    Modifications to Section 6.7, "Buffer Object Queries"

    (Replace the introduction of GetBufferParameteri{64}v with the following,
    p. 73)

    To query information about a buffer object, use the commands

        void GetBufferParameteriv(enum target, enum pname, int *data);
        void GetBufferParamereri64v(enum target, enum pname, int64 *data);
        void GetNamedBufferParameteriv(uint buffer, enum pname, int *data);
        void GetNamedBufferParameteri64v(uint buffer, enum pname, int64 *data);

    For GetBufferParameter*, the buffer object is that bound to <target>,
    which must be one of the targets listed in table 6.1. For
    GetNamedBufferParameter*, <buffer> is the name of the buffer object.

    <pname> must be one of the buffer object parameters in table 6.2, other
    than BUFFER_MAP_POINTER. The value of the specified parameter of the
    target buffer object is returned in <data>.

    Errors

    An INVALID_OPERATION error is generated by GetNamedBufferParameter* if
    <buffer> is not the name of an existing buffer object.


    (Replace the introduction of GetBufferSubData with the following, p. 73)

    To query the data store of a buffer object, use the commands

        void GetBufferSubData(enum target, intptr offset,
                              sizeiptr size, void *data);
        void GetNamedBufferSubData(uint buffer, intptr offset,
                                   sizeiptr size, void *data);

    For GetBufferSubData, <target> specifies the target to which the source
    buffer object is bound, and must be one of the values listed in table
    6.1. For GetNamedBufferSubData, <buffer> specifies the name of the source
    buffer object.

    <offset> and <size> indicate ...

    (Retain the remainder of the section, but replace references to
    "the buffer object bound to <target>" with "the source buffer object").

    Errors

    An INVALID_OPERATION error is generated by GetNamedBufferSubData if
    <buffer> is not the name of an existing buffer object.


    (Replace the introduction of GetBufferPointerv with the following, p. 74)

    While part or all of the data store of a buffer object is mapped, the
    pointer to the mapped range of the data store can be queried with the
    commands

        void GetBufferPointerv(enum target, enum pname, const void **params);
        void GetNamedBufferPointerv(uint buffer, enum pname,
                                    const void **params);

    For GetBufferPointerv, the buffer object is that bound tp <target>,
    which must be one of the targets listed in table 6.1. For
    GetNamedBufferPointerv, <buffer> is the name of the buffer object.

    (Retain the remainder of the section.)

    Errors

    An INVALID_OPERATION error is generated by GetNamedBufferPointerv if
    <buffer> is not the name of an existing buffer object.


Additions to Chapter 7 of the OpenGL 4.4 (core) Specification (Programs and
Shaders)

    Modifications to Section 7.4, "Program Pipeline Objects"

    (Insert the following after the description of BindProgramPipeline, p. 110)

    Program pipeline objects may also be created with the command

        void CreateProgramPipelines(sizei n, uint *pipelines);

    CreateProgramPipelines returns <n> previously unused program pipeline
    names in <pipelines>, each representing a new program pipeline object
    which is a state vector comprising all the state and with the same
    initial values listed in table 23.31.

    Errors

    An INVALID_VALUE error is generated if <n> is negative.


Additions to Chapter 8 of the OpenGL 4.4 (core) Specification (Textures and
Samplers)

    Modifications to Section 8.1, "Texture Objects"

    (Insert the following after the description of BindTextures, p. 164)

    The command

        void BindTextureUnit(uint unit, uint texture);

    binds an existing texture object to the texture unit numbered <unit>.
    <texture> must be zero or the name of an existing texture object. When
    <texture> is the name of an existing texture object, that object is
    bound to the target, in the corresponding texture unit, that was
    specified when the object was created. When <texture> is zero, each of
    the targets enumerated at the beginning of this section is reset to its
    default texture for the corresponding texture image unit.

    Errors

    An INVALID_OPERATION error is generated by BindTextureUnit if <texture>
    is not zero or the name of an existing texture object.


    Texture objects may also be created with the command

        void CreateTextures(enum target, sizei n, uint *textures);

    CreateTextures returns <n> previously unused texture names in
    <textures>, each representing a new texture object that is a state
    vector comprising all the state and with the same initial values listed
    in section 8.22. The new texture objects are and remain textures of the
    dimensionality and type specified by <target> until they are deleted.

    Errors

    An INVALID_VALUE error is generated if <n> is negative.


    Modifications to Section 8.2, "Sampler Objects"

    (Insert the following after the description of GenSamplers, p. 165)

    Sampler objects may also be created with the command

        void CreateSamplers(sizei n, uint *samplers);

    CreateSamplers returns <n> previously unused sampler names in
    <samplers>, each representing a new sampler object which is a state
    vector comprising all the state and with the same initial values listed
    in table 23.18.

    Errors

    An INVALID_VALUE error is generated if <n> is negative.


    Modifications to Section 8.6, "Alternate Texture Image Specification"

    (Modify introduction and add to the list of commands comprising
    TexSubImage*D and CopyTexSubImage*D, p. 201)

    To respecify only a rectangular subregion of the texel array of a
    texture object, use the commands

        ...
        void TextureSubImage1D(uint texture,
                               int level, int xoffset, sizei width,
                               enum format, enum type,
                               const void *pixels);
        void TextureSubImage2D(uint texture,
                               int level, int xoffset, int yoffset,
                               sizei width, sizei height,
                               enum format, enum type,
                               const void *pixels);
        void TextureSubImage3D(uint texture,
                               int level,
                               int xoffset, int yoffset, int zoffset,
                               sizei width, sizei height, sizei depth,
                               enum format, enum type,
                               const void *pixels);
        void CopyTextureSubImage1D(uint texture,
                                   int level,
                                   int xoffset,
                                   int x, int y,
                                   sizei width);
        void CopyTextureSubImage2D(uint texture,
                                   int level,
                                   int xoffset, int yoffset,
                                   int x, int y,
                                   sizei width, sizei height);
        void CopyTextureSubImage3D(uint texture,
                                   int level,
                                   int xoffset, int yoffset, int zoffset,
                                   int x, int y,
                                   sizei width, sizei height);

    For *TexSubImage*, the texture object is that bound to <target>. For
    *TextureSubImage*, <texture> is the name of the texture object. <target>
    or the effective target of <texture> (the value of TEXTURE_TARGET; see
    section 8.10) must match each command as shown in table 8.subtarg.

    Command Name            Valid <target>s or effective <target>s
    ---------------------   --------------------------------------
    TexSubImage1D           TEXTURE_1D
    CopyTexSubImage1D
    TextureSubImage1D
    CopyTextureSubImage1D

    TexSubImage2D           TEXTURE_2D,
    CopyTexSubImage2D       TEXTURE_1D_ARRAY,
    TextureSubImage2D       TEXTURE_RECTANGLE, or one of the
    CopyTextureSubImage2D   cube map face targets from table 8.18

    TextureSubImage2D       TEXTURE_2D,
    CopyTextureSubImage2D   TEXTURE_1D_ARRAY, or
                            TEXTURE_RECTANGLE

    TexSubImage3D           TEXTURE_3D,
    CopyTexSubImage3D       TEXTURE_2D_ARRAY, or
                            TEXTURE_CUBE_MAP_ARRAY

    TextureSubImage3D       TEXTURE_3D,
    CopyTextureSubImage3D   TEXTURE_2D_ARRAY,
                            TEXTURE_CUBE_MAP_ARRAY or
                            TEXTURE_CUBE_MAP
    ----------------------------------------------------------------
    Table 8.subtarg: Valid texture <target> parameters or effective
    <texture> targets for texture subimage commands.

    No change is made to the <internalformat> ...

    The <level> parameter of each command specifies ...

    Errors

    An INVALID_ENUM error is generated by *TexSubImage* if <target> does
    not match the command, as shown in table 8.subtarg.

    An INVALID_OPERATION error is generated by *TextureSubImage* if
    <texture> is not the name of an existing texture object.

    An INVALID_OPERATION error is generated by *TextureSubImage* if the
    effective target of <texture> does not match the command, as shown in
    table 8.subtarg.

    An INVALID_VALUE error is generated if the effective <target> is
    TEXTURE_RECTANGLE and <level> is not zero.


    Modifications to Section 8.7, "Compressed Texture Images"

    To respecify only a rectangular subregion of the texel array of an
    texture object, with incoming data stored in a specific compressed
    format, use the commands

        ...
        void CompressedTextureSubImage1D(uint texture, int level,
                                         int xoffset, sizei width,
                                         enum format,
                                         sizei imageSize, const void *data);
        void CompressedTextureSubImage2D(uint texture, int level,
                                         int xoffset, int yoffset,
                                         sizei width, sizei height,
                                         enum format,
                                         sizei imageSize, const void *data);
        void CompressedTextureSubImage3D(uint texture, int level,
                                         int xoffset, int yoffset,
                                         int zoffset,
                                         sizei width, sizei height,
                                         sizei depth, enum format,
                                         sizei imageSize, const void *data);

    Modify the following text, beginning "respecify only a rectangular
    region ..." as follows:

    The <target>, <texture>, <level>, <xoffset>, <yoffset>, <zoffset>,
    <width>, <height>, and <depth> parameters have the same meaning as in
    the corresponding commands from section 8.6 without the Compressed
    prefix (where those parameters are present). <data> points to compressed
    image data stored in the compressed image format corresponding to
    <format>.

    ...

    Errors

    Modify existing errors to apply to all forms of the commands by dropping
    "bound to <target>" phrasing and using "effective <target>" instead of
    "<target>".

    An INVALID_OPERATION error is generated by CompressedTextureSubImage*D
    if <texture> is not the name of an existing texture object.

    An INVALID_OPERATION error is generated by CompressedTextureSubImage*D
    if the effective <target> is TEXTURE_RECTANGLE.


    Modifications to Section 8.9, "Buffer Textures"

    (Modify the introduction of TexBuffer with the following, p. 214)

    The commands

        void TexBufferRange(enum target, enum internalformat,
                            uint buffer, intptr offset, sizeiptr size);
        void TextureBufferRange(uint texture, enum internalformat,
                                uint buffer, intptr offset, sizeiptr size);

    attach the range of the storage for the buffer object named <buffer> for
    <size> basic machine units, starting at <offset> (also in basic machine
    units) to a buffer texture.

    For TexBufferRange, the buffer texture is that currently bound to
    <target>. For TextureBufferRange, <texture> is the name of the buffer
    texture. <target> or the effective target of <texture> must be
    TEXTURE_BUFFER

    If <buffer> is zero, then any buffer object attached to the buffer
    texture is detached, the values <offset> and <size> are ignored and the
    state for <offset> and <size> for the buffer texture are reset to zero.
    <internalformat> specifies the storage format for the texel array found
    in the range of the attached buffer object, and must be one of the sized
    internal formats from table 8.15.

    Errors

    Modify existing errors to apply to all forms of the commands by using
    "effective <target>" instead of "<target>".

    An INVALID_OPERATION error is generated by TextureBufferRange if
    <texture> is not the name of an existing texture object.


    (Replace the introduction of TexBuffer with the following, p. 214)

    The commands

        TexBuffer(enum target, enum internalformat, uint buffer);
        TextureBuffer(uint texture, enum internalformat, uint buffer);

    are respectively equivalent to

        TexBufferRange(<target>, <internalformat>, <buffer>, 0, size);

    and

        TextureBufferRange(<texture>, <internalformat>, <buffer>, 0, size);

    where <size> is set to the value of BUFFER_SIZE for <buffer>.

    (Retain the remainder of the section.)


    Modifications to Section 8.10, "Texture Parameters"

    (Modify introduction to the section)

    Texture parameters control how the texel array of a texture object is
    treated when specified or changed, and when applied to a fragment. Each
    parameter is set with the commands

        void TexParameter{if}(enum target, enum pname, T param);
        void TexParameter{if}v(enum target, enum pname, const T *params);
        void TexParameterI{i ui}v(enum target, enum pname, const T *params);
        void TextureParameter{if}(uint texture, enum pname, T param);
        void TextureParameter{if}v(uint texture, enum pname, const T *params);
        void TextureParameterI{i ui}v(uint texture, enum pname, const T *params);

    For TexParameter*, the texture object is that bound to <target>. For
    TextureParameter*, <texture> is the name of the texture object. <target>
    or the effective target of <texture> must be one of [insert existing
    list of valid texture targets].

    ...

    Errors

    Modify existing errors to apply to all forms of the commands by using
    "effective <target>" instead of "<target>".

    An INVALID_OPERATION error is generated by TextureParameter* if
    <texture> is not the name of an existing texture object.


    Modifications to Section 8.11.2, "Texture Parameter Queries", p. 220

    Parameters of a texture object may be queried with the commands

        void GetTexParameter{if}v(enum target, enum pname, T *params);
        void GetTexParameterI{i ui}v(enum target, enum pname, T *params);
        void GetTextureParameter{if}v(uint texture, enum pname, T *params);
        void GetTextureParameterI{i ui}v(uint texture, enum pname, T *params);

    For GetTexParameter*, the texture object is that bound to <target>. For
    GetTextureParameter*, <texture> is the name of the texture object.

    The value of texture parameter <pname> for the texture is returned in
    <params>.

    <target> or the effective target of <texture> must be one of TEXTURE_1D,
    TEXTURE_2D, TEXTURE_3D, TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY,
    TEXTURE_RECTANGLE, TEXTURE_CUBE_MAP, TEXTURE_CUBE_MAP_ARRAY,
    TEXTURE_2D_MULTISAMPLE, or TEXTURE_2D_MULTISAMPLE_ARRAY, indicating the
    currently bound one-, two-, or three-dimensional, one- or
    two-dimensional array, rectangle, cube map, cube map array,
    two-dimensional multisample, or two-dimensional multisample array
    texture object.

    <pname> must be one of IMAGE_FORMAT_COMPATIBILITY_TYPE,
    TEXTURE_IMMUTABLE_FORMAT, TEXTURE_IMMUTABLE_LEVELS, TEXTURE_TARGET,
    TEXTURE_VIEW_MIN_LEVEL, TEXTURE_VIEW_NUM_LEVELS, TEXTURE_VIEW_MIN_LAYER,
    TEXTURE_VIEW_NUM_LAYERS, or one of the symbolic values in table 8.16.

    Querying pname TEXTURE_BORDER_COLOR with GetTex*ParameterIiv or
    GetTex*ParameterIuiv returns the border color values as signed integers or
    unsigned integers, respectively; otherwise the values are returned as
    described in section 2.2.2. If the border color is queried with a type
    that does not match the original type with which it was specified, the
    result is undefined.

    Querying <pname> TEXTURE_TARGET returns the <effective target> of the
    texture object. For GetTexParameter*, this is the <target> parameter.
    For GetTextureParameter*, it is the target to which <texture> was
    initially bound when it was created, or the value of the <target>
    parameter to the call to CreateTextures which created the texture.


    Errors

    Modify existing errors to apply to all forms of the commands by using
    "effective <target>" instead of "<target>".

    An INVALID_OPERATION error is generated by GetTextureParameter* if
    <texture> is not the name of an existing texture object.


    Modifications to Section 8.11.3, "Texture Level Parameter Queries", p. 220

    Parameters of a specified level-of-detail of a texture object may
    be queried with the commands


        void GetTexLevelParameter{if}v(enum target, int level,
                                       enum pname, T *params);
        void GetTextureLevelParameter{if}v(uint texture, int level,
                                           enum pname, T *params);

    For GetTexLevelParameter*, the texture object is that bound to <target>.
    For GetTextureLevelParameter*, <texture> is the name of the texture
    object.

    The value of texture parameter <pname> for level-of-detail <level> of
    the texture is returned in <params>. <pname> must be one of the symbolic
    values in tables 23.16- 23.17.

    The effective target of the texture object must be one of [incorporate
    the existing list of valid targets, but remove "one of the cube map face
    targets from table 8.18" and "one of the six distinct 2D images making
    up the cube map texture object"] ...

    For GetTexLevelParameter* only, target may also be one of the cube map
    face targets from table 8.18, indicating one of the six distinct
    two-dimensional images making up the cube map texture object. Note that
    TEXTURE_CUBE_MAP is not a valid target parameter for
    GetTexLevelParameter*.

    For GetTextureLevelParameter* only, texture may also be a cube map
    texture object. In this case the query is always performed for face zero
    (the TEXTURE_CUBE_MAP_POSITIVE_X face), since there is no way to
    specify another face.

    <level> determins which level-of-detail's state is returned...

    Errors

    Modify existing errors to apply to all forms of the commands by using
    "effective texture target" instead of "<target>".

    An INVALID_OPERATION error is generated by GetTextureLevelParameter* if
    <texture> is not the name of an existing texture object.


    Modifications to Section 8.11.4, "Texture Image Queries"

    (Replace the first paragraph with the following, p. 223)

    Texture images may be obtained from a texture object with the commands

        void GetTexImage(enum target, int level, enum format,
                         enum type, void *pixels);
        void GetTextureImage(uint texture, int level, enum format,
                             enum type, sizei bufSize, void *pixels);

    For GetTexImage, <target> specifies the target to which the texture
    object is bound. <target> must be one of TEXTURE_1D, TEXTURE_2D,
    TEXTURE_3D, TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP_ARRAY
    or TEXTURE_RECTANGLE, indicating a one-, two- or three-dimensional, one-
    or two-dimensional array, cube map array or rectangle texture,
    respectively, of one of the targets from table 8.18, indicating the
    corresponding face of a cube map texture.

    For GetTextureImage, <texture> is the name of the texture object
    containing the image to be retrieved. In addition to the types of
    textures accepted by the Get*TexImage commands, GetTextureImage also
    accepts cube map texture objects (with effective <target>
    TEXTURE_CUBE_MAP).

    <level> is a level-of-detail number, <format> is a pixel format from
    table 8.3, and <type> is a pixel type from table 8.2.

    For GetTextureImage, <bufSize> is the size of the buffer to receive the
    retrieved pixel data. GetTextureImage does not write more than <bufSize>
    bytes into <pixels>.

    (Modify remaining paragraphs as shown)

    These commands obtain component groups ... where the layers are treated
    as rows or images. Cube map textures are treated as three-dimensional
    images with a depth of 6, where the cube map faces are ordered as image
    layers as shown in table 9.2

    These groups are then packed and placed ...

    For three-dimensional, two-dimensional array, cube map array, and cube
    map textures, pixel storage operations are applied as if ...

    The row length ...

    Errors

    Replace references to <lod> by <level>.

    An INVALID_OPERATION error is generated by GetTextureImage if <texture>
    is not the name of an existing texture object.

    An INVALID_ENUM error is generated if the effective <target> is not one
    of TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, TEXTURE_1D_ARRAY,
    TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP_ARRAY, TEXTURE_RECTANGLE, one of the
    targets from table 8.18 (for GetTexImage and GetnTexImage only), or
    TEXTURE_CUBE_MAP (for GetTextureImage only).

    An INVALID_OPERATION error is generated by GetTextureImage if the buffer
    size required to store the requested data is greater than <bufSize>


    (Replace the introduction of GetCompressedTexImage by the following, p. 225)

    Texture images stored in compressed form may be obtained with the
    commands

        void GetCompressedTexImage(enum target, int level, void *pixels);
        void GetCompressedTextureImage(uint texture, int level, sizei bufSize,
                                       void *pixels);

    For GetCompressedTexImage, the texture is that
    which is bound to <target>.
    For GetCompressedTextureImage, <texture> is the name of the texture object.

    <target>, <level>, <bufSize> and <pixels> are interpreted in the same
    manner as the corresponding parameters of GetTexImage and
    GetTextureImage.

    GetCompressedTexImage writes <n> ubytes of compressed image data to the
    pixel pack buffer or client memory pointed to by <pixels>, while
    GetCompressedTextureImage writes min(n, bufSize) ubytes. <n> is the
    value of TEXTURE_COMPRESSED_IMAGE_SIZE for the texture image. The
    compressed image data is formatted according to the definition of the
    texture's internal format.

    By default the pixel storage modes ...

    Errors

    An INVALID_OPERATION error is generated by GetCompressedTextureImage if
    <texture> is not the name of an existing texture object.

    An INVALID_VALUE error is generated if <level> is negative, or greater
    than the maximum allowable level.

    An INVALID_OPERATION error is generated if the texture image is stored
    with an uncompressed internal format.

    An INVALID_OPERATION error is generated if a pixel pack buffer object is
    bound and packing the texture image into the buffer's memory would
    exceed the size of the buffer.

    An INVALID_OPERATION error is generated by GetCompressedTextureImage if
    the buffer size required to store the requested data is greated than
    <bufSize>.


    Modifications to Section 8.14.4, "Manual Mipmap Generation"

    (Modify the introduction of GenerateMipmap by the following, p. 237)

    Mipmaps can be generated manually for a texture object with the commands

        void GenerateMipmap(enum target);
        void GenerateTextureMipmap(uint texture);

    For GenerateMipmap, <target> specifies the target to which the texture
    object is bound. For GenerateTextureMipmap, <texture> is the name of the
    texture object.

    <target> or the effective target of <texture> must be
    one of TEXTURE_1D, TEXTURE_2D, TEXTURE_3D,
    TEXTURE_1D_ARRAY, TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP, or
    TEXTURE_CUBE_MAP_ARRAY.

    If <target> or the effective target of <texture> is TEXTURE_CUBE_MAP or
    TEXTURE_CUBE_MAP_ARRAY, then the texture object must be cube complete or
    cube array complete respectively, as defined in section 8.17.

    (include the remainder of the description of GenerateMipmap, starting
    with "Mipmap generation replaces...")

    Errors

    An INVALID_ENUM error is generated by GenerateMipmap if <target> is
    not one of the valid targets listed above.

    An INVALID_OPERATION error is generated by GenerateTextureMipmap if
    <texture> is not the name of an existing texture object.

    An INVALID_OPERATION error is generated by GenerateTextureMipmap if the
    effective <target> is not one of the valid targets listed above.

    An INVALID_OPERATION error is generated by GenerateTextureMipmap if the
    effective <target> is TEXTURE_CUBE_MAP or TEXTURE_CUBE_MAP_ARRAY, and
    the texture object is not cube complete or cube array complete,
    respectively.


    Modifications to Section 8.19, "Immutable-Format Texture Images"

    (Replace the list of "generic" errors generated by these commands,
    following the third paragraph of the section)

    The TexStorage* commands specify properties of the texture object bound
    to the <target> parameter of each command.

    The TextureStorage* commands behave similarly to the equivalent
    TexStorage* commands, but specify properties of the texture object named
    by the <texture> parameter of each command. The effective target of
    <texture> must be compatible with the <target> parameter of the
    equivalent TexStore* command.


    Errors

    An INVALID_OPERATION error is generated by TexStorage* if zero is bound
    to <target>.

    An INVALID_OPERATION error is generated by TextureStorage* if <texture>
    is not the name of an existing texture object.

    An INVALID_VALUE error is generated if <width>, <height>, <depth> or
    <levels> is less than 1, for commands with the corresponding parameters.

    An INVALID_ENUM error is generated if <internalformat> is one of the
    unsized base internal formats listed in table 8.11.


    (Modify the introduction of TexStorage1D as follows, p. 247)

    The commands

        void TexStorage1D(enum target, sizei levels,
                          enum internalformat, sizei width);
        void TextureStorage1D(uint texture, sizei levels,
                              enum internalformat, sizei width);

    specify all the levels of a one-dimensional texture (or, for
    TexStorage1D, proxy) at the same time. TexStorage1D is described by the
    pseudocode below:

    (Include original TexStorage1D pseudocode, p. 247)

    (add to the Errors section for TexStorage1D)

    Errors

    In addition to the generic errors described at the start of this
    section,

    An INVALID_OPERATION error is generated by TextureStorage1D if
    the effective <target> is not TEXTURE_1D.


    (Modify the introduction of TexStorage2D as follows, 247)

    The commands

        void TexStorage2D(enum target, sizei levels, enum internalformat,
                          sizei width, sizei height);
        void TextureStorage2D(uint texture, sizei levels, enum internalformat,
                              sizei width, sizei height);

    specify all the levels of a two-dimensional, cube-map, one-dimensional
    array or rectangle texture (or, for TexStorage2D, proxy) at the same
    time. TexStorage2D is described by the <target>-dependent pseudocode
    below:

    (Include original TexStorage2D pseudocode, p. 248)

    (add to the Errors section for TexStorage2D)

    Errors

    In addition to the generic errors described at the start of this
    section,

    An INVALID_OPERATION error is generated by TextureStorage2D if the
    effective <target> is not one of those listed above.


    (Modify the introduction of TexStorage3D as follows, p. 249)

    The commands

        void TexStorage3D(enum target, sizei levels, enum internalformat,
                          sizei width, sizei height, sizei depth);
        void TextureStorage3D(uint texture, sizei levels, enum internalformat,
                              sizei width, sizei height, sizei depth);

    specify all the levels of a three-dimensional, two-dimensional array
    texture or cube-map array texture (or, for TexStorage3D, proxy).
    TexStorage3D is described by the <target>-dependent pseudocode below:

    (Include original TexStorage3D pseudocode, p. 249)

    (add to the Errors section for TexStorage3D)

    Errors

    In addition to the generic errors described at the start of this
    section,

    An INVALID_OPERATION error is generated by TextureStorage3D if the
    effective <target> is not one of those listed above.


    (Modify the introduction of TexStorage2DMultisample as follows, p. 250)

    The commands

        void TexStorage2DMultisample(enum target, sizei samples,
                                     enum internalformat, sizei width,
                                     sizei height,
                                     boolean fixedsamplelocations);
        void TextureStorage2DMultisample(uint texture, sizei samples,
                                         enum internalformat, sizei width,
                                         sizei height,
                                         boolean fixedsamplelocations);

    specify a two-dimensional multisample texture (or, for
    TexStorage2DMultisample, proxy). For TexStorage2DMultisample, <target>
    must be TEXTURE_2D_MULTISAMPLE or PROXY_TEXTURE_2D_MULTISAMPLE. Calling
    TexStorage2DMultisample is equivalent to calling TexImage2DMultisample
    with the equivalently named parameters set to the same values, except
    that the resulting texture has immutable format.

    Errors

    In addition to the generic errors described at the start of this
    section,

    An INVALID_OPERATION error is generated by TextureStorage2DMultisample
    if the effective <target> is not TEXTURE_2D_MULTISAMPLE.


    (Modify the introduction of TexStorage3DMultisample as follows, p. 250)

    The commands

        void TexStorage3DMultisample(enum target, sizei samples,
                                     enum internalformat, sizei width,
                                     sizei height, sizei depth,
                                     boolean fixedsamplelocations);
        void TextureStorage3DMultisample(uint texture, sizei samples,
                                         enum internalformat, sizei width,
                                         sizei height, sizei depth,
                                         boolean fixedsamplelocations);

    specify a two-dimensional multisample array texture (or, for
    TexStorage3DMultisample, proxy). For TexStorage3DMultisample, <target>
    must be TEXTURE_2D_MULTISAMPLE_ARRAY or
    PROXY_TEXTURE_2D_MULTISAMPLE_ARRAY.

    Calling TexStorage3DMultisample is equivalent to calling
    TexImage3DMultisample with the equivalently named parameters set to the
    same values, except that the resulting texture has immutable format.

    Errors

    In addition to the generic errors described at the start of this
    section,

    An INVALID_OPERATION error is generated by TextureStorage3DMultisample
    if the effective <target> is not TEXTURE_2D_MULTISAMPLE_ARRAY.


Additions to Chapter 9 of the OpenGL 4.4 (core) Specification (Framebuffers and
Framebuffer Objects)

    Modifications to Section 9.2, "Binding and Managing Framebuffer Objects"

    (Insert the following, after the description of BindFramebuffer, p. 272)

    Framebuffer objects may also be created with the command

        void CreateFramebuffers(sizei n, uint *framebuffers);

    CreateFramebuffers returns <n> previously unused framebuffer names in
    <framebuffers>, each representing a new framebuffer object which is a
    state vector, comprising all the state and with the same initial values
    listed in table 23.24, as well as one set of the state values listed in
    table 23.25 for each attachment point of the framebuffer, with the same
    initial values.

    Errors

    An INVALID_VALUE error is generated by CreateFramebuffers if <n> is
    negative.


    Modifications to Section 9.2.1, "Framebuffer Object Parameters"

    (Modify the introduction of FramebufferParameteri as follows, p. 274)

    Parameters of a framebuffer object are set using the commands

        void FramebufferParameteri(enum target, enum pname, int param);
        void NamedFramebufferParameteri(uint framebuffer, enum pname, int param);

    For FramebufferParameteri, the framebuffer object is that bound to
    <target>, which must be DRAW_FRAMEBUFFER, READ_FRAMEBUFFER, or
    FRAMEBUFFER. FRAMEBUFFER is equivalent to DRAW_FRAMEBUFFER. For
    NamedFramebufferParameteri, <framebuffer> is the name of the framebuffer
    object.

    <pname> specifies the parameter of the framebuffer object to set.

    When a framebuffer ...

    Errors

    An INVALID_OPERATION error is generated by NamedFramebufferParameteri if
    <framebuffer> is not the name of an existing framebuffer object.


    Modifications to Section 9.2.3, "Framebuffer Object Queries"

    (Modify the introduction of GetFramebufferParameteriv as follows, p. 277)

    Parameters of a framebuffer object may be queried with the commands

        void GetFramebufferParameteriv(enum target,
                                       enum pname,
                                       int *params);
        void GetNamedFramebufferParameteriv(uint framebuffer,
                                            enum pname,
                                            int *params);

    For GetFramebufferParameteriv, the framebuffer object is that bound to
    <target>, which must be DRAW_FRAMEBUFFER, READ_FRAMEBUFFER, or
    FRAMEBUFFER. FRAMEBUFFER is equivalent to DRAW_FRAMEBUFFER. For
    GetNamedFramebufferParameteriv, <framebuffer> may be zero, indicating
    the default draw framebuffer, or the name of the framebuffer object.

    The value of framebuffer parameter <pname> for the framebuffer object is
    returned in <params>.

    Errors

    An INVALID_OPERATION error is generated by
    GetNamedFramebufferParameteriv if <framebuffer> is not zero or the name
    of an existing framebuffer object.


    (Modify the introduction of GetFramebufferAttachmentParameter as
    follows, p. 277)

    Attachments of a framebuffer object or buffers of a default framebuffer
    may be queried with the commands

        void GetFramebufferAttachmentParameteriv(enum target,
                                                 enum attachment,
                                                 enum pname,
                                                 int *params);
        void GetNamedFramebufferAttachmentParameteriv(uint framebuffer,
                                                      enum attachment,
                                                      enum pname,
                                                      int *params);

    For GetFramebufferAttachmentParameteriv, the framebuffer object is that
    bound to <target>, which must be DRAW_FRAMEBUFFER, READ_FRAMEBUFFER, or
    FRAMEBUFFER. FRAMEBUFFER is equivalent to DRAW_FRAMEBUFFER. For
    GetNamedFramebufferAttachmentParameteriv, <framebuffer> is zero or the
    name of the framebuffer object. If <framebuffer> is zero, then the
    default draw framebuffer is queried.

    If a default framebuffer is queried, then <attachment> must be one of
    FRONT_LEFT, FRONT_RIGHT, BACK_LEFT, or BACK_RIGHT, identifying a color
    buffer; DEPTH, identifying the depth buffer; or STENCIL, identifying the
    stencil buffer.

    Otherwise, <attachment> must be one of the framebuffer object attachment
    points listed in table 9.1

    (Retain the remainder of the section, but replace the reference to
    "GetFramebufferAttachmentParameteriv" with
    "GetNamedFramebufferAttachmentParameteriv or
    GetFramebuffferAttachmentParameteriv", p. 278)

    Errors

    An INVALID_OPERATION error is generated by
    GetNamedFramebufferAttachmentParameteriv if <framebuffer> is not zero or
    the name of an existing framebuffer object.


    Modifications to Section 9.2.4, "Renderbuffer Objects"

    (Insert the following after the description of BindRenderbuffer, p. 280)

    New renderbuffers may also be created with the command

        void CreateRenderbuffers(sizei n, uint *renderbuffers);

    CreateRenderbuffers returns <n> previously unused renderbuffer names in
    <renderbuffers>, each representing a new renderbuffer object which is a
    state vector comprising all the state and with the initial values listed
    in table 23.27. The state of each renderbuffer object is as if a name
    returned from GenRenderbuffers had been bound to the RENDERBUFFER
    target, except that any existing binding to RENDERBUFFER is not
    affected.

    Errors

    An INVALID_VALUE error is generated by CreateRenderbuffers if <n> is
    negative.

    (Replace the introduction of RenderbufferStorageMultisample with the
    following, p. 282)

    The data storage, format, dimensions, and number of samples of a
    renderbuffer object's image are established with the commands

        void RenderbufferStorageMultisample(enum target,
                                            sizei samples,
                                            enum internalformat,
                                            sizei width, sizei height);
        void NamedRenderbufferStorageMultisample(uint renderbuffer,
                                                 sizei samples,
                                                 enum internalformat,
                                                 sizei width, sizei height);

    For RenderbufferStorageMultisample, the renderbuffer object is that
    bound to <target>, which must be RENDERBUFFER. For
    NamedRenderbuferStorageMultisample, <renderbuffer> is the name of the
    renderbuffer object.

    <internalformat> must be color-renderable, depth-renderable, or
    stencil-renderable (as defined in section 9.4). <width> and <height> are
    the dimensions, in pixels, of the renderbuffer.

    (Retain the remainder of the section, but replace further references to
    "RenderbufferStorageMultisample" with "*RenderbufferStorageMultisample")

    Errors

    An INVALID_OPERATION error is generated by
    NamedRenderbufferStorageMultisample if <renderbuffer> is not the name of
    an existing renderbuffer object.


    (Insert the following at the end of Section 9.2.4, p. 283)

    The command

        void NamedRenderbufferStorage(uint renderbuffer,
                                      enum internalformat,
                                      sizei width, sizei height);

    is equivalent to

        NamedRenderbufferStorageMultisample(renderbuffer, 0, internalfomat,
                                            width, height);


    Modifications to Section 9.2.6, "Renderbuffer Object Queries"

    (Replace the introduction of GetRenderbufferParameteriv by the following,
    p. 283)

    Parameters of a renderbuffer object may be queried with the commands

        void GetRenderbufferParameteriv(enum target,
                                        enum pname, int *params);
        void GetNamedRenderbufferParameteriv(uint renderbuffer,
                                         enum pname, int *params);

    For GetRenderbufferParameteriv, the renderbuffer object is that bound to
    <target>, which must be RENDERBUFFER. For
    GetNamedRenderbufferParameteriv, <renderbuffer> is the name of the
    renderbuffer object.

    The value of renderbuffer parameter <pname> for the renderbuffer object
    is returned in <params>. <pname> must be one of the symbolic values...

    (Retain the remainder of the section but replace instances of "the
    renderbuffer currently bound to <target>" with "the renderbuffer
    object", p. 284)

    Errors

    An INVALID_OPERATION error is generated by GetRenderbufferParameteriv if
    zero is bound to <target>.

    An INVALID_OPERATION error is generated by
    GetNamedRenderbufferParameteriv if <renderbuffer> is not the name of an
    existing renderbuffer object.


    Modifications to Section 9.2.7, "Attaching Renderbuffer Images to a
    Framebuffer"

    (Modify the introduction of FramebufferRenderbuffer as follows, p. 284)

    A renderbuffer object can be attached as one of the logical buffers of a
    framebuffer object with the commands

        void FramebufferRenderbuffer(enum target, enum attachment,
                                     enum renderbuffertarget,
                                     uint renderbuffer);
        void NamedFramebufferRenderbuffer(uint framebuffer,
                                          enum attachment,
                                          enum renderbuffertarget,
                                          uint renderbuffer);

    For FramebufferRenderbuffer the framebuffer object is that bound to
    <target>, which must be DRAW_FRAMEBUFFER, READ_FRAMEBUFFER or
    FRAMEBUFFER. FRAMEBUFFER is equivalent to DRAW_FRAMEBUFFER. For
    NamedFramebufferRenderbuffer, <framebuffer> is the name of the
    framebuffer object.

    (Retain the remainder of the section but replace instances of
    "FramebufferRenderbuffer" with "*FramebufferRenderbuffer", and of "the
    framebuffer bound to <target>" with "the framebuffer object".

    Errors

    An INVALID_OPERATION error is generated by NamedFramebufferRenderbuffer
    if <framebuffer> is not the name of an existing framebuffer object.


    Modifications to Section 9.2.8, "Attaching Texture Images to a
    Framebuffer"

    (Modify the introduction of FramebufferTexture as follows, p. 286)

    To render directly into a texture image, a specified level of a texture
    object can be attached as one of the logical buffers of a framebuffer
    object with the commands

        void FramebufferTexture(enum target, enum attachment,
                                uint texture, int level);
        void NamedFramebufferTexture(uint framebuffer, enum attachment,
                                     uint texture, int level);

    For FramebufferTexture, the framebuffer object is that bound to
    <target>, which must be DRAW_FRAMEBUFFER, READ_FRAMEBUFFER or
    FRAMEBUFFER. FRAMEBUFFER is equivalent to DRAW_FRAMEBUFFER. For
    NamedFramebufferTexture, <framebuffer> is the name of the framebuffer
    object.

    <attachment> must be one of the attachment points of the framebuffer
    listed in table 9.1.

    If <texture> is zero, any image or array of images attached to the
    attachment point named by <attachment> is detached. Any additional
    parameters (<level>) are ignored when <texture> is zero.

    If <texture> is non-zero, the specified mipmap <level> of the texture
    object named <texture> is attached to the framebuffer attachment point
    named by <attachment>.

    If <texture> is the name of a three-dimensional texture, cube map texture,
    one- or two-dimensional array texture, cube map array texture, or two-
    dimensional multisample array texture, the texture level attached to the
    framebuffer attachment point is an array of images, and the framebuffer
    attachment is considered layered.

    (Retain the remainder of the section.)

    Errors

    An INVALID_OPERATION error is generated by NamedFramebufferTexture if
    <framebuffer> is not the name of an existing framebuffer object.


    (Replace the introduction of FramebufferTextureLayer with the following,
    p. 288)

    A single layer of a three-dimensional or array texture object can be
    attached as one of the logical buffers of a framebuffer object with the
    commands

        void FramebufferTextureLayer(enum target, enum attachment,
                                     uint texture,
                                     int level, int layer);
        void NamedFramebufferTextureLayer(uint framebuffer, enum attachment,
                                          uint texture,
                                          int level, int layer);

    These commands operate identically to the equivalent FramebufferTexture
    and NamedFramebufferTexture commands, respectively, except for the
    additional <layer> argument which selects a layer of the texture object
    to attach.

    <layer> specifies the layer of a one- or two-dimensional image within
    <texture>, except for cube map and cube map array textures. For cube map
    textures, <layer> is translated into a cube map face as described in
    table 9.2. For cube map array textures, <layer> is translated into an
    array layer and a cube map face as described for layer-face numbers in
    section 8.5.3.

    If <texture> is a three-dimensional texture, then ...

    Errors

    In addition to the corresponding errors for FramebufferTexture and
    NamedFramebufferTexture when called with the same parameters (other than
    <layer>):

    An INVALID_OPERATION error is generated by NamedFramebufferTextureLayer
    if <framebuffer> is not the name of an existing framebuffer object.

    (Remove the final two paragraphs of section 9.2.8, starting "Unlike
    FramebufferTexture3D...")


    Modifications to Section 9.2.8.1, "Effects of Attaching a Texture Image"

    (change all references to FramebufferTexture* to *FramebufferTexture*,
    to include the NamedFramebufferTexture* variants)


    Modifications to Section 9.4.2, "Whole Framebuffer Completeness"

    (Replace the defintion of CheckFramebufferStatus, p. 297)

    The status of a framebuffer object or default framebuffer can be queried
    with the commands

        enum CheckFramebufferStatus(enum target);
        enum CheckNamedFramebufferStatus(uint framebuffer, enum target);

    For CheckFramebufferStatus, the framebuffer object is that bound to
    <target>. For CheckNamedFramebufferStatus, <framebuffer> is zero or the
    name of the framebuffer object.

    <target> must be DRAW_FRAMEBUFFER, READ_FRAMEBUFFER or FRAMEBUFFER.
    FRAMEBUFFER is equivalent to DRAW_FRAMEBUFFER.

    If <framebuffer> is zero, then the status of the default read or draw
    framebuffer (as determined by <target>) is returned.

    A value is returned that identifies whether or not the framebuffer
    object or default framebuffer is complete when treated as a read or draw
    framebuffer (as determined by <target>). If the framebuffer object is
    complete, then FRAMEBUFFER_COMPLETE is returned. Otherwise, the value
    returned is one of the error codes defined at the start of section 9.4.2
    identifying one of the rules of framebuffer completeness that is
    violated.

    Errors

    If CheckFramebufferStatus generates an error, zero is returned.

    An INVALID_ENUM error is generated by CheckFramebufferStatus and
    CheckNamedFramebufferStatus if <target> is not DRAW_FRAMEBUFFER,
    READ_FRAMEBUFFER or FRAMEBUFFER.

    An INVALID_OPERATION error is generated by CheckNamedFramebufferStatus
    if <framebuffer> is not zero or the name of an existing framebuffer
    object.


Additions to Chapter 10 of the OpenGL 4.4 (core) Specification (Vertex
Specification and Drawing Commands)

    Modifications to Section 10.3, "Vertex Arrays"

    (Insert the following after the introduction of vertex arrays, first
    paragraph of Section 10.3, p. 314)

    All of the state required to represent the vertex arrays is
    stored in a vertex array object (VAO).


    (Insert all of Section 10.4, "Vertex Array Objects" as new section 10.3.1,
    renumber subsequent sections and delete the original section 10.4, p. 314)

    (Insert the following after the description of BindVertexArray, p. 327)

    Vertex array objects may also be created with the command

        void CreateVertexArrays(sizei n, uint *arrays);

    CreateVertexArrays returns <n> previously unused vertex array object
    names in <arrays>, each representing a state vector comprising all the
    state and with the same initial values listed in tables 23.3 and 23.4.

    Errors

    An INVALID_VALUE error is generated by CreateVertexArrays if <n> is
    negative.


    (Insert the following after the description of IsVertexArray, p. 327)

    To bind a buffer object to the element array buffer bind point of a
    vertex array object, use the command

        void VertexArrayElementBuffer(uint vaobj, uint buffer);

    <vaobj> is
      [compatibility profile:
       zero, indicating the default vertex array object, or]
    the name of the vertex array object, and <buffer> is zero or the name of
    the buffer object. If <buffer> is zero, any existing element array
    buffer binding to <vaobj> is removed.

    Errors

    An INVALID_OPERATION error is generated by VertexArrayElementBuffer if
    <vaobj> is not
      [compatibility profile: zero or]
    the name of an existing vertex array object.

    An INVALID_OPERATION error is generated if <buffer> is not zero or the
    name of an existing buffer object.


    (Modify the introduction of EnableVertexAttribArray and
    DisableVertexAttribArray with the following, p. 320)

    An individual generic vertex attribute array in a vertex array object
    is enabled with the commands

        void EnableVertexAttribArray(uint index);
        void EnableVertexArrayAttrib(uint vaobj, uint index);

    and is disabled with the commands

        void DisableVertexAttribArray(uint index);
        void DisableVertexArrayAttrib(uint vaobj, uint index);

    <index> is the generic vertex attribute array to enable or disable. For
    EnableVertexAttribArray and DisableVertexAttribArray, the vertex array
    object is the currently bound vertex array object. For
    EnableVertexArrayAttrib and DisableVertexArrayAttrib, <vaobj> is
      [compatibility profile:
       zero, indicating the default vertex array object, or]
    the name of the vertex array object.

    Errors

    An INVALID_OPERATION error is generated by EnableVertexAttribArray and
    DisableVertexAttribArray if no vertex array object is bound.

    An INVALID_OPERATION error is generated by EnableVertexArrayAttrib and
    DisableVertexArrayAttrib if <vaobj> is not
      [compatibility profile: zero or]
    the name of an existing vertex array object.

    An INVALID_VALUE error is generated if <index> is greater than or equal
    to the value of MAX_VERTEX_ATTRIBS.


    Modifications to Subsection 10.3.2 (which was previously 10.3.1),
    "Specifying Arrays for Generic Vertex Attributes"

    (Replace the introduction of the subsection with the following, p. 314)

    To specify the organization of arrays storing generic vertex attributes
    of a vertex array object, use the commands

        void VertexAttribFormat(uint attribindex, int size,
                                enum type, boolean normalized,
                                uint relativeoffset);
        void VertexAttribIFormat(uint attribindex, int size,
                                 enum type, uint relativeoffset);
        void VertexAttribLFormat(uint attribindex, int size,
                                 enum type, uint relativeoffset);
        void VertexArrayAttribFormat(uint vaobj, uint attribindex, int size,
                                     enum type, boolean normalized,
                                     uint relativeoffset);
        void VertexArrayAttribIFormat(uint vaobj, uint attribindex, int size,
                                      enum type, uint relativeoffset);
        void VertexArrayAttribLFormat(uint vaobj, uint attribindex, int size,
                                      enum type, uint relativeoffset);

    For VertexAttrib*Format, the vertex array object is that bound to
    VERTEX_ARRAY_BINDING. For VertexArrayAttrib*Format, <vaobj> is
      [compatibility profile:
       zero, indicating the default vertex array object, or]
    the name of the vertex array object.

    (Retain remainder of language.)

    Errors

    An INVALID_OPERATION error is generated by VertexArrayAttrib*Format if
    <vaobj> is not
      [compatibility profile: zero or]
    the name of an existing vertex array object.


    (Modify the introduction of BindVertexBuffer with the following, p. 317)

    The source of data for a generic vertex attribute may be determined by
    attaching a buffer object to a vertex array object with the commands

        void BindVertexBuffer(uint bindingindex, uint buffer,
                              intptr offset, sizei stride);
        void VertexArrayVertexBuffer(uint vaobj, uint bindingindex,
                                     uint buffer, intptr offset,
                                     sizei stride);

    For BindVertexBuffer, the vertex array object is the currently bound
    vertex array object. For VertexArrayVertexBuffer, <vaobj> is
      [compatibility profile:
       zero, indicating the default vertex array object, or]
    the name of the vertex array object.

    <buffer> is either zero or
      [compatibility profile: an unused name.
       core profile: a name returned by GenBuffers or CreateBuffers.]

    If <buffer> is zero, any buffer object attached to <bindingindex> is
    detached.

    If <buffer> is not the name of an existing buffer object, the GL first
    creates a new state vector, initialized with a zero-sized memory buffer
    and comprising all the state and with the same initial values listed in
    table 6.2, just as for BindBuffer. <buffer> is then attached to the
    specified <bindingindex> of the vertex array object.

    When sourcing vertex data from the buffer object, <offset> specifies the
    offset in basic machine units of the first element in the vertex buffer.
    Pointers to the <i>th and <i+1>st elements of the array differ by
    <stride> basic machine units, the pointer to the <i+1>st element being
    greater.

    If the operation is successful no change is made to the state of the
    buffer object, and any previous attachment to <bindingindex> is broken.

    Errors

      [core profile only:
    An INVALID_OPERATION error is generated by BindVertexBuffer if no vertex
    array object is bound.

    An INVALID_OPERATION error is generated if <buffer> is not zero or a
    name returned from a previous call to GenBuffers or CreateBuffers, or if
    such a name has since been deleted with DeleteBuffers.
      ]

    An INVALID_OPERATION error is generated by VertexArrayVertexBuffer if
    <vaobj> is not
      [compatibility profile: zero or]
    the name of an existing vertex array object.

    An INVALID_VALUE error is generated if <bindingindex> is greater than or
    equal to the value of MAX_VERTEX_ATTRIB_BINDINGS.

    An INVALID_VALUE error is generated if <stride> or <offset> is negative,
    or if <stride> is greater than the value of MAX_VERTEX_ATTRIB_STRIDE.


    The source of data for multiple vertex attributes may be determined by
    attaching multiple existing buffer objects to a vertex array object with
    the commands

        void BindVertexBuffers(uint first, sizei count,
                               const uint *buffers,
                               const intptr *offsets,
                               const sizei *strides);
        void VertexArrayVertexBuffers(uint vaobj, uint first, sizei count,
                                      const uint *buffers,
                                      const intptr *offsets,
                                      const sizei *strides);

    For BindVertexBuffers, the vertex array object is the currently bound
    vertex array object. For VertexArrayVertexBuffers, <vaobj> is
      [compatibility profile:
       zero, indicating the default vertex array object, or]
    the name of the vertex array object.

    <count> existing buffer objects are attached to vertex buffer binding
    points numbered <first> through <first> + <count> - 1. ...

    BindVertexBuffers is equivalent (assuming no errors are generated) to

    (Retain pseudocode example)

    except the buffers  will not be created if they do not exist.

    VertexArrayVertexBuffers is equivalent to the pseudocode above, but
    replacing BindVertexBuffer(args) with VertexArrayVertexBuffers(vaobj,
    args).

    The values specified ...

    Errors

      [core profile only:
    An INVALID_OPERATION error is generated by BindVertexBuffers if no
    vertex array object is bound.
      ]

    An INVALID_OPERATION error is generated by VertexArrayVertexBuffer if
    <vaobj> is not
      [compatibility profile: zero or]
    the name of an existing vertex array object.

    (Retain existing list of errors)


    (Modify the introduction of VertexAttribBinding with the following, p. 340)

    The association between a vertex attribute and the vertex buffer binding
    used by that attribute is set by the commands

        void VertexAttribBinding(uint attribindex, uint bindingindex);
        void VertexArrayAttribBinding(uint vaobj, uint attribindex,
                                      uint bindingindex);

    For VertexAttribBinding, the vertex array object is the currently bound
    vertex array object. For VertexArrayAttribBinding, <vaobj> is
      [compatibility profile:
       zero, indicating the default vertex array object, or]
    the name of the vertex array object.

    Errors

    An INVALID_OPERATION error is generated by VertexArrayAttribBinding if
    <vaobj> is not
      [compatibility profile: zero or]
    the name of an existing vertex array object.


    Modifications to Subsection 10.3.3, "Vertex Attribute Divisors"

    (Replace the description of VertexBindingDivisor, p. 320)

    The divisor value for attributes taken from a target vertex array object
    is set with the commands

        void VertexBindingDivisor(uint bindingindex, uint divisor);
        void VertexArrayBindingDivisor(uint vaobj, uint bindingindex,
                                       uint divisor);

    For VertexBindingDivisor, the vertex array object is the currently bound
    vertex array object. For VertexArrayBindingDivisor, <vaobj> is
      [compatibility profile:
       zero, indicating the default vertex array object, or]
    the name of the vertex array object. These commands set the divisor for
    the buffer bound to the specified <bindingindex> of the vertex array
    object to <divisor>.

    Errors

    An INVALID_OPERATION error is generated by VertexArrayBindingDivisor if
    <vaobj> is not
      [compatibility profile: zero or]
    the name of an existing vertex array object.

    An INVALID_VALUE error is generated if <bindingindex> is greater than or
    equal to the value of MAX_VERTEX_ATTRIB_BINDINGS.


    Modifications to Section 10.4, "Vertex Array Objects"

    (Move this section to subsection 10.3.1 and delete Section 10.4,
    renumber subsequent section, p. 325)

    Modifications to Section 10.5 (was 10.6), "Vertex Array and Vertex Array
    Object Queries"

    (Insert the following at the start of the section, p. 338)

    To query parameters of a vertex array object, use the command

        void GetVertexArrayiv(uint vaobj, enum pname, int *param);

    <vaobj> is
      [compatibility profile:
       zero, indicating the default vertex array object, or]
    the name of the vertex array object. The value of parameter <pname> for
    attribute <index> of <vaobj> is returned in <param>. <pname> must be
    ELEMENT_ARRAY_BUFFER_BINDING.

    Errors

    An INVALID_OPERATION error is generated if <vaobj> is not
      [compatibility profile: zero or]
    the name of an existing vertex array object.

    An INVALID_ENUM error is generated if <pname> is not
    ELEMENT_ARRAY_BUFFER_BINDING.


    To query parameters of an attribute of a vertex array object, use
    the commands

        void GetVertexArrayIndexediv(uint vaobj,
                                     uint index,
                                     enum pname,
                                     int *param);
        void GetVertexArrayIndexed64iv(uint vaobj,
                                       uint index,
                                       enum pname,
                                       int64 *param);

    <vaobj> is
      [compatibility profile:
       zero, indicating the default vertex array object, or]
    the name of the vertex array object. The value of parameter <pname> for
    attribute <index> of <vaobj> is returned in <param>.

    For GetVertexArrayIndexediv, <pname> must be one of
    VERTEX_ATTRIB_ARRAY_ENABLED, VERTEX_ATTRIB_ARRAY_SIZE,
    VERTEX_ATTRIB_ARRAY_STRIDE, VERTEX_ATTRIB_ARRAY_TYPE,
    VERTEX_ATTRIB_ARRAY_NORMALIZED, VERTEX_ATTRIB_ARRAY_INTEGER,
    VERTEX_ATTRIB_ARRAY_LONG, VERTEX_ATTRIB_ARRAY_DIVISOR, or
    VERTEX_ATTRIB_RELATIVE_OFFSET. For GetVertexArrayIndexed64iv, <pname>
    must be VERTEX_BINDING_OFFSET.

    Errors

    An INVALID_OPERATION error is generated if <vaobj> is not
      [compatibility profile: zero or]
    the name of an existing vertex array object.

    An INVALID_VALUE error is generated if <index> is greater than or equal
    to the value of MAX_VERTEX_ATTRIBS.

    An INVALID_ENUM error is generated if <pname> is not one of the valid
    values listed above for the corresponding command.


Additions to Chapter 13 of the OpenGL 4.4 (core) Specification (Fixed-Function
Vertex Post-Processing)

    Modifications to Section 13.2.2, "Transform Feedback Primitive Capture"

    (Insert the following after the description of BindTransformFeedback, p.
    398)

    New transform feedback objects may also be created with the command

        void CreateTransformFeedbacks(sizei n, uint *ids);

    CreateTransformFeedbacks returns <n> previously unused transform
    feedback object names in <ids>, each representing a new state vector,
    comprising the state and with all the same initial values listed in
    table 23.48.

    Errors

    An INVALID_VALUE error is generated by CreateTransformFeedbacks if <n>
    is negative.


    (Replace the paragraph beginning with "Regions of buffer objects are
    bound as ..." after the description of ResumeTransformFeedback, p. 400)

    Regions of buffer objects are bound as targets of the currently bound
    transform feedback object by calling one of the BindBuffer* commands
    (see sections 6.1 and 6.2) with <target> set to
    TRANSFORM_FEEDBACK_BUFFER. Alternatively, regions of buffer objects may
    be bound directly to a transform feedback object with the commands

        void TransformFeedbackBufferRange(uint xfb, uint index,
                                          uint buffer, intptr offset,
                                          sizeiptr size);
        void TransformFeedbackBufferBase(uint xfb, uint index, uint buffer);

    <xfb> must be zero or the name of an existing transform feedback object,
    and <buffer> must be the name of an existing buffer object.
    TransformFeedbackBufferRange and TransformFeedbackBufferBase behave
    similarly to BindBufferRange and BindBufferBase, respectively, except
    that the target of the operation is <xfb>, and they do not affect any
    binding to the generic TRANSFORM_FEEDBACK_BUFFER target.

    Errors

    An INVALID_OPERATION error is generated if <xfb> is not zero or the name
    of an existing transform feedback object.

    An INVALID_VALUE error is generated if <buffer> is not zero or the name
    of an existing buffer object.

    An INVALID_VALUE error is generated if <index> is greater than or equal
    to the number of binding points for transform feedback, as described in
    section 6.7.1.

    An INVALID_VALUE error is generated by TransformFeedbackBufferRange if
    <offset> is negative.

    An INVALID_VALUE error is generated by TransformFeedbackBufferRange if
    <size> is less than or equal to zero.

    An INVALID_VALUE error is generated by TransformFeedbackBufferRange if
    <offset> or <size> do not satisfy the constraints described for those
    parameters for transform feedback array bindings, as described in
    section 6.7.1.


Additions to Chapter 17 of the OpenGL 4.4 (core) Specification (Writing
Fragments and Samples to the Framebuffer)

    Modifications to Section 17.4.1, "Selecting Buffers for Writing"

    (Modify the introduction and description of DrawBuffer with the following,
    p. 467)

    The first such operation is controlling the color buffers into which each
    of the fragment color values is written. This is accomplished with one of
    DrawBuffer, NamedFramebufferDrawBuffer, DrawBuffers or
    NamedFramebufferDrawBuffers.

    The set of buffers of a framebuffer object to which fragment color zero
    is written is controlled with the commands

        void DrawBuffer(enum buf);
        void NamedFramebufferDrawBuffer(uint framebuffer, enum buf);

    For DrawBuffer, the framebuffer object is that bound to the
    DRAW_FRAMEBUFFER binding. For NamedFramebufferDrawBuffer, <framebuffer>
    is zero or the name of a framebuffer object. If <framebuffer> is zero,
    then the default framebuffer is affected.

    Errors

    An INVALID_OPERATION error is generated by NamedFramebufferDrawBuffer if
    <framebuffer> is not zero or the name of an existing framebuffer object.

    An INVALID_OPERATION error is generated if the default framebuffer is
    affected and <buf> is a value (other than NONE) that does not indicate
    one of the color buffers allocated to the default framebuffer.

    An INVALID_OPERATION error is generated if a framebuffer object is
    affected and <buf> is one of the constants from table 17.4 (other than
    NONE), or COLOR_ATTACHMENT<m> and <m> is greater than or equal to the
    value of MAX_COLOR_ATTACHMENTS.


    (Modify the introduction and description of DrawBuffers with the following,
    p. 469)

    The set of buffers of a framebuffer object to which all fragment colors
    are written is controlled with the commands

        void DrawBuffers(sizei n, const enum *bufs);
        void NamedFramebufferDrawBuffers(uint framebuffer, sizei n,
                                    const enum *bufs);

    For DrawBuffer, the framebuffer object is that bound to the
    DRAW_FRAMEBUFFER binding. For NamedFramebufferDrawBuffer, <framebuffer>
    is zero or the name of a framebuffer object. If <framebuffer> is zero,
    then the default framebuffer is affected.

    (Modify the language in the following paragraphs referring to
    "DRAW_FRAMEBUFFER_BINDING" to read "DRAW_FRAMEBUFFER_BINDING or
    <framebuffer>", p. 469)

    (Modify the sentences beginning with "If the GL is bound to" to read "If
    the referenced framebuffer is", p. 469)

    Errors

    An INVALID_OPERATION error is generated by NamedFramebufferDrawBuffers
    if <framebuffer> is not zero or the name of an existing framebuffer
    object.

    An INVALID_OPERATION error is generated if the default framebuffer is
    affected and any value in <bufs> is a constant (other than NONE or BACK)
    that does not indicate one of the color buffers allocated to the default
    framebuffer.

    An INVALID_OPERATION error is generated if a framebuffer object is
    affected and any value in <bufs> is a constant from table 17.6, or
    COLOR_ATTACHMENT<m> and <m> is greater than or equal to the value of
    MAX_COLOR_ATTACHMENTS.


    Modifications in Section 17.4.3.1, "Clearing Individual Buffers".

    (Modify the introduction of ClearBuffer{if ui}v with the following, p. 474)

    Individual buffers of a framebuffer object may be cleared with the
    commands

        void ClearBuffer{if ui}v(enum buffer, int drawbuffer, const T* value);
        void ClearNamedFramebuffer{if ui}v(uint framebuffer, enum buffer,
                                           int drawbuffer, const T* value);

    For ClearBuffer*, the framebuffer object is that bound to the
    DRAW_FRAMEBUFFER binding. For ClearNamedFramebuffer*, <framebuffer> is
    zero or the name of a framebuffer object. If <framebuffer> is zero, then
    the default framebuffer is affected.

    <buffer> and <drawbuffer> identify a buffer to clear, and <value>
    specifies the values to clear it to. The *fv, *iv, and *uiv forms of
    these commands should be used to clear fixed- and floating-point, signed
    integer, and unsigned integer color buffers respectively.

    (Retain remainder of section, but insert references to ClearFramebuffer*
    wherever there are additional references to ClearBuffer*, p. 474-475)

    (Modify the introduction of ClearBufferfi with the following, p. 475)

    Both depth and stencil buffers of a framebuffer object may be cleared
    with the commands

        void ClearBufferfi(enum buffer, int drawbuffer, float depth, int stencil);
        void ClearNamedFramebufferfi(uint framebuffer, enum buffer, int drawbuffer,
                                     float depth, int stencil);

    For ClearBufferfi, the framebuffer object is that bound to the
    DRAW_FRAMEBUFFER binding. For ClearNamedFramebufferfi, <framebuffer> is
    zero or the name of a framebuffer object. If <framebuffer> is zero, then
    the default framebuffer is affected.

    <buffer> must be DEPTH_STENCIL ...

    Errors

    An INVALID_OPERATION error is generated by ClearNamedFramebuffer* if
    <framebuffer> is not zero or the name of an existing framebuffer object.


    Modifications in Section 17.4.4, "Invalidating Framebuffer Contents"

    (Modify the introduction of InvalidateSubFramebuffer as following, p. 476)

    To signal that the GL need not preserve all contents of a framebuffer
    object (invalidating portions of every pixel or a subregion of pixels),
    use the commands

        void InvalidateSubFramebuffer(enum target, sizei numAttachments,
                                      const enum *attachments, inx x,
                                      int y, sizei width, sizei height);
        void InvalidateNamedFramebufferSubData(uint framebuffer,
                                               sizei numAttachments,
                                               const enum *attachments,
                                               int x, int y,
                                               sizei width, sizei height);

    For InvalidateSubFramebuffer, the framebuffer object is that bound to
    <target>, which must be DRAW_FRAMEBUFFER, READ_FRAMEBUFFER or
    FRAMEBUFFER. FRAMEBUFFER is equivalent to DRAW_FRAMEBUFFER. For
    InvalidateNamedFramebufferSubData, <framebuffer> is the name of the
    framebuffer object. If <framebuffer> is zero, the default draw
    framebuffer is affected.

    (Retain the remainder of the language)

    Errors

    An INVALID_OPERATION error is generated by
    InvalidateNamedFramebufferSubData if <framebuffer> is not zero or the
    name of an existing framebuffer object.


    (Modify the introduction of InvalidateFramebuffer with the following,
    p. 477)

    The commands

        void InvalidateFramebuffer(enum target, sizei numAttachments,
                                   const enum *attachments);
        void InvalidateNamedFramebufferData(uint framebuffer,
                                            sizei numAttachments,
                                            const enum *attachments);

    are equivalent to

        InvalidateSubFramebuffer(target, numAttachments, attachments,
                                 0, 0, vw, vh);

    and

        InvalidateNamedFramebufferSubData(framebuffer, numAttachments,
                                          attachments, 0, 0, vw, vh);

    respectively, where <vw> and <vh> are equal to the maximum viewport width
    and height, respectively, obtained by querying MAX_VIEWPORT_DIMS.

Additions to Chapter 18 of the OpenGL 4.4 (core) Specification (Reading and
Copying Pixels)

    Modifications in Section 18.2.1 "Selecting Buffers for Reading"

    (Modify the introduction of ReadBuffer with the following, p. 478)

    When reading pixels from a color buffer of a framebuffer object, the
    buffer selected for reading is termed the <read buffer>, and is
    controlled with the commands

        void ReadBuffer(enum src);
        void NamedFramebufferReadBuffer(uint framebuffer, enum src);

    For ReadBuffer, the framebuffer object is that bound to
    READ_FRAMEBUFFER. For NamedFramebufferReadBuffer, <framebuffer> is zero
    or the name of the framebuffer object. If <framebuffer> is zero, the
    default read framebuffer is affected.

    If the default framebuffer is affected (see chapter 9), <src> must be
    one of the values listed in table 17.4 ...

    If a framebuffer object is affected, <src> must be one of the values
    listed in table 17.5 ...

    (Retain the remainder of this section)

    Errors

    An INVALID_OPERATION error is generated by NamedFramebufferReadBuffer if
    <framebuffer> is not zero or the name of an existing framebuffer object.

    An INVALID_OPERATION error is generated if the default framebuffer is
    affected, and <src> is a value (other than NONE) that does not indicate
    any of the color buffers allocated to the default framebuffer.

    An INVALID_OPERATION error is generated if a framebuffer object is
    affected, <src> is one of the constants from table 17.4 (other than
    NONE, or COLOR_ATTACHMENTm where m is greater than or equal to the value
    of MAX_COLOR_ATTACHMENTS.



    Modifications in Section 18.3.1 "Blitting Pixel Rectangles"

    (Modify the introduction of BlitFramebuffer with the following, p. 487)

    To transfer a rectangle of pixel values from one region of a source
    framebuffer to another region of a destination framebuffer, use the
    commands The commands

        void BlitFramebuffer(int srcX0, int srcY0,
                             int srcX1, int srcY1,
                             int dstX0, int dstY0,
                             int dstX1, int dstY1,
                             bitfield mask, enum filter);
        void BlitNamedFramebuffer(uint readFramebuffer, uint drawFramebuffer,
                                  int srcX0, int srcY0,
                                  int srcX1, int srcY1,
                                  int dstX0, int dstY0,
                                  int dstX1, int dstY1,
                                  bitfield mask, enum filter);

    For BlitFramebuffer, the source and destination framebuffers are those
    bound to READ_FRAMEBUFFER and DRAW_FRAMEBUFFER respectively. For
    BlitNamedFramebuffer, <readFramebuffer> and <drawFramebuffer> are the
    names of the source and destination framebuffers respectively.

    If no framebuffer is bound to READ_FRAMEBUFFER or DRAW_FRAMEBUFFER (for
    BlitFramebuffer), or if <readFramebuffer> or <drawFramebuffer> is zero
    (for BlitNamedFramebuffer), then the default read or draw framebuffer is
    used as the corresponding source or destination framebuffer,
    respectively.

    <mask> is zero or the bitwise OR ...

    (Retain the remainder of this section)

    Errors

    An INVALID_OPERATION error is generated by BlitNamedFramebuffer if
    <readFramebuffer> or <drawFramebuffer> is not zero or the name of an
    existing framebuffer object.


Additions to Chapter 22 of the OpenGL 4.4 (core) specification, "Context State
Queries"

    (Add Subsection 22.4, "Transform Feedback State Queries", p. 527)

    State of the currently bound transform feedback object may be queried by
    calling GetIntegerv, GetIntegeri_v, GetInteger64i_v, GetBooleanv, or
    other simple query functions with <pname> set to one of the tokens
    listed in table 23.48.

    Alternatively, the state of a transform feedback object may be queried
    with the commands

        void GetTransformFeedbackiv(uint xfb, enum pname, int *param);

        void GetTransformFeedbacki_v(uint xfb, enum pname, uint index,
                                     int *param);

        void GetTransformFeedbacki64_v(uint xfb, enum pname, uint index,
                                       int64 *param);

    <xfb> must be zero, indicating the default transform feedback object, or
    the name of an existing transform feedback object. <pname> must be one
    of the tokens listed in table 23.48, depending on the command name as
    shown in the errors section below. For indexed state, <index> is the
    index of the transform feedback stream. <param> is the address of a
    variable to receive the result of the query.

    Errors

    An INVALID_OPERATION error is generated by GetTransformFeedbackiv,
    GetTransformFeedbacki_v and GetTransformFeedbacki64_v if <xfb> is not
    zero or the name of an existing transform feedback object.

    An INVALID_ENUM error is generated by GetTransformFeedbackiv if <pname>
    is not TRANSFORM_FEEDBACK_PAUSED or TRANSFORM_FEEDBACK_ACTIVE.

    An INVALID_ENUM error is generated by GetTransformFeedbacki_v if <pname>
    is not TRANSFORM_FEEDBACK_BUFFER_BINDING.

    An INVALID_ENUM error is generated by GetTransformFeedbacki64_v if
    <pname> is not TRANSFORM_FEEDBACK_BUFFER_START or
    TRANSFORM_FEEDBACK_BUFFER_SIZE.

    An INVALID_VALID error is generated by GetTransformFeedbacki_v and
    GetTransformFeedbacki64_v if <index> is greater than or equal to the
    number of binding points for transform feedback, as described in section
    6.7.1.


    (Add Subsection 22.5, "Indexed Binding State Queries", p. 527)

    The name of the texture object bound to the active texture unit may be
    queried by calling GetIntegerv with <pname> TEXTURE_BINDING_1D,
    TEXTURE_BINDING_1D_ARRAY, TEXTURE_BINDING_2D, TEXTURE_BINDING_2D_ARRAY,
    TEXTURE_BINDING_2D_MULTISAMPLE, TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY,
    TEXTURE_BINDING_3D, TEXTURE_BINDING_BUFFER, TEXTURE_BINDING_CUBE_MAP,
    TEXTURE_BINDING_CUBE_MAP_ARRAY, or TEXTURE_BINDING_RECTANGLE.
    Likewise, the current sampler bound to the active
    texture unit may be queried by calling GetIntegerv with <pname>
    SAMPLER_BINDING.

    To query the bound texture or sampler object bound to a specific texture
    unit without changing the active texture selector, call GetIntegeri_v
    with one of the valid <pname>s listed above, and with <index> set to the
    zero-based texture unit index to be queried.

Additions to the AGL/GLX/WGL Specifications

    TBD.

GLX Protocol

    TBD.

New State

    Append to Table 23.15, "Textures (state per texture object)"

    +-----------------------------------+-------+------------------------+---------------------+------------------------------------+---------+
    | Get Value                         | Type  | Get Command            | Initial Value       | Description                        | Sec.    |
    +-----------------------------------+-------+------------------------+---------------------+------------------------------------+---------+
    | TEXTURE_TARGET                    | E     | GetTexParameteriv      | NONE                | Target of texture object           | 8.11    |
    |                                   |       | GetTextureParameteriv  |                     |                                    |         |
    +-----------------------------------+-------+------------------------+---------------------+------------------------------------+---------+


    Append to Table 23.44, "Query Object State"

    +-----------------------------------+-------+--------------------+--------------------------------+------------------------------------+---------+
    | Get Value                         | Type  | Get Command        | Initial Value                  | Description                        | Sec.    |
    +-----------------------------------+-------+--------------------+--------------------------------+------------------------------------+---------+
    | QUERY_TARGET                      | E     | GetQueryObjectiv   | NONE                           | Target of query object             | 4.2     |
    +-----------------------------------+-------+--------------------+--------------------------------+------------------------------------+---------+


Modified state tables

    Modify Table 23.3, "Vertex Array Object State"

    Add GetVertexArrayAttribiv in 'Get Command' for
    VERTEX_ATTRIB_ARRAY_ENABLED,
    VERTEX_ATTRIB_ARRAY_SIZE,
    VERTEX_ATTRIB_ARRAY_STRIDE,
    VERTEX_ATTRIB_ARRAY_TYPE,
    VERTEX_ATTRIB_ARRAY_NORMALIZED,
    VERTEX_ATTRIB_ARRAY_INTEGER,
    VERTEX_ATTRIB_ARRAY_LONG,
    VERTEX_ATTRIB_ARRAY_DIVISOR, and
    VERTEX_ATTRIB_RELATIVE_OFFSET states


    Modify Table 23.4, "Vertex Array Object State"

    Add GetVertexArrayiv in 'Get Command' for
    ELEMENT_ARRAY_BUFFER_BINDING state

    Add GetVertexArrayIndexediv in 'Get Command' for
    VERTEX_ATTRIB_ARRAY_BUFFER_BINDING
    VERTEX_ATTRIB_BINDING,
    VERTEX_ATTRIB_RELATIVE_OFFSET,
    VERTEX_BINDING_OFFSET, and
    VERTEX_BINDING_STRIDE states

    Add GetVertexArrayIndexed64iv in 'Get Command' for
    VERTEX_BINDING_OFFSET state


    Modify Table 23.6, "Buffer Object State"

    Add GetNamedBufferSubData in 'Get Command' for
    the entry described as "Buffer data".

    Add GetNamedBufferParameteri64v in 'Get Command' for
    BUFFER_USAGE,
    BUFFER_ACCESS,
    BUFFER_ACCESS_FLAGS, and
    BUFFER_MAP_LENGTH states

    Add GetNamedBufferParameteriv in 'Get Command' for
    BUFFER_SIZE,
    BUFFER_MAP_OFFSET,
    BUFFER_MAP_LENGTH,
    BUFFER_IMMUTABLE_STORAGE,
    BUFFER_STORAGE_FLAGS, and
    BUFFER_MAPPED states

    Add GetNamedBufferPointerv in 'Get Command' for
    BUFFER_MAP_POINTER state


    Modify Table 23.12, "Textures (state per texture unit)"

    Add GetIntegeri_v in 'Get Command' for
    TEXTURE_BINDING_1D,
    TEXTURE_BINDING_1D_ARRAY,
    TEXTURE_BINDING_2D,
    TEXTURE_BINDING_2D_ARRAY,
    TEXTURE_BINDING_2D_MULTISAMPLE,
    TEXTURE_BINDING_2D_MULTISAMPLE_ARRAY
    TEXTURE_BINDING_3D,
    TEXTURE_BINDING_BUFFER,
    TEXTURE_BINDING_CUBE_MAP,
    TEXTURE_BINDING_CUBE_MAP_ARRAY, and
    TEXTURE_BINDING_RECTANGLE states


    Modify Table 23.14, "Textures (state per texture object)"

    Add GetTextureParameteriv in 'Get Command' for
    TEXTURE_SWIZZLE_R,
    TEXTURE_SWIZZLE_G,
    TEXTURE_SWIZZLE_B,
    TEXTURE_SWIZZLE_A,
    TEXTURE_MIN_FILTER,
    TEXTURE_MAG_FILTER,
    TEXTURE_WRAP_S,
    TEXTURE_WRAP_T,
    TEXTURE_WRAP_R,
    DEPTH_STENCIL_TEXTURE_MODE,
    TEXTURE_COMPARE_MODE,
    TEXTURE_COMPARE_FUNC,
    IMAGE_FORMAT_COMPATIBILITY_TYPE,
    TEXTURE_IMMUTABLE_FORMAT,
    TEXTURE_IMMUTABLE_LEVELS,
    TEXTURE_VIEW_MIN_LEVEL,
    TEXTURE_VIEW_NUM_LEVELS,
    TEXTURE_VIEW_MIN_LAYER and
    TEXTURE_VIEW_NUM_LAYERS states

    Add GetTextureParameterfv in 'Get Command' for
    TEXTURE_BORDER_COLOR,
    TEXTURE_MIN_LOD,
    TEXTURE_MAX_LOD,
    TEXTURE_BASE_LEVEL,
    TEXTURE_MAX_LEVEL and
    TEXTURE_LOD_BIAS states.


    Modify Table 23.16 and 2317, "Textures (state per texture image)"

    Add GetTextureLevelParameterv in 'Get Command' for each state of
    the table.


    Modify Table 23.25. "Framebuffer (state per attachment point)"

    Add GetNamedFramebufferAttachmentParameteriv in 'Get Command'
    for each state of the table.


    Modify Table 23.27. "Renderbuffer (state per renderbuffer object)"

    Add GetNamedRenderbufferParameteriv in 'Get Command' for
    RENDERBUFFER_WIDTH,
    RENDERBUFFER_HEIGHT,
    RENDERBUFFER_INTERNAL_FORMAT,
    RENDERBUFFER_RED_SIZE,
    RENDERBUFFER_GREEN_SIZE,
    RENDERBUFFER_BLUE_SIZE,
    RENDERBUFFER_ALPHA_SIZE,
    RENDERBUFFER_DEPTH_SIZE,
    RENDERBUFFER_STENCIL_SIZE, and
    RENDERBUFFER_SAMPLES states


    Modify Table 23.48, "Transform Feedback State"

    Add GetTransformFeedbackiv in 'Get Command' for
    TRANSFORM_FEEDBACK_BUFFER_BINDING,
    TRANSFORM_FEEDBACK_PAUSED and
    TRANSFORM_FEEDBACK_ACTIVE states

    Add GetTransformFeedbacki64_v in 'Get Command' for
    TRANSFORM_FEEDBACK_BUFFER_START and
    TRANSFORM_FEEDBACK_BUFFER_SIZE states

    Add GetTransformFeedbacki_v in 'Get Command' for
    TRANSFORM_FEEDBACK_BUFFER_BINDING state


New Implementation Dependent State

    None.

Usage Examples

    Example 1:
        // Bind to Edit
        void streamChunks(const Chunks & chunks)
        {
            GLuint restore = 0;
            glGetIntegerv(GL_ARRAY_BUFFER_BINDING, restore)
            glBindBuffer(GL_ARRAY_BUFFER, chunks.buffer());

            uint8* pointer = reinterpret_cast<uint8*>(glMapBufferRange(
              GL_ARRAY_BUFFER, 0, chunks.size(), GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT));

            for(std::size_t i = 0; i < chunks.count(); ++i)
            {
                // Do something
                glFlushMappedBufferRange(GL_ARRAY_BUFFER, chunks.offset(), chunks.length());
            }

            glUnmapNamedBuffer(GL_ARRAY_BUFFER);
            glBindBuffer(GL_ARRAY_BUFFER, restore);
        }

        // Direct State Access, stream while rendering, no rendering state polution
        void streamChunks(const Chunks & chunks)
        {
            uint8* pointer = reinterpret_cast<uint8*>(glMapNamedBufferRange(
              chunks.buffer(), 0, chunks.size(), GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT));

            for(int i = 0; i < chunks.count(); ++i)
            {
                // Do something
                glFlushMappedNamedBufferRange(chunks.buffer(), chunks.offset(), chunks.length());
            }

            glUnmapNamedBuffer(chunks.buffer());
        }

    Example 2: Creating a buffer object without polluting the OpenGL states

        // Bind to Create
        GLuint CreateBuffer()
        {
          // Save the previous bound buffer
          GLuint restoreBuffer = 0;
          glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &restoreBuffer);

          // Reserve the buffer name and create the buffer object
          uint buffer = 0;
          glGenBuffers(1, &buffer);
          glBindBuffer(GL_ARRAY_BUFFER, buffer);

          // Restaure the previous bound buffer to avoid polluting
          // the rendering states
          glBindBuffer(GL_ARRAY_BUFFER, restoreBuffer);

          return buffer;
        }

        // Direct State Access
        GLuint CreateBuffer()
        {
          GLuint buffer = 0;
          glCreateBuffer(1, &buffer);

          return buffer;
        }

    Example 3: Creating a vertex array object without polluting the OpenGL states

        // OpenGL 3.0 Bind to Create for vertex array object
        GLuint CreateVertexArray(GLuint BufferName[])
        {
          // Save the previous bound vertex array and array buffer
          GLuint restoreVertexArray = 0;
          glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &restoreVertexArray);
          GLuint restoreBuffer = 0;
          glGetIntegerv(GL_ARRAY_BUFFER_BINDING, &restoreBuffer);

          glGenVertexArrays(1, &VertexArrayName);
          glBindVertexArray(VertexArrayName);
            glEnableVertexAttribArray(semantic::attr::POSITION);
            glEnableVertexAttribArray(semantic::attr::TEXCOORD);

            glBindBuffer(GL_ARRAY_BUFFER, BufferName[buffer::VERTEX]);
            glVertexAttribPointer(semantic::attr::POSITION, 2, GL_FLOAT, GL_FALSE, sizeof(glf::vertex_v2fv2f), BUFFER_OFFSET(0));
            glVertexAttribPointer(semantic::attr::TEXCOORD, 2, GL_FLOAT, GL_FALSE, sizeof(glf::vertex_v2fv2f), BUFFER_OFFSET(sizeof(glm::vec2)));

            glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, BufferName[buffer::ELEMENT]);

          // The GL_ARRAY_BUFFER_BINDING is a context state, not a vertex array state.
          glBindBuffer(GL_ARRAY_BUFFER, restoreBuffer);
          glBindVertexArray(restoreVertexArray);

          return vertexArrayName;
        }

        // OpenGL 4.3 Bind to Create for vertex array object
        GLuint CreateVertexArray(GLuint BufferName[])
        {
          // Save the previous bound vertex array
          GLuint restoreVertexArray = 0;
          glGetIntegerv(GL_VERTEX_ARRAY_BINDING, &restoreVertexArray);

          GLuint vertexArrayName = 0;
          glGenVertexArrays(1, &vertexArrayName);
          glBindVertexArray(VertexArrayName);
            glEnableVertexAttribArray(semantic::attr::POSITION);
            glEnableVertexAttribArray(semantic::attr::TEXCOORD);

            glVertexAttribBinding(semantic::attr::POSITION, 0);
            glVertexAttribFormat(semantic::attr::POSITION, 2, GL_FLOAT, GL_FALSE, 0);

            glVertexAttribBinding(semantic::attr::TEXCOORD, 0);
            glVertexAttribFormat(semantic::attr::TEXCOORD, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2);

            glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, BufferName[buffer::ELEMENT]);
            glBindVertexBuffer(0, BufferName[buffer::VERTEX], 0, 0);
          glBindVertexArray(restoreVertexArray);

          return vertexArrayName;
        }

        // Direct State Access
        GLuint CreateVertexArray(GLuint BufferName[])
        {
          GLuint vertexArrayName = 0;
          glCreateVertexArrays(1, &vertexArrayName);

          glEnableVertexArrayAttrib(VertexArrayName, semantic::attr::POSITION);
          glEnableVertexArrayAttrib(VertexArrayName, semantic::attr::TEXCOORD);

          glVertexArrayAttribBinding(VertexArrayName, semantic::attr::POSITION, 0);
          glVertexArrayAttribFormat(VertexArrayName, semantic::attr::POSITION, 2, GL_FLOAT, GL_FALSE, 0);

          glVertexArrayAttribBinding(VertexArrayName, semantic::attr::TEXCOORD, 0);
          glVertexArrayAttribFormat(VertexArrayName, semantic::attr::TEXCOORD, 2, GL_FLOAT, GL_FALSE, sizeof(float) * 2);

          glVertexArrayElementBuffer(VertexArrayName, BufferName[buffer::ELEMENT]);
          glVertexArrayVertexBuffer(VertexArrayName, 0, BufferName[buffer::VERTEX], 0, 0);

          return vertexArrayName;
        }

    Example 4: Querying the bound texture to a texture image unit for debugging

        // Select to query
        // We need the <target> or we need to loop over all the possible targets
        GLuint GetBoundTexture(GLenum target, GLuint unit)
        {
          GLuint restore = 0;
          glGetIntegerv(GL_ACTIVE_TEXTURE, &restore);

          glActiveTexture(unit);

          GLuint name = 0;
          glGetIntegerv(target, &name);

          glActiveTexture(restore);
        }

        // Direct State Access
        // target_binding is e.g. GL_TEXTURE_BINDING_2D for the 2D texture
        GLuint GetBoundTexture(GLenum target_binding, GLuint unit)
        {
          GLuint name = 0;
          glGetIntegeri_v(target_binding, unit, &name);
          return name;
        }

Transistioning guide to ARB_direct_state_access

    This section is only for the purpose of transistioning an application to
    the modern direct state access approach. It is not part of the specification
    as such.

    TBD.

Interactions with OpenGL 3.0 or ARB_framebuffer_object

    If neither OpenGL 3.0 nor ARB_framebuffer_object are supported,
    ignore the support for GenerateTextureMipmap, NamedFramebufferRenderbuffer,
    NamedFramebufferTexture, NamedFramebufferTextureLayer,
    NamedFramebufferDrawBuffer, NamedFramebufferDrawBuffers,
    NamedFramebufferReadBuffer, ClearNamedFramebufferiv,
    ClearNamedFramebufferuiv, ClearNamedFramebufferfv, ClearNamedFramebufferfi,
    BlitNamedFramebuffer, GetNamedFramebufferAttachmentParameteriv,
    CheckNamedFramebufferStatus, CreateRenderbuffers, NamedRenderbufferStorage,
    NamedRenderbufferStorageMultisample and GetNamedRenderbufferParameteriv.

Interactions with OpenGL 3.0 or ARB_map_buffer_range

    If neither OpenGL 3.0 nor ARB_map_buffer_range are supported,
    ignore the support for MapNamedBufferRange and FlushMappedNamedBufferRange

Interactions with OpenGL 3.0 or ARB_vertex_array_object

    If neither OpenGL 3.0 nor ARB_vertex_array_object are supported,
    ignore the support for CreateVertexArrays, DisableVertexArrayAttrib,
    EnableVertexArrayAttrib, VertexArrayElementBuffer, GetVertexArrayiv,
    and GetVertexArrayIndexediv.

Interactions with OpenGL 3.1 or ARB_copy_buffer

    If neither OpenGL 3.1 nor ARB_copy_buffer are supported,
    ignore the support for CopyNamedBufferSubData.

Interactions with OpenGL 3.3 or ARB_instanced_arrays

    If neither OpenGL 3.3 nor ARB_instanced_arrays are supported,
    ignore the support for VertexArrayAttribDivisor and
    VertexArrayBindingDivisor.

Interactions with OpenGL 3.3 or ARB_sampler_objects

    If neither OpenGL 4.1 nor ARB_separate_shader_objects are supported,
    ignore the support for CreateSamplers.

Interactions with OpenGL 4.0 or ARB_transform_feedback2

    If neither OpenGL 4.0 nor ARB_transform_feedback2 are supported,
    ignore the support for CreateTransformFeedbacks, GetTransformFeedbackiv,
    GetTransformFeedbacki_v, GetTransformFeedbacki64_v, and TextureBuffer.

Interactions with OpenGL 4.1 or ARB_vertex_attrib_64bit

    If neither OpenGL 4.1 nor ARB_vertex_attrib_64bit are supported,
    ignore the support for VertexArrayAttribLFormat.

Interactions with OpenGL 4.1 or ARB_separate_shader_objects

    If neither OpenGL 4.1 nor ARB_separate_shader_objects are supported,
    ignore the support for CreateProgramPipelines.

Interactions with OpenGL 4.2 or ARB_texture_storage

    If neither OpenGL 4.2 nor ARB_texture_storage are supported,
    ignore the support for TextureStorage1D, TextureStorage2D and
    TextureStorage3D.

Interactions with OpenGL 4.3 or ARB_texture_storage_multisample

    If neither OpenGL 4.2 nor ARB_texture_storage are supported,
    ignore the support for TextureStorage2DMultisample and
    TextureStorage3DMultisample.

Interactions with OpenGL 4.3 or ARB_vertex_attrib_binding

    If neither OpenGL 4.3 nor ARB_vertex_attrib_binding are supported,
    ignore the support for VertexArrayVertexBuffer, VertexArrayAttribFormat,
    VertexArrayAttribIFormat, VertexArrayAttribLFormat,
    VertexArrayAttribBinding, VertexArrayBindingDivisor.

Interactions with OpenGL 4.3 or ARB_invalidate_subdata

    If neither OpenGL 4.3 nor ARB_invalidate_subdata are supported,
    ignore the support for InvalidateNamedFramebufferData and
    InvalidateNamedFramebufferSubData.

Interactions with OpenGL 4.3 or ARB_texture_buffer_range

    If neither OpenGL 4.3 nor ARB_texture_buffer_range are supported,
    ignore the support for TextureBufferRange.

Interactions with OpenGL 4.3 or ARB_clear_buffer_object

    If neither OpenGL 4.3 nor ARB_clear_buffer_object are supported,
    ignore the support for ClearNamedBufferData and ClearNamedBufferSubData.

Interactions with OpenGL 4.3 or ARB_framebuffer_no_attachments

    If neither OpenGL 4.3 nor ARB_framebuffer_no_attachments are supported,
    ignore the support for NamedFramebufferParameteri and GetNamedFramebufferParameteriv.

Interactions with OpenGL 4.4 or ARB_buffer_storage

    If neither OpenGL 4.3 nor ARB_buffer_storage are supported,
    ignore the support for NamedBufferStorage.

Interactions with OpenGL 4.4 or ARB_clear_texture

    If neither OpenGL 4.4 nor ARB_clear_texture are supported,
    ignore the support for ClearNamedBufferData and ClearNamedBufferSubData.

Interactions with OpenGL 4.4 or ARB_multi_bind

    If neither OpenGL 4.4 nor ARB_multi_bind are supported,
    ignore the support for VertexArrayVertexBuffers.

Interactions with OpenGL 4.4 or ARB_query_buffer_object

     If neither OpenGL 4.4 nor ARB_query_buffer_object are supported, ignore
     the support for GetQueryBufferObjectiv, GetQueryBufferObjectuiv,
     GetQueryBufferObjecti64v and GetQueryBufferObjectui64v.

TODO

    Document more errors. Currently, only the errors that check the new
    parameters are documented. Errors for parameters equivalent to the non-DSA
    versions of functions are not documented.

    Add Usage Examples
    Add Transitioning guide to ARB_direct_state_access
    Add language for 9.2.3 Framebuffer Object Queries
    Describe bufSize

    Issues left: 0

    What vendors extensions, vendor needs to resolve interaction with ARB_direct_state_access

Issues

    0) What are the difference between ARB_direct_state_access and
       EXT_direct_state_access?

       <TBD>

    1) Should MultiBind be the only way to bind functions in DSA?

       Do we need BindTextureUnit to replace the couple ActiveTexture and
       BindTexture? Do we need both VertexArrayVertexBuffer and
       VertexArrayVertexBuffers?

       RESOLVED: No, both approaches are arguably valuable, add
       BindTextureUnit, VertexArrayVertexBuffer and
       VertexArrayVertexBuffers.

    2) NamedBufferData (and the corresponding function from the original EXT)
       do not include the <target> parameter. Does implementations may make
       initial assumptions about the usage of a data store based on this
       parameter. Where did it go? Should we bring it back?

       RESOLVED: No need for a target parameter for buffer. Implemetations
       don't make usage assumption based on the <target> parameter. Only one
       vendor extension do so AMD_pinned_memory. A for consistent approach
       to specify a buffer usage would be to add a new flag for that <flags>
       parameter of BufferStorage.

    3) Do we need <target> parameters to all the APIs? There are several APIs
       that either only allow one value, or for which the <target> parameter
       is of debatable worth.

       RESOLVED: Only keep the target parameter when it is functional.

    4) Do we need a <target> for query object creation?

       RESOLVED: Yes. You can immediately query a result, and the number of
       bytes written depends on the target.

    5) This extension omits TextureImageND (mutable texture definitions), but
       includes CompressedTextureImageND (mutable, compressed texture). Why?
       Can't we have immutable compressed textures?

       RESOLVED: The core specification does not include
       CompressedTexStorageND, only CompressedTexImageND because immutable
       textures created with TextureStorageND can be both compressed and
       uncompressed.

    6) Do TransformFeedbackBufferBase and TransformFeedbackBufferRange need
       a <target> parameter, as the only acceptable value should be
       TRANSFORM_FEEDBACK_BUFFER?

       RESOLVED: No.

    7) Do TransformFeedbackBufferBase and TransformFeedbackBufferRange also
       bind the buffer to the generic TRANSFORM_FEEDBACK_BUFFER target as
       well as the indexed one as BindBuffer{Base/Range} would?

       RESOLVED: No.

    8) Do we need the support for query conversions for DSA queries?

       For example, with the default transform feedback we can retrive the
       state values for TRANSFORM_FEEDBACK_BUFFER_START and
       TRANSFORM_FEEDBACK_BUFFER_SIZE using GetDoublev.

       RESOLVED: No.

    9) The language for VertexArrayVertexBuffer is inserted in subsection
       10.3.1 after BindVertexBuffer, but vertex array objects are not
       introduced until 10.4 - after all the state that they encapsulate.
       This is backwards. We should probably give a brief overview of what
       vertex arrays are (first paragraph or so of 10.3), followed by
       introducing the VAO itself ("All the state required to represent
       vertex arrays is stored in a VAO. Blah blah."), followed by most of
       section 10.4, followed by all the state that's in the VAO (what is
       currently section 10.3). This allows the clean introduction of all
       vertex array state in both DSA and direct-to-context form. Should we
       make this change?

       RESOLVED: YES. This draft moves section 10.4 to a new subsection at
       the start of section 10.3 and deletes the original 10.4. This allows
       the remainder of section 10.3 to refer back to VAOs.

    10) What should be called GetVertexArrayIntegeri_v?

        This name is inconsistent with OpenGL convensions and there are
        already two precedent in the specification

        A/ In the core specification and alternative to "i" for indexed is to
        use "Indexed", but there is no precedent for the
        GetVertexArrayIntegeri_v construct.

        glDepthRangeIndexed
        glEndQueryIndexed
        glGetQueryIndexediv
        glScissorIndexedv
        glViewportIndexedfv

        Following this precedent for GetVertexArrayIntegeri_v and rename it
        GetVertexArrayIndexediv.

        B/ Another precedent is:

        void glGetVertexAttribIiv(GLuint index, GLenum pname, GLint *params);

        "Iiv" is not very explicit out of context.

        RESOLVED: GetVertexArrayIndexediv

    11) Do we need GetVertexArrayAttribPointerv?

        RESOLVED: No. Following the line of the resolution of issue 31, if we
        don't provide a DSA API for VertexAttrib*Pointer, there is no client
        vertex array support and pointer to query, hence this function as no
        purpose.

    12) What's the purpose of the new Create* API?

        With the Gen* API, objects are not created, only an object name is
        reserved. The actual operation creating the object happen after and
        may require additional informations: texture and query object requires
        a target to create the approciate data store.

        The following function can create actually object:
        BindTexture
        BindBuffer
        BindFramebuffer
        BindVertexArray
        BindProgramPipeline
        BindRenderbuffer
        FenceSync
        BeginQuery*
        QueryCounter
        SamplerParameter*
        UseProgramStages

        The Create* API is an alternative to the Gen* + Call approach to
        create an object where the object is created when its name is
        reserved.

    13) What should GetTransformFeedbackBooleanv be called?

        RESOLVED: We don't need it! The OpenGL specification doesn't have
        precedent for GetTransformFeedbackBooleanv but there are boolean
        states. For example VERTEX_ATTRIB_ARRAY_ENABLED is queried with
        GetVertexAttribiv of GetVertexArrayiv

    14) Does InvalidateNamedFramebufferData and
        InvalidateNamedFramebufferSubData need a <target> parameter?

        RESOLVED: No. For Invalidate{Sub,}Framebuffer the <target> parameter is
        only used to select between the framebuffer at the read binding point
        and the one at the draw binding point. Since the framebuffer being
        invalidated is identified directly by the <framebuffer> parameter, no
        <target> is necessary.

    15) What should we do with the PixelStore?

        They have that B2E flavor except that instead of binding an object
        to edit it, we need to query/set states to edit some objects like
        selectors. Just like B2E, there are generating side effects in
        applications. Hence, it is worth to investigate how we could DSA
        PixelStore.

        PixelStore interacts with TextureSubImage*, CompressedTextureSubImage*
        functions that we are adding in this extension, and ReadPixels.

        Possible solutions for this issue:
        a) Add a pointer parameter to the functions concerned taking a
           structure. with all the pixel store states. If null is passed,
           use the default pixel store states.

        b) A pixel store object. (hard to imagine, different from other APIs,
           where to store those in an engine?)

        c) Adding pixel store states to the texture object.

        An alternative would be allowing the user to submit a structure with
        all the pixel store parameters.

        The interactions with sparse textures make it PixelStore particularly
        interesting.

        RESOLVED: The primary motivation for this extension is getting rid of
        selectors. Pixel store parameters are just global state. Fixing that
        is beyond the scope of this extension (and there is a lot of other
        state too!).

    16) Do we need DSA for UniformSubroutinesuiv?

        RESOLVED: Deferred. Do subroutines have a future?

    17) How do we resolve the inconsistency between Create* and Gen* APIs?

        The Create API is typically equivalent to the Gen API and Binding
        the object.

        For example:
        // Direct State Access
        uint buffer;
        CreateBuffer(1, &buffer);

        Is the logical equivalent to:

        // Bind to Edit
        uint restoreBuffer;
        GetIntegerv(ARRAY_BUFFER_BINDING, &restoreBuffer);
        uint buffer;
        GenBuffers(1, &buffer);
        BindBuffer(ARRAY_BUFFER, buffer);
        BindBuffer(ARRAY_BUFFER, restoreBuffer);

        Typically with DSA objects are created with [Create] while [Gen+Bind]
        is used to create the objects with B2E. Unfortunately, [Gen+Bind]
        is not systematic:

        In OpenGL 4.4, here is the functions that create objects:
        - BindTexture
        - BindBuffer
        - BindProgramPipeline
        - BindRenderbuffer
        - BindSampler
        - UseProgramStages
        - SamplerParameter*
        - GetSamplerParameter*
        - IsSampler
        - BeginQuery
        - BeginQueryIndexed
        - QueryCounter

        Effectively, the sampler object behaves as if it was created at Gen*.

        The query API is resolved with CreateQueries that effectively
        creates the query object with a target that can also be TIMESTAMP
        which is used with QueryCounter with the Gen* method.

        An approach to make the B2E API more consistent without breaking
        compatibility would be allowing any program pipeline function to
        create the program pipeline object so that effectively
        GenProgramPipelines would behave like CreateProgramPipelines.

        RESOLVED: Only the Create* API provide a consistent behaviour.

        We can't really fix the Gen* consistency but all the DSA functions
        behave identically if we use the Create* API. That is:

        1/ The object is effectively created by Create*
        2/ A DSA function modifying an object, won't generated an invalid
           operation error if that object was created with the corresponding
           Create* function and if that object was deleted by the
           corresponding Delete* function.

    18) Should we take the DSA effort further to improve API consistency
        further so that we could have a clear message so say "this is the
        DSA API"?

        All the DSA functions could have the prefix "DSA" so that if we want
        an understandable message for the community would be:

        "All the DSA functions starts by glDSA".

        Considering the request for clarity by the OpenGL community, it seems
        valuable to consider this idea.

        However, a lot of the DSA API is already in the core specification.
        To provide this API consistency, we would need to create aliases for
        existing functions.

        Propose changes:
        1/ Rename all functions introduced by this extension removing
           "Named" and adding the prefix "DSA"
        2/ Add aliases to the following DSA functions already in core:

        ClearTexImage -> DSAClearTexImage
        ClearTexSubImage -> DSAClearTexSubImage
        InvalidateTexSubImage -> DSAInvalidateTexSubImage
        InvalidateTexImage -> DSAInvalidateTexImage
        InvalidateBufferSubData -> DSAInvalidateBufferSubData
        InvalidateBufferData -> DSAInvalidateBufferData
        CompileShader -> DSACompileShader
        TextureView -> DSATexView
        CopyImageSubData -> DSACopyImageSubData
        UseProgramStages -> DSAProgramPipelineStages
        ProgramParameteri -> DSAProgramParameteri
        ProgramUniform* -> DSAProgramUniform*
        ProgramBinary -> DSAProgramBinary
        LinkProgram -> DSALinkProgram
        GetProgramBinary -> DSAGetProgramBinary
        GetProgramInfoLog -> DSAGetProgramInfoLog
        CreateShaderProgram -> DSACreateShaderProgram
        SamplerParameter* -> DSASamplerParameter*
        GetSamplerParameter* -> DSAGetSamplerParameter*
        ValidateProgramPipeline -> DSAValidateProgramPipeline
        UseProgramStages -> DSAProgramPipelineStages
        GetProgramPipelineInfoLog -> DSAGetProgramPipelineInfoLog
        GetProgramInterfaceiv -> DSAGetProgramInterfaceiv
        GetProgramResourceIndex -> DSAGetProgramResourceIndex
        GetProgramResourceName -> DSAGetProgramResourceName
        GetProgramResourceiv -> DSAGetProgramResourceiv
        GetProgramResourceLocation -> DSAGetProgramResourceLocation
        GetProgramResourceLocationIndex -> DSAGetProgramResourceLocationIndex
        GetAttachedShaders -> DSAGetAttachedShaders
        GetShaderiv -> DSAGetShaderiv
        GetShaderSource -> DSAGetShaderSource
        GetShaderPrecisionFormat -> DSAGetShaderPrecisionFormat
        GetProgramInfoLog -> DSAGetProgramInfoLog
        GetUniformfv -> DSAGetUniformfv
        GetUniformiv -> DSAGetUniformiv
        GetUniformuiv -> DSAGetUniformuiv
        GetUniformdv -> DSAGetUniformdv
        GetProgramStageiv -> DSAGetProgramStageiv

        CreateShader -> DSACreateShaders
        CreateProgram -> DSACreatePrograms

        GetSynciv -> DSAGetSynciv
        FenceSync -> DSAFenceSync
        WaitSync -> DSAWaitSync
        ClientWaitSync -> DSAClientWaitSync

        Do we want to add delete functions?

        RESOLVED: No. Some people liked this, some didn't. Some liked the
        prefix idea, but not the letters "DSA" (who wants to explain that in
        5 years?). Some people liked the idea of aliasing existing commands
        and some didn't. Some had other ideas for naming conventions. In the
        end we opted for "get 'er done!" and as a result we will have GL 4.5
        with DSA in it.

        For those who really want the prefixed API, this can easily be done
        by renaming the commands when they are dynamically loaded.
        Additionally, with DSA, a C++ interface for GL can easily be written
        which will hide all the ugly details off things like C function names.

    19) Can we use DSA functions on default objects? Default framebuffer,
        transform feedback, program pipeline, texture, vertex array?

        RESOLVED:

          - Default textures: NO. There are too many texture objects named
            zero, the default textures are rarely used, and adding selectors
            to all the commands is too much work for a corner case.
          - Default vertex array objects: YES, but only in the compatibility
            profile, where they exist (see issue 40).
          - Default transform feedback and program pipeline objects; YES.
          - Default framebuffer objects: YES, with certain exceptions as
            described in issue 34.

    20) Should we introduce glCreate* function capable to create multiple
        program and shader objects? Same for glDelete*.

        RESOLVED: There is very little value to add these functions. Unless we
        figure out a way to add more value to it, from the resolution of issue
        18 for example, no need to add them.

    21) Why do we have TransformFeedbackBufferBase/Range but nothing for
        atomic counters, SSBOs, or UBOs?

        RESOLVED: TransformFeedbackBufferBase/Range are the DSA version of
        BindBufferBase and BindBufferRange on transform feedback object with
        the Bind To Edit API. Atomic counters, SSBOs and UBOs binding are
        exclusively context states. There is no object to attach them to.

    22) How should we query the bound textures with the DSA API?

        With the current specification we need to use bind to edit:

        GLuint GetTextureName(GLuint unit, GLenum target)
        {
          GLuint restore = 0;
          glGetIntegerv(GL_ACTIVE_TEXTURE, &restore);

          glActiveTexture(unit);

          GLuint name;
          glGetIntegerv(target, &name);

          glActiveTexture(restore);

          return name;
        }

        Furthermore, with this extension <target> is a texture object state,
        not an input.

        An approach to resolve this issue is using glGetIntegeri_v for
        textures:

        void glGetIntegeri_v(GLenum target_binding,
          GLuint index,
          GLint * data);

        <target_binding> is e.g. GL_TEXTURE_BINDING_2D for the
        two-dimensional texture binding.

        Instead of using GL_TEXTURE0, an integer <index> identifies a
        texture unit.

        NOTE: In the initially released version of this extension,
        queries of form

            glGetIntegeri_v(GL_TEXTURE_BINDING, index, &texname);

        were supported. This was a mistake and was not implementable,
        because there can always be multiple different bindings to a
        texture unit for different targets. This token and the
        corresponding state has been removed from this extension and
        from the OpenGL 4.5 API Specification. The glGetIntegeri_v query
        is still supported, but the target-specific binding tokens must
        be passed.

    23) Do state tables chapter 23 needs to be updated to contain DSA queries too?

        RESOLVED: Yes.

    24) Do we need DSA functions for mutable textures?

        RESOLVED: No. Immutable texture is a more robust approach to handle
        textures

    25) Should the DSA API collapse Texture*ND functions into a single
        function per functionality?

        - New extensions ARB_geometry_shader4, ARB_clear_texture,
          ARB_sparse_texture, ARB_copy_image have move away from separate ND
          functions
        - The TEXTURE_TARGET state allows IHVs baking the <target> parameter
          into the texture object. ISVs would like to do the same but can't
          because the target is required to select the correct texture
          function. Typically, if we fill a GL_TEXTURE_2D or a
          GL_TEXTURE_2D_ARRAY we need to call respectively TexSubImage2D or
          TexSubImage3D. A collapse glTexSubImage using three coordinates
          would resolve this issue.

        What the set of texture functions do we want?

        a) All ND functions:

            void TextureStorage1D(uint texture, sizei levels, enum internalformat,
                                  sizei width);

            void TextureStorage2D(uint texture, sizei levels, enum internalformat,
                                  sizei width, sizei height);

            void TextureStorage3D(uint texture, sizei levels, enum internalformat,
                                  sizei width, sizei height, sizei depth);

            void TextureStorage2DMultisample(uint texture, sizei samples, enum internalformat,
                                             sizei width, sizei height,
                                             boolean fixedsamplelocations);

            void TextureStorage3DMultisample(uint texture, sizei samples, enum internalformat,
                                             sizei width, sizei height, sizei depth,
                                             boolean fixedsamplelocations);

            void TextureSubImage1D(uint texture, int level,
                                   int xoffset, sizei width,
                                   enum format, enum type, const void *pixels);

            void TextureSubImage2D(uint texture, int level,
                                   int xoffset, int yoffset,
                                   sizei width, sizei height,
                                   enum format, enum type, const void *pixels);

            void TextureSubImage3D(uint texture, int level,
                                   int xoffset, int yoffset, int zoffset,
                                   sizei width, sizei height, sizei depth,
                                   enum format, enum type, const void *pixels);

            void CompressedTextureSubImage1D(uint texture, int level,
                                             int xoffset, sizei width,
                                             enum format, sizei imageSize, const void *data);

            void CompressedTextureSubImage2D(uint texture, int level,
                                             int xoffset, int yoffset,
                                             sizei width, sizei height,
                                             enum format, sizei imageSize, const void *data);

            void CompressedTextureSubImage3D(uint texture, int level,
                                             int xoffset, int yoffset, int zoffset,
                                             sizei width, sizei height, sizei depth,
                                             enum format, sizei imageSize, const void *data);

            void CopyTextureSubImage1D(uint texture, int level,
                                       int xoffset,
                                       int x, int y,
                                       sizei width);

            void CopyTextureSubImage2D(uint texture, int level,
                                       int xoffset, int yoffset,
                                       int x, int y,
                                       sizei width, sizei height);

            void CopyTextureSubImage3D(uint texture, int level,
                                       int xoffset, int yoffset, int zoffset,
                                       int x, int y,
                                       sizei width, sizei height);

        b) Collapsed ND functions (all addressed with 3D coordinates):

            void TextureStorage(uint texture, sizei levels, enum internalformat,
                                sizei width, sizei height, sizei depth);

            void TextureStorageMultisample(uint texture, sizei samples, enum internalformat,
                                           sizei width, sizei height, sizei depth,
                                           boolean fixedsamplelocations);

            void TextureSubImage(uint texture, int level,
                                 int xoffset, int yoffset, int zoffset,
                                 sizei width, sizei height, sizei depth,
                                 enum format, enum type, const void *pixels);

            void CompressedTextureSubImage(uint texture, int level,
                                           int xoffset, int yoffset, int zoffset,
                                           sizei width, sizei height, sizei depth,
                                           enum format, sizei imageSize, const void *data);

            void CopyTextureSubImage(uint texture, int level,
                                     int xoffset, int yoffset, int zoffset,
                                     int x, int y,
                                     sizei width, sizei height);

        c) Both a) and b)

        RESOLVED: a) All the ND versions only. This is what matches the OpenGL
        4.4 set of functionality.

    26) DSA functions for VertexAttrib are missing, do we want them?

        The list of the functions concerned is:

        void VertexAttrib{1234}{sfd}( uint index, T values );
        void VertexAttrib{123}{sfd}v( uint index, const T *values );
        void VertexAttrib4{bsifd ub us ui}v( uint index, const T *values );
        void VertexAttrib4Nub( uint index, ubyte x, ubyte y, ubyte z, ubyte w );
        void VertexAttrib4N{bsi ub us ui}v( uint index, const T *values );
        void VertexAttribI{1234}{i ui}( uint index, T values );
        void VertexAttribI{1234}{i ui}v( uint index, const T *values );
        void VertexAttribI4{b s ub us}v( uint index, const T *values );
        void VertexAttribL{1234}d( uint index, const T values );
        void VertexAttribL{1234}dv( uint index, const T *values );
        void VertexAttribP{1234}ui(uint index,enum type,boolean normalized,uint value);
        void VertexAttribP{1234}uiv(uint index,enum type,boolean normalized,const uint *value);

        RESOLVED: The default vertex attribute value is not a VAO state. No
        need to add any function. We can still use the existing functions on a
        software design based on DSA.

    27) Should we add multi bind versions of TransformFeedbackBufferBase and
        TransformFeedbackBufferRange?

        RESOLVED: No. On the contrary to the vertex array object, the
        transform feedback object doesn't contain a lot of state and actually
        most of the states are relatived to the bound buffers.

        The purpose of BindVertexBuffers for the VAOs it to quickly switch
        buffers while remaining the same set of buffers in the rendering loop.

        With the transform buffer object, we essentially only have buffers. If
        the OpenGL programmer want to quickly switch transform feedback
        buffers, he can create multiple transform feedback objects.

    28) What ARB only extensions have interactions with
        ARB_direct_state_access?

        RESOLVED: GL_ARB_sparse_texture and GL_ARB_sparse_buffer

    29) Are we missing CreateSync?

        RESOLVED: No. Sync object are created with FenceSync which behave
        similarly to the new Create* API expect that it returns a handle. The
        sync object is perfectly compatible with the DSA programming paradigm.

    30) Do we need NamedFramebufferTextureND?

        RESOLVED: No. In unextended OpenGL 4.4 there is at least one case that
        NamedFramebufferTexture and NamedFramebufferTextureLayer can't handle:
        non layered rendering to a cube map. In this extension, we extend
        FramebufferTextureLayer (and NamedFramebufferTextureLayer) to allow
        non-layered rendering to cube map faces. See also Issue 36.

    31) Do we need VertexArray*Offset? These are present in
        EXT_direct_state_access.

        RESOLVED: No. GL 4.4 intoduced ARB_vertex_attrib_binding which allows
        separately changing the buffer (via BindVertexBuffer) and setting the
        format (via VertexAttribFormat). In this version we provide DSA routines
        to match these: VertexArrayVertexBuffer and VertexArrayAttribFormat.

        Futhermore, no need to add VertexArrayAttribBinding, we can use
        VertexArrayBindingDivisor which is based on ARB_vertex_attrib_binding
        too.

        UNRESOLVED: If there's no VertexArrayAttribBinding, the example
        code needs to be rewritten accordingly.

    32) Do we need DSA for renderbuffer?

        RESOLVED: Keep renderbuffers. We don't need them as texture objects
        are a superset of renderbuffer objects but the group decided to keep
        them.

    33) Atomic buffers only have a shader binding qualifier but no API.
        Should we add ProgramAtomicBufferBinding?

        RESOLVED: Deferred.

    34) Can the default framebuffer be targeted? If so, how?

        RESOLVED: YES, with certain exceptions. Most commands accepting a
        <framebuffer> name accept zero and explicitly target the default
        read or draw framebuffer in this case, matching behavior of the
        non-Named versions. CheckFramebufferStatus adds a <target> selector.
        There is a minor loss of functionality for
        GetNamedFramebufferParameteriv,
        GetNamedFramebufferAttachmentParameteriv,
        InvalidateNamedFramebufferSubData, and
        InvalidateNamedFramebufferData. These commands accept <framebuffer>
        zero and target the default draw framebuffer. They cannot be used to
        target the default read framebuffer without adding an explicit
        selector, which we felt was too much work for a corner case.

        DISCUSSION: Christophe suggested using CreateFramebuffers to create
        non-zero names for the read and draw framebuffer objects. We decided
        not to do this as it's quite complex to work out all the details.

    35) Does the CheckNamedFramebufferStatus need a <target> parameter to
        specify what type of completeness should be checked for?

        RESOLVED: Yes.

        DISCUSSION: CheckFramebufferStatus checks framebuffer completeness
        independently for the "read framebuffer" and the "draw framebuffer"
        cases and it's not because one is complete that the other is
        complete as well.

        Three approaches to resolve this issue:

        a) Add a <target> to CheckNamedFramebufferStatus. The
           EXT_framebuffer_object way with clearer language.

        b) Add a <target> to the framebuffer object just like we did for
           the texture object and the query object.

        c) Always check for both. The application can use ReadBuffer(NONE)
           or DrawBuffer(NONE) if it is really concerned by respectively
           only the "read framebuffer" or "draw framebuffer" case.

    36) Can we fix FramebufferTexture?

        OpenGL 4.4 has 5 different functions to attach textures to a
        framebuffer where each function has specific behaviors, that either
        attached a texture image, enable layered or both according to the
        target. Specific functions like FramebufferTexture1D and
        FramebufferTexture3D apply only on the target 1D and target 3D
        respectively. Finally, we can only attach cube map faces using
        FramebufferTexture2D while there is no specific functional
        limitation to be able to do it with FramebufferTextureLayer. This
        inconsistency is largely due to legacy.

        FramebufferTexture, single layer:
        - one-or two-dimensional texture
        - rectangle texture
        - two-dimensional multisample texture

         FramebufferTexture, Layered:
        - three-dimensional texture
        - cube map texture
        - one-or two-dimensional array texture
        - two-dimensional multisample array texture
        - cube map array texture (intended - Bug 12336)

        FramebufferTextureLayer, single layer:
        - three-dimensional texture
        - cube map array texture
        - one-or two-dimensional array texture
        - two-dimensional multisample array texture
        [*missing* cube map face]

        FramebufferTexture1D, single layer:
        - one-dimensional texture

        FramebufferTexture2D, single layer:
        - cube map face
        - rectangle texture
        - two-dimensional texture
        - two-dimensional multisample texture

        FramebufferTexture3D, single layer:
        - three-dimensional texture

        DSA is an opportunity for some clean up.

        RESOLVED.  We will add NamedFramebufferTexture and
        NamedFramebufferTextureLayer, but not NamedFramebufferTexture1D/2D/3D.
        We'll augment FramebufferTextureLayer and NamedFramebufferTextureLayer
        with support for cube map textures, so that these methods are
        complete replacements for the (now legacy) FramebufferTextureND functions.

    37) How to handle UNPACK_SKIP_IMAGES pixel store state if we
        resolve issue 25 by collapsing Texture*ND functions?

        DISCUSSION:

        The OpenGL 4.4 core specification specify a specific behavior for
        TexImage2D where UNPACK_SKIP_IMAGES is ignored using the following
        language:

        "For the purposes of decoding the texture image, TexImage2D is
        equivalent to calling TexImage3D with corresponding arguments and
        depth of 1, except that UNPACK_SKIP_IMAGES is ignored"

        However, the specification doesn't clarify anything for regarding
        the equivalent issue UNPACK_SKIP_ROWS with TexImage1D which seems to
        imply that UNPACK_SKIP_IMAGES and UNPACK_SKIP_ROWS have inconsistent
        behaviours.

        A threaded producer and consumer OpenGL implementation might perform
        the unparking on the application thread in which case it may have no
        information about the texture object states, hence no access to the
        implied texture target that could have been used to select whether
        UNPACK_SKIP_IMAGES should be ignore or not.

        In practice, even if UNPACK_SKIP_IMAGES was active for TexImage2D,
        it would have an effect only if the default value (zero) is replaced
        by a positive value.

        The theory behind collapsing Tex*ND functions is that any set of
        coordinates is a generalization of any set of coordinates with N or
        less coordinates. There is no reason to forbid UNPACK_SKIP_IMAGES or
        UNPACK_SKIP_ROWS for collapsed any Tex* functions.

        We can't simply relax UNPACK_SKIP_IMAGES on TexImage2D because an
        application may rely on the side effects of this behavior which
        would result in a backward compatibility break.

        RESOLVED: Not applicable. We didn't include these commands.

    38) Do we need the CopyTextureImageSubData command?

        RESOLVED. No. It is already a DSA command. It would allow us to get
        rid of the (mostly meaningless) <target> parameter, but that is not a
        selector and it wouldn't be full replacement as it can't support
        renderbuffers.

    39) Do we need BeginNamedQuery / EndNamedQuery / QueryNamedCounter?

        RESOLVED. No. CreateQueries adds a <target>, so strictly speaking the
        <target> command isn't needed for BeginQuery/EndQuery, but in the end,
        this also isn't a selector, so we decided not to change it.

    40) Should commands accepting a vertex array object name allow it to be
        zero in the compatibility profile?

        RESOLVED: Yes. All commands accepting <vaobj> names accept zero,
        indicating the default VAO, in the compatibility profile only.

        DISCUSSION: this case may have been overlooked because the extension
        was written against the core profile specification. EXT_dsa doesn't
        appear to allow it, although the error discussion there doesn't
        exclude it, either (with the odd result that it may imply that a VAO
        named zero will be created if it doesn't exist).

        The introduction says that "this extension only expands
        functionality that still exists in core profile OpenGL." However,
        this is in tension with the desire to not have loss of functionality
        with the non-DSA functions in this case, and the resolution of issue
        19 is that DSA functions *can* be used on default objects.

    41) Can READ_BUFFER and DRAW_BUFFERi state be queried with
        GetNamedFramebufferParameteriv?

        RESOLVED: No. The non-DSA query does not support these
        tokens so neither does the DSA query.

        Previous versions of the extension contained the following state
        table additions:

           "Modify Table 23.24, "Framebuffer (state per framebuffer object)"

            Add GetNamedFramebufferParameteriv in 'Get Command' for
            DRAW_BUFFERi and READ_BUFFER states"

        However, there was no corresponding spec language change explaining
        how these additional tokens worked, and vendors did not implement
        support for it.

Revision History

    Rev.    Date        Author    Changes
    ----  -----------   --------- ---------------------------------------------
    50    14 Jun 2018   T. Karras Use English variable names and fix API usage
                                  in examples.

    49    23 Jul 2017   Jon Leech Replace the long list of valid <target>
                                  parameters for BeginQueryIndexed,
                                  EndQueryIndexed, and GetQueryIndexediv
                                  with a reference to the list of query
                                  targets in section 4.2 (gitlab #18).

    48    29 Sep 2016   Jon Leech Add interaction with ARB_query_buffer_object
                                  (Bug 13490).

    47    22 Oct 2015   Jon Leech Add missing drawbuffer parameter to
                                  ClearNamedFramebufferfi (public Bug 1394,
                                  Bug 13469).

    46    25 Jun 2015   Jon Leech Add issue 41 noting that read and drawbuffer
                                  state cannot be queried with
                                  GetNamedFramebufferParameteriv (Bug 14207).

    45    20 Apr 2015   Jon Leech Change generated error fo *TexSubImage* with
                                  invalid <target> to INVALID_ENUM instead of
                                  INVALID_VALUE (Bug 13563).

    44    27 Jan 2015   Jon Leech Remove unimplementable TEXTURE_BINDING token
                                  and state, and update Issue 22 (Bug 13278).

    43    26 Sep 2014   Jon Leech Add GetQueryBufferObject* to New Commands +
                                  minor spacing fixes.

    42    18 Sep 2014   Jon Leech Add GetQueryBufferObject* queries (Bug 1214).

    41    24 Jul 2014   Jon Leech Allow cube map textures to be queried with
                                  GetTextureLevelParameter*. Don't allow
                                  cube map face targets as effective targets
                                  of *TextureSubImage2D, but do allow cube
                                  map textures as effective targets of the
                                  corresponding *3D commands (Bug 12451).

    40    17 Jul 2014   Jon Leech Remove TRANSFORM_FEEDBACK_BUFFER_BINDING as
                                  a valid target for GetTransformFeedbackiv
                                  (Bug 12462).

    39    17 Jul 2014   criccio   Fix missing VertexArrayAttribBinding function

    38    16 Jul 2014   Jon Leech Fix drawBuffer -> drawbuffer capitalization.

    37    15 Jul 2014   Jon Leech Specify that a zero <framebuffer> argument
                                  to GetNamedFramebufferParameteriv queries
                                  the default draw framebuffer, matching API
                                  spec.

    36    10 Jul 2014   Jon Leech Fix error condition for
                                  Check*FramebufferStatus.

    35    03 Jul 2014   Jon Leech Fix error condition for BindTextureUnit.

    34    29 Jun 2014   Jon Leech Fix typo in spec prototype for
                                  TextureStorage2D. Clarify that not all
                                  GetTransformFeedback* commands accept
                                  all token names from the state table.

    33    16 Jun 2014   Jon Leech Fix typos.

                                  Require GetTextureImage to accept cube map
                                  texture objects and to respect
                                  three-dimensional pixel pack state in this
                                  case (Bug 12329).

    32    16 Jun 2014   Jon Leech Reflow Issues list and add issue 40.

                                  Finish merging errors and language from
                                  core API spec.

                                  Allow CheckNamedFramebufferStatus to
                                  accept a zero <framebuffer> argument,
                                  indicating the default read or draw
                                  framebuffer.

                                  Remove VERTEX_ATTRIB_ARRAY_POINTER query
                                  and add VERTEX_ATTRIB_RELATIVE_OFFSET (Bug
                                  12330).

                                  Allow commands taking vertex object names
                                  to accept the name zero, indicating the
                                  default VAO, in the compatibility profile
                                  only (issues 19, 40).

                                  Add parameter validation errors for
                                  TransformFeedbackBuffer{Base,Range} and
                                  GetTransformFeedback{i,i64}_v.

    31    12 Jun 2014   Jon Leech Merge updated errors and language from the
                                  core API spec (only done up through
                                  CreateRenderbuffers, more to be done).

    30    08 Jun 2014   Jon Leech Merged errors into body in new spec style
                                  (still not up to date with 4.5 API spec).
                                  Remove VertexArrayAttribBinding per issue
                                  31. Allow querying the default draw
                                  framebuffer with
                                  GetFramebufferAttachmentParameteriv
                                  (making errors consistent with spec body).
                                  Reflow a few paragraphs and adjust
                                  indentation for consistency. Assign enum
                                  values for QUERY_TARGET, TEXTURE_BINDING,
                                  and TEXTURE_TARGET.

    29    06 Jun 2014   Jon Leech Remove 'or if such an object has been deleted'
                                  language from object name validation errors,
                                  since an 'existing' object has by definition
                                  not been deleted. Remove tabs.

    28    03 Jun 2014   Jon Leech Fix typo 'img' -> 'pixels'.

    27    30 May 2014   dkoch     Resolved issue 30, 36, and supporting edits.
                                  Resolved issue 25 and removed collapsed
                                  commands variants. Resolved issue 37.
                                  Resolved issue 15, 18 (wontfix).
                                  Removed CopyTextureImageSubData (Issue 38).
                                  Removed Begin/EndNamedQuery/QueryNamedCounter
                                  (Issue 39).
                                  Rename BindTextureBase to BindTextureUnit

    26    28 May 2014   criccio   Improved the structural consistency.

    25    27 May 2014   criccio   Documented issue 36.
                                  Added proposed language to resolve issue 36.

    24    26 May 2014   criccio   Added issue 36.
                                  Added issue 37.

    23    26 May 2014   dkoch     Fix typos, parameter names and references.

    22    23 May 2014   criccio   Renamed CopyTextureSubImageData into
                                  CopyTextureImageSubData from Daniel comments.
                                  Updated issue 18 discussion.
                                  Added collapsed texture functions languages.
                                  Issue 25 is still to be fixed.
                                  Added new sample.

    21    22 May 2014   criccio   Fixed Get*TextureImage parameters order.
                                  Completed modification to tables chapter 23.
                                  Added missing GetVertexArrayIndexed64iv.
                                  Fixed accepted enum for GetVertexArray*.

    20    21 May 2014   criccio   Document issue 35 with the three alternatives
                                  envisioned.
                                  Clean up.

    19    21 May 2014   dkoch     Added FramebufferTexture*D, QueryNamedCounter.
                                  Fixed CheckNamedFramebufferStatus and Issue 35.

    18    21 May 2014   criccio   Fixed typos.
                                  Integrated Daniel review.
                                  Document issue 34.
                                  Updated table chapter 23.

    17    20 May 2014   criccio   There is no default VAO in core profile, fix
                                  functions allowing zero.
                                  Added invalid operation error on
                                  TextureBuffer.

    16    19 May 2014   criccio   Documented issue 30 and resolved it.
                                  Added issue 34.
                                  Added all the errors relative the object name
                                  passed to the new DSA functions.

    15    18 May 2014   criccio   Resolved issue 19 and added errors relative
                                  to this issue.
                                  Updated and resolved issue 12.
                                  Updated and resolved issue 24.
                                  Resolved issue 27.
                                  Added language for query object interaction.
                                  Added issue 32.
                                  Resolved issue 11 accordingly to the
                                  resolution of issue 31.
                                  Updated and resolved issue 29.
                                  Resolved issue 20.
                                  Added example 1 to 3.
                                  Document issue 25 and 18.
                                  Added issue 33 and 34.

    14    17 May 2014   criccio   Resolved issue 22.
                                  Add comments to the resolution of issue 31.
                                  Added language for missing functions.

    13    17 May 2014   dkoch     Finish removing GetTransformFeedbackBooleanv.
                                  Added NamedFramebufferTextureND (Issue 30).
                                  Removed VertexArray*Offset (Issue 31).
                                  Minor editorial changes.

    12    16 May 2014   criccio   Added BeginNamedQuery and EndNamedQuery
                                  function and a target state to the query
                                  object to complete the resolution of issue 4.
                                  Removed GetTransformFeedbackBooleanv function
                                  and added modifications for transform feedback
                                  state table to list the DSA functions to query
                                  the transform feedback states.

    11    16 May 2014   dkoch     Fixed various typos. Resolved issue 4, 13, 14.
                                  Fixed prototypes and description of
                                  InvalidateNamed{Sub}Framebuffer.

    10    16 May 2014   criccio   Added issues 0, 22, 24 to 29.
                                  Resolved issue 26.
                                  Fixed the language for GetCompressedTextureImage
                                  and GetTextureImage: <pixels> and <level>
                                  instead of <img> and <lod>.
                                  Additional reorganization of "New Procedures
                                  and Functions" section.
                                  Added dependence to OpenGL 2.0.
                                  Added interactions with all the extensions
                                  concerned since OpenGL 2.0.

    9     16 May 2014   criccio   Fixed BlitNamedFramebuffer language inconsistency.
                                  Added list of missing functions in todo section.
                                  Reorganized "New Procedures and Functions"
                                  section for better readability.

    8     16 May 2014   criccio   Applied DanielK: Typos, renamed
                                  VERTEX_ARRAY_ELEMENT_BINDING into
                                  ELEMENT_ARRAY_BUFFER_BINDING.
                                  Added and fixed issue 21.

    7     15 May 2014   criccio   Removed left over for CompressedTextureImage1D,
                                  CompressedTextureImage2D and
                                  CompressedTextureImage3D.
                                  Removed left over for CopyTextureImage1D,
                                  CopyTextureImage2D, TextureImage1D,
                                  TextureImage2D and TextureImage3D.

                                  Added and resolve issue 10.
                                  Fixed GetVertexArrayAttribPointerv prototype
                                  and language.
                                  Added issue 11.
                                  Resolved issue 5 and 3.
                                  Resolved issue 6 and fix associated prototype.
                                  Added issues 12 to 20.
                                  Updated issue 1 and 8 to be less specific.
                                  Added Transistioning guide to
                                  ARB_direct_state_access section.

      6   15 May 2014   gsellers  More updates. Will it ever end?

      5   15 Apr 2014   criccio   Clean up, typos.

      4    2 Apr 2014   gsellers  More updates.

      3    7 Fev 2014   gsellers  More updates. Ready for initial review. All
                                  functions mostly documented.

      2   30 Jan 2014   gsellers  Updates - documented more functions.

      1   23 Dec 2013   gsellers  Initial revision based on EXT_dsa.
