Name

    WGL_ATI_pixel_format_float

Name Strings

    WGL_ATI_pixel_format_float

Contact

    Rob Mace, AMD (rob.mace 'at' amd.com)

Status

    Complete.

Version

    Last Modified Date: November 4, 2006
    Revision: 6

Number

    278

Dependencies

    WGL_ARB_pixel_format is required.

    This extension is written against the OpenGL 1.3 Specification.


Overview

    This extension adds pixel formats with floating-point RGBA color
    components.

    The size of each float components is specified using the same
    WGL_RED_BITS_ARB, WGL_GREEN_BITS_ARB, WGL_BLUE_BITS_ARB and
    WGL_ALPHA_BITS_ARB pixel format attributes that are used for
    defining the size of fixed-point components.  32 bit floating-
    point components are in the standard IEEE float format.  16 bit
    floating-point components have 1 sign bit, 5 exponent bits,
    and 10 mantissa bits. 

    In standard OpenGL RGBA color components are normally clamped to
    the range [0,1].  The color components of a float buffer are
    clamped to the limits of the range representable by their format.


Issues

    1. Should we expose a GL_FLOAT16_ATI pixel type?

       RESOLUTION:  This will be exposed in a separate extension.


New Procedures and Functions

   None


New Tokens

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

        RGBA_FLOAT_MODE_ATI                     0x8820
        COLOR_CLEAR_UNCLAMPED_VALUE_ATI         0x8835

    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_FLOAT_ATI                 0x21A0


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

    Add a new Section 2.1.2, (p. 6):

      2.1.2  16 Bit Floating-Point

      A 16 bit floating-point number has 1 sign bit (s), 5 exponent
      bits (e), and 10 mantissa bits (m).  The value (v) of a 16 bit
      floating-point number is determined by the following pseudo code:

        if (e != 0)
            v = (-1)^s * 2^(e-15) * 1.m  # normalized
        else if (f == 0)
            v = (-1)^s * 0               # zero
        else
            v = (-1)^s * 2^(e-14) * 0.m  # denormalized

      It is acceptable for an implementation to treat denormalized 16 bit
      floating-point numbers as zero.

      There are no NAN or infinity values for 16 bit floating-point.




Additions to Chapter 3 of the OpenGL 1.3 Specification (Rasterization)

    Section 3.6.4, (p. 92), Add to figure 3.7 a block to "final
    conversion" for "RGBA float pixel data out" that says "clamp
    to float format range".

    Section 3.6.4, (p. 102), change the first paragraph of the "Final
    Conversion" to:

      For a color index, final conversion consists of masking the bits
      of the index to the left of the binary point by 2^n - 1, where n
      is the number of bits in an index buffer.  For RGBA components the
      conversion is based on whether the components in the destination
      color buffer are fixed-point or floating-point. For fixed-point
      destination buffers components are clamped to [0,1]. The resulting
      values are converted to fixed-point according to the rules given in
      section 2.13.9 (Final Color Processing).  For floating-point
      destination buffers components are clamped to the limits of the
      range representable by the destination format.


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

    Chapter 4 Introduction, (p. 156), change the first line of the third
    paragraph to:

      Color buffers consist of either unsigned integer color indices,
      RGB and optionally A unsigned integer values, of RGBA floating-
      point values.

    Section 4.1.7, (p. 162), change the third paragraph of the page to:

      Fixed-point destination (framebuffer) components and source
      (fragment) components are taken to be values represented according
      to the scheme given in section 2.13.9 (Final Color Processing).
      Floating-point destination and source components are taken as is.
      Constant color components are taken to be floating-point values.

    Section 4.1.7, (p. 163), change the forth line of the second paragraph
    of "Using BlendFunc" to:

      If destination color components are fixed-point, each floating-
      point value in this quadruplet is clamped to [0,1] and converted
      back to a fixed-point value in the manner described in section
      2.13.9.

    Section 4.1.8, (p. 165), insert after the first sentence:

      Dithering has no effect if the destination color buffer components
      are floating-point.

    Section 4.1.9, (p. 165), insert after the first sentence:

      Logical operation has no effect if the destination color buffer
      components are floating-point.

    Section 4.2.3, (p. 170), change the third paragraph to:

          void ClearColor(float r, float g, float b, float a);
 
      sets the clear value for the color buffers in RGBA mode.  When
      clearing a fixed-point color buffer each of the specified
      components is clamped to [0; 1] and converted to fixed-point
      according to the rules of section 2.13.9.  When clearing a
      floating-point color buffer the specified components are not
      clamped.

    Section 4.3.2, (p. 176), change the "Conversion of RGBA values" to:

      This step applies only if the GL is in RGBA mode, and then only
      if format is neither STENCIL INDEX nor DEPTH COMPONENT.  The R,
      G, B, and A values form a group of elements.  When reading from a
      fixed-point color buffer each element is taken to be a fixed-point
      value in [0; 1] with m bits, where m is the number of bits in the
      corresponding color component of the selected buffer (see
      section 2.13.9).

    Section 4.3.2, (p. 177), change the second paragraph of the "Final
    Conversion" to:

      For a fixed-point RGBA color buffer, each component is first
      clamped to [0,1].  For floating-point RGBA color buffer, components
      are not clamped if the <type> is FLOAT, clamped to [0,1] if the
      <type> is unsigned, and clamped to [-1,1] if the <type> is signed.
      After clamping the appropriate conversion formula from table 4.7
      is applied to the component.


