Name

    NV_compute_shader_derivatives

Name Strings

    GL_NV_compute_shader_derivatives

Contact

    Pat Brown, NVIDIA (pbrown 'at' nvidia.com)

Contributors

    Ashwin Lele, NVIDIA
    Jeff Bolz, NVIDIA
    Michael Chock, NVIDIA

Status

    Shipping

Version

    Last Modified:      September 4, 2019
    Revision:           3

Number

    OpenGL Extension #525
    OpenGL ES Extension #308

Dependencies

    This extension is written against the OpenGL 4.6 Specification
    (Compatibility Profile), dated October 24, 2016.

    OpenGL 4.5 or OpenGL ES 3.2 is required.

    This extension interacts with ARB_compute_variable_group_size.

    This extension requires support for the OpenGL Shading Language (GLSL)
    extension "NV_compute_shader_derivatives", which can be found at the
    Khronos Group Github site here:

        https://github.com/KhronosGroup/GLSL

Overview

    This extension adds OpenGL and OpenGL ES API support for the OpenGL
    Shading Language (GLSL) extension "NV_compute_shader_derivatives".

    That extension, when enabled, allows applications to use derivatives in
    compute shaders.  It adds compute shader support for explicit derivative
    built-in functions like dFdx(), automatic derivative computation in
    texture lookup functions like texture(), use of the optional LOD bias
    parameter to adjust the computed level of detail values in texture lookup
    functions, and the texture level of detail query function
    textureQueryLod().

New Procedures and Functions

    None

New Tokens

    None

Modifications to the OpenGL 4.6 Specification (Compatibility Profile)

    None

Modifications to the OpenGL ES 3.2 Specification

    None

Additions to the AGL/GLX/WGL Specifications

    None

Errors

    None

New State

    None

New Implementation Dependent State

    None

Dependencies on ARB_compute_variable_group_size

    If ARB_compute_variable_group_size is supported, the GLSL compiler/linker is
    unable to enforce the following restrictions:

    * Compute shaders using the "derivative_group_quadsNV" mode must have a
      local workgroup size whose width and height are both multiples of two.

    * Compute shaders using the "derivative_group_linearNV" mode must have a
      local workgroup size whose total number of invocations is a multiple of four.

    Instead, we need to enforce this restriction at run time.

    Add the following to the list of errors under the heading of "insert at the
    end of the first error block, shared between DispatchCompute and
    DispatchComputeGroupSizeARB, p. 586" in ARB_compute_variable_group_size:

    * An INVALID_VALUE error is generated by DispatchComputeGroupSizeARB if the
      active program for the compute shader stage has a compute shader using the
      "derivative_group_quadsNV" layout qualifier and <group_size_x> or
      <group_size_y> is not a multiple of two.

    * An INVALID_VALUE error is generated by DispatchComputeGroupSizeARB if the
      active program for the compute shader stage has a compute shader using the
      "derivative_group_linearNV" layout qualifier and the product of
      <group_size_x>, <group_size_y>, and <group_size_z> is not a multiple of
      four.

    Note that as of September 2019, this issue does not apply to SPIR-V compute
    shaders because SPIR-V does not provide a mechanism to specify variable
    local group sizes.  If this changes in the future, the INVALID_VALUE error
    above would apply both to GLSL and SPIR-V compute shaders.


Issues

    (1) How does this extension interact with ARB_compute_variable_group_size?

      RESOLVED:  For compute shaders with fixed group size, the GLSL
      specification calls for a compile- or link-time error if the local group
      size is inconsistent with the derivative mode specified using the
      "derivative_group_quadsNV" or "derivative_group_linearNV" layout
      qualifiers.  However, this sort of error can not be generated if
      "local_size_variable" is also specified because the local group size is
      not known until DispatchComputeGroupSizeARB is called.  To deal with this,
      we specify an INVALID_VALUE error if DispatchComputeGroupSizeARB is called
      with a bad local group size.

Revision History

    Revision 3 (pbrown), 2019/09/04
    - Add an interaction with ARB_compute_variable_group_size, specifying
      that INVALID_VALUE is generated by DispatchComputeGroupSizeARB if the
      derivative mode is inconsistent with the local group size specified in the
      dispatch command.

    Revision 2 (mchock)
    - Added OpenGL ES support.

    Revision 1 (pbrown)
    - Internal revisions.
