skia / external / github.com / KhronosGroup / OpenGL-Registry / bf41341037b0fc7f1c7c6c0358b9c27afdac254a / . / extensions / APPLE / APPLE_texture_packed_float.txt

Name | |

APPLE_texture_packed_float | |

Name Strings | |

GL_APPLE_texture_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 #195 | |

Dependencies | |

Requires OpenGL ES 2.0. | |

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

OES_texture_half_float affects the definition of this specification. | |

EXT_texture_storage affects the definition of this specification. | |

Overview | |

This extension adds two new 3-component floating-point texture formats | |

that fit within a single 32-bit word called R11F_G11F_B10F and RGB9_E5 | |

The first RGB format, R11F_G11F_B10F, 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, positivedenorms, and positive NaN values are representable. | |

The value of the fourth component returned by a texture fetch is always | |

1.0. | |

The second RGB format, RGB9_E5, stores a single 5-bit exponent (biased | |

up by 15) and three 9-bit mantissas for each respective component. | |

There is no sign bit so all three components must be non-negative. | |

The fractional mantissas are stored without an implied 1 to the left | |

of the decimal point. Neither infinity nor not-a-number (NaN) are | |

representable in this shared exponent format. | |

New Procedures and Functions | |

None | |

New Tokens | |

Accepted by the <type> parameter of TexImage2D and TexSubImage2D: | |

UNSIGNED_INT_10F_11F_11F_REV_APPLE 0x8C3B | |

UNSIGNED_INT_5_9_9_9_REV_APPLE 0x8C3E | |

Accepted by the <internalformat> parameter of TexStorage2DEXT: | |

R11F_G11F_B10F_APPLE 0x8C3A | |

RGB9_E5_APPLE 0x8C3D | |

Changes to Chapter 2 of the OpenGL ES 2.0.25 Specification | |

(OpenGL Operation) | |

Add two new sections after Section "Floating-Point Computation": | |

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

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

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

Changes to Chapter 3 of the OpenGL ES 2.0.25 Specification (Rasterization) | |

Add to Table 3.2, p. 62: | |

type Parameter Corresponding Special | |

Token Name GL Data Type Interpretation | |

---------------------------------------- ------------- -------------- | |

UNSIGNED_INT_10F_11F_11F_REV_APPLE uint Yes | |

UNSIGNED_INT_5_9_9_9_REV_APPLE uint Yes | |

Add to Table 3.4, p. 63: | |

Format Type Bytes per Pixel | |

---------------- ------------------------------------ --------------- | |

RGB UNSIGNED_INT_10F_11F_11F_REV_APPLE 4 | |

RGB UNSIGNED_INT_5_9_9_9_REV_APPLE 4 | |

Add to Table 3.5, p. 64: | |

type Parameter GL Data Number of Matching | |

Token Name Type Components Pixel Formats | |

---------------------------------- ------- ---------- ------------- | |

UNSIGNED_INT_10F_11F_11F_REV_APPLE uint 3 RGB | |

UNSIGNED_INT_5_9_9_9_REV_APPLE uint 3 RGB | |

Add the following to section 3.6.2 Transfer of Pixel Rectangles, | |

subsection Unpacking | |

UNSIGNED_INT_10F_11F_11F_REV_APPLE: | |

31 30 ... 23 22 21 20 ... 12 11 10 9 ... 1 0 | |

+---------------+---------------+---------------+ | |

| 3rd | 2nd | 1st | | |

+---------------+---------------+---------------+ | |

UNSIGNED_INT_5_9_9_9_REV_APPLE: | |

31 30 ... 27 26 25 24 ... 18 17 16 15 ... 9 8 7 6 5 4 ... 0 | |

+------------+---------------+---------------+---------------+ | |

| 4th | 3rd | 2nd | 1st | | |

+------------+---------------+---------------+---------------+ | |

Add Section 3.7.14, Shared Exponent Texture Color Conversion | |

If the currently bound texture's <format> is RGB and <type> is | |

UNSIGNED_INT_5_9_9_9_REV_APPLE, the red, green, blue, and shared | |

bits are converted to color components (prior to filtering) using | |

shared exponent decoding. The 1st, 2nd, 3rd, and 4th components | |

are called p_red, p_green, p_blue, and p_exp respectively and are | |

treated as unsigned integers. They are converted to floating-point | |

red, green, and blue as follows: | |

red = p_red * 2^(p_exp - B - N) | |

green = p_green * 2^(p_exp - B - N) | |

blue = p_blue * 2^(p_exp - B - N) | |

where B is 15 (the exponent bias) and N is 9 (the number of mantissa | |

bits)." | |

Errors | |

Relaxation of INVALID_ENUM errors | |

--------------------------------- | |

TexImage2D, and TexSubImage2D accept the new | |

UNSIGNED_INT_10F_11F_11F_REV_APPLE and | |

UNSIGNED_INT_5_9_9_9_REV_APPLE token for <type>. | |

TexStorage2DEXT accepts the new R11F_G11F_B10F_APPLE and | |

RGB9_E5_APPLE token for <internalformat>. | |

New errors | |

---------- | |

INVALID_OPERATION is generated by TexImage2D and TexSubImage2D | |

if <type> is UNSIGNED_INT_10F_11F_11F_REV_APPLE or | |

UNSIGNED_INT_5_9_9_9_REV_APPLE and <format> is not RGB. | |

UNSIGNED_INT_10F_11F_11F_REV_APPLE is implied as the <type> when | |

TexStorage2DEXT is called with <internalformat> | |

R11F_G11F_B10F_APPLE. Thus, INVALID_OPERATION is generated by TexSubImage2D | |

if <type> is not UNSIGNED_INT_10F_11F_11F_REV_APPLE. | |

UNSIGNED_INT_5_9_9_9_REV_APPLE is implied as the <type> when | |

TexStorage2DEXT is called with <internalformat> | |

RGB9_E5_APPLE. Thus, INVALID_OPERATION is generated by TexSubImage2D | |

if <type> is not UNSIGNED_INT_5_9_9_9_REV_APPLE. | |

Dependencies on OES_texture_half_float | |

If OES_texture_half_float is not supported, modify fifth paragraph | |

of 3.7.1 Texture Image Specification, p. 67: | |

"The selected groups are processed as described in section 3.6.2, stopping | |

after final expansion to RGBA. If the internal format of the texture is | |

fixed-point, components are clamped to [0,1]. Otherwise, values are not | |

modified." | |

Modify first sentence of "Unpacking", p. 62: | |

"Data are taken from client memory as a sequence of one of the GL data | |

types listed in Table 3.2. These elements are..." | |

Additionally, ignore all references to RGBA16F_EXT, RGB16F_EXT, | |

RG16F_EXT, R16F_EXT, HALF_FLOAT_OES and half. | |

Dependencies on EXT_texture_storage | |

If EXT_texture_storage is not supported, remove all references to | |

TexStorage2DEXT. | |

New Implementation Dependent State | |

None | |

Revision History | |

1.0 2014/02/13 rogoyski Initial version | |