1#version 450 2#extension GL_KHR_shader_subgroup_basic : require 3#extension GL_KHR_shader_subgroup_ballot : require 4#extension GL_KHR_shader_subgroup_vote : require 5#extension GL_KHR_shader_subgroup_shuffle : require 6#extension GL_KHR_shader_subgroup_shuffle_relative : require 7#extension GL_KHR_shader_subgroup_arithmetic : require 8#extension GL_KHR_shader_subgroup_clustered : require 9#extension GL_KHR_shader_subgroup_quad : require 10layout(local_size_x = 1) in; 11 12layout(std430, binding = 0) buffer SSBO 13{ 14 float FragColor; 15}; 16 17void main() 18{ 19 // basic 20 FragColor = float(gl_NumSubgroups); 21 FragColor = float(gl_SubgroupID); 22 FragColor = float(gl_SubgroupSize); 23 FragColor = float(gl_SubgroupInvocationID); 24 subgroupBarrier(); 25 subgroupMemoryBarrier(); 26 subgroupMemoryBarrierBuffer(); 27 subgroupMemoryBarrierShared(); 28 subgroupMemoryBarrierImage(); 29 bool elected = subgroupElect(); 30 31 // ballot 32 FragColor = float(gl_SubgroupEqMask); 33 FragColor = float(gl_SubgroupGeMask); 34 FragColor = float(gl_SubgroupGtMask); 35 FragColor = float(gl_SubgroupLeMask); 36 FragColor = float(gl_SubgroupLtMask); 37 vec4 broadcasted = subgroupBroadcast(vec4(10.0), 8u); 38 vec3 first = subgroupBroadcastFirst(vec3(20.0)); 39 uvec4 ballot_value = subgroupBallot(true); 40 bool inverse_ballot_value = subgroupInverseBallot(ballot_value); 41 bool bit_extracted = subgroupBallotBitExtract(uvec4(10u), 8u); 42 uint bit_count = subgroupBallotBitCount(ballot_value); 43 uint inclusive_bit_count = subgroupBallotInclusiveBitCount(ballot_value); 44 uint exclusive_bit_count = subgroupBallotExclusiveBitCount(ballot_value); 45 uint lsb = subgroupBallotFindLSB(ballot_value); 46 uint msb = subgroupBallotFindMSB(ballot_value); 47 48 // shuffle 49 uint shuffled = subgroupShuffle(10u, 8u); 50 uint shuffled_xor = subgroupShuffleXor(30u, 8u); 51 52 // shuffle relative 53 uint shuffled_up = subgroupShuffleUp(20u, 4u); 54 uint shuffled_down = subgroupShuffleDown(20u, 4u); 55 56 // vote 57 bool has_all = subgroupAll(true); 58 bool has_any = subgroupAny(true); 59 bool has_equal = subgroupAllEqual(0); 60 has_equal = subgroupAllEqual(true); 61 62 // arithmetic 63 vec4 added = subgroupAdd(vec4(20.0)); 64 ivec4 iadded = subgroupAdd(ivec4(20)); 65 vec4 multiplied = subgroupMul(vec4(20.0)); 66 ivec4 imultiplied = subgroupMul(ivec4(20)); 67 vec4 lo = subgroupMin(vec4(20.0)); 68 vec4 hi = subgroupMax(vec4(20.0)); 69 ivec4 slo = subgroupMin(ivec4(20)); 70 ivec4 shi = subgroupMax(ivec4(20)); 71 uvec4 ulo = subgroupMin(uvec4(20)); 72 uvec4 uhi = subgroupMax(uvec4(20)); 73 uvec4 anded = subgroupAnd(ballot_value); 74 uvec4 ored = subgroupOr(ballot_value); 75 uvec4 xored = subgroupXor(ballot_value); 76 77 added = subgroupInclusiveAdd(added); 78 iadded = subgroupInclusiveAdd(iadded); 79 multiplied = subgroupInclusiveMul(multiplied); 80 imultiplied = subgroupInclusiveMul(imultiplied); 81 //lo = subgroupInclusiveMin(lo); // FIXME: Unsupported by Metal 82 //hi = subgroupInclusiveMax(hi); 83 //slo = subgroupInclusiveMin(slo); 84 //shi = subgroupInclusiveMax(shi); 85 //ulo = subgroupInclusiveMin(ulo); 86 //uhi = subgroupInclusiveMax(uhi); 87 //anded = subgroupInclusiveAnd(anded); 88 //ored = subgroupInclusiveOr(ored); 89 //xored = subgroupInclusiveXor(ored); 90 //added = subgroupExclusiveAdd(lo); 91 92 added = subgroupExclusiveAdd(multiplied); 93 multiplied = subgroupExclusiveMul(multiplied); 94 iadded = subgroupExclusiveAdd(imultiplied); 95 imultiplied = subgroupExclusiveMul(imultiplied); 96 //lo = subgroupExclusiveMin(lo); // FIXME: Unsupported by Metal 97 //hi = subgroupExclusiveMax(hi); 98 //ulo = subgroupExclusiveMin(ulo); 99 //uhi = subgroupExclusiveMax(uhi); 100 //slo = subgroupExclusiveMin(slo); 101 //shi = subgroupExclusiveMax(shi); 102 //anded = subgroupExclusiveAnd(anded); 103 //ored = subgroupExclusiveOr(ored); 104 //xored = subgroupExclusiveXor(ored); 105 106 // clustered 107 added = subgroupClusteredAdd(added, 4u); 108 multiplied = subgroupClusteredMul(multiplied, 4u); 109 iadded = subgroupClusteredAdd(iadded, 4u); 110 imultiplied = subgroupClusteredMul(imultiplied, 4u); 111 lo = subgroupClusteredMin(lo, 4u); 112 hi = subgroupClusteredMax(hi, 4u); 113 ulo = subgroupClusteredMin(ulo, 4u); 114 uhi = subgroupClusteredMax(uhi, 4u); 115 slo = subgroupClusteredMin(slo, 4u); 116 shi = subgroupClusteredMax(shi, 4u); 117 anded = subgroupClusteredAnd(anded, 4u); 118 ored = subgroupClusteredOr(ored, 4u); 119 xored = subgroupClusteredXor(xored, 4u); 120 121 // quad 122 vec4 swap_horiz = subgroupQuadSwapHorizontal(vec4(20.0)); 123 vec4 swap_vertical = subgroupQuadSwapVertical(vec4(20.0)); 124 vec4 swap_diagonal = subgroupQuadSwapDiagonal(vec4(20.0)); 125 vec4 quad_broadcast = subgroupQuadBroadcast(vec4(20.0), 3u); 126} 127