Name

    NV_shader_atomic_float

Name Strings

    GL_NV_shader_atomic_float

Contact

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

Contributors

    Cyril Crassin, NVIDIA
    Eric Werness, NVIDIA
    Jeff Bolz, NVIDIA

Status

    Shipping

Version

    Last Modified Date:         August 13, 2012
    NVIDIA Revision:            2

Number

    419

Dependencies

    This extension is written against the OpenGL 4.2 (Compatibility Profile)
    Specification.

    This extension is written against version 4.20 (revision 6) of the OpenGL
    Shading Language Specification.

    This extension interacts with EXT_shader_image_load_store,
    ARB_shader_image_load_store, and GLSL 4.20.

    This extension interacts with NV_shader_buffer_store and NV_gpu_shader5.

    This extension interacts with NV_gpu_program5.

    This extension interacts with EXT_shader_image_load_store and
    NV_gpu_program5.

    This extension interacts with GLSL 4.30, ARB_shader_storage_buffer_object,
    and ARB_compute_shader.

Overview

    This extension provides GLSL built-in functions and assembly opcodes
    allowing shaders to perform atomic read-modify-write operations to buffer
    or texture memory with floating-point components.  The set of atomic
    operations provided by this extension is limited to adds and exchanges.
    Providing atomic add support allows shaders to atomically accumulate the
    sum of floating-point values into buffer or texture memory across multiple
    (possibly concurrent) shader invocations.

    This extension provides GLSL support for atomics targeting image uniforms
    (if GLSL 4.20, ARB_shader_image_load_store, or EXT_shader_image_load_store
    is supported) or floating-point pointers (if NV_gpu_shader5 is supported).
    Additionally, assembly opcodes for these operations is also provided if
    NV_gpu_program5 is supported.

New Procedures and Functions

    None.

New Tokens

    None.

Additions to Chapter 2 of the OpenGL 4.2 (Compatibility Profile) Specification
(OpenGL Operation)

    None.

Additions to Chapter 3 of the OpenGL 4.2 (Compatibility Profile) Specification
(Rasterization)

    None.

Additions to Chapter 4 of the OpenGL 4.2 (Compatibility Profile) Specification
(Per-Fragment Operations and the Frame Buffer)

    None.

Additions to Chapter 5 of the OpenGL 4.2 (Compatibility Profile) Specification
(Special Functions)

    None.

Additions to Chapter 6 of the OpenGL 4.2 (Compatibility Profile) Specification
(State and State Requests)

    None.

Additions to the AGL/GLX/WGL Specifications

    None.

GLX Protocol

    None.

Modifications to the OpenGL Shading Language Specification, Version 4.20
(revision 6)

    Including the following line in a shader can be used to control the
    language features described in this extension:

      #extension GL_NV_shader_atomic_float : <behavior>

    where <behavior> is as specified in section 3.3.

    New preprocessor #defines are added to the OpenGL Shading Language:

      #define GL_NV_shader_atomic_float         1

    Modify Section 8.11, Image Functions (p. 149)

    (add to "imageAtomicAdd" table cell, p. 151)

      float imageAtomicAdd(IMAGE_PARAMS, float data)

    (add to "imageAtomicExchange" table cell, p. 152)

      float imageAtomicExchange(IMAGE_PARAMS, float data)

Dependencies on EXT_shader_image_load_store, ARB_shader_image_load_store, and
GLSL 4.20

    If none of EXT_shader_image_load_store, ARB_shader_image_load_store, or
    GLSL 4.20 are supported, the new floating-point variants of the built-in
    functions imageAtomicAdd and imageAtomicExchange should be removed.

Dependencies on NV_shader_buffer_store and NV_gpu_shader5

    If NV_shader_buffer_store and NV_gpu_shader5 are supported, the following
    functions should be added to the "Section 8.Y, Shader Memory Functions"
    language in the NV_shader_buffer_store specification:

      float atomicAdd(float *address, float data);
      float atomicExchange(float *address, float data);

Dependencies on NV_gpu_program5

    If NV_gpu_program5 is supported and "OPTION NV_shader_atomic_float" is
    specified in an assembly program, "F32" should be allowed as a storage
    modifier to the ATOM instruction for the atomic operations "ADD" and
    "EXCH".

    (Add to "Section 2.X.6, Program Options" of the NV_gpu_program4 extension,
    as extended by NV_gpu_program5:)

      + Floating-Point Atomic Operations (NV_shader_atomic_float)

      If a program specifies the "NV_shader_atomic_float" option, it may use
      "F32" storage modifier with the "ATOM" and "ATOMIM" opcodes to perform
      atomic floating-point add or exchange operations.
    
    (Add to the table in "Section 2.X.8.Z, ATOM" in NV_gpu_program5:)

      atomic     storage
      modifier   modifiers            operation
      --------   ------------------   --------------------------------------
       ADD       U32, S32, U64, F32   compute a sum
       ...
       EXCH      U32, S32, U64, F32   exchange memory with operand

Dependencies on EXT_shader_image_load_store and NV_gpu_program5

    If EXT_shader_image_load_store and NV_gpu_program5 are supported and
    "OPTION NV_shader_atomic_float" is specified in an assembly program, "F32"
    should be allowed as a storage modifier to the ATOMIM instruction for the
    atomic operations "ADD" and "EXCH".

    (Add to the table in "Section 2.X.8.Z, ATOMIM" in the "Dependencies on
    NV_gpu_program5" portion of the EXT_shader_image_load specification)

      atomic     storage
      modifier   modifiers       operation
      --------   -------------   --------------------------------------
       ADD       U32, S32, F32   compute a sum
       ...
       EXCH      U32, S32, F32   exchange memory with operand

Dependencies on GLSL 4.30, ARB_shader_storage_buffer_object, and
ARB_compute_shader

    If GLSL 4.30 is supported, add the following atomic memory functions to
    section 8.11 (Atomic Memory Functions) of the GLSL 4.30 specification:

      float atomicAdd(inout float mem, float data);
      float atomicExchange(inout float mem, float data);

    If ARB_shader_storage_buffer_object or ARB_compute_shader are supported,
    make similar edits to the functions documented in the
    ARB_shader_storage_buffer object extension.

    These functions are available if and only if GL_NV_shader_atomic_float is
    enabled via the "#extension" directive.

Errors

    None.

New State

    None.

New Implementation Dependent State

    None.

Issues

    (1) What atomic operations should we support for floating-point targets?

      RESOLVED:  Floating-point atomic addition is the main functionality
      targeted by this extension.  We provide exchanges because the operation
      needs no special hardware support.

      We chose not to provide support for bitwise operations (AND/OR/XOR);
      it's possible to support these by casting a pointer or aliasing an image
      if required.  Minimum, maximum, and compare-and-swap make sense, but the
      underlying atomic hardware targeted by this extension does not support
      floating-point comparisons.

Revision History

    Rev.    Date    Author    Changes
    ----  --------  --------  -----------------------------------------
     2    08/13/12  pbrown    Add interaction with OpenGL 4.3 (and related ARB
                              extensions) supporting floating-point atomics
                              to shared and shader storage buffer memory.

     1              pbrown    Internal revisions.
