Name

    EXT_vertex_array_setXXX 
    (No GenName version)

Name Strings

    GL_EXT_vertex_array_setXXX

Version

    $Date: 1999/04/03 08:40:30 $ $Revision: 1.2 $

Number

    ???

Dependencies

    EXT_static_vertex_array   

Overview

    This extension introduces named vertex array sets which encapsulate
    vertex array state on the client side. The main purpose of these 
    sets is to keep pointers to static vertex data and provide a name 
    for different sets of static vertex data. The specification of 
    static vertex data is done through EXT_static_vertex_array extension.

Issues

    *   Should we allow vertex array sets to be shared between
    client side contexts? 

New Procedures and Functions

    const void *CreateArraySetExt(void);

    void BindArraySetEXT(const void *arrayset);

    void DeleteArraySetsEXT(sizei n,
                         const void *arrayset[]);

New Tokens

    Accepted by the <pname> parameter of GetPointerv:

    ARRAY_SET_BINDING_EXT

Additions to Chapter 2, 3, 4 of the 1.1 Specification (OpenGL Operation,
    Rasterization, Per-Fragment Operations and the Frame Buffer)

    None

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

    A vertex array set is created by calling CreateArraySet which
    returns the name of the newly created vertex array set. The 
    newly created vertex array set also becomes the current 
    vertex array set. The state encapsulated by a vertex array 
    set immediately after it is first bound is equivalent to the 
    default vertex array state at GL initialization.

    Subsequent binding of a vertex array set is accomplished by 
    calling BindArraySetEXT with arrayset set to the name of a 
    previously created vertex array set. Subsequent bindings of a
    vertex array set have no effect on its encapsulated state 
    unless changed explicitly.
    
    When an OpenGL context is created, there is set of default vertex
    array state associated with the context. In order that the access to
    this default state is not lost, this extension treats the default state
    as if its name was NULL. Unlike other vertex array sets, the NULL 
    set cannot be deleted.
    
    Vertex array sets are deleted by calling DeleteArraySetsEXT with 
    <arrayset> pointing to a list of <n> names of array sets to be 
    deleted. DeleteArraySetsEXT implicitly performs a UnlockArraysExt 
    on the sets to be deleted before deleting the <arrayset>. Once a 
    vertex array set is deleted, it has no contents, and its name is 
    freed.  If a vertex array set that is currently bound is deleted, 
    the binding reverts to zero. DeleteArraySetsEXT ignores names 
    that do not correspond to array sets, including NULL.
    
Additions to Chapter 6 of the 1.0 Specification (State and State Requests)

    The name of the currently bound vertex array set is returned in <params>
    when GetPointerv is called with <pname> set to ARRAY_SET_BINDING_EXT. 
    If no vertex array set is bound, NULL is returned.
    
    A vertex array set comprises of vertex array pointers, the size and
    type information for each array, the corresponding enable flags and the
    range of static data for each array. More explicitly, the state list
    
    ARRAY_ELEMENT_LOCK_COUNT_EXT
    VERTEX_ARRAY
    VERTEX_ARRAY_SIZE
    VERTEX_ARRAY_TYPE
    VERTEX_ARRAY_STRIDE
    VERTEX_ARRAY_POINTER
    NORMAL_ARRAY
    NORMAL_ARRAY_TYPE
    NORMAL_ARRAY_STRIDE
    NORMAL_ARRAY_POINTER
    COLOR_ARRAY
    COLOR_ARRAY_SIZE
    COLOR_ARRAY_TYPE
    COLOR_ARRAY_STRIDE
    COLOR_ARRAY_POINTER
    INDEX_ARRAY
    INDEX_ARRAY_TYPE
    INDEX_ARRAY_STRIDE
    INDEX_ARRAY_POINTER
    TEXTURE_COORD_ARRAY
    TEXTURE_COORD_ARRAY_SIZE
    TEXTURE_COORD_ARRAY_TYPE
    TEXTURE_COORD_ARRAY_STRIDE
    TEXTURE_COORD_ARRAY_POINTER
    EDGE_FLAG_ARRAY
    EDGE_FLAG_ARRAY_STRIDE
    EDGE_FLAG_ARRAY_POINTER
    
    composes a single vertex array set.
    
    When PushClientAttrib is called with CLIENT_VERTEX_ARRAY_BIT enabled,
    the array pointers, types, size and stride are pushed, as well as
    array pointer enables and the current vertex array set binding.
    When the attribute set that includes vertex array information is
    popped, the binding is first restored to its pushed value and then
    the enables and the array pointers, types, size and stride are
    are restored to their pushed values.

Additions to the GLX Specification

    No change is made to the GLX API.

GLX Protocol

    None

Errors
    INVALID_VALUE is generated if DeleteArraySetsEXT parameter <n> is
    negative.

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

New State

    Get Value               Get Command Type    Value   Attrib
    ---------               ----------- ----    ------- ------

    ARRAY_SET_BINDING_EXT   GetPointerv Y       0       vertex-array

New Implementation Dependent State
    
    None


