Name

    EXT_vertex_array

Name Strings

    GL_EXT_vertex_array

Version

    $Date: 1995/10/03 05:39:58 $ $Revision: 1.16 $  FINAL

Number

    30

Dependencies

    None

Overview

    This extension adds the ability to specify multiple geometric primitives
    with very few subroutine calls.  Instead of calling an OpenGL procedure
    to pass each individual vertex, normal, or color, separate arrays
    of vertexes, normals, and colors are prespecified, and are used to
    define a sequence of primitives (all of the same type) when a single
    call is made to DrawArraysEXT.  A stride mechanism is provided so that
    an application can choose to keep all vertex data staggered in a
    single array, or sparsely in separate arrays.  Single-array storage
    may optimize performance on some implementations.

    This extension also supports the rendering of individual array elements,
    each specified as an index into the enabled arrays.

Issues

    *   Should arrays for material parameters be provided?  If so, how?

        A: No.  Let's leave this to a separate extension, and keep this
           extension lean.

    *   Should a FORTRAN interface be specified in this document?

    *   It may not be possible to implement GetPointervEXT in FORTRAN.  If
        not, should we eliminate it from this proposal?

        A: Leave it in.

    *   Should a stride be specified by DrawArraysEXT which, if non-zero,
        would override the strides specified for the individual arrays?
        This might improve the efficiency of single-array transfers.

        A: No, it's not worth the effort and complexity.

    *   Should entry points for byte vertexes, byte indexes, and byte
        texture coordinates be added in this extension?

        A: No, do this in a separate extension, which defines byte support
           for arrays and for the current procedural interface.

    *   Should support for meshes (not strips) of rectangles be provided?

        A: No. If this is necessary, define a separate quad_mesh extension
           that supports both immediate mode and arrays.  (Add QUAD_MESH_EXT
           as a token accepted by Begin and DrawArraysEXT.  Add
           QuadMeshLengthEXT to specify the length of the mesh.)

Reasoning

    *   DrawArraysEXT requires that VERTEX_ARRAY_EXT be enabled so that
        future extensions can support evaluation as well as direct
        specification of vertex coordinates.

    *   This extension does not support evaluation.  It could be extended
        to provide such support by adding arrays of points to be evaluated,
        and by adding enables to indicate that the arrays are to be
        evaluated.  I think we may choose to add an array version of
        EvalMesh, rather than extending the operation of DrawArraysEXT,
        so I'd rather wait on this one.

    *   <size> is specified before <type> to match the order of the
        information in immediate mode commands, such as Vertex3f.
        (first 3, then f)

    *   It seems reasonable to allow attribute values to be undefined after
        DrawArraysEXT executes.  This avoids implementation overhead in
        the case where an incomplete primitive is specified, and will allow
        optimization on multiprocessor systems.  I don't expect this to be
        a burden to programmers.

    *   It is not an error to call VertexPointerEXT, NormalPointerEXT,
        ColorPointerEXT, IndexPointerEXT, TexCoordPointerEXT,
        or EdgeFlagPointerEXT between the execution of Begin and the
        corresponding execution of End.  Because these commands will
        typically be implemented on the client side with no protocol,
        testing for between-Begin-End status requires that the client
        track this state, or that a round trip be made.  Neither is
        desirable.

    *   Arrays are enabled and disabled individually, rather than with a
        single mask parameter, for two reasons.  First, we have had trouble
        allocating bits in masks, so eliminating a mask eliminates potential
        trouble down the road.  We may eventually require a larger number of
        array types than there are bits in a mask.  Second, making the
        enables into state eliminates a parameter in ArrayElementEXT, and
        may allow it to execute more efficiently.  Of course this state
        model may result in programming errors, but OpenGL is full of such
        hazards anyway!

    *   ArrayElementEXT is provided to support applications that construct
        primitives by indexing vertex data, rather than by streaming through
        arrays of data in first-to-last order.  Because each call specifies
        only a single vertex, it is possible for an application to explicitly
        specify per-primitive attributes, such as a single normal per
        individual triangle.

    *   The <count> parameters are added to the *PointerEXT commands to
        allow implementations to cache array data, and in particular to
        cache the transformed results of array data that are rendered
        repeatedly by ArrayElementEXT.  Implementations that do not wish
        to perform such caching can ignore the <count> parameter.

    *   The <first> parameter of DrawArraysEXT allows a single set of
        arrays to be used repeatedly, possibly improving performance.

