Name

    APPLE_texture_packed_float

Name Strings

    GL_APPLE_texture_packed_float

Contributors

    Alexander Rogoyski, Apple Inc
    Serge Metral, Apple Inc

Contact

    Alexander Rogoyski, Apple Inc (rogoyski 'at' apple.com)

Status
    
    Complete

Version

    Last Modified Date: February 13, 2014
    Version:            1.0
    
Number
    
    OpenGL ES Extension #195

Dependencies

    Requires OpenGL ES 2.0.

    Written against the OpenGL ES 2.0.25 (Nov. 2010) Specification.

    OES_texture_half_float affects the definition of this specification.
    
    EXT_texture_storage affects the definition of this specification.

Overview

    This extension adds two new 3-component floating-point texture formats
    that fit within a single 32-bit word called R11F_G11F_B10F and RGB9_E5 
    
    The first RGB format, R11F_G11F_B10F, stores 5 bits of biased exponent 
    per component in the same manner as 16-bit floating-point formats, but 
    rather than 10 mantissa bits, the red, green, and blue components have 
    6, 6, and 5 bits respectively. Each mantissa is assumed to have an 
    implied leading one except in the denorm exponent case.  There is no 
    sign bit so only non-negative values can be represented.  Positive 
    infinity, positivedenorms, and positive NaN values are representable.  
    The value of the fourth component returned by a texture fetch is always
    1.0.

    The second RGB format, RGB9_E5, stores a single 5-bit exponent (biased 
    up by 15) and three 9-bit mantissas for each respective component.  
    There is no sign bit so all three components must be non-negative.  
    The fractional mantissas are stored without an implied 1 to the left 
    of the decimal point. Neither infinity nor not-a-number (NaN) are 
    representable in this shared exponent format.

New Procedures and Functions

    None
        
New Tokens

    Accepted by the <type> parameter of TexImage2D and TexSubImage2D:
    
        UNSIGNED_INT_10F_11F_11F_REV_APPLE           0x8C3B
        UNSIGNED_INT_5_9_9_9_REV_APPLE               0x8C3E


    Accepted by the <internalformat> parameter of TexStorage2DEXT:

        R11F_G11F_B10F_APPLE                         0x8C3A
        RGB9_E5_APPLE                                0x8C3D
        
Changes to Chapter 2 of the OpenGL ES 2.0.25 Specification
(OpenGL Operation)

    Add two new sections after Section "Floating-Point Computation":

        "Unsigned 11-Bit Floating-Point Numbers"

        An unsigned 11-bit floating-point number has no sign bit, a 5-bit
        exponent (E), and a 6-bit mantissa (M).  The value of an unsigned
        11-bit floating-point number (represented as an 11-bit unsigned
        integer N) is determined by the following: 

            0.0,                      if E == 0 and M == 0,
            2^-14 * (M / 64),         if E == 0 and M != 0,
            2^(E-15) * (1 + M/64),    if 0 < E < 31,
            INF,                      if E == 31 and M == 0, or
            NaN,                      if E == 31 and M != 0,

        where

            E = floor(N / 64), and
            M = N mod 64.

        Implementations are also allowed to use any of the following
        alternative encodings:

            0.0,                      if E == 0 and M != 0
            2^(E-15) * (1 + M/64)     if E == 31 and M == 0
            2^(E-15) * (1 + M/64)     if E == 31 and M != 0

        When a floating-point value is converted to an unsigned 11-bit
        floating-point representation, finite values are rounded to the 
        closest representable finite value.  While less accurate, 
        implementations are allowed to always round in the direction of 
        zero.  This means negative values are converted to zero.  
        Likewise, finite positive values greater than 65024 (the maximum 
        finite representable unsigned 11-bit floating-point value) are 
        converted to 65024.  Additionally: negative infinity is converted 
        to zero; positive infinity is converted to positive infinity; and 
        both positive and negative NaN are converted to positive NaN.

        Any representable unsigned 11-bit floating-point value is legal
        as input to a GL command that accepts 11-bit floating-point data.
        The result of providing a value that is not a floating-point 
        number (such as infinity or NaN) to such a command is unspecified,
        but must not lead to GL interruption or termination.  Providing a
        denormalized number or negative zero to GL must yield predictable 
        results.

        "Unsigned 10-Bit Floating-Point Numbers"

        An unsigned 10-bit floating-point number has no sign bit, a 5-bit
        exponent (E), and a 5-bit mantissa (M).  The value of an unsigned
        10-bit floating-point number (represented as an 10-bit unsigned
        integer N) is determined by the following: 

            0.0,                      if E == 0 and M == 0,
            2^-14 * (M / 32),         if E == 0 and M != 0,
            2^(E-15) * (1 + M/32),    if 0 < E < 31,
            INF,                      if E == 31 and M == 0, or
            NaN,                      if E == 31 and M != 0,

        where

            E = floor(N / 32), and
            M = N mod 32.

        When a floating-point value is converted to an unsigned 10-bit
        floating-point representation, finite values are rounded to the 
        closet representable finite value.  While less accurate, 
        implementations are allowed to always round in the direction of 
        zero.  This means negative values are converted to zero.  
        Likewise, finite positive values greater than 64512 (the maximum 
        finite representable unsigned 10-bit floating-point value) are 
        converted to 64512.  Additionally: negative infinity is converted 
        to zero; positive infinity is converted to positive infinity; and 
        both positive and negative NaN are converted to positive NaN.

        Any representable unsigned 10-bit floating-point value is legal
        as input to a GL command that accepts 10-bit floating-point data.
        The result of providing a value that is not a floating-point 
        number (such as infinity or NaN) to such a command is 
        unspecified, but must not lead to GL interruption or termination.
        Providing a denormalized number or negative zero to GL must yield 
        predictable results.
        
