Name ATI_element_array Name Strings GL_ATI_element_array Contact Rick Hammerstone, AMD (rick.hammerstone 'at' amd.com) Version 0.3 - 11/04/06 Updated contact info after ATI/AMD merger. 0.2 - 09/18/01 Changed default behavior of draw commands when element array is not enabled. Now generates an error and draws nothing. 0.1 - 07/06/01 Initial revision Number 256 Dependencies This extension is written against the OpenGL 1.2.1 Specification. OpenGL 1.1 is required. ATI_vertex_array_object affects the definition of this extension. Overview This extension provides a mechanism for an application to create an array of index data for use in specifying geometric primitives. This extension is most useful when used in conjunction with the ATI_vertex_array_object extension. ATI_vertex_array_object provides an interface for storing vertex array data in persistent, hardware-addressable memory. In cases where large amounts of vertex data are in use, the index data used to construct primitives (typically as passed to the GL through DrawElements) can impose a significant bandwidth burden. ATI_element_array allows the application to specify independent arrays of elements, which can then be cached using ATI_vertex_array_object. Issues Should we allow ElementPointerATI to specify a stride? No, the expectation is that the indices are always packed together. Should we allow ElementPointerATI to accept more types than those accepted by DrawElements and DrawRangeElements? No, it doesn't seem useful to allow float indices, they have to get converted to some kind of int anyways. Should the element count be specified in the draw command, or as part of the definition of the element array. As part of the draw command. Specifying it as part of the definition of element array sort of makes sense, but it doesn't really fit with the way that vertex arrays currently work. Do we want to specify new entry points for the draw commands? Yes. The alternative is to overload DrawElements and DrawRangeElements by doing something funky like passing a null pointer. This seems like it would be too confusing. Is it useful to have the draw commands do something (other than return an error) when the element array is disabled? No. It's very hard to ascertain the intent of the application at this point, so it's probably best to not draw anything. New Procedures and Functions void ElementPointerATI(enum type, const void *pointer) void DrawElementArrayATI(enum mode, sizei count) void DrawRangeElementArrayATI(enum mode, uint start, uint end, sizei count) New Tokens Accepted by the parameter of EnableClientState and DisableClientState, the parameter of IsEnabled, and if ATI_vertex_array_object is defined, the parameter of ArrayObjectATI, GetArrayObjectivATI, GetArrayObjectfvATI: ELEMENT_ARRAY_ATI 0x8768 Accepted by the parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev: ELEMENT_ARRAY_TYPE_ATI 0x8769 Accepted by the paramater of GetPointerv: ELEMENT_ARRAY_POINTER_ATI 0x876A Additions to Chapter 2 of the GL Specification (OpenGL Operation) In section 2.6.3, GL Commands within Begin/End, add ElementArrayATI to the list of commands that are not allowed within any Begin/End pair, but may or may not generate an error. Inserted in section 2.8, Vertex Arrays, after the description of DrawRangeElements, but before the description of InterleavedArrays: The commands void DrawElementArrayATI(enum mode, sizei count) void DrawRangeElementArrayATI(enum mode, uint start, uint end, sizei count) can be used to construct a sequence of geometric primitives in the same manner as DrawElements and DrawRangeElements, but using a previously defined array of indices. For DrawElementArrayATI, the and arguments match the corresponding arguments to DrawElements. For DrawRangeElementArrayATI, the , , and arguments match the corresponding arguments to DrawRangeElements. For both DrawElementArrayATI and DrawRangeElementArrayATI, the list of indices used to generate primitives is defined by the command void ElementPointer(enum type, const void *pointer) The argument is used to specify the list of indices, and the argument specifies their format. These arguments match the and arguments to DrawElements and DrawRangeElements, and the allowed types match those accepted by these two commands -- GL_UNSIGNED_BYTE, GL_UNSIGNED_SHORT, and GL_UNSIGNED_INT. ElementPointer does not specify a stride between successive indices in the array, the values must be stored sequentially in memory. The array of element indices can be enabled and disabled by calling EnableClientState and DisableClientState with the argument ELEMENT_ARRAY_ATI. DrawElements and DrawRangeElements ignore the currently enabled element array. If a DrawElementArrayATI or DrawRangeElementArrayATI command is issued when there is no currently enabled element array, an error is generated, no drawing is done and the current state is not updated. Additions to Chapter 3 of the 1.2.1 Specification (Rasterization) None Additions to Chapter 4 of the 1.2.1 Specification (Per-Fragment Operations and the Frame Buffer) None Additions to Chapter 5 of the 1.2.1 Specification (Special Functions) In section 5.4, Display Lists, change the last sentence of the first paragraph to read: (Vertex array and element array pointers are dereferenced when the commands ArrayElement, DrawArrays, DrawElements, DrawRangeElements, DrawElementArrayATI, or DrawRangeElementArrayATI are accumulated into a display list.) In section 5.4, Display Lists, add ElementArrayATI to the list of commands that are not compiled into display lists but are executed immediately. Additions to Chapter 6 of the 1.2.1 Specification (State and State Requests) In section 6.1.11, Pointer and String Queries, add ELEMENT_ARRAY_POINTER_ATI to the list of possible values for the parameter of GetPointerv. Additions to the specification of ATI_vertex_array_object Added to the discussion of the , , and parameters of ArrayObjectATI: If the parameter of ArrayObjectATI is ELEMENT_ARRAY_ATI, then must be one, and must be zero. INVALID_VALUE is generated if either of these parameters is invalid. The parameter must be UNSIGNED_BYTE, UNSIGNED_SHORT, or UNSIGNED_INT. INVALID_ENUM is generated if is not one of these values. Errors Invalid or parameters to DrawElementArrayATI generate the same errors as would the corresponding call to DrawElements. Invalid , , , or parameters to DrawRangeElementArrayATI generate the same errors as would the corresponding call to DrawRangeElements. INVALID_ENUM is generated if the parameter of ElementArrayATI is not UNSIGNED_BYTE, UNSIGNED_SHORT, or UNSIGNED_INT. INVALID_OPERATION is generated if a DrawElementArrayATI or DrawRangeElementArrayATI command is issued when there is no currently enabled element array. New State Added to table 6.6, Vertex Array Data Get Value Get Command Type Initial Value Attrib --------- ----------- ---- ------------- ------ ELEMENT_ARRAY_ATI IsEnabled B False client ELEMENT_ARRAY_TYPE_ATI GetIntegerv Z4 UNSIGNED_INT client ELEMENT_ARRAY_POINTER_ATI GetPointerv Z+ 0 client Implementation Notes For maximum performance, applications should use UNSIGNED_SHORT or UNSIGNED_INT indices.