blob: 3258d803f48c268f9461934f69898e2d3c5c76e5 [file] [log] [blame]
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)