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 an 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
