1#version 460 2 3#define MAX_VER 81 4#define MAX_PRIM 32 5 6#define BARRIER() \ 7 memoryBarrierShared(); \ 8 barrier(); 9 10#extension GL_EXT_mesh_shader : enable 11 12layout(local_size_x = 32, local_size_y=1, local_size_z=1) in; 13 14layout(max_vertices=MAX_VER) out; 15layout(max_primitives=MAX_PRIM) out; 16layout(triangles) out; 17 18// test use of builtins in mesh shaders: 19 20void main() 21{ 22 uint iid = gl_LocalInvocationID.x; 23 uint gid = gl_WorkGroupID.x; 24 uint vertexCount = MAX_VER; // vertexCount <= max_vertices 25 uint primitiveCount = MAX_PRIM; // primitiveCount <= max_primtives 26 SetMeshOutputsEXT(vertexCount, primitiveCount); 27 28 gl_MeshVerticesEXT[iid].gl_Position = vec4(1.0); 29 gl_MeshVerticesEXT[iid].gl_PointSize = 2.0; 30 gl_MeshVerticesEXT[iid].gl_ClipDistance[3] = 3.0; 31 gl_MeshVerticesEXT[iid].gl_CullDistance[2] = 4.0; 32 33 BARRIER(); 34 35 gl_MeshVerticesEXT[iid+1].gl_Position = gl_MeshVerticesEXT[iid].gl_Position; 36 gl_MeshVerticesEXT[iid+1].gl_PointSize = gl_MeshVerticesEXT[iid].gl_PointSize; 37 gl_MeshVerticesEXT[iid+1].gl_ClipDistance[3] = gl_MeshVerticesEXT[iid].gl_ClipDistance[3]; 38 gl_MeshVerticesEXT[iid+1].gl_CullDistance[2] = gl_MeshVerticesEXT[iid].gl_CullDistance[2]; 39 40 BARRIER(); 41 42 gl_MeshPrimitivesEXT[iid].gl_PrimitiveID = 6; 43 gl_MeshPrimitivesEXT[iid].gl_Layer = 7; 44 gl_MeshPrimitivesEXT[iid].gl_ViewportIndex = 8; 45 gl_MeshPrimitivesEXT[iid].gl_CullPrimitiveEXT = false; 46 47 BARRIER(); 48 49 gl_MeshPrimitivesEXT[iid+1].gl_PrimitiveID = gl_MeshPrimitivesEXT[iid].gl_PrimitiveID; 50 gl_MeshPrimitivesEXT[iid+1].gl_Layer = gl_MeshPrimitivesEXT[iid].gl_Layer; 51 gl_MeshPrimitivesEXT[iid+1].gl_ViewportIndex = gl_MeshPrimitivesEXT[iid].gl_ViewportIndex; 52 gl_MeshPrimitivesEXT[iid+1].gl_CullPrimitiveEXT = false; 53 54 BARRIER(); 55 56 // check bound limits 57 gl_PrimitiveTriangleIndicesEXT[0] = uvec3(1, 1, 1); // range is between [0, vertexCount-1] 58 gl_PrimitiveTriangleIndicesEXT[primitiveCount - 1] = uvec3(2, 2, 2); // array size is primitiveCount*3 for triangle 59 gl_PrimitiveTriangleIndicesEXT[gid] = gl_PrimitiveTriangleIndicesEXT[gid-1]; 60 61 62 BARRIER(); 63} 64 65#extension GL_KHR_shader_subgroup_basic: enable 66void basic_works (void) 67{ 68 gl_SubgroupSize; 69 gl_SubgroupInvocationID; 70 subgroupBarrier(); 71 subgroupMemoryBarrier(); 72 subgroupMemoryBarrierBuffer(); 73 subgroupMemoryBarrierImage(); 74 subgroupElect(); 75 gl_NumSubgroups; // allowed in mesh 76 gl_SubgroupID; // allowed in mesh 77 subgroupMemoryBarrierShared(); // allowed in mesh 78} 79 80#extension GL_KHR_shader_subgroup_ballot: enable 81void ballot_works(vec4 f4) { 82 gl_SubgroupEqMask; 83 gl_SubgroupGeMask; 84 gl_SubgroupGtMask; 85 gl_SubgroupLeMask; 86 gl_SubgroupLtMask; 87 subgroupBroadcast(f4, 0); 88 subgroupBroadcastFirst(f4); 89 uvec4 ballot = subgroupBallot(false); 90 subgroupInverseBallot(uvec4(0x1)); 91 subgroupBallotBitExtract(ballot, 0); 92 subgroupBallotBitCount(ballot); 93 subgroupBallotInclusiveBitCount(ballot); 94 subgroupBallotExclusiveBitCount(ballot); 95 subgroupBallotFindLSB(ballot); 96 subgroupBallotFindMSB(ballot); 97} 98 99#extension GL_KHR_shader_subgroup_vote: enable 100void vote_works(vec4 f4) 101{ 102 subgroupAll(true); 103 subgroupAny(false); 104 subgroupAllEqual(f4); 105} 106 107#extension GL_KHR_shader_subgroup_shuffle: enable 108#extension GL_KHR_shader_subgroup_shuffle_relative: enable 109void shuffle_works(vec4 f4) 110{ 111 subgroupShuffle(f4, 0); 112 subgroupShuffleXor(f4, 0x1); 113 subgroupShuffleUp(f4, 1); 114 subgroupShuffleDown(f4, 1); 115} 116 117#extension GL_KHR_shader_subgroup_arithmetic: enable 118void arith_works(vec4 f4) 119{ 120 uvec4 ballot; 121 subgroupAdd(f4); 122 subgroupMul(f4); 123 subgroupMin(f4); 124 subgroupMax(f4); 125 subgroupAnd(ballot); 126 subgroupOr(ballot); 127 subgroupXor(ballot); 128 subgroupInclusiveAdd(f4); 129 subgroupInclusiveMul(f4); 130 subgroupInclusiveMin(f4); 131 subgroupInclusiveMax(f4); 132 subgroupInclusiveAnd(ballot); 133 subgroupInclusiveOr(ballot); 134 subgroupInclusiveXor(ballot); 135 subgroupExclusiveAdd(f4); 136 subgroupExclusiveMul(f4); 137 subgroupExclusiveMin(f4); 138 subgroupExclusiveMax(f4); 139 subgroupExclusiveAnd(ballot); 140 subgroupExclusiveOr(ballot); 141 subgroupExclusiveXor(ballot); 142} 143 144#extension GL_KHR_shader_subgroup_clustered: enable 145void clustered_works(vec4 f4) 146{ 147 uvec4 ballot = uvec4(0x55,0,0,0); 148 subgroupClusteredAdd(f4, 2); 149 subgroupClusteredMul(f4, 2); 150 subgroupClusteredMin(f4, 2); 151 subgroupClusteredMax(f4, 2); 152 subgroupClusteredAnd(ballot, 2); 153 subgroupClusteredOr(ballot, 2); 154 subgroupClusteredXor(ballot, 2); 155} 156 157#extension GL_KHR_shader_subgroup_quad: enable 158void quad_works(vec4 f4) 159{ 160 subgroupQuadBroadcast(f4, 0); 161 subgroupQuadSwapHorizontal(f4); 162 subgroupQuadSwapVertical(f4); 163 subgroupQuadSwapDiagonal(f4); 164} 165