New Procedures and Functions

    void ArrayElementEXT(int i);

    void DrawArraysEXT(enum mode,
                       int first,
                       sizei count);

    void VertexPointerEXT(int size,
                          enum type,
                          sizei stride,
                          sizei count,
                          const void* pointer);

    void NormalPointerEXT(enum type,
                          sizei stride,
                          sizei count,
                          const void* pointer);

    void ColorPointerEXT(int size,
                         enum type,
                         sizei stride,
                         sizei count,
                         const void* pointer);

    void IndexPointerEXT(enum type,
                         sizei stride,
                         sizei count,
                         const void* pointer);

    void TexCoordPointerEXT(int size,
                            enum type,
                            sizei stride,
                            sizei count,
                            const void* pointer);

    void EdgeFlagPointerEXT(sizei stride,
                            sizei count,
                            const Boolean* pointer);

    void GetPointervEXT(enum pname,
                       void** params);

New Tokens

    Accepted by the <cap> parameter of Enable, Disable, and IsEnabled, and
    by the <pname> parameter of GetBooleanv, GetIntegerv, GetFloatv, and
    GetDoublev:

        VERTEX_ARRAY_EXT               0x8074
        NORMAL_ARRAY_EXT               0x8075
        COLOR_ARRAY_EXT                0x8076
        INDEX_ARRAY_EXT                0x8077
        TEXTURE_COORD_ARRAY_EXT        0x8078
        EDGE_FLAG_ARRAY_EXT            0x8079

    Accepted by the <type> parameter of VertexPointerEXT, NormalPointerEXT,
    ColorPointerEXT, IndexPointerEXT, and TexCoordPointerEXT:

        DOUBLE_EXT                     0x140A

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

        VERTEX_ARRAY_SIZE_EXT          0x807A
        VERTEX_ARRAY_TYPE_EXT          0x807B
        VERTEX_ARRAY_STRIDE_EXT        0x807C
        VERTEX_ARRAY_COUNT_EXT         0x807D
        NORMAL_ARRAY_TYPE_EXT          0x807E
        NORMAL_ARRAY_STRIDE_EXT        0x807F
        NORMAL_ARRAY_COUNT_EXT         0x8080
        COLOR_ARRAY_SIZE_EXT           0x8081
        COLOR_ARRAY_TYPE_EXT           0x8082
        COLOR_ARRAY_STRIDE_EXT         0x8083
        COLOR_ARRAY_COUNT_EXT          0x8084
        INDEX_ARRAY_TYPE_EXT           0x8085
        INDEX_ARRAY_STRIDE_EXT         0x8086
        INDEX_ARRAY_COUNT_EXT          0x8087
        TEXTURE_COORD_ARRAY_SIZE_EXT   0x8088
        TEXTURE_COORD_ARRAY_TYPE_EXT   0x8089
        TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A
        TEXTURE_COORD_ARRAY_COUNT_EXT  0x808B
        EDGE_FLAG_ARRAY_STRIDE_EXT     0x808C
        EDGE_FLAG_ARRAY_COUNT_EXT      0x808D

    Accepted by the <pname> parameter of GetPointervEXT:

        VERTEX_ARRAY_POINTER_EXT       0x808E
        NORMAL_ARRAY_POINTER_EXT       0x808F
        COLOR_ARRAY_POINTER_EXT        0x8090
        INDEX_ARRAY_POINTER_EXT        0x8091
        TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092
        EDGE_FLAG_ARRAY_POINTER_EXT    0x8093

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

    Array Specification
    -------------------

    Individual array pointers and associated data are maintained for an
    array of vertexes, an array of normals, an array of colors, an array
    of color indexes, an array of texture coordinates, and an array of edge
    flags.  The data associated with each array specify the data type of
    the values in the array, the number of values per element in the array
    (e.g.  vertexes of 2, 3, or 4 coordinates), the byte stride from one
    array element to the next, and the number of elements (counting from
    the first) that are static.  Static elements may be modified by the
    application, but once they are modified, the application must explicitly
    respecify the array before using it for any rendering.  When an array is
    specified, the pointer and associated data are saved as client-side
    state, and static elements may be cached by the implementation.  Non-
    static (dynamic) elements are never accessed until ArrayElementEXT or
    DrawArraysEXT is issued.

    VertexPointerEXT specifies the location and data format of an array
    of vertex coordinates.  <pointer> specifies a pointer to the first
    coordinate of the first vertex in the array.  <type> specifies the data
    type of each coordinate in the array, and must be one of SHORT, INT,
    FLOAT, or DOUBLE_EXT, implying GL data types short, int, float, and
    double respectively.  <size> specifies the number of coordinates per
    vertex, and must be 2, 3, or 4.  <stride> specifies the byte offset
    between pointers to consecutive vertexes.  If <stride> is zero, the
    vertex data are understood to be tightly packed in the array.  <count>
    specifies the number of vertexes, counting from the first, that are
    static.

    NormalPointerEXT specifies the location and data format of an array
    of normals.  <pointer> specifies a pointer to the first coordinate
    of the first normal in the array.  <type> specifies the data type
    of each coordinate in the array, and must be one of BYTE, SHORT, INT,
    FLOAT, or DOUBLE_EXT, implying GL data types byte, short, int, float,
    and double respectively.  It is understood that each normal comprises
    three coordinates.  <stride> specifies the byte offset between
    pointers to consecutive normals.  If <stride> is zero, the normal
    data are understood to be tightly packed in the array.  <count>
    specifies the number of normals, counting from the first, that are
    static.

    ColorPointerEXT specifies the location and data format of an array
    of color components.  <pointer> specifies a pointer to the first
    component of the first color element in the array.  <type> specifies the
    data type of each component in the array, and must be one of BYTE,
    UNSIGNED_BYTE, SHORT, UNSIGNED_SHORT, INT, UNSIGNED_INT, FLOAT, or
    DOUBLE_EXT, implying GL data types byte, ubyte, short, ushort, int,
    uint, float, and double respectively.  <size> specifies the number of
    components per color, and must be 3 or 4.  <stride> specifies the byte
    offset between pointers to consecutive colors.  If <stride> is zero,
    the color data are understood to be tightly packed in the array.
    <count> specifies the number of colors, counting from the first, that
    are static.

    IndexPointerEXT specifies the location and data format of an array
    of color indexes.  <pointer> specifies a pointer to the first index in
    the array.  <type> specifies the data type of each index in the
    array, and must be one of SHORT, INT, FLOAT, or DOUBLE_EXT, implying
    GL data types short, int, float, and double respectively.  <stride>
    specifies the byte offset between pointers to consecutive indexes.  If
    <stride> is zero, the index data are understood to be tightly packed
    in the array.  <count> specifies the number of indexes, counting from
    the first, that are static.

    TexCoordPointerEXT specifies the location and data format of an array
    of texture coordinates.  <pointer> specifies a pointer to the first
    coordinate of the first element in the array.  <type> specifies the data
    type of each coordinate in the array, and must be one of SHORT, INT,
    FLOAT, or DOUBLE_EXT, implying GL data types short, int, float, and
    double respectively.  <size> specifies the number of coordinates per
    element, and must be 1, 2, 3, or 4.  <stride> specifies the byte offset
    between pointers to consecutive elements of coordinates.  If <stride> is
    zero, the coordinate data are understood to be tightly packed in the
    array.  <count> specifies the number of texture coordinate elements,
    counting from the first, that are static.

    EdgeFlagPointerEXT specifies the location and data format of an array
    of boolean edge flags.  <pointer> specifies a pointer to the first flag
    in the array.  <stride> specifies the byte offset between pointers to
    consecutive edge flags.  If <stride> is zero, the edge flag data are
    understood to be tightly packed in the array.  <count> specifies the
    number of edge flags, counting from the first, that are static.

    The table below summarizes the sizes and data types accepted (or
    understood implicitly) by each of the six pointer-specification commands.

        Command               Sizes     Types
        -------               -----     -----
        VertexPointerEXT      2,3,4     short, int, float, double
        NormalPointerEXT      3         byte, short, int, float, double
        ColorPointerEXT       3,4       byte, short, int, float, double,
                                        ubyte, ushort, uint
        IndexPointerEXT       1         short, int, float, double
        TexCoordPointerEXT    1,2,3,4   short, int, float, double
        EdgeFlagPointerEXT    1         boolean

    Rendering the Arrays
    --------------------

    By default all the arrays are disabled, meaning that they will not
    be accessed when either ArrayElementEXT or DrawArraysEXT is called.
    An individual array is enabled or disabled by calling Enable or
    Disable with <cap> set to appropriate value, as specified in the
    table below:

        Array Specification Command     Enable Token
        ---------------------------     ------------
        VertexPointerEXT                VERTEX_ARRAY_EXT
        NormalPointerEXT                NORMAL_ARRAY_EXT
        ColorPointerEXT                 COLOR_ARRAY_EXT
        IndexPointerEXT                 INDEX_ARRAY_EXT
        TexCoordPointerEXT              TEXTURE_COORD_ARRAY_EXT
        EdgeFlagPointerEXT              EDGE_FLAG_ARRAY_EXT

    When ArrayElementEXT is called, a single vertex is drawn, using vertex
    and attribute data taken from location <i> of the enabled arrays.  The
    semantics of ArrayElementEXT are defined in the C-code below:

        void ArrayElementEXT (int i) {
            byte* p;
            if (NORMAL_ARRAY_EXT) {
                if (normal_stride == 0)
                    p = (byte*)normal_pointer + i * 3 * sizeof(normal_type);
                else
                    p = (byte*)normal_pointer + i * normal_stride;
                Normal3<normal_type>v ((normal_type*)p);
            }
            if (COLOR_ARRAY_EXT) {
                if (color_stride == 0)
                    p = (byte*)color_pointer +
                        i * color_size * sizeof(color_type);
                else
                    p = (byte*)color_pointer + i * color_stride;
                Color<color_size><color_type>v ((color_type*)p);
            }
            if (INDEX_ARRAY_EXT) {
                if (index_stride == 0)
                    p = (byte*)index_pointer + i * sizeof(index_type);
                else
                    p = (byte*)index_pointer + i * index_stride;
                Index<index_type>v ((index_type*)p);
            }
            if (TEXTURE_COORD_ARRAY_EXT) {
                if (texcoord_stride == 0)
                    p = (byte*)texcoord_pointer +
                        i * texcoord_size * sizeof(texcoord_type);
                else
                    p = (byte*)texcoord_pointer + i * texcoord_stride;
                TexCoord<texcoord_size><texcoord_type>v ((texcoord_type*)p);
            }
            if (EDGE_FLAG_ARRAY_EXT) {
                if (edgeflag_stride == 0)
                    p = (byte*)edgeflag_pointer + i * sizeof(boolean);
                else
                    p = (byte*)edgeflag_pointer + i * edgeflag_stride;
                EdgeFlagv ((boolean*)p);
            }
            if (VERTEX_ARRAY_EXT) {
                if (vertex_stride == 0)
                    p = (byte*)vertex_pointer +
                        i * vertex_size * sizeof(vertex_type);
                else
                    p = (byte*)vertex_pointer + i * vertex_stride;
                Vertex<vertex_size><vertex_type>v ((vertex_type*)p);
            }
        }

    ArrayElementEXT executes even if VERTEX_ARRAY_EXT is not enabled.  No
    drawing occurs in this case, but the attributes corresponding to
    enabled arrays are modified.

    When DrawArraysEXT is called, <count> sequential elements from each
    enabled array are used to construct a sequence of geometric primitives,
    beginning with element <first>.  <mode> specifies what kind of
    primitives are constructed, and how the array elements are used to
    construct these primitives.  Accepted values for <mode> are POINTS,
    LINE_STRIP, LINE_LOOP, LINES, TRIANGLE_STRIP, TRIANGLE_FAN, TRIANGLES,
    QUAD_STRIP, QUADS, and POLYGON.  If VERTEX_ARRAY_EXT is not enabled, no
    geometric primitives are generated.

    The semantics of DrawArraysEXT are defined in the C-code below:

        void DrawArraysEXT(enum mode, int first, sizei count) {
            int i;
            if (count < 0)
                /* generate INVALID_VALUE error and abort */
            else {
                Begin (mode);
                for (i=0; i < count; i++)
                    ArrayElementEXT(first + i);
                End ();
            }
        }

    The ways in which the execution of DrawArraysEXT differs from the
    semantics indicated in the pseudo-code above are:

        1.  Vertex attributes that are modified by DrawArraysEXT have an
            unspecified value after DrawArraysEXT returns.  For example, if
            COLOR_ARRAY_EXT is enabled, the value of the current color is
            undefined after DrawArraysEXT executes.  Attributes that aren't
            modified remain well defined.

        2.  Operation of DrawArraysEXT is atomic with respect to error
            generation.  If an error is generated, no other operations take
            place.

    Although it is not an error to respecify an array between the execution
    of Begin and the corresponding execution of End, the result of such
    respecification is undefined.  Static array data may be read and cached
    by the implementation at any time.  If static array data are modified by
    the application, the results of any subsequently issued ArrayElementEXT
    or DrawArraysEXT commands are undefined.

