Name

    EXT_shader_group_vote

Name Strings

    GL_EXT_shader_group_vote

Contact

    Tobias Hector, Imagination Technologies (tobias.hector 'at' imgtec.com)

Contributors

    Contributors to the original ARB_shader_group_vote specification
    Daniel Koch, NVIDIA

Status

    Complete

Version

    Last Modified Date:         December 10, 2018
    Revision:                   3

Number

    OpenGL ES Extension #254

Dependencies

    This extension is written against the OpenGL ES Shading Language
    Specification, Version 3.00.4.

    OpenGL ES 3.0 is required.

Overview

    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
    like:

      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

    None.

New Tokens

    None.

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.

    Syntax:

      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().

Errors

    None.

New State

    None.

New Implementation Dependent State

    None.

Issues

    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.
