Name

    EXT_packed_float

Name Strings

    GL_EXT_packed_float
    WGL_EXT_pixel_format_packed_float
    GLX_EXT_fbconfig_packed_float

Contact

    Mark J. Kilgard, NVIDIA Corporation (mjk 'at' nvidia.com)

Status

    Preliminary

Version

    Date: February 15, 2006
    Revision: 0.3

Number

    328

Dependencies

    OpenGL 1.1 required

    ARB_color_buffer_float affects this extension.

    EXT_texture_shared_exponent trivially affects this extension.

    EXT_framebuffer_object affects this extension.

    WGL_ARB_pixel_format is required for use with WGL.

    WGL_ARB_pbuffer affects WGL pbuffer support for this extension.

    GLX 1.3 is required for use with GLX.

    This extension is written against the OpenGL 2.0 (September 7,
    2004) specification.

Overview

    This extension adds a new 3-component floating-point texture format
    that fits within a single 32-bit word.  This format 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, positive denorms,
    and positive NaN values are representable.  The value of the fourth
    component returned by a texture fetch is always 1.0.

    This extension also provides support for rendering into an unsigned
    floating-point rendering format with the assumption that the texture
    format described above could also be advertised as an unsigned
    floating-point format for rendering.

    The extension also provides a pixel external format for specifying
    packed float values directly.

New Procedures and Functions

    None

New Tokens

    Accepted by the <internalformat> parameter of TexImage1D,
    TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D, and
    RenderbufferStorageEXT:

        R11F_G11F_B10F_EXT                            0x8C3A

    Accepted by the <type> parameter of DrawPixels, ReadPixels,
    TexImage1D, TexImage2D, GetTexImage, TexImage3D, TexSubImage1D,
    TexSubImage2D, TexSubImage3D, GetHistogram, GetMinmax,
    ConvolutionFilter1D, ConvolutionFilter2D, ConvolutionFilter3D,
    GetConvolutionFilter, SeparableFilter2D, GetSeparableFilter,
    ColorTable, ColorSubTable, and GetColorTable:

        UNSIGNED_INT_10F_11F_11F_REV_EXT              0x8C3B

    Accepted by the <pname> parameters of GetIntegerv, GetFloatv, and
    GetDoublev:

        RGBA_SIGNED_COMPONENTS_EXT                    0x8C3C

    Accepted as a value in the <piAttribIList> and <pfAttribFList>
    parameter arrays of wglChoosePixelFormatARB, and returned in the
    <piValues> parameter array of wglGetPixelFormatAttribivARB, and the
    <pfValues> parameter array of wglGetPixelFormatAttribfvARB:

        WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT              0x20A8

    Accepted as values of the <render_type> arguments in the
    glXCreateNewContext and glXCreateContext functions

        GLX_RGBA_UNSIGNED_FLOAT_TYPE_EXT              0x20B1

    Returned by glXGetFBConfigAttrib (when <attribute> is set to
    GLX_RENDER_TYPE) and accepted by the <attrib_list> parameter of
    glXChooseFBConfig (following the GLX_RENDER_TYPE token):

        GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT                0x00000008

Additions to Chapter 2 of the 2.0 Specification (OpenGL Operation)

 -- Add two new sections after Section 2.1.2, (page 6):

    2.1.A  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 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 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.

    2.1.B  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.