Additions to Chapter 3 of the 1.0 Specification (Rasterization)

    None

Additions to Chapter 4 of the 1.0 Specification (Per-Fragment Operations
and the Frame buffer)

    None

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

    ArrayElementEXT and DrawArraysEXT are included in display lists.
    When either command is entered into a display list, the necessary
    array data (determined by the array pointers and enables) is also
    entered into the display list.  Because the array pointers and
    enables are client side state, their values affect display lists
    when the lists are created, not when the lists are executed.

    Array specification commands VertexPointerEXT, NormalPointerEXT,
    ColorPointerEXT, IndexPointerEXT, TexCoordPointerEXT, and
    EdgeFlagPointerEXT specify client side state, and are therefore
    not included in display lists.  Likewise Enable and Disable, when
    called with <cap> set to VERTEX_ARRAY_EXT, NORMAL_ARRAY_EXT,
    COLOR_ARRAY_EXT, INDEX_ARRAY_EXT, TEXTURE_COORD_ARRAY_EXT, or
    EDGE_FLAG_ARRAY_EXT, are not included in display lists.
    GetPointervEXT returns state information, and so is not included
    in display lists.

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

    GetPointervEXT returns in <param> the array pointer value specified
    by <pname>.  Accepted values for <pname> are VERTEX_ARRAY_POINTER_EXT,
    NORMAL_ARRAY_POINTER_EXT, COLOR_ARRAY_POINTER_EXT,
    INDEX_ARRAY_POINTER_EXT, TEXTURE_COORD_ARRAY_POINTER_EXT,
    and EDGE_FLAG_ARRAY_POINTER_EXT.

    All array data are client side state, and are not saved or restored
    by PushAttrib and PopAttrib.

