15bd8deadSopenharmony_ciName 25bd8deadSopenharmony_ci 35bd8deadSopenharmony_ci NV_instanced_arrays 45bd8deadSopenharmony_ci 55bd8deadSopenharmony_ciName Strings 65bd8deadSopenharmony_ci 75bd8deadSopenharmony_ci GL_NV_instanced_arrays 85bd8deadSopenharmony_ci 95bd8deadSopenharmony_ciContributors 105bd8deadSopenharmony_ci 115bd8deadSopenharmony_ci Contributors to ARB_instanced_arrays and ANGLE_instanced_arrays 125bd8deadSopenharmony_ci Mathias Heyer, NVIDIA 135bd8deadSopenharmony_ci Greg Roth, NVIDIA 145bd8deadSopenharmony_ci 155bd8deadSopenharmony_ciContact 165bd8deadSopenharmony_ci 175bd8deadSopenharmony_ci Greg Roth, NVIDIA (groth 'at' nvidia 'dot' com) 185bd8deadSopenharmony_ci 195bd8deadSopenharmony_ciStatus 205bd8deadSopenharmony_ci 215bd8deadSopenharmony_ci Complete 225bd8deadSopenharmony_ci 235bd8deadSopenharmony_ciVersion 245bd8deadSopenharmony_ci 255bd8deadSopenharmony_ci Last Modified Date: Aug 28, 2012 265bd8deadSopenharmony_ci Author Revision: 4 275bd8deadSopenharmony_ci 285bd8deadSopenharmony_ciNumber 295bd8deadSopenharmony_ci 305bd8deadSopenharmony_ci OpenGL ES Extension #145 315bd8deadSopenharmony_ci 325bd8deadSopenharmony_ciDependencies 335bd8deadSopenharmony_ci 345bd8deadSopenharmony_ci OpenGL ES 2.0 is required. 355bd8deadSopenharmony_ci 365bd8deadSopenharmony_ci This extension is written against the OpenGL ES 2.0.25 375bd8deadSopenharmony_ci Specification. 385bd8deadSopenharmony_ci 395bd8deadSopenharmony_ci NV_draw_instanced affects the definition of this extension. 405bd8deadSopenharmony_ci 415bd8deadSopenharmony_ci OES_element_index_uint affects the definition of this extension. 425bd8deadSopenharmony_ci 435bd8deadSopenharmony_ci OES_vertex_array_object affects the definition of this extension. 445bd8deadSopenharmony_ci 455bd8deadSopenharmony_ciOverview 465bd8deadSopenharmony_ci 475bd8deadSopenharmony_ci A common use case in GL for some applications is to be able to 485bd8deadSopenharmony_ci draw the same object, or groups of similar objects that share 495bd8deadSopenharmony_ci vertex data, primitive count and type, multiple times. This 505bd8deadSopenharmony_ci extension provides a means of accelerating such use cases while 515bd8deadSopenharmony_ci limiting the number of required API calls, and keeping the amount 525bd8deadSopenharmony_ci of duplicate data to a minimum. 535bd8deadSopenharmony_ci 545bd8deadSopenharmony_ci In particular, this extension specifies an alternative to the 555bd8deadSopenharmony_ci read-only shader variable introduced by NV_draw_instanced. It 565bd8deadSopenharmony_ci uses the same draw calls introduced by that extension, but 575bd8deadSopenharmony_ci redefines them so that a vertex shader can instead use vertex 585bd8deadSopenharmony_ci array attributes as a source of instance data. 595bd8deadSopenharmony_ci 605bd8deadSopenharmony_ci This extension introduces an array "divisor" for generic 615bd8deadSopenharmony_ci vertex array attributes, which when non-zero specifies that the 625bd8deadSopenharmony_ci attribute is "instanced." An instanced attribute does not 635bd8deadSopenharmony_ci advance per-vertex as usual, but rather after every <divisor> 645bd8deadSopenharmony_ci conceptual draw calls. 655bd8deadSopenharmony_ci 665bd8deadSopenharmony_ci (Attributes which aren't instanced are repeated in their entirety 675bd8deadSopenharmony_ci for every conceptual draw call.) 685bd8deadSopenharmony_ci 695bd8deadSopenharmony_ci By specifying transform data in an instanced attribute or series 705bd8deadSopenharmony_ci of instanced attributes, vertex shaders can, in concert with the 715bd8deadSopenharmony_ci instancing draw calls, draw multiple instances of an object with 725bd8deadSopenharmony_ci one draw call. 735bd8deadSopenharmony_ci 745bd8deadSopenharmony_ciNew Procedures and Functions 755bd8deadSopenharmony_ci 765bd8deadSopenharmony_ci void VertexAttribDivisorNV(uint index, uint divisor); 775bd8deadSopenharmony_ci 785bd8deadSopenharmony_ciNew Tokens 795bd8deadSopenharmony_ci 805bd8deadSopenharmony_ci Accepted by the <pname> parameters of GetVertexAttribfv, and 815bd8deadSopenharmony_ci GetVertexAttribiv: 825bd8deadSopenharmony_ci 835bd8deadSopenharmony_ci VERTEX_ATTRIB_ARRAY_DIVISOR_NV 0x88FE 845bd8deadSopenharmony_ci 855bd8deadSopenharmony_ciAdditions to Chapter 2 of the OpenGL ES 2.0.25 Specification 865bd8deadSopenharmony_ci(OpenGL ES Operation) 875bd8deadSopenharmony_ci 885bd8deadSopenharmony_ci Modify section 2.8 (Vertex Arrays) 895bd8deadSopenharmony_ci 905bd8deadSopenharmony_ci After description of EnableVertexAttribArray / 915bd8deadSopenharmony_ci DisableVertexAttribArray add the following: 925bd8deadSopenharmony_ci 935bd8deadSopenharmony_ci The internal counter <instanceID> is a 32-bit integer value which 945bd8deadSopenharmony_ci may be read by a vertex shader as <gl_InstanceIDNV>, as 955bd8deadSopenharmony_ci described in section 2.10.5.2. The value of this counter is 965bd8deadSopenharmony_ci always zero, except as noted below. 975bd8deadSopenharmony_ci 985bd8deadSopenharmony_ci The command 995bd8deadSopenharmony_ci 1005bd8deadSopenharmony_ci void VertexAttribDivisorNV(uint index, uint divisor); 1015bd8deadSopenharmony_ci 1025bd8deadSopenharmony_ci modifies the rate at which generic vertex attributes advance when 1035bd8deadSopenharmony_ci rendering multiple instances of primitives in a single draw call. 1045bd8deadSopenharmony_ci If <divisor> is zero, the attribute at slot <index> advances once 1055bd8deadSopenharmony_ci per vertex. If <divisor> is non-zero, the attribute advances once 1065bd8deadSopenharmony_ci per <divisor> instances of the set(s) of vertices being rendered. 1075bd8deadSopenharmony_ci An attribute is referred to as "instanced" if its <divisor> value is 1085bd8deadSopenharmony_ci non-zero. 1095bd8deadSopenharmony_ci 1105bd8deadSopenharmony_ci Replace the text describing DrawArrays and DrawElements in the 1115bd8deadSopenharmony_ci "Transferring Array Elements" subsection of 2.8, from the second paragraph 1125bd8deadSopenharmony_ci through the end of the section with the following: 1135bd8deadSopenharmony_ci 1145bd8deadSopenharmony_ci The function 1155bd8deadSopenharmony_ci 1165bd8deadSopenharmony_ci void DrawArraysOneInstance( enum mode, int first, sizei count, int instance ); 1175bd8deadSopenharmony_ci 1185bd8deadSopenharmony_ci does not exist in the GL, but is used to describe functionality in 1195bd8deadSopenharmony_ci the rest of this section. This function constructs a sequence of 1205bd8deadSopenharmony_ci geometric primitives using the indicated elements of enabled arrays. 1215bd8deadSopenharmony_ci <mode> specifies what kind of primitives are constructed, as defined 1225bd8deadSopenharmony_ci in section 2.6.1. Elements <first> through <first> + <count> - 1 of 1235bd8deadSopenharmony_ci enabled non-instanced arrays are transferred to the GL. 1245bd8deadSopenharmony_ci If an enabled vertex attribute array is instanced (it has a non-zero 1255bd8deadSopenharmony_ci attribute <divisor> as specified by VertexAttribDivisorNV), the 1265bd8deadSopenharmony_ci element that is transferred to the GL is given by: 1275bd8deadSopenharmony_ci 1285bd8deadSopenharmony_ci floor( <instance> / <divisor> ). 1295bd8deadSopenharmony_ci 1305bd8deadSopenharmony_ci If an array corresponding to a generic attribute required by a 1315bd8deadSopenharmony_ci vertex shader is not enabled, then the corresponding element is 1325bd8deadSopenharmony_ci taken from the current generic attribute state (see section 2.7). 1335bd8deadSopenharmony_ci 1345bd8deadSopenharmony_ci If an array corresponding to a attribute required by a vertex 1355bd8deadSopenharmony_ci shader is enabled, the corresponding current generic attribute value 1365bd8deadSopenharmony_ci is unaffected by the execution of DrawArraysOneInstance. 1375bd8deadSopenharmony_ci 1385bd8deadSopenharmony_ci Specifying <first> < 0 results in undefined behavior. Generating 1395bd8deadSopenharmony_ci the error INVALID_VALUE is recommended in this case. 1405bd8deadSopenharmony_ci 1415bd8deadSopenharmony_ci The command 1425bd8deadSopenharmony_ci 1435bd8deadSopenharmony_ci void DrawArrays( enum mode, int first, sizei count ); 1445bd8deadSopenharmony_ci 1455bd8deadSopenharmony_ci behaves identically to DrawArraysOneInstance with the instance 1465bd8deadSopenharmony_ci set to zero; the effect of calling 1475bd8deadSopenharmony_ci 1485bd8deadSopenharmony_ci DrawArrays(mode, first, count); 1495bd8deadSopenharmony_ci 1505bd8deadSopenharmony_ci is equivalent to the command sequence: 1515bd8deadSopenharmony_ci 1525bd8deadSopenharmony_ci if (mode or count is invalid ) 1535bd8deadSopenharmony_ci generate appropriate error 1545bd8deadSopenharmony_ci else 1555bd8deadSopenharmony_ci DrawArraysOneInstance(mode, first, count, 0); 1565bd8deadSopenharmony_ci 1575bd8deadSopenharmony_ci The command 1585bd8deadSopenharmony_ci 1595bd8deadSopenharmony_ci void DrawArraysInstancedNV(enum mode, int first, sizei count, 1605bd8deadSopenharmony_ci sizei primcount); 1615bd8deadSopenharmony_ci 1625bd8deadSopenharmony_ci behaves identically to DrawArrays except that <primcount> 1635bd8deadSopenharmony_ci instances of the range of elements are executed, the value of 1645bd8deadSopenharmony_ci <instanceID> advances for each iteration, and the instance advances 1655bd8deadSopenharmony_ci between each set. Instanced attributes that have <divisor> N, (where 1665bd8deadSopenharmony_ci N > 0, as specified by VertexAttribDivisorNV advance once every N 1675bd8deadSopenharmony_ci instances. 1685bd8deadSopenharmony_ci 1695bd8deadSopenharmony_ci It has the same effect as: 1705bd8deadSopenharmony_ci 1715bd8deadSopenharmony_ci if (mode, count, or primcount is invalid) 1725bd8deadSopenharmony_ci generate appropriate error 1735bd8deadSopenharmony_ci else { 1745bd8deadSopenharmony_ci for (i = 0; i < primcount; i++) { 1755bd8deadSopenharmony_ci instanceID = i; 1765bd8deadSopenharmony_ci DrawArraysOneInstance(mode, first, count, i); 1775bd8deadSopenharmony_ci } 1785bd8deadSopenharmony_ci instanceID = 0; 1795bd8deadSopenharmony_ci } 1805bd8deadSopenharmony_ci 1815bd8deadSopenharmony_ci The function 1825bd8deadSopenharmony_ci 1835bd8deadSopenharmony_ci void DrawElementsOneInstance( enum mode, sizei count, enum type, 1845bd8deadSopenharmony_ci void *indices, int instance ); 1855bd8deadSopenharmony_ci 1865bd8deadSopenharmony_ci does not exist in the GL, but is used to describe functionality in 1875bd8deadSopenharmony_ci the rest of this section. This function constructs a sequence of 1885bd8deadSopenharmony_ci geometric primitives by successively transferring the <count> 1895bd8deadSopenharmony_ci elements whose indices are stored in <indices>. <type> must be one 1905bd8deadSopenharmony_ci of UNSIGNED_BYTE, UNSIGNED_SHORT, or UNSIGNED_INT, indicating that 1915bd8deadSopenharmony_ci the values in <indices> are indices of GL type ubyte, ushort, or 1925bd8deadSopenharmony_ci uint respectively. <mode> specifies what kind of primitives are 1935bd8deadSopenharmony_ci constructed, as defined in section 2.6.1. 1945bd8deadSopenharmony_ci 1955bd8deadSopenharmony_ci If an enabled vertex attribute array is instanced (it has a non-zero 1965bd8deadSopenharmony_ci attribute <divisor> as specified by VertexAttribDivisorNV), the 1975bd8deadSopenharmony_ci element that is transferred to the GL is given by: 1985bd8deadSopenharmony_ci 1995bd8deadSopenharmony_ci floor( <instance> / <divisor> ); 2005bd8deadSopenharmony_ci 2015bd8deadSopenharmony_ci If an array corresponding to a generic attribute required by a 2025bd8deadSopenharmony_ci vertex shader is not enabled, then the corresponding element is 2035bd8deadSopenharmony_ci taken from the current generic attribute state (see section 2.7). 2045bd8deadSopenharmony_ci Otherwise, if an array is enabled, the corresponding current 2055bd8deadSopenharmony_ci generic attribute value is unaffected by the execution of 2065bd8deadSopenharmony_ci DrawElementsOneInstance. 2075bd8deadSopenharmony_ci 2085bd8deadSopenharmony_ci The command 2095bd8deadSopenharmony_ci 2105bd8deadSopenharmony_ci void DrawElements( enum mode, sizei count, enum type, 2115bd8deadSopenharmony_ci void *indices ); 2125bd8deadSopenharmony_ci 2135bd8deadSopenharmony_ci behaves identically to DrawElementsOneInstance with <instance> set 2145bd8deadSopenharmony_ci to zero; the effect of calling 2155bd8deadSopenharmony_ci 2165bd8deadSopenharmony_ci DrawElements(mode, count, type, indices); 2175bd8deadSopenharmony_ci 2185bd8deadSopenharmony_ci is equivalent to the command sequence: 2195bd8deadSopenharmony_ci 2205bd8deadSopenharmony_ci if (mode, count or type is invalid ) 2215bd8deadSopenharmony_ci generate appropriate error 2225bd8deadSopenharmony_ci else 2235bd8deadSopenharmony_ci DrawElementsOneInstance(mode, count, type, indices, 0); 2245bd8deadSopenharmony_ci 2255bd8deadSopenharmony_ci The command 2265bd8deadSopenharmony_ci 2275bd8deadSopenharmony_ci void DrawElementsInstancedNV(enum mode, sizei count, enum type, 2285bd8deadSopenharmony_ci const void *indices, sizei primcount); 2295bd8deadSopenharmony_ci 2305bd8deadSopenharmony_ci behaves identically to DrawElements except that <primcount> 2315bd8deadSopenharmony_ci instances of the set of elements are executed, the value of 2325bd8deadSopenharmony_ci <instanceID> advances for each iteration, and the instance 2335bd8deadSopenharmony_ci advances between each set. Instanced attributes are advanced as 2345bd8deadSopenharmony_ci they do during the execution of DrawArraysInstancedNV. It has the 2355bd8deadSopenharmony_ci same effect as: 2365bd8deadSopenharmony_ci 2375bd8deadSopenharmony_ci if (mode, count, primcount, or type is invalid ) 2385bd8deadSopenharmony_ci generate appropriate error 2395bd8deadSopenharmony_ci else { 2405bd8deadSopenharmony_ci for (int i = 0; i < primcount; i++) { 2415bd8deadSopenharmony_ci instanceID = i; 2425bd8deadSopenharmony_ci DrawElementsOneInstance(mode, count, type, indices, i); 2435bd8deadSopenharmony_ci } 2445bd8deadSopenharmony_ci instanceID = 0; 2455bd8deadSopenharmony_ci } 2465bd8deadSopenharmony_ci 2475bd8deadSopenharmony_ci If the number of supported generic vertex attributes (the value of 2485bd8deadSopenharmony_ci MAX_VERTEX_ATTRIBS) is <n>, then the client state required to 2495bd8deadSopenharmony_ci implement vertex arrays consists of <n> boolean values, <n> memory 2505bd8deadSopenharmony_ci pointers, <n> integer stride values, <n> symbolic constants 2515bd8deadSopenharmony_ci representing array types, <n> integers representing values per 2525bd8deadSopenharmony_ci element, <n> boolean values indicating normalization, and <n> 2535bd8deadSopenharmony_ci integers representing vertex attribute divisors. 2545bd8deadSopenharmony_ci 2555bd8deadSopenharmony_ci In the initial state, the boolean values are each false, the memory 2565bd8deadSopenharmony_ci pointers are each NULL, the strides are each zero, the array types 2575bd8deadSopenharmony_ci are each FLOAT, the integers representing values per element are 2585bd8deadSopenharmony_ci each four, and the divisors are each zero. 2595bd8deadSopenharmony_ci 2605bd8deadSopenharmony_ci Modify section 2.10, "Vertex Array Objects" (Added by OES_vertex_array_object) 2615bd8deadSopenharmony_ci 2625bd8deadSopenharmony_ci Add VERTEX_ATTRIB_ARRAY_DIVISOR_NV to the list of state included in 2635bd8deadSopenharmony_ci the vertex array object type vector. 2645bd8deadSopenharmony_ci 2655bd8deadSopenharmony_ciAdditions to Chapter 6 of the OpenGL ES 2.0.25 Specification (State and 2665bd8deadSopenharmony_ciState Requests) 2675bd8deadSopenharmony_ci 2685bd8deadSopenharmony_ci In section 6.1.8, add VERTEX_ATTRIB_ARRAY_DIVISOR_NV to the list of 2695bd8deadSopenharmony_ci pnames accepted by GetVertexAttribfv and GetVertexAttribiv: 2705bd8deadSopenharmony_ci 2715bd8deadSopenharmony_ciDependencies on OES_element_index_uint 2725bd8deadSopenharmony_ci 2735bd8deadSopenharmony_ci If OES_element_index_uint is not supported, removed all references 2745bd8deadSopenharmony_ci to UNSIGNED_INT indices and the associated GL data type uint in 2755bd8deadSopenharmony_ci the description of DrawElementsOneInstance. 2765bd8deadSopenharmony_ci 2775bd8deadSopenharmony_ciDependencies on NV_draw_instanced 2785bd8deadSopenharmony_ci 2795bd8deadSopenharmony_ci If NV_draw_instanced is not supported, all references to 2805bd8deadSopenharmony_ci instanceID should be removed from section 2.8. This extension 2815bd8deadSopenharmony_ci will introduce the following additional New Procedures and 2825bd8deadSopenharmony_ci Functions: 2835bd8deadSopenharmony_ci 2845bd8deadSopenharmony_ci void DrawArraysInstancedNV(enum mode, int first, sizei count, 2855bd8deadSopenharmony_ci sizei primcount); 2865bd8deadSopenharmony_ci void DrawElementsInstancedNV(enum mode, sizei count, enum type, 2875bd8deadSopenharmony_ci const void *indices, sizei primcount); 2885bd8deadSopenharmony_ci 2895bd8deadSopenharmony_ciDependencies on OES_vertex_array_object 2905bd8deadSopenharmony_ci 2915bd8deadSopenharmony_ci If OES_vertex_array_object is not supported, ignore all edits to 2925bd8deadSopenharmony_ci section 2.10, "Vertex Array Objects". 2935bd8deadSopenharmony_ci 2945bd8deadSopenharmony_ciErrors 2955bd8deadSopenharmony_ci 2965bd8deadSopenharmony_ci INVALID_VALUE is generated by VertexAttribDivisorNV if <index> 2975bd8deadSopenharmony_ci is greater than or equal to MAX_VERTEX_ATTRIBS. 2985bd8deadSopenharmony_ci 2995bd8deadSopenharmony_ci INVALID_ENUM is generated by DrawElementsInstancedNV if <type> is 3005bd8deadSopenharmony_ci not one of UNSIGNED_BYTE, UNSIGNED_SHORT or UNSIGNED_INT. 3015bd8deadSopenharmony_ci 3025bd8deadSopenharmony_ci INVALID_VALUE is generated by DrawArraysInstancedNV if <first>, 3035bd8deadSopenharmony_ci <count>, or <primcount> is less than zero. 3045bd8deadSopenharmony_ci 3055bd8deadSopenharmony_ci INVALID_ENUM is generated by DrawArraysInstancedNV or 3065bd8deadSopenharmony_ci DrawElementsInstancedNV if <mode> is not one of the modes described in 3075bd8deadSopenharmony_ci section 2.6.1. 3085bd8deadSopenharmony_ci 3095bd8deadSopenharmony_ci INVALID_VALUE is generated by DrawElementsInstancedNV if <count> or 3105bd8deadSopenharmony_ci <primcount> is less than zero. 3115bd8deadSopenharmony_ci 3125bd8deadSopenharmony_ciNew State 3135bd8deadSopenharmony_ci 3145bd8deadSopenharmony_ci Changes to table 6.2 (Vertex Array Data) 3155bd8deadSopenharmony_ci 3165bd8deadSopenharmony_ci Initial 3175bd8deadSopenharmony_ci Get Value Type Get Command Value Description Sec. Attribute 3185bd8deadSopenharmony_ci --------- ---- --------------- ------- ----------- ---- --------- 3195bd8deadSopenharmony_ci VERTEX_ATTRIB_ARRAY_DIVISOR_NV 8xZ+ GetVertexAttrib 0 Instance Divisor 2.8 vertex-array 3205bd8deadSopenharmony_ci 3215bd8deadSopenharmony_ciIssues 3225bd8deadSopenharmony_ci 3235bd8deadSopenharmony_ci 3245bd8deadSopenharmony_ci 1) Should generic attrib zero be instance-able? 3255bd8deadSopenharmony_ci 3265bd8deadSopenharmony_ci Resolved: Yes. Attribute zero does not necessarily contain 3275bd8deadSopenharmony_ci position information. 3285bd8deadSopenharmony_ci 3295bd8deadSopenharmony_ci 2) This extension must elaborate on the definition of functions 3305bd8deadSopenharmony_ci added by NV_draw_instanced. How do we do this in a manner such 3315bd8deadSopenharmony_ci that both extensions may coexist? 3325bd8deadSopenharmony_ci 3335bd8deadSopenharmony_ci Resolved: This extension is specified so that it applies on 3345bd8deadSopenharmony_ci top of NV_draw_instanced. As a result, some portions modified 3355bd8deadSopenharmony_ci by that extension are replaced in this extension. In the 3365bd8deadSopenharmony_ci event that NV_draw_instanced is not supported, this extension 3375bd8deadSopenharmony_ci reintroduces the draw calls from NV_draw_instanced. 3385bd8deadSopenharmony_ci 3395bd8deadSopenharmony_ci 3) Should current generic attributes be affected by the execution of 3405bd8deadSopenharmony_ci DrawArraysOneInstance? 3415bd8deadSopenharmony_ci 3425bd8deadSopenharmony_ci Resolved: No. ANGLE says no. ARB says maybe. Defined behavior is 3435bd8deadSopenharmony_ci always better. The wishy washy ARB language is likely to permit 3445bd8deadSopenharmony_ci a software implementation without excessive state resetting. This 3455bd8deadSopenharmony_ci Is not terribly useful if implemented in software. 3465bd8deadSopenharmony_ci 3475bd8deadSopenharmony_ci 3485bd8deadSopenharmony_ci 4) Can all vertex attributes be instanced simultaneously? 3495bd8deadSopenharmony_ci 3505bd8deadSopenharmony_ci Resolved: No. In rare cases it is possible for no attribute to 3515bd8deadSopenharmony_ci have a divisor of 0, meaning that all attributes are instanced 3525bd8deadSopenharmony_ci and none of them are regularly indexed. This in turn means each 3535bd8deadSopenharmony_ci instance can only have a single position element, and so it only 3545bd8deadSopenharmony_ci actually renders something when rendering point primitives. This 3555bd8deadSopenharmony_ci is not a very meaningful way of using instancing (which is likely 3565bd8deadSopenharmony_ci why D3D restricts stream 0 to be indexed regularly for position 3575bd8deadSopenharmony_ci data in the first place). 3585bd8deadSopenharmony_ci 3595bd8deadSopenharmony_ciRevision History 3605bd8deadSopenharmony_ci 3615bd8deadSopenharmony_ci Rev. Date Author Changes 3625bd8deadSopenharmony_ci ---- ------------- --------- ---------------------------------------- 3635bd8deadSopenharmony_ci 4 28 Aug 2012 groth Various spelling corrections and minor clarifications 3645bd8deadSopenharmony_ci 3 20 Aug 2012 groth Add interaction with VAOs 3655bd8deadSopenharmony_ci 2 19 Aug 2012 groth Correct section number 3665bd8deadSopenharmony_ci 1 12 Aug 2012 groth Initial GLES2 version from ARB_instanced_arrays 3675bd8deadSopenharmony_ci with inspiration from ANGLE_instanced_arrays 368