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 diverges between invocations, a SIMD implementation might first call do_fast_path() for the invocations where is true and leave the other invocations dormant. Once do_fast_path() returns, it might call do_general_path() for invocations where 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 : where 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 is true for at least one active invocation in the group. The function allInvocationsEXT() returns true if and only if is true for all active invocations in the group. The function allInvocationsEqualEXT() returns true if 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 is well-defined for that invocation. Since these functions depend on the values of in an undefined group of invocations, the value returned by these functions is largely undefined. However, anyInvocationEXT() is guaranteed to return true if is true, and allInvocationsEXT() is guaranteed to return false if is false. Since implementations are not required to combine invocations into groups, simply returning 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 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.