12c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.comName 22c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 32c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com ANGLE_instanced_arrays 42c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 52c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.comName Strings 62c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 72c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com GL_ANGLE_instanced_arrays 82c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 92c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.comContributors 102c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 112c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com Contributors to ARB_instanced_arrays 122c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com Nicolas Capens, TransGaming Inc. 132c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com James Helferty, TransGaming Inc. 142c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com Kenneth Russell, Google Inc. 152c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com Vangelis Kokkevis, Google Inc. 162c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 172c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.comContact 182c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 192c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com Daniel Koch, TransGaming Inc. (daniel 'at' transgaming.com) 202c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 212c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.comStatus 222c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 23d7400b510daf900320b9cf35359d789a2487bc58daniel@transgaming.com Implemented in ANGLE r976. 242c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 252c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.comVersion 262c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 27d7400b510daf900320b9cf35359d789a2487bc58daniel@transgaming.com Last Modified Date: February 8, 2012 28d7400b510daf900320b9cf35359d789a2487bc58daniel@transgaming.com Author Revision: 3 292c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 302c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.comNumber 312c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 327d6c6ba4924ba0dadf4e65fda4f9a882b6cad494daniel@transgaming.com OpenGL ES Extension #109 332c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 342c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.comDependencies 352c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 362c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com OpenGL ES 2.0 is required. 372c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 382c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com This extension is written against the OpenGL ES 2.0 Specification. 392c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 402c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.comOverview 412c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 422c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com A common use case in GL for some applications is to be able to 432c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com draw the same object, or groups of similar objects that share 442c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com vertex data, primitive count and type, multiple times. This 452c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com extension provides a means of accelerating such use cases while 462c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com restricting the number of API calls, and keeping the amount of 472c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com duplicate data to a minimum. 482c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 492c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com This extension introduces an array "divisor" for generic 502c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com vertex array attributes, which when non-zero specifies that the 512c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com attribute is "instanced." An instanced attribute does not 522c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com advance per-vertex as usual, but rather after every <divisor> 532c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com conceptual draw calls. 542c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 552c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com (Attributes which aren't instanced are repeated in their entirety 562c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com for every conceptual draw call.) 572c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 582c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com By specifying transform data in an instanced attribute or series 592c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com of instanced attributes, vertex shaders can, in concert with the 602c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com instancing draw calls, draw multiple instances of an object with 612c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com one draw call. 622c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 632c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.comIP Status 642c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 652c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com No known IP claims. 662c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 672c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.comNew Tokens 682c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 692c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com Accepted by the <pname> parameters of GetVertexAttribfv and 702c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com GetVertexAttribiv: 712c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 722c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE 732c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 742c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.comNew Procedures and Functions 752c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 762c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com void DrawArraysInstancedANGLE(enum mode, int first, sizei count, 772c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com sizei primcount); 782c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 792c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com void DrawElementsInstancedANGLE(enum mode, sizei count, enum type, 802c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com const void *indices, sizei primcount); 812c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 822c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com void VertexAttribDivisorANGLE(uint index, uint divisor); 832c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 842c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.comAdditions to Chapter 2 of the OpenGL ES 2.0 Specification 852c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com(OpenGL ES Operation) 862c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 872c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com Modify section 2.8 (Vertex Arrays), p. 21 882c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 892c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com After description of EnableVertexAttribArray / DisableVertexAttribArray 902c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com add the following: 912c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 922c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com "The command 932c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 942c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com void VertexAttribDivisorANGLE(uint index, uint divisor); 952c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 962c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com modifies the rate at which generic vertex attributes advance when 972c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com rendering multiple instances of primitives in a single draw call 982c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com (see DrawArraysInstancedANGLE and DrawElementsInstancedANGLE below). 992c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com If <divisor> is zero, the attribute at slot <index> advances once 1002c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com per vertex. If <divisor> is non-zero, the attribute advances once 1012c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com per <divisor> instances of the primitives being rendered. 1022c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com An attribute is referred to as "instanced" if its <divisor> value is 1032c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com non-zero." 1042c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 1052c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com Replace the text describing DrawArrays and DrawElements in the 1062c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com "Transferring Array Elements" subsection of 2.8, from the second paragraph 1072c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com through the end of the section with the following: 1082c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 1092c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com "The command 1102c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 1112c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com void DrawArraysOneInstance( enum mode, int first, sizei count, int instance ); 1122c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 1132c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com does not exist in the GL, but is used to describe functionality in 1142c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com the rest of this section. This function constructs a sequence of 1152c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com geometric primitives by transferring elements <first> through <first> + 1162c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com <count> - 1 of each enabled non-instanced array to the GL. <mode> 1172c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com specifies what kind of primitives are constructed, as defined in section 1182c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2.6.1. 1192c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 1202c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com If an enabled vertex attribute array is instanced (it has a non-zero 1212c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com attribute <divisor> as specified by VertexAttribDivisorANGLE), the element 1222c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com that is transferred to the GL is given by: 1232c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 1242c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com floor( <instance> / <divisor> ). 1252c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 1262c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com If an array corresponding to a generic attribute required by a vertex shader 1272c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com is not enabled, then the corresponding element is taken from the current 1282c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com generic attribute state (see section 2.7). 1292c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 1302c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com If an array corresponding to a generic attribute required by a vertex shader 1312c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com is enabled, the corresponding current generic attribute value is unaffected 1322c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com by the execution of DrawArraysOneInstance. 1332c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 1342c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com Specifying <first> < 0 results in undefined behavior. Generating the error 1352c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com INVALID_VALUE is recommended in this case. 1362c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 1372c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com The command 1382c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 1392c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com void DrawArrays( enum mode, int first, sizei count ); 1402c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 1412c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com is equivalent to the command sequence 1422c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 1432c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com DrawArraysOneInstance(mode, first, count, 0); 1442c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 1452c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com The command 1462c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 1472c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com void DrawArraysInstancedANGLE(enum mode, int first, sizei count, 1482c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com sizei primcount); 1492c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 1502c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com behaves identically to DrawArrays except that <primcount> 1512c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com instances of the range of elements are executed, and the 1522c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com <instance> advances for each iteration. Instanced attributes that 1532c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com have <divisor> N, (where N > 0, as specified by 1542c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com VertexAttribDivisorANGLE) advance once every N instances. 1552c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 1562c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com It has the same effect as: 1572c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 1582c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com if (mode, count, or primcount is invalid) 1592c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com generate appropriate error 1602c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com else { 1612c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com for (i = 0; i < primcount; i++) { 1622c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com DrawArraysOneInstance(mode, first, count, i); 1632c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com } 1642c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com } 1652c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 1662c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com The command 1672c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 1682c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com void DrawElementsOneInstance( enum mode, sizei count, enum type, 1692c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com void *indices, int instance ); 1702c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 1712c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com does not exist in the GL, but is used to describe functionality in 1722c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com the rest of this section. This command constructs a sequence of 1732c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com geometric primitives by successively transferring the <count> elements 1742c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com whose indices are stored in the currently bound element array buffer 1752c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com (see section 2.9.2) at the offset defined by <indices> to the GL. 1762c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com The <i>-th element transferred by DrawElementsOneInstance will be taken 1772c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com from element <indices>[i] of each enabled non-instanced array. 1782c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com <type> must be one of UNSIGNED_BYTE, UNSIGNED_SHORT, or UNSIGNED_INT, 1792c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com indicating that the index values are of GL type ubyte, ushort, or uint 1802c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com respectively. <mode> specifies what kind of primitives are constructed, 1812c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com as defined in section 2.6.1. 1822c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 1832c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com If an enabled vertex attribute array is instanced (it has a non-zero 1842c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com attribute <divisor> as specified by VertexAttribDivisorANGLE), the element 1852c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com that is transferred to the GL is given by: 1862c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 1872c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com floor( <instance> / <divisor> ); 1882c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 1892c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com If an array corresponding to a generic attribute required by a vertex 1902c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com shader is not enabled, then the corresponding element is taken from the 1912c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com current generic attribute state (see section 2.7). Otherwise, if an array 1922c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com is enabled, the corresponding current generic attribute value is 1932c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com unaffected by the execution of DrawElementsOneInstance. 1942c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 1952c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com The command 1962c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 1972c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com void DrawElements( enum mode, sizei count, enum type, 1982c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com const void *indices); 1992c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2002c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com behaves identically to DrawElementsOneInstance with the <instance> 2012c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com parameter set to zero; the effect of calling 2022c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2032c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com DrawElements(mode, count, type, indices); 2042c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2052c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com is equivalent to the command sequence: 2062c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2072c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com if (mode, count or type is invalid ) 2082c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com generate appropriate error 2092c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com else 2102c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com DrawElementsOneInstance(mode, count, type, indices, 0); 2112c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2122c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com The command 2132c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2142c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com void DrawElementsInstancedANGLE(enum mode, sizei count, enum type, 2152c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com const void *indices, sizei primcount); 2162c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2172c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com behaves identically to DrawElements except that <primcount> 2182c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com instances of the set of elements are executed and the instance 2192c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com advances between each set. Instanced attributes are advanced as they do 2202c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com during the execution of DrawArraysInstancedANGLE. It has the same effect as: 2212c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2222c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com if (mode, count, primcount, or type is invalid ) 2232c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com generate appropriate error 2242c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com else { 2252c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com for (int i = 0; i < primcount; i++) { 2262c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com DrawElementsOneInstance(mode, count, type, indices, i); 2272c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com } 2282c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com } 2292c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2302c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com If the number of supported generic vertex attributes (the value of 2312c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com MAX_VERTEX_ATTRIBS) is <n>, then the client state required to implement 2322c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com vertex arrays consists of <n> boolean values, <n> memory pointers, <n> 2332c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com integer stride values, <n> symbolic constants representing array types, 2342c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com <n> integers representing values per element, <n> boolean values 2352c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com indicating normalization, and <n> integers representing vertex attribute 2362c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com divisors. 2372c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2382c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com In the initial state, the boolean values are each false, the memory 2392c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com pointers are each NULL, the strides are each zero, the array types are 2402c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com each FLOAT, the integers representing values per element are each four, 2412c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com and the divisors are each zero." 2422c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2432c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.comAdditions to Chapter 3 of the OpenGL ES 2.0 Specification (Rasterization) 2442c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2452c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com None 2462c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2472c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.comAdditions to Chapter 4 of the OpenGL ES 2.0 Specification (Per-Fragment 2482c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.comOperations and the Framebuffer) 2492c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2502c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com None 2512c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2522c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.comAdditions to Chapter 5 of the OpenGL ES 2.0 Specification (Special Functions) 2532c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2542c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com None 2552c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2562c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.comAdditions to Chapter 6 of the OpenGL ES 2.0 Specification (State and State 2572c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.comRequests) 2582c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2592c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com In section 6.1.8, add VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE to the list of 2602c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com pnames accepted by GetVertexAttribfv and GetVertexAttribiv. 2612c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2622c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.comAdditions to the AGL/EGL/GLX/WGL Specifications 2632c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2642c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com None 2652c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2662c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.comDependencies on OES_element_index_uint 2672c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2682c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com If OES_element_index_uint is not supported, removed all references 2692c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com to UNSIGNED_INT indices and the associated GL data type uint in 2702c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com the description of DrawElementsOneInstance. 2712c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2722c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.comErrors 2732c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2742c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com INVALID_VALUE is generated by VertexAttribDivisorANGLE if <index> 2752c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com is greater than or equal to MAX_VERTEX_ATTRIBS. 2762c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2772c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com INVALID_ENUM is generated by DrawElementsInstancedANGLE if <type> is 2782c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com not one of UNSIGNED_BYTE, UNSIGNED_SHORT or UNSIGNED_INT. 2792c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2802c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com INVALID_VALUE is generated by DrawArraysInstancedANGLE if <first>, 2812c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com <count>, or <primcount> is less than zero. 2822c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2832c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com INVALID_ENUM is generated by DrawArraysInstancedANGLE or 2842c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com DrawElementsInstancedANGLE if <mode> is not one of the modes described in 2852c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com section 2.6.1. 2862c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2872c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com INVALID_VALUE is generated by DrawElementsInstancedANGLE if <count> or 2882c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com <primcount> is less than zero. 2892c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2902c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com INVALID_OPERATION is generated by DrawArraysInstancedANGLE or 2912c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com DrawElementsInstancedANGLE if there is not at least one enabled 292d7400b510daf900320b9cf35359d789a2487bc58daniel@transgaming.com vertex attribute array that has a <divisor> of zero and is bound to an 293d7400b510daf900320b9cf35359d789a2487bc58daniel@transgaming.com active generic attribute value in the program used for the draw command. 2942c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2952c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.comNew State 2962c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2972c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com Changes to table 6.7, p. 268 (Vertex Array Data) 2982c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2992c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com Initial 3002c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com Get Value Type Get Command Value Description Sec. 3012c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com --------- ----- ----------- ------- ----------- ---- 3022c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 8*xZ+ GetVertexAttrib 0 Instance Divisor 2.8 3032c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 3042c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.comIssues 3052c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 3062c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 1) Should vertex attribute zero be instance-able? 3072c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 3082c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com Resolved: Yes. 3092c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com Discussion: In Direct3D 9 stream 0 must be specified as indexed data 3102c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com and it cannot be instanced. In ANGLE we can work around this by 3112c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com remapping any other stream that does have indexed data (ie a zero 3122c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com attribute divisor) to stream 0 in D3D9. This works because the HLSL 3132c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com vertex shader matches attributes against the stream by using the 3142c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com shader semantic index. 3152c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 3162c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 2) Can all vertex attributes be instanced simultaneously? 3172c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 3182c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com Resolved: No 3192c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com Discussion: In rare cases it is possible for no attribute to have a 3202c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com divisor of 0, meaning that all attributes are instanced and none of 3212c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com them are regularly indexed. This in turn means each instance can only 3222c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com have a single position element, and so it only actually renders 3232c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com something when rendering point primitives. This is not a very 3242c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com meaningful way of using instancing (which is likely why D3D restricts 3252c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com stream 0 to be indexed regularly for position data in the first place). 3262c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com We could implement it by drawing these points one at a time (essentially 3272c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com emulating instancing), but it would not be very efficient and there 3282c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com seems to be little-to-no value in doing so. 3292c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 330d7400b510daf900320b9cf35359d789a2487bc58daniel@transgaming.com If all of the enabled vertex attribute arrays that are bound to active 331d7400b510daf900320b9cf35359d789a2487bc58daniel@transgaming.com generic attributes in the program have a non-zero divisor, the draw 3322c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com call should return INVALID_OPERATION. 3332c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 3342c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 3) Direct3D 9 only supports instancing for DrawIndexedPrimitive which 3352c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com corresponds to DrawElementsInstanced. Should we support 3362c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com DrawArraysInstanced? 3372c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 3382c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com Resolved: Yes 3392c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com Discussion: This can be supported easily enough by simply manufacturing 3402c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com a linear index buffer of sufficient size and using that to do indexed 3412c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com D3D9 drawing. 3422c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 3432c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 4) How much data is needed in a buffer for an instanced attribute? 3442c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 3452c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com Resolved: Where stride is the value passed to VertexAttribPointer: 3462c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 3472c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com if stride > 0 3482c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com size = stride * ceil(primcount / divisor); 3492c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com else 3502c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com size = elementsize * ceil(primcount / divisor); 3512c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 3522c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.comRevision History 3532c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com 354d7400b510daf900320b9cf35359d789a2487bc58daniel@transgaming.com #3 February 8, 2012 dgkoch 355d7400b510daf900320b9cf35359d789a2487bc58daniel@transgaming.com - clarify Issue 3 and the error condition for no indexed attributes 3562c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com #2 January 24, 2012 dgkoch 3572c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com - fix typos, add clarifications, and more errors 3582c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com #1 January 17, 2012 dgkoch 3592c1370b0788154c2bd7535c9de302820ccca958fdaniel@transgaming.com - initial GLES2 version from ARB_instanced_arrays 360