15bd8deadSopenharmony_ciName 25bd8deadSopenharmony_ci 35bd8deadSopenharmony_ci ARB_gpu_shader_fp64 45bd8deadSopenharmony_ci 55bd8deadSopenharmony_ciName Strings 65bd8deadSopenharmony_ci 75bd8deadSopenharmony_ci GL_ARB_gpu_shader_fp64 85bd8deadSopenharmony_ci 95bd8deadSopenharmony_ciContact 105bd8deadSopenharmony_ci 115bd8deadSopenharmony_ci Pat Brown, NVIDIA Corporation (pbrown 'at' nvidia.com) 125bd8deadSopenharmony_ci 135bd8deadSopenharmony_ciContributors 145bd8deadSopenharmony_ci 155bd8deadSopenharmony_ci Barthold Lichtenbelt, NVIDIA 165bd8deadSopenharmony_ci Bill Licea-Kane, AMD 175bd8deadSopenharmony_ci Bruce Merry, ARM 185bd8deadSopenharmony_ci Chris Dodd, NVIDIA 195bd8deadSopenharmony_ci Eric Werness, NVIDIA 205bd8deadSopenharmony_ci Graham Sellers, AMD 215bd8deadSopenharmony_ci Greg Roth, NVIDIA 225bd8deadSopenharmony_ci Jeff Bolz, NVIDIA 235bd8deadSopenharmony_ci Nick Haemel, AMD 245bd8deadSopenharmony_ci Pierre Boudier, AMD 255bd8deadSopenharmony_ci Piers Daniell, NVIDIA 265bd8deadSopenharmony_ci 275bd8deadSopenharmony_ciNotice 285bd8deadSopenharmony_ci 295bd8deadSopenharmony_ci Copyright (c) 2010-2013 The Khronos Group Inc. Copyright terms at 305bd8deadSopenharmony_ci http://www.khronos.org/registry/speccopyright.html 315bd8deadSopenharmony_ci 325bd8deadSopenharmony_ciSpecification Update Policy 335bd8deadSopenharmony_ci 345bd8deadSopenharmony_ci Khronos-approved extension specifications are updated in response to 355bd8deadSopenharmony_ci issues and bugs prioritized by the Khronos OpenGL Working Group. For 365bd8deadSopenharmony_ci extensions which have been promoted to a core Specification, fixes will 375bd8deadSopenharmony_ci first appear in the latest version of that core Specification, and will 385bd8deadSopenharmony_ci eventually be backported to the extension document. This policy is 395bd8deadSopenharmony_ci described in more detail at 405bd8deadSopenharmony_ci https://www.khronos.org/registry/OpenGL/docs/update_policy.php 415bd8deadSopenharmony_ci 425bd8deadSopenharmony_ciStatus 435bd8deadSopenharmony_ci 445bd8deadSopenharmony_ci Complete. Approved by the ARB at the 2010/01/22 F2F meeting. 455bd8deadSopenharmony_ci Approved by the Khronos Board of Promoters on March 10, 2010. 465bd8deadSopenharmony_ci 475bd8deadSopenharmony_ciVersion 485bd8deadSopenharmony_ci 495bd8deadSopenharmony_ci Last Modified Date: August 27, 2012 505bd8deadSopenharmony_ci NVIDIA Revision: 11 515bd8deadSopenharmony_ci 525bd8deadSopenharmony_ciNumber 535bd8deadSopenharmony_ci 545bd8deadSopenharmony_ci ARB Extension #89 555bd8deadSopenharmony_ci 565bd8deadSopenharmony_ciDependencies 575bd8deadSopenharmony_ci 585bd8deadSopenharmony_ci This extension is written against the OpenGL 3.2 (Compatibility Profile) 595bd8deadSopenharmony_ci Specification. 605bd8deadSopenharmony_ci 615bd8deadSopenharmony_ci This extension is written against version 1.50 (revision 09) of the OpenGL 625bd8deadSopenharmony_ci Shading Language Specification. 635bd8deadSopenharmony_ci 645bd8deadSopenharmony_ci OpenGL 3.2 and GLSL 1.50 are required. 655bd8deadSopenharmony_ci 665bd8deadSopenharmony_ci This extension interacts with EXT_direct_state_access. 675bd8deadSopenharmony_ci 685bd8deadSopenharmony_ci This extension interacts with NV_shader_buffer_load. 695bd8deadSopenharmony_ci 705bd8deadSopenharmony_ciOverview 715bd8deadSopenharmony_ci 725bd8deadSopenharmony_ci This extension allows GLSL shaders to use double-precision floating-point 735bd8deadSopenharmony_ci data types, including vectors and matrices of doubles. Doubles may be 745bd8deadSopenharmony_ci used as inputs, outputs, and uniforms. 755bd8deadSopenharmony_ci 765bd8deadSopenharmony_ci The shading language supports various arithmetic and comparison operators 775bd8deadSopenharmony_ci on double-precision scalar, vector, and matrix types, and provides a set 785bd8deadSopenharmony_ci of built-in functions including: 795bd8deadSopenharmony_ci 805bd8deadSopenharmony_ci * square roots and inverse square roots; 815bd8deadSopenharmony_ci 825bd8deadSopenharmony_ci * fused floating-point multiply-add operations; 835bd8deadSopenharmony_ci 845bd8deadSopenharmony_ci * splitting a floating-point number into a significand and exponent 855bd8deadSopenharmony_ci (frexp), or building a floating-point number from a significand and 865bd8deadSopenharmony_ci exponent (ldexp); 875bd8deadSopenharmony_ci 885bd8deadSopenharmony_ci * absolute value, sign tests, various functions to round to an integer 895bd8deadSopenharmony_ci value, modulus, minimum, maximum, clamping, blending two values, step 905bd8deadSopenharmony_ci functions, and testing for infinity and NaN values; 915bd8deadSopenharmony_ci 925bd8deadSopenharmony_ci * packing and unpacking doubles into a pair of 32-bit unsigned integers; 935bd8deadSopenharmony_ci 945bd8deadSopenharmony_ci * matrix component-wise multiplication, and computation of outer 955bd8deadSopenharmony_ci products, transposes, determinants, and inverses; and 965bd8deadSopenharmony_ci 975bd8deadSopenharmony_ci * vector relational functions. 985bd8deadSopenharmony_ci 995bd8deadSopenharmony_ci Double-precision versions of angle, trigonometry, and exponential 1005bd8deadSopenharmony_ci functions are not supported. 1015bd8deadSopenharmony_ci 1025bd8deadSopenharmony_ci Implicit conversions are supported from integer and single-precision 1035bd8deadSopenharmony_ci floating-point values to doubles, and this extension uses the relaxed 1045bd8deadSopenharmony_ci function overloading rules specified by the ARB_gpu_shader5 extension to 1055bd8deadSopenharmony_ci resolve ambiguities. 1065bd8deadSopenharmony_ci 1075bd8deadSopenharmony_ci This extension provides API functions for specifying double-precision 1085bd8deadSopenharmony_ci uniforms in the default uniform block, including functions similar to the 1095bd8deadSopenharmony_ci uniform functions added by EXT_direct_state_access (if supported). 1105bd8deadSopenharmony_ci 1115bd8deadSopenharmony_ci This extension provides an "LF" suffix for specifying double-precision 1125bd8deadSopenharmony_ci constants. Floating-point constants without a suffix in GLSL are treated 1135bd8deadSopenharmony_ci as single-precision values for backward compatibility with versions not 1145bd8deadSopenharmony_ci supporting doubles; similar constants are treated as double-precision 1155bd8deadSopenharmony_ci values in the "C" programming language. 1165bd8deadSopenharmony_ci 1175bd8deadSopenharmony_ci This extension does not support interpolation of double-precision values; 1185bd8deadSopenharmony_ci doubles used as fragment shader inputs must be qualified as "flat". 1195bd8deadSopenharmony_ci Additionally, this extension does not allow vertex attributes with 64-bit 1205bd8deadSopenharmony_ci components. That support is added separately by EXT_vertex_attrib_64bit. 1215bd8deadSopenharmony_ci 1225bd8deadSopenharmony_ciIP Status 1235bd8deadSopenharmony_ci 1245bd8deadSopenharmony_ci No known IP claims. 1255bd8deadSopenharmony_ci 1265bd8deadSopenharmony_ciNew Procedures and Functions 1275bd8deadSopenharmony_ci 1285bd8deadSopenharmony_ci void Uniform1d(int location, double x); 1295bd8deadSopenharmony_ci void Uniform2d(int location, double x, double y); 1305bd8deadSopenharmony_ci void Uniform3d(int location, double x, double y, double z); 1315bd8deadSopenharmony_ci void Uniform4d(int location, double x, double y, double z, double w); 1325bd8deadSopenharmony_ci void Uniform1dv(int location, sizei count, const double *value); 1335bd8deadSopenharmony_ci void Uniform2dv(int location, sizei count, const double *value); 1345bd8deadSopenharmony_ci void Uniform3dv(int location, sizei count, const double *value); 1355bd8deadSopenharmony_ci void Uniform4dv(int location, sizei count, const double *value); 1365bd8deadSopenharmony_ci 1375bd8deadSopenharmony_ci void UniformMatrix2dv(int location, sizei count, boolean transpose, 1385bd8deadSopenharmony_ci const double *value); 1395bd8deadSopenharmony_ci void UniformMatrix3dv(int location, sizei count, boolean transpose, 1405bd8deadSopenharmony_ci const double *value); 1415bd8deadSopenharmony_ci void UniformMatrix4dv(int location, sizei count, boolean transpose, 1425bd8deadSopenharmony_ci const double *value); 1435bd8deadSopenharmony_ci void UniformMatrix2x3dv(int location, sizei count, boolean transpose, 1445bd8deadSopenharmony_ci const double *value); 1455bd8deadSopenharmony_ci void UniformMatrix2x4dv(int location, sizei count, boolean transpose, 1465bd8deadSopenharmony_ci const double *value); 1475bd8deadSopenharmony_ci void UniformMatrix3x2dv(int location, sizei count, boolean transpose, 1485bd8deadSopenharmony_ci const double *value); 1495bd8deadSopenharmony_ci void UniformMatrix3x4dv(int location, sizei count, boolean transpose, 1505bd8deadSopenharmony_ci const double *value); 1515bd8deadSopenharmony_ci void UniformMatrix4x2dv(int location, sizei count, boolean transpose, 1525bd8deadSopenharmony_ci const double *value); 1535bd8deadSopenharmony_ci void UniformMatrix4x3dv(int location, sizei count, boolean transpose, 1545bd8deadSopenharmony_ci const double *value); 1555bd8deadSopenharmony_ci 1565bd8deadSopenharmony_ci void GetUniformdv(uint program, int location, double *params); 1575bd8deadSopenharmony_ci 1585bd8deadSopenharmony_ci (All of the following ProgramUniform* functions are supported if and only 1595bd8deadSopenharmony_ci if EXT_direct_state_access is supported.) 1605bd8deadSopenharmony_ci 1615bd8deadSopenharmony_ci void ProgramUniform1dEXT(uint program, int location, double x); 1625bd8deadSopenharmony_ci void ProgramUniform2dEXT(uint program, int location, double x, double y); 1635bd8deadSopenharmony_ci void ProgramUniform3dEXT(uint program, int location, double x, double y, 1645bd8deadSopenharmony_ci double z); 1655bd8deadSopenharmony_ci void ProgramUniform4dEXT(uint program, int location, double x, double y, 1665bd8deadSopenharmony_ci double z, double w); 1675bd8deadSopenharmony_ci void ProgramUniform1dvEXT(uint program, int location, sizei count, 1685bd8deadSopenharmony_ci const double *value); 1695bd8deadSopenharmony_ci void ProgramUniform2dvEXT(uint program, int location, sizei count, 1705bd8deadSopenharmony_ci const double *value); 1715bd8deadSopenharmony_ci void ProgramUniform3dvEXT(uint program, int location, sizei count, 1725bd8deadSopenharmony_ci const double *value); 1735bd8deadSopenharmony_ci void ProgramUniform4dvEXT(uint program, int location, sizei count, 1745bd8deadSopenharmony_ci const double *value); 1755bd8deadSopenharmony_ci 1765bd8deadSopenharmony_ci void ProgramUniformMatrix2dvEXT(uint program, int location, sizei count, 1775bd8deadSopenharmony_ci boolean transpose, const double *value); 1785bd8deadSopenharmony_ci void ProgramUniformMatrix3dvEXT(uint program, int location, sizei count, 1795bd8deadSopenharmony_ci boolean transpose, const double *value); 1805bd8deadSopenharmony_ci void ProgramUniformMatrix4dvEXT(uint program, int location, sizei count, 1815bd8deadSopenharmony_ci boolean transpose, const double *value); 1825bd8deadSopenharmony_ci void ProgramUniformMatrix2x3dvEXT(uint program, int location, sizei count, 1835bd8deadSopenharmony_ci boolean transpose, const double *value); 1845bd8deadSopenharmony_ci void ProgramUniformMatrix2x4dvEXT(uint program, int location, sizei count, 1855bd8deadSopenharmony_ci boolean transpose, const double *value); 1865bd8deadSopenharmony_ci void ProgramUniformMatrix3x2dvEXT(uint program, int location, sizei count, 1875bd8deadSopenharmony_ci boolean transpose, const double *value); 1885bd8deadSopenharmony_ci void ProgramUniformMatrix3x4dvEXT(uint program, int location, sizei count, 1895bd8deadSopenharmony_ci boolean transpose, const double *value); 1905bd8deadSopenharmony_ci void ProgramUniformMatrix4x2dvEXT(uint program, int location, sizei count, 1915bd8deadSopenharmony_ci boolean transpose, const double *value); 1925bd8deadSopenharmony_ci void ProgramUniformMatrix4x3dvEXT(uint program, int location, sizei count, 1935bd8deadSopenharmony_ci boolean transpose, const double *value); 1945bd8deadSopenharmony_ci 1955bd8deadSopenharmony_ciNew Tokens 1965bd8deadSopenharmony_ci 1975bd8deadSopenharmony_ci Returned in the <type> parameter of GetActiveUniform, and 1985bd8deadSopenharmony_ci GetTransformFeedbackVarying: 1995bd8deadSopenharmony_ci 2005bd8deadSopenharmony_ci DOUBLE 2015bd8deadSopenharmony_ci DOUBLE_VEC2 0x8FFC 2025bd8deadSopenharmony_ci DOUBLE_VEC3 0x8FFD 2035bd8deadSopenharmony_ci DOUBLE_VEC4 0x8FFE 2045bd8deadSopenharmony_ci DOUBLE_MAT2 0x8F46 2055bd8deadSopenharmony_ci DOUBLE_MAT3 0x8F47 2065bd8deadSopenharmony_ci DOUBLE_MAT4 0x8F48 2075bd8deadSopenharmony_ci DOUBLE_MAT2x3 0x8F49 2085bd8deadSopenharmony_ci DOUBLE_MAT2x4 0x8F4A 2095bd8deadSopenharmony_ci DOUBLE_MAT3x2 0x8F4B 2105bd8deadSopenharmony_ci DOUBLE_MAT3x4 0x8F4C 2115bd8deadSopenharmony_ci DOUBLE_MAT4x2 0x8F4D 2125bd8deadSopenharmony_ci DOUBLE_MAT4x3 0x8F4E 2135bd8deadSopenharmony_ci 2145bd8deadSopenharmony_ci 2155bd8deadSopenharmony_ciAdditions to Chapter 2 of the OpenGL 3.2 (Compatibility Profile) Specification 2165bd8deadSopenharmony_ci(OpenGL Operation) 2175bd8deadSopenharmony_ci 2185bd8deadSopenharmony_ci Modify Section 2.14.4, Uniform Variables, p. 89 2195bd8deadSopenharmony_ci 2205bd8deadSopenharmony_ci (modify third paragraph, p. 90) ... uniform variable storage for a vertex 2215bd8deadSopenharmony_ci shader. A uniform matrix with single- or double-precision components will 2225bd8deadSopenharmony_ci consume no more than 4 * min(r,c) or 8 * min(r,c) uniform components, 2235bd8deadSopenharmony_ci respectively. A scalar or vector uniform with double-precision components 2245bd8deadSopenharmony_ci will consume no more than 2<n> components, where <n> is 1 for scalars, and 2255bd8deadSopenharmony_ci the component count for vectors. A link error is generated ... 2265bd8deadSopenharmony_ci 2275bd8deadSopenharmony_ci (add to Table 2.13, p. 96) 2285bd8deadSopenharmony_ci 2295bd8deadSopenharmony_ci Type Name Token Keyword 2305bd8deadSopenharmony_ci -------------------- ---------------- 2315bd8deadSopenharmony_ci DOUBLE double 2325bd8deadSopenharmony_ci DOUBLE_VEC2 dvec2 2335bd8deadSopenharmony_ci DOUBLE_VEC3 dvec3 2345bd8deadSopenharmony_ci DOUBLE_VEC4 dvec4 2355bd8deadSopenharmony_ci DOUBLE_MAT2 dmat2 2365bd8deadSopenharmony_ci DOUBLE_MAT3 dmat3 2375bd8deadSopenharmony_ci DOUBLE_MAT4 dmat4 2385bd8deadSopenharmony_ci DOUBLE_MAT2x3 dmat2x3 2395bd8deadSopenharmony_ci DOUBLE_MAT2x4 dmat2x4 2405bd8deadSopenharmony_ci DOUBLE_MAT3x2 dmat3x2 2415bd8deadSopenharmony_ci DOUBLE_MAT3x4 dmat3x4 2425bd8deadSopenharmony_ci DOUBLE_MAT4x2 dmat4x2 2435bd8deadSopenharmony_ci DOUBLE_MAT4x3 dmat4x3 2445bd8deadSopenharmony_ci 2455bd8deadSopenharmony_ci (modify list of commands at the bottom of p. 99) 2465bd8deadSopenharmony_ci 2475bd8deadSopenharmony_ci void Uniform{1,2,3,4}d(int location, T value); 2485bd8deadSopenharmony_ci void Uniform{1,2,3,4}dv(int location, T value); 2495bd8deadSopenharmony_ci void UniformMatrix{2,3,4}dv 2505bd8deadSopenharmony_ci (int location, sizei count, boolean transpose, 2515bd8deadSopenharmony_ci const double *value); 2525bd8deadSopenharmony_ci void UniformMatrix{2x3,3x2,2x4,4x2,3x4,4x3}dv 2535bd8deadSopenharmony_ci (int location, sizei count, boolean transpose, 2545bd8deadSopenharmony_ci const double *value); 2555bd8deadSopenharmony_ci 2565bd8deadSopenharmony_ci (insert after fourth paragraph, p. 100) The Uniform*d{v} commands will 2575bd8deadSopenharmony_ci load <count> sets of one to four double-precision floating-point values 2585bd8deadSopenharmony_ci into a uniform location defined as a double, a double vector, or an array 2595bd8deadSopenharmony_ci of double scalars or vectors. 2605bd8deadSopenharmony_ci 2615bd8deadSopenharmony_ci (modify fifth paragraph, p. 100) The UniformMatrix{2,3,4}fv and 2625bd8deadSopenharmony_ci UniformMatrix{2,3,4}dv commands will load <count> 2x2, 3x3, or 4x4 2635bd8deadSopenharmony_ci matrices (corresponding to 2, 3, or 4 in the command name) of single- or 2645bd8deadSopenharmony_ci double-precision floating-point values, respectively, into ... 2655bd8deadSopenharmony_ci 2665bd8deadSopenharmony_ci (replace second bullet on the middle of p. 101, regarding 2675bd8deadSopenharmony_ci INVALID_OPERATION errors in Uniform* comamnds) 2685bd8deadSopenharmony_ci 2695bd8deadSopenharmony_ci * if the type of the uniform declared in the shader does not match the 2705bd8deadSopenharmony_ci component type and count indicated in the Uniform* command name (where 2715bd8deadSopenharmony_ci a boolean uniform component type is considered to match any of the 2725bd8deadSopenharmony_ci Uniform*i{v}, Uniform*ui{v}, or Uniform*f{v} commands), 2735bd8deadSopenharmony_ci 2745bd8deadSopenharmony_ci (modify sixth paragraph, p. 100) The UniformMatrix{2x3,3x2,2x4, 2755bd8deadSopenharmony_ci 4x2,3x4,4x3}fv and UniformMatrix{2x3,3x2,2x4,4x2,3x4,4x3}dv commands will 2765bd8deadSopenharmony_ci load <count> 2x3, 3x2, 2x4, 4x2, 3x4, or 4x3 matrices (corresponding to 2775bd8deadSopenharmony_ci the numbers in the command name) of single- or double-precision 2785bd8deadSopenharmony_ci floating-point values, respectively, into ... 2795bd8deadSopenharmony_ci 2805bd8deadSopenharmony_ci (modify "Uniform Buffer Object Storage", p. 102, adding a bullet after the 2815bd8deadSopenharmony_ci last "Members of type", and modifying the subsequent bullet) 2825bd8deadSopenharmony_ci 2835bd8deadSopenharmony_ci * Members of type double are extracted from a buffer object by reading a 2845bd8deadSopenharmony_ci single double-typed value at the specified offset. 2855bd8deadSopenharmony_ci 2865bd8deadSopenharmony_ci * Vectors with N elements with basic data types of bool, int, uint, 2875bd8deadSopenharmony_ci float, or double are extracted as N values in consecutive memory 2885bd8deadSopenharmony_ci locations beginning at the specified offset, with components stored in 2895bd8deadSopenharmony_ci order with the first (X) component at the lowest offset. The GL data 2905bd8deadSopenharmony_ci type used for component extraction is derived according to the rules 2915bd8deadSopenharmony_ci for scalar members above. 2925bd8deadSopenharmony_ci 2935bd8deadSopenharmony_ci 2945bd8deadSopenharmony_ci Modify Section 2.14.6, Varying Variables, p. 106 2955bd8deadSopenharmony_ci 2965bd8deadSopenharmony_ci (modify third paragraph, p. 107) ... For the purposes of counting input 2975bd8deadSopenharmony_ci and output components consumed by a shader, variables declared as vectors, 2985bd8deadSopenharmony_ci matrices, and arrays will all consume multiple components. Each component 2995bd8deadSopenharmony_ci of variables declared as double-precision floating-point scalars, vectors, 3005bd8deadSopenharmony_ci or matrices may be counted as consuming two components. 3015bd8deadSopenharmony_ci 3025bd8deadSopenharmony_ci (add after the bulleted list, p. 108) For the purposes of counting the 3035bd8deadSopenharmony_ci total number of components to capture, each component of outputs declared 3045bd8deadSopenharmony_ci as double-precision floating-point scalars, vectors, or matrices may be 3055bd8deadSopenharmony_ci counted as consuming two components. 3065bd8deadSopenharmony_ci 3075bd8deadSopenharmony_ci 3085bd8deadSopenharmony_ci Modify Section 2.19, Transform Feedback, p. 130 3095bd8deadSopenharmony_ci 3105bd8deadSopenharmony_ci (add to end of first paragraph, p. 132) ... The results of appending a 3115bd8deadSopenharmony_ci varying variable to a transform feedback buffer are undefined if any 3125bd8deadSopenharmony_ci component of that variable would be written at an offset not aligned to 3135bd8deadSopenharmony_ci the size of the component. 3145bd8deadSopenharmony_ci 3155bd8deadSopenharmony_ci 3165bd8deadSopenharmony_ciAdditions to Chapter 3 of the OpenGL 3.2 (Compatibility Profile) Specification 3175bd8deadSopenharmony_ci(Rasterization) 3185bd8deadSopenharmony_ci 3195bd8deadSopenharmony_ci None. 3205bd8deadSopenharmony_ci 3215bd8deadSopenharmony_ciAdditions to Chapter 4 of the OpenGL 3.2 (Compatibility Profile) Specification 3225bd8deadSopenharmony_ci(Per-Fragment Operations and the Frame Buffer) 3235bd8deadSopenharmony_ci 3245bd8deadSopenharmony_ci None. 3255bd8deadSopenharmony_ci 3265bd8deadSopenharmony_ciAdditions to Chapter 5 of the OpenGL 3.2 (Compatibility Profile) Specification 3275bd8deadSopenharmony_ci(Special Functions) 3285bd8deadSopenharmony_ci 3295bd8deadSopenharmony_ci None. 3305bd8deadSopenharmony_ci 3315bd8deadSopenharmony_ciAdditions to Chapter 6 of the OpenGL 3.2 (Compatibility Profile) Specification 3325bd8deadSopenharmony_ci(State and State Requests) 3335bd8deadSopenharmony_ci 3345bd8deadSopenharmony_ci Modify Section 6.1.15, Shader and Program Queries, p. 332 3355bd8deadSopenharmony_ci 3365bd8deadSopenharmony_ci (add to the first list of commands, p. 337) 3375bd8deadSopenharmony_ci 3385bd8deadSopenharmony_ci void GetUniformdv(uint program, int location, double *params); 3395bd8deadSopenharmony_ci 3405bd8deadSopenharmony_ci 3415bd8deadSopenharmony_ciAdditions to Appendix A of the OpenGL 3.2 (Compatibility Profile) 3425bd8deadSopenharmony_ciSpecification (Invariance) 3435bd8deadSopenharmony_ci 3445bd8deadSopenharmony_ci None. 3455bd8deadSopenharmony_ci 3465bd8deadSopenharmony_ciAdditions to the AGL/GLX/WGL Specifications 3475bd8deadSopenharmony_ci 3485bd8deadSopenharmony_ci None. 3495bd8deadSopenharmony_ci 3505bd8deadSopenharmony_ciModifications to The OpenGL Shading Language Specification, Version 1.50 3515bd8deadSopenharmony_ci(Revision 09) 3525bd8deadSopenharmony_ci 3535bd8deadSopenharmony_ci Including the following line in a shader can be used to control the 3545bd8deadSopenharmony_ci language features described in this extension: 3555bd8deadSopenharmony_ci 3565bd8deadSopenharmony_ci #extension GL_ARB_gpu_shader_fp64 : <behavior> 3575bd8deadSopenharmony_ci 3585bd8deadSopenharmony_ci where <behavior> is as specified in section 3.3. 3595bd8deadSopenharmony_ci 3605bd8deadSopenharmony_ci New preprocessor #defines are added to the OpenGL Shading Language: 3615bd8deadSopenharmony_ci 3625bd8deadSopenharmony_ci #define GL_ARB_gpu_shader_fp64 1 3635bd8deadSopenharmony_ci 3645bd8deadSopenharmony_ci 3655bd8deadSopenharmony_ci Modify Section 3.6, Keywords, p. 14 3665bd8deadSopenharmony_ci 3675bd8deadSopenharmony_ci (add the following to the list of keywords, p. 14) 3685bd8deadSopenharmony_ci 3695bd8deadSopenharmony_ci double dvec2 dvec3 dvec4 3705bd8deadSopenharmony_ci 3715bd8deadSopenharmony_ci dmat2 dmat3 dmat4 3725bd8deadSopenharmony_ci dmat2x2 dmat2x3 dmat2x4 3735bd8deadSopenharmony_ci dmat3x2 dmat3x3 dmat3x4 3745bd8deadSopenharmony_ci dmat4x2 dmat4x3 dmat4x4 3755bd8deadSopenharmony_ci 3765bd8deadSopenharmony_ci (remove "double", "dvec2", "dvec3", and "dvec4" from the list of 3775bd8deadSopenharmony_ci keywords reserved for future use, p. 15) 3785bd8deadSopenharmony_ci 3795bd8deadSopenharmony_ci 3805bd8deadSopenharmony_ci Modify Section 4.1, Basic Types, p. 17 3815bd8deadSopenharmony_ci 3825bd8deadSopenharmony_ci (add to the basic "Transparent Types" table, pp. 17-18) 3835bd8deadSopenharmony_ci 3845bd8deadSopenharmony_ci Types Meaning 3855bd8deadSopenharmony_ci -------- ---------------------------------------------------------- 3865bd8deadSopenharmony_ci double a single double-precision floating point scalar 3875bd8deadSopenharmony_ci dvec2 a two-component double precision floating-point vector 3885bd8deadSopenharmony_ci dvec3 a three component double precision floating-point vector 3895bd8deadSopenharmony_ci dvec4 a four component double precision floating-point vector 3905bd8deadSopenharmony_ci 3915bd8deadSopenharmony_ci dmat2 a 2x2 double-precision floating-point matrix 3925bd8deadSopenharmony_ci dmat3 a 3x3 double-precision floating-point matrix 3935bd8deadSopenharmony_ci dmat4 a 4x4 double-precision floating-point matrix 3945bd8deadSopenharmony_ci dmat2x2 same as dmat2 3955bd8deadSopenharmony_ci dmat2x3 a double-precision matrix with 2 columns and 3 rows 3965bd8deadSopenharmony_ci dmat2x4 a double-precision matrix with 2 columns and 4 rows 3975bd8deadSopenharmony_ci dmat3x2 a double-precision matrix with 3 columns and 2 rows 3985bd8deadSopenharmony_ci dmat3x3 same as dmat3 3995bd8deadSopenharmony_ci dmat3x4 a double-precision matrix with 3 columns and 4 rows 4005bd8deadSopenharmony_ci dmat4x2 a double-precision matrix with 4 columns and 2 rows 4015bd8deadSopenharmony_ci dmat4x3 a double-precision matrix with 4 columns and 3 rows 4025bd8deadSopenharmony_ci dmat4x4 same as dmat4 4035bd8deadSopenharmony_ci 4045bd8deadSopenharmony_ci 4055bd8deadSopenharmony_ci Modify Section 4.1.4, Floats, p. 22 4065bd8deadSopenharmony_ci 4075bd8deadSopenharmony_ci (modify two paragraphs of the section, adding support for doubles) 4085bd8deadSopenharmony_ci 4095bd8deadSopenharmony_ci Single- and double-precision floating-point values are available for use 4105bd8deadSopenharmony_ci in a variety of scalar calculations. Floating-point variables are defined 4115bd8deadSopenharmony_ci as in the following example: 4125bd8deadSopenharmony_ci 4135bd8deadSopenharmony_ci float a, b = 1.5; 4145bd8deadSopenharmony_ci double c, d = 2.0LF; 4155bd8deadSopenharmony_ci 4165bd8deadSopenharmony_ci As an input value to one of the processing units, a single or 4175bd8deadSopenharmony_ci double-precision floating-point variable is expected to match the IEEE 4185bd8deadSopenharmony_ci floating-point definition for precision and dynamic range of the 4195bd8deadSopenharmony_ci corresponding type. It is not required that the precision of internal 4205bd8deadSopenharmony_ci processing for operands of type "float" match the IEEE floating-point 4215bd8deadSopenharmony_ci specification for floating-point operations, but the minimum guidelines 4225bd8deadSopenharmony_ci for precision established by the OpenGL specification must be met. 4235bd8deadSopenharmony_ci Treatment of conditions such as divide by 0 may lead to an unspecified 4245bd8deadSopenharmony_ci result, but in no case should such a condition lead to the interruption or 4255bd8deadSopenharmony_ci termination of processing. 4265bd8deadSopenharmony_ci 4275bd8deadSopenharmony_ci (modify the grammar, p. 22, adding "L" suffix) 4285bd8deadSopenharmony_ci 4295bd8deadSopenharmony_ci floating-suffix: one of 4305bd8deadSopenharmony_ci 4315bd8deadSopenharmony_ci f F lf LF 4325bd8deadSopenharmony_ci 4335bd8deadSopenharmony_ci (modify last paragraph, p. 22) ... including before a suffix. When the 4345bd8deadSopenharmony_ci suffix "lf" or "LF" is present, the literal has type <double>. Otherwise, 4355bd8deadSopenharmony_ci the literal has type <float>. A leading unary ... 4365bd8deadSopenharmony_ci 4375bd8deadSopenharmony_ci 4385bd8deadSopenharmony_ci Modify Section 4.1.6, Matrices, p. 23 4395bd8deadSopenharmony_ci 4405bd8deadSopenharmony_ci (modify the first paragraph of the section) 4415bd8deadSopenharmony_ci 4425bd8deadSopenharmony_ci The OpenGL Shading Language has built-in types for 2×2, 2×3, 2×4, 3×2, 4435bd8deadSopenharmony_ci 3×3, 3×4, 4×2, 4×3, and 4×4 matrices of single- and double-precision 4445bd8deadSopenharmony_ci floating-point numbers. Matrix types beginning with "mat" have 4455bd8deadSopenharmony_ci single-precision components; matrix types beginning with "dmat" have 4465bd8deadSopenharmony_ci double-precision components. The first number in the type is the number 4475bd8deadSopenharmony_ci of columns, the second is the number of rows. Example matrix declarations: 4485bd8deadSopenharmony_ci 4495bd8deadSopenharmony_ci mat2 mat2D; 4505bd8deadSopenharmony_ci mat3 optMatrix; 4515bd8deadSopenharmony_ci mat4 view, projection; 4525bd8deadSopenharmony_ci mat4x4 view; // an alternate way of declaring a mat4 4535bd8deadSopenharmony_ci mat3x2 m; // a matrix with 3 columns and 2 rows 4545bd8deadSopenharmony_ci dmat4 highPrecisionMVP; 4555bd8deadSopenharmony_ci dmat2x4 skinnyAndTallWithBigComponents; 4565bd8deadSopenharmony_ci 4575bd8deadSopenharmony_ci ... 4585bd8deadSopenharmony_ci 4595bd8deadSopenharmony_ci Modify Section 4.1.10, Implicit Conversions, p. 27 4605bd8deadSopenharmony_ci 4615bd8deadSopenharmony_ci (modify table of implicit conversions) 4625bd8deadSopenharmony_ci 4635bd8deadSopenharmony_ci Can be implicitly 4645bd8deadSopenharmony_ci Type of expression converted to 4655bd8deadSopenharmony_ci --------------------- ------------------- 4665bd8deadSopenharmony_ci int uint(*), float, double 4675bd8deadSopenharmony_ci ivec2 uvec2(*), vec2, dvec2 4685bd8deadSopenharmony_ci ivec3 uvec3(*), vec3, dvec3 4695bd8deadSopenharmony_ci ivec4 uvec4(*), vec4, dvec4 4705bd8deadSopenharmony_ci 4715bd8deadSopenharmony_ci uint float, double 4725bd8deadSopenharmony_ci uvec2 vec2, dvec2 4735bd8deadSopenharmony_ci uvec3 vec3, dvec3 4745bd8deadSopenharmony_ci uvec4 vec4, dvec4 4755bd8deadSopenharmony_ci 4765bd8deadSopenharmony_ci float double 4775bd8deadSopenharmony_ci vec2 dvec2 4785bd8deadSopenharmony_ci vec3 dvec3 4795bd8deadSopenharmony_ci vec4 dvec4 4805bd8deadSopenharmony_ci 4815bd8deadSopenharmony_ci mat2 dmat2 4825bd8deadSopenharmony_ci mat3 dmat3 4835bd8deadSopenharmony_ci mat4 dmat4 4845bd8deadSopenharmony_ci mat2x3 dmat2x3 4855bd8deadSopenharmony_ci mat2x4 dmat2x4 4865bd8deadSopenharmony_ci mat3x2 dmat3x2 4875bd8deadSopenharmony_ci mat3x4 dmat3x4 4885bd8deadSopenharmony_ci mat4x2 dmat4x2 4895bd8deadSopenharmony_ci mat4x3 dmat4x3 4905bd8deadSopenharmony_ci 4915bd8deadSopenharmony_ci (*) if ARB_gpu_shader5 or NV_gpu_shader5 is supported 4925bd8deadSopenharmony_ci 4935bd8deadSopenharmony_ci (modify second paragraph of the section) No implicit conversions are 4945bd8deadSopenharmony_ci provided to convert from unsigned to signed integer types, from 4955bd8deadSopenharmony_ci floating-point to integer types, or from higher-precision to 4965bd8deadSopenharmony_ci lower-precision types. There are no implicit array or structure 4975bd8deadSopenharmony_ci conversions. 4985bd8deadSopenharmony_ci 4995bd8deadSopenharmony_ci (add before the final paragraph of the section, p. 27) 5005bd8deadSopenharmony_ci 5015bd8deadSopenharmony_ci (insert before the final paragraph of the section) When performing 5025bd8deadSopenharmony_ci implicit conversion for binary operators, there may be multiple data types 5035bd8deadSopenharmony_ci to which the two operands can be converted. For example, when adding an 5045bd8deadSopenharmony_ci int value to a uint value, both values can be implicitly converted to 5055bd8deadSopenharmony_ci uint, float, and double. In such cases, a floating-point type is chosen 5065bd8deadSopenharmony_ci if either operand has a floating-point type. Otherwise, an unsigned 5075bd8deadSopenharmony_ci integer type is chosen if either operand has an unsigned integer type. 5085bd8deadSopenharmony_ci Otherwise, a signed integer type is chosen. If operands can be implicitly 5095bd8deadSopenharmony_ci converted to multiple data types deriving from the same base data type, 5105bd8deadSopenharmony_ci the type with the smallest component size is used. 5115bd8deadSopenharmony_ci 5125bd8deadSopenharmony_ci 5135bd8deadSopenharmony_ci Modify Section 4.3.4, Inputs, p. 31 5145bd8deadSopenharmony_ci 5155bd8deadSopenharmony_ci (modify third paragraph of the section, p. 31) ... Vertex shader inputs 5165bd8deadSopenharmony_ci can only be single-precision floating-point scalars, vectors, or matrices, 5175bd8deadSopenharmony_ci or signed and unsigned integers and integer vectors. Vertex shader inputs 5185bd8deadSopenharmony_ci can also form arrays of these types, but not structures. 5195bd8deadSopenharmony_ci 5205bd8deadSopenharmony_ci (modify third paragraph, p. 32, allowing doubles as inputs and disallowing 5215bd8deadSopenharmony_ci as non-flat fragment inputs) ... Fragment inputs can only be signed and 5225bd8deadSopenharmony_ci unsigned integers and integer vectors, float, floating-point vectors, 5235bd8deadSopenharmony_ci double, double-precision vectors, single- or double-precision matrices, or 5245bd8deadSopenharmony_ci arrays or structures of these. Fragment shader inputs that are signed or 5255bd8deadSopenharmony_ci unsigned integers, integer vectors, doubles, double-precision vectors, or 5265bd8deadSopenharmony_ci double-precision matrices must be qualified with the interpolation 5275bd8deadSopenharmony_ci qualifier flat. 5285bd8deadSopenharmony_ci 5295bd8deadSopenharmony_ci 5305bd8deadSopenharmony_ci Modify Section 4.3.6, Outputs, p. 33 5315bd8deadSopenharmony_ci 5325bd8deadSopenharmony_ci (modify third paragraph of the section, p. 33) They can only be float, 5335bd8deadSopenharmony_ci double, single- or double-precision floating-point vectors or matrices, 5345bd8deadSopenharmony_ci signed or unsigned integers or integer vectors, or arrays or structures of 5355bd8deadSopenharmony_ci any these. 5365bd8deadSopenharmony_ci 5375bd8deadSopenharmony_ci (modify last paragraph, p. 33) ... Fragment outputs can only be float, 5385bd8deadSopenharmony_ci single-precision floating-point vectors, signed or unsigned integers or 5395bd8deadSopenharmony_ci integer vectors, or arrays of these. ... 5405bd8deadSopenharmony_ci 5415bd8deadSopenharmony_ci 5425bd8deadSopenharmony_ci Modify Section 5.4.1, Conversion and Scalar Constructors, p. 49 5435bd8deadSopenharmony_ci 5445bd8deadSopenharmony_ci (add double to the first list of constructor examples) 5455bd8deadSopenharmony_ci 5465bd8deadSopenharmony_ci Converting between scalar types is done as the following prototypes 5475bd8deadSopenharmony_ci indicate: 5485bd8deadSopenharmony_ci 5495bd8deadSopenharmony_ci int(uint) // converts an unsigned integer value to a signed integer 5505bd8deadSopenharmony_ci int(float) // converts a float value to a signed integer 5515bd8deadSopenharmony_ci int(double) // converts a double value to a signed integer 5525bd8deadSopenharmony_ci int(bool) // converts a Boolean value to a signed integer 5535bd8deadSopenharmony_ci uint(int) // converts a signed integer value to an unsigned integer 5545bd8deadSopenharmony_ci uint(float) // converts a float value to an unsigned integer 5555bd8deadSopenharmony_ci uint(double) // converts a double value to an unsigned integer 5565bd8deadSopenharmony_ci uint(bool) // converts a Boolean value to an unsigned integer 5575bd8deadSopenharmony_ci float(int) // converts a signed integer value to a float 5585bd8deadSopenharmony_ci float(uint) // converts an unsigned integer value to a float 5595bd8deadSopenharmony_ci float(double) // converts a double value to a float 5605bd8deadSopenharmony_ci float(bool) // converts a Boolean value to a float 5615bd8deadSopenharmony_ci double(int) // converts a signed integer value to a double 5625bd8deadSopenharmony_ci double(uint) // converts an unsigned integer value to a double 5635bd8deadSopenharmony_ci double(float) // converts a float value to a double 5645bd8deadSopenharmony_ci double(bool) // converts a Boolean value to a double 5655bd8deadSopenharmony_ci bool(int) // converts a signed integer value to a Boolean 5665bd8deadSopenharmony_ci bool(uint) // converts an unsigned integer value to a Boolean 5675bd8deadSopenharmony_ci bool(float) // converts a float value to a Boolean 5685bd8deadSopenharmony_ci bool(double) // converts a double value to a Boolean 5695bd8deadSopenharmony_ci 5705bd8deadSopenharmony_ci (modify second paragraph of the section, p. 49) When constructors are used 5715bd8deadSopenharmony_ci to convert any floating-point type to an integer, the fractional part of 5725bd8deadSopenharmony_ci the floating-point value is dropped. ... 5735bd8deadSopenharmony_ci 5745bd8deadSopenharmony_ci (modify third paragraph of the section, p. 49) When a constructor is used 5755bd8deadSopenharmony_ci to convert any integer or floating-point type to bool, 0 and 0.0 are 5765bd8deadSopenharmony_ci converted to false, and non-zero values are converted to true. When a 5775bd8deadSopenharmony_ci constructor is used to convert a bool to any integer or floating-point 5785bd8deadSopenharmony_ci type, false is converted to 0 or 0.0, and true is converted to 1 or 1.0. 5795bd8deadSopenharmony_ci 5805bd8deadSopenharmony_ci 5815bd8deadSopenharmony_ci Modify Section 5.4.2, Vector and Matrix Constructors, p. 50 5825bd8deadSopenharmony_ci 5835bd8deadSopenharmony_ci (modify the last paragraph, p. 50) If the basic type (bool, int, uint, 5845bd8deadSopenharmony_ci float, or double) of a parameter to a constructor does not match the basic 5855bd8deadSopenharmony_ci type of the object being constructed, the scalar construction rules 5865bd8deadSopenharmony_ci (above) are used to convert the parameters. 5875bd8deadSopenharmony_ci 5885bd8deadSopenharmony_ci 5895bd8deadSopenharmony_ci (add to the first group of examples, p. 52) 5905bd8deadSopenharmony_ci 5915bd8deadSopenharmony_ci dmat2(dvec2, dvec2) 5925bd8deadSopenharmony_ci dmat3(dvec3, dvec3, dvec3) 5935bd8deadSopenharmony_ci dmat4(dvec4, dvec4, dvec4, dvec4) 5945bd8deadSopenharmony_ci dmat2x4(dvec3, double, // first column 5955bd8deadSopenharmony_ci double, dvec3) // second column 5965bd8deadSopenharmony_ci 5975bd8deadSopenharmony_ci 5985bd8deadSopenharmony_ci Modify Section 5.9, Expressions, p. 57 5995bd8deadSopenharmony_ci 6005bd8deadSopenharmony_ci (modify bulleted list as follows, adding support for double-precision 6015bd8deadSopenharmony_ci floating-point types) 6025bd8deadSopenharmony_ci 6035bd8deadSopenharmony_ci Expressions in the shading language are built from the following: 6045bd8deadSopenharmony_ci 6055bd8deadSopenharmony_ci * Constants of type bool, int, uint, float, double, all vector types and 6065bd8deadSopenharmony_ci all matrix types. 6075bd8deadSopenharmony_ci 6085bd8deadSopenharmony_ci ... 6095bd8deadSopenharmony_ci 6105bd8deadSopenharmony_ci * The arithmetic binary operators add (+), subtract (-), multiply (*), and 6115bd8deadSopenharmony_ci divide (/) operate on integer, single-precision floating-point, and 6125bd8deadSopenharmony_ci double-precision floating-point scalars, vectors, and matrices. If the 6135bd8deadSopenharmony_ci fundamental type (integer, single-precision floating-point, 6145bd8deadSopenharmony_ci double-precision floating-point) of the operands do not match, the 6155bd8deadSopenharmony_ci conversions from Section 4.1.10 "Implicit Conversions" are applied to 6165bd8deadSopenharmony_ci produce matching types. ... 6175bd8deadSopenharmony_ci 6185bd8deadSopenharmony_ci * The arithmetic unary operators negate (-), post- and pre-increment and 6195bd8deadSopenharmony_ci decrement (-- and ++) operate on integer, single-precision 6205bd8deadSopenharmony_ci floating-point, or double-precision floating-point values (including 6215bd8deadSopenharmony_ci vectors and matrices). ... 6225bd8deadSopenharmony_ci 6235bd8deadSopenharmony_ci * The relational operators greater than (>), less than (<), and less than 6245bd8deadSopenharmony_ci or equal (<=) operate only on scalar integer, single-precision 6255bd8deadSopenharmony_ci floating-point, or double-precision floating-point expressions. The 6265bd8deadSopenharmony_ci result is scalar Boolean. The fundamental type of the two operands must 6275bd8deadSopenharmony_ci match, either as specified, or after one of the implicit type 6285bd8deadSopenharmony_ci conversions specified in Section 4.1.10. ... 6295bd8deadSopenharmony_ci 6305bd8deadSopenharmony_ci ... 6315bd8deadSopenharmony_ci 6325bd8deadSopenharmony_ci 6335bd8deadSopenharmony_ci Modify Chapter 8, Built-in Functions, p. 81 6345bd8deadSopenharmony_ci 6355bd8deadSopenharmony_ci (add to description of generic types, last paragraph of p. 81) ... Where 6365bd8deadSopenharmony_ci the input arguments (and corresponding output) can be double, dvec2, 6375bd8deadSopenharmony_ci dvec3, or dvec4, <genDType> is used as the argument. ... Similarly, <mat> 6385bd8deadSopenharmony_ci is used for any matrix basic type with single-precision components and 6395bd8deadSopenharmony_ci <dmat> is used for any matrix basic type with double-precision components. 6405bd8deadSopenharmony_ci 6415bd8deadSopenharmony_ci 6425bd8deadSopenharmony_ci Modify Section 8.2, Exponential Functions, p. 83 6435bd8deadSopenharmony_ci 6445bd8deadSopenharmony_ci (add overloads for double-precision square roots) 6455bd8deadSopenharmony_ci 6465bd8deadSopenharmony_ci genDType sqrt(genDType x); 6475bd8deadSopenharmony_ci genDType inversesqrt(genDType x); 6485bd8deadSopenharmony_ci 6495bd8deadSopenharmony_ci 6505bd8deadSopenharmony_ci Modify Section 8.3, Common Functions, p. 84 6515bd8deadSopenharmony_ci 6525bd8deadSopenharmony_ci (add support for double-precision floating-point multiply-add) 6535bd8deadSopenharmony_ci 6545bd8deadSopenharmony_ci Syntax: 6555bd8deadSopenharmony_ci 6565bd8deadSopenharmony_ci genDType fma(genDType a, genDType b, genDType c); 6575bd8deadSopenharmony_ci 6585bd8deadSopenharmony_ci The function fma() performs a fused double-precision floating-point 6595bd8deadSopenharmony_ci multiply-add to compute the value a*b+c. The results of fma() may not be 6605bd8deadSopenharmony_ci identical to evaluating the expression (a*b)+c, because the computation 6615bd8deadSopenharmony_ci may be performed in a single operation with intermediate precision 6625bd8deadSopenharmony_ci different from that used to compute a non-fma() expression. 6635bd8deadSopenharmony_ci 6645bd8deadSopenharmony_ci The results of fma() are guaranteed to be invariant given fixed inputs 6655bd8deadSopenharmony_ci <a>, <b>, and <c>, as though the result were taken from a variable 6665bd8deadSopenharmony_ci declared as "precise". 6675bd8deadSopenharmony_ci 6685bd8deadSopenharmony_ci 6695bd8deadSopenharmony_ci (add support for double-precision frexp and ldexp functions) 6705bd8deadSopenharmony_ci 6715bd8deadSopenharmony_ci Syntax: 6725bd8deadSopenharmony_ci 6735bd8deadSopenharmony_ci genDType frexp(genDType x, out genIType exp); 6745bd8deadSopenharmony_ci genDType ldexp(genDType x, in genIType exp); 6755bd8deadSopenharmony_ci 6765bd8deadSopenharmony_ci The function frexp() splits each double-precision floating-point number in 6775bd8deadSopenharmony_ci <x> into its binary significand, a floating-point number in the range 6785bd8deadSopenharmony_ci [0.5, 1.0), and an integral exponent of two, such that: 6795bd8deadSopenharmony_ci 6805bd8deadSopenharmony_ci x = significand * 2 ^ exponent 6815bd8deadSopenharmony_ci 6825bd8deadSopenharmony_ci The significand is returned by the function; the exponent is returned in 6835bd8deadSopenharmony_ci the parameter <exp>. For a floating-point value of zero, the significant 6845bd8deadSopenharmony_ci and exponent are both zero. For a floating-point value that is an 6855bd8deadSopenharmony_ci infinity or is not a number, the results of frexp() are undefined. 6865bd8deadSopenharmony_ci 6875bd8deadSopenharmony_ci If the input <x> is a vector, this operation is performed in a 6885bd8deadSopenharmony_ci component-wise manner; the value returned by the function and the value 6895bd8deadSopenharmony_ci written to <exp> are vectors with the same number of components as <x>. 6905bd8deadSopenharmony_ci 6915bd8deadSopenharmony_ci The function ldexp() builds a double-precision floating-point number from 6925bd8deadSopenharmony_ci each significand component in <x> and the corresponding integral exponent 6935bd8deadSopenharmony_ci of two in <exp>, returning: 6945bd8deadSopenharmony_ci 6955bd8deadSopenharmony_ci significand * 2 ^ exponent 6965bd8deadSopenharmony_ci 6975bd8deadSopenharmony_ci If this product is too large to be represented as a double-precision 6985bd8deadSopenharmony_ci floating-point value, the result is considered undefined. 6995bd8deadSopenharmony_ci 7005bd8deadSopenharmony_ci If the input <x> is a vector, this operation is performed in a 7015bd8deadSopenharmony_ci component-wise manner; the value passed in <exp> and returned by the 7025bd8deadSopenharmony_ci function are vectors with the same number of components as <x>. 7035bd8deadSopenharmony_ci 7045bd8deadSopenharmony_ci 7055bd8deadSopenharmony_ci (add overloads for double-precision functions) 7065bd8deadSopenharmony_ci 7075bd8deadSopenharmony_ci genDType abs(genDType x); 7085bd8deadSopenharmony_ci genDType sign(genDType x); 7095bd8deadSopenharmony_ci genDType floor(genDType x); 7105bd8deadSopenharmony_ci genDType trunc(genDType x); 7115bd8deadSopenharmony_ci genDType round(genDType x); 7125bd8deadSopenharmony_ci genDType roundEven(genDType x); 7135bd8deadSopenharmony_ci genDType ceil(genDType x); 7145bd8deadSopenharmony_ci genDType fract(genDType x); 7155bd8deadSopenharmony_ci genDType mod(genDType x, double y); 7165bd8deadSopenharmony_ci genDType mod(genDType x, genDType y); 7175bd8deadSopenharmony_ci genDType modf(genDType x, out genDType i); 7185bd8deadSopenharmony_ci genDType min(genDType x, genDType y); 7195bd8deadSopenharmony_ci genDType min(genDType x, double y); 7205bd8deadSopenharmony_ci genDType max(genDType x, genDType y); 7215bd8deadSopenharmony_ci genDType max(genDType x, double y); 7225bd8deadSopenharmony_ci genDType clamp(genDType x, genDType minVal, genDType maxVal); 7235bd8deadSopenharmony_ci genDType clamp(genDType x, double minVal, double maxVal); 7245bd8deadSopenharmony_ci genDType mix(genDType x, genDType y, genDType a); 7255bd8deadSopenharmony_ci genDType mix(genDType x, genDType y, double a); 7265bd8deadSopenharmony_ci genDType mix(genDType x, genDType y, genBType a); 7275bd8deadSopenharmony_ci genDType step(genDType edge, genDType x); 7285bd8deadSopenharmony_ci genDType step(double edge, genDType x); 7295bd8deadSopenharmony_ci genDType smoothstep(genDType edge0, genDType edge1, genDType x); 7305bd8deadSopenharmony_ci genDType smoothstep(double edge0, double edge1, genDType x); 7315bd8deadSopenharmony_ci genBType isnan(genDType x); 7325bd8deadSopenharmony_ci genBType isinf(genDType x); 7335bd8deadSopenharmony_ci 7345bd8deadSopenharmony_ci 7355bd8deadSopenharmony_ci (add support for 64-bit floating-point packing and unpacking functions) 7365bd8deadSopenharmony_ci 7375bd8deadSopenharmony_ci Syntax: 7385bd8deadSopenharmony_ci 7395bd8deadSopenharmony_ci double packDouble2x32(uvec2 v); 7405bd8deadSopenharmony_ci uvec2 unpackDouble2x32(double v); 7415bd8deadSopenharmony_ci 7425bd8deadSopenharmony_ci The function packDouble2x32() returns a double obtained by packing the 7435bd8deadSopenharmony_ci components of a two-component unsigned integer vector into a 64-bit value 7445bd8deadSopenharmony_ci and interpeting its bits according to the IEEE double-precision 7455bd8deadSopenharmony_ci floating-point representation. The first vector component specifies the 7465bd8deadSopenharmony_ci 32 least significant bits; the second component specifies the 32 most 7475bd8deadSopenharmony_ci significant bits. 7485bd8deadSopenharmony_ci 7495bd8deadSopenharmony_ci The function unpackDouble2x32() returns a two-component unsigned integer 7505bd8deadSopenharmony_ci vector obtained by interpreting a double using the 64-bit IEEE 7515bd8deadSopenharmony_ci double-precision floating-point representation and unpacking into two 7525bd8deadSopenharmony_ci 32-bit halves. The first component of the vector contains the 32 least 7535bd8deadSopenharmony_ci significant bits of the double; the second component consists the 32 most 7545bd8deadSopenharmony_ci significant bits. 7555bd8deadSopenharmony_ci 7565bd8deadSopenharmony_ci 7575bd8deadSopenharmony_ci Modify Section 8.4, Geometric Functions, p. 87 7585bd8deadSopenharmony_ci 7595bd8deadSopenharmony_ci (add double-precision equivalents for existing geometric functions) 7605bd8deadSopenharmony_ci 7615bd8deadSopenharmony_ci double length(genDType x); 7625bd8deadSopenharmony_ci double distance(genDType p0, genDType p1); 7635bd8deadSopenharmony_ci double dot(genDType x, genDType y); 7645bd8deadSopenharmony_ci dvec3 cross(dvec3 x, dvec3 y); 7655bd8deadSopenharmony_ci genDType normalize(genDType x); 7665bd8deadSopenharmony_ci genDType faceforward(genDType N, genDType I, genDType Nref); 7675bd8deadSopenharmony_ci genDType reflect(genDType I, genDType N); 7685bd8deadSopenharmony_ci genDType refract(genDType I, genDType N, double eta); 7695bd8deadSopenharmony_ci 7705bd8deadSopenharmony_ci 7715bd8deadSopenharmony_ci Modify Section 8.5, Matrix Functions, p. 89 7725bd8deadSopenharmony_ci 7735bd8deadSopenharmony_ci (add double-precision equivalents for existing matrix functions) 7745bd8deadSopenharmony_ci 7755bd8deadSopenharmony_ci dmat matrixCompMult(dmat x, dmat y); 7765bd8deadSopenharmony_ci dmat2 outerProduct(dvec2 c, dvec2 r); 7775bd8deadSopenharmony_ci dmat3 outerProduct(dvec3 c, dvec3 r); 7785bd8deadSopenharmony_ci dmat4 outerProduct(dvec4 c, dvec4 r); 7795bd8deadSopenharmony_ci dmat2x3 outerProduct(dvec3 c, dvec2 r); 7805bd8deadSopenharmony_ci dmat3x2 outerProduct(dvec2 c, dvec3 r); 7815bd8deadSopenharmony_ci dmat2x4 outerProduct(dvec4 c, dvec2 r); 7825bd8deadSopenharmony_ci dmat4x2 outerProduct(dvec2 c, dvec4 r); 7835bd8deadSopenharmony_ci dmat3x4 outerProduct(dvec4 c, dvec3 r); 7845bd8deadSopenharmony_ci dmat4x3 outerProduct(dvec3 c, dvec4 r); 7855bd8deadSopenharmony_ci dmat2 transpose(dmat2 m); 7865bd8deadSopenharmony_ci dmat3 transpose(dmat3 m); 7875bd8deadSopenharmony_ci dmat4 transpose(dmat4 m); 7885bd8deadSopenharmony_ci dmat2x3 transpose(dmat3x2 m); 7895bd8deadSopenharmony_ci dmat3x2 transpose(dmat2x3 m); 7905bd8deadSopenharmony_ci dmat2x4 transpose(dmat4x2 m); 7915bd8deadSopenharmony_ci dmat4x2 transpose(dmat2x4 m); 7925bd8deadSopenharmony_ci dmat3x4 transpose(dmat4x3 m); 7935bd8deadSopenharmony_ci dmat4x3 transpose(dmat3x4 m); 7945bd8deadSopenharmony_ci double determinant(dmat2 m); 7955bd8deadSopenharmony_ci double determinant(dmat3 m); 7965bd8deadSopenharmony_ci double determinant(dmat4 m); 7975bd8deadSopenharmony_ci dmat2 inverse(dmat2 m); 7985bd8deadSopenharmony_ci dmat3 inverse(dmat3 m); 7995bd8deadSopenharmony_ci dmat4 inverse(dmat4 m); 8005bd8deadSopenharmony_ci 8015bd8deadSopenharmony_ci 8025bd8deadSopenharmony_ci Modify Section 8.6, Vector Relational Functions, p. 90 8035bd8deadSopenharmony_ci 8045bd8deadSopenharmony_ci (modify the first paragraph, p. 90, adding support for relational 8055bd8deadSopenharmony_ci functions operating on double precision types) 8065bd8deadSopenharmony_ci 8075bd8deadSopenharmony_ci Relational and equality operators (<, <=, >, >=, ==, !=) are defined (or 8085bd8deadSopenharmony_ci reserved) to operate on scalars and produce scalar Boolean results. For 8095bd8deadSopenharmony_ci vector results, use the following built-in functions. In the definitions 8105bd8deadSopenharmony_ci below, the following terms are used as placeholders for all vector types 8115bd8deadSopenharmony_ci for a given fundamental data type. In all cases, the sizes of the input 8125bd8deadSopenharmony_ci and return vectors for any particular call must match. 8135bd8deadSopenharmony_ci 8145bd8deadSopenharmony_ci placeholder fundamental types 8155bd8deadSopenharmony_ci ----------- ------------------------------------------------ 8165bd8deadSopenharmony_ci bvec bvec2, bvec3, bvec4 8175bd8deadSopenharmony_ci 8185bd8deadSopenharmony_ci ivec ivec2, ivec3, ivec4 8195bd8deadSopenharmony_ci 8205bd8deadSopenharmony_ci uvec uvec2, uvec3, uvec4 8215bd8deadSopenharmony_ci 8225bd8deadSopenharmony_ci vec vec2, vec3, vec4, dvec2, dvec3, dvec4 8235bd8deadSopenharmony_ci 8245bd8deadSopenharmony_ci 8255bd8deadSopenharmony_ci Modify Section 9, Shading Language Grammar, p. 92 8265bd8deadSopenharmony_ci 8275bd8deadSopenharmony_ci !!! TBD !!! 8285bd8deadSopenharmony_ci 8295bd8deadSopenharmony_ci 8305bd8deadSopenharmony_ciGLX Protocol 8315bd8deadSopenharmony_ci 8325bd8deadSopenharmony_ci !!! TBD 8335bd8deadSopenharmony_ci 8345bd8deadSopenharmony_ciDependencies on ARB_gpu_shader5 8355bd8deadSopenharmony_ci 8365bd8deadSopenharmony_ci If ARB_gpu_shader5 is not supported, the changes to the function 8375bd8deadSopenharmony_ci overloading rules in the OpenGL Shading Language Specification provided 8385bd8deadSopenharmony_ci there should included in this extension. 8395bd8deadSopenharmony_ci 8405bd8deadSopenharmony_ciDependencies on NV_gpu_shader5 8415bd8deadSopenharmony_ci 8425bd8deadSopenharmony_ci This extension and NV_gpu_shader5 both provide support for shading 8435bd8deadSopenharmony_ci language variables with 64-bit components. If both extensions are 8445bd8deadSopenharmony_ci supported, the various edits describing this new support should be 8455bd8deadSopenharmony_ci combined. 8465bd8deadSopenharmony_ci 8475bd8deadSopenharmony_ciDependencies on EXT_direct_state_access 8485bd8deadSopenharmony_ci 8495bd8deadSopenharmony_ci If EXT_direct_state_access is not supported, references to the 8505bd8deadSopenharmony_ci ProgramUniform*d*EXT functions should be removed. 8515bd8deadSopenharmony_ci 8525bd8deadSopenharmony_ci If EXT_direct_state_access is supported, that specification should be 8535bd8deadSopenharmony_ci edited as follows: 8545bd8deadSopenharmony_ci 8555bd8deadSopenharmony_ci (modify the ProgramUniform* language) 8565bd8deadSopenharmony_ci 8575bd8deadSopenharmony_ci The following commands: 8585bd8deadSopenharmony_ci 8595bd8deadSopenharmony_ci .... 8605bd8deadSopenharmony_ci void ProgramUniform{1,2,3,4}dEXT(uint program int location, T value); 8615bd8deadSopenharmony_ci void ProgramUniform{1,2,3,4}dvEXT (uint program, int location, 8625bd8deadSopenharmony_ci const T *value); 8635bd8deadSopenharmony_ci void ProgramUniformMatrix{2,3,4}dvEXT 8645bd8deadSopenharmony_ci (uint program, int location, sizei count, boolean transpose, 8655bd8deadSopenharmony_ci const double *value); 8665bd8deadSopenharmony_ci void ProgramUniformMatrix{2x3,3x2,2x4,4x2,3x4,4x3}dvEXT 8675bd8deadSopenharmony_ci (uint program, int location, sizei count, boolean transpose, 8685bd8deadSopenharmony_ci const double *value); 8695bd8deadSopenharmony_ci 8705bd8deadSopenharmony_ci operate identically to the corresponding command where "Program" is 8715bd8deadSopenharmony_ci deleted from the name (and extension suffixes are dropped or updated 8725bd8deadSopenharmony_ci appropriately) except, rather than updating the currently active program 8735bd8deadSopenharmony_ci object, these "Program" commands update the program object named by the 8745bd8deadSopenharmony_ci <program> parameter. ... 8755bd8deadSopenharmony_ci 8765bd8deadSopenharmony_ciDependencies on NV_shader_buffer_load 8775bd8deadSopenharmony_ci 8785bd8deadSopenharmony_ci If NV_shader_buffer_load is supported, that specification should be edited 8795bd8deadSopenharmony_ci as follows: 8805bd8deadSopenharmony_ci 8815bd8deadSopenharmony_ci Modify "Section 2.20.X, Shader Memory Access" from NV_shader_buffer_load. 8825bd8deadSopenharmony_ci 8835bd8deadSopenharmony_ci (add rules for loads of variables having the new data types from this 8845bd8deadSopenharmony_ci extension to the list of bullets following "When a shader dereferences a 8855bd8deadSopenharmony_ci pointer variable") 8865bd8deadSopenharmony_ci 8875bd8deadSopenharmony_ci - Data of type "double" are read from or written to memory as one 8885bd8deadSopenharmony_ci double-typed value at the specified GPU address. 8895bd8deadSopenharmony_ci 8905bd8deadSopenharmony_ci 8915bd8deadSopenharmony_ciErrors 8925bd8deadSopenharmony_ci 8935bd8deadSopenharmony_ci None. 8945bd8deadSopenharmony_ci 8955bd8deadSopenharmony_ciNew State 8965bd8deadSopenharmony_ci 8975bd8deadSopenharmony_ci None. 8985bd8deadSopenharmony_ci 8995bd8deadSopenharmony_ciNew Implementation Dependent State 9005bd8deadSopenharmony_ci 9015bd8deadSopenharmony_ci None. 9025bd8deadSopenharmony_ci 9035bd8deadSopenharmony_ciIssues 9045bd8deadSopenharmony_ci 9055bd8deadSopenharmony_ci (1) How do double-precision types interact with the rules for storing 9065bd8deadSopenharmony_ci uniforms in a buffer object? 9075bd8deadSopenharmony_ci 9085bd8deadSopenharmony_ci RESOLVED: The rules were already written with data types larger and 9095bd8deadSopenharmony_ci smaller than those in the original GLSL in mind. Single precision 9105bd8deadSopenharmony_ci floats typically take four bytes; doubles take eight bytes. The larger 9115bd8deadSopenharmony_ci storage requirement for doubles means a larger alignment requirement; 9125bd8deadSopenharmony_ci doubles still need to be size-aligned. 9135bd8deadSopenharmony_ci 9145bd8deadSopenharmony_ci (2) Should double-precision vertex shader inputs be supported? 9155bd8deadSopenharmony_ci 9165bd8deadSopenharmony_ci RESOLVED: Not in this extension. Such support will be added by the 9175bd8deadSopenharmony_ci EXT_vertex_attrib_64bit extension. 9185bd8deadSopenharmony_ci 9195bd8deadSopenharmony_ci (3) Should double-precision fragment shader outputs be supported? 9205bd8deadSopenharmony_ci 9215bd8deadSopenharmony_ci RESOLVED: Not in this extension. Note that we don't have 9225bd8deadSopenharmony_ci double-precision framebuffer formats to accept such values. 9235bd8deadSopenharmony_ci 9245bd8deadSopenharmony_ci (4) Should transform feedback be able to capture double-precision 9255bd8deadSopenharmony_ci components? 9265bd8deadSopenharmony_ci 9275bd8deadSopenharmony_ci RESOLVED: Yes. However, undefined behavior will occur unless all 9285bd8deadSopenharmony_ci components are captured to size-aligned offsets. 9295bd8deadSopenharmony_ci 9305bd8deadSopenharmony_ci If any variable captured in transform feedback has double-precision 9315bd8deadSopenharmony_ci components, the practical requirements for defined behavior are: 9325bd8deadSopenharmony_ci 9335bd8deadSopenharmony_ci (a) the offset of the base of a buffer object must be a multiple of 9345bd8deadSopenharmony_ci eight bytes; 9355bd8deadSopenharmony_ci 9365bd8deadSopenharmony_ci (b) the amount of data captured per vertex must be a multiple of eight 9375bd8deadSopenharmony_ci bytes; and 9385bd8deadSopenharmony_ci 9395bd8deadSopenharmony_ci (c) each double-precision variable captured must be aligned to a 9405bd8deadSopenharmony_ci multiple of eight bytes relative to the beginning of a vertex. 9415bd8deadSopenharmony_ci 9425bd8deadSopenharmony_ci If capturing a mix of single- and double-precision components, it might 9435bd8deadSopenharmony_ci be necessary to use the "gl_SkipComponents1" variable from 9445bd8deadSopenharmony_ci ARB_transform_feedback3 to force proper alignment. 9455bd8deadSopenharmony_ci 9465bd8deadSopenharmony_ci We considered the possibility of adding error checks to throw errors in 9475bd8deadSopenharmony_ci cases where undefined behavior might occur, but chose not to include 9485bd8deadSopenharmony_ci such errors. For OpenGL 3.0-style transform feedback, cases (b) and (c) 9495bd8deadSopenharmony_ci are solely a function of the variables captured could be detected when a 9505bd8deadSopenharmony_ci program object is linked. (Such an error would be more problematic for 9515bd8deadSopenharmony_ci transform feedback via NV_transform_feedback, where the set of variables 9525bd8deadSopenharmony_ci captured can be updated without relinking.) For case (a), the 9535bd8deadSopenharmony_ci requirement of OpenGL 3.0 is that transform feedback buffer offsets must 9545bd8deadSopenharmony_ci be a multiple of 4 bytes; enforcing a stricter 8-byte alignment would 9555bd8deadSopenharmony_ci require either a backward-incompatible change or a Begin-time error to 9565bd8deadSopenharmony_ci checks the offset of transform feedback buffers against the current 9575bd8deadSopenharmony_ci program. 9585bd8deadSopenharmony_ci 9595bd8deadSopenharmony_ci (5) Should we have double-precision matrix types? We didn't add integer 9605bd8deadSopenharmony_ci matrices, but integer matrix math is fairly uncommon. 9615bd8deadSopenharmony_ci 9625bd8deadSopenharmony_ci RESOLVED: Yes, we will support all matrix sizes in double-precision. 9635bd8deadSopenharmony_ci We will also provide double-precision equivalents for all matrix 9645bd8deadSopenharmony_ci operators and built-in matrix functions. 9655bd8deadSopenharmony_ci 9665bd8deadSopenharmony_ci (6) What should be done to distinguish between single- and 9675bd8deadSopenharmony_ci double-precision floating-point constants? 9685bd8deadSopenharmony_ci 9695bd8deadSopenharmony_ci RESOLVED: We will use "LF" to identify double-precision floating-point 9705bd8deadSopenharmony_ci constants. Here, we depart from the C standard. In C, floating-point 9715bd8deadSopenharmony_ci constants without a suffix are implicitly double-precision and require a 9725bd8deadSopenharmony_ci "F" suffix to specify a single-precision constant. However, GLSL has 9735bd8deadSopenharmony_ci historically provided no support for double precision. Changing to C 9745bd8deadSopenharmony_ci rules would materially affect the behavior of pre-existing shaders that 9755bd8deadSopenharmony_ci add an #extension line for this extension, since constants with no 9765bd8deadSopenharmony_ci suffix have meant "float" up to now. Additionally, such a change would 9775bd8deadSopenharmony_ci likely have required that we introduce implicit conversions from double 9785bd8deadSopenharmony_ci to float; otherwise, assigning a constant with no suffix to a float 9795bd8deadSopenharmony_ci would result in a compile-time error. 9805bd8deadSopenharmony_ci 9815bd8deadSopenharmony_ci (7) Should we require IEEE 1394-compliant behavior for NaNs and 9825bd8deadSopenharmony_ci infinities? Denorms? 9835bd8deadSopenharmony_ci 9845bd8deadSopenharmony_ci RESOLVED: Following historical precedent in the GLSL and OpenGL APIs 9855bd8deadSopenharmony_ci not defining special-case floating-point behavior, we chose not to do so 9865bd8deadSopenharmony_ci in this extension. 9875bd8deadSopenharmony_ci 9885bd8deadSopenharmony_ci (8) Should we provide double-precision versions of all the built-ins that 9895bd8deadSopenharmony_ci take a <genType>, which are currently defined to be floats and 9905bd8deadSopenharmony_ci floating-point vectors? 9915bd8deadSopenharmony_ci 9925bd8deadSopenharmony_ci RESOLVED: We provide double-precision versions of most of the built-in 9935bd8deadSopenharmony_ci functions supported by GLSL. We opted not to provide double-precision 9945bd8deadSopenharmony_ci functions for special trigonometry, exponential, derivative, and noise 9955bd8deadSopenharmony_ci functions. 9965bd8deadSopenharmony_ci 9975bd8deadSopenharmony_ci (9) Are double-precision "varyings" (values passed between shader stages) 9985bd8deadSopenharmony_ci supported by this extension? If so, is double-precision interpolation 9995bd8deadSopenharmony_ci is supported? 10005bd8deadSopenharmony_ci 10015bd8deadSopenharmony_ci RESOLVED: Double-precision shader inputs and outputs are supported, 10025bd8deadSopenharmony_ci except for vertex shader inputs and fragment shader outputs. 10035bd8deadSopenharmony_ci Additionally, double-precision vertex shader inputs are provided by the 10045bd8deadSopenharmony_ci separate extension EXT_vertex_attrib_64bit. No known extension provides 10055bd8deadSopenharmony_ci double-precision fragment outputs, but that doesn't seem important since 10065bd8deadSopenharmony_ci OpenGL provides no pixel/texture formats with double-precision 10075bd8deadSopenharmony_ci components that could reasonably receive such outputs. 10085bd8deadSopenharmony_ci 10095bd8deadSopenharmony_ci Interpolation not supported in this extension for double-precision 10105bd8deadSopenharmony_ci floating-point components. As with integer types in OpenGL 3.0, 10115bd8deadSopenharmony_ci double-precision floating-point fragment shader inputs must be qualified 10125bd8deadSopenharmony_ci as "flat". 10135bd8deadSopenharmony_ci 10145bd8deadSopenharmony_ci Note that this extension reformulates the spec language requiring "flat" 10155bd8deadSopenharmony_ci qualifiers, in addition to adding doubles to the list of "flat" types. 10165bd8deadSopenharmony_ci In GLSL 1.30, the spec applies these requirements to vertex shader 10175bd8deadSopenharmony_ci outputs but imposes no requirement on fragment inputs. We move this 10185bd8deadSopenharmony_ci requirement to fragment inputs, since vertex shader outputs may be 10195bd8deadSopenharmony_ci passed to tessellation or geometry shaders without interpolation, and 10205bd8deadSopenharmony_ci thus without the need for qualification by "flat". 10215bd8deadSopenharmony_ci 10225bd8deadSopenharmony_ci (15) Can the 64-bit uniform APIs be used to load values for uniforms of 10235bd8deadSopenharmony_ci type "bool", "bvec2", "bvec3", or "bvec4"? 10245bd8deadSopenharmony_ci 10255bd8deadSopenharmony_ci RESOLVED: No. OpenGL 2.0 and beyond did allow "bool" variable to be 10265bd8deadSopenharmony_ci set with Uniform*i* and Uniform*f APIs, and OpenGL 3.0 extended that 10275bd8deadSopenharmony_ci support to Uniform*ui* for orthogonality. But it seems pointless to 10285bd8deadSopenharmony_ci extended this capability forward to 64-bit Uniform APIs as well. 10295bd8deadSopenharmony_ci 10305bd8deadSopenharmony_ci (19) Should we support any implicit conversion of matrix types, now that 10315bd8deadSopenharmony_ci we have both "mat4" and "dmat4"? 10325bd8deadSopenharmony_ci 10335bd8deadSopenharmony_ci RESOLVED: No. It doesn't seem worth the trouble. 10345bd8deadSopenharmony_ci 10355bd8deadSopenharmony_ci 10365bd8deadSopenharmony_ci 10375bd8deadSopenharmony_ciRevision History 10385bd8deadSopenharmony_ci 10395bd8deadSopenharmony_ci Rev. Date Author Changes 10405bd8deadSopenharmony_ci ---- -------- -------- ----------------------------------------- 10415bd8deadSopenharmony_ci 11 08/27/12 pbrown Clarify that Uniform*d can not be used to load 10425bd8deadSopenharmony_ci uniforms with boolean types (bug 9345); import 10435bd8deadSopenharmony_ci issue (15) on the topic from NV_gpu_shader5. 10445bd8deadSopenharmony_ci 10455bd8deadSopenharmony_ci 10 03/23/10 pbrown Update issues section to include fp64 issues 10465bd8deadSopenharmony_ci that were left behind in NV_gpu_shader5 when the 10475bd8deadSopenharmony_ci specs were refactored. 10485bd8deadSopenharmony_ci 10495bd8deadSopenharmony_ci 9 02/02/10 pbrown Specify that capturing any component at an 10505bd8deadSopenharmony_ci offset that is not size-aligned results in 10515bd8deadSopenharmony_ci undefined behavior (bug 5863). 10525bd8deadSopenharmony_ci 10535bd8deadSopenharmony_ci 8 01/29/10 pbrown Remove shading language and API support for 10545bd8deadSopenharmony_ci double-precision vertex attributes; moved to the 10555bd8deadSopenharmony_ci EXT_vertex_attrib_64bit specification (bug 10565bd8deadSopenharmony_ci 5953). Added clarification disallowing 10575bd8deadSopenharmony_ci double-precision fragment shader outputs. 10585bd8deadSopenharmony_ci 10595bd8deadSopenharmony_ci 7 01/29/10 pbrown Delete accidental modifications to the language 10605bd8deadSopenharmony_ci for equal and not equal operators (bug 5904), 10615bd8deadSopenharmony_ci which already supported all types. 10625bd8deadSopenharmony_ci 10635bd8deadSopenharmony_ci 6 01/15/10 pbrown Modify the spec rules for counting attributes, 10645bd8deadSopenharmony_ci input and output components, and components 10655bd8deadSopenharmony_ci to capture in transform feedback to permit, 10665bd8deadSopenharmony_ci but not require, double-precision values to 10675bd8deadSopenharmony_ci require twice as many resources as single- 10685bd8deadSopenharmony_ci precision equivalents (bug 5855). 10695bd8deadSopenharmony_ci 10705bd8deadSopenharmony_ci 5 01/14/10 pbrown Minor updates from spec reviews. 10715bd8deadSopenharmony_ci 10725bd8deadSopenharmony_ci 4 12/10/09 pbrown Functionality updates from spec review: 10735bd8deadSopenharmony_ci Allow implicit conversion from mat*->dmat*. 10745bd8deadSopenharmony_ci Rename fmad and [un]packFloat2x32 to fma 10755bd8deadSopenharmony_ci and [un]packDouble2x32. Add overlooked 10765bd8deadSopenharmony_ci fp64 versions of geometric functions. 10775bd8deadSopenharmony_ci 10785bd8deadSopenharmony_ci 3 12/10/09 pbrown Convert from EXT to ARB. 10795bd8deadSopenharmony_ci 10805bd8deadSopenharmony_ci 2 12/08/09 pbrown Miscellaneous fixes from spec review: Clarified 10815bd8deadSopenharmony_ci input/output component counting rules, where 10825bd8deadSopenharmony_ci each fp64 value counts double. General typo 10835bd8deadSopenharmony_ci fixes and language clarifications. 10845bd8deadSopenharmony_ci 10855bd8deadSopenharmony_ci 1 pbrown Internal revisions. 1086