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