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