| Name | |
| EXT_vertex_array | |
| Name Strings | |
| GL_EXT_vertex_array | |
| Version | |
| $Date: 1995/10/03 05:39:58 $ $Revision: 1.16 $ FINAL | |
| Number | |
| 30 | |
| Dependencies | |
| None | |
| Overview | |
| This extension adds the ability to specify multiple geometric primitives | |
| with very few subroutine calls. Instead of calling an OpenGL procedure | |
| to pass each individual vertex, normal, or color, separate arrays | |
| of vertexes, normals, and colors are prespecified, and are used to | |
| define a sequence of primitives (all of the same type) when a single | |
| call is made to DrawArraysEXT. A stride mechanism is provided so that | |
| an application can choose to keep all vertex data staggered in a | |
| single array, or sparsely in separate arrays. Single-array storage | |
| may optimize performance on some implementations. | |
| This extension also supports the rendering of individual array elements, | |
| each specified as an index into the enabled arrays. | |
| Issues | |
| * Should arrays for material parameters be provided? If so, how? | |
| A: No. Let's leave this to a separate extension, and keep this | |
| extension lean. | |
| * Should a FORTRAN interface be specified in this document? | |
| * It may not be possible to implement GetPointervEXT in FORTRAN. If | |
| not, should we eliminate it from this proposal? | |
| A: Leave it in. | |
| * Should a stride be specified by DrawArraysEXT which, if non-zero, | |
| would override the strides specified for the individual arrays? | |
| This might improve the efficiency of single-array transfers. | |
| A: No, it's not worth the effort and complexity. | |
| * Should entry points for byte vertexes, byte indexes, and byte | |
| texture coordinates be added in this extension? | |
| A: No, do this in a separate extension, which defines byte support | |
| for arrays and for the current procedural interface. | |
| * Should support for meshes (not strips) of rectangles be provided? | |
| A: No. If this is necessary, define a separate quad_mesh extension | |
| that supports both immediate mode and arrays. (Add QUAD_MESH_EXT | |
| as a token accepted by Begin and DrawArraysEXT. Add | |
| QuadMeshLengthEXT to specify the length of the mesh.) | |
| Reasoning | |
| * DrawArraysEXT requires that VERTEX_ARRAY_EXT be enabled so that | |
| future extensions can support evaluation as well as direct | |
| specification of vertex coordinates. | |
| * This extension does not support evaluation. It could be extended | |
| to provide such support by adding arrays of points to be evaluated, | |
| and by adding enables to indicate that the arrays are to be | |
| evaluated. I think we may choose to add an array version of | |
| EvalMesh, rather than extending the operation of DrawArraysEXT, | |
| so I'd rather wait on this one. | |
| * <size> is specified before <type> to match the order of the | |
| information in immediate mode commands, such as Vertex3f. | |
| (first 3, then f) | |
| * It seems reasonable to allow attribute values to be undefined after | |
| DrawArraysEXT executes. This avoids implementation overhead in | |
| the case where an incomplete primitive is specified, and will allow | |
| optimization on multiprocessor systems. I don't expect this to be | |
| a burden to programmers. | |
| * It is not an error to call VertexPointerEXT, NormalPointerEXT, | |
| ColorPointerEXT, IndexPointerEXT, TexCoordPointerEXT, | |
| or EdgeFlagPointerEXT between the execution of Begin and the | |
| corresponding execution of End. Because these commands will | |
| typically be implemented on the client side with no protocol, | |
| testing for between-Begin-End status requires that the client | |
| track this state, or that a round trip be made. Neither is | |
| desirable. | |
| * Arrays are enabled and disabled individually, rather than with a | |
| single mask parameter, for two reasons. First, we have had trouble | |
| allocating bits in masks, so eliminating a mask eliminates potential | |
| trouble down the road. We may eventually require a larger number of | |
| array types than there are bits in a mask. Second, making the | |
| enables into state eliminates a parameter in ArrayElementEXT, and | |
| may allow it to execute more efficiently. Of course this state | |
| model may result in programming errors, but OpenGL is full of such | |
| hazards anyway! | |
| * ArrayElementEXT is provided to support applications that construct | |
| primitives by indexing vertex data, rather than by streaming through | |
| arrays of data in first-to-last order. Because each call specifies | |
| only a single vertex, it is possible for an application to explicitly | |
| specify per-primitive attributes, such as a single normal per | |
| individual triangle. | |
| * The <count> parameters are added to the *PointerEXT commands to | |
| allow implementations to cache array data, and in particular to | |
| cache the transformed results of array data that are rendered | |
| repeatedly by ArrayElementEXT. Implementations that do not wish | |
| to perform such caching can ignore the <count> parameter. | |
| * The <first> parameter of DrawArraysEXT allows a single set of | |
| arrays to be used repeatedly, possibly improving performance. | |
| New Procedures and Functions | |
| void ArrayElementEXT(int i); | |
| void DrawArraysEXT(enum mode, | |
| int first, | |
| sizei count); | |
| void VertexPointerEXT(int size, | |
| enum type, | |
| sizei stride, | |
| sizei count, | |
| const void* pointer); | |
| void NormalPointerEXT(enum type, | |
| sizei stride, | |
| sizei count, | |
| const void* pointer); | |
| void ColorPointerEXT(int size, | |
| enum type, | |
| sizei stride, | |
| sizei count, | |
| const void* pointer); | |
| void IndexPointerEXT(enum type, | |
| sizei stride, | |
| sizei count, | |
| const void* pointer); | |
| void TexCoordPointerEXT(int size, | |
| enum type, | |
| sizei stride, | |
| sizei count, | |
| const void* pointer); | |
| void EdgeFlagPointerEXT(sizei stride, | |
| sizei count, | |
| const Boolean* pointer); | |
| void GetPointervEXT(enum pname, | |
| void** params); | |
| New Tokens | |
| Accepted by the <cap> parameter of Enable, Disable, and IsEnabled, and | |
| by the <pname> parameter of GetBooleanv, GetIntegerv, GetFloatv, and | |
| GetDoublev: | |
| VERTEX_ARRAY_EXT 0x8074 | |
| NORMAL_ARRAY_EXT 0x8075 | |
| COLOR_ARRAY_EXT 0x8076 | |
| INDEX_ARRAY_EXT 0x8077 | |
| TEXTURE_COORD_ARRAY_EXT 0x8078 | |
| EDGE_FLAG_ARRAY_EXT 0x8079 | |
| Accepted by the <type> parameter of VertexPointerEXT, NormalPointerEXT, | |
| ColorPointerEXT, IndexPointerEXT, and TexCoordPointerEXT: | |
| DOUBLE_EXT 0x140A | |
| Accepted by the <pname> parameter of GetBooleanv, GetIntegerv, | |
| GetFloatv, and GetDoublev: | |
| VERTEX_ARRAY_SIZE_EXT 0x807A | |
| VERTEX_ARRAY_TYPE_EXT 0x807B | |
| VERTEX_ARRAY_STRIDE_EXT 0x807C | |
| VERTEX_ARRAY_COUNT_EXT 0x807D | |
| NORMAL_ARRAY_TYPE_EXT 0x807E | |
| NORMAL_ARRAY_STRIDE_EXT 0x807F | |
| NORMAL_ARRAY_COUNT_EXT 0x8080 | |
| COLOR_ARRAY_SIZE_EXT 0x8081 | |
| COLOR_ARRAY_TYPE_EXT 0x8082 | |
| COLOR_ARRAY_STRIDE_EXT 0x8083 | |
| COLOR_ARRAY_COUNT_EXT 0x8084 | |
| INDEX_ARRAY_TYPE_EXT 0x8085 | |
| INDEX_ARRAY_STRIDE_EXT 0x8086 | |
| INDEX_ARRAY_COUNT_EXT 0x8087 | |
| TEXTURE_COORD_ARRAY_SIZE_EXT 0x8088 | |
| TEXTURE_COORD_ARRAY_TYPE_EXT 0x8089 | |
| TEXTURE_COORD_ARRAY_STRIDE_EXT 0x808A | |
| TEXTURE_COORD_ARRAY_COUNT_EXT 0x808B | |
| EDGE_FLAG_ARRAY_STRIDE_EXT 0x808C | |
| EDGE_FLAG_ARRAY_COUNT_EXT 0x808D | |
| Accepted by the <pname> parameter of GetPointervEXT: | |
| VERTEX_ARRAY_POINTER_EXT 0x808E | |
| NORMAL_ARRAY_POINTER_EXT 0x808F | |
| COLOR_ARRAY_POINTER_EXT 0x8090 | |
| INDEX_ARRAY_POINTER_EXT 0x8091 | |
| TEXTURE_COORD_ARRAY_POINTER_EXT 0x8092 | |
| EDGE_FLAG_ARRAY_POINTER_EXT 0x8093 | |
| Additions to Chapter 2 of the 1.0 Specification (OpenGL Operation) | |
| Array Specification | |
| ------------------- | |
| Individual array pointers and associated data are maintained for an | |
| array of vertexes, an array of normals, an array of colors, an array | |
| of color indexes, an array of texture coordinates, and an array of edge | |
| flags. The data associated with each array specify the data type of | |
| the values in the array, the number of values per element in the array | |
| (e.g. vertexes of 2, 3, or 4 coordinates), the byte stride from one | |
| array element to the next, and the number of elements (counting from | |
| the first) that are static. Static elements may be modified by the | |
| application, but once they are modified, the application must explicitly | |
| respecify the array before using it for any rendering. When an array is | |
| specified, the pointer and associated data are saved as client-side | |
| state, and static elements may be cached by the implementation. Non- | |
| static (dynamic) elements are never accessed until ArrayElementEXT or | |
| DrawArraysEXT is issued. | |
| VertexPointerEXT specifies the location and data format of an array | |
| of vertex coordinates. <pointer> specifies a pointer to the first | |
| coordinate of the first vertex in the array. <type> specifies the data | |
| type of each coordinate in the array, and must be one of SHORT, INT, | |
| FLOAT, or DOUBLE_EXT, implying GL data types short, int, float, and | |
| double respectively. <size> specifies the number of coordinates per | |
| vertex, and must be 2, 3, or 4. <stride> specifies the byte offset | |
| between pointers to consecutive vertexes. If <stride> is zero, the | |
| vertex data are understood to be tightly packed in the array. <count> | |
| specifies the number of vertexes, counting from the first, that are | |
| static. | |
| NormalPointerEXT specifies the location and data format of an array | |
| of normals. <pointer> specifies a pointer to the first coordinate | |
| of the first normal in the array. <type> specifies the data type | |
| of each coordinate in the array, and must be one of BYTE, SHORT, INT, | |
| FLOAT, or DOUBLE_EXT, implying GL data types byte, short, int, float, | |
| and double respectively. It is understood that each normal comprises | |
| three coordinates. <stride> specifies the byte offset between | |
| pointers to consecutive normals. If <stride> is zero, the normal | |
| data are understood to be tightly packed in the array. <count> | |
| specifies the number of normals, counting from the first, that are | |
| static. | |
| ColorPointerEXT specifies the location and data format of an array | |
| of color components. <pointer> specifies a pointer to the first | |
| component of the first color element in the array. <type> specifies the | |
| data type of each component in the array, and must be one of BYTE, | |
| UNSIGNED_BYTE, SHORT, UNSIGNED_SHORT, INT, UNSIGNED_INT, FLOAT, or | |
| DOUBLE_EXT, implying GL data types byte, ubyte, short, ushort, int, | |
| uint, float, and double respectively. <size> specifies the number of | |
| components per color, and must be 3 or 4. <stride> specifies the byte | |
| offset between pointers to consecutive colors. If <stride> is zero, | |
| the color data are understood to be tightly packed in the array. | |
| <count> specifies the number of colors, counting from the first, that | |
| are static. | |
| IndexPointerEXT specifies the location and data format of an array | |
| of color indexes. <pointer> specifies a pointer to the first index in | |
| the array. <type> specifies the data type of each index in the | |
| array, and must be one of SHORT, INT, FLOAT, or DOUBLE_EXT, implying | |
| GL data types short, int, float, and double respectively. <stride> | |
| specifies the byte offset between pointers to consecutive indexes. If | |
| <stride> is zero, the index data are understood to be tightly packed | |
| in the array. <count> specifies the number of indexes, counting from | |
| the first, that are static. | |
| TexCoordPointerEXT specifies the location and data format of an array | |
| of texture coordinates. <pointer> specifies a pointer to the first | |
| coordinate of the first element in the array. <type> specifies the data | |
| type of each coordinate in the array, and must be one of SHORT, INT, | |
| FLOAT, or DOUBLE_EXT, implying GL data types short, int, float, and | |
| double respectively. <size> specifies the number of coordinates per | |
| element, and must be 1, 2, 3, or 4. <stride> specifies the byte offset | |
| between pointers to consecutive elements of coordinates. If <stride> is | |
| zero, the coordinate data are understood to be tightly packed in the | |
| array. <count> specifies the number of texture coordinate elements, | |
| counting from the first, that are static. | |
| EdgeFlagPointerEXT specifies the location and data format of an array | |
| of boolean edge flags. <pointer> specifies a pointer to the first flag | |
| in the array. <stride> specifies the byte offset between pointers to | |
| consecutive edge flags. If <stride> is zero, the edge flag data are | |
| understood to be tightly packed in the array. <count> specifies the | |
| number of edge flags, counting from the first, that are static. | |
| The table below summarizes the sizes and data types accepted (or | |
| understood implicitly) by each of the six pointer-specification commands. | |
| Command Sizes Types | |
| ------- ----- ----- | |
| VertexPointerEXT 2,3,4 short, int, float, double | |
| NormalPointerEXT 3 byte, short, int, float, double | |
| ColorPointerEXT 3,4 byte, short, int, float, double, | |
| ubyte, ushort, uint | |
| IndexPointerEXT 1 short, int, float, double | |
| TexCoordPointerEXT 1,2,3,4 short, int, float, double | |
| EdgeFlagPointerEXT 1 boolean | |
| Rendering the Arrays | |
| -------------------- | |
| By default all the arrays are disabled, meaning that they will not | |
| be accessed when either ArrayElementEXT or DrawArraysEXT is called. | |
| An individual array is enabled or disabled by calling Enable or | |
| Disable with <cap> set to appropriate value, as specified in the | |
| table below: | |
| Array Specification Command Enable Token | |
| --------------------------- ------------ | |
| VertexPointerEXT VERTEX_ARRAY_EXT | |
| NormalPointerEXT NORMAL_ARRAY_EXT | |
| ColorPointerEXT COLOR_ARRAY_EXT | |
| IndexPointerEXT INDEX_ARRAY_EXT | |
| TexCoordPointerEXT TEXTURE_COORD_ARRAY_EXT | |
| EdgeFlagPointerEXT EDGE_FLAG_ARRAY_EXT | |
| When ArrayElementEXT is called, a single vertex is drawn, using vertex | |
| and attribute data taken from location <i> of the enabled arrays. The | |
| semantics of ArrayElementEXT are defined in the C-code below: | |
| void ArrayElementEXT (int i) { | |
| byte* p; | |
| if (NORMAL_ARRAY_EXT) { | |
| if (normal_stride == 0) | |
| p = (byte*)normal_pointer + i * 3 * sizeof(normal_type); | |
| else | |
| p = (byte*)normal_pointer + i * normal_stride; | |
| Normal3<normal_type>v ((normal_type*)p); | |
| } | |
| if (COLOR_ARRAY_EXT) { | |
| if (color_stride == 0) | |
| p = (byte*)color_pointer + | |
| i * color_size * sizeof(color_type); | |
| else | |
| p = (byte*)color_pointer + i * color_stride; | |
| Color<color_size><color_type>v ((color_type*)p); | |
| } | |
| if (INDEX_ARRAY_EXT) { | |
| if (index_stride == 0) | |
| p = (byte*)index_pointer + i * sizeof(index_type); | |
| else | |
| p = (byte*)index_pointer + i * index_stride; | |
| Index<index_type>v ((index_type*)p); | |
| } | |
| if (TEXTURE_COORD_ARRAY_EXT) { | |
| if (texcoord_stride == 0) | |
| p = (byte*)texcoord_pointer + | |
| i * texcoord_size * sizeof(texcoord_type); | |
| else | |
| p = (byte*)texcoord_pointer + i * texcoord_stride; | |
| TexCoord<texcoord_size><texcoord_type>v ((texcoord_type*)p); | |
| } | |
| if (EDGE_FLAG_ARRAY_EXT) { | |
| if (edgeflag_stride == 0) | |
| p = (byte*)edgeflag_pointer + i * sizeof(boolean); | |
| else | |
| p = (byte*)edgeflag_pointer + i * edgeflag_stride; | |
| EdgeFlagv ((boolean*)p); | |
| } | |
| if (VERTEX_ARRAY_EXT) { | |
| if (vertex_stride == 0) | |
| p = (byte*)vertex_pointer + | |
| i * vertex_size * sizeof(vertex_type); | |
| else | |
| p = (byte*)vertex_pointer + i * vertex_stride; | |
| Vertex<vertex_size><vertex_type>v ((vertex_type*)p); | |
| } | |
| } | |
| ArrayElementEXT executes even if VERTEX_ARRAY_EXT is not enabled. No | |
| drawing occurs in this case, but the attributes corresponding to | |
| enabled arrays are modified. | |
| When DrawArraysEXT is called, <count> sequential elements from each | |
| enabled array are used to construct a sequence of geometric primitives, | |
| beginning with element <first>. <mode> specifies what kind of | |
| primitives are constructed, and how the array elements are used to | |
| construct these primitives. Accepted values for <mode> are POINTS, | |
| LINE_STRIP, LINE_LOOP, LINES, TRIANGLE_STRIP, TRIANGLE_FAN, TRIANGLES, | |
| QUAD_STRIP, QUADS, and POLYGON. If VERTEX_ARRAY_EXT is not enabled, no | |
| geometric primitives are generated. | |
| The semantics of DrawArraysEXT are defined in the C-code below: | |
| void DrawArraysEXT(enum mode, int first, sizei count) { | |
| int i; | |
| if (count < 0) | |
| /* generate INVALID_VALUE error and abort */ | |
| else { | |
| Begin (mode); | |
| for (i=0; i < count; i++) | |
| ArrayElementEXT(first + i); | |
| End (); | |
| } | |
| } | |
| The ways in which the execution of DrawArraysEXT differs from the | |
| semantics indicated in the pseudo-code above are: | |
| 1. Vertex attributes that are modified by DrawArraysEXT have an | |
| unspecified value after DrawArraysEXT returns. For example, if | |
| COLOR_ARRAY_EXT is enabled, the value of the current color is | |
| undefined after DrawArraysEXT executes. Attributes that aren't | |
| modified remain well defined. | |
| 2. Operation of DrawArraysEXT is atomic with respect to error | |
| generation. If an error is generated, no other operations take | |
| place. | |
| Although it is not an error to respecify an array between the execution | |
| of Begin and the corresponding execution of End, the result of such | |
| respecification is undefined. Static array data may be read and cached | |
| by the implementation at any time. If static array data are modified by | |
| the application, the results of any subsequently issued ArrayElementEXT | |
| or DrawArraysEXT commands are undefined. | |
| Additions to Chapter 3 of the 1.0 Specification (Rasterization) | |
| None | |
| Additions to Chapter 4 of the 1.0 Specification (Per-Fragment Operations | |
| and the Frame buffer) | |
| None | |
| Additions to Chapter 5 of the 1.0 Specification (Special Functions) | |
| ArrayElementEXT and DrawArraysEXT are included in display lists. | |
| When either command is entered into a display list, the necessary | |
| array data (determined by the array pointers and enables) is also | |
| entered into the display list. Because the array pointers and | |
| enables are client side state, their values affect display lists | |
| when the lists are created, not when the lists are executed. | |
| Array specification commands VertexPointerEXT, NormalPointerEXT, | |
| ColorPointerEXT, IndexPointerEXT, TexCoordPointerEXT, and | |
| EdgeFlagPointerEXT specify client side state, and are therefore | |
| not included in display lists. Likewise Enable and Disable, when | |
| called with <cap> set to VERTEX_ARRAY_EXT, NORMAL_ARRAY_EXT, | |
| COLOR_ARRAY_EXT, INDEX_ARRAY_EXT, TEXTURE_COORD_ARRAY_EXT, or | |
| EDGE_FLAG_ARRAY_EXT, are not included in display lists. | |
| GetPointervEXT returns state information, and so is not included | |
| in display lists. | |
| Additions to Chapter 6 of the 1.0 Specification (State and State Requests) | |
| GetPointervEXT returns in <param> the array pointer value specified | |
| by <pname>. Accepted values for <pname> are VERTEX_ARRAY_POINTER_EXT, | |
| NORMAL_ARRAY_POINTER_EXT, COLOR_ARRAY_POINTER_EXT, | |
| INDEX_ARRAY_POINTER_EXT, TEXTURE_COORD_ARRAY_POINTER_EXT, | |
| and EDGE_FLAG_ARRAY_POINTER_EXT. | |
| All array data are client side state, and are not saved or restored | |
| by PushAttrib and PopAttrib. | |
| Additions to the GLX Specification | |
| None | |
| GLX Protocol | |
| A new rendering command is added; it can be sent to the server as part of a | |
| glXRender request or as part of a glXRenderLarge request: | |
| The DrawArraysEXT command consists of three sections, in the following order: | |
| (1) header information, (2) a list of array information, containing the type | |
| and size of the array values for each enabled array and (3) a list of vertex | |
| data. Each element in the list of vertex data contains information for a single | |
| vertex taken from the enabled arrays. | |
| DrawArraysEXT | |
| 2 16+(12*m)+(s*n) rendering command length | |
| 2 4116 rendering command opcode | |
| 4 CARD32 n (number of array elements) | |
| 4 CARD32 m (number of enabled arrays) | |
| 4 ENUM mode /* GL_POINTS etc */ | |
| 12*m LISTofARRAY_INFO | |
| s*n LISTofVERTEX_DATA | |
| Where s = ns + cs + is + ts + es + vs + np + cp + ip + tp + ep + vp. (See | |
| description below, under VERTEX_DATA.) Note that if an array is disabled | |
| then no information is sent for it. For example, when the normal array is | |
| disabled, there is no ARRAY_INFO record for the normal array and ns and np | |
| are both zero. | |
| Note that the list of ARRAY_INFO is unordered: since the ARRAY_INFO | |
| record contains the array type, the arrays in the list may be stored | |
| in any order. Also, the VERTEX_DATA list is a packed list of vertices. | |
| For each vertex, data is retrieved from the enabled arrays, and stored | |
| in the list. | |
| If the command is encoded in a glXRenderLarge request, the command | |
| opcode and command length fields above are expanded to 4 bytes each: | |
| 4 20+(12*m)+(s*n) rendering command length | |
| 4 4116 rendering command opcode | |
| ARRAY_INFO | |
| 4 ENUM data type | |
| 0x1400 i=1 BYTE | |
| 0x1401 i=1 UNSIGNED_BYTE | |
| 0x1402 i=2 SHORT | |
| 0x1403 i=2 UNSIGNED_SHORT | |
| 0x1404 i=4 INT | |
| 0x1405 i=4 UNSIGNED_INT | |
| 0x1406 i=4 FLOAT | |
| 0x140A i=8 DOUBLE_EXT | |
| 4 INT32 j (number of values in array element) | |
| 4 ENUM array type | |
| 0x8074 j=2/3/4 VERTEX_ARRAY_EXT | |
| 0x8075 j=3 NORMAL_ARRAY_EXT | |
| 0x8076 j=3/4 COLOR_ARRAY_EXT | |
| 0x8077 j=1 INDEX_ARRAY_EXT | |
| 0x8078 j=1/2/3/4 TEXTURE_COORD_ARRAY_EXT | |
| 0x8079 j=1 EDGE_FLAG_ARRAY_EXT | |
| For each array, the size of an array element is i*j. Some arrays | |
| (e.g., the texture coordinate array) support different data sizes; | |
| for these arrays, the size, j, is specified when the array is defined. | |
| VERTEX_DATA | |
| if the normal array is enabled: | |
| ns LISTofBYTE normal array element | |
| np unused, np=pad(ns) | |
| if the color array is enabled: | |
| cs LISTofBYTE color array element | |
| cp unused, cp=pad(cs) | |
| if the index array is enabled: | |
| is LISTofBYTE index array element | |
| ip unused, ip=pad(is) | |
| if the texture coord array is enabled: | |
| ts LISTofBYTE texture coord array element | |
| tp unused, tp=pad(ts) | |
| if the edge flag array is enabled: | |
| es LISTofBYTE edge flag array element | |
| ep unused, ep=pad(es) | |
| if the vertex array is enabled: | |
| vs LISTofBYTE vertex array element | |
| vp unused, vp=pad(vs) | |
| where ns, cs, is, ts, es, vs is the size of the normal, color, index, | |
| texture, edge and vertex array elements and np, cp, ip, tp, ep, vp is | |
| the padding for the normal, color, index, texture, edge and vertex array | |
| elements, respectively. | |
| Errors | |
| INVALID_OPERATION is generated if DrawArraysEXT is called between the | |
| execution of Begin and the corresponding execution of End. | |
| INVALID_ENUM is generated if DrawArraysEXT parameter <mode> is not | |
| POINTS, LINE_STRIP, LINE_LOOP, LINES, TRIANGLE_STRIP, TRIANGLE_FAN, | |
| TRIANGLES, QUAD_STRIP, QUADS, or POLYGON. | |
| INVALID_VALUE is generated if DrawArraysEXT parameter <count> is | |
| negative. | |
| INVALID_VALUE is generated if VertexPointerEXT parameter <size> is not | |
| 2, 3, or 4. | |
| INVALID_ENUM is generated if VertexPointerEXT parameter <type> is not | |
| SHORT, INT, FLOAT, or DOUBLE_EXT. | |
| INVALID_VALUE is generated if VertexPointerEXT parameter <stride> or | |
| <count> is negative. | |
| INVALID_ENUM is generated if NormalPointerEXT parameter <type> is not | |
| BYTE, SHORT, INT, FLOAT, or DOUBLE_EXT. | |
| INVALID_VALUE is generated if NormalPointerEXT parameter <stride> or | |
| <count> is negative. | |
| INVALID_VALUE is generated if ColorPointerEXT parameter <size> is not | |
| 3 or 4. | |
| INVALID_ENUM is generated if ColorPointerEXT parameter <type> is not | |
| BYTE, UNSIGNED_BYTE, SHORT, UNSIGNED_SHORT, INT, UNSIGNED_INT, FLOAT, | |
| or DOUBLE_EXT. | |
| INVALID_VALUE is generated if ColorPointerEXT parameter <stride> or | |
| <count> is negative. | |
| INVALID_ENUM is generated if IndexPointerEXT parameter <type> is not | |
| SHORT, INT, FLOAT, or DOUBLE_EXT. | |
| INVALID_VALUE is generated if IndexPointerEXT parameter <stride> or | |
| <count> is negative. | |
| INVALID_VALUE is generated if TexCoordPointerEXT parameter <size> is not | |
| 1, 2, 3, or 4. | |
| INVALID_ENUM is generated if TexCoordPointerEXT parameter <type> is not | |
| SHORT, INT, FLOAT, or DOUBLE_EXT. | |
| INVALID_VALUE is generated if TexCoordPointerEXT parameter <stride> or | |
| <count> is negative. | |
| INVALID_VALUE is generated if EdgeFlagPointerEXT parameter <stride> or | |
| <count> is negative. | |
| INVALID_ENUM is generated if GetPointervEXT parameter <pname> is not | |
| VERTEX_ARRAY_POINTER_EXT, NORMAL_ARRAY_POINTER_EXT, | |
| COLOR_ARRAY_POINTER_EXT, INDEX_ARRAY_POINTER_EXT, | |
| TEXTURE_COORD_ARRAY_POINTER_EXT, or EDGE_FLAG_ARRAY_POINTER_EXT. | |
| New State | |
| Initial | |
| Get Value Get Command Type Value Attrib | |
| --------- ----------- ---- ------- ------ | |
| VERTEX_ARRAY_EXT IsEnabled B False client | |
| VERTEX_ARRAY_SIZE_EXT GetIntegerv Z+ 4 client | |
| VERTEX_ARRAY_TYPE_EXT GetIntegerv Z4 FLOAT client | |
| VERTEX_ARRAY_STRIDE_EXT GetIntegerv Z+ 0 client | |
| VERTEX_ARRAY_COUNT_EXT GetIntegerv Z+ 0 client | |
| VERTEX_ARRAY_POINTER_EXT GetPointervEXT Z+ 0 client | |
| NORMAL_ARRAY_EXT IsEnabled B False client | |
| NORMAL_ARRAY_TYPE_EXT GetIntegerv Z5 FLOAT client | |
| NORMAL_ARRAY_STRIDE_EXT GetIntegerv Z+ 0 client | |
| NORMAL_ARRAY_COUNT_EXT GetIntegerv Z+ 0 client | |
| NORMAL_ARRAY_POINTER_EXT GetPointervEXT Z+ 0 client | |
| COLOR_ARRAY_EXT IsEnabled B False client | |
| COLOR_ARRAY_SIZE_EXT GetIntegerv Z+ 4 client | |
| COLOR_ARRAY_TYPE_EXT GetIntegerv Z8 FLOAT client | |
| COLOR_ARRAY_STRIDE_EXT GetIntegerv Z+ 0 client | |
| COLOR_ARRAY_COUNT_EXT GetIntegerv Z+ 0 client | |
| COLOR_ARRAY_POINTER_EXT GetPointervEXT Z+ 0 client | |
| INDEX_ARRAY_EXT IsEnabled B False client | |
| INDEX_ARRAY_TYPE_EXT GetIntegerv Z4 FLOAT client | |
| INDEX_ARRAY_STRIDE_EXT GetIntegerv Z+ 0 client | |
| INDEX_ARRAY_COUNT_EXT GetIntegerv Z+ 0 client | |
| INDEX_ARRAY_POINTER_EXT GetPointervEXT Z+ 0 client | |
| TEXTURE_COORD_ARRAY_EXT IsEnabled B False client | |
| TEXTURE_COORD_ARRAY_SIZE_EXT GetIntegerv Z+ 4 client | |
| TEXTURE_COORD_ARRAY_TYPE_EXT GetIntegerv Z4 FLOAT client | |
| TEXTURE_COORD_ARRAY_STRIDE_EXT GetIntegerv Z+ 0 client | |
| TEXTURE_COORD_ARRAY_COUNT_EXT GetIntegerv Z+ 0 client | |
| TEXTURE_COORD_ARRAY_POINTER_EXT GetPointervEXT Z+ 0 client | |
| EDGE_FLAG_ARRAY_EXT IsEnabled B False client | |
| EDGE_FLAG_ARRAY_STRIDE_EXT GetIntegerv Z+ 0 client | |
| EDGE_FLAG_ARRAY_COUNT_EXT GetIntegerv Z+ 0 client | |
| EDGE_FLAG_ARRAY_POINTER_EXT GetPointervEXT Z+ 0 client | |
| New Implementation Dependent State | |
| None |