blob: d6bbdef65a2c4b5b345c0fdac59edbc8811471fd [file] [log] [blame]
Name Strings
Tobias Hector, Imagination Technologies (tobias.hector 'at'
Contributors to the original ARB_shader_group_vote specification
Daniel Koch, NVIDIA
Last Modified Date: December 10, 2018
Revision: 3
OpenGL ES Extension #254
This extension is written against the OpenGL ES Shading Language
Specification, Version 3.00.4.
OpenGL ES 3.0 is required.
This extension provides new built-in functions to compute the composite of
a set of boolean conditions across a group of shader invocations. These
composite results may be used to execute shaders more efficiently on a
single-instruction multiple-data (SIMD) processor. The set of shader
invocations across which boolean conditions are evaluated is
implementation-dependent, and this extension provides no guarantee over
how individual shader invocations are assigned to such sets. In
particular, the set of shader invocations has no necessary relationship
with the compute shader workgroup -- a pair of shader invocations
in a single compute shader workgroup may end up in different sets used by
these built-ins.
Compute shaders operate on an explicitly specified group of threads (a
workgroup), but many implementations of OpenGL ES 3.0 will even group
non-compute shader invocations and execute them in a SIMD fashion. When
executing code like
if (condition) {
result = do_fast_path();
} else {
result = do_general_path();
where <condition> diverges between invocations, a SIMD implementation
might first call do_fast_path() for the invocations where <condition> is
true and leave the other invocations dormant. Once do_fast_path()
returns, it might call do_general_path() for invocations where <condition>
is false and leave the other invocations dormant. In this case, the
shader executes *both* the fast and the general path and might be better
off just using the general path for all invocations.
This extension provides the ability to avoid divergent execution by
evaluting a condition across an entire SIMD invocation group using code
if (allInvocationsEXT(condition)) {
result = do_fast_path();
} else {
result = do_general_path();
The built-in function allInvocationsEXT() will return the same value for
all invocations in the group, so the group will either execute
do_fast_path() or do_general_path(), but never both. For example, shader
code might want to evaluate a complex function iteratively by starting
with an approximation of the result and then refining the approximation.
Some input values may require a small number of iterations to generate an
accurate result (do_fast_path) while others require a larger number
(do_general_path). In another example, shader code might want to evaluate
a complex function (do_general_path) that can be greatly simplified when
assuming a specific value for one of its inputs (do_fast_path).
New Procedures and Functions
New Tokens
New Shading Language Functions
bool anyInvocationEXT(bool value);
bool allInvocationsEXT(bool value);
bool allInvocationsEqualEXT(bool value);
Modifications to the OpenGL Shading Language Specification
Including the following line in a shader can be used to control the
language features described in this extension:
#extension GL_EXT_shader_group_vote : <behavior>
where <behavior> is as specified in section 3.4.
New preprocessor #defines are added to the OpenGL ES Shading Language:
#define GL_EXT_shader_group_vote 1
Modify Chapter 8, Built-in Functions
(insert a new section at the end of the chapter)
Section 8.10, Shader Invocation Group Functions
Implementations of the OpenGL ES Shading Language may optionally group
multiple shader invocations for a single shader stage into a single SIMD
invocation group, where invocations are assigned to groups in an
undefined, implementation-dependent manner. Shader algorithms on such
implementations may benefit from being able to evaluate a composite of
boolean values over all active invocations in a group.
bool anyInvocationEXT(bool value);
bool allInvocationsEXT(bool value);
bool allInvocationsEqualEXT(bool value);
The function anyInvocationEXT() returns true if and only if <value> is
true for at least one active invocation in the group.
The function allInvocationsEXT() returns true if and only if <value> is
true for all active invocations in the group.
The function allInvocationsEqualEXT() returns true if <value> is the same
for all active invocations in the group.
For all of these functions, the same value is returned to all active
invocations in the group.
These functions may be called in conditionally executed code. In groups
where some invocations do not execute the function call, the value
returned by the function is not affected by any invocation not calling the
function, even when <value> is well-defined for that invocation.
Since these functions depend on the values of <value> in an undefined
group of invocations, the value returned by these functions is largely
undefined. However, anyInvocationEXT() is guaranteed to return true if
<value> is true, and allInvocationsEXT() is guaranteed to return false if
<value> is false.
Since implementations are not required to combine invocations into groups,
simply returning <value> for anyInvocationEXT() and allInvocationsEXT()
and returning true for allInvocationsEqualEXT() is a legal implementation
of these functions.
For fragment shaders, invocations in a SIMD invocation group may include
invocations corresponding to pixels that are covered by a primitive being
rasterized, as well as invocations corresponding to neighboring pixels not
covered by the primitive. The invocations for these neighboring "helper"
pixels may be created so that differencing can be used to evaluate
derivative functions like dFdx() and dFdx() (section 8.9) and implicit
derivatives used by texture() and related functions (section 8.8). The
value of <value> for such "helper" pixels may affect the value returned by
anyInvocationEXT(), allInvocationsEXT(), and allInvocationsEqualEXT().
New State
New Implementation Dependent State
Note: The EXT_shader_group_vote specification is based on the OpenGL
extension ARB_shader_group_vote as updated in OpenGL 4.x. Resolved issues
from ARB_shader_group_vote have been removed, but some remain applicable to
this extension. ARB_shader_group_vote can be found in the OpenGL Registry.
Revision History
Revision 3, December 10, 2018 (Jon Leech)
- Use 'workgroup' consistently throughout (Bug 11723, internal API
issue 87).
Revision 2, October 21, 2015
- Promoted to EXT
Revision 1, October 23, 2014
- Initial revision.