blob: cb41eab651e2d41429dfca35212fbdb5475e1e44 [file] [log] [blame]
Name
AMD_gpu_shader_int16
Name Strings
GL_AMD_gpu_shader_int16
Contact
Dominik Witczak, AMD (dominik.witczak 'at' amd.com)
Contributors
Daniel Rakos, AMD
Matthaeus G. Chajdas, AMD
Quentin Lin, AMD
Rex Xu, AMD
Timothy Lottes, AMD
Zhi Cai, AMD
Status
Shipping.
Version
Last Modified Date: 03/28/2018
Author Revision: #2
Number
OpenGL Extension #507
Dependencies
This extension is written against version 4.50 of the OpenGL Shading
Language Specification.
GLSL 4.00 is required.
This extension interacts with AMD_gpu_shader_half_float.
This extension interacts with ARB_gpu_shader_int64.
This extension interacts with KHR_vulkan_glsl.
Overview
This extension was developed to allow implementations supporting 16-bit
integers to expose the feature in GLSL.
The extension introduces the following features for all shader types:
* new built-in functions to pack and unpack 32-bit integer types into a
two-component 16-bit integer vector;
* new built-in functions to convert half-precision floating-point
values to or from their 16-bit integer bit encodings;
* vector relational functions supporting comparisons of vectors of
16-bit integer types; and
* common functions abs, frexp, ldexp, sign, min, max, clamp, and mix
supporting arguments of 16-bit integer types.
New Procedures and Functions
NONE
New Tokens
NONE
Modifications to the OpenGL Shading Language Specification, Version 4.50
Including the following line in a shader can be used to control the
language features described in this extension:
#extension GL_AMD_gpu_shader_int16 : <behavior>
where <behavior> is as specified in section 3.3.
New preprocessor #defines are added to the OpenGL Shading Language:
#define GL_AMD_gpu_shader_int16 1
Additions to Chapter 3 of the OpenGL Shading Language Specification (Basics)
Modify Section 3.6, Keywords
(add the following to the list of reserved keywords at p. 18)
int16_t i16vec2 i16vec3 i16vec4 uint16_t u16vec2 u16vec3 u16vec4
Additions to Chapter 4 of the OpenGL Shading Language Specification
(Variables and Types)
Modify Section 4.1, Basic Types
(add to the basic "Transparent Types" table, p. 19)
+-----------+------------------------------------------------------------+
| Type | Meaning |
+-----------+------------------------------------------------------------+
| int16_t | a 16-bit signed integer |
| uint16_t | a 16-bit unsigned integer |
| i16vec2 | a two-component 16-bit signed integer vector |
| i16vec3 | a three-component 16-bit signed integer vector |
| i16vec4 | a four-component 16-bit signed integer vector |
| u16vec2 | a two-component 16-bit unsigned integer vector |
| u16vec3 | a three-component 16-bit unsigned integer vector |
| u16vec4 | a four-component 16-bit unsigned integer vector |
+-----------+------------------------------------------------------------+
Modify Section 4.1.3, Integers
(replace first paragraph of the section, p. 26)
Signed and unsigned integer variables are fully supported. In this
document, the term integer is meant to generally include both signed and
unsigned integers, including both 16-bit and 32-bit integers. Unsigned
integers of type uint16_t, u16vec2, u16vec3, and u16vec4 have exactly 16 bits
of precision, while unsigned integers of type uint, uvec2, uvec3, and
uvec4 have exactly 32 bits of precision. Signed integers of type int16_t,
i16vec2, i16vec3, and i16vec4 have exactly 16 bits of precision, while signed
integers of type int, ivec2, ivec3, and ivec4 have exactly 32 bits of precision.
Addition, subtraction, and shift operations resulting in overflow or underflow
will not cause any exceptions, nor will they saturate, rather they will "wrap"
to yield the low-order bits of the result. Divison and multiplication operations
resulting in overflow or underflow will not cause any exception but will result in
an undefined value.
Change "integer-suffix" definition:
"integer-suffix:
unsigned-suffix short-suffixopt
short-suffix
unsigned-suffix: one of
u U
short-suffix: one of
s S
Modify the next paragraph to say:
"No white space is allowed between the digits of an integer constant,
including after the leading 0 or after the leading 0x or 0X of a constant,
or before the integer-suffix. When tokenizing, the maximal token matching
the above will be recognized before a new token is started.
When the suffix is present, the literal type is determined as follows:
-------------------------------------
| suffix | type |
-------------------------------------
| no suffix | int |
| u or U | uint |
| s or S | int16_t |
| both u/U and s/S | uint16_t |
-------------------------------------
A leading unary minus sign (-) is interpreted as an arithmetic
unary negation, not as part of the constant. Hence, literals themselves
are always expressed with non-negative syntax, though they could result
in a negative value."
Modify subsection 4.1.10 Implicit Conversions to say:
"In some situations, an expression and its type will be implicitly
converted to a different type. Such conversion are classified into the
following types: integral promotions, floating-point promotions,
integral conversions, floating-point conversions, and
floating-integral conversions.
The following table shows allowed integral promotions:
--------------------------------------------------------
| Type of | Can be implicitly promoted to |
| expression | |
--------------------------------------------------------
| int16_t | int, int64_t, uint16_t |
| uint16_t | uint, uint64_t |
--------------------------------------------------------
| i16vec2 | ivec2, i64vec2, u64vec2 |
| u16vec2 | uvec2, u64vec2 |
--------------------------------------------------------
| i16vec3 | ivec3, i64vec3, u64vec3 |
| u16vec3 | uvec3, u64vec3 |
--------------------------------------------------------
| i16vec4 | ivec4, i64vec4, u64vec4 |
| u16vec4 | uvec4, u64vec4 |
--------------------------------------------------------
The following table shows allowed integral conversions:
-------------------------------------------------------------------------
| Type of | Can be implicitly converted to |
| expression | |
-------------------------------------------------------------------------
| int16_t | uint16_t, uint, uint64_t |
| i16vec2 | u16vec2, uvec2, u64vec2 |
| i16vec3 | u16vec3, uvec3, u64vec3 |
| i16vec4 | u16vec4, uvec4, u64vec4 |
| uint16_t | uint, uint64_t |
| u16vec2 | uvec2, u64vec2 |
| u16vec3 | uvec3, u64vec3 |
| u16vec4 | uvec4, u64vec4 |
| int | uint, uint64_t |
-------------------------------------------------------------------------
The following table shows allowed floating-integral conversions:
--------------------------------------------------------
| Type of | Can be implicitly converted to |
| expression | |
--------------------------------------------------------
| int16_t | double, float16_t, float |
| i16vec2 | dvec2, f16vec2, vec2 |
| i16vec3 | dvec3, f16vec3, vec3 |
| i16vec4 | dvec4, f16vec4, vec4 |
| uint16_t | double, float16_t, float |
| u16vec2 | dvec2, f16vec2, vec2 |
| u16vec3 | dvec3, f16vec3, vec3 |
| u16vec4 | dvec4, f16vec4, vec4 |
| int | float |
| ivec2 | vec2 |
| ivec3 | vec3 |
| ivec4 | vec4 |
| uint | float |
| uvec2 | vec2 |
| uvec3 | vec3 |
| uvec4 | vec4 |
--------------------------------------------------------
When performing implicit conversion for binary operators, there may be
multiple data types to which the two operands can be converted. For
example, when adding an int32_t value to a uint32_t value, both values
can be implicitly converted to uint32_t, float32_t, and double. In such
cases conversion happens as defined as follows:
(Note: In this paragraph vector and matrix types are referred to as
types derived from scalar types with the same bit width and bit
interpretation)
- If either operand has type double or derived from double,
the other shall be converted to double or derived type.
- Otherwise, if either operand has type float32_t or derived from
float32_t, the other shall be converted to float32_t or derived type.
- Otherwise, if either operand has type float16_t or derived from
float16_t, the other shall be converted to float16_t or derived type.
- Otherwise, the integral promotions shall be performed on both
operands. Then the following rules shall be applied to the promoted
operands:
- If both operands have the same type, no further conversion
is needed.
- Otherwise, if both operands have signed integer types or both
have unsigned integer types, the operand with the type of lesser
integer conversion rank shall be converted to the type of the
operand with greater rank.
- Otherwise, if the operand that has unsigned integer type has rank
greater than or equal to the rank of the type of the other
operand, the operand with signed integer type shall be converted
to the type of the operand with unsigned integer type.
- Otherwise, if the type of the operand with signed integer type can
represent all of the values of the type of the operand with
unsigned integer type, the operand with unsigned integer type
shall be converted to the type of the operand with signed
integer type.
- Otherwise, both operands shall be converted to the unsigned
integer type corresponding to the type of the operand with signed
integer type.
The conversions listed in the following subsections are done only as
indicated by other sections of this specification.
Every integer type has an integer conversion rank defined as follows:
- No two signed integer types have the same rank.
- The rank of a scalar signed integer type shall be greater than the rank
of any scalar signed integer type with a smaller size.
- The rank of any vector signed integer type is equal to the rank of the
base scalar signed integer type.
- The rank of int64_t shall be greater than the rank of int32_t, which
shall be greater than the rank of int16_t.
- The rank of any scalar unsigned integer type shall equal the rank of
the corresponding scalar signed integer type.
- The rank of any vector unsigned integer type is equal to the rank of
the respective scalar unsigned integer type.
Additions to Chapter 5 of the OpenGL Shading Language Specification
(Operators and Expressions)
Modify Section 5.4.1, Conversion and Scalar Constructors
(add after first list of constructor examples on p. 97)
bool(int16_t) // converts a 16-bit signed integer value to a Boolean
// value.
bool(uint16_t) // converts a 16-bit unsigned integer value to a Boolean
// value.
double(int16_t) // converts a 16-bit signed integer value to a double
// value.
double(uint16_t) // converts a 16-bit unsigned integer value to a double
// value.
float(int16_t) // converts a 16-bit signed integer value to a float
// value.
float(uint16_t) // converts a 16-bit unsigned integer value to a float
// value.
float16_t(int16_t) // converts a 16-bit signed integer value to a 16-bit
// float value.
float16_t(uint16_t) // converts a 16-bit unsigned integer value to a 16-bit
// float value.
int16_t(bool) // converts a Boolean value to a 16-bit signed integer
// value.
int16_t(double) // converts a double value to a 16-bit signed integer
// value.
int16_t(float) // converts a float value to a 16-bit signed integer
// value.
int16_t(float16_t) // converts a 16-bit float value to a 16-bit signed
// integer value.
int16_t(int64_t) // converts a 64-bit signed integer value to a 16-bit
// signed integer value.
int16_t(int) // converts a signed integer value to a 16-bit signed
// integer value.
int16_t(uint) // converts an unsigned integer value to a 16-bit signed
// integer value.
int16_t(uint16_t) // converts a 16-bit unsigned integer value to a 16-bit
// signed integer value.
int16_t(uint64_t) // converts a 64-bit unsigned integer value to a 16-bit
// signed integer value.
int(int16_t) // converts a 16-bit signed integer value to a signed
// integer value.
int(uint16_t) // converts a 16-bit unsigned integer value to a signed
// integer value.
int64_t(int16_t) // converts a 16-bit signed integer value to a 64-bit
// signed integer value.
int64_t(uint16_t) // converts a 16-bit unsigned integer value to a 64-bit
// signed integer value.
uint16_t(bool) // converts a Boolean value to a 16-bit unsigned integer
// value.
uint16_t(double) // converts a double value to a 16-bit unsigned integer
// value.
uint16_t(float) // converts a float value to a 16-bit unsigned integer
// value.
uint16_t(float16_t) // converts a 16-bit float value to a 16-bit unsigned
// integer value.
uint16_t(int) // converts a signed integer value to a 16-bit unsigned
// integer value.
uint16_t(int16_t) // converts a 16-bit signed integer value to a 16-bit
// unsigned integer value.
uint16_t(uint) // converts an unsigned integer value to a 16-bit unsigned
// integer value.
uint16_t(int64_t) // converts a 64-bit signed integer value to a 16-bit
// unsigned integer value.
uint16_t(uint64_t) // converts a 64-bit unsigned integer value to a 16-bit
// unsigned integer value.
uint(int16_t) // converts a 16-bit signed integer value to an unsigned
// integer value.
uint(uint16_t) // converts a 16-bit unsigned integer value to an unsigned
// integer value.
uint64_t(int16_t) // converts a 16-bit signed integer value to a 64-bit
// unsigned integer value.
uint64_t(uint16_t) // converts a 16-bit unsigned integer value to a 64-bit
// unsigned integer value.
(modify second sentence of first paragraph on p. 98)
... is dropped. It is undefined to convert a negative floating-point value
to an uint or uint16_t.
(replace third paragraph on p. 98)
The constructors int(uint) and int16_t(uint16_t) preserve the bit pattern
in the argument, which will change the argument's value if its sign bit is
set. The constructor uint(int) and uint16_t(int16_t) preserve the bit
pattern in the argument, which will change its value if it is negative.
Additions to Chapter 6 of the OpenGL Shading Language Specification
(Statements and Structure)
Modify Section 6.1, Function Defintions
(replace second rule in third paragraph on p. 113)
2. A match involving a conversion from a signed integer, unsigned
integer, or floating-point type to a similar type having a larger
number of bits is better than a match involving any other implicit
conversion.
Additions to Chapter 8 of the OpenGL Shading Language Specification
(Built-in Functions)
(insert after third sentence of last paragraph on p. 132)
... genUType is used as the argument. Where the input arguments (and
corresponding output) can be int16_t, i16vec2, i16vec3, i16vec4,
genI16Type is used as the argument. Where the input arguments (and
corresponding output) can be uint16_t, u16vec2, u16vec3, u16vec4,
genU16Type is used as the argument.
Modify Section 8.3, Common Functions
(add to the table of common functions on p. 136)
+-------------------------------------------------+----------------------------------------------------+
| Syntax | Desciption |
+-------------------------------------------------+----------------------------------------------------+
| genI16Type abs(genI16Type x) | Returns x if x >= 0; otherwise it returns -x. |
+-------------------------------------------------+----------------------------------------------------+
| genI16Type sign(genI16Type x) | Returns 1 if x > 0, 0 if x = 0, or -1 if x < 0. |
+-------------------------------------------------+----------------------------------------------------+
| genI16Type min(genI16Type x, | Returns y if y < x; otherwise it returns x. |
| genI16Type y) | |
| genI16Type min(genI16Type x, | |
| int16_t y) | |
| genU16Type min(genU16Type x, | |
| genU16Type y) | |
| genU16Type min(genU16Type x, | |
| uint16_t y) | |
+-------------------------------------------------+----------------------------------------------------+
| genI16Type max(genI16Type x, | Returns y if x < y; otherwise it returns x. |
| genI16Type y) | |
| genI16Type max(genI16Type x, | |
| int16_t y) | |
| genU16Type max(genU16Type x, | |
| genU16Type y) | |
| genU16Type max(genU16Type x, | |
| uint16_t y) | |
+-------------------------------------------------+----------------------------------------------------+
| genI16Type clamp(genI16Type x, | Returns min(max(x, minVal), maxVal). |
| genI16Type minVal, | |
| genI16Type maxVal) | Results are undefined if minVal > maxVal. |
| genI16Type clamp(genI16Type x, | |
| int16_t minVal, | |
| int16_t maxVal) | |
| genU16Type clamp(genU16Type x, | |
| genU16Type minVal, | |
| genU16Type maxVal) | |
| genU16Type clamp(genU16Type x, | |
| uint16_t minVal, | |
| uint16_t maxVal) | |
+-------------------------------------------------+----------------------------------------------------+
| genI16Type mix(genI16Type x, | Selects which vector each returned component comes |
| genI16Type y, | from. For a component of a that is false, the |
| genBType a) | corresponding component of x is returned. For a |
| genU16Type mix(genU16Type x, | component of a that is true, the corresponding |
| genU16Type y, | component of y is returned. |
| genBType a) | |
+-------------------------------------------------+----------------------------------------------------+
| genI16Type float16BitsToInt16(genF16Type value) | Returns a signed or unsigned 16-bit integer value |
| genU16Type float16BitsToUint16(genF16Type value)| representing the encoding of a 16-bit float. The |
| | half floating-point value's bit-level |
| | representation is preserved |
+-------------------------------------------------+----------------------------------------------------+
| genF16Type int16BitsToFloat16(genI16Type value) | Returns a half-floating point value corresponding |
| genF16Type uint16BitsToFloat16(genU16Type value)| to a signed or unsigned 16-bit integer encoding of |
| | a 16-bit float. If a NaN is passed in, it will not |
| | signal, and the resulting value is unspecified. If |
| | an Inf is passed in, the resulting value is the |
| | corresponding Inf. |
+-------------------------------------------------+----------------------------------------------------+
| genF16Type frexp(genF16Type x, | Splits x into a floating-point significand in the |
| out genI16Type exp) | range [0.5, 1.0) and an integral exponent of two, |
| | such that: |
| | |
| | x = significand * 2 ** exponent |
| | |
| | The significand is returned by the function and |
| | the exponent is returned in the parameter exp. For |
| | a floating-point value of zero, the significand |
| | and exponent are both zero. For a floating-point |
| | value that is an infinity or is not a number, the |
| | results are undefined. |
| | |
| | If an implementation supports negative 0, |
| | frexp(-0) should return -0; otherwise it will |
| | return 0. |
+-------------------------------------------------+----------------------------------------------------+
| genF16Type ldexp(genF16Type x, | Returns x * (2 ** exp). |
| genI16Type exp) | |
+-------------------------------------------------+----------------------------------------------------+
Modify Section 8.4, Floating-Point and Integer Pack and Unpack Functions
(add to the table of pack and unpack functions on p. 149
+-----------------------------------+------------------------------------------------------+
| Syntax | Desciption |
+-----------------------------------+------------------------------------------------------+
| | Returns an unsigned 32- or 64-bit integer obtained |
| int packInt2x16 (i16vec2 v) | by packing the components of a two- or |
| int64_t packInt4x16 (i16vec4 v) | four-component 16-bit signed or unsigned integer |
| uint packUint2x16(u16vec2 v) | vector, respectively. The first vector component |
| uint64_t packUint4x16(u16vec4 v) | specifies the 16 least significant bits; the |
| | last component specifies the 16 most significant |
| | bits. |
+-----------------------------------+------------------------------------------------------+
| | Returns a signed or unsigned integer vector built |
| i16vec2 unpackInt2x16 (int v)| from a 32- or 64-bit signed or unsigned integer |
| i16vec4 unpackInt4x16 (int64_t v)| scalar, respectively. The first component of the |
| u16vec2 unpackUint2x16(uint v)| vector contains the 16 least significant bits of the |
| u16vec4 unpackUint4x16(uint64_t v)| input; the last component specifies the 16 most |
| | significant bits. |
| | |
+-----------------------------------+------------------------------------------------------+
Modify Section, 8.7, Vector Relational Functions
Modify the first table to state:
+-------------+-----------------------------+
| Placeholder | Specific Types Allowed |
+-------------+-----------------------------+
| i16vec | i16vec2, i16vec3, i16vec4 |
| u16vec | u16vec2, u16vec3, u16vec4 |
+-------------+-----------------------------+
(add to the table of vector relational functions at the bottom of p. 147)
+-------------------------------------------+-----------------------------------------------+
| Syntax | Desciption |
+-------------------------------------------+-----------------------------------------------+
| bvec lessThan(i16vec x, i16vec y) | Returns the component-wise compare of x < y. |
| bvec lessThan(u16vec x, u16vec y) | |
+-------------------------------------------+-----------------------------------------------+
| bvec lessThanEqual(i16vec x, i16vec y) | Returns the component-wise compare of x <= y. |
| bvec lessThanEqual(u16vec x, u16vec y) | |
+-------------------------------------------+-----------------------------------------------+
| bvec greaterThan(i16vec x, i16vec y) | Returns the component-wise compare of x > y. |
| bvec greaterThan(u16vec x, u16vec y) | |
+-------------------------------------------+-----------------------------------------------+
| bvec greaterThanEqual(i16vec x, i16vec y) | Returns the component-wise compare of x >= y. |
| bvec greaterThanEqual(u16vec x, u16vec y) | |
+-------------------------------------------+-----------------------------------------------+
| bvec equal(i16vec x, i16vec y) | Returns the component-wise compare of x == y. |
| bvec equal(u16vec x, u16vec y) | |
+-------------------------------------------+-----------------------------------------------+
| bvec notEqual(i16vec x, i16vec y) | Returns the component-wise compare of x != y. |
| bvec notEqual(u16vec x, u16vec y) | |
+-------------------------------------------+-----------------------------------------------+
Modify language in the Overview section of GL_KHR_vulkan_glsl
Replace the following sentence:
The constant_id can only be applied to a scalar *int*, a scalar *float*
or a scalar *bool*.
with:
The constant_id can only be applied to a scalar *int* (incl. 16-bit signed
and unsigned integers), a scalar *float* or a scalar *bool*.
Dependencies on AMD_gpu_shader_half_float
If the shader enables only AMD_gpu_shader_int16, but not AMD_gpu_shader_half_float
then:
* the table describing floating-integral conversions is discarded.
* the float16BitsTo{Int, Uint}16(), {int, uint}16BitsToFloat16(), frexp()
and ldexp() functions are unavailable.
Dependencies on ARB_gpu_shader_int64:
If the shader enables only AMD_gpu_shader_int16, but not ARB_gpu_shader_int64
then:
* all references to int64_t and uint64_t should be ignored.
Dependencies on KHR_vulkan_glsl:
If the shader only enables AMD_gpu_shader_int16, but not KHR_vulkan_glsl,
then any changes to the language of the latter specification should be discarded.
Dependencies on AMD_shader_trinary_minmax
If the shader enables AMD_shader_trinary_minmax, this extension adds
additional common functions.
Modify Section 8.3, Common Functions
(add to the table of common functions on p. 144)
+-------------------------------------------+-----------------------------------------------+
| Syntax | Description |
+-------------------------------------------+-----------------------------------------------+
| genI16Type min3(genI16Type x, | Returns the per-component minimum value of x, |
| genI16Type y, | y, and z. |
| genI16Type z) | |
| genU16Type min3(genU16Type x, | |
| genU16Type y, | |
| genU16Type z) | |
+-------------------------------------------+-----------------------------------------------+
| genI16Type max3(genI16Type x, | Returns the per-component maximum value of x, |
| genI16Type y, | y, and z. |
| genI16Type z) | |
| genU16Type max3(genU16Type x, | |
| genU16Type y, | |
| genU16Type z) | |
+-------------------------------------------+-----------------------------------------------+
| genI16Type mid3(genI16Type x, | Returns the per-component median value of x, |
| genI16Type y, | y, and z. |
| genI16Type z) | |
| genU16Type mid3(genU16Type x, | |
| genU16Type y, | |
| genU16Type z) | |
+-------------------------------------------+-----------------------------------------------+
Errors
None.
New State
None.
New Implementation Dependent State
None.
Issues
(1) Should the new int16_t and uint16_t types support types as members of
uniform blocks and shader storage buffer blocks?
RESOLVED: Yes, both types can be used in both SSBOs and UBOs, each consuming
2 basic machine units.
(2) Should we support int16_t and uint16_t types as members of uniform blocks,
shader storage buffer blocks, or as transform feedback varyings?
RESOLVED: Yes, support all of them. both types consume two basic machine
units. Some examples:
struct S {
uint16_t x; // rule 1: align = 2, takes offsets 0-1
u16vec2 y; // rule 2: align = 4, takes offsets 4-7
u16vec3 z; // rule 3: align = 8, takes offsets 8-13
};
layout(std140) uniform B1 {
uint16_t a; // rule 1: align = 2, takes offsets 0-1
u16vec2 b; // rule 2: align = 4, takes offsets 4-7
u16vec3 c; // rule 3: align = 8, takes offsets 8-13
uint16_t d[2]; // rule 4: align = 16, array stride = 16,
// takes offsets 16-47
S g; // rule 9: align = 16, g.x takes offsets
// 48-49, g.y takes offsets 52-55,
// g.z takes offsets 56-63
S h[2]; // rule 10: align = 16, array stride = 16, h[0]
// takes offsets 64-77, h[1] takes
// offsets 78-93
};
layout(std430) buffer B2 {
uint16_t o; // rule 1: align = 2, takes offsets 0-1
u16vec2 p; // rule 2: align = 4, takes offsets 4-7
u16vec3 q; // rule 3: align = 8, takes offsets 8-13
uint16_t r[2]; // rule 4: align = 2, array stride = 2, takes
// offsets 14-17
S u; // rule 9: align = 8, u.x takes offsets
// 24-25, u.y takes offsets 28-31, u.z
// takes offsets 32-37
S v[2]; // rule 10: align = 8, array stride = 16, v[0]
// takes offsets 40-55, v[1] takes
// offsets 56-71
};
(3) Are interactions with GL_AMD_shader_ballot supported?
(4) Are interactions with GL_AMD_shader_explicit_vertex_parameter supported?
(5) Are interactions with GL_AMD_shader_trinary_minmax supported?
RESOLVED: Not yet. These will be resolved at a later time.
(6) Does this extension provide a new subpassLoad() function prototype which
returns a(n) {u}int16 vector value?
RESOLVED: No. This functionality may be added at a later time in a separate
extension.
(7) Can the new int16 and uint16 types be used as array indexes?
RESOLVED: No.
Revision History
Rev. Date Author Changes
---- -------- -------- -----------------------------------------
2 03/28/2018 rexu Add interactions with AMD_shader_trinary_minmax.
New common functions are added to support
16-bit integer type in these trinary operations.
1 06/08/2017 dwitczak First release.