| |
| 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 <array> parameter of EnableClientState and |
| DisableClientState, the <value> parameter of IsEnabled, and if |
| ATI_vertex_array_object is defined, the <array> parameter of |
| ArrayObjectATI, GetArrayObjectivATI, GetArrayObjectfvATI: |
| |
| ELEMENT_ARRAY_ATI 0x8768 |
| |
| Accepted by the <value> parameter of GetBooleanv, GetIntegerv, |
| GetFloatv, and GetDoublev: |
| |
| ELEMENT_ARRAY_TYPE_ATI 0x8769 |
| |
| Accepted by the <pname> 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 <mode> and <count> arguments match the corresponding arguments |
| to DrawElements. For DrawRangeElementArrayATI, the <mode>, |
| <start>, <end> and <count> 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 <pointer> argument is used to specify the list of indices, and |
| the <type> argument specifies their format. These arguments match |
| the <type> and <indices> 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 |
| <pname> parameter of GetPointerv. |
| |
| |
| Additions to the specification of ATI_vertex_array_object |
| |
| Added to the discussion of the <size>, <type>, and <stride> |
| parameters of ArrayObjectATI: |
| |
| If the <array> parameter of ArrayObjectATI is ELEMENT_ARRAY_ATI, |
| then <size> must be one, and <stride> must be zero. INVALID_VALUE |
| is generated if either of these parameters is invalid. The <type> |
| parameter must be UNSIGNED_BYTE, UNSIGNED_SHORT, or UNSIGNED_INT. |
| INVALID_ENUM is generated if <type> is not one of these values. |
| |
| |
| Errors |
| |
| Invalid <mode> or <count> parameters to DrawElementArrayATI |
| generate the same errors as would the corresponding call to |
| DrawElements. |
| |
| Invalid <mode>, <count>, <start>, or <end> parameters to |
| DrawRangeElementArrayATI generate the same errors as would the |
| corresponding call to DrawRangeElements. |
| |
| INVALID_ENUM is generated if the <type> 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. |