Additions to the GLX Specification

    None

GLX Protocol

    A new rendering command is added; it can be sent to the server as part of a 
    glXRender request or as part of a glXRenderLarge request:

        The DrawArraysEXT command consists of three sections, in the following order: 
        (1) header information, (2) a list of array information, containing the type 
        and size of the array values for each enabled array and (3) a list of vertex 
        data. Each element in the list of vertex data contains information for a single 
        vertex taken from the enabled arrays.
   
        DrawArraysEXT
            2           16+(12*m)+(s*n) rendering command length
            2           4116            rendering command opcode
            4           CARD32          n (number of array elements)
            4           CARD32          m (number of enabled arrays)
            4           ENUM            mode    /* GL_POINTS etc */
            12*m        LISTofARRAY_INFO 
            s*n         LISTofVERTEX_DATA 
     
            Where s = ns + cs + is + ts + es + vs + np + cp + ip + tp + ep + vp. (See
            description below, under VERTEX_DATA.) Note that if an array is disabled 
            then no information is sent for it. For example, when the normal array is 
            disabled, there is no ARRAY_INFO record for the normal array and ns and np 
            are both zero.

            Note that the list of ARRAY_INFO is unordered: since the ARRAY_INFO
            record contains the array type, the arrays in the list may be stored
            in any order. Also, the VERTEX_DATA list is a packed list of vertices.
            For each vertex, data is retrieved from the enabled arrays, and stored
            in the list.

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

            4           20+(12*m)+(s*n) rendering command length
            4           4116            rendering command opcode

        ARRAY_INFO
            4           ENUM                    data type
                        0x1400  i=1             BYTE 
                        0x1401  i=1             UNSIGNED_BYTE
                        0x1402  i=2             SHORT       
                        0x1403  i=2             UNSIGNED_SHORT
                        0x1404  i=4             INT  
                        0x1405  i=4             UNSIGNED_INT
                        0x1406  i=4             FLOAT
                        0x140A  i=8             DOUBLE_EXT
            4           INT32                   j (number of values in array element)
            4           ENUM                    array type
                        0x8074  j=2/3/4         VERTEX_ARRAY_EXT               
                        0x8075  j=3             NORMAL_ARRAY_EXT               
                        0x8076  j=3/4           COLOR_ARRAY_EXT                
                        0x8077  j=1             INDEX_ARRAY_EXT                
                        0x8078  j=1/2/3/4       TEXTURE_COORD_ARRAY_EXT        
                        0x8079  j=1             EDGE_FLAG_ARRAY_EXT 

            For each array, the size of an array element is i*j. Some arrays
            (e.g., the texture coordinate array) support different data sizes;
            for these arrays, the size, j, is specified when the array is defined.
 
        VERTEX_DATA
            if the normal array is enabled:

            ns          LISTofBYTE              normal array element
            np                                  unused, np=pad(ns)

            if the color array is enabled:

            cs          LISTofBYTE              color array element
            cp                                  unused, cp=pad(cs)

            if the index array is enabled:

            is          LISTofBYTE              index array element
            ip                                  unused, ip=pad(is)

            if the texture coord array is enabled:

            ts          LISTofBYTE              texture coord array element
            tp                                  unused, tp=pad(ts)

            if the edge flag array is enabled:

            es          LISTofBYTE              edge flag array element
            ep                                  unused, ep=pad(es)

            if the vertex array is enabled:

            vs          LISTofBYTE              vertex array element
            vp                                  unused, vp=pad(vs)

            where ns, cs, is, ts, es, vs is the size of the normal, color, index, 
            texture, edge and vertex array elements and np, cp, ip, tp, ep, vp is 
            the padding for the normal, color, index, texture, edge and vertex array 
            elements, respectively.

