| Name |
| |
| KHR_shader_subgroup |
| |
| Name Strings |
| |
| GL_KHR_shader_subgroup |
| |
| Contact |
| |
| Daniel Koch, NVIDIA Corportation |
| |
| Contributors |
| |
| Neil Henning, Codeplay |
| Contributors to GL_KHR_shader_subgroup (GLSL) |
| James Glanville, Imagination |
| Jan-Harald Fredriksen, Arm |
| Graeme Leese, Broadcom |
| Jesse Hall, Google |
| |
| Status |
| |
| Complete |
| Approved by the OpenGL Working Group on 2019-05-29 |
| Approved by the OpenGL ES Working Group on 2019-05-29 |
| Approved by the Khronos Promoters on 2019-07-26 |
| |
| Version |
| |
| Last Modified: 2019-07-26 |
| Revision: 8 |
| |
| Number |
| |
| ARB Extension #196 |
| OpenGL ES Extension #321 |
| |
| Dependencies |
| |
| This extension is written against the OpenGL 4.6 Specification |
| (Core Profile), dated July 30, 2017. |
| |
| This extension requires OpenGL 4.3 or OpenGL ES 3.1. |
| |
| This extension requires the KHR_shader_subgroup GLSL extension. |
| |
| This extension interacts with ARB_gl_spirv and OpenGL 4.6. |
| |
| This extension interacts with ARB_spirv_extensions and OpenGL 4.6. |
| |
| This extension interacts with OpenGL ES 3.x. |
| |
| This extension interacts with ARB_shader_draw_parameters and |
| SPV_KHR_shader_draw_parameters. |
| |
| This extension interacts with SPV_KHR_storage_buffer_storage_class. |
| |
| This extension requires SPIR-V 1.3 when SPIR-V is supported in OpenGL. |
| |
| Overview |
| |
| This extension enables support for the KHR_shader_subgroup shading |
| language extension in OpenGL and OpenGL ES. |
| |
| The extension adds API queries to be able to query |
| |
| - the size of subgroups in this implementation (SUBGROUP_SIZE_KHR) |
| - which shader stages support subgroup operations |
| (SUBGROUP_SUPPORTED_STAGES_KHR) |
| - which subgroup features are supported (SUBGROUP_SUPPORTED_FEATURES_KHR) |
| - whether quad subgroup operations are supported in all |
| stages supporting subgroup operations (SUBGROUP_QUAD_ALL_STAGES_KHR) |
| |
| In OpenGL implementations supporting SPIR-V, this extension enables the |
| minimal subset of SPIR-V 1.3 which is required to support the subgroup |
| features that are supported by the implementation. |
| |
| In OpenGL ES implementations, this extension does NOT add support for |
| SPIR-V or for any of the built-in shading language functions (8.18) |
| that have genDType (double) prototypes. |
| |
| New Procedures and Functions |
| |
| None |
| |
| New Tokens |
| |
| Accepted as the <pname> argument for GetIntegerv and |
| GetInteger64v: |
| |
| SUBGROUP_SIZE_KHR 0x9532 |
| SUBGROUP_SUPPORTED_STAGES_KHR 0x9533 |
| SUBGROUP_SUPPORTED_FEATURES_KHR 0x9534 |
| |
| Accepted as the <pname> argument for GetBooleanv: |
| |
| SUBGROUP_QUAD_ALL_STAGES_KHR 0x9535 |
| |
| Returned as a bitfield in the <data> argument when GetIntegerv |
| is queried with a <pname> of SUBGROUP_SUPPORTED_STAGES_KHR |
| |
| (existing tokens) |
| VERTEX_SHADER_BIT |
| TESS_CONTROL_SHADER_BIT |
| TESS_EVALUATION_SHADER_BIT |
| GEOMETRY_SHADER_BIT |
| FRAGMENT_SHADER_BIT |
| COMPUTE_SHADER_BIT |
| |
| Returned as bitfield in the <data> argument when GetIntegerv |
| is queried with a <pname> of SUBGROUP_SUPPORTED_FEATURES_KHR: |
| |
| SUBGROUP_FEATURE_BASIC_BIT_KHR 0x00000001 |
| SUBGROUP_FEATURE_VOTE_BIT_KHR 0x00000002 |
| SUBGROUP_FEATURE_ARITHMETIC_BIT_KHR 0x00000004 |
| SUBGROUP_FEATURE_BALLOT_BIT_KHR 0x00000008 |
| SUBGROUP_FEATURE_SHUFFLE_BIT_KHR 0x00000010 |
| SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT_KHR 0x00000020 |
| SUBGROUP_FEATURE_CLUSTERED_BIT_KHR 0x00000040 |
| SUBGROUP_FEATURE_QUAD_BIT_KHR 0x00000080 |
| |
| |
| Modifications to the OpenGL 4.6 Specification (Core Profile) |
| |
| Add a new Chapter SG, "Subgroups" |
| |
| A subgroup is a set of invocations that can synchronize and share data |
| with each other efficiently. An invocation group is partitioned into |
| one or more subgroups. |
| |
| Subgroup operations are divided into various categories as described |
| by SUBGROUP_SUPPORTED_FEATURES_KHR. |
| |
| SG.1 Subgroup Operations |
| |
| Subgroup operations are divided into a number of categories as |
| described in this section. |
| |
| SG.1.1 Basic Subgroup Operations |
| |
| The basic subgroup operations allow two classes of functionality within |
| shaders - elect and barrier. Invocations within a subgroup can choose a |
| single invocation to perform some task for the subgroup as a whole using |
| elect. Invocations within a subgroup can perform a subgroup barrier to |
| ensure the ordering of execution or memory accesses within a subgroup. |
| Barriers can be performed on buffer memory accesses, shared memory |
| accesses, and image memory accesses to ensure that any results written are |
| visible by other invocations within the subgroup. A _subgroupBarrier_ can |
| also be used to perform a full execution control barrier. A full execution |
| control barrier will ensure that each active invocation within the |
| subgroup reaches a point of execution before any are allowed to continue. |
| |
| SG.1.2 Vote Subgroup Operations |
| |
| The vote subgroup operations allow invocations within a subgroup to |
| compare values across a subgroup. The types of votes enabled are: |
| |
| * Do all active subgroup invocations agree that an expression is true? |
| * Do any active subgroup invocations evaluate an expression to true? |
| * Do all active subgroup invocations have the same value of an expression? |
| |
| Note: |
| These operations are useful in combination with control flow in that |
| they allow for developers to check whether conditions match across the |
| subgroup and choose potentially faster code-paths in these cases. |
| |
| SG.1.3 Arithmetic Subgroup Operations |
| |
| The arithmetic subgroup operations allow invocations to perform scan |
| and reduction operations across a subgroup. For reduction operations, |
| each invocation in a subgroup will obtain the same result of these |
| arithmetic operations applied across the subgroup. For scan operations, |
| each invocation in the subgroup will perform an inclusive or exclusive |
| scan, cumulatively applying the operation across the invocations in a |
| subgroup in an implementation-defined order. The operations supported |
| are add, mul, min, max, and, or, xor. |
| |
| SG.1.4 Ballot Subgroup Operations |
| |
| The ballot subgroup operations allow invocations to perform more |
| complex votes across the subgroup. The ballot functionality allows |
| all invocations within a subgroup to provide a boolean value and get |
| as a result what each invocation provided as their boolean value. The |
| broadcast functionality allows values to be broadcast from an |
| invocation to all other invocations within the subgroup, given that |
| the invocation to be broadcast from is known at shader compilation |
| time. |
| |
| SG.1.5 Shuffle Subgroup Operations |
| |
| The shuffle subgroup operations allow invocations to read values from |
| other invocations within a subgroup. |
| |
| SG.1.6 Shuffle Relative Subgroup Operations |
| |
| The shuffle relative subgroup operations allow invocations to read |
| values from other invocations within the subgroup relative to the |
| current invocation in the group. The relative operations supported |
| allow data to be shifted up and down through the invocations within |
| a subgroup. |
| |
| SG.1.7 Clustered Subgroup Operations |
| |
| The clustered subgroup operations allow invocations to perform |
| arithmetic operations among partitions of a subgroup, such that the |
| operation is only performed within the subgroup invocations within a |
| partition. The partitions for clustered subgroup operations are |
| consecutive power-of-two size groups of invocations and the cluster size |
| must be known at compilation time. The operations supported are |
| add, mul, min, max, and, or, xor. |
| |
| SG.1.8 Quad Subgroup Operations |
| |
| The quad subgroup operations allow clusters of 4 invocations (a quad), |
| to share data efficiently with each other. For fragment shaders, if the |
| value of SUBGROUP_SIZE_KHR is at least 4, each quad corresponds to one |
| of the groups of four shader invocations used for derivatives. The order |
| in which the fragments appear within the quad is implementation-defined. |
| |
| Note: |
| In OpenGL and OpenGL ES, the order of invocations within a quad may |
| depend on the rendering orientation and whether rendering to a framebuffer |
| object or to the default framebuffer (window). |
| |
| This language supersedes the quad arrangement described in the GLSL |
| KHR_shader_subgroup document. |
| |
| SG.2 Subgroup Queries |
| |
| SG.2.1 Subgroup Size |
| |
| The subgroup size is the maximum number of invocations in a subgroup. |
| This is an implementation-dependent value which can be obtained by |
| calling GetIntegerv with a <pname> of SUBGROUP_SIZE_KHR. This value |
| is also provided in the gl_SubgroupSize built-in shading language |
| variable. The subgroup size must be at least 1, and must be a power |
| of 2. The maximum number of invocations an implementation can support |
| per subgroup is 128. |
| |
| SG.2.2 Subgroup Supported Stages |
| |
| Subgroup operations may not be supported in all shader stages. To |
| determine which shader stages support the subgroup operations, call |
| GetIntegerv with a <pname> of SUBGROUP_SUPPORTED_STAGES_KHR. On |
| return, <data> will contain the bitwise OR of the *_SHADER_BIT flags |
| indicating which of the vertex, tessellation control, tessellation |
| evaluation, geometry, fragment, and compute shader stages support |
| subgroup operations. All implementations must support at least |
| COMPUTE_SHADER_BIT. |
| |
| SG.2.3 Subgroup Supported Operations |
| |
| To determine which subgroup operations are supported by an |
| implementation, call GetIntegerv with a <pname> of |
| SUBGROUP_SUPPORTED_FEATURES_KHR. On return, <data> will |
| contain the bitwise OR of the SUBGROUP_FEATURE_*_BIT_KHR |
| flags indicating which subgroup operations are supported by the |
| implementation. Possible values include: |
| |
| * SUBGROUP_FEATURE_BASIC_BIT_KHR indicates the GL supports shaders |
| with the KHR_shader_subgroup_basic extension enabled. See SG.1.1. |
| |
| * SUBGROUP_FEATURE_VOTE_BIT_KHR indicates the GL supports shaders |
| with the KHR_shader_subgroup_vote extension enabled. See SG.1.2. |
| |
| * SUBGROUP_FEATURE_ARITHMETIC_BIT_KHR indicates the GL supports |
| shaders with the KHR_shader_subgroup_arithmetic extension enabled. |
| See SG.1.3. |
| |
| * SUBGROUP_FEATURE_BALLOT_BIT_KHR indicates the GL supports |
| shaders with the KHR_shader_subgroup_ballot extension enabled. |
| See SG.1.4. |
| |
| * SUBGROUP_FEATURE_SHUFFLE_BIT_KHR indicates the GL supports |
| shaders with the KHR_shader_subgroup_shuffle extension enabled. |
| See SG.1.5. |
| |
| * SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT_KHR indicates the GL |
| supports shaders with the KHR_shader_subgroup_shuffle_relative |
| extension enabled. See SG.1.6. |
| |
| * SUBGROUP_FEATURE_CLUSTERED_BIT_KHR indicates the GL supports |
| shaders with the KHR_shader_subgroup_clustered extension enabled. |
| See SG.1.7. |
| |
| * SUBGROUP_FEATURE_QUAD_BIT_KHR indicates the GL supports shaders |
| with the GL_KHR_shader_subgroup_quad extension enabled. See SG.1.8. |
| |
| All implementations must support SUBGROUP_FEATURE_BASIC_BIT_KHR. |
| |
| SG.2.4 Subgroup Quads Support |
| |
| To determine whether subgroup quad operations (See SG.1.8) are |
| available in all stages, call GetBooleanv with a <pname> of |
| SUBGROUP_QUAD_ALL_STAGES_KHR. On return, <data> will be TRUE |
| if subgroup quad operations are supported in all shader stages |
| which support subgroup operations. FALSE is returned if subgroup quad |
| operations are not supported, or if they are restricted to fragment |
| and compute stages. |
| |
| Modifications to Appendix C of the OpenGL 4.6 (Core Profile) Specification |
| (The OpenGL SPIR-V Execution Environment) |
| |
| Modifications to section C.1 (Required Versions and Formats) [p661] |
| |
| Replace the first sentence with the following: |
| |
| "Implementations must support the 1.0 and 1.3 versions of SPIR-V |
| and the 1.0 version of the SPIR-V Extended Instructions |
| for the OpenGL Shading Language (see section 1.3.4)." |
| |
| Modifications to section C.2 (Valid SPIR-V Built-In Variable |
| Decorations) [661] |
| |
| Add the following rows to Table C.1 (Built-in Variable Decorations) |
| |
| NumSubgroups (if SUBGROUP_FEATURE_BASIC_BIT_KHR is supported) |
| SubgroupId (if SUBGROUP_FEATURE_BASIC_BIT_KHR is supported) |
| SubgroupSize (if SUBGROUP_FEATURE_BASIC_BIT_KHR is supported) |
| SubgroupLocalInvocationId (if SUBGROUP_FEATURE_BASIC_BIT_KHR is supported) |
| SubgroupEqMask (if SUBGROUP_FEATURE_BALLOT_BIT_KHR is supported) |
| SubgroupGeMask (if SUBGROUP_FEATURE_BALLOT_BIT_KHR is supported) |
| SubgroupGtMask (if SUBGROUP_FEATURE_BALLOT_BIT_KHR is supported) |
| SubgroupLeMask (if SUBGROUP_FEATURE_BALLOT_BIT_KHR is supported) |
| SubgroupLtMask (if SUBGROUP_FEATURE_BALLOT_BIT_KHR is supported) |
| |
| Additions to section C.3 (Valid SPIR-V Capabilities): |
| |
| Add the following rows to Table C.2 (Valid SPIR-V Capabilities): |
| |
| GroupNonUniform (if SUBGROUP_FEATURE_BASIC_BIT_KHR is supported) |
| GroupNonUniformVote (if SUBGROUP_FEATURE_VOTE_BIT_KHR is supported) |
| GroupNonUniformArithmetic (if SUBGROUP_FEATURE_ARITHMETIC_BIT_KHR is supported) |
| GroupNonUniformBallot (if SUBGROUP_FEATURE_BALLOT_BIT_KHR is supported) |
| GroupNonUniformShuffle (if SUBGROUP_FEATURE_SHUFFLE_BIT_KHR is supported) |
| GroupNonUniformShuffleRelative (if SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT_KHR is supported) |
| GroupNonUniformClustered (if SUBGROUP_FEATURE_CLUSTERED_BIT_KHR is supported) |
| GroupNonUniformQuad (if SUBGROUP_FEATURE_QUAD_BIT_KHR is supported) |
| |
| Additions to section C.4 (Validation Rules): |
| |
| Make the following changes to the validation rules: |
| |
| Add *Subgroup* to the list of acceptable scopes for memory. |
| |
| Add: |
| |
| *Scope* for *Non Uniform Group Operations* must be limited to: |
| - *Subgroup* |
| |
| * If OpControlBarrier is used in fragment, vertex, tessellation |
| evaluation, or geometry stages, the execution Scope must be |
| *Subgroup*. |
| |
| * "`Result Type`" for *Non Uniform Group Operations* must be |
| limited to 32-bit float, 32-bit integer, boolean, or vectors |
| of these types. If the Float64 capability is enabled, double |
| and vectors of double types are also permitted. |
| |
| * If OpGroupNonUniformBallotBitCount is used, the group operation |
| must be one of: |
| - *Reduce* |
| - *InclusiveScan* |
| - *ExclusiveScan* |
| |
| Add the following restrictions (disallowing SPIR-V 1.1, 1.2, and |
| 1.3 features not related to subgroups); |
| |
| * The *LocalSizeId* Execution Mode must not be used. |
| |
| [[If SPV_KHR_storage_buffer_storage_class is not supported]] |
| * The *StorageBuffer* Storage Class must not be used. |
| |
| * The *DependencyInfinite* and *DependencyLength* Loop Control |
| masks must not be used. |
| |
| [[If SPV_KHR_shader_draw_parameters or OpenGL 4.6 is not supported]] |
| * The *DrawParameters* Capability must not be used. |
| |
| * The *StorageBuffer16BitAccess*, *UniformAndStorageBuffer16BitAccess*, |
| *StoragePushConstant16*, *StorageInputOutput16* Capabilities must |
| not be used. |
| |
| * The *DeviceGroup*, *MultiView*, *VariablePointersStorageBuffer*, and |
| *VariablePointers* Capabilities must not be used. |
| |
| * The *OpModuleProcessed*, *OpDecorateId*, and *OpExecutionModeId* |
| Instructions must not be used. |
| |
| Modifications to the OpenGL Shading Language Specification, Version 4.60 |
| |
| See the separate KHR_shader_subgroup GLSL document. |
| https://github.com/KhronosGroup/GLSL/blob/master/extensions/khr/GL_KHR_shader_subgroup.txt |
| |
| Dependencies on ARB_gl_spirv and OpenGL 4.6 |
| |
| If ARB_gl_spirv or OpenGL 4.6 are not supported, ignore all |
| references to SPIR-V functionality. |
| |
| Dependencies on ARB_spirv_extensions and OpenGL 4.6 |
| |
| If ARB_spirv_extensions or OpenGL 4.6 are not supported, ignore |
| references to the ability to advertise additional SPIR-V extensions. |
| |
| Dependencies on OpenGL ES 3.x |
| |
| If implemented in OpenGL ES, ignore all references to SPIR-V and to |
| GLSL built-in functions which utilize the genDType (double) types. |
| |
| Dependencies on ARB_shader_draw_parameters and SPV_KHR_shader_draw_parameters |
| |
| If neither OpenGL 4.6, nor ARB_shader_draw_parameters and |
| SPV_KHR_shader_draw_parameters are supported, the *DrawParameters* |
| Capability is not supported. |
| |
| Dependencies on SPV_KHR_storage_buffer_storage_class |
| |
| If SPV_KHR_storage_buffer_storage_class is not supported, the |
| *StorageBuffer* Storage Class must not be used. |
| |
| Additions to the AGL/GLX/WGL Specifications |
| |
| None |
| |
| Errors |
| |
| None |
| |
| New State |
| |
| None |
| |
| New Implementation Dependent State |
| |
| Additions to table 2.53 - Implementation Dependent Values |
| |
| Minimum |
| Get Value Type Get Command Value Description Sec. |
| --------- ----- --------------- ------- ------------------------ ------ |
| SUBGROUP_SIZE_KHR Z+ GetIntegerv 1 No. of invocations in SG.2.1 |
| each subgroup |
| |
| SUBGROUP_SUPPORTED_ E GetIntegerv Sec Bitfield of stages that SG.2.2 |
| STAGES_KHR SG.2.2 subgroups are supported in |
| |
| SUBGROUP_SUPPORTED_ E GetIntegerv Sec Bitfield of subgroup SG.2.3 |
| FEATURES_KHR SG.2.3 operations supported |
| |
| SUBGROUP_QUAD_ B GetBooleanv - Quad subgroups supported SG.2.4 |
| ALL_STAGES_KHR in all stages |
| |
| Issues |
| |
| 1. What should we name this extension? |
| |
| DISCUSSION. We will use the same name as the GLSL extension |
| in order to minimize confusion. This has been done for other |
| extensions and people seem to have figured it out. Other |
| options considered: KHR_subgroups, KHR_shader_subgroup_operations, |
| KHR_subgroup_operations. |
| |
| RESOLVED: use KHR_shader_subgroup to match the GLSL extension. |
| |
| 2. What should happen if subgroup operations are attempted on |
| unsupported stages? |
| |
| DISCUSSION: There are basically two options |
| A. compile or link-time error? |
| B. draw time invalid_op error? |
| Seems like Option (A) would be more user friendly, and there doesn't |
| seem to be much point in requiring an implementation to |
| support compiling the functionality in stages they won't work in. |
| Typically this should be detectable by an implementation at compile |
| time since this will just require them to reject shaders with |
| #extension GL_KHR_shader_subgroup* in shader stages that they don't |
| support. However, for SPIR-V implementations, this may happen at |
| lowering time, so it may happen at either compile or link-time. |
| |
| RESOLVED: Compile or link-time error. |
| |
| 3. How should we enable SPIR-V support for this extension? |
| |
| DISCUSSION: Options could include: |
| A. add support for SPIR-V 1.1, 1.2, and 1.3. |
| B. add support for only the subgroups capabilities from SPIR-V 1.3. |
| |
| Doing option (A) seems like a weird way of submarining support |
| for new versions of SPIR-V into OpenGL, and it seems like there |
| should be a separate extension for that. |
| If option (B) is selected, we need to be sure to disallow other |
| new capabilities that are added in SPIR-V 1.1, 1.2, and 1.3 |
| |
| RESOLVED: (B) only add support for subgroup capabilities from SPIR-V |
| 1.3. If a future GL core version incorporates this extension it should |
| add support for all of SPIR-V 1.3. |
| |
| 4. What functionality of SPIR-V 1.1, 1.2, and 1.3 needs to be disallowed? |
| |
| RESOLVED: |
| Additions that aren't gated by specific capabilities and are disallowed |
| are the following: |
| |
| LocalSizeId (1.2) |
| DependencyInfinite (1.1) |
| DependencyLength (1.1) |
| OpModuleProcessed (1.1) |
| OpDecorateId (1.2) |
| OpExecutionModeId (1.2) |
| |
| Additions that are gated by graphics-compatible capabilities not |
| being enabled by this extension (but could be enabled by other |
| extensions): |
| |
| Capabilities Enabling extension |
| |
| StorageBuffer (1.3) SPV_KHR_storage_buffer_storage_class |
| |
| DrawParameters (1.3) SPV_KHR_shader_draw_parameters |
| - BaseVertex |
| - BaseInstance |
| - DrawIndex |
| |
| DeviceGroup (1.3) SPV_KHR_device_group |
| - DeviceIndex |
| |
| MultiView (1.3) SPV_KHR_multiview |
| - ViewIndex |
| |
| StorageBuffer16BitAccess (1.3) SPV_KHR_16bit_storage |
| StorageUniformBufferBlock16 (1.3) SPV_KHR_16bit_storage |
| UniformAndStorageBuffer16BitAccess (1.3) SPV_KHR_16bit_storage |
| StorageUniform16 (1.3) SPV_KHR_16bit_storage |
| StoragePushConstant16 (1.3) SPV_KHR_16bit_storage |
| StorageInputOutput16 (1.3) SPV_KHR_16bit_storage |
| |
| VariablePointersStorageBuffer (1.3) SPV_KHR_variable_pointers |
| VariablePointers (1.3) SPV_KHR_variable_pointers |
| |
| 5. Given Issues (3) and (4) what exactly are the additional SPIR-V |
| requirements are being added by this extension? |
| |
| RESOLVED: We add support for the following from SPIR-V 1.3: |
| |
| Capabilities (3.31) Enabling API Feature |
| |
| GroupNonUniform SUBGROUP_FEATURE_BASIC_BIT_KHR |
| GroupNonUniformVote SUBGROUP_FEATURE_VOTE_BIT_KHR |
| GroupNonUniformArithmetic SUBGROUP_FEATURE_ARITHMETIC_BIT_KHR |
| GroupNonUniformBallot SUBGROUP_FEATURE_BALLOT_BIT_KHR |
| GroupNonUniformShuffle SUBGROUP_FEATURE_SHUFFLE_BIT_KHR |
| GroupNonUniformShuffleRelative SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT_KHR |
| GroupNonUniformClustered SUBGROUP_FEATURE_CLUSTERED_BIT_KHR |
| GroupNonUniformQuad SUBGROUP_FEATURE_QUAD_BIT_KHR |
| |
| Builtins (3.21) Enabling Capability |
| |
| SubgroupSize GroupNonUniform |
| NumSubgroups GroupNonUniform |
| SubgroupId GroupNonUniform |
| SubgroupLocalInvocationId GroupNonUniform |
| SubgroupEqMask GroupNonUniformBallot |
| SubgroupGeMask GroupNonUniformBallot |
| SubgroupGtMask GroupNonUniformBallot |
| SubgroupLeMask GroupNonUniformBallot |
| SubgroupLtMask GroupNonUniformBallot |
| |
| Group Operations Enabling Capability |
| (3.28) |
| |
| Reduce GroupNonUniformArithmetic, GroupNonUniformBallot |
| InclusiveScan GroupNonUniformArithmetic, GroupNonUniformBallot |
| ExclusiveScan GroupNonUniformArithmetic, GroupNonUniformBallot |
| ClusteredReduce GroupNonUniformClustered |
| |
| Non-Uniform Instructions Enabling Capability |
| (3.32.24) |
| |
| OpGroupNonUniformElect GroupNonUniform |
| OpGroupNonUniformAll GroupNonUniformVote |
| OpGroupNonUniformAny GroupNonUniformVote |
| OpGroupNonUniformAllEqual GroupNonUniformVote |
| OpGroupNonUniformBroadcast GroupNonUniformBallot |
| OpGroupNonUniformBroadcastFirst GroupNonUniformBallot |
| OpGroupNonUniformBallot GroupNonUniformBallot |
| OpGroupNonUniformInverseBallot GroupNonUniformBallot |
| OpGroupNonUniformBallotBitExtract GroupNonUniformBallot |
| OpGroupNonUniformBallotBitCount GroupNonUniformBallot |
| OpGroupNonUniformBallotFindLSB GroupNonUniformBallot |
| OpGroupNonUniformBallotFindMSB GroupNonUniformBallot |
| OpGroupNonUniformShuffle GroupNonUniformShuffle |
| OpGroupNonUniformShuffleXor GroupNonUniformShuffle |
| OpGroupNonUniformShuffleUp GroupNonUniformShuffle |
| OpGroupNonUniformShuffleDown GroupNonUniformShuffle |
| OpGroupNonUniformIAdd GroupNonUniformArithmetic, GroupNonUniformClustered |
| OpGroupNonUniformFAdd GroupNonUniformArithmetic, GroupNonUniformClustered |
| OpGroupNonUniformIMul GroupNonUniformArithmetic, GroupNonUniformClustered |
| OpGroupNonUniformFMul GroupNonUniformArithmetic, GroupNonUniformClustered |
| OpGroupNonUniformSMin GroupNonUniformArithmetic, GroupNonUniformClustered |
| OpGroupNonUniformUMin GroupNonUniformArithmetic, GroupNonUniformClustered |
| OpGroupNonUniformFMin GroupNonUniformArithmetic, GroupNonUniformClustered |
| OpGroupNonUniformSMax GroupNonUniformArithmetic, GroupNonUniformClustered |
| OpGroupNonUniformUMax GroupNonUniformArithmetic, GroupNonUniformClustered |
| OpGroupNonUniformFMax GroupNonUniformArithmetic, GroupNonUniformClustered |
| OpGroupNonUniformBitwiseAnd GroupNonUniformArithmetic, GroupNonUniformClustered |
| OpGroupNonUniformBitwiseOr GroupNonUniformArithmetic, GroupNonUniformClustered |
| OpGroupNonUniformBitwiseXor GroupNonUniformArithmetic, GroupNonUniformClustered |
| OpGroupNonUniformLogicalAnd GroupNonUniformArithmetic, GroupNonUniformClustered |
| OpGroupNonUniformLogicalOr GroupNonUniformArithmetic, GroupNonUniformClustered |
| OpGroupNonUniformLogicalXor GroupNonUniformArithmetic, GroupNonUniformClustered |
| OpGroupNonUniformQuadBroadcast GroupNonUniformQuad |
| OpGroupNonUniformQuadSwap GroupNonUniformQuad |
| |
| *Subgroup* as an acceptable memory scope. |
| |
| OpControlBarrier in fragment, vertex, tessellation evaluation, tessellation |
| control, and geometry stages with the *Subgroup* execution Scope. |
| |
| |
| Revision History |
| |
| Rev. Date Author Changes |
| ---- ----------- -------- ------------------------------------------- |
| 8 2019-07-26 dgkoch Update status and assign extension numbers |
| 7 2019-05-22 dgkoch Resync language with Vulkan spec. Address feedback |
| from Graeme. Relax quad ordering definition. |
| 6 2019-03-28 dgkoch rename to KHR_shader_subgroup, update some issues |
| 5 2018-05-30 dgkoch Address feedback from Graeme and Jesse. |
| 4 2018-05-28 dgkoch change ALLSTAGES -> ALL_STAGES, fix typos |
| 3 2018-05-23 dgkoch Add overview and interactions, add SPIR-V 1.3 |
| restrictions, Issues 4 and 5. |
| 2 2018-04-26 dgkoch Various updates to match latest vulkan spec |
| Assign tokens. Add SPIR-V support. |
| 1 2018-01-19 dgkoch Initial revision. |
| |