skia / external / github.com / KhronosGroup / OpenGL-Registry / eae1d6dde1e283f6fdf803274a2484007e592599 / . / extensions / ARB / ARB_half_float_pixel.txt

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