15bd8deadSopenharmony_ciName 25bd8deadSopenharmony_ci 35bd8deadSopenharmony_ci ANGLE_instanced_arrays 45bd8deadSopenharmony_ci 55bd8deadSopenharmony_ciName Strings 65bd8deadSopenharmony_ci 75bd8deadSopenharmony_ci GL_ANGLE_instanced_arrays 85bd8deadSopenharmony_ci 95bd8deadSopenharmony_ciContributors 105bd8deadSopenharmony_ci 115bd8deadSopenharmony_ci Contributors to ARB_instanced_arrays 125bd8deadSopenharmony_ci Nicolas Capens, TransGaming Inc. 135bd8deadSopenharmony_ci James Helferty, TransGaming Inc. 145bd8deadSopenharmony_ci Kenneth Russell, Google Inc. 155bd8deadSopenharmony_ci Vangelis Kokkevis, Google Inc. 165bd8deadSopenharmony_ci 175bd8deadSopenharmony_ciContact 185bd8deadSopenharmony_ci 195bd8deadSopenharmony_ci Daniel Koch, TransGaming Inc. (daniel 'at' transgaming.com) 205bd8deadSopenharmony_ci 215bd8deadSopenharmony_ciStatus 225bd8deadSopenharmony_ci 235bd8deadSopenharmony_ci Implemented in ANGLE r976. 245bd8deadSopenharmony_ci 255bd8deadSopenharmony_ciVersion 265bd8deadSopenharmony_ci 275bd8deadSopenharmony_ci Last Modified Date: February 3, 2017 285bd8deadSopenharmony_ci Author Revision: 4 295bd8deadSopenharmony_ci 305bd8deadSopenharmony_ciNumber 315bd8deadSopenharmony_ci 325bd8deadSopenharmony_ci OpenGL ES Extension #109 335bd8deadSopenharmony_ci 345bd8deadSopenharmony_ciDependencies 355bd8deadSopenharmony_ci 365bd8deadSopenharmony_ci OpenGL ES 2.0 is required. 375bd8deadSopenharmony_ci 385bd8deadSopenharmony_ci This extension is written against the OpenGL ES 2.0 Specification. 395bd8deadSopenharmony_ci 405bd8deadSopenharmony_ciOverview 415bd8deadSopenharmony_ci 425bd8deadSopenharmony_ci A common use case in GL for some applications is to be able to 435bd8deadSopenharmony_ci draw the same object, or groups of similar objects that share 445bd8deadSopenharmony_ci vertex data, primitive count and type, multiple times. This 455bd8deadSopenharmony_ci extension provides a means of accelerating such use cases while 465bd8deadSopenharmony_ci restricting the number of API calls, and keeping the amount of 475bd8deadSopenharmony_ci duplicate data to a minimum. 485bd8deadSopenharmony_ci 495bd8deadSopenharmony_ci This extension introduces an array "divisor" for generic 505bd8deadSopenharmony_ci vertex array attributes, which when non-zero specifies that the 515bd8deadSopenharmony_ci attribute is "instanced." An instanced attribute does not 525bd8deadSopenharmony_ci advance per-vertex as usual, but rather after every <divisor> 535bd8deadSopenharmony_ci conceptual draw calls. 545bd8deadSopenharmony_ci 555bd8deadSopenharmony_ci (Attributes which aren't instanced are repeated in their entirety 565bd8deadSopenharmony_ci for every conceptual draw call.) 575bd8deadSopenharmony_ci 585bd8deadSopenharmony_ci By specifying transform data in an instanced attribute or series 595bd8deadSopenharmony_ci of instanced attributes, vertex shaders can, in concert with the 605bd8deadSopenharmony_ci instancing draw calls, draw multiple instances of an object with 615bd8deadSopenharmony_ci one draw call. 625bd8deadSopenharmony_ci 635bd8deadSopenharmony_ciIP Status 645bd8deadSopenharmony_ci 655bd8deadSopenharmony_ci No known IP claims. 665bd8deadSopenharmony_ci 675bd8deadSopenharmony_ciNew Tokens 685bd8deadSopenharmony_ci 695bd8deadSopenharmony_ci Accepted by the <pname> parameters of GetVertexAttribfv and 705bd8deadSopenharmony_ci GetVertexAttribiv: 715bd8deadSopenharmony_ci 725bd8deadSopenharmony_ci VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 0x88FE 735bd8deadSopenharmony_ci 745bd8deadSopenharmony_ciNew Procedures and Functions 755bd8deadSopenharmony_ci 765bd8deadSopenharmony_ci void DrawArraysInstancedANGLE(enum mode, int first, sizei count, 775bd8deadSopenharmony_ci sizei primcount); 785bd8deadSopenharmony_ci 795bd8deadSopenharmony_ci void DrawElementsInstancedANGLE(enum mode, sizei count, enum type, 805bd8deadSopenharmony_ci const void *indices, sizei primcount); 815bd8deadSopenharmony_ci 825bd8deadSopenharmony_ci void VertexAttribDivisorANGLE(uint index, uint divisor); 835bd8deadSopenharmony_ci 845bd8deadSopenharmony_ciAdditions to Chapter 2 of the OpenGL ES 2.0 Specification 855bd8deadSopenharmony_ci(OpenGL ES Operation) 865bd8deadSopenharmony_ci 875bd8deadSopenharmony_ci Modify section 2.8 (Vertex Arrays), p. 21 885bd8deadSopenharmony_ci 895bd8deadSopenharmony_ci After description of EnableVertexAttribArray / DisableVertexAttribArray 905bd8deadSopenharmony_ci add the following: 915bd8deadSopenharmony_ci 925bd8deadSopenharmony_ci "The command 935bd8deadSopenharmony_ci 945bd8deadSopenharmony_ci void VertexAttribDivisorANGLE(uint index, uint divisor); 955bd8deadSopenharmony_ci 965bd8deadSopenharmony_ci modifies the rate at which generic vertex attributes advance when 975bd8deadSopenharmony_ci rendering multiple instances of primitives in a single draw call 985bd8deadSopenharmony_ci (see DrawArraysInstancedANGLE and DrawElementsInstancedANGLE below). 995bd8deadSopenharmony_ci If <divisor> is zero, the attribute at slot <index> advances once 1005bd8deadSopenharmony_ci per vertex. If <divisor> is non-zero, the attribute advances once 1015bd8deadSopenharmony_ci per <divisor> instances of the primitives being rendered. 1025bd8deadSopenharmony_ci An attribute is referred to as "instanced" if its <divisor> value is 1035bd8deadSopenharmony_ci non-zero." 1045bd8deadSopenharmony_ci 1055bd8deadSopenharmony_ci Replace the text describing DrawArrays and DrawElements in the 1065bd8deadSopenharmony_ci "Transferring Array Elements" subsection of 2.8, from the second paragraph 1075bd8deadSopenharmony_ci through the end of the section with the following: 1085bd8deadSopenharmony_ci 1095bd8deadSopenharmony_ci "The command 1105bd8deadSopenharmony_ci 1115bd8deadSopenharmony_ci void DrawArraysOneInstance( enum mode, int first, sizei count, int instance ); 1125bd8deadSopenharmony_ci 1135bd8deadSopenharmony_ci does not exist in the GL, but is used to describe functionality in 1145bd8deadSopenharmony_ci the rest of this section. This function constructs a sequence of 1155bd8deadSopenharmony_ci geometric primitives by transferring elements <first> through <first> + 1165bd8deadSopenharmony_ci <count> - 1 of each enabled non-instanced array to the GL. <mode> 1175bd8deadSopenharmony_ci specifies what kind of primitives are constructed, as defined in section 1185bd8deadSopenharmony_ci 2.6.1. 1195bd8deadSopenharmony_ci 1205bd8deadSopenharmony_ci If an enabled vertex attribute array is instanced (it has a non-zero 1215bd8deadSopenharmony_ci attribute <divisor> as specified by VertexAttribDivisorANGLE), the element 1225bd8deadSopenharmony_ci that is transferred to the GL is given by: 1235bd8deadSopenharmony_ci 1245bd8deadSopenharmony_ci floor( <instance> / <divisor> ). 1255bd8deadSopenharmony_ci 1265bd8deadSopenharmony_ci If an array corresponding to a generic attribute required by a vertex shader 1275bd8deadSopenharmony_ci is not enabled, then the corresponding element is taken from the current 1285bd8deadSopenharmony_ci generic attribute state (see section 2.7). 1295bd8deadSopenharmony_ci 1305bd8deadSopenharmony_ci If an array corresponding to a generic attribute required by a vertex shader 1315bd8deadSopenharmony_ci is enabled, the corresponding current generic attribute value is unaffected 1325bd8deadSopenharmony_ci by the execution of DrawArraysOneInstance. 1335bd8deadSopenharmony_ci 1345bd8deadSopenharmony_ci Specifying <first> < 0 results in undefined behavior. Generating the error 1355bd8deadSopenharmony_ci INVALID_VALUE is recommended in this case. 1365bd8deadSopenharmony_ci 1375bd8deadSopenharmony_ci The command 1385bd8deadSopenharmony_ci 1395bd8deadSopenharmony_ci void DrawArrays( enum mode, int first, sizei count ); 1405bd8deadSopenharmony_ci 1415bd8deadSopenharmony_ci is equivalent to the command sequence 1425bd8deadSopenharmony_ci 1435bd8deadSopenharmony_ci DrawArraysOneInstance(mode, first, count, 0); 1445bd8deadSopenharmony_ci 1455bd8deadSopenharmony_ci The command 1465bd8deadSopenharmony_ci 1475bd8deadSopenharmony_ci void DrawArraysInstancedANGLE(enum mode, int first, sizei count, 1485bd8deadSopenharmony_ci sizei primcount); 1495bd8deadSopenharmony_ci 1505bd8deadSopenharmony_ci behaves identically to DrawArrays except that <primcount> 1515bd8deadSopenharmony_ci instances of the range of elements are executed, and the 1525bd8deadSopenharmony_ci <instance> advances for each iteration. Instanced attributes that 1535bd8deadSopenharmony_ci have <divisor> N, (where N > 0, as specified by 1545bd8deadSopenharmony_ci VertexAttribDivisorANGLE) advance once every N instances. 1555bd8deadSopenharmony_ci 1565bd8deadSopenharmony_ci It has the same effect as: 1575bd8deadSopenharmony_ci 1585bd8deadSopenharmony_ci if (mode, count, or primcount is invalid) 1595bd8deadSopenharmony_ci generate appropriate error 1605bd8deadSopenharmony_ci else { 1615bd8deadSopenharmony_ci for (i = 0; i < primcount; i++) { 1625bd8deadSopenharmony_ci DrawArraysOneInstance(mode, first, count, i); 1635bd8deadSopenharmony_ci } 1645bd8deadSopenharmony_ci } 1655bd8deadSopenharmony_ci 1665bd8deadSopenharmony_ci The command 1675bd8deadSopenharmony_ci 1685bd8deadSopenharmony_ci void DrawElementsOneInstance( enum mode, sizei count, enum type, 1695bd8deadSopenharmony_ci void *indices, int instance ); 1705bd8deadSopenharmony_ci 1715bd8deadSopenharmony_ci does not exist in the GL, but is used to describe functionality in 1725bd8deadSopenharmony_ci the rest of this section. This command constructs a sequence of 1735bd8deadSopenharmony_ci geometric primitives by successively transferring the <count> elements 1745bd8deadSopenharmony_ci whose indices are stored in the currently bound element array buffer 1755bd8deadSopenharmony_ci (see section 2.9.2) at the offset defined by <indices> to the GL. 1765bd8deadSopenharmony_ci The <i>-th element transferred by DrawElementsOneInstance will be taken 1775bd8deadSopenharmony_ci from element <indices>[i] of each enabled non-instanced array. 1785bd8deadSopenharmony_ci <type> must be one of UNSIGNED_BYTE, UNSIGNED_SHORT, or UNSIGNED_INT, 1795bd8deadSopenharmony_ci indicating that the index values are of GL type ubyte, ushort, or uint 1805bd8deadSopenharmony_ci respectively. <mode> specifies what kind of primitives are constructed, 1815bd8deadSopenharmony_ci as defined in section 2.6.1. 1825bd8deadSopenharmony_ci 1835bd8deadSopenharmony_ci If an enabled vertex attribute array is instanced (it has a non-zero 1845bd8deadSopenharmony_ci attribute <divisor> as specified by VertexAttribDivisorANGLE), the element 1855bd8deadSopenharmony_ci that is transferred to the GL is given by: 1865bd8deadSopenharmony_ci 1875bd8deadSopenharmony_ci floor( <instance> / <divisor> ); 1885bd8deadSopenharmony_ci 1895bd8deadSopenharmony_ci If an array corresponding to a generic attribute required by a vertex 1905bd8deadSopenharmony_ci shader is not enabled, then the corresponding element is taken from the 1915bd8deadSopenharmony_ci current generic attribute state (see section 2.7). Otherwise, if an array 1925bd8deadSopenharmony_ci is enabled, the corresponding current generic attribute value is 1935bd8deadSopenharmony_ci unaffected by the execution of DrawElementsOneInstance. 1945bd8deadSopenharmony_ci 1955bd8deadSopenharmony_ci The command 1965bd8deadSopenharmony_ci 1975bd8deadSopenharmony_ci void DrawElements( enum mode, sizei count, enum type, 1985bd8deadSopenharmony_ci const void *indices); 1995bd8deadSopenharmony_ci 2005bd8deadSopenharmony_ci behaves identically to DrawElementsOneInstance with the <instance> 2015bd8deadSopenharmony_ci parameter set to zero; the effect of calling 2025bd8deadSopenharmony_ci 2035bd8deadSopenharmony_ci DrawElements(mode, count, type, indices); 2045bd8deadSopenharmony_ci 2055bd8deadSopenharmony_ci is equivalent to the command sequence: 2065bd8deadSopenharmony_ci 2075bd8deadSopenharmony_ci if (mode, count or type is invalid ) 2085bd8deadSopenharmony_ci generate appropriate error 2095bd8deadSopenharmony_ci else 2105bd8deadSopenharmony_ci DrawElementsOneInstance(mode, count, type, indices, 0); 2115bd8deadSopenharmony_ci 2125bd8deadSopenharmony_ci The command 2135bd8deadSopenharmony_ci 2145bd8deadSopenharmony_ci void DrawElementsInstancedANGLE(enum mode, sizei count, enum type, 2155bd8deadSopenharmony_ci const void *indices, sizei primcount); 2165bd8deadSopenharmony_ci 2175bd8deadSopenharmony_ci behaves identically to DrawElements except that <primcount> 2185bd8deadSopenharmony_ci instances of the set of elements are executed and the instance 2195bd8deadSopenharmony_ci advances between each set. Instanced attributes are advanced as they do 2205bd8deadSopenharmony_ci during the execution of DrawArraysInstancedANGLE. It has the same effect as: 2215bd8deadSopenharmony_ci 2225bd8deadSopenharmony_ci if (mode, count, primcount, or type is invalid ) 2235bd8deadSopenharmony_ci generate appropriate error 2245bd8deadSopenharmony_ci else { 2255bd8deadSopenharmony_ci for (int i = 0; i < primcount; i++) { 2265bd8deadSopenharmony_ci DrawElementsOneInstance(mode, count, type, indices, i); 2275bd8deadSopenharmony_ci } 2285bd8deadSopenharmony_ci } 2295bd8deadSopenharmony_ci 2305bd8deadSopenharmony_ci If the number of supported generic vertex attributes (the value of 2315bd8deadSopenharmony_ci MAX_VERTEX_ATTRIBS) is <n>, then the client state required to implement 2325bd8deadSopenharmony_ci vertex arrays consists of <n> boolean values, <n> memory pointers, <n> 2335bd8deadSopenharmony_ci integer stride values, <n> symbolic constants representing array types, 2345bd8deadSopenharmony_ci <n> integers representing values per element, <n> boolean values 2355bd8deadSopenharmony_ci indicating normalization, and <n> integers representing vertex attribute 2365bd8deadSopenharmony_ci divisors. 2375bd8deadSopenharmony_ci 2385bd8deadSopenharmony_ci In the initial state, the boolean values are each false, the memory 2395bd8deadSopenharmony_ci pointers are each NULL, the strides are each zero, the array types are 2405bd8deadSopenharmony_ci each FLOAT, the integers representing values per element are each four, 2415bd8deadSopenharmony_ci and the divisors are each zero." 2425bd8deadSopenharmony_ci 2435bd8deadSopenharmony_ciAdditions to Chapter 3 of the OpenGL ES 2.0 Specification (Rasterization) 2445bd8deadSopenharmony_ci 2455bd8deadSopenharmony_ci None 2465bd8deadSopenharmony_ci 2475bd8deadSopenharmony_ciAdditions to Chapter 4 of the OpenGL ES 2.0 Specification (Per-Fragment 2485bd8deadSopenharmony_ciOperations and the Framebuffer) 2495bd8deadSopenharmony_ci 2505bd8deadSopenharmony_ci None 2515bd8deadSopenharmony_ci 2525bd8deadSopenharmony_ciAdditions to Chapter 5 of the OpenGL ES 2.0 Specification (Special Functions) 2535bd8deadSopenharmony_ci 2545bd8deadSopenharmony_ci None 2555bd8deadSopenharmony_ci 2565bd8deadSopenharmony_ciAdditions to Chapter 6 of the OpenGL ES 2.0 Specification (State and State 2575bd8deadSopenharmony_ciRequests) 2585bd8deadSopenharmony_ci 2595bd8deadSopenharmony_ci In section 6.1.8, add VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE to the list of 2605bd8deadSopenharmony_ci pnames accepted by GetVertexAttribfv and GetVertexAttribiv. 2615bd8deadSopenharmony_ci 2625bd8deadSopenharmony_ciAdditions to the AGL/EGL/GLX/WGL Specifications 2635bd8deadSopenharmony_ci 2645bd8deadSopenharmony_ci None 2655bd8deadSopenharmony_ci 2665bd8deadSopenharmony_ciDependencies on OES_element_index_uint 2675bd8deadSopenharmony_ci 2685bd8deadSopenharmony_ci If OES_element_index_uint is not supported, removed all references 2695bd8deadSopenharmony_ci to UNSIGNED_INT indices and the associated GL data type uint in 2705bd8deadSopenharmony_ci the description of DrawElementsOneInstance. 2715bd8deadSopenharmony_ci 2725bd8deadSopenharmony_ciErrors 2735bd8deadSopenharmony_ci 2745bd8deadSopenharmony_ci INVALID_VALUE is generated by VertexAttribDivisorANGLE if <index> 2755bd8deadSopenharmony_ci is greater than or equal to MAX_VERTEX_ATTRIBS. 2765bd8deadSopenharmony_ci 2775bd8deadSopenharmony_ci INVALID_ENUM is generated by DrawElementsInstancedANGLE if <type> is 2785bd8deadSopenharmony_ci not one of UNSIGNED_BYTE, UNSIGNED_SHORT or UNSIGNED_INT. 2795bd8deadSopenharmony_ci 2805bd8deadSopenharmony_ci INVALID_VALUE is generated by DrawArraysInstancedANGLE if <first>, 2815bd8deadSopenharmony_ci <count>, or <primcount> is less than zero. 2825bd8deadSopenharmony_ci 2835bd8deadSopenharmony_ci INVALID_ENUM is generated by DrawArraysInstancedANGLE or 2845bd8deadSopenharmony_ci DrawElementsInstancedANGLE if <mode> is not one of the modes described in 2855bd8deadSopenharmony_ci section 2.6.1. 2865bd8deadSopenharmony_ci 2875bd8deadSopenharmony_ci INVALID_VALUE is generated by DrawElementsInstancedANGLE if <count> or 2885bd8deadSopenharmony_ci <primcount> is less than zero. 2895bd8deadSopenharmony_ci 2905bd8deadSopenharmony_ci INVALID_OPERATION is generated by DrawArraysInstancedANGLE or 2915bd8deadSopenharmony_ci DrawElementsInstancedANGLE if there is not at least one enabled 2925bd8deadSopenharmony_ci vertex attribute array that has a <divisor> of zero and is bound to an 2935bd8deadSopenharmony_ci active generic attribute value in the program used for the draw command. 2945bd8deadSopenharmony_ci 2955bd8deadSopenharmony_ciNew State 2965bd8deadSopenharmony_ci 2975bd8deadSopenharmony_ci Changes to table 6.2, p. 136 (Vertex Array Data) 2985bd8deadSopenharmony_ci 2995bd8deadSopenharmony_ci Initial 3005bd8deadSopenharmony_ci Get Value Type Get Command Value Description Sec. 3015bd8deadSopenharmony_ci --------- ----- ----------- ------- ----------- ---- 3025bd8deadSopenharmony_ci VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE 8*xZ+ GetVertexAttrib 0 Instance Divisor 2.8 3035bd8deadSopenharmony_ci 3045bd8deadSopenharmony_ciIssues 3055bd8deadSopenharmony_ci 3065bd8deadSopenharmony_ci 1) Should vertex attribute zero be instance-able? 3075bd8deadSopenharmony_ci 3085bd8deadSopenharmony_ci Resolved: Yes. 3095bd8deadSopenharmony_ci Discussion: In Direct3D 9 stream 0 must be specified as indexed data 3105bd8deadSopenharmony_ci and it cannot be instanced. In ANGLE we can work around this by 3115bd8deadSopenharmony_ci remapping any other stream that does have indexed data (ie a zero 3125bd8deadSopenharmony_ci attribute divisor) to stream 0 in D3D9. This works because the HLSL 3135bd8deadSopenharmony_ci vertex shader matches attributes against the stream by using the 3145bd8deadSopenharmony_ci shader semantic index. 3155bd8deadSopenharmony_ci 3165bd8deadSopenharmony_ci 2) Can all vertex attributes be instanced simultaneously? 3175bd8deadSopenharmony_ci 3185bd8deadSopenharmony_ci Resolved: No 3195bd8deadSopenharmony_ci Discussion: In rare cases it is possible for no attribute to have a 3205bd8deadSopenharmony_ci divisor of 0, meaning that all attributes are instanced and none of 3215bd8deadSopenharmony_ci them are regularly indexed. This in turn means each instance can only 3225bd8deadSopenharmony_ci have a single position element, and so it only actually renders 3235bd8deadSopenharmony_ci something when rendering point primitives. This is not a very 3245bd8deadSopenharmony_ci meaningful way of using instancing (which is likely why D3D restricts 3255bd8deadSopenharmony_ci stream 0 to be indexed regularly for position data in the first place). 3265bd8deadSopenharmony_ci We could implement it by drawing these points one at a time (essentially 3275bd8deadSopenharmony_ci emulating instancing), but it would not be very efficient and there 3285bd8deadSopenharmony_ci seems to be little-to-no value in doing so. 3295bd8deadSopenharmony_ci 3305bd8deadSopenharmony_ci If all of the enabled vertex attribute arrays that are bound to active 3315bd8deadSopenharmony_ci generic attributes in the program have a non-zero divisor, the draw 3325bd8deadSopenharmony_ci call should return INVALID_OPERATION. 3335bd8deadSopenharmony_ci 3345bd8deadSopenharmony_ci 3) Direct3D 9 only supports instancing for DrawIndexedPrimitive which 3355bd8deadSopenharmony_ci corresponds to DrawElementsInstanced. Should we support 3365bd8deadSopenharmony_ci DrawArraysInstanced? 3375bd8deadSopenharmony_ci 3385bd8deadSopenharmony_ci Resolved: Yes 3395bd8deadSopenharmony_ci Discussion: This can be supported easily enough by simply manufacturing 3405bd8deadSopenharmony_ci a linear index buffer of sufficient size and using that to do indexed 3415bd8deadSopenharmony_ci D3D9 drawing. 3425bd8deadSopenharmony_ci 3435bd8deadSopenharmony_ci 4) How much data is needed in a buffer for an instanced attribute? 3445bd8deadSopenharmony_ci 3455bd8deadSopenharmony_ci Resolved: Where stride is the value passed to VertexAttribPointer: 3465bd8deadSopenharmony_ci 3475bd8deadSopenharmony_ci if stride > 0 3485bd8deadSopenharmony_ci size = stride * ceil(primcount / divisor); 3495bd8deadSopenharmony_ci else 3505bd8deadSopenharmony_ci size = elementsize * ceil(primcount / divisor); 3515bd8deadSopenharmony_ci 3525bd8deadSopenharmony_ciRevision History 3535bd8deadSopenharmony_ci 3545bd8deadSopenharmony_ci #4 February 3, 2017 Jon Leech 3555bd8deadSopenharmony_ci - Correct reference to ES 2.0 state table from 6.7 to 6.2 (public bug 3565bd8deadSopenharmony_ci 1390) 3575bd8deadSopenharmony_ci #3 February 8, 2012 dgkoch 3585bd8deadSopenharmony_ci - clarify Issue 3 and the error condition for no indexed attributes 3595bd8deadSopenharmony_ci #2 January 24, 2012 dgkoch 3605bd8deadSopenharmony_ci - fix typos, add clarifications, and more errors 3615bd8deadSopenharmony_ci #1 January 17, 2012 dgkoch 3625bd8deadSopenharmony_ci - initial GLES2 version from ARB_instanced_arrays 363