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