Additions to Chapter 3 of the 2.0 Specification (Rasterization)

 -- Section 3.6.4, Rasterization of Pixel Rectangles

    Add a new row to Table 3.5 (page 128):

        type Parameter                    Corresponding  Special
        Token Name                        GL Data Type   Interpretation
        --------------------------------  -------------  --------------
        UNSIGNED_INT_10F_11F_11F_REV_EXT   uint           yes

    Add a new row to table 3.8: Packed pixel formats (page 132):

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

    Add a new entry to table 3.11: UNSIGNED_INT formats (page 134):

        UNSIGNED_INT_10F_11F_11F_REV_EXT:

        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
        +----------------------------+--------------------------------+---------------------------------+
        |           3rd              |             2nd                |             1st                 |
        +----------------------------+--------------------------------+---------------------------------+

    Add to the end of the 2nd paragraph starting "Pixels are draw using":

    "If type is UNSIGNED_INT_10F_11F_11F_REV_EXT and format is not RGB
    then the error INVALID_ENUM occurs."

    Add UNSIGNED_INT_10F_11F_11F_REV_EXT to the list of packed formats
    in the 10th paragraph after the "Packing" subsection (page 130).

    Add before the 3rd paragraph (page 135, starting "Calling DrawPixels
    with a type of BITMAP...") from the end of the "Packing" subsection:

    "Calling DrawPixels with a type of UNSIGNED_INT_10F_11F_11F_REV_EXT
    and format of RGB is a special case in which the data are a series
    of GL uint values.  Each uint value specifies 3 packed components
    as shown in table 3.11.  The 1st, 2nd, and 3rd components are
    called f_red (11 bits), f_green (11 bits), and f_blue (10 bits)
    respectively.

    f_red and f_green are treated as unsigned 11-bit floating-point values
    and converted to floating-point red and green components respectively
    as described in section 2.1.A.  f_blue is treated as an unsigned
    10-bit floating-point value and converted to a floating-point blue
    component as described in section 2.1.B."

 -- Section 3.8.1, Texture Image Specification:

    "Alternatively if the internalformat is R11F_G11F_B10F_EXT, 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 sections 2.1.A and 2.1.B.  These encoded values can be later
    decoded back to floating-point values due to texture image sampling
    or querying."

    Add a new row to Table 3.16 (page 154).

        Sized                  Base             R     G     B     A     L     I     D
        Internal Format        Internal Format  bits  bits  bits  bits  bits  bits  bits
        ---------------------  ---------------  ----  ----  ----  ----  ----  ----  ----
        R11F_G11F_B10F_EXT     RGB              11    11    10

Additions to Chapter 4 of the 2.0 Specification (Per-Fragment Operations
and the Frame Buffer)

 -- Modify Chapter 4 Introduction, (page 198)

    Modify first sentence of third paragraph (page 198):

    "Color buffers consist of either signed or unsigned integer color
    indices, R, G, B and optionally A signed or unsigned integer values,
    or R, G, B, and optionally A signed or unsigned floating-point
    values."

 -- Section 4.3.2, Reading Pixels

    Add a row to table 4.7 (page 224);

                                                    Component
    type Parameter                    GL Data Type  Conversion Formula
    --------------------------------  ------------  ------------------
    UNSIGNED_INT_10F_11F_11F_REV_EXT   uint          special

    Replace second paragraph of "Final Conversion" (page 222) to read:

    For an RGBA color, if <type> is not one of FLOAT,
    UNSIGNED_INT_5_9_9_9_REV_EXT, or UNSIGNED_INT_10F_11F_11F_REV_EXT,
    or if the CLAMP_READ_COLOR_ARB is TRUE, or CLAMP_READ_COLOR_ARB
    is FIXED_ONLY_ARB and the selected color (or texture) buffer is
    a fixed-point buffer, each component is first clamped to [0,1].
    Then the appropriate conversion formula from table 4.7 is applied
    the component."

    Add a paragraph after the second paragraph of "Final Conversion"
    (page 222):

    "In the special case when calling ReadPixels with a type of
    UNSIGNED_INT_10F_11F_11F_REV_EXT and format of RGB, the conversion
    is done as follows:  The returned data are packed into a series of
    GL uint values. The red, green, and blue components are converted
    to unsigned 11-bit floating-point, unsigned 11-bit floating-point,
    and unsigned 10-bit floating point as described in section
    2.1.A and 2.1.B.  The resulting red 11 bits, green 11 bits, and blue
    10 bits are then packed as the 1st, 2nd, and 3rd components of the
    UNSIGNED_INT_10F_11F_11F_REV_EXT format as shown in table 3.11."

Additions to Chapter 5 of the 2.0 Specification (Special Functions)

    None

Additions to Chapter 6 of the 2.0 Specification (State and State Requests)

    None

Additions to the OpenGL Shading Language specification

    None

Additions to Chapter 3 of the GLX 1.3 Specification (Functions and
Errors)

    Replace Section 3.3.3 (p.12) Paragraph 4 to:

    The attribute GLX_RENDER_TYPE has as its value a mask indicating
    what type of GLXContext a drawable created with the corresponding
    GLXFBConfig can be bound to. The following bit settings are supported:
    GLX_RGBA_BIT, GLX_RGBA_FLOAT_BIT, GLX_RGBA_UNSIGNED_FLOAT_BIT,
    GLX_COLOR_INDEX_BIT.  If combinations of bits are set in the mask
    then drawables created with the GLXFBConfig can be bound to those
    corresponding types of rendering contexts.

    Add to Section 3.3.3 (p.15) after first paragraph:

    Note that unsigned floating point rendering is only supported
    for GLXPbuffer drawables.  The GLX_DRAWABLE_TYPE attribute of
    the GLXFBConfig must have the GLX_PBUFFER_BIT bit set and the
    GLX_RENDER_TYPE attribute must have the GLX_RGBA_UNSIGNED_FLOAT_BIT
    set.  Unsigned floating point rendering assumes the framebuffer
    format has no sign bits so all component values are non-negative.
    In contrast, conventional floating point rendering assumes signed
    components.

    Modify Section 3.3.7 (p.25 Rendering Contexts) remove period
    at end of second paragraph and replace with:

    ; if render_type is set to GLX_RGBA_UNSIGNED_FLOAT_TYPE then a
    context that supports unsigned floating point RGBA rendering is
    created.

GLX Protocol

    None.

Additions to the WGL Specification

    Modify the values accepted by WGL_PIXEL_TYPE_ARB to:

        WGL_PIXEL_TYPE_ARB
        The type of pixel data. This can be set to WGL_TYPE_RGBA_ARB,
        WGL_TYPE_RGBA_FLOAT_ARB, WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT,
        or WGL_TYPE_COLORINDEX_ARB.

    Add this explanation of unsigned floating point rendering:

    "Unsigned floating point rendering assumes the framebuffer format has
    no sign bits so all component values are non-negative.  In contrast,
    conventional floating point rendering assumes signed components."

Dependencies on WGL_ARB_pbuffer

    Ignore the "Additions to the WGL Specification" section if
    WGL_ARB_pbuffer is not supported.

Dependencies on WGL_ARB_pixel_format

    The WGL_ARB_pixel_format extension must be used to determine a
    pixel format with unsigned float components.

Dependencies on ARB_color_buffer_float

    If ARB_color_buffer_float is not supported, replace this amended
    sentence from 4.3.2 above

    For an RGBA color, if <type> is not one of FLOAT,
    UNSIGNED_INT_5_9_9_9_REV_EXT, or UNSIGNED_INT_10F_11F_11F_REV_EXT,
    or if the CLAMP_READ_COLOR_ARB is TRUE, or CLAMP_READ_COLOR_ARB
    is FIXED_ONLY_ARB and the selected color (or texture) buffer is
    a fixed-point buffer, each component is first clamped to [0,1]."

    with

    "For an RGBA color, if <type> is not one of FLOAT,
    UNSIGNED_INT_5_9_9_9_REV_EXT, or UNSIGNED_INT_10F_11F_11F_REV_EXT
    and the selected color buffer (or texture image for GetTexImage)
    is a fixed-point buffer (or texture image for GetTexImage), each
    component is first clamped to [0,1]."

Dependencies on EXT_texture_shared_exponent

    If EXT_texture_shared_exponent is not supported, delete the reference
    to UNSIGNED_INT_5_9_9_9_REV_EXT in section 4.3.2.

Dependencies on EXT_framebuffer_object

    If EXT_framebuffer_object is not supported, then
    RenderbufferStorageEXT is not supported and the R11F_G11F_B10F_EXT
    internalformat is therefore not supported by RenderbufferStorageEXT.

    If EXT_framebuffer_object is supported, glRenderbufferStorageEXT
    accepts GL_RG11F_B10F_EXT for its internalformat parameter because
    GL_RG11F_B10F_EXT has a base internal format of GL_RGB that is listed
    as color-renderable by the EXT_framebuffer_object specification.

Errors

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

    TexImage1D, TexImage2D, TexImage3D, CopyTexImage1D, CopyTexImage2D,
    and RenderbufferStorageEXT accept the new R11F_G11F_B10F_EXT token
    for internalformat.

    DrawPixels, ReadPixels, TexImage1D, TexImage2D, GetTexImage,
    TexImage3D, TexSubImage1D, TexSubImage2D, TexSubImage3D,
    GetHistogram, GetMinmax, ConvolutionFilter1D, ConvolutionFilter2D,
    ConvolutionFilter3D, GetConvolutionFilter, SeparableFilter2D,
    GetSeparableFilter, ColorTable, ColorSubTable, and GetColorTable
    accept the new UNSIGNED_INT_10F_11F_11F_REV_EXT token for type.

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

    INVALID_OPERATION is generated by DrawPixels, ReadPixels, TexImage1D,
    TexImage2D, GetTexImage, TexImage3D, TexSubImage1D, TexSubImage2D,
    TexSubImage3D, GetHistogram, GetMinmax, ConvolutionFilter1D,
    ConvolutionFilter2D, ConvolutionFilter3D, GetConvolutionFilter,
    SeparableFilter2D, GetSeparableFilter, ColorTable, ColorSubTable,
    and GetColorTable if <type> is UNSIGNED_INT_10F_11F_11F_REV_EXT and
    <format> is not RGB.

New State

    In table 6.17, Textures (page 278), increment the 42 in "n x Z42*"
    by 1 for the R11F_G11F_B10F_EXT format.

    [NOTE: The OpenGL 2.0 specification actually should read "n x Z48*"
    because of the 6 generic compressed internal formats in table 3.18.]

    (modify table 6.33, p. 294)

                                                      Initial
    Get Value                    Type   Get Command   Value    Description         Sec.   Attribute
    --------------------------   ----   -----------   -------  ------------------  ----   ----------
    RGBA_SIGNED_COMPONENTS_EXT   4xB    GetIntegerv   -        True if respective  4      -
                                                               R, G, B, and A
                                                               components are
                                                               signed
    
New Implementation Dependent State

    None

Issues

    1)  What should this extension be called?

        RESOLVED: EXT_packed_float

        This extension provides a new 3-component packed float format
        for use as a texture internal format, pixel external format,
        and framebuffer color format.

        "packed" indicates the extension is packing components
        at reduced precisions (similar to EXT_packed_pixels or
        NV_packed_depth_stencil).

        EXT_r11f_g11f_b10f_float was considered but there's no precedent
        for extension names to be so explicit (or cryptic?) about format
        specifics in the extension name.

    2)  Should there be an rgb11f_b10f framebuffer format?

        RESOLVED:  Yes.  Unsigned floating-point rendering formats for GLX
        and WGL are provided.  The assumption is that this functionality
        could be used to advertise a pixel format with 11 bits of unsigned
        floating-point red, 11 bits of unsigned floating-point green,
        and 10 bits of floating-point blue.

        In theory, an implementation could advertise other component sizes
        other than 11/11/10 for an unsigned floating-point framebuffer
        format but that is not expected.

    3)  Should there be GLX and WGL extension strings?

        RESOLVED:  Yes, there are WGL and GLX tokens added to
        support querying unsigned floating-point color buffer
        formats named WGL_EXT_pixel_format_packed_float and
        GLX_EXT_fbconfig_packed_float respectively.

    4)  Should there be an unequal distribution of red, green, and blue
        mantissa bits?

        RESOLVED:  Yes.  A 6-bit mantissa for red and green is unbalanced
        with the 5-bit mantissa for blue, but this allows all the bits of
        a 32 bit word (6+6+5+3*5=32) to be used.  The blue component is
        chosen to have fewer bits because 1) it is the third component,
        and 2) there's a belief that the human eye is less sensitive
        to blue variations..

        Developers should be aware that subtle yellowing or bluing
        of gray-scale values is possible because of the extra bit of
        mantissa in the red and green components.

    5)  Should there be an external format for r11f_g11f_b10f?

        RESOLVED:  Yes.  This makes it fast to load GL_R11F_G11F_B10F_EXT
        textures without any translation by the driver.

    6)  What is the exponent bias?

        RESOLVED:  15, just like 16-bit half-precision floating-point
        values.  

    7)  Can s10e5 floating-point filtering be used to filter
        r11f_g11f_b10f values?  If so, how?

        RESOLVED:  Yes.  It is easy to promote r11f_g11f_b10f values to
        s10e5 components.

    8)  Should automatic mipmap generation be supported for r11f_g11f_b10f
        textures?

        RESOLVED:  Yes.

    9)  Should non-texture and non-framebuffer commands for loading
        pixel data accept the GL_UNSIGNED_INT_10F_11F_11F_REV_EXT type?

        RESOLVED:  Yes.

        Once the pixel path has to support the new type/format combination
        of GL_UNSIGNED_INT_5_9_9_9_REV_EXT / GL_RGB for specifying and
        querying texture images, it might as well be supported for all
        commands that pack and unpack RGB pixel data.

        The specification is written such that the glDrawPixels
        type/format parameters are accepted by glReadPixels,
        glTexGetImage, glTexImage2D, and other commands that are specified
        in terms of glDrawPixels.

    10) Should non-texture internal formats (such as for color tables,
        convolution kernels, histogram bins, and min/max tables) accept
        GL_R11F_G11F_B10F_EXT format?

        RESOLVED:  No.

        That's pointless.  No hardware is ever likely to support
        GL_R11F_G11F_B10F_EXT internal formats for anything other than
        textures and maybe color buffers in the future.  This format is
        not interesting for color tables, convolution kernels, etc.

    11) Should a format be supported with sign bits for each component?

        RESOLVED:  No.  A sign bit for each of the three components would
        steal too many bits from the mantissa.  This format is intended
        for storing radiance and irradiance values that are physically
        non-negative.

    12) Should we support a non-REV version of the
        GL_UNSIGNED_INT_10F_11F_11F_REV_EXT token?

        RESOLVED:  No.  We don't want to promote different arrangements
        of the bitfields for r11f_g11f_b10f values.

    13) Can you use the GL_UNSIGNED_INT_10F_11F_11F_REV_EXT format with
        just any format?

        RESOLVED:  You can only use the
        GL_UNSIGNED_INT_10F_11F_11F_REV_EXT format with GL_RGB.
        Otherwise, the GL generates an GL_INVALID_OPERATION error.
        Just as the GL_UNSIGNED_BYTE_3_3_2 format just works with GL_RGB
        (or else the GL generates an GL_INVALID_OPERATION error), so
        should GL_UNSIGNED_INT_10F_11F_11F_REV_EXT.

    14) Should blending be supported for a packed float framebuffer
        format?

        RESOLVED:  Yes.  Blending is required for other floating-point
        framebuffer formats introduced by ARB_color_buffer_float.
        The equations for blending should be evaluated with signed
        floating-point math but the result will have to be clamped to
        non-negative values to be stored back into the packed float
        format of the color buffer.

    15) Should unsigned floating-point framebuffers be queried
        differently from conventional (signed) floating-point
        framebuffers?

        RESOLVED:  Yes.  An existing application using
        ARB_color_buffer_float can rightfully expect a floating-point
        color buffer format to provide signed components.  The packed
        float format does not provide a sign bit.  Simply treating packed
        float color buffer formats as floating-point might break some
        existing applications that depend on a float color buffer to be
        signed.

        For this reason, there are new WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT
        (for WGL) and GLX_RGBA_UNSIGNED_FLOAT_BIT_EXT (for GLX)
        framebuffer format parameters.

    16) What should glGet of GL_RGBA_FLOAT_MODE_ARB return for unsigned
        float color buffer formats?

        RESOLVED.  GL_RGBA_FLOAT_MODE_ARB should return true.  The packed
        float components are unsigned but still floating-point.

    17) Can you query with glGet to determine if the color buffer has
        unsigned float components?

        RESOLVED:  Yes.  Call glGetIntegerv
        on GL_RGBA_SIGNED_COMPONENTS_EXT.  The value returned is
        a 4-element array.  Element 0 corresponds to red, element 1
        corresponds to green, element 2 corresponds to blue, and element
        3 corresponds to alpha.  If a color component is signed, its
        corresponding element is true (GL_TRUE).  This is the same way
        the GL_COLOR_WRITEMASK bits are formatted.

        For the packed float format, all the elements are zeroed since
        the red, green, and blue components are unsigned and the alpha
        component is non-existent.  All elements are also zeroed for
        conventional fixed-point color buffer formats.  Elements are
        set for signed floating-point formats such as those introduced
        by ARB_color_buffer_float.  If a component (such as alpha) has
        zero bits, the component should not be considered signed and so
        the bit for the respective component should be zeroed.

        This generality allows a future extension to specify float
        color buffer formats that had a mixture of signed and unsigned
        floating-point components.  However, this extension only provides
        a packed float color format with all unsigned components.

    18) How many bits of alpha should GL_ALPHA_BITS return for the packed
        float color buffer format?

        RESOLVED:  Zero.

    19) Can you render to a packed float texture with the
        EXT_framebuffer_object functionality?

        RESOLVED:  Yes.

        Potentially an implementation could return
        GL_FRAMEBUFFER_UNSUPPORTED_EXT when glCheckFramebufferStatusEXT
        for a framebuffer object including a packed float color buffer,
        but implementations are likely to support (and strongly encouraged
        to support) the packed float format for use with a framebuffer
        object because the packed float format is expected to be a
        memory-efficient floating-point color format well-suited for
        rendering, particularly rendering involving high-dynamic range.

    20) This extension is for a particular packed float format.  What if
        new packed float formats come along?

        RESOLVED:  A new extension could be introduced with a name like
        EXT_packed_float2, but at this time, no other such extensions
        are expected except for the EXT_texture_shared_exponent
        extension.  It simply hard to justify packing three or more
        components into a single 32-bit word in lots of different ways
        since any approach is going to be a compromise of some sort.
        For two-component or one-component floating-point formats, the
        existing ARB_texture_float formats fit nicely into 16 or 32 bits
        by simply using half precision floating-point.  If 64 bits are
        allowed for a pixel, the GL_RGBA16F_ARB is a good choice.

        The packed float format is similar to the format introduced by
        the EXT_texture_shared_exponent extension, but that extension
        is not a pure packed float format.  Unlike the packed float
        format, the EXT_texture_shared_exponent format shares a single
        exponent between the RGB components rather than providing
        an independent exponent for each component.  Because the
        EXT_texture_shared_exponent uses fewer bits to store exponent
        values, more mantissa precision is provided.

    21) Should this extension provide pbuffer support?

        RESOLVED:  Yes.  Pbuffers are core GLX 1.3 functionality.
        While using FBO is probably the preferred way to render to
        r11f_g11f_b10f framebuffers but pbuffer support is natural
        to provide.  WGL should have r11f_g11f_b10f pbuffer support too.

    22) Must an implementation support NaN, Infinity, and/or denorms?

        RESOLVED:  The preferred implementation is to support NaN,
        Infinity, and denorms.  Implementations are allowed to flush
        denorms to zero, and treat NaN and Infinity values as large
        finite values.

        This allowance flushes denorms to zero:

            0.0,                      if E == 0 and M != 0

        This allowance treats Infinity as a finite value:

            2^16                      if E == 31 and M == 0

        This allowance treats NaN encodings as finite values:

            2^16 * (1 + M/64)         if E == 31 and M != 0

        The expectation is that mainstream GPUs will support NaN,
        Infinity, and denorms while low-end implementations such as for
        OpenGL ES 2.0 will likely support denorms but neither NaN nor
        Infinity.

        There is not an indication of how these floating-point special
        values are treated (though an application could test an
        implementation if necessary).

    23) Should this extension interoperate with framebuffer objects?

        RESOLVED:  Definitely.  No particular specification language is
        required.

        In particular, glRenderbufferStorageEXT should accept
        GL_R11F_G11F_B10F_EXT for its internalformat parameter (true
        because this extension adds a new format to Table 3.16).

    24) Are negative color components clamped to zero when written into
        an unsigned floating-point color buffer?  If so, do we need to
        say in the Blending or Dithering language that negative color
        components are clamped to zero?

        RESOLVED:  Yes, negative color components are clamped to zero when
        written to an unsigned floating-point color buffer.  No specification
        language is required for this behavior because the ARB_color_buffer_float
        extension says

        "In RGBA mode dithering selects, for each color component, either
        the most positive representable color value (for that particular
        color component) that is less than or equal to the incoming
        color component value, c, or the most negative representable
        color value that is greater than or equal to c.

        If dithering is disabled, then each incoming color component
        c is replaced with the most positive representable color value
        (for that particular component) that is less than or equal to c,
        or by the most negative representable value, if no representable
        value is less than or equal to c;"

        The most negative representable value for unsigned
        floating-point values is zero.  So the existing language from
        ARB_color_buffer_float already indicates that negative values
        are clamped to zero for unsigned floating-point color buffers.
        No additional specification language is required.

    25) Prior texture internal formats have generic formats (example:
        GL_RGB) and corresponding sized formats (GL_RGB8, GL_RGB10,
        etc.).  Should we add a generic format corresponding to
        GL_R11F_G11F_B10F_EXT?

        RESOLVED:  No.  It's unlikely there will be any other unsigned
        floating-point texture formats.

Revision History

    None
