• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1Name
2
3    KHR_shader_subgroup
4
5Name Strings
6
7    GL_KHR_shader_subgroup
8
9Contact
10
11    Daniel Koch, NVIDIA Corportation
12
13Contributors
14
15    Neil Henning, Codeplay
16    Contributors to GL_KHR_shader_subgroup (GLSL)
17    James Glanville, Imagination
18    Jan-Harald Fredriksen, Arm
19    Graeme Leese, Broadcom
20    Jesse Hall, Google
21
22Status
23
24    Complete
25    Approved by the OpenGL Working Group on 2019-05-29
26    Approved by the OpenGL ES Working Group on 2019-05-29
27    Approved by the Khronos Promoters on 2019-07-26
28
29Version
30
31    Last Modified:  2019-07-26
32    Revision:       8
33
34Number
35
36    ARB Extension #196
37    OpenGL ES Extension #321
38
39Dependencies
40
41    This extension is written against the OpenGL 4.6 Specification
42    (Core Profile), dated July 30, 2017.
43
44    This extension requires OpenGL 4.3 or OpenGL ES 3.1.
45
46    This extension requires the KHR_shader_subgroup GLSL extension.
47
48    This extension interacts with ARB_gl_spirv and OpenGL 4.6.
49
50    This extension interacts with ARB_spirv_extensions and OpenGL 4.6.
51
52    This extension interacts with OpenGL ES 3.x.
53
54    This extension interacts with ARB_shader_draw_parameters and
55    SPV_KHR_shader_draw_parameters.
56
57    This extension interacts with SPV_KHR_storage_buffer_storage_class.
58
59    This extension requires SPIR-V 1.3 when SPIR-V is supported in OpenGL.
60
61Overview
62
63    This extension enables support for the KHR_shader_subgroup shading
64    language extension in OpenGL and OpenGL ES.
65
66    The extension adds API queries to be able to query
67
68      - the size of subgroups in this implementation (SUBGROUP_SIZE_KHR)
69      - which shader stages support subgroup operations
70        (SUBGROUP_SUPPORTED_STAGES_KHR)
71      - which subgroup features are supported (SUBGROUP_SUPPORTED_FEATURES_KHR)
72      - whether quad subgroup operations are supported in all
73        stages supporting subgroup operations (SUBGROUP_QUAD_ALL_STAGES_KHR)
74
75    In OpenGL implementations supporting SPIR-V, this extension enables the
76    minimal subset of SPIR-V 1.3 which is required to support the subgroup
77    features that are supported by the implementation.
78
79    In OpenGL ES implementations, this extension does NOT add support for
80    SPIR-V or for any of the built-in shading language functions (8.18)
81    that have genDType (double) prototypes.
82
83New Procedures and Functions
84
85    None
86
87New Tokens
88
89    Accepted as the <pname> argument for GetIntegerv and
90    GetInteger64v:
91
92        SUBGROUP_SIZE_KHR                           0x9532
93        SUBGROUP_SUPPORTED_STAGES_KHR               0x9533
94        SUBGROUP_SUPPORTED_FEATURES_KHR             0x9534
95
96    Accepted as the <pname> argument for GetBooleanv:
97
98        SUBGROUP_QUAD_ALL_STAGES_KHR                0x9535
99
100    Returned as a bitfield in the <data> argument when GetIntegerv
101    is queried with a <pname> of SUBGROUP_SUPPORTED_STAGES_KHR
102
103        (existing tokens)
104        VERTEX_SHADER_BIT
105        TESS_CONTROL_SHADER_BIT
106        TESS_EVALUATION_SHADER_BIT
107        GEOMETRY_SHADER_BIT
108        FRAGMENT_SHADER_BIT
109        COMPUTE_SHADER_BIT
110
111    Returned as bitfield in the <data> argument when GetIntegerv
112    is queried with a <pname> of SUBGROUP_SUPPORTED_FEATURES_KHR:
113
114        SUBGROUP_FEATURE_BASIC_BIT_KHR              0x00000001
115        SUBGROUP_FEATURE_VOTE_BIT_KHR               0x00000002
116        SUBGROUP_FEATURE_ARITHMETIC_BIT_KHR         0x00000004
117        SUBGROUP_FEATURE_BALLOT_BIT_KHR             0x00000008
118        SUBGROUP_FEATURE_SHUFFLE_BIT_KHR            0x00000010
119        SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT_KHR   0x00000020
120        SUBGROUP_FEATURE_CLUSTERED_BIT_KHR          0x00000040
121        SUBGROUP_FEATURE_QUAD_BIT_KHR               0x00000080
122
123
124Modifications to the OpenGL 4.6 Specification (Core Profile)
125
126Add a new Chapter SG, "Subgroups"
127
128    A subgroup is a set of invocations that can synchronize and share data
129    with each other efficiently. An invocation group is partitioned into
130    one or more subgroups.
131
132    Subgroup operations are divided into various categories as described
133    by SUBGROUP_SUPPORTED_FEATURES_KHR.
134
135    SG.1 Subgroup Operations
136
137    Subgroup operations are divided into a number of categories as
138    described in this section.
139
140    SG.1.1 Basic Subgroup Operations
141
142    The basic subgroup operations allow two classes of functionality within
143    shaders - elect and barrier. Invocations within a subgroup can choose a
144    single invocation to perform some task for the subgroup as a whole using
145    elect. Invocations within a subgroup can perform a subgroup barrier to
146    ensure the ordering of execution or memory accesses within a subgroup.
147    Barriers can be performed on buffer memory accesses, shared memory
148    accesses, and image memory accesses to ensure that any results written are
149    visible by other invocations within the subgroup. A _subgroupBarrier_ can
150    also be used to perform a full execution control barrier. A full execution
151    control barrier will ensure that each active invocation within the
152    subgroup reaches a point of execution before any are allowed to continue.
153
154    SG.1.2 Vote Subgroup Operations
155
156    The vote subgroup operations allow invocations within a subgroup to
157    compare values across a subgroup. The types of votes enabled are:
158
159    * Do all active subgroup invocations agree that an expression is true?
160    * Do any active subgroup invocations evaluate an expression to true?
161    * Do all active subgroup invocations have the same value of an expression?
162
163    Note:
164    These operations are useful in combination with control flow in that
165    they allow for developers to check whether conditions match across the
166    subgroup and choose potentially faster code-paths in these cases.
167
168    SG.1.3 Arithmetic Subgroup Operations
169
170    The arithmetic subgroup operations allow invocations to perform scan
171    and reduction operations across a subgroup. For reduction operations,
172    each invocation in a subgroup will obtain the same result of these
173    arithmetic operations applied across the subgroup. For scan operations,
174    each invocation in the subgroup will perform an inclusive or exclusive
175    scan, cumulatively applying the operation across the invocations in a
176    subgroup in an implementation-defined order. The operations supported
177    are add, mul, min, max, and, or, xor.
178
179    SG.1.4 Ballot Subgroup Operations
180
181    The ballot subgroup operations allow invocations to perform more
182    complex votes across the subgroup. The ballot functionality allows
183    all invocations within a subgroup to provide a boolean value and get
184    as a result what each invocation provided as their boolean value. The
185    broadcast functionality allows values to be broadcast from an
186    invocation to all other invocations within the subgroup, given that
187    the invocation to be broadcast from is known at shader compilation
188    time.
189
190    SG.1.5 Shuffle Subgroup Operations
191
192    The shuffle subgroup operations allow invocations to read values from
193    other invocations within a subgroup.
194
195    SG.1.6 Shuffle Relative Subgroup Operations
196
197    The shuffle relative subgroup operations allow invocations to read
198    values from other invocations within the subgroup relative to the
199    current invocation in the group. The relative operations supported
200    allow data to be shifted up and down through the invocations within
201    a subgroup.
202
203    SG.1.7 Clustered Subgroup Operations
204
205    The clustered subgroup operations allow invocations to perform
206    arithmetic operations among partitions of a subgroup, such that the
207    operation is only performed within the subgroup invocations within a
208    partition. The partitions for clustered subgroup operations are
209    consecutive power-of-two size groups of invocations and the cluster size
210    must be known at compilation time. The operations supported are
211    add, mul, min, max, and, or, xor.
212
213    SG.1.8 Quad Subgroup Operations
214
215    The quad subgroup operations allow clusters of 4 invocations (a quad),
216    to share data efficiently with each other. For fragment shaders, if the
217    value of SUBGROUP_SIZE_KHR is at least 4, each quad corresponds to one
218    of the groups of four shader invocations used for derivatives. The order
219    in which the fragments appear within the quad is implementation-defined.
220
221    Note:
222    In OpenGL and OpenGL ES, the order of invocations within a quad may
223    depend on the rendering orientation and whether rendering to a framebuffer
224    object or to the default framebuffer (window).
225
226    This language supersedes the quad arrangement described in the GLSL
227    KHR_shader_subgroup document.
228
229    SG.2 Subgroup Queries
230
231    SG.2.1 Subgroup Size
232
233    The subgroup size is the maximum number of invocations in a subgroup.
234    This is an implementation-dependent value which can be obtained by
235    calling GetIntegerv with a <pname> of SUBGROUP_SIZE_KHR. This value
236    is also provided in the gl_SubgroupSize built-in shading language
237    variable.  The subgroup size must be at least 1, and must be a power
238    of 2. The maximum number of invocations an implementation can support
239    per subgroup is 128.
240
241    SG.2.2 Subgroup Supported Stages
242
243    Subgroup operations may not be supported in all shader stages. To
244    determine which shader stages support the subgroup operations, call
245    GetIntegerv with a <pname> of SUBGROUP_SUPPORTED_STAGES_KHR. On
246    return, <data> will contain the bitwise OR of the *_SHADER_BIT flags
247    indicating which of the vertex, tessellation control, tessellation
248    evaluation, geometry, fragment, and compute shader stages support
249    subgroup operations.  All implementations must support at least
250    COMPUTE_SHADER_BIT.
251
252    SG.2.3 Subgroup Supported Operations
253
254    To determine which subgroup operations are supported by an
255    implementation, call GetIntegerv with a <pname> of
256    SUBGROUP_SUPPORTED_FEATURES_KHR. On return, <data> will
257    contain the bitwise OR of the SUBGROUP_FEATURE_*_BIT_KHR
258    flags indicating which subgroup operations are supported by the
259    implementation. Possible values include:
260
261    * SUBGROUP_FEATURE_BASIC_BIT_KHR indicates the GL supports shaders
262      with the KHR_shader_subgroup_basic extension enabled. See SG.1.1.
263
264    * SUBGROUP_FEATURE_VOTE_BIT_KHR indicates the GL supports shaders
265      with the KHR_shader_subgroup_vote extension enabled. See SG.1.2.
266
267    * SUBGROUP_FEATURE_ARITHMETIC_BIT_KHR indicates the GL supports
268      shaders with the KHR_shader_subgroup_arithmetic extension enabled.
269      See SG.1.3.
270
271    * SUBGROUP_FEATURE_BALLOT_BIT_KHR indicates the GL supports
272      shaders with the KHR_shader_subgroup_ballot extension enabled.
273      See SG.1.4.
274
275    * SUBGROUP_FEATURE_SHUFFLE_BIT_KHR indicates the GL supports
276      shaders with the KHR_shader_subgroup_shuffle extension enabled.
277      See SG.1.5.
278
279    * SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT_KHR indicates the GL
280      supports shaders with the KHR_shader_subgroup_shuffle_relative
281      extension enabled. See SG.1.6.
282
283    * SUBGROUP_FEATURE_CLUSTERED_BIT_KHR indicates the GL supports
284      shaders with the KHR_shader_subgroup_clustered extension enabled.
285      See SG.1.7.
286
287    * SUBGROUP_FEATURE_QUAD_BIT_KHR indicates the GL supports shaders
288      with the GL_KHR_shader_subgroup_quad extension enabled. See SG.1.8.
289
290    All implementations must support SUBGROUP_FEATURE_BASIC_BIT_KHR.
291
292    SG.2.4 Subgroup Quads Support
293
294    To determine whether subgroup quad operations (See SG.1.8) are
295    available in all stages, call GetBooleanv with a <pname> of
296    SUBGROUP_QUAD_ALL_STAGES_KHR. On return, <data> will be TRUE
297    if subgroup quad operations are supported in all shader stages
298    which support subgroup operations. FALSE is returned if subgroup quad
299    operations are not supported, or if they are restricted to fragment
300    and compute stages.
301
302Modifications to Appendix C of the OpenGL 4.6 (Core Profile) Specification
303(The OpenGL SPIR-V Execution Environment)
304
305    Modifications to section C.1 (Required Versions and Formats) [p661]
306
307      Replace the first sentence with the following:
308
309        "Implementations must support the 1.0 and 1.3 versions of SPIR-V
310        and the 1.0 version of the SPIR-V Extended Instructions
311        for the OpenGL Shading Language (see section 1.3.4)."
312
313    Modifications to section C.2 (Valid SPIR-V Built-In Variable
314    Decorations) [661]
315
316      Add the following rows to Table C.1 (Built-in Variable Decorations)
317
318        NumSubgroups            (if SUBGROUP_FEATURE_BASIC_BIT_KHR is supported)
319        SubgroupId              (if SUBGROUP_FEATURE_BASIC_BIT_KHR is supported)
320        SubgroupSize            (if SUBGROUP_FEATURE_BASIC_BIT_KHR is supported)
321        SubgroupLocalInvocationId (if SUBGROUP_FEATURE_BASIC_BIT_KHR is supported)
322        SubgroupEqMask          (if SUBGROUP_FEATURE_BALLOT_BIT_KHR is supported)
323        SubgroupGeMask          (if SUBGROUP_FEATURE_BALLOT_BIT_KHR is supported)
324        SubgroupGtMask          (if SUBGROUP_FEATURE_BALLOT_BIT_KHR is supported)
325        SubgroupLeMask          (if SUBGROUP_FEATURE_BALLOT_BIT_KHR is supported)
326        SubgroupLtMask          (if SUBGROUP_FEATURE_BALLOT_BIT_KHR is supported)
327
328    Additions to section C.3 (Valid SPIR-V Capabilities):
329
330    Add the following rows to Table C.2 (Valid SPIR-V Capabilities):
331
332        GroupNonUniform                (if SUBGROUP_FEATURE_BASIC_BIT_KHR is supported)
333        GroupNonUniformVote            (if SUBGROUP_FEATURE_VOTE_BIT_KHR is supported)
334        GroupNonUniformArithmetic      (if SUBGROUP_FEATURE_ARITHMETIC_BIT_KHR is supported)
335        GroupNonUniformBallot          (if SUBGROUP_FEATURE_BALLOT_BIT_KHR is supported)
336        GroupNonUniformShuffle         (if SUBGROUP_FEATURE_SHUFFLE_BIT_KHR is supported)
337        GroupNonUniformShuffleRelative (if SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT_KHR is supported)
338        GroupNonUniformClustered       (if SUBGROUP_FEATURE_CLUSTERED_BIT_KHR is supported)
339        GroupNonUniformQuad            (if SUBGROUP_FEATURE_QUAD_BIT_KHR is supported)
340
341    Additions to section C.4 (Validation Rules):
342
343      Make the following changes to the validation rules:
344
345        Add *Subgroup* to the list of acceptable scopes for memory.
346
347      Add:
348
349        *Scope* for *Non Uniform Group Operations* must be limited to:
350          - *Subgroup*
351
352        * If OpControlBarrier is used in fragment, vertex, tessellation
353           evaluation, or geometry stages, the execution Scope must be
354           *Subgroup*.
355
356        * "`Result Type`" for *Non Uniform Group Operations* must be
357          limited to 32-bit float, 32-bit integer, boolean, or vectors
358          of these types. If the Float64 capability is enabled, double
359          and vectors of double types are also permitted.
360
361        * If OpGroupNonUniformBallotBitCount is used, the group operation
362          must be one of:
363          - *Reduce*
364          - *InclusiveScan*
365          - *ExclusiveScan*
366
367      Add the following restrictions (disallowing SPIR-V 1.1, 1.2, and
368      1.3 features not related to subgroups);
369
370        * The *LocalSizeId* Execution Mode must not be used.
371
372        [[If SPV_KHR_storage_buffer_storage_class is not supported]]
373        * The *StorageBuffer* Storage Class must not be used.
374
375        * The *DependencyInfinite* and *DependencyLength* Loop Control
376          masks must not be used.
377
378        [[If SPV_KHR_shader_draw_parameters or OpenGL 4.6 is not supported]]
379        * The *DrawParameters* Capability must not be used.
380
381        * The *StorageBuffer16BitAccess*, *UniformAndStorageBuffer16BitAccess*,
382          *StoragePushConstant16*, *StorageInputOutput16* Capabilities must
383          not be used.
384
385        * The *DeviceGroup*, *MultiView*, *VariablePointersStorageBuffer*, and
386          *VariablePointers* Capabilities must not be used.
387
388        * The *OpModuleProcessed*, *OpDecorateId*, and *OpExecutionModeId*
389          Instructions must not be used.
390
391Modifications to the OpenGL Shading Language Specification, Version 4.60
392
393    See the separate KHR_shader_subgroup GLSL document.
394    https://github.com/KhronosGroup/GLSL/blob/master/extensions/khr/GL_KHR_shader_subgroup.txt
395
396Dependencies on ARB_gl_spirv and OpenGL 4.6
397
398    If ARB_gl_spirv or OpenGL 4.6 are not supported, ignore all
399    references to SPIR-V functionality.
400
401Dependencies on ARB_spirv_extensions and OpenGL 4.6
402
403    If ARB_spirv_extensions or OpenGL 4.6 are not supported, ignore
404    references to the ability to advertise additional SPIR-V extensions.
405
406Dependencies on OpenGL ES 3.x
407
408    If implemented in OpenGL ES, ignore all references to SPIR-V and to
409    GLSL built-in functions which utilize the genDType (double) types.
410
411Dependencies on ARB_shader_draw_parameters and SPV_KHR_shader_draw_parameters
412
413    If neither OpenGL 4.6, nor ARB_shader_draw_parameters and
414    SPV_KHR_shader_draw_parameters are supported, the *DrawParameters*
415    Capability is not supported.
416
417Dependencies on SPV_KHR_storage_buffer_storage_class
418
419    If SPV_KHR_storage_buffer_storage_class is not supported, the
420    *StorageBuffer* Storage Class must not be used.
421
422Additions to the AGL/GLX/WGL Specifications
423
424    None
425
426Errors
427
428    None
429
430New State
431
432    None
433
434New Implementation Dependent State
435
436    Additions to table 2.53 - Implementation Dependent Values
437
438                                                    Minimum
439    Get Value                Type  Get Command      Value   Description                   Sec.
440    ---------                ----- ---------------  ------- ------------------------      ------
441    SUBGROUP_SIZE_KHR        Z+    GetIntegerv      1       No. of invocations in         SG.2.1
442                                                            each subgroup
443
444    SUBGROUP_SUPPORTED_      E     GetIntegerv      Sec     Bitfield of stages that       SG.2.2
445      STAGES_KHR                                    SG.2.2  subgroups are supported in
446
447    SUBGROUP_SUPPORTED_      E     GetIntegerv      Sec     Bitfield of subgroup          SG.2.3
448      FEATURES_KHR                                  SG.2.3  operations supported
449
450    SUBGROUP_QUAD_           B     GetBooleanv      -       Quad subgroups supported      SG.2.4
451      ALL_STAGES_KHR                                        in all stages
452
453Issues
454
455    1. What should we name this extension?
456
457       DISCUSSION. We will use the same name as the GLSL extension
458       in order to minimize confusion. This has been done for other
459       extensions and people seem to have figured it out. Other
460       options considered: KHR_subgroups, KHR_shader_subgroup_operations,
461       KHR_subgroup_operations.
462
463       RESOLVED: use KHR_shader_subgroup to match the GLSL extension.
464
465    2. What should happen if subgroup operations are attempted on
466       unsupported stages?
467
468       DISCUSSION: There are basically two options
469         A. compile or link-time error?
470         B. draw time invalid_op error?
471       Seems like Option (A) would be more user friendly, and there doesn't
472       seem to be much point in requiring an implementation to
473       support compiling the functionality in stages they won't work in.
474       Typically this should be detectable by an implementation at compile
475       time since this will just require them to reject shaders with
476       #extension GL_KHR_shader_subgroup* in shader stages that they don't
477       support. However, for SPIR-V implementations, this may happen at
478       lowering time, so it may happen at either compile or link-time.
479
480       RESOLVED: Compile or link-time error.
481
482    3. How should we enable SPIR-V support for this extension?
483
484       DISCUSSION: Options could include:
485         A. add support for SPIR-V 1.1, 1.2, and 1.3.
486         B. add support for only the subgroups capabilities from SPIR-V 1.3.
487
488       Doing option (A) seems like a weird way of submarining support
489       for new versions of SPIR-V into OpenGL, and it seems like there
490       should be a separate extension for that.
491       If option (B) is selected, we need to be sure to disallow other
492       new capabilities that are added in SPIR-V 1.1, 1.2, and 1.3
493
494       RESOLVED: (B) only add support for subgroup capabilities from SPIR-V
495       1.3. If a future GL core version incorporates this extension it should
496       add support for all of SPIR-V 1.3.
497
498    4. What functionality of SPIR-V 1.1, 1.2, and 1.3 needs to be disallowed?
499
500       RESOLVED:
501       Additions that aren't gated by specific capabilities and are disallowed
502       are the following:
503
504         LocalSizeId (1.2)
505         DependencyInfinite (1.1)
506         DependencyLength (1.1)
507         OpModuleProcessed (1.1)
508         OpDecorateId (1.2)
509         OpExecutionModeId (1.2)
510
511       Additions that are gated by graphics-compatible capabilities not
512       being enabled by this extension (but could be enabled by other
513       extensions):
514
515       Capabilities                                 Enabling extension
516
517         StorageBuffer (1.3)                        SPV_KHR_storage_buffer_storage_class
518
519         DrawParameters (1.3)                       SPV_KHR_shader_draw_parameters
520           - BaseVertex
521           - BaseInstance
522           - DrawIndex
523
524         DeviceGroup (1.3)                          SPV_KHR_device_group
525           - DeviceIndex
526
527         MultiView (1.3)                            SPV_KHR_multiview
528           - ViewIndex
529
530         StorageBuffer16BitAccess (1.3)             SPV_KHR_16bit_storage
531         StorageUniformBufferBlock16 (1.3)          SPV_KHR_16bit_storage
532         UniformAndStorageBuffer16BitAccess (1.3)   SPV_KHR_16bit_storage
533         StorageUniform16 (1.3)                     SPV_KHR_16bit_storage
534         StoragePushConstant16 (1.3)                SPV_KHR_16bit_storage
535         StorageInputOutput16 (1.3)                 SPV_KHR_16bit_storage
536
537         VariablePointersStorageBuffer (1.3)        SPV_KHR_variable_pointers
538         VariablePointers (1.3)                     SPV_KHR_variable_pointers
539
540    5. Given Issues (3) and (4) what exactly are the additional SPIR-V
541       requirements are being added by this extension?
542
543       RESOLVED: We add support for the following from SPIR-V 1.3:
544
545       Capabilities (3.31)                  Enabling API Feature
546
547         GroupNonUniform                    SUBGROUP_FEATURE_BASIC_BIT_KHR
548         GroupNonUniformVote                SUBGROUP_FEATURE_VOTE_BIT_KHR
549         GroupNonUniformArithmetic          SUBGROUP_FEATURE_ARITHMETIC_BIT_KHR
550         GroupNonUniformBallot              SUBGROUP_FEATURE_BALLOT_BIT_KHR
551         GroupNonUniformShuffle             SUBGROUP_FEATURE_SHUFFLE_BIT_KHR
552         GroupNonUniformShuffleRelative     SUBGROUP_FEATURE_SHUFFLE_RELATIVE_BIT_KHR
553         GroupNonUniformClustered           SUBGROUP_FEATURE_CLUSTERED_BIT_KHR
554         GroupNonUniformQuad                SUBGROUP_FEATURE_QUAD_BIT_KHR
555
556       Builtins (3.21)              Enabling Capability
557
558         SubgroupSize               GroupNonUniform
559         NumSubgroups               GroupNonUniform
560         SubgroupId                 GroupNonUniform
561         SubgroupLocalInvocationId  GroupNonUniform
562         SubgroupEqMask             GroupNonUniformBallot
563         SubgroupGeMask             GroupNonUniformBallot
564         SubgroupGtMask             GroupNonUniformBallot
565         SubgroupLeMask             GroupNonUniformBallot
566         SubgroupLtMask             GroupNonUniformBallot
567
568       Group Operations         Enabling Capability
569       (3.28)
570
571         Reduce                 GroupNonUniformArithmetic, GroupNonUniformBallot
572         InclusiveScan          GroupNonUniformArithmetic, GroupNonUniformBallot
573         ExclusiveScan          GroupNonUniformArithmetic, GroupNonUniformBallot
574         ClusteredReduce        GroupNonUniformClustered
575
576       Non-Uniform Instructions             Enabling Capability
577       (3.32.24)
578
579         OpGroupNonUniformElect             GroupNonUniform
580         OpGroupNonUniformAll               GroupNonUniformVote
581         OpGroupNonUniformAny               GroupNonUniformVote
582         OpGroupNonUniformAllEqual          GroupNonUniformVote
583         OpGroupNonUniformBroadcast         GroupNonUniformBallot
584         OpGroupNonUniformBroadcastFirst    GroupNonUniformBallot
585         OpGroupNonUniformBallot            GroupNonUniformBallot
586         OpGroupNonUniformInverseBallot     GroupNonUniformBallot
587         OpGroupNonUniformBallotBitExtract  GroupNonUniformBallot
588         OpGroupNonUniformBallotBitCount    GroupNonUniformBallot
589         OpGroupNonUniformBallotFindLSB     GroupNonUniformBallot
590         OpGroupNonUniformBallotFindMSB     GroupNonUniformBallot
591         OpGroupNonUniformShuffle           GroupNonUniformShuffle
592         OpGroupNonUniformShuffleXor        GroupNonUniformShuffle
593         OpGroupNonUniformShuffleUp         GroupNonUniformShuffle
594         OpGroupNonUniformShuffleDown       GroupNonUniformShuffle
595         OpGroupNonUniformIAdd              GroupNonUniformArithmetic, GroupNonUniformClustered
596         OpGroupNonUniformFAdd              GroupNonUniformArithmetic, GroupNonUniformClustered
597         OpGroupNonUniformIMul              GroupNonUniformArithmetic, GroupNonUniformClustered
598         OpGroupNonUniformFMul              GroupNonUniformArithmetic, GroupNonUniformClustered
599         OpGroupNonUniformSMin              GroupNonUniformArithmetic, GroupNonUniformClustered
600         OpGroupNonUniformUMin              GroupNonUniformArithmetic, GroupNonUniformClustered
601         OpGroupNonUniformFMin              GroupNonUniformArithmetic, GroupNonUniformClustered
602         OpGroupNonUniformSMax              GroupNonUniformArithmetic, GroupNonUniformClustered
603         OpGroupNonUniformUMax              GroupNonUniformArithmetic, GroupNonUniformClustered
604         OpGroupNonUniformFMax              GroupNonUniformArithmetic, GroupNonUniformClustered
605         OpGroupNonUniformBitwiseAnd        GroupNonUniformArithmetic, GroupNonUniformClustered
606         OpGroupNonUniformBitwiseOr         GroupNonUniformArithmetic, GroupNonUniformClustered
607         OpGroupNonUniformBitwiseXor        GroupNonUniformArithmetic, GroupNonUniformClustered
608         OpGroupNonUniformLogicalAnd        GroupNonUniformArithmetic, GroupNonUniformClustered
609         OpGroupNonUniformLogicalOr         GroupNonUniformArithmetic, GroupNonUniformClustered
610         OpGroupNonUniformLogicalXor        GroupNonUniformArithmetic, GroupNonUniformClustered
611         OpGroupNonUniformQuadBroadcast     GroupNonUniformQuad
612         OpGroupNonUniformQuadSwap          GroupNonUniformQuad
613
614       *Subgroup* as an acceptable memory scope.
615
616       OpControlBarrier in fragment, vertex, tessellation evaluation, tessellation
617       control, and geometry stages with the *Subgroup* execution Scope.
618
619
620Revision History
621
622    Rev.  Date          Author     Changes
623    ----  -----------   --------   -------------------------------------------
624     8    2019-07-26    dgkoch     Update status and assign extension numbers
625     7    2019-05-22    dgkoch     Resync language with Vulkan spec. Address feedback
626                                   from Graeme. Relax quad ordering definition.
627     6    2019-03-28    dgkoch     rename to KHR_shader_subgroup, update some issues
628     5    2018-05-30    dgkoch     Address feedback from Graeme and Jesse.
629     4    2018-05-28    dgkoch     change ALLSTAGES -> ALL_STAGES, fix typos
630     3    2018-05-23    dgkoch     Add overview and interactions, add SPIR-V 1.3
631                                   restrictions, Issues 4 and 5.
632     2    2018-04-26    dgkoch     Various updates to match latest vulkan spec
633                                   Assign tokens. Add SPIR-V support.
634     1    2018-01-19    dgkoch     Initial revision.
635
636