| Name | 
 |  | 
 |     ARB_half_float_pixel | 
 |  | 
 | Name Strings | 
 |  | 
 |     GL_ARB_half_float_pixel | 
 |  | 
 | Contributors | 
 |  | 
 |     Pat Brown | 
 |     Jon Leech | 
 |     Rob Mace | 
 |     Brian Paul | 
 |  | 
 | Contact | 
 |  | 
 |     Dale Kirkland, NVIDIA (dkirkland 'at' nvidia.com) | 
 |  | 
 | Notice | 
 |  | 
 |     Copyright (c) 2004-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 October 22, 2004. | 
 |  | 
 | Version | 
 |  | 
 |     Last Modified Date:  October 1, 2004 | 
 |     Version:             6 | 
 |  | 
 | Number | 
 |  | 
 |     ARB Extension #40 | 
 |  | 
 | Dependencies | 
 |  | 
 |     This extension is written against the OpenGL 2.0 Specification | 
 |     but will work with the OpenGL 1.5 Specification. | 
 |  | 
 |     Based on the NV_half_float extension. | 
 |  | 
 |     This extension interacts with ARB_color_buffer_float. | 
 |  | 
 | Overview | 
 |  | 
 |     This extension introduces a new data type for half-precision (16-bit) | 
 |     floating-point quantities.  The floating-point format is very similar | 
 |     to the IEEE single-precision floating-point standard, except that it | 
 |     has only 5 exponent bits and 10 mantissa bits.  Half-precision floats | 
 |     are smaller than full precision floats and provide a larger dynamic | 
 |     range than similarly sized normalized scalar data types. | 
 |  | 
 |     This extension allows applications to use half-precision floating- | 
 |     point data when specifying pixel data.  It extends the existing image | 
 |     specification commands to accept the new data type. | 
 |  | 
 |     Floating-point data is clamped to [0, 1] at various places in the | 
 |     GL unless clamping is disabled with the ARB_color_buffer_float | 
 |     extension. | 
 |  | 
 | IP Status | 
 |  | 
 |     SGI owns US Patent #6,650,327, issued November 18, 2003. SGI | 
 |     believes this patent contains necessary IP for graphics systems | 
 |     implementing floating point (FP) rasterization and FP framebuffer | 
 |     capabilities. | 
 |  | 
 |     SGI will not grant the ARB royalty-free use of this IP for use in | 
 |     OpenGL, but will discuss licensing on RAND terms, on an individual | 
 |     basis with companies wishing to use this IP in the context of | 
 |     conformant OpenGL implementations. SGI does not plan to make any | 
 |     special exemption for open source implementations. | 
 |  | 
 |     Contact Doug Crisman at SGI Legal for the complete IP disclosure. | 
 |  | 
 | Issues | 
 |  | 
 |     1. How is this extension different from the NV_half_float extension? | 
 |  | 
 |        This extension does not add new commands for specifying half- | 
 |        precision vertex data, and all imaging functions have been listed | 
 |        for supporting the "half" type. | 
 |  | 
 |     2. What should the new data type be called?  "half"?  "hfloat"? | 
 |  | 
 |        RESOLVED:  half .  This convention builds on the convention of | 
 |        using the type "double" to describe double-precision floating- | 
 |        point numbers.  Here, "half" will refer to half-precision | 
 |        floating-point numbers. | 
 |  | 
 |        Even though the 16-bit float data type is a first-class data type, | 
 |        it is still more problematic than the other types in the sense | 
 |        that no native programming languages support the data type. | 
 |        "hfloat/hf" would have reflected a second-class status better | 
 |        than "half/h". | 
 |  | 
 |        Both names are not without conflicting precedents.  The name "half" | 
 |        is used to connote 16-bit scalar values on some 32-bit CPU | 
 |        architectures (e.g., PowerPC).  The name "hfloat" has been used to | 
 |        describe 128-bit floating-point data on VAX systems. | 
 |  | 
 |     3. Should half-precision data be accepted by commands in the imaging | 
 |        subset that accept pixel data? | 
 |  | 
 |        RESOLVED:  Yes, all functions in the core OpenGL and the imaging | 
 |        subset that accept pixel data accept half-precision data. | 
 |  | 
 |     4. Should the special representations NaN, INF, and denormal be | 
 |        supported? | 
 |  | 
 |        RESOLVED:  Implementation dependent.  The spec reflects that Nan | 
 |        and INF produce unspecified results.  Denormalized numbers can | 
 |        be treated as a value of 0. | 
 |  | 
 |  | 
 | New Tokens | 
 |  | 
 |     Accepted by the <type> parameter of DrawPixels, ReadPixels, | 
 |     TexImage1D, TexImage2D, TexImage3D, GetTexImage, TexSubImage1D, | 
 |     TexSubImage2D, TexSubImage3D, GetHistogram, GetMinmax, | 
 |     ConvolutionFilter1D, ConvolutionFilter2D, GetConvolutionFilter, | 
 |     SeparableFilter2D, GetSeparableFilter, ColorTable, ColorSubTable, | 
 |     and GetColorTable: | 
 |  | 
 |         HALF_FLOAT_ARB                                0x140B | 
 |  | 
 | Additions to Chapter 2 of the OpenGL 2.0 Specification (OpenGL Operation) | 
 |  | 
 |     Add a new Section 2.1.2, (p. 6): | 
 |  | 
 |     2.1.2  16-Bit Floating-Point Numbers | 
 |  | 
 |     A 16-bit floating-point number has a 1-bit sign (S), a 5-bit | 
 |     exponent (E), and a 10-bit mantissa (M).  The value of a 16-bit | 
 |     floating-point number is determined by the following: | 
 |  | 
 |         (-1)^S * 0.0,                        if E == 0 and M == 0, | 
 |         (-1)^S * 2^-14 * (M / 2^10),         if E == 0 and M != 0, | 
 |         (-1)^S * 2^(E-15) * (1 + M/2^10),    if 0 < E < 31, | 
 |         (-1)^S * INF,                        if E == 31 and M == 0, or | 
 |         NaN,                                 if E == 31 and M != 0, | 
 |  | 
 |     where | 
 |  | 
 |         S = floor((N mod 65536) / 32768), | 
 |         E = floor((N mod 32768) / 1024), and | 
 |         M = N mod 1024. | 
 |  | 
 |     Implementations are also allowed to use any of the following | 
 |     alternative encodings: | 
 |  | 
 |         (-1)^S * 0.0,                        if E == 0 and M != 0, | 
 |         (-1)^S * 2^(E-15) * (1 + M/2^10),    if E == 31 and M == 0, or | 
 |         (-1)^S * 2^(E-15) * (1 + M/2^10),    if E == 31 and M != 0, | 
 |  | 
 |     Any representable 16-bit floating-point value is legal as input | 
 |     to a GL command that accepts 16-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. | 
 |  | 
 |     (modify Table 2.2, p. 9) -- add new row | 
 |  | 
 |                    Minimum | 
 |        GL Type    Bit Width    Description | 
 |        -------    ---------    ----------------------------------- | 
 |        half          16        half-precision floating-point value | 
 |                                encoded in an unsigned scalar | 
 |  | 
 |     Modify Section 2.14, (Colors and Coloring), p. 59 | 
 |  | 
 |     (modify Table 2.9, p. 59)  Add new row to the table: | 
 |  | 
 |          GL Type    Conversion | 
 |          -------    ---------- | 
 |          half          c | 
 |  | 
 |  | 
 | Additions to Chapter 3 of the OpenGL 2.0 Specification (Rasterization) | 
 |  | 
 |     Modify Section 3.6.4, Rasterization of Pixel Rectangles (p. 126) | 
 |  | 
 |     (modify Table 3.5, p. 128 -- add new row) | 
 |  | 
 |         type Parameter     Corresponding       Special | 
 |         Token Name         GL Data Type     Interpretation | 
 |         --------------     -------------    -------------- | 
 |         HALF_FLOAT_ARB         half               No | 
 |  | 
 |     (modify Unpacking, p. 129)  Data are taken from host memory as a | 
 |     sequence of signed or unsigned bytes (GL data types byte and ubyte), | 
 |     signed or unsigned integers (GL data types int and uint), or | 
 |     floating-point values (GL data types half and float). | 
 |  | 
 | Additions to Chapter 4 of the OpenGL 2.0 Specification (Per-Fragment | 
 | Operations and the Framebuffer) | 
 |  | 
 |     Modify Section 4.3.2, Reading Pixels (p. 219) | 
 |  | 
 |     (modify Final Conversion, p. 222) For an index, if the type is not | 
 |     FLOAT or HALF_FLOAT_ARB, final conversion consists of masking the | 
 |     index with the value given in Table 4.6; if the type is FLOAT or | 
 |     HALF_FLOAT_ARB, then the integer index is converted to a GL float | 
 |     or half data value. | 
 |  | 
 |     (modify Table 4.7, p. 224 -- add new row) | 
 |  | 
 |         type Parameter    GL Data Type    Component Conversion Formula | 
 |         --------------    ------------    ---------------------------- | 
 |         HALF_FLOAT_ARB        half                  c = f | 
 |  | 
 | Additions to Chapter 5 of the OpenGL 2.0 Specification (Special Functions) | 
 |  | 
 |     None | 
 |  | 
 | Additions to Chapter 6 of the OpenGL 2.0 Specification (State and | 
 | State Requests) | 
 |  | 
 |     None | 
 |  | 
 | Additions to the AGL/GLX/WGL Specifications | 
 |  | 
 |     None | 
 |  | 
 | GLX Protocol (Modification to the GLX 1.3 Protocol Encoding Specification) | 
 |  | 
 |     Modify Appendix A, Pixel Data (p. 148) | 
 |  | 
 |       (Modify Table A.1, p. 149 -- add new row for HALF_FLOAT_ARB data) | 
 |  | 
 |           type             Encoding    Protocol Type    nbytes | 
 |           -------------    --------    -------------    ------ | 
 |           HALF_FLOAT_ARB    0x140B      CARD16           2 | 
 |  | 
 | Errors | 
 |  | 
 |     None | 
 |  | 
 | New State | 
 |  | 
 |     None | 
 |  | 
 | New Implementation Dependent State | 
 |  | 
 |     None | 
 |  | 
 | Revision History | 
 |  | 
 |     Rev.    Date    Author    Changes | 
 |     ----  -------- ---------  -------------------------------------------- | 
 |       1   12/15/03 Kirkland   Initial version based on the NV_half_float | 
 |                               specification. | 
 |  | 
 |       2   2/26/04  Kirkland   Changed NVIDIA_xxx to NV_xxx. | 
 |                               Changed the issue resolution for INF and NaN. | 
 |  | 
 |       3   3/11/04  Kirkland   Updated language for float16 number handling. | 
 |                               Added bit encodings for half values. | 
 |                               Added issue dealing with name "half". | 
 |  | 
 |       4   7/23/04  Kirkland   Added alternative encodings options for | 
 |                               float16 format. | 
 |  | 
 |       5   9/17/04  Kirkland   Updated to reference OpenGL 2.0 spec. | 
 |  | 
 |       6   10/1/04  Kirkland   Updated IP section. |