| #version 450 |
| #extension GL_KHR_shader_subgroup_basic : require |
| #extension GL_KHR_shader_subgroup_ballot : require |
| #extension GL_KHR_shader_subgroup_vote : require |
| |
| layout(local_size_x = 1) in; |
| |
| layout(std430, binding = 0) buffer SSBO |
| { |
| float FragColor; |
| }; |
| |
| void main() |
| { |
| // basic |
| FragColor = float(gl_NumSubgroups); |
| FragColor = float(gl_SubgroupID); |
| FragColor = float(gl_SubgroupSize); |
| FragColor = float(gl_SubgroupInvocationID); |
| subgroupBarrier(); |
| subgroupMemoryBarrier(); |
| subgroupMemoryBarrierBuffer(); |
| subgroupMemoryBarrierShared(); |
| subgroupMemoryBarrierImage(); |
| bool elected = subgroupElect(); |
| |
| // ballot |
| FragColor = float(gl_SubgroupEqMask); |
| FragColor = float(gl_SubgroupGeMask); |
| FragColor = float(gl_SubgroupGtMask); |
| FragColor = float(gl_SubgroupLeMask); |
| FragColor = float(gl_SubgroupLtMask); |
| vec4 broadcasted = subgroupBroadcast(vec4(10.0), 8u); |
| vec3 first = subgroupBroadcastFirst(vec3(20.0)); |
| uvec4 ballot_value = subgroupBallot(true); |
| bool inverse_ballot_value = subgroupInverseBallot(ballot_value); |
| bool bit_extracted = subgroupBallotBitExtract(uvec4(10u), 8u); |
| uint bit_count = subgroupBallotBitCount(ballot_value); |
| uint inclusive_bit_count = subgroupBallotInclusiveBitCount(ballot_value); |
| uint exclusive_bit_count = subgroupBallotExclusiveBitCount(ballot_value); |
| uint lsb = subgroupBallotFindLSB(ballot_value); |
| uint msb = subgroupBallotFindMSB(ballot_value); |
| |
| // vote |
| bool has_all = subgroupAll(true); |
| bool has_any = subgroupAny(true); |
| bool has_equal_bool = subgroupAllEqual(true); |
| bool has_equal_T = subgroupAllEqual(uvec3(5u)); |
| } |