| GLSL | HLSL | MSL | Description |
| bool subgroupAny(bool value) | bool WaveActiveAnyTrue(bool value) | bool simd_any(bool value) | returns true if any active lane has value == true |
| bool subgroupAll(bool value) | bool WaveActiveAllTrue(bool value) | bool simd_all(bool value) | returns true if all active lanes have value == true |
| bool subgroupAllEqual(T value) | bool WaveActiveAllEqual(T value) | - | returns true if all active lanes have a value that is equal |
| GLSL | HLSL | MSL | Description |
| T subgroupAdd(T value) | T WaveActiveSum(T value) | T simd_sum(T value) | returns the summation of all active lanes value's across the wave |
| T subgroupMul(T value) | T WaveActiveProduct(T value) | T simd_product(T value) | returns the multiplication of all active lanes value's across the wave |
| T subgroupMin(T value) | T WaveActiveMin(T value) | T simd_min(T value) | returns the minimum value of all active lanes value's across the wave |
| T subgroupMax(T value) | T WaveActiveMax(T value) | T simd_max(T value) | returns the maximum value of all active lanes value's across the wave |
| T subgroupAnd(T value) | T WaveActiveBitAnd(T value) | T simd_and(T value) | returns the binary AND of all active lanes value's across the wave |
| T subgroupOr(T value) | T WaveActiveBitOr(T value) | T simd_or(T value) | returns the binary OR of all active lanes value's across the wave |
| T subgroupXor(T value) | T WaveActiveBitXor(T value) | T simd_xor(T value) | returns the binary XOR of all active lanes value's across the wave |
| T subgroupInclusiveMul(T value) | - | T simd_prefix_inclusive_product(T value) | returns the inclusive scan the multiplication of all active lanes value's across the wave |
| T subgroupInclusiveAdd(T value) | - | T simd_prefix_inclusive_sum(T value) | returns the inclusive scan summation of all active lanes value's across the wave |
| T subgroupInclusiveMin(T value) | - | - | returns the inclusive scan the minimum value of all active lanes value's across the wave |
| T subgroupInclusiveMax(T value) | - | - | returns the inclusive scan the maximum value of all active lanes value's across the wave |
| T subgroupInclusiveAnd(T value) | - | - | returns the inclusive scan the binary AND of all active lanes value's across the wave |
| T subgroupInclusiveOr(T value) | - | - | returns the inclusive scan the binary OR of all active lanes value's across the wave |
| T subgroupInclusiveXor(T value) | - | - | returns the inclusive scan the binary XOR of all active lanes value's across the wave |
| T subgroupExclusiveAdd(T value) | T WavePrefixSum(T value) | T simd_prefix_exclusive_sum(T value) | returns the exclusive scan summation of all active lanes value's across the wave |
| T subgroupExclusiveMul(T value) | T WavePrefixProduct(T value) | T simd_prefix_exclusive_product (T value) | returns the exclusive scan the multiplication of all active lanes value's across the wave |
| T subgroupExclusiveMin(T value) | - | - | returns the exclusive scan the minimum value of all active lanes value's across the wave |
| T subgroupExclusiveMax(T value) | - | - | returns the exclusive scan the maximum value of all active lanes value's across the wave |
| T subgroupExclusiveAnd(T value) | - | - | returns the exclusive scan the binary AND of all active lanes value's across the wave |
| T subgroupExclusiveOr(T value) | - | - | returns the exclusive scan the binary OR of all active lanes value's across the wave |
| T subgroupExclusiveXor(T value) | - | - | returns the exclusive scan the binary XOR of all active lanes value's across the wave |
| GLSL | HLSL | MSL | Description |
| uvec4 subgroupBallot(bool value) | uint4 WaveActiveBallot(bool value) | simd_vote simd_ballot(bool value) | each lane contributes a single bit to the resulting uvec4 corresponding to value |
| T subgroupBroadcast(T value, uint id) | T WaveReadLaneAt(T value, uint id) | T simd_broadcast(T value, ushort id) | broadcasts the value whose LaneIndex == id to all other lanes (id must be a compile time constant) |
| T subgroupBroadcastFirst(T value) | T WaveReadLaneFirst(T value) | T simd_broadcast_first(T value) | broadcasts the value whose LaneIndex is the lowest active to all other lanes |
| bool subgroupInverseBallot(uvec4 value) | - | - | returns true if this lanes bit in value is true |
| bool subgroupBallotBitExtract(uvec4 value, uint index) | - | - | returns true if the bit corresponding to index is set in value |
| uint subgroupBallotBitCount(uvec4 value) | - | - | returns the number of bits set in value, only counting the bottom WaveSize bits |
| uint subgroupBallotInclusiveBitCount(uvec4 value) | - | - | returns the inclusive scan of the number of bits set in value, only counting the bottom WaveSize bits (we'll cover what an inclusive scan is later) |
| uint subgroupBallotExclusiveBitCount(uvec4 value) | - | - | returns the exclusive scan of the number of bits set in value, only counting the bottom WaveSize bits (we'll cover what an exclusive scan is later) |
| uint subgroupBallotFindLSB(uvec4 value) | - | - | returns the lowest bit set in value, only counting the bottom WaveSize bits |
| uint subgroupBallotFindMSB(uvec4 value) | - | - | returns the highest bit set in value, only counting the bottom WaveSize bits |
| uint subgroupBallotBitCount( subgroupBallot(bool value)) | uint WaveActiveCountBits(bool value) | - | counts the number of boolean variables which evaluate to true across all active lanes in the current wave, and replicates the result to all lanes in the wave |
| uint subgroupBallotExclusiveBitCount( subgroupBallot(bool value)) | uint WavePrefixCountBits(bool value) | - | returns the sum of all the specified boolean variables set to true across all active lanes with indices smaller than the current lane |
| GLSL | HLSL | MSL | Description |
| T subgroupClusteredAdd(T value, uint clusterSize) | - | - | returns the summation of all active lanes value's across clusters of size clusterSize |
| T subgroupClusteredMul(T value, uint clusterSize) | - | - | returns the multiplication of all active lanes value's across clusters of size clusterSize |
| T subgroupClusteredMin(T value, uint clusterSize) | - | - | returns the minimum value of all active lanes value's across clusters of size clusterSize |
| T subgroupClusteredMax(T value, uint clusterSize) | - | - | returns the maximum value of all active lanes value's across clusters of size clusterSize |
| T subgroupClusteredAnd(T value, uint clusterSize) | - | - | returns the binary AND of all active lanes value's across clusters of size clusterSize |
| T subgroupClusteredOr(T value, uint clusterSize) | - | - | returns the binary OR of all active lanes value's across clusters of size clusterSize |
| T subgroupClusteredXor(T value, uint clusterSize) | - | - | returns the binary XOR of all active lanes value's across clusters of size clusterSize |
Quad operations executes on 2x2 grid in pixel and compute shaders.
| GLSL | HLSL | MSL | Description |
| T subgroupQuadBroadcast(T value, uint id) | T QuadReadLaneAt(T value, uint id) | T quad_broadcast(T value, ushort id) | returns the value in the quad whose LaneIndex modulus 4 is equal to id |
| T subgroupQuadSwapHorizontal(T value) | T QuadReadAcrossX(T value) | - | swaps value's within the quad horizontally |
| T subgroupQuadSwapVertical(T value) | T QuadReadAcrossY(T value) | - | swaps value's within the quad vertically |
| T subgroupQuadSwapDiagonal(T value) | T QuadReadAcrossDiagonal(T value) | - | swaps value's within the quad diagonally |