| Name |
| |
| ARB_shader_ballot |
| |
| Name Strings |
| |
| GL_ARB_shader_ballot |
| |
| Contact |
| |
| Timothy Lottes (timothy.lottes 'at' amd.com) |
| |
| Contributors |
| |
| Timothy Lottes, AMD |
| Graham Sellers, AMD |
| Daniel Rakos, AMD |
| Jeannot Breton, NVIDIA |
| Pat Brown, NVIDIA |
| Eric Werness, NVIDIA |
| Mark Kilgard, NVIDIA |
| Jeff Bolz, NVIDIA |
| |
| Notice |
| |
| Copyright (c) 2015 The Khronos Group Inc. Copyright terms at |
| 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 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. Approved by the ARB on June 26, 2015. |
| Ratified by the Khronos Board of Promoters on August 7, 2015. |
| |
| Version |
| |
| Last Modified Date: 03/18/2017 |
| Revision: 8 |
| |
| Number |
| |
| ARB Extension #183 |
| |
| Dependencies |
| |
| This extension is written against Revision 5 of the version 4.50 of the |
| OpenGL Shading Language Specification, dated January 30, 2015. |
| |
| This extension requires GL_ARB_gpu_shader_int64. |
| |
| Overview |
| |
| This extension provides the ability for a group of invocations which |
| execute in lockstep to do limited forms of cross-invocation communication |
| via a group broadcast of a invocation value, or broadcast of a bitarray |
| representing a predicate value from each invocation in the group. |
| |
| New Procedures and Functions |
| |
| None. |
| |
| New Tokens |
| |
| None. |
| |
| IP Status |
| |
| None. |
| |
| Modifications to the OpenGL Shading Language Specification, Version 4.50 |
| |
| Including the following line in a shader can be used to control the |
| language features described in this extension: |
| |
| #extension GL_ARB_shader_ballot : <behavior> |
| |
| where <behavior> is as specified in section 3.3. |
| |
| New preprocessor #defines are added to the OpenGL Shading Language: |
| |
| #define GL_ARB_shader_ballot 1 |
| |
| Additions to Chapter 7 of the OpenGL Shading Language Specification |
| (Built-in Variables) |
| |
| Modify Section 7.4, Built-In Uniform State, p. 133 |
| |
| (Add to the list of built-in uniform variable declaration) |
| |
| uniform uint gl_SubGroupSizeARB; |
| |
| (Add this paragraph at the end of this section) |
| |
| A sub-group is a collection of invocations which execute in lockstep. |
| The variable <gl_SubGroupSizeARB> is the maximum number of invocations |
| in a sub-group. The maximum <gl_SubGroupSizeARB> supported in this |
| extension is 64. |
| |
| Modify Section 7.1, Built-in Languages Variable, p. 110 |
| |
| (Add to the list of built-in variables for the compute, vertex, geometry, |
| tessellation control, tessellation evaluation and fragment languages) |
| |
| in uint gl_SubGroupInvocationARB; |
| in uint64_t gl_SubGroupEqMaskARB; |
| in uint64_t gl_SubGroupGeMaskARB; |
| in uint64_t gl_SubGroupGtMaskARB; |
| in uint64_t gl_SubGroupLeMaskARB; |
| in uint64_t gl_SubGroupLtMaskARB; |
| |
| (Add those paragraphs at the end of this section) |
| |
| The variable <gl_SubGroupInvocationARB> holds the index of the invocation within |
| sub-group. This variable is in the range 0 to <gl_SubGroupSizeARB>-1, where |
| <gl_SubGroupSizeARB> is the total number of invocations in a sub-group. |
| |
| The <gl_SubGroup??MaskARB> variables provide a bitmask for all invocations, |
| with one bit per invocation starting with the least significant bit, |
| according to the following table, |
| |
| variable equation for bit values |
| -------------------- ------------------------------------ |
| gl_SubGroupEqMaskARB bit index == gl_SubGroupInvocationARB |
| gl_SubGroupGeMaskARB bit index >= gl_SubGroupInvocationARB |
| gl_SubGroupGtMaskARB bit index > gl_SubGroupInvocationARB |
| gl_SubGroupLeMaskARB bit index <= gl_SubGroupInvocationARB |
| gl_SubGroupLtMaskARB bit index < gl_SubGroupInvocationARB |
| |
| Additions to Chapter 8 of the OpenGL Shading Language Specification |
| (Built-in Functions) |
| |
| Add Section 8.18, Shader Invocation Group Functions |
| |
| Syntax: |
| |
| uint64_t ballotARB(bool value); |
| |
| The function ballotARB() returns a bitfield containing the result of |
| evaluating the expression <value> in all active invocations in the |
| sub-group. An active invocation is one that is executing the ballotARB() |
| call. The sub-group may have inactive invocations for example due to |
| exit of the shader, or divergent branching. Sub-groups of up to 64 |
| invocations may be represented by the return value of ballotARB(). Bits |
| for each invocation are packed in least significant bit ordering. If |
| <value> evaluates to true for an active invocation then the corresponding |
| bit is set to one in the result, otherwise it is zero. Bits corresponding |
| to invocations that are not active or that do not exist in the sub group |
| (because, for example, they are at bit positions beyond the sub-group |
| size) are set to zero. The following trivial assumptions can be made: |
| |
| * ballotARB(true) returns bitfield where the corresponding bits are |
| set for all active invocations in the sub-group. |
| |
| * ballotARB(false) returns zero. |
| |
| Syntax: |
| |
| genType readInvocationARB(genType value, uint invocationIndex); |
| genIType readInvocationARB(genIType value, uint invocationIndex); |
| genUType readInvocationARB(genUType value, uint invocationIndex); |
| |
| genType readFirstInvocationARB(genType value); |
| genIType readFirstInvocationARB(genIType value); |
| genUType readFirstInvocationARB(genUType value); |
| |
| The function readInvocationARB() returns the <value> from a given |
| <invocationIndex> to all active invocations in the sub-group. |
| The <invocationIndex> must be the same for all active invocations |
| in the sub-group otherwise results are undefined. |
| |
| The function readFirstInvocationARB() returns the <value> from the first |
| active invocation to all active invocations in the sub-group. |
| |
| Issues |
| |
| 1) How are the values of gl_SubGroup??MaskARB defined? |
| |
| RESOLVED. Earlier versions of this specification defined a bitmask |
| such as "LtMask" ("less than mask") as having bits set if |
| "gl_SubGroupInvocationARB < bit index". However, this was reversed |
| from the definition in GL_NV_shader_thread_group that these built-ins |
| were derived from, and also mismatched a recent Vulkan/SPIR-V extension. |
| |
| Fortunately, all known implementations of this extension had implemented |
| "wrong" behavior (matching the sense of the original built-ins in |
| GL_NV_shader_thread_group), so the best thing to do is change the |
| definition in the spec. |
| |
| Revision History |
| |
| Rev Date Author Changes |
| --- ---------- -------- --------------------------------------------- |
| 8 03/18/2017 jbolz Reversed the sense of the comparison in the |
| definition of gl_SubGroup??MaskARB. |
| 7 08/25/2015 nhenning Add ARB suffix on documentation for |
| readInvocation and readFirstInvocation |
| functions. |
| 6 07/31/2015 pdaniell Add ARB suffix on the readInvocation and |
| readFirstInvocation functions. |
| 5 07/30/2015 pdaniell Update the function definition syntax to use |
| our standard gen*Type conventions. |
| 4 06/23/2015 tlottes More precise spec language. |
| 3 06/22/2015 tlottes Deferred GPU processor another spec. |
| Cleaned up spec language. |
| 2 04/20/2015 tlottes Updated spec language. |
| 1 03/09/2015 tlottes Initial revision based on AMD_gcn_shader and |
| NV_shader_thread_group. |