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