Changes to Chapter 3 of the OpenGL ES 2.0.25 Specification (Rasterization)

    Add to Table 3.2, p. 62:

        type Parameter                            Corresponding  Special
        Token Name                                GL Data Type   Interpretation
        ----------------------------------------  -------------  --------------
        UNSIGNED_INT_10F_11F_11F_REV_APPLE        uint           Yes
        UNSIGNED_INT_5_9_9_9_REV_APPLE            uint           Yes

    Add to Table 3.4, p. 63:

        Format            Type                                  Bytes per Pixel
        ----------------  ------------------------------------  ---------------
        RGB               UNSIGNED_INT_10F_11F_11F_REV_APPLE    4
        RGB               UNSIGNED_INT_5_9_9_9_REV_APPLE        4

  Add to Table 3.5, p. 64:

        type Parameter                       GL Data  Number of   Matching  
        Token Name                           Type     Components  Pixel Formats
        ----------------------------------   -------  ----------  -------------
        UNSIGNED_INT_10F_11F_11F_REV_APPLE   uint     3           RGB
        UNSIGNED_INT_5_9_9_9_REV_APPLE       uint     3           RGB

  Add the following to section 3.6.2 Transfer of Pixel Rectangles,
  subsection Unpacking
    

        UNSIGNED_INT_10F_11F_11F_REV_APPLE:

         31 30 ... 23 22 21 20 ... 12 11 10  9 ...  1  0
        +---------------+---------------+---------------+
        |      3rd      |      2nd      |      1st      |
        +---------------+---------------+---------------+


        UNSIGNED_INT_5_9_9_9_REV_APPLE:

         31 30 ... 27 26 25 24 ... 18 17 16 15 ...  9 8 7 6 5 4 ... 0
        +------------+---------------+---------------+---------------+
        |     4th    |      3rd      |      2nd      |      1st      |
        +------------+---------------+---------------+---------------+

  Add Section 3.7.14, Shared Exponent Texture Color Conversion
  
        If the currently bound texture's <format> is RGB and <type> is
        UNSIGNED_INT_5_9_9_9_REV_APPLE, the red, green, blue, and shared 
        bits are converted to color components (prior to filtering) using 
        shared exponent decoding.  The 1st, 2nd, 3rd, and 4th components 
        are called p_red, p_green, p_blue, and p_exp respectively and are 
        treated as unsigned integers. They are converted to floating-point
        red, green, and blue as follows:
        
            red   = p_red   * 2^(p_exp - B - N)
            green = p_green * 2^(p_exp - B - N)
            blue  = p_blue  * 2^(p_exp - B - N)

        where B is 15 (the exponent bias) and N is 9 (the number of mantissa
        bits)."

Errors

    Relaxation of INVALID_ENUM errors
    ---------------------------------

    TexImage2D, and TexSubImage2D accept  the new 
    UNSIGNED_INT_10F_11F_11F_REV_APPLE and 
    UNSIGNED_INT_5_9_9_9_REV_APPLE token for <type>.

    TexStorage2DEXT accepts the new R11F_G11F_B10F_APPLE and 
    RGB9_E5_APPLE token for <internalformat>.


    New errors
    ----------

    INVALID_OPERATION is generated by TexImage2D and TexSubImage2D
    if <type> is UNSIGNED_INT_10F_11F_11F_REV_APPLE or 
    UNSIGNED_INT_5_9_9_9_REV_APPLE and <format> is not RGB.

    UNSIGNED_INT_10F_11F_11F_REV_APPLE is implied as the <type> when 
    TexStorage2DEXT is called with <internalformat> 
    R11F_G11F_B10F_APPLE. Thus, INVALID_OPERATION is generated by TexSubImage2D
    if <type> is not UNSIGNED_INT_10F_11F_11F_REV_APPLE.

    UNSIGNED_INT_5_9_9_9_REV_APPLE is implied as the <type> when 
    TexStorage2DEXT is called with <internalformat> 
    RGB9_E5_APPLE. Thus, INVALID_OPERATION is generated by TexSubImage2D
    if <type> is not UNSIGNED_INT_5_9_9_9_REV_APPLE.
    
Dependencies on OES_texture_half_float

    If OES_texture_half_float is not supported, modify fifth paragraph
    of 3.7.1 Texture Image Specification, p. 67:

    "The selected groups are processed as described in section 3.6.2, stopping
    after final expansion to RGBA. If the internal format of the texture is
    fixed-point, components are clamped to [0,1]. Otherwise, values are not
    modified."

    Modify first sentence of "Unpacking", p. 62:

    "Data are taken from client memory as a sequence of one of the GL data
    types listed in Table 3.2. These elements are..."

    Additionally, ignore all references to RGBA16F_EXT, RGB16F_EXT,
    RG16F_EXT, R16F_EXT, HALF_FLOAT_OES and half.

Dependencies on EXT_texture_storage

    If EXT_texture_storage is not supported, remove all references to
    TexStorage2DEXT.     

New Implementation Dependent State

    None

Revision History

    1.0  2014/02/13  rogoyski    Initial version
        
