Name

     NV_shader_atomic_int64

Name Strings

     GL_NV_shader_atomic_int64

Contact

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

Contributors

     Pat Brown, NVIDIA
     Jeff Bolz, NVIDIA
     Cyril Crassin, NVIDIA
     Christoph Kubisch, NVIDIA

Status

     Shipping

Version

     Last Modified Date:	March 13, 2014
     NVIDIA Revision:		2

Number

     OpenGL Extension #455

Dependencies

     This extension is written against version 4.40 (revision 8) of the OpenGL
     Shading Language Specification, dated January 22, 2014.

     This extension interacts with NV_shader_buffer_store and NV_gpu_shader5.

     This extension interacts with NV_gpu_program5, NV_compute_program5, and
     NV_shader_storage_buffer_object.

Overview

     This extension provides additional GLSL built-in functions and assembly
     opcodes allowing shaders to perform additional atomic read-modify-write
     operations on 64-bit signed and unsigned integers stored in buffer object
     memory.

New Procedures and Functions

     None.

New Tokens

     None.

Additions to OpenGL 4.4 Specification

     None.

Additions to the AGL/GLX/WGL Specifications

     None.

GLX Protocol

     None.

Modifications to the OpenGL Shading Language Specification, Version 4.40
(revision 8)

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

       #extension GL_NV_shader_atomic_int64 : <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_int64	 1

    Modify Section 8.11, Atomic Memory Functions, p. 168

    Add the following new functions to the table on p. 173:

      uint64_t atomicMin(inout uint64_t mem, uint64_t data);
      uint64_t atomicMax(inout uint64_t mem, uint64_t data);
      uint64_t atomicAnd(inout uint64_t mem, uint64_t data);
      uint64_t atomicOr (inout uint64_t mem, uint64_t data);
      uint64_t atomicXor(inout uint64_t mem, uint64_t data);

      int64_t atomicMin(inout int64_t mem, int64_t data);
      int64_t atomicMax(inout int64_t mem, int64_t data);
      int64_t atomicAnd(inout int64_t mem, int64_t data);
      int64_t atomicOr (inout int64_t mem, int64_t data);
      int64_t atomicXor(inout int64_t mem, int64_t data);

      int64_t atomicAdd(inout int64_t mem, int64_t data);
      int64_t atomicExchange(inout int64_t mem, int64_t data);
      int64_t atomicCompSwap(inout int64_t mem, int64_t data);

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:

      uint64_t atomicMin(uint64_t *address, uint64_t data);
      uint64_t atomicMax(uint64_t *address, uint64_t data);
      uint64_t atomicAnd(uint64_t *address, uint64_t data);
      uint64_t atomicOr (uint64_t *address, uint64_t data);
      uint64_t atomicXor(uint64_t *address, uint64_t data);

      int64_t atomicMin(int64_t *address, int64_t data);
      int64_t atomicMax(int64_t *address, int64_t data);
      int64_t atomicAnd(int64_t *address, int64_t data);
      int64_t atomicOr (int64_t *address, int64_t data);
      int64_t atomicXor(int64_t *address, int64_t data);

      int64_t atomicAdd(int64_t *address, int64_t data);
      int64_t atomicExchange(int64_t *address, int64_t data);
      int64_t atomicCompSwap(int64_t *address, int64_t data);

Dependencies on NV_gpu_program5, NV_compute_program5, and
NV_shader_storage_buffer_object

    If NV_gpu_program5 is supported and "OPTION NV_shader_atomic_uint64" is
    specified in an assembly program, new combinations of atomic operations
    and storage modifiers are supported for the ATOM, ATOMB, and ATOMS
    instructions.  (Note:  ATOMB comes from NV_shader_storage_buffer_object
    and ATOMS comes from NV_compute_program5.)	"S64" should be allowed as a
    storage modifier for the atomic operations "MIN', "MAX", "AND", "OR",
    "XOR", "ADD", "EXCH", and "CSWAP".	"U64" should be allowed a s storage
    modifier for the atomic operations "MIN", "MAX", "AND", "OR", and "XOR".

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

      + Extended 64-bit Atomic Operations (NV_shader_atomic_uint64)

	If a program specifies the "NV_shader_atomic_uint64" option, it may
	use the "S64" storage modifier with the atomic operations "MIN',
	"MAX", "AND", "OR", "XOR", "ADD", "EXCH", and "CSWAP", and the "U64"
	storage modifier with the atomic operations "MIN", "MAX", "AND", "OR",
	and "XOR".

    (Add "U64" and or "S64" opcode modifiers to the table in "Section 2.X.8.Z:
     ATOM" in NV_gpu_program5, "Section 2.X.8.Z: ATOMS" in
     NV_compute_program5, and "Section 2.X.8.Z: ATOMB" in
     NV_shader_storage_buffer_object)

      atomic	 storage
      modifier	 modifiers	      operation
      --------	 ------------------   --------------------------------------
       ADD	 U32, S32, U64, S64   compute a sum
       MIN	 U32, S32, U64, S64   compute minimum
       MAX	 U32, S32, U64, S64   compute maximum
       AND	 U32, S32, U64, S64   compute bit-wise AND
       OR	 U32, S32, U64, S64   compute bit-wise OR
       XOR	 U32, S32, U64, S64   compute bit-wise XOR
       EXCH	 U32, S32, U64, S64   exchange memory with operand
       CSWAP	 U32, S32, U64, S64   compare-and-swap

    No new support is provided for the IWRAP and DWRAP atomic operations.

Errors

     None.

New State

     None.

New Implementation Dependent State

     None.

Issues

     None.

Revision History

    Revision 2, March 13, 2014 (pbrown)

      Update to OpenGL 4.4 / GLSL 4.40, plus minor clarifications.

    Revision 1, November 8, 2013 (ckubisch)

      Initial revision.
