15bd8deadSopenharmony_ciName 25bd8deadSopenharmony_ci 35bd8deadSopenharmony_ci AMD_interleaved_elements 45bd8deadSopenharmony_ci 55bd8deadSopenharmony_ciName Strings 65bd8deadSopenharmony_ci 75bd8deadSopenharmony_ci GL_AMD_interleaved_elements 85bd8deadSopenharmony_ci 95bd8deadSopenharmony_ciContact 105bd8deadSopenharmony_ci 115bd8deadSopenharmony_ci Graham Sellers (graham.sellers 'at' amd.com) 125bd8deadSopenharmony_ci 135bd8deadSopenharmony_ciContributors 145bd8deadSopenharmony_ci 155bd8deadSopenharmony_ci Sergey Leontyev, AMD 165bd8deadSopenharmony_ci 175bd8deadSopenharmony_ciStatus 185bd8deadSopenharmony_ci 195bd8deadSopenharmony_ci Shipping 205bd8deadSopenharmony_ci 215bd8deadSopenharmony_ciVersion 225bd8deadSopenharmony_ci 235bd8deadSopenharmony_ci Last Modified Date: 2 May 2013 245bd8deadSopenharmony_ci Revision: 3 255bd8deadSopenharmony_ci 265bd8deadSopenharmony_ciNumber 275bd8deadSopenharmony_ci 285bd8deadSopenharmony_ci 431 295bd8deadSopenharmony_ci 305bd8deadSopenharmony_ciDependencies 315bd8deadSopenharmony_ci 325bd8deadSopenharmony_ci This extension is written against version 4.3 of the Core Profile OpenGL 335bd8deadSopenharmony_ci Specification, dated August 6, 2012. 345bd8deadSopenharmony_ci 355bd8deadSopenharmony_ciOverview 365bd8deadSopenharmony_ci 375bd8deadSopenharmony_ci The glDrawElements function and its variants (instanced and indirect, 385bd8deadSopenharmony_ci for example) allow OpenGL to draw indexed arrays of vertices. Since its 395bd8deadSopenharmony_ci inception, OpenGL has supported unsigned bytes, unsigned shorts and 405bd8deadSopenharmony_ci unsigned integers as index types. However, all enabled vertex arrays may 415bd8deadSopenharmony_ci be represented by at most one shared index. 425bd8deadSopenharmony_ci 435bd8deadSopenharmony_ci A common scenario in graphics rendering is that several faces share 445bd8deadSopenharmony_ci a vertex where, for each face some properties of a vertex (position and 455bd8deadSopenharmony_ci texture coordinates, for example) should be common but others must be 465bd8deadSopenharmony_ci unique (colors, normals, and so on). Consider a mesh of a cube with 475bd8deadSopenharmony_ci per-face normals, for example. There are 8 vertices and 6 normals, and 12 485bd8deadSopenharmony_ci triangles (where each face of the cube is represented as two triangles). 495bd8deadSopenharmony_ci To render this cube, we must compute the 24 unique permutations of 505bd8deadSopenharmony_ci position and normal and build a new element list to index into it. In 515bd8deadSopenharmony_ci fact, any advantage of indexed draw is lost here as the number of required 525bd8deadSopenharmony_ci permutations is equal to the final vertex count required to draw the 535bd8deadSopenharmony_ci object. 545bd8deadSopenharmony_ci 555bd8deadSopenharmony_ci This extension allows OpenGL to process multi-component packed element 565bd8deadSopenharmony_ci data. The maximum size of a vertex's index data is not increased, but the 575bd8deadSopenharmony_ci facility to store 2 16-bit or 2 or 4 8-bit indices per vertex is introduced. 585bd8deadSopenharmony_ci Each vertex attribute is given a swizzle property to allow its index to 595bd8deadSopenharmony_ci be sourced from one of up to 4 channels of index data. This effectively 605bd8deadSopenharmony_ci allows an application to supply multiple interleaved streams of index data 615bd8deadSopenharmony_ci to OpenGL. Each vertex attribute is given a 'channel selector' to select 625bd8deadSopenharmony_ci one of the up to 4 channels of vertex index information presented to 635bd8deadSopenharmony_ci OpenGL. This enables the use-case described above and many more. 645bd8deadSopenharmony_ci The swizzle parameter is also applied to vertex indices passed to shaders, 655bd8deadSopenharmony_ci and updates to the definition of base vertex parameters and primitive 665bd8deadSopenharmony_ci restart are applied. 675bd8deadSopenharmony_ci 685bd8deadSopenharmony_ciNew Procedures and Functions 695bd8deadSopenharmony_ci 705bd8deadSopenharmony_ci void VertexAttribParameteriAMD(uint index, enum pname, int param); 715bd8deadSopenharmony_ci 725bd8deadSopenharmony_ciNew Tokens 735bd8deadSopenharmony_ci 745bd8deadSopenharmony_ci Accepted by the <pname> parameter of VertexAttribParameteriAMD and 755bd8deadSopenharmony_ci GetVertexAttrib{iv|dv|fv|Iiv|Iuiv|Ldv}: 765bd8deadSopenharmony_ci 775bd8deadSopenharmony_ci VERTEX_ELEMENT_SWIZZLE_AMD 0x91A4 785bd8deadSopenharmony_ci 795bd8deadSopenharmony_ci Selected by the <pname> parameter of ProgramParameteri and GetProgramiv: 805bd8deadSopenharmony_ci 815bd8deadSopenharmony_ci VERTEX_ID_SWIZZLE_AMD 0x91A5 825bd8deadSopenharmony_ci 835bd8deadSopenharmony_ci Accepted by the <param> parameter of VertexAttribParameteriAMD: 845bd8deadSopenharmony_ci 855bd8deadSopenharmony_ci RED 0x1903 865bd8deadSopenharmony_ci GREEN 0x1904 875bd8deadSopenharmony_ci BLUE 0x1905 885bd8deadSopenharmony_ci ALPHA 0x1906 895bd8deadSopenharmony_ci 905bd8deadSopenharmony_ci Accepted by the <type> parameter of DrawElements, DrawElementsInstanced, 915bd8deadSopenharmony_ci DrawElementsInstancedBaseInstance and DrawElementsIndirect: 925bd8deadSopenharmony_ci 935bd8deadSopenharmony_ci RG8UI 0x8238 945bd8deadSopenharmony_ci RG16UI 0x823A 955bd8deadSopenharmony_ci RGBA8UI 0x8D7C 965bd8deadSopenharmony_ci 975bd8deadSopenharmony_ciIP Status 985bd8deadSopenharmony_ci 995bd8deadSopenharmony_ci None. 1005bd8deadSopenharmony_ci 1015bd8deadSopenharmony_ciAdditions to Chapter 7 of the OpenGL Core Profile Specification, Version 4.3, 1025bd8deadSopenharmony_ci"Programs and Shaders" 1035bd8deadSopenharmony_ci 1045bd8deadSopenharmony_ci Add to the parameters accepted by ProgramParameteri, p.82: 1055bd8deadSopenharmony_ci 1065bd8deadSopenharmony_ci If <pname> is VERTEX_ID_SWIZZLE_AMD, <value> should be set to 1075bd8deadSopenharmony_ci RED, GREEN, BLUE or ALPHA to indicate that the first, second, third 1085bd8deadSopenharmony_ci or fourth component of the vertex element vector be propagated to the 1095bd8deadSopenharmony_ci gl_VertexID vertex shader input as described in subsection 11.1.3.9. 1105bd8deadSopenharmony_ci The initial value of VERTEX_ID_SWIZZLE_AMD is RED. 1115bd8deadSopenharmony_ci 1125bd8deadSopenharmony_ciAdditions to Chapter 10 of the OpenGL Core Profile Specification, Version 4.3, 1135bd8deadSopenharmony_ci"Vertex Specification and Drawing Commands" 1145bd8deadSopenharmony_ci 1155bd8deadSopenharmony_ci Insert Subsection 10.3.2, "Vertex Attribute Parameters", renumber 1165bd8deadSopenharmony_ci subsequent sections: 1175bd8deadSopenharmony_ci 1185bd8deadSopenharmony_ci Each vertex attribute possesses a set of parameters that control 1195bd8deadSopenharmony_ci its behavior. Parameters for a vertex attribute may be set by calling: 1205bd8deadSopenharmony_ci 1215bd8deadSopenharmony_ci void VertexAttribParameteriAMD(uint index, 1225bd8deadSopenharmony_ci enum pname, 1235bd8deadSopenharmony_ci int param); 1245bd8deadSopenharmony_ci 1255bd8deadSopenharmony_ci where <index> identifies the generic vertex attribute array whose parameter 1265bd8deadSopenharmony_ci to modify. If <pname> is VERTEX_ELEMENT_SWIZZLE_AMD, then <param> 1275bd8deadSopenharmony_ci specifies the component of the vertex element that is to be used to 1285bd8deadSopenharmony_ci source the vertex indices for the selected vertex attribute. Its value 1295bd8deadSopenharmony_ci may be RED, GREEN, BLUE or ALPHA to select the first, second, third or 1305bd8deadSopenharmony_ci fourth component of the vertex element. 1315bd8deadSopenharmony_ci 1325bd8deadSopenharmony_ci In section 10.3.2, "Primitive Restart", modify the language describing 1335bd8deadSopenharmony_ci how the restart index is compared to the vertex element index, p.302 1345bd8deadSopenharmony_ci as follows: 1355bd8deadSopenharmony_ci 1365bd8deadSopenharmony_ci When one of the Draw* commands transfers a set of generic attribute 1375bd8deadSopenharmony_ci array elements to the GL, if all present index channels in the passed 1385bd8deadSopenharmony_ci element index are equal to the primitive restart index, then the GL 1395bd8deadSopenharmony_ci does not process those elements as a vertex. Instead ... *include 1405bd8deadSopenharmony_ci remainder of section verbatim.* 1415bd8deadSopenharmony_ci 1425bd8deadSopenharmony_ci In the description of DrawElementsOneInstance (p. 311), replace the 1435bd8deadSopenharmony_ci sentence beginning "The ith element transferred by..." with: 1445bd8deadSopenharmony_ci 1455bd8deadSopenharmony_ci For each enabled vertex attribute, the ith element transferred by 1465bd8deadSopenharmony_ci DrawElementsOneInstance will be taken from that attribute's selected 1475bd8deadSopenharmony_ci channel of the element whose values are stored currently bound element 1485bd8deadSopenharmony_ci array buffer at offset indices + i. 1495bd8deadSopenharmony_ci 1505bd8deadSopenharmony_ci Replace the paragraph explaining the <type> parameter to 1515bd8deadSopenharmony_ci DrawElementsOneIntance (p. 311): 1525bd8deadSopenharmony_ci 1535bd8deadSopenharmony_ci <type> may be UNSIGNED_BYTE, UNSIGNED_SHORT or UNSIGNED_INT, 1545bd8deadSopenharmony_ci indicating that the index values are of GL type ubyte, ushort or uint, 1555bd8deadSopenharmony_ci respectively, RG8UI or RG16UI, indicating that the index values are pairs 1565bd8deadSopenharmony_ci of GL type ubyte or ushort, respectively, or RGBA8UI, indicating that 1575bd8deadSopenharmony_ci index values are quadruplets of GL type ubyte. ... 1585bd8deadSopenharmony_ci 1595bd8deadSopenharmony_ci Modify the language describing the DrawElements*BaseVertex* functions 1605bd8deadSopenharmony_ci on p.314 as follows: 1615bd8deadSopenharmony_ci 1625bd8deadSopenharmony_ci ... are equivalent to the commands with the same base name (without 1635bd8deadSopenharmony_ci the BaseVertex suffix), except that the ith element transferred by 1645bd8deadSopenharmony_ci the corresponding draw call will be taken from the selected channel 1655bd8deadSopenharmony_ci of the element vector indices[i] + <basevertex>. That is, the value of 1665bd8deadSopenharmony_ci <basevertex> is added to the vertex index after channel selection. 1675bd8deadSopenharmony_ci ... *include remainder of description verbatim.* 1685bd8deadSopenharmony_ci 1695bd8deadSopenharmony_ci Add to the list of accepted values for the <pname> parameter to 1705bd8deadSopenharmony_ci GetVertexAttrib* in Section 10.6, "Vertex Array and Vertex Array Object 1715bd8deadSopenharmony_ci Queries", p. 317: 1725bd8deadSopenharmony_ci 1735bd8deadSopenharmony_ci ... VERTEX_ELEMENT_SWIZZLE_AMD. 1745bd8deadSopenharmony_ci 1755bd8deadSopenharmony_ciAdditions to Chapter 11 of the OpenGL Core Profile Specification, Version 4.3, 1765bd8deadSopenharmony_ci"Programmable Vertex Processing" 1775bd8deadSopenharmony_ci 1785bd8deadSopenharmony_ci In Subsection 11.1.3.9, "Shader Inputs", p.338, modify the description 1795bd8deadSopenharmony_ci of gl_VertexID as follows: 1805bd8deadSopenharmony_ci 1815bd8deadSopenharmony_ci gl_VertexID holds the integer index i stored in the selected component 1825bd8deadSopenharmony_ci of the element implicitly passed by DrawArrays or one of the other drawing 1835bd8deadSopenharmony_ci commands defined in section 10.5. The component of the element data 1845bd8deadSopenharmony_ci stored in gl_VertexID may be specified by calling ProgramParameteri with 1855bd8deadSopenharmony_ci <pname> set to VERTEX_ID_SWIZZLE_AMD as specified in section 7.3. 1865bd8deadSopenharmony_ci 1875bd8deadSopenharmony_ciNew State 1885bd8deadSopenharmony_ci 1895bd8deadSopenharmony_ci Append to Table 23.4, "Vertex Array Object State (cont.)": 1905bd8deadSopenharmony_ci 1915bd8deadSopenharmony_ci +------------------------------+----------+---------------------+----------------+---------------------------------------------+----------+ 1925bd8deadSopenharmony_ci | Get Value | Type | Get Command | Initial Value | Description | Sec | 1935bd8deadSopenharmony_ci +------------------------------+----------+---------------------+----------------+---------------------------------------------+----------+ 1945bd8deadSopenharmony_ci | VERTEX_ELEMENT_SWIZZLE_AMD | 16 * x E | GetVertexAttribiv | RED | Channel selector for vertex attribute index | 10.3.2 | 1955bd8deadSopenharmony_ci +------------------------------+----------+---------------------+----------------+---------------------------------------------+----------+ 1965bd8deadSopenharmony_ci 1975bd8deadSopenharmony_ci Append to Table 23.39, "Program Object State (cont.)": 1985bd8deadSopenharmony_ci 1995bd8deadSopenharmony_ci +------------------------+-------+---------------+----------------+------------------------------------+----------+ 2005bd8deadSopenharmony_ci | Get Value | Type | Get Command | Initial Value | Description | Sec | 2015bd8deadSopenharmony_ci +------------------------+-------+---------------+----------------+------------------------------------+----------+ 2025bd8deadSopenharmony_ci | VERTEX_ID_SWIZZLE_AMD | E | GetProgramiv | RED | Channel selector for gl_VertexID | 11.1.3.9 | 2035bd8deadSopenharmony_ci +------------------------+-------+---------------+----------------+------------------------------------+----------+ 2045bd8deadSopenharmony_ci 2055bd8deadSopenharmony_ciNew Implementation Dependent State 2065bd8deadSopenharmony_ci 2075bd8deadSopenharmony_ci None. 2085bd8deadSopenharmony_ci 2095bd8deadSopenharmony_ciErrors 2105bd8deadSopenharmony_ci 2115bd8deadSopenharmony_ci INVALID_ENUM is generated by VertexAttribParameteri if <pname> is not an 2125bd8deadSopenharmony_ci accepted token. 2135bd8deadSopenharmony_ci 2145bd8deadSopenharmony_ci INVALID_VALUE is generated by VertexAttribParameteri if <value> is not an 2155bd8deadSopenharmony_ci acceptable value for the specified value of <pname>. 2165bd8deadSopenharmony_ci 2175bd8deadSopenharmony_ciExamples 2185bd8deadSopenharmony_ci 2195bd8deadSopenharmony_ci // Basic per-face normals 2205bd8deadSopenharmony_ci 2215bd8deadSopenharmony_ci // Normal data 2225bd8deadSopenharmony_ci static const float normals[] = 2235bd8deadSopenharmony_ci { 2245bd8deadSopenharmony_ci 0.0f, 0.0f, 1.0f, // Positive Z 2255bd8deadSopenharmony_ci 0.0f, 0.0f, -1.0f, // Negative Z 2265bd8deadSopenharmony_ci 0.0f, 1.0f, 0.0f, // Positive Y 2275bd8deadSopenharmony_ci 0.0f, -1.0f, 0.0f, // Negative Y 2285bd8deadSopenharmony_ci 1.0f, 0.0f, 0.0f, // Positive X 2295bd8deadSopenharmony_ci -1.0f, 0.0f, 0.0f, // Negative X 2305bd8deadSopenharmony_ci }; 2315bd8deadSopenharmony_ci 2325bd8deadSopenharmony_ci // Position data 2335bd8deadSopenharmony_ci static const float positions[] = 2345bd8deadSopenharmony_ci { 2355bd8deadSopenharmony_ci -1.0f, -1.0f, -1.0f, 2365bd8deadSopenharmony_ci // <More data here> 2375bd8deadSopenharmony_ci 1.0f, 1.0f, 1.0f 2385bd8deadSopenharmony_ci }; 2395bd8deadSopenharmony_ci 2405bd8deadSopenharmony_ci // Put the above data into a buffer and bind them as separate vertex 2415bd8deadSopenharmony_ci // attributes. 2425bd8deadSopenharmony_ci GLuint vertex_buffer; 2435bd8deadSopenharmony_ci glGenBuffers(1, &vertex_buffer); 2445bd8deadSopenharmony_ci glBindBuffer(GL_ARRAY_BUFFER, sizeof(positions) + sizeof(normals), 2455bd8deadSopenharmony_ci NULL, GL_STATIC_DRAW); 2465bd8deadSopenharmony_ci glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(positions), positions); 2475bd8deadSopenharmony_ci glBufferSubData(GL_ARRAY_BUFFER, sizeof(positions), 2485bd8deadSopenharmony_ci sizeof(normals), normals); 2495bd8deadSopenharmony_ci // ... etc. Set up vertex attributes. 2505bd8deadSopenharmony_ci 2515bd8deadSopenharmony_ci // Index data 2525bd8deadSopenharmony_ci static const unsigned short indices[] = 2535bd8deadSopenharmony_ci { 2545bd8deadSopenharmony_ci 0, 0, // vertex 0: position index, normal index 2555bd8deadSopenharmony_ci 1, 0, // vertex 1: position index, normal index 2565bd8deadSopenharmony_ci 2, 0, // vertex 2: position index, normal index 2575bd8deadSopenharmony_ci 1, 0, // vertex 3: position index, normal index 2585bd8deadSopenharmony_ci 2, 0, // ... six vertices, forming 2595bd8deadSopenharmony_ci 3, 0, // ... two complete triangles, all using normals[0] 2605bd8deadSopenharmony_ci 0, 1, 2615bd8deadSopenharmony_ci 2, 1, 2625bd8deadSopenharmony_ci 3, 1, 2635bd8deadSopenharmony_ci 3, 1, 2645bd8deadSopenharmony_ci 4, 1, // ... six more vertices, forming 2655bd8deadSopenharmony_ci 2, 1, // ... two more triangles, all using normals[1] 2665bd8deadSopenharmony_ci // etc... 2675bd8deadSopenharmony_ci }; 2685bd8deadSopenharmony_ci 2695bd8deadSopenharmony_ci GLuint index_buffer; 2705bd8deadSopenharmony_ci glGenBuffers(1, &index_buffer); 2715bd8deadSopenharmony_ci glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_buffer); 2725bd8deadSopenharmony_ci glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), 2735bd8deadSopenharmony_ci indices, GL_STATIC_DRAW); 2745bd8deadSopenharmony_ci 2755bd8deadSopenharmony_ci // Okay... here's the new code. Set up vertex attribute 0 (position) to 2765bd8deadSopenharmony_ci // consume the RED channel of the vertex index and attribute 1 (normal) 2775bd8deadSopenharmony_ci // to consume the GREEN (second) channel of the vertex index. Then 2785bd8deadSopenharmony_ci // draw with GL_RG16UI (two channel, 16-bit unsigned int) as the index 2795bd8deadSopenharmony_ci // type. 2805bd8deadSopenharmony_ci glVertexAttribParameteriAMD(0, GL_VERTEX_ELEMENT_SWIZZLE_AMD, GL_RED); 2815bd8deadSopenharmony_ci glVertexAttribParameteriAMD(1, GL_VERTEX_ELEMENT_SWIZZLE_AMD, GL_GREEN); 2825bd8deadSopenharmony_ci 2835bd8deadSopenharmony_ci glDrawElements(GL_TRIANGLES, 2845bd8deadSopenharmony_ci sizeof(indices) / (2 * sizeof(unsigned short)), 2855bd8deadSopenharmony_ci GL_RG16UI, 2865bd8deadSopenharmony_ci NULL); 2875bd8deadSopenharmony_ci 2885bd8deadSopenharmony_ciIssues 2895bd8deadSopenharmony_ci 2905bd8deadSopenharmony_ci 1) What is the effect of multi-channel vertex indices on gl_VertexID? 2915bd8deadSopenharmony_ci 2925bd8deadSopenharmony_ci RESOLVED: The VERTEX_ID_SWIZZLE_AMD program parameter selects the 2935bd8deadSopenharmony_ci channel of vector element types to be passed to gl_VertexID. By 2945bd8deadSopenharmony_ci default, this is RED, which is backwards compatible with single-channel 2955bd8deadSopenharmony_ci types. 2965bd8deadSopenharmony_ci 2975bd8deadSopenharmony_ci 2) How does this interact with primitive-restart indices? 2985bd8deadSopenharmony_ci 2995bd8deadSopenharmony_ci RESOLVED: If all present channels of the vertex index vector match the 3005bd8deadSopenharmony_ci restart index, then the element index is considered to match. 3015bd8deadSopenharmony_ci 3025bd8deadSopenharmony_ci 3) How does baseVertex affect this? 3035bd8deadSopenharmony_ci 3045bd8deadSopenharmony_ci RESOLVED: The same base vertex value is added to each each vertex 3055bd8deadSopenharmony_ci element component after channel selection for each of the enabled 3065bd8deadSopenharmony_ci vertex attributes. This choice is primarily motivated by the behavior 3075bd8deadSopenharmony_ci of base vertex elements encoded in indirect draw commands. 3085bd8deadSopenharmony_ci 3095bd8deadSopenharmony_ci 4) Does this feature disable potential optimizations such as vertex 3105bd8deadSopenharmony_ci reuse? 3115bd8deadSopenharmony_ci 3125bd8deadSopenharmony_ci RESOVLED: No, vertex reuse should continue to function correctly. 3135bd8deadSopenharmony_ci Each unique vector of indices should produce a unique set of vertex 3145bd8deadSopenharmony_ci shader outputs (modulo side effects) and will hit a naive vertex 3155bd8deadSopenharmony_ci reuse cache. Nothing precludes more advanced optimization strategies 3165bd8deadSopenharmony_ci from being implemented, however. 3175bd8deadSopenharmony_ci 3185bd8deadSopenharmony_ci 5) Is it possible to get at all two or four channels of the vertex index 3195bd8deadSopenharmony_ci using a built-in input to the vertex shader? 3205bd8deadSopenharmony_ci 3215bd8deadSopenharmony_ci RESOLVED: No. A single channel selection is provided. Providing more 3225bd8deadSopenharmony_ci data could be implemented by introducing a new built-in integer vector 3235bd8deadSopenharmony_ci input to the shader, but we have chosen not to do at this time. 3245bd8deadSopenharmony_ci 3255bd8deadSopenharmony_ci 6) What is the value of missing channels? For example, if we render with 3265bd8deadSopenharmony_ci GL_RG16UI indices but set certain attributes to GL_BLUE or GL_ALPHA 3275bd8deadSopenharmony_ci swizzle, what index value is used for those channels? 3285bd8deadSopenharmony_ci 3295bd8deadSopenharmony_ci RESOLVED: Zero. 3305bd8deadSopenharmony_ci 3315bd8deadSopenharmony_ci 7) Are the traditional GL_RED, GL_GREEN, GL_BLUE, and GL_ALPHA terms 3325bd8deadSopenharmony_ci appropriate for this use? 3335bd8deadSopenharmony_ci 3345bd8deadSopenharmony_ci RESOLVED: Not really, but are they appropriate for normals? g-buffers? 3355bd8deadSopenharmony_ci Any other arbitrary data that might be in a buffer or texture? 3365bd8deadSopenharmony_ci It's not worth introducing new enumerants just for this - we'll use 3375bd8deadSopenharmony_ci R, G, B, A. 3385bd8deadSopenharmony_ci 3395bd8deadSopenharmony_ciRevision History 3405bd8deadSopenharmony_ci 3415bd8deadSopenharmony_ci Rev. Date Author Changes 3425bd8deadSopenharmony_ci ---- -------- -------- ----------------------------------------- 3435bd8deadSopenharmony_ci 3445bd8deadSopenharmony_ci 3 05/02/2013 gsellers Shipping. Finalize spec ready for posting. 3455bd8deadSopenharmony_ci 2 01/25/2013 gsellers Resolve issues 1, 2, 3. Polish spec. 3465bd8deadSopenharmony_ci 1 01/17/2013 gsellers Initial draft 3475bd8deadSopenharmony_ci 348