Errors

    INVALID_OPERATION is generated if DrawArraysEXT is called between the
    execution of Begin and the corresponding execution of End.

    INVALID_ENUM is generated if DrawArraysEXT parameter <mode> is not
    POINTS, LINE_STRIP, LINE_LOOP, LINES, TRIANGLE_STRIP, TRIANGLE_FAN,
    TRIANGLES, QUAD_STRIP, QUADS, or POLYGON.

    INVALID_VALUE is generated if DrawArraysEXT parameter <count> is
    negative.

    INVALID_VALUE is generated if VertexPointerEXT parameter <size> is not
    2, 3, or 4.

    INVALID_ENUM is generated if VertexPointerEXT parameter <type> is not
    SHORT, INT, FLOAT, or DOUBLE_EXT.

    INVALID_VALUE is generated if VertexPointerEXT parameter <stride> or
    <count> is negative.

    INVALID_ENUM is generated if NormalPointerEXT parameter <type> is not
    BYTE, SHORT, INT, FLOAT, or DOUBLE_EXT.

    INVALID_VALUE is generated if NormalPointerEXT parameter <stride> or
    <count> is negative.

    INVALID_VALUE is generated if ColorPointerEXT parameter <size> is not
    3 or 4.

    INVALID_ENUM is generated if ColorPointerEXT parameter <type> is not
    BYTE, UNSIGNED_BYTE, SHORT, UNSIGNED_SHORT, INT, UNSIGNED_INT, FLOAT,
    or DOUBLE_EXT.

    INVALID_VALUE is generated if ColorPointerEXT parameter <stride> or
    <count> is negative.

    INVALID_ENUM is generated if IndexPointerEXT parameter <type> is not
    SHORT, INT, FLOAT, or DOUBLE_EXT.

    INVALID_VALUE is generated if IndexPointerEXT parameter <stride> or
    <count> is negative.

    INVALID_VALUE is generated if TexCoordPointerEXT parameter <size> is not
    1, 2, 3, or 4.

    INVALID_ENUM is generated if TexCoordPointerEXT parameter <type> is not
    SHORT, INT, FLOAT, or DOUBLE_EXT.

    INVALID_VALUE is generated if TexCoordPointerEXT parameter <stride> or
    <count> is negative.

    INVALID_VALUE is generated if EdgeFlagPointerEXT parameter <stride> or
    <count> is negative.

    INVALID_ENUM is generated if GetPointervEXT parameter <pname> is not
    VERTEX_ARRAY_POINTER_EXT, NORMAL_ARRAY_POINTER_EXT,
    COLOR_ARRAY_POINTER_EXT, INDEX_ARRAY_POINTER_EXT,
    TEXTURE_COORD_ARRAY_POINTER_EXT, or EDGE_FLAG_ARRAY_POINTER_EXT.

