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(true); 60 61 // arithmetic 62 vec4 added = subgroupAdd(vec4(20.0)); 63 ivec4 iadded = subgroupAdd(ivec4(20)); 64 vec4 multiplied = subgroupMul(vec4(20.0)); 65 ivec4 imultiplied = subgroupMul(ivec4(20)); 66 vec4 lo = subgroupMin(vec4(20.0)); 67 vec4 hi = subgroupMax(vec4(20.0)); 68 ivec4 slo = subgroupMin(ivec4(20)); 69 ivec4 shi = subgroupMax(ivec4(20)); 70 uvec4 ulo = subgroupMin(uvec4(20)); 71 uvec4 uhi = subgroupMax(uvec4(20)); 72 uvec4 anded = subgroupAnd(ballot_value); 73 uvec4 ored = subgroupOr(ballot_value); 74 uvec4 xored = subgroupXor(ballot_value); 75 76 added = subgroupInclusiveAdd(added); 77 iadded = subgroupInclusiveAdd(iadded); 78 multiplied = subgroupInclusiveMul(multiplied); 79 imultiplied = subgroupInclusiveMul(imultiplied); 80#if 0 81 lo = subgroupInclusiveMin(lo); 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#endif 92 93 added = subgroupExclusiveAdd(multiplied); 94 multiplied = subgroupExclusiveMul(multiplied); 95 iadded = subgroupExclusiveAdd(imultiplied); 96 imultiplied = subgroupExclusiveMul(imultiplied); 97#if 0 98 lo = subgroupExclusiveMin(lo); 99 hi = subgroupExclusiveMax(hi); 100 ulo = subgroupExclusiveMin(ulo); 101 uhi = subgroupExclusiveMax(uhi); 102 slo = subgroupExclusiveMin(slo); 103 shi = subgroupExclusiveMax(shi); 104 anded = subgroupExclusiveAnd(anded); 105 ored = subgroupExclusiveOr(ored); 106 xored = subgroupExclusiveXor(ored); 107#endif 108 109#if 0 110 // clustered 111 added = subgroupClusteredAdd(added, 4u); 112 multiplied = subgroupClusteredMul(multiplied, 4u); 113 iadded = subgroupClusteredAdd(iadded, 4u); 114 imultiplied = subgroupClusteredMul(imultiplied, 4u); 115 lo = subgroupClusteredMin(lo, 4u); 116 hi = subgroupClusteredMax(hi, 4u); 117 ulo = subgroupClusteredMin(ulo, 4u); 118 uhi = subgroupClusteredMax(uhi, 4u); 119 slo = subgroupClusteredMin(slo, 4u); 120 shi = subgroupClusteredMax(shi, 4u); 121 anded = subgroupClusteredAnd(anded, 4u); 122 ored = subgroupClusteredOr(ored, 4u); 123 xored = subgroupClusteredXor(xored, 4u); 124#endif 125 126 // quad 127 vec4 swap_horiz = subgroupQuadSwapHorizontal(vec4(20.0)); 128 vec4 swap_vertical = subgroupQuadSwapVertical(vec4(20.0)); 129 vec4 swap_diagonal = subgroupQuadSwapDiagonal(vec4(20.0)); 130 vec4 quad_broadcast = subgroupQuadBroadcast(vec4(20.0), 3u); 131} 132