| Name |
| |
| ARB_gpu_shader_int64 |
| |
| Name Strings |
| |
| GL_ARB_gpu_shader_int64 |
| |
| Contact |
| |
| Daniel Rakos, AMD (daniel.rakos 'at' amd.com) |
| |
| Contributors |
| |
| Daniel Rakos, AMD |
| Graham Sellers, AMD |
| |
| Notice |
| |
| Copyright (c) 2015 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 June 26, 2015. |
| Ratified by the Khronos Board of Promoters on August 7, 2015. |
| |
| Version |
| |
| Last Modified Date: 02/03/2015 |
| Author Revision: 1 |
| |
| Number |
| |
| ARB Extension #178 |
| |
| Dependencies |
| |
| This extension is written against the OpenGL 4.5 (Core Profile) |
| Specification. |
| |
| This extension is written against version 4.50 of the OpenGL Shading |
| Language Specification. |
| |
| OpenGL 4.0 and GLSL 4.00 are required. |
| |
| This extension interacts with AMD_gpu_shader_int64. |
| |
| This extension interacts with NV_gpu_shader5. |
| |
| This extension interacts with NV_shader_buffer_load. |
| |
| This extension interacts with NV_vertex_attrib_integer_64bit. |
| |
| |
| Overview |
| |
| The extension introduces the following features for all shader types: |
| |
| * support for 64-bit scalar and vector integer data types, including |
| uniform API, uniform buffer object, transform feedback, and shader |
| input and output support; |
| |
| * new built-in functions to pack and unpack 64-bit integer types into a |
| two-component 32-bit integer vector; |
| |
| * new built-in functions to convert double-precision floating-point |
| values to or from their 64-bit integer bit encodings; |
| |
| * vector relational functions supporting comparisons of vectors of |
| 64-bit integer types; and |
| |
| * common functions abs, sign, min, max, clamp, and mix supporting |
| arguments of 64-bit integer types. |
| |
| |
| New Procedures and Functions |
| |
| void Uniform1i64ARB(int location, int64 x); |
| void Uniform2i64ARB(int location, int64 x, int64 y); |
| void Uniform3i64ARB(int location, int64 x, int64 y, int64 z); |
| void Uniform4i64ARB(int location, int64 x, int64 y, int64 z, int64 w); |
| void Uniform1i64vARB(int location, sizei count, const int64 *value); |
| void Uniform2i64vARB(int location, sizei count, const int64 *value); |
| void Uniform3i64vARB(int location, sizei count, const int64 *value); |
| void Uniform4i64vARB(int location, sizei count, const int64 *value); |
| |
| void Uniform1ui64ARB(int location, uint64 x); |
| void Uniform2ui64ARB(int location, uint64 x, uint64 y); |
| void Uniform3ui64ARB(int location, uint64 x, uint64 y, uint64 z); |
| void Uniform4ui64ARB(int location, uint64 x, uint64 y, uint64 z, uint64 w); |
| void Uniform1ui64vARB(int location, sizei count, const uint64 *value); |
| void Uniform2ui64vARB(int location, sizei count, const uint64 *value); |
| void Uniform3ui64vARB(int location, sizei count, const uint64 *value); |
| void Uniform4ui64vARB(int location, sizei count, const uint64 *value); |
| |
| void GetUniformi64vARB(uint program, int location, int64 *params); |
| void GetUniformui64vARB(uint program, int location, uint64 *params); |
| void GetnUniformi64vARB(uint program, int location, sizei bufSize, |
| int64 *params); |
| void GetnUniformui64vARB(uint program, int location, sizei bufSize, |
| uint64 *params); |
| |
| void ProgramUniform1i64ARB(uint program, int location, int64 x); |
| void ProgramUniform2i64ARB(uint program, int location, int64 x, int64 y); |
| void ProgramUniform3i64ARB(uint program, int location, int64 x, int64 y, |
| int64 z); |
| void ProgramUniform4i64ARB(uint program, int location, int64 x, int64 y, |
| int64 z, int64 w); |
| void ProgramUniform1i64vARB(uint program, int location, sizei count, |
| const int64 *value); |
| void ProgramUniform2i64vARB(uint program, int location, sizei count, |
| const int64 *value); |
| void ProgramUniform3i64vARB(uint program, int location, sizei count, |
| const int64 *value); |
| void ProgramUniform4i64vARB(uint program, int location, sizei count, |
| const int64 *value); |
| |
| void ProgramUniform1ui64ARB(uint program, int location, uint64 x); |
| void ProgramUniform2ui64ARB(uint program, int location, uint64 x, uint64 y); |
| void ProgramUniform3ui64ARB(uint program, int location, uint64 x, uint64 y, |
| uint64 z); |
| void ProgramUniform4ui64ARB(uint program, int location, uint64 x, uint64 y, |
| uint64 z, uint64 w); |
| void ProgramUniform1ui64vARB(uint program, int location, sizei count, |
| const uint64 *value); |
| void ProgramUniform2ui64vARB(uint program, int location, sizei count, |
| const uint64 *value); |
| void ProgramUniform3ui64vARB(uint program, int location, sizei count, |
| const uint64 *value); |
| void ProgramUniform4ui64vARB(uint program, int location, sizei count, |
| const uint64 *value); |
| |
| |
| New Tokens |
| |
| Returned by the <type> parameter of GetActiveAttrib, GetActiveUniform, and |
| GetTransformFeedbackVarying: |
| |
| INT64_ARB 0x140E |
| UNSIGNED_INT64_ARB 0x140F |
| |
| INT64_VEC2_ARB 0x8FE9 |
| INT64_VEC3_ARB 0x8FEA |
| INT64_VEC4_ARB 0x8FEB |
| UNSIGNED_INT64_VEC2_ARB 0x8FF5 |
| UNSIGNED_INT64_VEC3_ARB 0x8FF6 |
| UNSIGNED_INT64_VEC4_ARB 0x8FF7 |
| |
| |
| Additions to Chapter 7 of the OpenGL 4.5 (Core Profile) Specification |
| (Program Objects) |
| |
| Modify Section 7.3.1, Program Interfaces |
| |
| (add to Table 7.3, OpenGL Shading Language type tokens, p. 112) |
| |
| +----------------------------+--------------+--------+--------+--------+ |
| | Type Name Token | Keyword | Attrib | Xfb | Buffer | |
| +----------------------------+--------------+--------+--------+--------+ |
| | INT64_ARB | int64_t | * | * | * | |
| | INT64_VEC2_ARB | i64vec2 | * | * | * | |
| | INT64_VEC3_ARB | i64vec3 | * | * | * | |
| | INT64_VEC4_ARB | i64vec4 | * | * | * | |
| | UNSIGNED_INT64_ARB | uint64_t | * | * | * | |
| | UNSIGNED_INT64_VEC2_ARB | u64vec2 | * | * | * | |
| | UNSIGNED_INT64_VEC3_ARB | u64vec3 | * | * | * | |
| | UNSIGNED_INT64_VEC4_ARB | u64vec4 | * | * | * | |
| +----------------------------+--------------+--------+--------+--------+ |
| |
| Modify Section 7.6, Uniform Variables |
| |
| (modify second paragraph on p. 125) |
| |
| Scalar, vector, and matrix uniforms with double-precision components, |
| and scalar and vector uniforms with 64-bit integer components will consume |
| no more than twice the number of components of equivalent uniforms with |
| single-precision components. |
| |
| |
| Modify Section 7.6.1, Loading Uniform Variables |
| |
| (add to the list of commands in first paragraph on p. 132) |
| |
| void Uniform{1,2,3,4}{i64,ui64}ARB(int location, T value); |
| void Uniform{1,2,3,4}{i64,ui64}vARB(int location, const T *value); |
| |
| (insert after sixth paragraph on p. 132) |
| |
| The Uniform*i64{v}ARB and Uniform*ui{v}ARB commands will load count sets |
| of one to four 64-bit signed or unsigned integer values into a uniform |
| location defined as a 64-bit signed or unsigned integer scalar or vector |
| types. |
| |
| (add to the list of commands in first paragraph on p. 134) |
| |
| void ProgramUniform{1,2,3,4}{i64,ui64}ARB(uint program, int location, |
| T value); |
| void ProgramUniform{1,2,3,4}{i64,ui64}vARB(uint program, int location, |
| const T *value); |
| |
| |
| Modify Section 7.6.2.1, Uniform Buffer Object Storage |
| |
| (modify the first two bullets of the first paragraph on p. 136) |
| |
| * Members of type bool int, uint, float, double, int64_t, and uint64_t |
| are respectively extracted from a buffer object by reading a single |
| uint, int, uint, float, double, int64_t, or uint64_t value at the |
| specified offset. |
| |
| * Vectors with N elements with basic data types of bool, int, uint, |
| float, double, int64_t, or uint64_t are extracted as N values in |
| consecutive memory locations beginning at the specified offset, with |
| components stored in order with the first (X) component at the |
| lowest offset. The GL data type used for component extraction is |
| derived according to the rules for scalar members above. |
| |
| |
| Modify Section 7.13, Shader, Program, and Program Pipeline Queries |
| |
| (add to the list of commands in last paragraph on p. 162) |
| |
| void GetUniformi64vARB(uint program, int location, int64 *params); |
| void GetUniformui64vARB(uint program, int location, uint64 *params); |
| void GetnUniformi64vARB(uint program, int location, sizei bufSize, |
| int64 *params); |
| void GetnUniformui64vARB(uint program, int location, sizei bufSize, |
| uint64 *params); |
| |
| |
| Additions to Chapter 11 of the OpenGL 4.5 (Core Profile) Specification |
| (Programmable Vertex Processing) |
| |
| Modify Section 11.1.1, Vertex Attributes |
| |
| (modify third sentence of second paragraph on p. 368) |
| |
| ... hardware resources. For the purposes of this test, attribute variables |
| of the type dvec3, dvec4, dmat2x3, dmat2x3, dmat3, dmat3x4, dmat4x3, |
| dmat4, i64vec3, i64vec4, u64vec3, and u64vec4 may count as consuming twice |
| as many attributes as equivalent single-precision types. While these types |
| use the same number of generic attributes as their single-precision |
| vectors of internal storage for each three- or four-component |
| double-precision or 64-bit integer vector. |
| |
| |
| Modify Section 11.1.2.1, Output Variables |
| |
| (modify last sentence of fourth paragraph on p. 369) |
| |
| ... multiple components. Each component of variables declared as double- |
| precision floating point scalars, vectors, or matrices, or declared as |
| 64-bit integer scalars or vectors may be counted as consuming two |
| components. |
| |
| (modify third bullet of the first paragraph on p. 373) |
| |
| * any variable containing double-precision floating-point or 64-bit |
| integer components |
| |
| - has an xfb_offset layout qualifier that is not a multiple of eight; |
| or |
| - is associated with a binding point with an xfb_stride layout |
| qualifier that is not a multiple of eight; |
| |
| (modify second paragraph on p. 373) |
| |
| For transform feedback purposes, each component of outputs declared as |
| double-precision floating-point scalars, vectors, or matrices, or 64-bit |
| integer scalars or vectors are considered to consume eight basic machine |
| units, and each component of any other type is considered to consume four |
| basic machine units. |
| |
| |
| 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_ARB_gpu_shader_int64 : <behavior> |
| |
| where <behavior> is as specified in section 3.3. |
| |
| New preprocessor #defines are added to the OpenGL Shading Language: |
| |
| #define GL_ARB_gpu_shader_int64 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. 17) |
| |
| int64_t i64vec2 i64vec3 i64vec4 uint64_t u64vec2 u64vec3 u64vec4 |
| |
| |
| 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. 21) |
| |
| +-----------+------------------------------------------------------------+ |
| | Type | Meaning | |
| +-----------+------------------------------------------------------------+ |
| | int64_t | a 64-bit signed integer | |
| | uint64_t | a 64-bit unsigned integer | |
| | i64vec2 | a two-component 64-bit signed integer vector | |
| | i64vec3 | a three-component 64-bit signed integer vector | |
| | i64vec4 | a four-component 64-bit signed integer vector | |
| | u64vec2 | a two-component 64-bit unsigned integer vector | |
| | u64vec3 | a three-component 64-bit unsigned integer vector | |
| | u64vec4 | a four-component 64-bit unsigned integer vector | |
| +-----------+------------------------------------------------------------+ |
| |
| |
| Modify Section 4.1.3, Integers |
| |
| (replace first paragraph of the section, p. 25) |
| |
| 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 32-bit and 64-bit integers. Unsigned |
| integers of type uint, uvec2, uvec3, and uvec4 have exactly 32 bits of |
| precision, while unsigned integers of type uint64_t, u64vec2, u64vec3, and |
| u64vec4 have exactly 64 bits of precision. Signed integers of type int, |
| ivec2, ivec3, and ivec4 have exactly 32 bits of precision, while signed |
| integers of type int64_t, i64vec2, i64vec3, and i64vec4 have exactly |
| 64 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. |
| |
| (add after the first paragraph of the section, p. 25) |
| |
| Variables with the types "int64_t" and "uint64_t" represent signed and |
| unsigned integer values, respectively, with exactly 64 bits of precision. |
| |
| (modify grammar rule for "integer-suffix", p. 26) |
| |
| integer-suffix: one of |
| u U l L ul UL |
| |
| (modify first sentence of second paragraph on p. 26) |
| |
| 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 suffix u, U, l, L, ul, or UL. |
| |
| (modify third sentence of second paragraph on p. 26) |
| |
| When the suffix u or U is present, the literal has type uint. When the |
| suffix l or L is present, the literal has type int64_t. When the suffix |
| ul or UL is present, the literal has type uint64_t. Otherwise, the type is |
| int. |
| |
| |
| Modify Section 4.1.10, Implicit Conversions |
| |
| (modify table of implicit conversions on p. 35) |
| |
| +----------------------+-------------------------------------------------+ |
| | Type of expression | Can be implicitly converted to | |
| +----------------------+-------------------------------------------------+ |
| | int | uint, int64_t, uint64_t, float, double | |
| | uint | uint64_t, float, double | |
| | int64_t | uint64_t, double | |
| | uint64_t | double | |
| | ivec2 | uvec2, i64vec2, u64vec2, vec2, dvec2 | |
| | ivec3 | uvec3, i64vec3, u64vec3, vec3, dvec3 | |
| | ivec4 | uvec4, i64vec4, u64vec4, vec4, dvec4 | |
| | uvec2 | u64vec2, vec2, dvec2 | |
| | uvec3 | u64vec3, vec3, dvec3 | |
| | uvec4 | u64vec4, vec4, dvec4 | |
| | i64vec2 | u64vec2, dvec2 | |
| | i64vec3 | u64vec3, dvec3 | |
| | i64vec4 | u64vec4, dvec4 | |
| | u64vec2 | dvec2 | |
| | u64vec3 | dvec3 | |
| | u64vec4 | dvec4 | |
| +----------------------+-------------------------------------------------+ |
| |
| |
| Modify Section 4.3.6, Output Variables |
| |
| (add new bullet to the list in the second paragraph on p. 49) |
| |
| * A 64-bit integer scalar or vector (int64_t, uint64_t, i64vec2, i64vec3, |
| i64vec4, u64vec2, u64vec3, u64vec4) |
| |
| |
| Additions to Chapter 5 of the OpenGL Shading Language Specification |
| (Operators and Expressions) |
| |
| Modify Section 5.4.1, Conversion and Scalar Constructors |
| |
| (add to the constructor propotype list on p. 95) |
| |
| int(int64_t) // converts a 64-bit signed integer to a 32-bit signed integer |
| int(uint64_t) // converts a 64-bit unsigned integer to a 32-bit signed integer |
| uint(int64_t) // converts a 64-bit signed integer to a 32-bit unsigned integer |
| uint(uint64_t) // converts a 64-bit unsigned integer to a 32-bit unsigned integer |
| bool(int64_t) // converts a 64-bit signed integer to a Boolean |
| bool(uint64_t) // converts a 64-bit unsigned integer to a Boolean |
| float(int64_t) // converts a 64-bit signed integer to a float |
| float(uint64_t) // converts a 64-bit unsigned integer to a float |
| double(int64_t) // converts a 64-bit signed integer to a double |
| double(uint64_t) // converts a 64-bit unsigned integer to a double |
| int64_t(int) // converts a 32-bit signed integer to a 64-bit signed integer |
| int64_t(uint) // converts a 32-bit unsigned integer to a 64-bit signed integer |
| int64_t(bool) // converts a Boolean to a 64-bit signed integer |
| int64_t(float) // converts a float to a 64-bit signed integer |
| int64_t(double) // converts a double to a 64-bit signed integer |
| uint64_t(int) // converts a 32-bit signed integer to a 64-bit unsigned integer |
| uint64_t(uint) // converts a 32-bit unsigned integer to a 64-bit unsigned integer |
| uint64_t(bool) // converts a Boolean to a 64-bit unsigned integer |
| uint64_t(float) // converts a float to a 64-bit unsigned integer |
| uint64_t(double) // converts a double to a 64-bit unsigned integer |
| |
| (modify second sentence of first paragraph on p. 96) |
| |
| ... is dropped. It is undefined to convert a negative floating-point value |
| to an uint or uint64_t. |
| |
| (replace third paragraph on p. 96) |
| |
| The constructors int(uint) and int64_t(uint64_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 uint64_t(int64_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. 111) |
| |
| 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. 138) |
| |
| ... genUType is used as the argument. Where the input arguments (and |
| corresponding output) can be int64_t, i64vec2, i64vec3, i64vec4, |
| genI64Type is used as the argument. Where the input arguments (and |
| corresponding output) can be uint64_t, u64vec2, u64vec3, u64vec4, |
| genU64Type is used as the argument. |
| |
| |
| Modify Section 8.3, Common Functions |
| |
| (add to the table of common functions on p. 142) |
| |
| +------------------------------------------------+----------------------------------------------------+ |
| | Syntax | Desciption | |
| +------------------------------------------------+----------------------------------------------------+ |
| | genI64Type abs(genI64Type x) | Returns x if x >= 0; otherwise it returns -x. | |
| +------------------------------------------------+----------------------------------------------------+ |
| | genI64Type sign(genI64Type x) | Returns 1 if x > 0, 0 if x = 0, or -1 if x < 0. | |
| +------------------------------------------------+----------------------------------------------------+ |
| | genI64Type min(genI64Type x, | Returns y if y < x; otherwise it returns x. | |
| | genI64Type y) | | |
| | genI64Type min(genI64Type x, | | |
| | int64_t y) | | |
| | genU64Type min(genU64Type x, | | |
| | genU64Type y) | | |
| | genU64Type min(genU64Type x, | | |
| | uint64_t y) | | |
| +------------------------------------------------+----------------------------------------------------+ |
| | genI64Type max(genI64Type x, | Returns y if x < y; otherwise it returns x. | |
| | genI64Type y) | | |
| | genI64Type max(genI64Type x, | | |
| | int64_t y) | | |
| | genU64Type max(genU64Type x, | | |
| | genU64Type y) | | |
| | genU64Type max(genU64Type x, | | |
| | uint64_t y) | | |
| +------------------------------------------------+----------------------------------------------------+ |
| | genI64Type clamp(genI64Type x, | Returns min(max(x, minVal), maxVal). | |
| | genI64Type minVal, | | |
| | genI64Type maxVal) | Results are undefined if minVal > maxVal. | |
| | genI64Type clamp(genI64Type x, | | |
| | int64_t minVal, | | |
| | int64_t maxVal) | | |
| | genU64Type clamp(genU64Type x, | | |
| | genU64Type minVal, | | |
| | genU64Type maxVal) | | |
| | genU64Type clamp(genU64Type x, | | |
| | uint64_t minVal, | | |
| | uint64_t maxVal) | | |
| +------------------------------------------------+----------------------------------------------------+ |
| | genI64Type mix(genI64Type x, | Selects which vector each returned component comes | |
| | genI64Type y, | from. For a component of a that is false, the | |
| | genBType a) | corresponding component of x is returned. For a | |
| | genU64Type mix(genU64Type x, | component of a that is true, the corresponding | |
| | genU64Type y, | component of y is returned. | |
| | genBType a) | | |
| +------------------------------------------------+----------------------------------------------------+ |
| | genI64Type doubleBitsToInt64(genDType value) | Returns a signed or unsigned 64-bit integer value | |
| | genU64Type doubleBitsToUint64(genDType value) | representing the encoding of a double. The double | |
| | | value's bit-level representation is preserved | |
| +------------------------------------------------+----------------------------------------------------+ |
| | genDType int64BitsToDouble(genI64Type value) | Returns a double value corresponding to a signed | |
| | genDType uint64BitsToDouble(genU64Type value) | or unsigned integer encoding of a double. 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. | |
| +------------------------------------------------+----------------------------------------------------+ |
| |
| |
| Rename Section 8.4, Floating-Point Pack and Unpack Functions to |
| 8.4, Floating-Point and Integer Pack and Unpack Functions |
| |
| |
| Modify Section 8.4, Floating-Point and Integer Pack and Unpack Functions |
| |
| (add to the table of pack and unpack functions on p. 147) |
| |
| +-----------------------------------+------------------------------------------------------+ |
| | Syntax | Desciption | |
| +-----------------------------------+------------------------------------------------------+ |
| | int64_t packInt2x32(ivec2 v) | Returns a signed or unsigned 64-bit integer obtained | |
| | uint64_t packUint2x32(uvec2 v) | by packing the components of a two-component signed | |
| | | or unsigned integer vector, respectively. The first | |
| | | vector component specifies the 32 least significant | |
| | | bits; the second component specifies the 32 most | |
| | | significant bits. | |
| +-----------------------------------+------------------------------------------------------+ |
| | ivec2 unpackInt2x32(int64_t v) | Returns a signed or unsigned integer vector built | |
| | uvec2 unpackUint2x32(uint64_t v) | from a 64-bit signed or unsigned integer scalar, | |
| | | respectively. The first component of the vector | |
| | | contains the 32 least significant bits of the input; | |
| | | the second component contains the 32 most | |
| | | significant bits. | |
| +-----------------------------------+------------------------------------------------------+ |
| |
| |
| Modify Section, 8.7, Vector Relational Functions |
| |
| (add to the table of placeholders at the top of p. 154) |
| |
| +-------------+-----------------------------+ |
| | Placeholder | Specific Types Allowed | |
| +-------------+-----------------------------+ |
| | i64vec | i64vec2, i64vec3, i64vec4 | |
| | u64vec | u64vec2, u64vec3, u64vec4 | |
| +-------------+-----------------------------+ |
| |
| (add to the table of vector relational functions at the bottom of p. 154) |
| |
| +-------------------------------------------+-----------------------------------------------+ |
| | Syntax | Desciption | |
| +-------------------------------------------+-----------------------------------------------+ |
| | bvec lessThan(i64vec x, i64vec y) | Returns the component-wise compare of x < y. | |
| | bvec lessThan(u64vec x, u64vec y) | | |
| +-------------------------------------------+-----------------------------------------------+ |
| | bvec lessThanEqual(i64vec x, i64vec y) | Returns the component-wise compare of x <= y. | |
| | bvec lessThanEqual(u64vec x, u64vec y) | | |
| +-------------------------------------------+-----------------------------------------------+ |
| | bvec greaterThan(i64vec x, i64vec y) | Returns the component-wise compare of x > y. | |
| | bvec greaterThan(u64vec x, u64vec y) | | |
| +-------------------------------------------+-----------------------------------------------+ |
| | bvec greaterThanEqual(i64vec x, i64vec y) | Returns the component-wise compare of x >= y. | |
| | bvec greaterThanEqual(u64vec x, u64vec y) | | |
| +-------------------------------------------+-----------------------------------------------+ |
| | bvec equal(i64vec x, i64vec y) | Returns the component-wise compare of x == y. | |
| | bvec equal(u64vec x, u64vec y) | | |
| +-------------------------------------------+-----------------------------------------------+ |
| | bvec notEqual(i64vec x, i64vec y) | Returns the component-wise compare of x != y. | |
| | bvec notEqual(u64vec x, u64vec y) | | |
| +-------------------------------------------+-----------------------------------------------+ |
| |
| |
| Modify Section 9, Shading Language Grammar for Core Profile |
| |
| (add to the list of tokens on p. 187) |
| |
| ... |
| INT64 UINT64 I64VEC2 I64VEC3 I64VEC4 U64VEC2 U64VEC3 U64VEC4 |
| ... |
| INT64CONSTANT UINT64CONSTANT |
| |
| (add to the rule of "primary_expression" on p. 188) |
| |
| primary_expression: |
| ... |
| INT64CONSTANT |
| UINT64CONSTANT |
| ... |
| |
| (add to the rule of "type_specifier_nonarray" on p. 195) |
| |
| type_specifier_nonarray: |
| ... |
| INT64 |
| UINT64 |
| ... |
| I64VEC2 |
| I64VEC3 |
| I64VEC4 |
| U64VEC2 |
| U64VEC3 |
| U64VEC4 |
| ... |
| |
| |
| Dependencies on NV_gpu_shader5 |
| |
| If the shader enables only NV_gpu_shader5, but not ARB_gpu_shader_int64 |
| then the overloaded built-in functions abs, sign, min, max, clamp, and mix |
| are not available. |
| |
| |
| Dependencies on NV_shader_buffer_load |
| |
| If NV_shader_buffer_load is supported, that specification should be edited |
| as follows, to allow pointers to dereference the new data types added by |
| this extension. |
| |
| Modify "Section 2.20.X, Shader Memory Access" from NV_shader_buffer_load. |
| |
| (add rules for loads of variables having the new data types from this |
| extension to the list of bullets following "When a shader dereferences a |
| pointer variable") |
| |
| - Data of type int64_t and uint64_t are read from or written to memory as |
| a signel 64-bit signed and unsigned integer value, respectively, at the |
| specified GPU address. |
| |
| |
| Dependencies on NV_vertex_attrib_integer_64bit |
| |
| This extension only provides the ability to specify 64-bit integer input |
| variables in a GLSL vertex shader, but does not provide a way to specify |
| the values of the corresponding vertex attributes via the OpenGL API. |
| The NV_vertex_attrib_integer_64bit extension exactly provides that |
| functionality. |
| |
| |
| Errors |
| |
| None. |
| |
| New State |
| |
| None. |
| |
| New Implementation Dependent State |
| |
| None. |
| |
| Issues |
| |
| (1) How the functionality in this extension is different than the 64-bit |
| integer support introduced by NV_gpu_shader5 and AMD_gpu_shader_int64? |
| |
| RESOLVED: This extension is a functional superset of the 64-bit integer |
| support in NV_gpu_shader5 with the following additions: |
| |
| * support for overloaded versions of the functions abs, sign, min, |
| max, clamp, and mix that accept 64-bit integers as parameters. |
| |
| Also, this extension is equivalent with AMD_gpu_shader_int64, except that |
| the entry points now have an ARB suffix. |
| |
| (2) How do the implicit conversions impact binary operators? |
| |
| RESOLVED: For binary operators, we prefer converting to a common type |
| that is as close as possible in size and type to the original |
| expression. |
| |
| (3) How do the implicit conversions impact function overloading rules? |
| |
| RESOLVED: We extend the preference rules in core OpenGL to account |
| for the new data types, adding a rule to favor conversion from 32-bit |
| integers to 64-bit integers over coversions to floating-point values. |
| |
| (4) What should be done to distinguish between 32- and 64-bit integer |
| constants? |
| |
| RESOLVED: We will use "L" and "UL" to identify signed and unsigned |
| 64-bit integer constants; the use of "L" matches a similar ("long") |
| suffix in the C programming language. C leaves the size of integer |
| types implementation-dependent, and many implementations require an "LL" |
| suffix to declare 64-bit integer constants. With our size definitions, |
| "L" will be considered sufficient to make an integer constant 64-bit. |
| |
| (5) Should provide support for vertex attributes with 64-bit components, |
| and if so, how should the support be provided in the OpenGL API? |
| |
| RESOLVED: Yes, but in order to specify 64-bit vertex attribute values |
| in the OpenGL API support for NV_vertex_attrib_integer_64bit or a |
| similar extension is also required. |
| |
| (6) Should we support 64-bit integer uniforms in the default uniform |
| block? |
| |
| RESOLVED: Yes, for completeness. |
| |
| (7) Should we support 64-bit integer types as members of uniform blocks, |
| shader storage buffer blocks, or as transform feedback varyings? |
| |
| RESOLVED: Yes, support all of them. 64-bit integers will consume eight |
| basic machine units just like double-precision floating-point variables. |
| |
| (8) How do the uniform loading commands introduced by this extension |
| interact similar commands added by NV_shader_buffer_load? |
| |
| RESOLVED: NV_shader_buffer_load provided the command Uniformui64NV to |
| load pointer uniforms with a single 64-bit unsigned integer. This |
| extension provides vectors of 64-bit unsigned integers, so we needed |
| Uniform{2,3,4}ui64NV commands. We chose to provide a Uniform1ui64NV |
| command, which will be functionally equivalent to Uniformui64NV. |
| |
| (9) Should we provide distinct sized types for 32-bit integers, floats, |
| and doubles? |
| |
| RESOLVED: No. While NV_gpu_shader5 does add such types, it seems there |
| isn't much value in adding those in this extension, especially because |
| this extension strictly focuses on supporting 64-bit integers. |
| |
| (10) Can the 64-bit uniform APIs be used to load values for uniforms of |
| type "bool", "bvec2", "bvec3", or "bvec4"? |
| |
| RESOLVED: No. OpenGL 2.0 and beyond did allow "bool" variable to be |
| set with Uniform*i* and Uniform*f APIs, and OpenGL 3.0 extended that |
| support to Uniform*ui* for orthogonality. But it seems pointless to |
| extended this capability forward to 64-bit Uniform APIs as well. |
| |
| (11) There exists both an UNSIGNED_INT64_AMD and UNSIGNED_INT64_NV token |
| with different values (the former existed earlier) so which token |
| value this extension should reuse? |
| |
| DISCUSSION: No functions in this extension accept these values as |
| inputs, they only should return one of these in various scenarios. |
| |
| RESOLVED: This extension will reuse the value of UNSIGNED_INT64_NV to |
| stay source code compatible with NV_gpu_shader5 and AMD_gpu_shader_int64. |
| |
| Revision History |
| |
| Rev. Date Author Changes |
| ---- -------- -------- ------------------------------------------------- |
| 1 02/03/15 drakos Draft based on AMD_gpu_shader_int64. |
| Rebased language for GL 4.5 and GLSL 4.50. |