New State
                                                                Initial
    Get Value                           Get Command     Type    Value   Attrib
    ---------                           -----------     ----    ------- ------
    VERTEX_ARRAY_EXT                    IsEnabled       B       False   client
    VERTEX_ARRAY_SIZE_EXT               GetIntegerv     Z+      4       client
    VERTEX_ARRAY_TYPE_EXT               GetIntegerv     Z4      FLOAT   client
    VERTEX_ARRAY_STRIDE_EXT             GetIntegerv     Z+      0       client
    VERTEX_ARRAY_COUNT_EXT              GetIntegerv     Z+      0       client
    VERTEX_ARRAY_POINTER_EXT            GetPointervEXT  Z+      0       client
    NORMAL_ARRAY_EXT                    IsEnabled       B       False   client
    NORMAL_ARRAY_TYPE_EXT               GetIntegerv     Z5      FLOAT   client
    NORMAL_ARRAY_STRIDE_EXT             GetIntegerv     Z+      0       client
    NORMAL_ARRAY_COUNT_EXT              GetIntegerv     Z+      0       client
    NORMAL_ARRAY_POINTER_EXT            GetPointervEXT  Z+      0       client
    COLOR_ARRAY_EXT                     IsEnabled       B       False   client
    COLOR_ARRAY_SIZE_EXT                GetIntegerv     Z+      4       client
    COLOR_ARRAY_TYPE_EXT                GetIntegerv     Z8      FLOAT   client
    COLOR_ARRAY_STRIDE_EXT              GetIntegerv     Z+      0       client
    COLOR_ARRAY_COUNT_EXT               GetIntegerv     Z+      0       client
    COLOR_ARRAY_POINTER_EXT             GetPointervEXT  Z+      0       client
    INDEX_ARRAY_EXT                     IsEnabled       B       False   client
    INDEX_ARRAY_TYPE_EXT                GetIntegerv     Z4      FLOAT   client
    INDEX_ARRAY_STRIDE_EXT              GetIntegerv     Z+      0       client
    INDEX_ARRAY_COUNT_EXT               GetIntegerv     Z+      0       client
    INDEX_ARRAY_POINTER_EXT             GetPointervEXT  Z+      0       client
    TEXTURE_COORD_ARRAY_EXT             IsEnabled       B       False   client
    TEXTURE_COORD_ARRAY_SIZE_EXT        GetIntegerv     Z+      4       client
    TEXTURE_COORD_ARRAY_TYPE_EXT        GetIntegerv     Z4      FLOAT   client
    TEXTURE_COORD_ARRAY_STRIDE_EXT      GetIntegerv     Z+      0       client
    TEXTURE_COORD_ARRAY_COUNT_EXT       GetIntegerv     Z+      0       client
    TEXTURE_COORD_ARRAY_POINTER_EXT     GetPointervEXT  Z+      0       client
    EDGE_FLAG_ARRAY_EXT                 IsEnabled       B       False   client
    EDGE_FLAG_ARRAY_STRIDE_EXT          GetIntegerv     Z+      0       client
    EDGE_FLAG_ARRAY_COUNT_EXT           GetIntegerv     Z+      0       client
    EDGE_FLAG_ARRAY_POINTER_EXT         GetPointervEXT  Z+      0       client

New Implementation Dependent State

    None
