| Name | 
 |  | 
 |     OES_shader_image_atomic | 
 |  | 
 | Name Strings | 
 |  | 
 |     GL_OES_shader_image_atomic | 
 |  | 
 | Contact | 
 |  | 
 |     Bill Licea-Kane, Qualcomm Technologies, Inc. ( billl 'at' qti.qualcomm.com ) | 
 |  | 
 | Contributors | 
 |  | 
 |     Jeff Bolz, NVIDIA | 
 |     Pat Brown, NVIDIA | 
 |     Daniel Koch, NVIDIA | 
 |     Jon Leech | 
 |     Barthold Lichtenbelt, NVIDIA | 
 |     Bill Licea-Kane, AMD | 
 |     Eric Werness, NVIDIA | 
 |     Graham Sellers, AMD | 
 |     Greg Roth, NVIDIA | 
 |     Nick Haemel, AMD | 
 |     Pierre Boudier, AMD | 
 |     Piers Daniell, NVIDIA | 
 |  | 
 | Notice | 
 |  | 
 |     Copyright (c) 2011-2015 The Khronos Group Inc. Copyright termsat | 
 |         http://www.khronos.org/registry/speccopyright.html | 
 |  | 
 | Specification Update Policy | 
 |  | 
 |     Khronos-approved extension specifications are updated in response to | 
 |     issues and bugs prioritized by the Khronos OpenGL ES Working Group. For | 
 |     extensions which have been promoted to a core Specification, fixes will | 
 |     first appear in the latest version of that core Specification, and will | 
 |     eventually be backported to the extension document. This policy is | 
 |     described in more detail at | 
 |         https://www.khronos.org/registry/OpenGL/docs/update_policy.php | 
 |  | 
 | Status | 
 |  | 
 |     Complete. | 
 |     Ratified by the Khronos Board of Promoters on 2014/03/14. | 
 |  | 
 | Version | 
 |  | 
 |     Last Modified Date: April 30, 2015 | 
 |     Revision: 5 | 
 |  | 
 | Number | 
 |  | 
 |     OpenGL ES Extension #171 | 
 |  | 
 | Dependencies | 
 |  | 
 |     This extension is written against the OpenGL ES Version 3.1 (April 29, | 
 |     2015) Specification. | 
 |  | 
 |     This extension is written against the OpenGL ES Shading Language 3.10, | 
 |     Revision 3, 6 June 2014 Specification. | 
 |  | 
 |     OpenGL ES 3.1 and GLSL ES 3.10 are required. | 
 |  | 
 | Overview | 
 |  | 
 |     This extension provides built-in functions allowing shaders to perform | 
 |     atomic read-modify-write operations to a single level of a texture | 
 |     object from any shader stage. These built-in functions are named | 
 |     imageAtomic*(), and accept integer texel coordinates to identify the | 
 |     texel accessed. These built-in functions extend the Images in ESSL 3.10. | 
 |  | 
 | Additions to Chapter 7 of the OpenGL ES 3.1 specification (Programs and Shaders) | 
 |  | 
 |     Change the first paragraph of section 7.10 "Images" on p. 113: | 
 |  | 
 |    "Images are special uniforms used in the OpenGL ES Shading Language to | 
 |     identify a level of a texture to be read or written using image load, | 
 |     store, and atomic built-in functions in the manner ..." | 
 |  | 
 |  | 
 |     Change the third paragraph of section 7.10: | 
 |  | 
 |    "The type of an image variable must match the texture target of the image | 
 |     currently bound to the image unit, otherwise the result of a load, | 
 |     store, or atomic operation..." | 
 |  | 
 |  | 
 |     Change the first sentence of section 7.11 "Shader Memory Access" on p. | 
 |     113: | 
 |  | 
 |    "... shader buffer variables, or to texture or buffer object memory using | 
 |     built-in image load, store, and atomic functions operating on shader | 
 |     image variables..." | 
 |  | 
 | Additions to Chapter 8 of the OpenGL ES 3.1 specification (Textures and Samplers) | 
 |  | 
 |     Change the caption to table 8.26, p. 199 | 
 |  | 
 |    "Table 8.26: Mapping of image load, store, and atomic texel..." | 
 |  | 
 |  | 
 |     Change the first sentence of the second paragraph on p. 199: | 
 |  | 
 |    "When a shader accesses the texture bound to an image unit using a | 
 |     built-in image load, store or atomic function..." | 
 |  | 
 |  | 
 |     Change the fourth paragraph: | 
 |  | 
 |    "If the individual texel identified for an image load, store, or atomic | 
 |     operation ... Invalid image stores will have no effect. Invalid image | 
 |     atomics will not update any texture bound to the image unit and will | 
 |     return zero. An access is considered invalid if..." | 
 |  | 
 |  | 
 |     Change the first complete paragraph on p. 200: | 
 |  | 
 |    "Additionally, there are a number of cases where image load, store, or | 
 |     atomic operations are considered to involve a format mismatch. In such | 
 |     cases, undefined values will be returned by image loads and atomic | 
 |     operations, and undefined values will be written by stores and atomic | 
 |     operations. A format mismatch will occur if:" | 
 |  | 
 |  | 
 |     Change the last paragraph on p. 200: | 
 |  | 
 |    "Any image variable used for shader loads or atomic memory operations | 
 |     must be declared with a format <layout> qualifier matching ..." | 
 |  | 
 |  | 
 |     Change the last paragraph on p. 200: | 
 |  | 
 |    "When the format associated with an image unit does not exactly match the | 
 |     internal format of the texture bound to the image unit, image loads, | 
 |     stores and atomic operations re-interpret the memory holding the | 
 |     components of an accessed texel according to the format of the image | 
 |     unit. The re-interpretation for image loads and the read portion of | 
 |     image atomics is performed as though data were copied from the texel of | 
 |     the bound texture to a similar texel represented in the format of the | 
 |     image unit. Similarly, the re-interpretation for image stores and the | 
 |     write portion of image atomics is performed as though ..." | 
 |  | 
 | Changes to Chapter 20 (State Tables) | 
 |  | 
 |     Modify the description of MAX_IMAGE_UNITS in table 20.47 on p. 404: | 
 |  | 
 |    "MAX_IMAGE_UNITS ... No. of units for image load/store/atomics" | 
 |  | 
 | Additions to Appendix A of the OpenGL ES 3.1 specification (Invariance) | 
 |  | 
 |     Change the third sentence of the first paragraph in section A.1, p. 408: | 
 |  | 
 |    "This repeatability requirement doesn't apply when using shaders | 
 |     containing side effects (image stores, image atomic operations, atomic | 
 |     counter operations ..." | 
 |  | 
 |  | 
 |     Change the last sentence of Rule 4 in section A.3, p. 310: | 
 |  | 
 |    "Invariance is relaxed for shaders with side effects, such as image | 
 |     stores, image atomic operations, or accessing atomic counters (see | 
 |     section A.4)." | 
 |  | 
 |  | 
 |     Change the first sentence of the second paragraph of Rule 5, p. 310: | 
 |  | 
 |    "If a sequence of GL commands specifies primitives to be rendered with | 
 |     shaders containing side effects (image stores, image atomic operations, | 
 |     atomic counter operations ..." | 
 |  | 
 |  | 
 |     Change the first sentence of Rule 6, p. 411: | 
 |  | 
 |    "For any given GL and framebuffer state vector, and for any given GL | 
 |     command, the contents of any framebuffer state not directly or | 
 |     indirectly affected by results of shader image stores, image atomic | 
 |     operations, or atomic counter operations ..." | 
 |  | 
 |  | 
 |     Change the first bullet of Rule 7, p. 411: | 
 |  | 
 |    "* shader invocations do not use image atomic operations or atomic | 
 |       counters;" | 
 |  | 
 |  | 
 |     Change the first sentence of the second paragraph of Rule 7: | 
 |  | 
 |    "When any sequence of GL commands triggers shader invocations that | 
 |     perform image stores, image atomic operations, atomic counter | 
 |     operations ..." | 
 |  | 
 |  | 
 | Modifications to the OpenGL ES 3.10 Shading Language Specification | 
 |  | 
 |     Including the following line in a shader can be used to control the | 
 |     language features described in this extension: | 
 |  | 
 |         #extension GL_OES_shader_image_atomic : <behavior> | 
 |  | 
 |     where <behavior> is as specified in section 3.3. | 
 |  | 
 |     New preprocessor #defines are added to the OpenGL Shading Language: | 
 |  | 
 |         #define GL_OES_shader_image_atomic | 
 |  | 
 |  | 
 |     Modifications to Chapter 4 (Variables and Types) of the OpenGL ES 3.10 | 
 |     Shading Language Specification | 
 |  | 
 |     Change the first sentence of the third paragraph of section 4.1.7.2 | 
 |     (Images), p. 28: | 
 |  | 
 |    "Image variables are used in the image load, store, and | 
 |     atomic functions described in section 8.12 ..." | 
 |  | 
 |  | 
 |     Add to section 8.12 (Image Functions) | 
 |  | 
 |     Add new overview and syntax and description table following existing | 
 |     Image Functions table, p. 129: | 
 |  | 
 |    "The atomic functions perform operations on individual texels or samples | 
 |     of an image variable. Atomic memory operations read a value from the | 
 |     selected texel, compute a new value using one of the operations | 
 |     described below, write the new value to the selected texel, and return | 
 |     the original value read. The contents of the texel being updated by the | 
 |     atomic operation are guaranteed not to be updated by any other image | 
 |     store or atomic function between the time the original value is read and | 
 |     the time the new value is written. | 
 |  | 
 |     Atomic memory operations are supported on only a subset of all image | 
 |     variable types; <image> must be either: | 
 |  | 
 |       * a signed integer image variable (type starts "iimage") and a format | 
 |         qualifier of "r32i", used with a <data> argument of type "int", or | 
 |       * an unsigned integer image variable (type starts "uimage") and a | 
 |         format qualifier of "r32ui", used with a <data> argument of type | 
 |         "uint", or | 
 |       * a float image variable (type starts "image") and a format qualifier | 
 |         of "r32f", used with a <data> argument of type "float" | 
 |         (imageAtomicExchange only). | 
 |  | 
 |     Add to the table of image functions, p. 129: | 
 |  | 
 |     Syntax                            Description | 
 |     -------------------------------   ------------------------------------- | 
 |     highp uint imageAtomicAdd(        Computes a new value by adding the | 
 |         coherent IMAGE_PARAMS,        value of <data> to the contents of | 
 |         uint data);                   the selected texel. | 
 |     highp int imageAtomicAdd( | 
 |         coherent IMAGE_PARAMS, | 
 |         int data); | 
 |     ----------------------------------------------------------------------- | 
 |     highp uint imageAtomicMin(        Computes a new value by taking the | 
 |         coherent IMAGE_PARAMS,        minimum of the value of <data> and | 
 |         uint data);                   the contents of the selected texel. | 
 |     highp int imageAtomicMin( | 
 |         coherent IMAGE_PARAMS, | 
 |         int data); | 
 |     ----------------------------------------------------------------------- | 
 |     highp uint imageAtomicMax(        Computes a new value by taking the | 
 |         coherent IMAGE_PARAMS,        maximum of the value of <data> and | 
 |         uint data);                   the contents of the selected texel. | 
 |     highp int imageAtomicMax( | 
 |         coherent IMAGE_PARAMS, | 
 |         int data); | 
 |     ----------------------------------------------------------------------- | 
 |     highp uint imageAtomicAnd(        Computes a new value by performing a | 
 |         coherent IMAGE_PARAMS,        bitwise AND of the value of <data> | 
 |         uint data);                   and the contents of the selected | 
 |     highp int imageAtomicAnd(         texel. | 
 |         coherent IMAGE_PARAMS, | 
 |         int data); | 
 |     ----------------------------------------------------------------------- | 
 |     highp uint imageAtomicOr(         Computes a new value by performing a | 
 |         coherent IMAGE_PARAMS,        bitwise OR of the value of <data> | 
 |         uint data);                   and the contents of the selected | 
 |     highp int imageAtomicOr(          texel. | 
 |         coherent IMAGE_PARAMS, | 
 |         int data); | 
 |     ----------------------------------------------------------------------- | 
 |     highp uint imageAtomicXor(        Computes a new value by performing a | 
 |         coherent IMAGE_PARAMS,        bitwise EXCLUSIVE OR of the value of | 
 |         uint data);                   <data> and the contents of the | 
 |     highp int imageAtomicXor(         selected texel. | 
 |         coherent IMAGE_PARAMS, | 
 |         int data); | 
 |     ----------------------------------------------------------------------- | 
 |     highp uint imageAtomicExchange(   Computes a new value by simply | 
 |         coherent IMAGE_PARAMS,        copying the value of <data>. | 
 |         uint data); | 
 |     highp int imageAtomicExchange( | 
 |         coherent IMAGE_PARAMS, | 
 |         int data); | 
 |     highp float imageAtomicExchange( | 
 |         coherent IMAGE_PARAMS, | 
 |         float data); | 
 |     ----------------------------------------------------------------------- | 
 |     highp uint imageAtomicCompSwap(   Compares the value of <compare> and | 
 |         coherent IMAGE_PARAMS,        the contents of the selected texel. | 
 |         uint compare,                 If the values are equal, the new | 
 |         uint data);                   value is given by <data>; otherwise, | 
 |     highp int imageAtomicCompSwap(    it is taken from the original value | 
 |         coherent IMAGE_PARAMS,        loaded from the texel. | 
 |         int compare, | 
 |         int data); | 
 |     ----------------------------------------------------------------------- | 
 |  | 
 | Issues | 
 |  | 
 |     (0)  This extension is based on ARB_shader_image_load_store.  What | 
 |          are the major differences? | 
 |  | 
 |          1 - This extension splits out only the image atomic operations | 
 |              from ARB_shader_image_load_store. | 
 |          2 - It depends on image load/store functionality that is part of | 
 |              OpenGL ES 3.1, and inherits the list of differences from | 
 |              desktop implementations in ES 3.1. Note that issue 0 of the | 
 |              (unpublished) XXX_shader_image_load_store used for prototyping | 
 |              ES 3.1 language contains the list explicitly; perhaps it should | 
 |              should be reproduced here as well. | 
 |  | 
 |     (1) Should the shading language built-ins have OES suffixes? | 
 |  | 
 |         RESOLVED: No. Per Bug 11637, the WG made a policy decision | 
 |         that GLSL ES identifiers imported without semantic change | 
 |         or subsetting as OES extensions from core GLSL do not carry | 
 |         suffixes. The #extension mechanism must still be used to | 
 |         enable the appropriate extension before the functionality can | 
 |         be used. | 
 |  | 
 | Revision History | 
 |  | 
 |     Rev.  Date        Author    Changes | 
 |     1     2014-01-30  wwlk      Initial draft | 
 |     2     2014-01-31  wwlk      Update to current draft base specs | 
 |                                 (further updates coming as | 
 |                                 additional draft specs done. | 
 |                                 Otherwise, this spec is probably | 
 |                                 ready to review.) | 
 |     3     2014-02-11  dkoch     remove GLSL builtin suffixes per issue 1. | 
 |     4     2014-03-04  dkoch     add coherent to image parameter (Bug 11595) | 
 |     5     2015-04-30  Jon Leech Require OpenGL ES 3.1 and remove dependency | 
 |                                 on nonexistent shader_image_load_store | 
 |                                 extension. Rewrite changes against the | 
 |                                 published ES 3.1 / ESSL 3.10 specifications. | 
 |                                 Remove references to multisampled image | 
 |                                 atomic support, which does not exist in ES | 
 |                                 3.1. (Bugs 13879, 13887) |