Name

    APPLE_color_buffer_packed_float

Name Strings

    GL_APPLE_color_buffer_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 #194

Dependencies

    Requires EXT_color_buffer_half_float

    Requires OpenGL ES 3.0 or APPLE_texture_packed_float

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

    OpenGL ES 2.0 interacts with this extension.

    OpenGL ES 3.0 interacts with this extension.
    
Overview

    This extension allows two packed floating point formats 
    R11F_G11F_B10F and as RGB9_E5 defined in APPLE_texture_packed_float or
    OpenGL ES 3.0 or to be rendered to via framebuffer objects.

New Procedures and Functions

    None

New Tokens

    None

Additions to Chapter 4 of the OpenGL ES 2.0 Specification (Per-Fragment
Operations and the Framebuffer)

    Modify Section 4.3.1 (Reading Pixels), p. 104

    (modify first paragraph, p 104) ...Only two combinations of format and type
    are accepted. The first varies depending on the format of the currently
    bound rendering surface. For normalized fixed-point rendering surfaces,
    the combination format RGBA and type UNSIGNED_BYTE is accepted. For 
    R11F_G11F_B10F surfaces, the combination RGB and 
    UNSIGNED_INT_10F_11F_11F_REV_APPLE is accepted.  For RGB9_E5 surfaces, the
    combination RGB and GL_UNSIGNED_INT_5_9_9_9_REV_APPLE is accepted. For
    floating-point rendering surfaces, the combination format RGBA and type
    FLOAT is accepted. The second is an implementation-chosen format...
    
    (modify "Conversion of RGBA Values", p. 106)  The R, G, B, and A values
    form a group of elements. For a fixed-point color buffer, each element is
    converted to floating-point according to section 2.1.2. For a floating-
    point color buffer, the elements are unmodified.

    Add to Table 4.4, p. 106:

        type Parameter                                     Component
        Token Name                          GL Data Type   Conversion Formula
        ----------------------------------  -------------  ------------------
        UNSIGNED_INT_10F_11F_11F_REV_APPLE  uint           see below
        UNSIGNED_INT_5_9_9_9_REV            uint           see below
        
    
    (modify "Final Conversion", p. 106) If type is not FLOAT, HALF_FLOAT_OES,
    UNSIGNED_INT_10F_11F_11F_REV_APPLE or UNSIGNED_INT_5_9_9_9_REV
    each component is first clamped to [0,1]. Then the appropriate conversion
    formula from table 4.4 is applied to the component.
    
    "Encoding of Special Internal Formats"
    
    If <type> is UNSIGNED_INT_10F_11F_11F_REV_APPLE, the red, green, 
    and blue bits are converted to unsigned 11-bit, unsigned 11-bit, 
    and unsigned  10-bit floating-point values as described in 
    "Unsigned 11-BitFloating-Point Numbers" and "Unsigned 10-Bit 
    Floating-Point Numbers"
    
    If <type> is UNSIGNED_INT_5_9_9_9_REV_APPLE, the red, green, and 
    blue bits are converted to a shared exponent format according to 
    the following procedure: Components red, green, and blue are 
    first clamped (in the process, mapping NaN to zero) as follows:

        red_c = max(0, min(sharedexp_max, red)) 
        green_c = max(0, min(sharedexp_max, green)) 
        blue_c = max(0, min(sharedexp_max, blue))
    
    where:
    
        sharedexp_max = (2^N - 1) / 2^N * 2^(E_max - B)
        
    N is the number of mantissa bits per component (9), B is the 
    exponent bias (15), and E_max is the maximum allowed biased exponent 
    value (31). The largest clamped component, max_c, is determined:
        
        max_c = max(red_c, green_c, blue_c)
        
    A preliminary shared exponent exp_p is computed:
    
        exp_p = max(-B - 1, floor(log2(max_c))) + 1 + B
        
    A refined shared exponent exp_s is computed:
    
        max_s = floor(max_c / 2^(exp_p - B - N) + 0.5)
        
                / exp_p,    0 <= max_s < 2^N
        exp_s = 
                \ exp_p+1,  max_s = 2^N
                
    Finally, three integer values in the range 0 to 2^N - 1 are computed:
    
        red_s = floor(red_c / 2^(exp_s - B - N) + 0.5)
        green_s = floor(green_c / 2^(exp_s - B - N) + 0.5)
        blue_s = floor(blue_c / 2^(exp_s - B - N) + 0.5)

    The resulting red_s, green_s, blue_s, and exp_s are stored in the red, 
    green, blue, and shared bits respectively.

    Add to Table 4.5, p. 117:

        Sized                 Renderable        R     G     B     A     D     S     Shared
        Internal Format       Type              bits  bits  bits  bits  bits  bits  bits
        --------------------  ----------------  ----  ----  ----  ----  ----  ----  ------
        R11F_G11F_B10F_APPLE  color-renderable  f11   f11   f10
        RGB9_E5_APPLE         color-renderable  9     9     9                       5

    (modify table description) Table 4.5: Renderbuffer image formats, showing
    their renderable type (color-, depth-, or stencil-renderable) and the number
    of bits each format contains for color (R, G, B, A), depth (D), and stencil
    (S) components. The component resolution prefix indicates the internal data
    type: f is floating-point, no prefix is unsigned normalized fixed-point.

Errors

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

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

Dependencies on OpenGL ES 3.0

    Replace all references to UNSIGNED_INT_10F_11F_11F_REV_APPLE and 
    UNSIGNED_INT_5_9_9_9_REV_APPLE with non _APPLE versions respectively.

New Implementation Dependent State

    None

Revision History

    1.0  2014/02/1  rogoyski    Initial version


