1#version 460 2 3 4#define BARRIER() \ 5 memoryBarrierShared(); \ 6 barrier(); 7 8#extension GL_EXT_mesh_shader : enable 9 10layout(local_size_x = 32, local_size_y=1, local_size_z=1) in; 11 12// test use of shared memory in task shaders: 13layout(binding=0) writeonly uniform image2D uni_image; 14uniform block0 { 15 uint uni_value; 16}; 17shared vec4 mem[10]; 18 19// test use of task memory in task shaders: 20struct Task { 21 vec2 dummy; 22 vec2 submesh[3]; 23}; 24 25taskPayloadSharedEXT Task mytask; 26void main() 27{ 28 uint iid = gl_LocalInvocationID.x; 29 uint gid = gl_WorkGroupID.x; 30 31 // 1. shared memory load and stores 32 for (uint i = 0; i < 10; ++i) { 33 mem[i] = vec4(i + uni_value); 34 } 35 imageStore(uni_image, ivec2(iid), mem[gid]); 36 imageStore(uni_image, ivec2(iid), mem[gid+1]); 37 38 BARRIER(); 39 40 // 2. task memory stores 41 42 mytask.dummy = vec2(30.0, 31.0); 43 mytask.submesh[0] = vec2(32.0, 33.0); 44 mytask.submesh[1] = vec2(34.0, 35.0); 45 mytask.submesh[2] = mytask.submesh[gid%2]; 46 47 BARRIER(); 48 49 // 3. emit task count under uniform control flow 50 EmitMeshTasksEXT(3U, 1U, 1U); 51} 52 53#extension GL_KHR_shader_subgroup_basic: enable 54void basic_works (void) 55{ 56 gl_SubgroupSize; 57 gl_SubgroupInvocationID; 58 subgroupBarrier(); 59 subgroupMemoryBarrier(); 60 subgroupMemoryBarrierBuffer(); 61 subgroupMemoryBarrierImage(); 62 subgroupElect(); 63 gl_NumSubgroups; // allowed in task 64 gl_SubgroupID; // allowed in task 65 subgroupMemoryBarrierShared(); // allowed in task 66} 67 68#extension GL_KHR_shader_subgroup_ballot: enable 69void ballot_works(vec4 f4) { 70 gl_SubgroupEqMask; 71 gl_SubgroupGeMask; 72 gl_SubgroupGtMask; 73 gl_SubgroupLeMask; 74 gl_SubgroupLtMask; 75 subgroupBroadcast(f4, 0); 76 subgroupBroadcastFirst(f4); 77 uvec4 ballot = subgroupBallot(false); 78 subgroupInverseBallot(uvec4(0x1)); 79 subgroupBallotBitExtract(ballot, 0); 80 subgroupBallotBitCount(ballot); 81 subgroupBallotInclusiveBitCount(ballot); 82 subgroupBallotExclusiveBitCount(ballot); 83 subgroupBallotFindLSB(ballot); 84 subgroupBallotFindMSB(ballot); 85} 86 87#extension GL_KHR_shader_subgroup_vote: enable 88void vote_works(vec4 f4) 89{ 90 subgroupAll(true); 91 subgroupAny(false); 92 subgroupAllEqual(f4); 93} 94 95#extension GL_KHR_shader_subgroup_shuffle: enable 96#extension GL_KHR_shader_subgroup_shuffle_relative: enable 97void shuffle_works(vec4 f4) 98{ 99 subgroupShuffle(f4, 0); 100 subgroupShuffleXor(f4, 0x1); 101 subgroupShuffleUp(f4, 1); 102 subgroupShuffleDown(f4, 1); 103} 104 105#extension GL_KHR_shader_subgroup_arithmetic: enable 106void arith_works(vec4 f4) 107{ 108 uvec4 ballot; 109 subgroupAdd(f4); 110 subgroupMul(f4); 111 subgroupMin(f4); 112 subgroupMax(f4); 113 subgroupAnd(ballot); 114 subgroupOr(ballot); 115 subgroupXor(ballot); 116 subgroupInclusiveAdd(f4); 117 subgroupInclusiveMul(f4); 118 subgroupInclusiveMin(f4); 119 subgroupInclusiveMax(f4); 120 subgroupInclusiveAnd(ballot); 121 subgroupInclusiveOr(ballot); 122 subgroupInclusiveXor(ballot); 123 subgroupExclusiveAdd(f4); 124 subgroupExclusiveMul(f4); 125 subgroupExclusiveMin(f4); 126 subgroupExclusiveMax(f4); 127 subgroupExclusiveAnd(ballot); 128 subgroupExclusiveOr(ballot); 129 subgroupExclusiveXor(ballot); 130} 131 132#extension GL_KHR_shader_subgroup_clustered: enable 133void clustered_works(vec4 f4) 134{ 135 uvec4 ballot = uvec4(0x55,0,0,0); 136 subgroupClusteredAdd(f4, 2); 137 subgroupClusteredMul(f4, 2); 138 subgroupClusteredMin(f4, 2); 139 subgroupClusteredMax(f4, 2); 140 subgroupClusteredAnd(ballot, 2); 141 subgroupClusteredOr(ballot, 2); 142 subgroupClusteredXor(ballot, 2); 143} 144 145#extension GL_KHR_shader_subgroup_quad: enable 146void quad_works(vec4 f4) 147{ 148 subgroupQuadBroadcast(f4, 0); 149 subgroupQuadSwapHorizontal(f4); 150 subgroupQuadSwapVertical(f4); 151 subgroupQuadSwapDiagonal(f4); 152} 153 154