15bd8deadSopenharmony_ciName
25bd8deadSopenharmony_ci
35bd8deadSopenharmony_ci    NV_vertex_array_range
45bd8deadSopenharmony_ci
55bd8deadSopenharmony_ciName Strings
65bd8deadSopenharmony_ci
75bd8deadSopenharmony_ci    GL_NV_vertex_array_range
85bd8deadSopenharmony_ci
95bd8deadSopenharmony_ciContact
105bd8deadSopenharmony_ci
115bd8deadSopenharmony_ci    Mark J. Kilgard, NVIDIA Corporation (mjk 'at' nvidia.com)
125bd8deadSopenharmony_ci
135bd8deadSopenharmony_ciNotice
145bd8deadSopenharmony_ci
155bd8deadSopenharmony_ci    Copyright NVIDIA Corporation, 1999, 2000, 2001.
165bd8deadSopenharmony_ci
175bd8deadSopenharmony_ciIP Status
185bd8deadSopenharmony_ci
195bd8deadSopenharmony_ci    NVIDIA Proprietary.
205bd8deadSopenharmony_ci
215bd8deadSopenharmony_ciStatus
225bd8deadSopenharmony_ci
235bd8deadSopenharmony_ci    Shipping (version 1.1)
245bd8deadSopenharmony_ci
255bd8deadSopenharmony_ci    Existing functionality is augmented by NV_vertex_array_range2.
265bd8deadSopenharmony_ci
275bd8deadSopenharmony_ciVersion
285bd8deadSopenharmony_ci
295bd8deadSopenharmony_ci    NVIDIA Date: September 17, 2001 (version 1.1)
305bd8deadSopenharmony_ci
315bd8deadSopenharmony_ciNumber
325bd8deadSopenharmony_ci
335bd8deadSopenharmony_ci    190
345bd8deadSopenharmony_ci
355bd8deadSopenharmony_ciDependencies
365bd8deadSopenharmony_ci
375bd8deadSopenharmony_ci    None
385bd8deadSopenharmony_ci
395bd8deadSopenharmony_ciOverview
405bd8deadSopenharmony_ci
415bd8deadSopenharmony_ci    The goal of this extension is to permit extremely high vertex
425bd8deadSopenharmony_ci    processing rates via OpenGL vertex arrays even when the CPU lacks
435bd8deadSopenharmony_ci    the necessary data movement bandwidth to keep up with the rate
445bd8deadSopenharmony_ci    at which the vertex engine can consume vertices.  CPUs can keep
455bd8deadSopenharmony_ci    up if they can just pass vertex indices to the hardware and
465bd8deadSopenharmony_ci    let the hardware "pull" the actual vertex data via Direct Memory
475bd8deadSopenharmony_ci    Access (DMA).  Unfortunately, the current OpenGL 1.1 vertex array
485bd8deadSopenharmony_ci    functionality has semantic constraints that make such an approach
495bd8deadSopenharmony_ci    hard.  Hence, the vertex array range extension.
505bd8deadSopenharmony_ci
515bd8deadSopenharmony_ci    This extension provides a mechanism for deferring the pulling of
525bd8deadSopenharmony_ci    vertex array elements to facilitate DMAed pulling of vertices for
535bd8deadSopenharmony_ci    fast, efficient vertex array transfers.  The OpenGL client need only
545bd8deadSopenharmony_ci    pass vertex indices to the hardware which can DMA the actual index's
555bd8deadSopenharmony_ci    vertex data directly out of the client address space.
565bd8deadSopenharmony_ci
575bd8deadSopenharmony_ci    The OpenGL 1.1 vertex array functionality specifies a fairly strict
585bd8deadSopenharmony_ci    coherency model for when OpenGL extracts vertex data from a vertex
595bd8deadSopenharmony_ci    array and when the application can update the in memory
605bd8deadSopenharmony_ci    vertex array data.  The OpenGL 1.1 specification says "Changes
615bd8deadSopenharmony_ci    made to array data between the execution of Begin and the
625bd8deadSopenharmony_ci    corresponding execution of End may affect calls to ArrayElement
635bd8deadSopenharmony_ci    that are made within the same Begin/End period in non-sequential
645bd8deadSopenharmony_ci    ways.  That is, a call to ArrayElement that precedes a change to
655bd8deadSopenharmony_ci    array data may access the changed data, and a call that follows
665bd8deadSopenharmony_ci    a change to array data may access the original data."
675bd8deadSopenharmony_ci
685bd8deadSopenharmony_ci    This means that by the time End returns (and DrawArrays and
695bd8deadSopenharmony_ci    DrawElements return since they have implicit Ends), the actual vertex
705bd8deadSopenharmony_ci    array data must be transferred to OpenGL.  This strict coherency model
715bd8deadSopenharmony_ci    prevents us from simply passing vertex element indices to the hardware
725bd8deadSopenharmony_ci    and having the hardware "pull" the vertex data out (which is often
735bd8deadSopenharmony_ci    long after the End for the primitive has returned to the application).
745bd8deadSopenharmony_ci
755bd8deadSopenharmony_ci    Relaxing this coherency model and bounding the range from which
765bd8deadSopenharmony_ci    vertex array data can be pulled is key to making OpenGL vertex
775bd8deadSopenharmony_ci    array transfers faster and more efficient.
785bd8deadSopenharmony_ci
795bd8deadSopenharmony_ci    The first task of the vertex array range extension is to relax
805bd8deadSopenharmony_ci    the coherency model so that hardware can indeed "pull" vertex
815bd8deadSopenharmony_ci    data from the OpenGL client's address space long after the application
825bd8deadSopenharmony_ci    has completed sending the geometry primitives requiring the vertex
835bd8deadSopenharmony_ci    data.
845bd8deadSopenharmony_ci
855bd8deadSopenharmony_ci    The second problem with the OpenGL 1.1 vertex array functionality is
865bd8deadSopenharmony_ci    the lack of any guidance from the API about what region of memory
875bd8deadSopenharmony_ci    vertices can be pulled from.  There is no size limit for OpenGL 1.1
885bd8deadSopenharmony_ci    vertex arrays.  Any vertex index that points to valid data in all
895bd8deadSopenharmony_ci    enabled arrays is fair game.  This makes it hard for a vertex DMA
905bd8deadSopenharmony_ci    engine to pull vertices since they can be potentially pulled from
915bd8deadSopenharmony_ci    anywhere in the OpenGL client address space.
925bd8deadSopenharmony_ci
935bd8deadSopenharmony_ci    The vertex array range extension specifies a range of the OpenGL
945bd8deadSopenharmony_ci    client's address space where vertices can be pulled.  Vertex indices
955bd8deadSopenharmony_ci    that access any array elements outside the vertex array range
965bd8deadSopenharmony_ci    are specified to be undefined.  This permits hardware to DMA from
975bd8deadSopenharmony_ci    finite regions of OpenGL client address space, making DMA engine
985bd8deadSopenharmony_ci    implementation tractable.
995bd8deadSopenharmony_ci
1005bd8deadSopenharmony_ci    The extension is specified such that an (error free) OpenGL client
1015bd8deadSopenharmony_ci    using the vertex array range functionality could no-op its vertex
1025bd8deadSopenharmony_ci    array range commands and operate equivalently to using (if slower
1035bd8deadSopenharmony_ci    than) the vertex array range functionality.
1045bd8deadSopenharmony_ci
1055bd8deadSopenharmony_ci    Because different memory types (local graphics memory, AGP memory)
1065bd8deadSopenharmony_ci    have different DMA bandwidths and caching behavior, this extension
1075bd8deadSopenharmony_ci    includes a window system dependent memory allocator to allocate
1085bd8deadSopenharmony_ci    cleanly the most appropriate memory for constructing a vertex array
1095bd8deadSopenharmony_ci    range.  The memory allocator provided allows the application to
1105bd8deadSopenharmony_ci    tradeoff the desired CPU read frequency, CPU write frequency, and
1115bd8deadSopenharmony_ci    memory priority while still leaving it up to OpenGL implementation
1125bd8deadSopenharmony_ci    the exact memory type to be allocated.
1135bd8deadSopenharmony_ci
1145bd8deadSopenharmony_ciIssues
1155bd8deadSopenharmony_ci
1165bd8deadSopenharmony_ci    How does this extension interact with the compiled_vertex_array
1175bd8deadSopenharmony_ci    extension?  
1185bd8deadSopenharmony_ci
1195bd8deadSopenharmony_ci       I think they should be independent and not interfere with
1205bd8deadSopenharmony_ci       each other.  In practice, if you use NV_vertex_array_range,
1215bd8deadSopenharmony_ci       you can surpass the performance of compiled_vertex_array
1225bd8deadSopenharmony_ci
1235bd8deadSopenharmony_ci    Should some explanation be added about what happens when an OpenGL
1245bd8deadSopenharmony_ci    application updates its address space in regions overlapping with
1255bd8deadSopenharmony_ci    the currently configured vertex array range?
1265bd8deadSopenharmony_ci
1275bd8deadSopenharmony_ci       RESOLUTION:  I think the right thing is to say that you get
1285bd8deadSopenharmony_ci       non-sequential results.  In practice, you'll be using an old
1295bd8deadSopenharmony_ci       context DMA pointing to the old pages.
1305bd8deadSopenharmony_ci
1315bd8deadSopenharmony_ci       If the application change's its address space within the
1325bd8deadSopenharmony_ci       vertex array range, the application should call
1335bd8deadSopenharmony_ci       glVertexArrayRangeNV again.  That will re-make a new vertex
1345bd8deadSopenharmony_ci       array range context DMA for the application's current address
1355bd8deadSopenharmony_ci       space.
1365bd8deadSopenharmony_ci
1375bd8deadSopenharmony_ci    If we are falling back to software transformation, do we still need to
1385bd8deadSopenharmony_ci    abide by leaving "undefined" vertices outside the vertex array range?
1395bd8deadSopenharmony_ci    For example, pointers that are not 32-bit aligned would likely cause
1405bd8deadSopenharmony_ci    a fall back.
1415bd8deadSopenharmony_ci
1425bd8deadSopenharmony_ci       RESOLUTION:  No.  The fact that vertex is "undefined" means we
1435bd8deadSopenharmony_ci       can do anything we want (as long as we send a vertex and do not
1445bd8deadSopenharmony_ci       crash) so it is perfectly fine for the software puller to
1455bd8deadSopenharmony_ci       grab vertex information not available to the hardware puller.
1465bd8deadSopenharmony_ci
1475bd8deadSopenharmony_ci    Should we give a programmer a sense of how big a vertex array
1485bd8deadSopenharmony_ci    range they can specify?
1495bd8deadSopenharmony_ci
1505bd8deadSopenharmony_ci       RESOLUTION:  No.  Just document it if there are limitations.
1515bd8deadSopenharmony_ci       Probably very hardware and operating system dependent.
1525bd8deadSopenharmony_ci
1535bd8deadSopenharmony_ci    Is it clear enough that language about ArrayElement
1545bd8deadSopenharmony_ci    also applies to DrawArrays and DrawElements?
1555bd8deadSopenharmony_ci
1565bd8deadSopenharmony_ci       Maybe not, but OpenGL 1.1 spec is clear that DrawArrays and
1575bd8deadSopenharmony_ci       DrawElements are defined in terms of ArrayElement.
1585bd8deadSopenharmony_ci
1595bd8deadSopenharmony_ci    Should glFlush be the same as glVertexArrayRangeFlush?
1605bd8deadSopenharmony_ci
1615bd8deadSopenharmony_ci       RESOLUTION:  No.  A glFlush is cheaper than a glVertexArrayRangeFlush
1625bd8deadSopenharmony_ci       though a glVertexArrayRangeFlushNV should do a flush.
1635bd8deadSopenharmony_ci
1645bd8deadSopenharmony_ci    If any the data for any enabled array for a given array element index
1655bd8deadSopenharmony_ci    falls outside of the vertex array range, what happens?
1665bd8deadSopenharmony_ci
1675bd8deadSopenharmony_ci       RESOLUTION:  An undefined vertex is generated.
1685bd8deadSopenharmony_ci
1695bd8deadSopenharmony_ci    What error is generated in this case?
1705bd8deadSopenharmony_ci
1715bd8deadSopenharmony_ci       I don't know yet.  We should make sure the hardware really does
1725bd8deadSopenharmony_ci       let us know when vertices are undefined.
1735bd8deadSopenharmony_ci
1745bd8deadSopenharmony_ci       Note that this is a little weird for OpenGL since most errors
1755bd8deadSopenharmony_ci       in OpenGL result in the command being ignored.  Not in this
1765bd8deadSopenharmony_ci       case though.
1775bd8deadSopenharmony_ci
1785bd8deadSopenharmony_ci    Should this extension support an interface for allocating video
1795bd8deadSopenharmony_ci    and AGP memory?
1805bd8deadSopenharmony_ci
1815bd8deadSopenharmony_ci       RESOLUTION:  YES.  It seems like we should be able to leave
1825bd8deadSopenharmony_ci       the task of memory allocation to DirectDraw, but DirectDraw's
1835bd8deadSopenharmony_ci       asynchronous unmapping behavior and having to hold locks to
1845bd8deadSopenharmony_ci       update DirectDraw surfaces makes that mechanism to cumbersome.
1855bd8deadSopenharmony_ci
1865bd8deadSopenharmony_ci       Plus the API is a lot easier if we do it ourselves.
1875bd8deadSopenharmony_ci
1885bd8deadSopenharmony_ci    How do we decide what type of memory to allocate for the application?
1895bd8deadSopenharmony_ci
1905bd8deadSopenharmony_ci       RESOLUTION:  Usage hints.  The application rates the read
1915bd8deadSopenharmony_ci       frequency (how often will they read the memory), the write
1925bd8deadSopenharmony_ci       frequency (how often will they write the memory), and the
1935bd8deadSopenharmony_ci       priority (how important is this memory relative to other
1945bd8deadSopenharmony_ci       uses for the memory such as texturing) on a scale of 1.0
1955bd8deadSopenharmony_ci       to 0.0.  Using these hints and the size of the memory requsted,
1965bd8deadSopenharmony_ci       the OpenGL implementation decides where to allocate the memory.
1975bd8deadSopenharmony_ci
1985bd8deadSopenharmony_ci       We try to not directly expose particular types of memory
1995bd8deadSopenharmony_ci       (AGP, local memory, cached/uncached, etc) so future memory
2005bd8deadSopenharmony_ci       types can be supported by merely updating the OpenGL
2015bd8deadSopenharmony_ci       implementation.
2025bd8deadSopenharmony_ci
2035bd8deadSopenharmony_ci    Should the memory allocator functionality be available be a part
2045bd8deadSopenharmony_ci    of the GL or window system dependent (GLX or WGL) APIs?
2055bd8deadSopenharmony_ci
2065bd8deadSopenharmony_ci       RESOLUTION:  The window system dependent API.
2075bd8deadSopenharmony_ci
2085bd8deadSopenharmony_ci       The memory allocator should be considered a window system/
2095bd8deadSopenharmony_ci       operating system dependent operation.  This also permits
2105bd8deadSopenharmony_ci       memory to be allocated when no OpenGL rendering contexts
2115bd8deadSopenharmony_ci       exist yet.
2125bd8deadSopenharmony_ci
2135bd8deadSopenharmony_ciNew Procedures and Functions
2145bd8deadSopenharmony_ci
2155bd8deadSopenharmony_ci    void VertexArrayRangeNV(sizei length, void *pointer)
2165bd8deadSopenharmony_ci    void FlushVertexArrayRangeNV(void)
2175bd8deadSopenharmony_ci
2185bd8deadSopenharmony_ciNew Tokens
2195bd8deadSopenharmony_ci
2205bd8deadSopenharmony_ci    Accepted by the <cap> parameter of EnableClientState,
2215bd8deadSopenharmony_ci    DisableClientState, and IsEnabled:
2225bd8deadSopenharmony_ci
2235bd8deadSopenharmony_ci        VERTEX_ARRAY_RANGE_NV              0x851D
2245bd8deadSopenharmony_ci
2255bd8deadSopenharmony_ci    Accepted by the <pname> parameter of GetBooleanv, GetIntegerv,
2265bd8deadSopenharmony_ci    GetFloatv, and GetDoublev:
2275bd8deadSopenharmony_ci
2285bd8deadSopenharmony_ci        VERTEX_ARRAY_RANGE_LENGTH_NV       0x851E
2295bd8deadSopenharmony_ci        VERTEX_ARRAY_RANGE_VALID_NV        0x851F
2305bd8deadSopenharmony_ci        MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV  0x8520
2315bd8deadSopenharmony_ci
2325bd8deadSopenharmony_ci    Accepted by the <pname> parameter of GetPointerv:
2335bd8deadSopenharmony_ci
2345bd8deadSopenharmony_ci        VERTEX_ARRAY_RANGE_POINTER_NV      0x8521
2355bd8deadSopenharmony_ci
2365bd8deadSopenharmony_ciAdditions to Chapter 2 of the OpenGL 1.1 Specification (OpenGL Operation)
2375bd8deadSopenharmony_ci
2385bd8deadSopenharmony_ci    After the discussion of vertex arrays (Section 2.8) add a
2395bd8deadSopenharmony_ci    description of the vertex array range:
2405bd8deadSopenharmony_ci
2415bd8deadSopenharmony_ci    "The command 
2425bd8deadSopenharmony_ci
2435bd8deadSopenharmony_ci       void VertexArrayRangeNV(sizei length, void *pointer)
2445bd8deadSopenharmony_ci
2455bd8deadSopenharmony_ci    specifies the current vertex array range.  When the vertex array
2465bd8deadSopenharmony_ci    range is enabled and valid, vertex array vertex transfers from within
2475bd8deadSopenharmony_ci    the vertex array range are potentially faster.  The vertex array
2485bd8deadSopenharmony_ci    range is a contiguous region of (virtual) address space for placing
2495bd8deadSopenharmony_ci    vertex arrays.  The "pointer" parameter is a pointer to the base of
2505bd8deadSopenharmony_ci    the vertex array range.  The "length" pointer is the length of the
2515bd8deadSopenharmony_ci    vertex array range in basic machine units (typically unsigned bytes).
2525bd8deadSopenharmony_ci
2535bd8deadSopenharmony_ci    The vertex array range address space region extends from "pointer"
2545bd8deadSopenharmony_ci    to "pointer + length - 1" inclusive.  When specified and enabled,
2555bd8deadSopenharmony_ci    vertex array vertex transfers from within the vertex array range
2565bd8deadSopenharmony_ci    are potentially faster.
2575bd8deadSopenharmony_ci
2585bd8deadSopenharmony_ci    There is some system burden associated with establishing a vertex
2595bd8deadSopenharmony_ci    array range (typically, the memory range must be locked down).
2605bd8deadSopenharmony_ci    If either the vertex array range pointer or size is set to zero,
2615bd8deadSopenharmony_ci    the previously established vertex array range is released (typically,
2625bd8deadSopenharmony_ci    unlocking the memory).
2635bd8deadSopenharmony_ci
2645bd8deadSopenharmony_ci    The vertex array range may not be established for operating system
2655bd8deadSopenharmony_ci    dependent reasons, and therefore, not valid.  Reasons that a vertex
2665bd8deadSopenharmony_ci    array range cannot be established include spanning different memory
2675bd8deadSopenharmony_ci    types, the memory could not be locked down, alignment restrictions
2685bd8deadSopenharmony_ci    are not met, etc.
2695bd8deadSopenharmony_ci
2705bd8deadSopenharmony_ci    The vertex array range is enabled or disabled by calling
2715bd8deadSopenharmony_ci    EnableClientState or DisableClientState with the symbolic
2725bd8deadSopenharmony_ci    constant VERTEX_ARRAY_RANGE_NV.
2735bd8deadSopenharmony_ci
2745bd8deadSopenharmony_ci    The vertex array range is either valid or invalid and this state can
2755bd8deadSopenharmony_ci    be determined by querying VERTEX_ARRAY_RANGE_VALID_NV.  The vertex
2765bd8deadSopenharmony_ci    array range is valid when the following conditions are met:
2775bd8deadSopenharmony_ci
2785bd8deadSopenharmony_ci      o  VERTEX_ARRAY_RANGE_NV is enabled.
2795bd8deadSopenharmony_ci
2805bd8deadSopenharmony_ci      o  VERTEX_ARRAY is enabled.
2815bd8deadSopenharmony_ci
2825bd8deadSopenharmony_ci      o  VertexArrayRangeNV has been called with a non-null pointer and
2835bd8deadSopenharmony_ci         non-zero size.
2845bd8deadSopenharmony_ci
2855bd8deadSopenharmony_ci      o  The vertex array range has been established.
2865bd8deadSopenharmony_ci
2875bd8deadSopenharmony_ci      o  An implementation-dependent validity check based on the
2885bd8deadSopenharmony_ci         pointer alignment, size, and underlying memory type of the
2895bd8deadSopenharmony_ci         vertex array range region of memory.
2905bd8deadSopenharmony_ci
2915bd8deadSopenharmony_ci      o  An implementation-dependent validity check based on
2925bd8deadSopenharmony_ci         the current vertex array state including the strides, sizes,
2935bd8deadSopenharmony_ci         types, and pointer alignments (but not pointer value) for
2945bd8deadSopenharmony_ci         currently enabled vertex arrays.
2955bd8deadSopenharmony_ci
2965bd8deadSopenharmony_ci      o  Other implementation-dependent validaity checks based on
2975bd8deadSopenharmony_ci         other OpenGL rendering state.
2985bd8deadSopenharmony_ci
2995bd8deadSopenharmony_ci    Otherwise, the vertex array range is not valid.  If the vertex array
3005bd8deadSopenharmony_ci    range is not valid, vertex array transfers will not be faster.
3015bd8deadSopenharmony_ci
3025bd8deadSopenharmony_ci    When the vertex array range is valid, ArrayElement commands may
3035bd8deadSopenharmony_ci    generate undefined vertices if and only if any indexed elements of
3045bd8deadSopenharmony_ci    the enabled arrays are not within the vertex array range or if the
3055bd8deadSopenharmony_ci    index is negative or greater or equal to the implementation-dependent
3065bd8deadSopenharmony_ci    value of MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV.  If an undefined vertex
3075bd8deadSopenharmony_ci    is generated, an INVALID_OPERATION error may or may not be generated.
3085bd8deadSopenharmony_ci
3095bd8deadSopenharmony_ci    The vertex array cohenecy model specifies when vertex data must be
3105bd8deadSopenharmony_ci    be extracted from the vertex array memory.  When the vertex array
3115bd8deadSopenharmony_ci    range is not valid, (quoting the specification) `Changes made to
3125bd8deadSopenharmony_ci    array data between the execution of Begin and the corresponding
3135bd8deadSopenharmony_ci    execution of End may effect calls to ArrayElement that are made
3145bd8deadSopenharmony_ci    within the same Begin/End period in non-sequential ways.  That is,
3155bd8deadSopenharmony_ci    a call to ArrayElement that precedes a change to array data may
3165bd8deadSopenharmony_ci    access the changed data, and a call that follows a change to array
3175bd8deadSopenharmony_ci    data may access the original data.'
3185bd8deadSopenharmony_ci
3195bd8deadSopenharmony_ci    When the vertex array range is valid, the vertex array coherency
3205bd8deadSopenharmony_ci    model is relaxed so that changes made to array data until the next
3215bd8deadSopenharmony_ci    "vertex array range flush" may affects calls to ArrayElement in
3225bd8deadSopenharmony_ci    non-sequential ways.  That is a call to ArrayElement that precedes
3235bd8deadSopenharmony_ci    a change to array data (without an intervening "vertex array range
3245bd8deadSopenharmony_ci    flush") may access the changed data, and a call that follows a change
3255bd8deadSopenharmony_ci    (without an intervening "vertex array range flush") to array data
3265bd8deadSopenharmony_ci    may access original data.
3275bd8deadSopenharmony_ci
3285bd8deadSopenharmony_ci    A 'vertex array range flush' occurs when one of the following
3295bd8deadSopenharmony_ci    operations occur:
3305bd8deadSopenharmony_ci
3315bd8deadSopenharmony_ci       o  Finish returns.
3325bd8deadSopenharmony_ci
3335bd8deadSopenharmony_ci       o  FlushVertexArrayRangeNV returns.
3345bd8deadSopenharmony_ci
3355bd8deadSopenharmony_ci       o  VertexArrayRangeNV returns.
3365bd8deadSopenharmony_ci
3375bd8deadSopenharmony_ci       o  DisableClientState of VERTEX_ARRAY_RANGE_NV returns.
3385bd8deadSopenharmony_ci
3395bd8deadSopenharmony_ci       o  EnableClientState of VERTEX_ARRAY_RANGE_NV returns.
3405bd8deadSopenharmony_ci
3415bd8deadSopenharmony_ci       o  Another OpenGL context is made current.
3425bd8deadSopenharmony_ci
3435bd8deadSopenharmony_ci    The client state required to implement the vertex array range
3445bd8deadSopenharmony_ci    consists of an enable bit, a memory pointer, an integer size,
3455bd8deadSopenharmony_ci    and a valid bit.
3465bd8deadSopenharmony_ci
3475bd8deadSopenharmony_ci    If the memory mapping of pages within the vertex array range changes,
3485bd8deadSopenharmony_ci    using the vertex array range may or may not result in undefined data
3495bd8deadSopenharmony_ci    being fetched from the vertex arrays when the vertex array range is
3505bd8deadSopenharmony_ci    enabled and valid.  To ensure that the vertex array range reflects
3515bd8deadSopenharmony_ci    the address space's current state, the application is responsible
3525bd8deadSopenharmony_ci    for calling VertexArrayRange again after any memory mapping changes
3535bd8deadSopenharmony_ci    within the vertex array range."llo
3545bd8deadSopenharmony_ci
3555bd8deadSopenharmony_ciAdditions to Chapter 5 of the OpenGL 1.1 Specification (Special Functions)
3565bd8deadSopenharmony_ci
3575bd8deadSopenharmony_ci    Add to the end of Section 5.4 "Display Lists"
3585bd8deadSopenharmony_ci
3595bd8deadSopenharmony_ci    "VertexArrayRangeNV and FlushVertexArrayRangeNV are not complied
3605bd8deadSopenharmony_ci    into display lists but are executed immediately.
3615bd8deadSopenharmony_ci
3625bd8deadSopenharmony_ci    If a display list is compiled while VERTEX_ARRAY_RANGE_NV is
3635bd8deadSopenharmony_ci    enabled, the commands ArrayElement, DrawArrays, DrawElements,
3645bd8deadSopenharmony_ci    and DrawRangeElements are accumulated into a display list as
3655bd8deadSopenharmony_ci    if VERTEX_ARRAY_RANGE_NV is disabled."
3665bd8deadSopenharmony_ci
3675bd8deadSopenharmony_ciAdditions to the WGL interface:
3685bd8deadSopenharmony_ci
3695bd8deadSopenharmony_ci    "When establishing a vertex array range, certain types of memory
3705bd8deadSopenharmony_ci    may be more efficient than other types of memory.  The commands
3715bd8deadSopenharmony_ci     
3725bd8deadSopenharmony_ci       void *wglAllocateMemoryNV(sizei size,
3735bd8deadSopenharmony_ci                                 float readFrequency,
3745bd8deadSopenharmony_ci                                 float writeFrequency,
3755bd8deadSopenharmony_ci                                 float priority)
3765bd8deadSopenharmony_ci       void wglFreeMemoryNV(void *pointer)
3775bd8deadSopenharmony_ci    
3785bd8deadSopenharmony_ci    allocate and free memory that may be more suitable for establishing
3795bd8deadSopenharmony_ci    an efficient vertex array range than memory allocated by other means.
3805bd8deadSopenharmony_ci    The wglAllocateMemoryNV command allocates <size> bytes of contiguous
3815bd8deadSopenharmony_ci    memory.  
3825bd8deadSopenharmony_ci
3835bd8deadSopenharmony_ci    The <readFrequency>, <writeFrequency>, and <priority> parameters are
3845bd8deadSopenharmony_ci    usage hints that the OpenGL implementation can use to determine the
3855bd8deadSopenharmony_ci    best type of memory to allocate.  These parameters range from 0.0
3865bd8deadSopenharmony_ci    to 1.0.  A <readFrequency> of 1.0 indicates that the application
3875bd8deadSopenharmony_ci    intends to frequently read the allocated memory; a <readFrequency>
3885bd8deadSopenharmony_ci    of 0.0 indicates that the application will rarely or never read the
3895bd8deadSopenharmony_ci    memory.  A <writeFrequency> of 1.0 indicates that the application
3905bd8deadSopenharmony_ci    intends to frequently write the allocated memory; a <writeFrequency>
3915bd8deadSopenharmony_ci    of 0.0 indicates that the application will rarely write the memory.
3925bd8deadSopenharmony_ci    A <priority> parameter of 1.0 indicates that memory type should be
3935bd8deadSopenharmony_ci    the most efficient available memory, even at the expense of (for
3945bd8deadSopenharmony_ci    example) available texture memory; a <priority> of 0.0 indicates that
3955bd8deadSopenharmony_ci    the vertex array range does not require an efficient memory type
3965bd8deadSopenharmony_ci    (for example, so that more efficient memory is available for other
3975bd8deadSopenharmony_ci    purposes such as texture memory).
3985bd8deadSopenharmony_ci
3995bd8deadSopenharmony_ci    The OpenGL implementation is free to use the <size>, <readFrequency>,
4005bd8deadSopenharmony_ci    <writeFrequency>, and <priority> parameters to determine what memory
4015bd8deadSopenharmony_ci    type should be allocated.  The memory types available and how the
4025bd8deadSopenharmony_ci    memory type is determined is implementation dependent (and the
4035bd8deadSopenharmony_ci    implementation is free to ignore any or all of the above parameters).
4045bd8deadSopenharmony_ci
4055bd8deadSopenharmony_ci    Possible memory types that could be allocated are uncached memory,
4065bd8deadSopenharmony_ci    write-combined memory, graphics hardware memory, etc.  The intent
4075bd8deadSopenharmony_ci    of the wglAllocateMemoryNV command is to permit the allocation of
4085bd8deadSopenharmony_ci    memory for efficient vertex array range usage.  However, there is
4095bd8deadSopenharmony_ci    no requirement that memory allocated by wglAllocateMemoryNV must be
4105bd8deadSopenharmony_ci    used to allocate memory for vertex array ranges.
4115bd8deadSopenharmony_ci
4125bd8deadSopenharmony_ci    If the memory cannot be allocated, a NULL pointer is returned (and
4135bd8deadSopenharmony_ci    no OpenGL error is generated).  An implementation that does not
4145bd8deadSopenharmony_ci    support this extension's memory allocation interface is free to
4155bd8deadSopenharmony_ci    never allocate memory (always return NULL).
4165bd8deadSopenharmony_ci
4175bd8deadSopenharmony_ci    The wglFreeMemoryNV command frees memory allocated with
4185bd8deadSopenharmony_ci    wglAllocateMemoryNV.  The <pointer> should be a pointer returned by
4195bd8deadSopenharmony_ci    wglAllocateMemoryNV and not previously freed.  If a pointer is passed
4205bd8deadSopenharmony_ci    to wglFreeMemoryNV that was not allocated via wglAllocateMemoryNV
4215bd8deadSopenharmony_ci    or was previously freed (without being reallocated), the free is
4225bd8deadSopenharmony_ci    ignored with no error reported.
4235bd8deadSopenharmony_ci
4245bd8deadSopenharmony_ci    The memory allocated by wglAllocateMemoryNV should be available to
4255bd8deadSopenharmony_ci    all other threads in the address space where the memory is allocated
4265bd8deadSopenharmony_ci    (the memory is not private to a single thread).  Any thread in the
4275bd8deadSopenharmony_ci    address space (not simply the thread that allocated the memory)
4285bd8deadSopenharmony_ci    may use wglFreeMemoryNV to free memory allocated by itself or any
4295bd8deadSopenharmony_ci    other thread.
4305bd8deadSopenharmony_ci
4315bd8deadSopenharmony_ci    Because wglAllocateMemoryNV and wglFreeMemoryNV are not OpenGL
4325bd8deadSopenharmony_ci    rendering commands, these commands do not require a current context.
4335bd8deadSopenharmony_ci    They operate normally even if called within a Begin/End or while
4345bd8deadSopenharmony_ci    compiling a display list."
4355bd8deadSopenharmony_ci
4365bd8deadSopenharmony_ciAdditions to the GLX Specification
4375bd8deadSopenharmony_ci
4385bd8deadSopenharmony_ci    Same language as the "Additions to the WGL Specification" section
4395bd8deadSopenharmony_ci    except all references to wglAllocateMemoryNV and wglFreeMemoryNV
4405bd8deadSopenharmony_ci    should be replaced with glXAllocateMemoryNV and glXFreeMemoryNV
4415bd8deadSopenharmony_ci    respectively.
4425bd8deadSopenharmony_ci
4435bd8deadSopenharmony_ci    Additional language:
4445bd8deadSopenharmony_ci
4455bd8deadSopenharmony_ci    "OpenGL implementations using GLX indirect rendering should fail
4465bd8deadSopenharmony_ci    to set up the vertex array range (failing to set the vertex array
4475bd8deadSopenharmony_ci    valid bit so the vertex array range functionality is not usable).
4485bd8deadSopenharmony_ci    Additionally, glXAllocateMemoryNV always fails to allocate memory
4495bd8deadSopenharmony_ci    (returns NULL) when used with an indirect rendering context."
4505bd8deadSopenharmony_ci
4515bd8deadSopenharmony_ciGLX Protocol
4525bd8deadSopenharmony_ci
4535bd8deadSopenharmony_ci    None
4545bd8deadSopenharmony_ci
4555bd8deadSopenharmony_ciErrors
4565bd8deadSopenharmony_ci
4575bd8deadSopenharmony_ci    INVALID_OPERATION is generated if VertexArrayRange or
4585bd8deadSopenharmony_ci    FlushVertexArrayRange is called between the execution of Begin
4595bd8deadSopenharmony_ci    and the corresponding execution of End.
4605bd8deadSopenharmony_ci
4615bd8deadSopenharmony_ci    INVALID_OPERATION may be generated if an undefined vertex is
4625bd8deadSopenharmony_ci    generated.
4635bd8deadSopenharmony_ci
4645bd8deadSopenharmony_ciNew State
4655bd8deadSopenharmony_ci
4665bd8deadSopenharmony_ci                                                            Initial
4675bd8deadSopenharmony_ci   Get Value                       Get Command     Type    Value    Attrib
4685bd8deadSopenharmony_ci   ---------                       -----------     ----    -------  ------------
4695bd8deadSopenharmony_ci   VERTEX_ARRAY_RANGE_NV           IsEnabled       B       False    vertex-array
4705bd8deadSopenharmony_ci   VERTEX_ARRAY_RANGE_POINTER_NV   GetPointerv     Z+      0        vertex-array
4715bd8deadSopenharmony_ci   VERTEX_ARRAY_RANGE_LENGTH_NV    GetIntegerv     Z+      0        vertex-array
4725bd8deadSopenharmony_ci   VERTEX_ARRAY_RANGE_VALID_NV     GetBooleanv     B       False    vertex-array
4735bd8deadSopenharmony_ci
4745bd8deadSopenharmony_ciNew Implementation Dependent State
4755bd8deadSopenharmony_ci
4765bd8deadSopenharmony_ci    Get Value                           Get Command     Type    Minimum Value
4775bd8deadSopenharmony_ci    ---------                           -----------     -----   -------------
4785bd8deadSopenharmony_ci    MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV   GetIntegerv     Z+      65535
4795bd8deadSopenharmony_ci
4805bd8deadSopenharmony_ciNV10 Implementation Details
4815bd8deadSopenharmony_ci
4825bd8deadSopenharmony_ci    This section describes implementation-defined limits for NV10:
4835bd8deadSopenharmony_ci
4845bd8deadSopenharmony_ci         The value of MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV is 65535.
4855bd8deadSopenharmony_ci
4865bd8deadSopenharmony_ci    This section describes bugs in the NV10 vertex array range.  These
4875bd8deadSopenharmony_ci    bugs will be fixed in a future hardware release:
4885bd8deadSopenharmony_ci
4895bd8deadSopenharmony_ci         If VERTEX_ARRAY is enabled with a format of GL_SHORT and the
4905bd8deadSopenharmony_ci         vertex array range is valid, a vertex array vertex with an X,
4915bd8deadSopenharmony_ci         Y, Z, or W coordinate of -32768 is wrongly interpreted as zero.
4925bd8deadSopenharmony_ci         Example: the X,Y coordinate (-32768,-32768) is incorrectly read
4935bd8deadSopenharmony_ci         as (0,0) from the vertex array.
4945bd8deadSopenharmony_ci
4955bd8deadSopenharmony_ci         If TEXTURE_COORD_ARRAY is enabled with a format of GL_SHORT
4965bd8deadSopenharmony_ci         and the vertex array range is valid, a vertex array texture
4975bd8deadSopenharmony_ci         coord with an S, T, R, or Q coordinate of -32768 is wrongly
4985bd8deadSopenharmony_ci         interpreted as zero.  Example: the S,T coordinate (-32768,-32768)
4995bd8deadSopenharmony_ci         is incorrectly read as (0,0) from the texture coord array.
5005bd8deadSopenharmony_ci
5015bd8deadSopenharmony_ci    This section describes the implementation-dependent validity
5025bd8deadSopenharmony_ci    checks for NV10.
5035bd8deadSopenharmony_ci     
5045bd8deadSopenharmony_ci      o  For the NV10 implementation-dependent validity check for the
5055bd8deadSopenharmony_ci         vertex array range region of memory to be true, all of the
5065bd8deadSopenharmony_ci         following must be true:
5075bd8deadSopenharmony_ci
5085bd8deadSopenharmony_ci         1.  The <pointer> must be 32-byte aligned.
5095bd8deadSopenharmony_ci
5105bd8deadSopenharmony_ci         2.  The underlying memory types must all be the same (all
5115bd8deadSopenharmony_ci             standard system memory -OR- all AGP memory -OR- all video
5125bd8deadSopenharmony_ci             memory).
5135bd8deadSopenharmony_ci
5145bd8deadSopenharmony_ci     o  For the NV10 implementation-dependent validity check for the
5155bd8deadSopenharmony_ci        vertex array state to be true, all of the following must be
5165bd8deadSopenharmony_ci        true:
5175bd8deadSopenharmony_ci
5185bd8deadSopenharmony_ci        1.  ( VERTEX_ARRAY must be enabled -AND-
5195bd8deadSopenharmony_ci              The vertex array stride must be less than 256 -AND-
5205bd8deadSopenharmony_ci              ( ( The vertex array type must be FLOAT -AND-
5215bd8deadSopenharmony_ci                  The vertex array stride must be a multiple of 4 bytes -AND-
5225bd8deadSopenharmony_ci                  The vertex array pointer must be 4-byte aligned -AND-
5235bd8deadSopenharmony_ci                  The vertex array size must be 2, 3, or 4 ) -OR-
5245bd8deadSopenharmony_ci                ( The vertex array type must be SHORT -AND-
5255bd8deadSopenharmony_ci                  The vertex array stride must be a multiple of 4 bytes -AND-
5265bd8deadSopenharmony_ci                  The vertex array pointer must be 4-byte aligned. -AND-
5275bd8deadSopenharmony_ci                  The vertex array size must be 2 ) -OR-
5285bd8deadSopenharmony_ci                ( The vertex array type must be SHORT -AND-
5295bd8deadSopenharmony_ci                  The vertex array stride must be a multiple of 8 bytes -AND-
5305bd8deadSopenharmony_ci                  The vertex array pointer must be 8-byte aligned. -AND-
5315bd8deadSopenharmony_ci                  The vertex array size must be 3 or 4 ) ) )
5325bd8deadSopenharmony_ci
5335bd8deadSopenharmony_ci        2.  ( NORMAL_ARRAY must be disabled. ) -OR -
5345bd8deadSopenharmony_ci            ( NORMAL_ARRAY must be enabled -AND-
5355bd8deadSopenharmony_ci              The normal array size must be 3 -AND-
5365bd8deadSopenharmony_ci              The normal array stride must be less than 256 -AND-
5375bd8deadSopenharmony_ci              ( ( The normal array type must be FLOAT -AND-
5385bd8deadSopenharmony_ci                  The normal array stride must be a multiple of 4 bytes -AND-
5395bd8deadSopenharmony_ci                  The normal array pointer must be 4-byte aligned. ) -OR-
5405bd8deadSopenharmony_ci                ( The normal array type must be SHORT -AND-
5415bd8deadSopenharmony_ci                  The normal array stride must be a multiple of 8 bytes -AND-
5425bd8deadSopenharmony_ci                  The normal array pointer must be 8-byte aligned. ) ) )
5435bd8deadSopenharmony_ci                   
5445bd8deadSopenharmony_ci        3.  ( COLOR_ARRAY must be disabled. ) -OR -
5455bd8deadSopenharmony_ci            ( COLOR_ARRAY must be enabled -AND-
5465bd8deadSopenharmony_ci              The color array type must be FLOAT or UNSIGNED_BYTE -AND-
5475bd8deadSopenharmony_ci              The color array stride must be a multiple of 4 bytes -AND-
5485bd8deadSopenharmony_ci              The color array stride must be less than 256 -AND-
5495bd8deadSopenharmony_ci              The color array pointer must be 4-byte aligned -AND-
5505bd8deadSopenharmony_ci              The color array size must be 3 or 4 )
5515bd8deadSopenharmony_ci
5525bd8deadSopenharmony_ci        4.  ( SECONDARY_COLOR_ARRAY must be disabled. ) -OR -
5535bd8deadSopenharmony_ci            ( SECONDARY_COLOR_ARRAY must be enabled -AND-
5545bd8deadSopenharmony_ci              The secondary color array type must be FLOAT or UNSIGNED_BYTE -AND-
5555bd8deadSopenharmony_ci              The secondary color array stride must be a multiple of 4 bytes -AND-
5565bd8deadSopenharmony_ci              The secondary color array stride must be less than 256 -AND-
5575bd8deadSopenharmony_ci              The secondary color array pointer must be 4-byte aligned -AND-
5585bd8deadSopenharmony_ci              The secondary color array size must be 3 or 4 )
5595bd8deadSopenharmony_ci
5605bd8deadSopenharmony_ci        5.  For texture units zero and one:
5615bd8deadSopenharmony_ci
5625bd8deadSopenharmony_ci            ( TEXTURE_COORD_ARRAY must be disabled. ) -OR -
5635bd8deadSopenharmony_ci            ( TEXTURE_COORD_ARRAY must be enabled -AND-
5645bd8deadSopenharmony_ci              The texture coord array stride must be less than 256 -AND-
5655bd8deadSopenharmony_ci              ( ( The texture coord array type must be FLOAT -AND-
5665bd8deadSopenharmony_ci                  The texture coord array pointer must be 4-byte aligned. ) 
5675bd8deadSopenharmony_ci                  The texture coord array stride must be a multiple of 4 bytes -AND-
5685bd8deadSopenharmony_ci                  The texture coord array size must be 1, 2, 3, or 4 ) -OR-
5695bd8deadSopenharmony_ci                ( The texture coord array type must be SHORT -AND-
5705bd8deadSopenharmony_ci                  The texture coord array pointer must be 4-byte aligned. ) 
5715bd8deadSopenharmony_ci                  The texture coord array stride must be a multiple of 4 bytes -AND-
5725bd8deadSopenharmony_ci                  The texture coord array size must be 1 ) -OR-
5735bd8deadSopenharmony_ci                ( The texture coord array type must be SHORT -AND-
5745bd8deadSopenharmony_ci                  The texture coord array pointer must be 4-byte aligned. ) 
5755bd8deadSopenharmony_ci                  The texture coord array stride must be a multiple of 4 bytes -AND-
5765bd8deadSopenharmony_ci                  The texture coord array size must be 2 ) -OR-
5775bd8deadSopenharmony_ci                ( The texture coord array type must be SHORT -AND-
5785bd8deadSopenharmony_ci                  The texture coord array pointer must be 8-byte aligned. ) 
5795bd8deadSopenharmony_ci                  The texture coord array stride must be a multiple of 8 bytes -AND-
5805bd8deadSopenharmony_ci                  The texture coord array size must be 3 ) -OR-
5815bd8deadSopenharmony_ci                ( The texture coord array type must be SHORT -AND-
5825bd8deadSopenharmony_ci                  The texture coord array pointer must be 8-byte aligned. ) 
5835bd8deadSopenharmony_ci                  The texture coord array stride must be a multiple of 8 bytes -AND-
5845bd8deadSopenharmony_ci                  The texture coord array size must be 4 ) ) )
5855bd8deadSopenharmony_ci            
5865bd8deadSopenharmony_ci        6.  ( EDGE_FLAG_ARRAY must be disabled. )
5875bd8deadSopenharmony_ci
5885bd8deadSopenharmony_ci        7.  ( VERTEX_WEIGHT_ARRAY_NV must be disabled. ) -OR -
5895bd8deadSopenharmony_ci            ( VERTEX_WEIGHT_ARRAY_NV must be enabled. -AND -
5905bd8deadSopenharmony_ci              The vertex weight array type must be FLOAT -AND-
5915bd8deadSopenharmony_ci              The vertex weight array size must be 1 -AND-
5925bd8deadSopenharmony_ci              The vertex weight array stride must be a multiple of 4 bytes -AND-
5935bd8deadSopenharmony_ci              The vertex weight array stride must be less than 256 -AND-
5945bd8deadSopenharmony_ci              The vertex weight array pointer must be 4-byte aligned )
5955bd8deadSopenharmony_ci
5965bd8deadSopenharmony_ci        8.  ( FOG_COORDINATE_ARRAY must be disabled. ) -OR -
5975bd8deadSopenharmony_ci            ( FOG_COORDINATE_ARRAY must be enabled -AND-
5985bd8deadSopenharmony_ci              The chip in use must be an NV11 or NV15, not NV10 -AND-
5995bd8deadSopenharmony_ci              The fog coordinate array type must be FLOAT -AND-
6005bd8deadSopenharmony_ci              The fog coordinate array size must be 1 -AND-
6015bd8deadSopenharmony_ci              The fog coordinate array stride must be a multiple of 4 bytes -AND-
6025bd8deadSopenharmony_ci              The fog coordinate array stride must be less than 256 -AND-
6035bd8deadSopenharmony_ci              The fog coordinate array pointer must be 4-byte aligned )
6045bd8deadSopenharmony_ci
6055bd8deadSopenharmony_ci     o  For the NV10 the implementation-dependent validity check based on
6065bd8deadSopenharmony_ci        other OpenGL rendering state is FALSE if any of the following are true:
6075bd8deadSopenharmony_ci
6085bd8deadSopenharmony_ci        1.  ( COLOR_LOGIC_OP is enabled -AND-
6095bd8deadSopenharmony_ci              The logic op is not COPY ), except in the case of Quadro2
6105bd8deadSopenharmony_ci            (Quadro2 Pro, Quadro2 MXR) products.
6115bd8deadSopenharmony_ci
6125bd8deadSopenharmony_ci        2.  ( LIGHT_MODEL_TWO_SIDE is true. )
6135bd8deadSopenharmony_ci
6145bd8deadSopenharmony_ci        3.  Either texture unit is enabled and active with a texture
6155bd8deadSopenharmony_ci            with a non-zero border.
6165bd8deadSopenharmony_ci
6175bd8deadSopenharmony_ci        4.  VERTEX_PROGRAM_NV is enabled.
6185bd8deadSopenharmony_ci
6195bd8deadSopenharmony_ci        5.  Several other obscure unspecified reasons.
6205bd8deadSopenharmony_ci
6215bd8deadSopenharmony_ciNV20 Implementation Details
6225bd8deadSopenharmony_ci
6235bd8deadSopenharmony_ci    This section describes implementation-defined limits for NV20:
6245bd8deadSopenharmony_ci
6255bd8deadSopenharmony_ci         The value of MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV is 1048575.
6265bd8deadSopenharmony_ci
6275bd8deadSopenharmony_ci    This section describes the implementation-dependent validity
6285bd8deadSopenharmony_ci    checks for NV20.
6295bd8deadSopenharmony_ci
6305bd8deadSopenharmony_ci      o  For the NV20 implementation-dependent validity check for the
6315bd8deadSopenharmony_ci         vertex array range region of memory to be true, all of the
6325bd8deadSopenharmony_ci         following must be true:
6335bd8deadSopenharmony_ci
6345bd8deadSopenharmony_ci         1.  The <pointer> must be 32-byte aligned.
6355bd8deadSopenharmony_ci
6365bd8deadSopenharmony_ci         2.  The underlying memory types must all be the same (all
6375bd8deadSopenharmony_ci             standard system memory -OR- all AGP memory -OR- all video
6385bd8deadSopenharmony_ci             memory).
6395bd8deadSopenharmony_ci
6405bd8deadSopenharmony_ci     o  To determine whether the NV20 implementation-dependent validity
6415bd8deadSopenharmony_ci        check for the vertex array state is true, the following algorithm
6425bd8deadSopenharmony_ci        is used:
6435bd8deadSopenharmony_ci
6445bd8deadSopenharmony_ci        The currently enabled arrays and their pointers, strides, and
6455bd8deadSopenharmony_ci        types are first determined using the value of VERTEX_PROGRAM_NV.
6465bd8deadSopenharmony_ci        If VERTEX_PROGRAM_NV is disabled, the standard GL vertex arrays
6475bd8deadSopenharmony_ci        are used.  If VERTEX_PROGRAM_NV is enabled, the vertex attribute
6485bd8deadSopenharmony_ci        arrays take precedence over the standard vertex arrays.  The
6495bd8deadSopenharmony_ci        following table, taken from the NV_vertex_program specification,
6505bd8deadSopenharmony_ci        shows the aliasing between the standard and attribute arrays:
6515bd8deadSopenharmony_ci
6525bd8deadSopenharmony_ciVertex
6535bd8deadSopenharmony_ciAttribute  Conventional                                           Conventional
6545bd8deadSopenharmony_ciRegister   Per-vertex        Conventional                         Component
6555bd8deadSopenharmony_ciNumber     Parameter         Per-vertex Parameter Command         Mapping
6565bd8deadSopenharmony_ci---------  ---------------   -----------------------------------  ------------
6575bd8deadSopenharmony_ci 0         vertex position   Vertex                               x,y,z,w
6585bd8deadSopenharmony_ci 1         vertex weights    VertexWeightEXT                      w,0,0,1
6595bd8deadSopenharmony_ci 2         normal            Normal                               x,y,z,1
6605bd8deadSopenharmony_ci 3         primary color     Color                                r,g,b,a
6615bd8deadSopenharmony_ci 4         secondary color   SecondaryColorEXT                    r,g,b,1
6625bd8deadSopenharmony_ci 5         fog coordinate    FogCoordEXT                          fc,0,0,1
6635bd8deadSopenharmony_ci 6         -                 -                                    -
6645bd8deadSopenharmony_ci 7         -                 -                                    -
6655bd8deadSopenharmony_ci 8         texture coord 0   MultiTexCoord(GL_TEXTURE0_ARB, ...)  s,t,r,q
6665bd8deadSopenharmony_ci 9         texture coord 1   MultiTexCoord(GL_TEXTURE1_ARB, ...)  s,t,r,q
6675bd8deadSopenharmony_ci 10        texture coord 2   MultiTexCoord(GL_TEXTURE2_ARB, ...)  s,t,r,q
6685bd8deadSopenharmony_ci 11        texture coord 3   MultiTexCoord(GL_TEXTURE3_ARB, ...)  s,t,r,q
6695bd8deadSopenharmony_ci 12        texture coord 4   MultiTexCoord(GL_TEXTURE4_ARB, ...)  s,t,r,q
6705bd8deadSopenharmony_ci 13        texture coord 5   MultiTexCoord(GL_TEXTURE5_ARB, ...)  s,t,r,q
6715bd8deadSopenharmony_ci 14        texture coord 6   MultiTexCoord(GL_TEXTURE6_ARB, ...)  s,t,r,q
6725bd8deadSopenharmony_ci 15        texture coord 7   MultiTexCoord(GL_TEXTURE7_ARB, ...)  s,t,r,q
6735bd8deadSopenharmony_ci
6745bd8deadSopenharmony_ci        For the validity check to be TRUE, the following must all be
6755bd8deadSopenharmony_ci        true:
6765bd8deadSopenharmony_ci
6775bd8deadSopenharmony_ci        1.  Vertex attribute 0's array must be enabled.
6785bd8deadSopenharmony_ci        2.  EDGE_FLAG_ARRAY must be disabled.
6795bd8deadSopenharmony_ci        3.  For all enabled arrays, all of the following must be true:
6805bd8deadSopenharmony_ci            - the stride must be less than 256
6815bd8deadSopenharmony_ci            - the type must be FLOAT, SHORT, or UNSIGNED_BYTE
6825bd8deadSopenharmony_ci
6835bd8deadSopenharmony_ci     o  For the NV20 the implementation-dependent validity check based on
6845bd8deadSopenharmony_ci        other OpenGL rendering state is FALSE only for a few obscure and
6855bd8deadSopenharmony_ci        unspecified reasons.
6865bd8deadSopenharmony_ci
6875bd8deadSopenharmony_ciRevision History
6885bd8deadSopenharmony_ci
6895bd8deadSopenharmony_ci    January 10, 2001 - Added NV20 implementation details.  Made several
6905bd8deadSopenharmony_ci    corrections to the NV10 implementation details.  Specifically, noted
6915bd8deadSopenharmony_ci    that on the NV11 and NV15 architectures, the fog coordinate array may
6925bd8deadSopenharmony_ci    be used, and updated the section on other state that may cause the
6935bd8deadSopenharmony_ci    vertex array range to be invalid.  Only drivers built after this date
6945bd8deadSopenharmony_ci    will support fog coordinate arrays on NV11 and NV15.  Also fixed a
6955bd8deadSopenharmony_ci    few typos in the spec.
6965bd8deadSopenharmony_ci
6975bd8deadSopenharmony_ci    September 17, 2001 - Modified NV20 implementation details to remove
6985bd8deadSopenharmony_ci    all the pointer and stride restrictions, none of which are actually
6995bd8deadSopenharmony_ci    required.  Only drivers built after this date will support arbitrary
7005bd8deadSopenharmony_ci    pointer offsets and strides.  Also removed NV10 rules on non-zero
7015bd8deadSopenharmony_ci    strides, which cannot be used in OpenGL anyhow, and fixed a few other
7025bd8deadSopenharmony_ci    typos.
703