Additions to Chapter 5 of the OpenGL 1.3 Specification (Special 
Functions)

    None


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

    None


Additions to the GLX Specification

    This specification is written for WGL.

GLX Protocol

    This specification is written for WGL.

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_FLAOT_ARB, or WGL_TYPE_COLORINDEX_ARB.


Dependencies on WGL_ARB_pixel_format

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


Dependencies on WGL_ARB_extensions_string

    Because this extension is a WGL extension, it is not included in
    the GL_EXTENSIONS string.  Its existence can be determined with
    the WGL_ARB_extensions_string extension.


Errors
  
    None


New State

    (table 6.19, p227) modify COLOR_CLEAR_VALUE and add
    COLOR_CLEAR_UNCLAMPED_VALUE:

    Get Value                        Type   Get Command  Initial Value  Description         Section  Attribute
    -------------------------------  -----  -----------  -------------  ------------------  -------  ------------
    COLOR_CLEAR_VALUE                C      GetFloatv    0,0,0,0        Color buffer clear  4.2.3    color-buffer
                                                                        value (RGBA mode)
                                                                        clamped to [0,1]
    COLOR_CLEAR_UNCLAMPED_VALUE_ATI  4 x R  GetFloatv    0,0,0,0        Color buffer clear  4.2.3    color-buffer
                                                                        value (RGBA mode)
                                                                        unclamped


    (table 6.28, p236) add the following entry:

    Get Value             Type   Get Command   Minimum Value  Description      Section   Attribute
    --------------------  -----  ------------  -------------  ---------------  --------  ----------
    RGBA_FLOAT_MODE_ATI   B      GetBooleanv   -              True if RGBA     2.7       -
                                                              components are
                                                              floats


New Implementation Dependent State

    None


Revision History

   Date: 11/4/2006
   Revision: 6
      - Updated contact info after ATI/AMD merger.

   Date: 12/4/2002
   Revision: 5
      - Added Section 2.1.2 16 Bit Floating-Point.

   Date: 9/12/2002
   Revision: 4
      - Fixed typo, CLEAR_COLOR_VALUE is really COLOR_CLEAR_VALUE.

   Date: 9/11/2002
   Revision: 3
      - Added enum numbers to New Tokens.
      - Added CLEAR_COLOR_UNCLAMPED_VALUE_ATI and defined behavior of
        CLEAR_COLOR_VALUE.
      - Added description of change to figure 3.7.
      - Clarified float clamping in section 3.6.4.

   Date: 9/9/2002
   Revision: 2
      - Changed wording of how float clamping is described in Overview.

   Date: 9/6/2002
   Revision: 1
      - First draft for circulation.
