Name ARB_vertex_type_10f_11f_11f_rev Name Strings GL_ARB_vertex_type_10f_11f_11f_rev Contact Daniel Koch, NVIDIA Corporation (dkoch 'at' nvidia.com) Contributors Pat Brown, NVIDIA Jeff Bolz, NVIDIA Piers Daniel, NVIDIA Members of the ARB working group Notice Copyright (c) 2013 The Khronos Group Inc. Copyright terms at http://www.khronos.org/registry/speccopyright.html Specification Update Policy Khronos-approved extension specifications are updated in response to issues and bugs prioritized by the Khronos OpenGL Working Group. For extensions which have been promoted to a core Specification, fixes will first appear in the latest version of that core Specification, and will eventually be backported to the extension document. This policy is described in more detail at https://www.khronos.org/registry/OpenGL/docs/update_policy.php Status Complete. Approved by the ARB on June 3, 2013. Ratified by the Khronos Board of Promoters on July 19, 2013. Version Last Modified Date: May 2, 2013 Revision: 4 Number ARB Extension #151 Dependencies OpenGL 3.0 is required. This extension depends on ARB_vertex_attrib_binding. This extension requires ARB_vertex_type_2_10_10_10_rev. This extension is written against the OpenGL 4.3 (Core Profile) Specification (October 18, 2012). Overview This extension adds the following data format: A new vertex attribute data format: a packed 11.11.10 unsigned float vertex data format. This vertex data format can be used to describe a compressed 3 component stream of values that can be represented by 10- or 11-bit unsigned floating point values. The UNSIGNED_INT_10F_11F_11F_REV vertex attribute type is equivalent to the R11F_G11F_B10F texture internal format. IP Status No known IP claims. New Procedures and Functions None New Types None New Tokens Accepted by the parameter of VertexAttribP{123}ui, VertexAttribP{123}uiv, VertexAttribFormat and VertexAttribPointer: UNSIGNED_INT_10F_11F_11F_REV 0x8C3B // (reuse core enum) Additions to Chapter 10 of the OpenGL 4.3 (Core Profile) Specification (Vertex Specification and Drawing Commands) Modify the 6th paragraph of 10.2.1 (Current Generic Attributes) to read as follows: "The VertexAttribP* commands specify up to four attribute component values packed into a single natural type as described in section 10.3.7. must be INT_2_10_10_10_REV, UNSIGNED_INT_2_10_10_10_REV, or UNSIGNED_INT_10F_11F_11F_REV, specifying signed, unsigned, or unsigned floating-point data, respectively. The first one (x), two (x,y), three (x,y,z), or four (x,y,z,w) components of the packed data are consumed by VertexAttribP1ui, VertexAttribP2ui, VertexAttribP3ui, and VertexAttribP4ui, respectively. If is TRUE, signed or unsigned components are converted to floating-point by normalizing to [-1,1] or [0,1] respectively. If is FALSE, signed and unsigned components are directly cast to floating-point. For floating-point formats, is ignored. For VertexAttribP*uiv, contains the address of a single uint containing the packed attribute components. If is UNSIGNED_INT_10F_11F_11F_REV, calling VertexAttribP4ui and VertexAttribP4uiv results in an INVALID_ENUM error being generated because there are only 3 components present." Modify the 3rd paragraph of 10.3.1 (Specifying Arrays for Generic Vertex Attributes) to read as follows: "Table 10.2 indicates the allowable values for and . A of BYTE, UNSIGNED_BYTE, SHORT, UNSIGNED_SHORT, INT, UNSIGNED_INT, FLOAT, HALF_FLOAT, or DOUBLE indicates the corresponding GL data type shown in Table 8.2. A of FIXED indicates the data type "fixed". A of INT_2_10_10_10_REV and UNSIGNED_INT_2_10_10_10_REV indicate respectively, four signed or unsigned elements packed into a single "uint". A of UNSIGNED_INT_10F_11F_11F_REV indicates two unsigned 11-bit floating-point elements and one unsigned 10-bit floating-point elements packed into a single "uint". The encoding of the unsigned 10- and 11-bit floating point values is described in section 2.3.3 (Numerical Representation and Computation). The types INT_2_10_10_10_REV, UNSIGNED_INT_2_10_10_10_REV and UNSIGNED_INT_10F_11F_11F_REV all correspond to the term in Table 10.2). The components are packed as shown in Table 8.8 (UNSIGNED_INT formats). is not a GL type, but indicates commands accepting multiple components packed into a single uint." Add the following sentence to the end of the paragraph on "Integer Handling" following Table 10.2: "The flag is ignored for floating-point data types, including fixed, float, half, double, and any packed types that have floating point components." Insert another paragraph after Table 10.2: "If is UNSIGNED_INT_10F_11F_11F_REV, the vertex array values are never normalized, irrespective of the "normalize" table entry." Add to the errors section for the VertexAttrib*Format commands: "An INVALID_OPERATION error is generated if is UNSIGNED_INT_10F_11F_11F_REV and is not 3." Add the following to the end of section 10.3.7 (Packed Vertex Data Formats) "The UNSIGNED_INT_10F_11F_11F_REV vertex data format describes a packed, 3-component format that is stored in a single 32-bit word. The first (x), and second (y) components are represented as 11-bit unsigned floating-point values, and the third (z) component is represented as a 10-bit unsigned floating-point value. Table 10.x describes how these components are laid out in a 32-bit word. 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 ----------------------------------------------------------------------------------------------- | z | y | x | ----------------------------------------------------------------------------------------------- Table 10.x: Packed component layout for the UNSIGNED_INT_10F_11F_11F_REV format. Bit numbers are indicated for each component." [[Compatibility Profile-only]] Add the following to Section 10.3.2 (Specifying Arrays for Fixed-Function Attributes) to the end of the second paragraph: "The packed type UNSIGNED_INT_10F_11F_11F_REV is not permitted for any of the above commands. The INVALID_ENUM error is generated if a of UNSIGNED_INT_10F_11F_11F_REV is specified." Additions to the AGL/EGL/GLX/WGL Specifications None Dependencies on ARB_vertex_attrib_binding and Open GL 4.3 If ARB_vertex_attrib_binding or OpenGL 4.3 is not supported, then delete all references to VertexAttribFormat. Dependencies on ARB_vertex_type_2_10_10_10_rev ARB_vertex_type_2_10_10_10_rev is required to provide the infrastrucure for handling packed vertex attributes (such as the VertexAttribP* commands, etc). Dependencies on the compatibility profile If the compatibility profile is not supported, ignore any additions marked [[Compatibility Profile-only]]. Errors The error INVALID_OPERATION is generated by VertexAttribFormat, or VertexAttribPointer if is UNSIGNED_INT_10F_11F_11F_REV and is not 3. The error INVALID_ENUM is generated by VertexAttribIFormat, VertexAttribLFormat, VertexAttribIPointer, VertexAttribLPointer, VertexAttribP4ui, or VertexAttribP4uiv if is UNSIGNED_INT_10F_11F_11F_REV. [[Compatibility Profile-only]] The error INVALID_ENUM is generated by VertexPointer, NormalPointer, ColorPointer, SecondaryColorPointer, IndexPointer, EdgeFlagPointer, FogCoordPointer, or TexCoordPointer if is UNSIGNED_INT_10F_11F_11F_REV. New State None. New Implementation Dependent State None. Sample Code TBD Conformance Tests Needed. Issues 1. Should be supported, ignored, or an error? RESOLVED. The flag only takes effect when converting from integer to float formats and is ignored otherwise. Since the new type being accepted is a packed floating point format, the flag is ignored when specified with it. The current core specification is not entirely clear on this matter so we will add language to clarify this. 2. Should we accept this new type in the current generic attribute entry points? RESOLVED. Yes. It is sometimes convenient to be able to specify only a single value from a buffer via the VertexAttrib commands for debugging or manual instancing. This will be accepted by the VertexAttribP commands. 3. Should the new vertex type be supported by the immediate-mode entry points (such as Vertex{1234}f, TexCoordP*, NormalP3*, etc) in the compatibility profile? RESOLVED: No. There is no interest in extending the fixed-function pipeline to handle packed floating point vertex data. This is disallowed by the fact that we have not modified section 10.2.2 to accept the UNSIGNED_INT_10F_11F_11F_REV type in the packed entry points. 4. Should the new vertex type be supported by the legacy arrayed entry points for fixed-function (such as glVertexPointer, glNormalPointer, etc) in the compatibility profile? RESOLVED: No. There is no interest in extending the fixed-function pipeline to handle the packed floating point vertex data format. This is explicitly disallowed by the edits to 10.3.2. 5. Does the new vertex type work with a component size of BGRA? RESOLVED: No. It is specified to only work with a size of 3. Revision History Revision 4, 2013/05/02, dgkoch - finish errors and dependencies sections Revision 3, 2013/04/21, dgkoch - added issue 5. - misc formatting. Revision 2, 2013/03/21, dgkoch - Resolved Issue 1, 2, added 3, 4 and corresponding edits. - Added edits to 10.3.7, support for current generic vertex attribs Revision 1, 2013/01/24, dgkoch - Initial revision