1#version 460 2 3vec4 undeclared_errors(vec4 f4) 4{ 5 vec4 result; 6 gl_SubgroupSize; // ERROR, extension not enabled (basic) 7 gl_SubgroupInvocationID; // ERROR, extension not enabled (basic) 8 subgroupBarrier(); // ERROR, extension not enabled (basic) 9 subgroupMemoryBarrier(); // ERROR, extension not enabled (basic) 10 subgroupMemoryBarrierBuffer(); // ERROR, extension not enabled (basic) 11 subgroupMemoryBarrierImage(); // ERROR, extension not enabled (basic) 12 subgroupElect(); // ERROR, extension not enabled (basic) 13 gl_NumSubgroups; // ERROR, extension not enabled (basic) 14 gl_SubgroupID; // ERROR, extension not enabled (basic) 15 subgroupMemoryBarrierShared(); // ERROR, extension not enabled (basic) 16 17 subgroupAll(true); // ERROR extension not enabled (vote) 18 subgroupAny(false); // ERROR extension not enabled (vote) 19 subgroupAllEqual(f4); // ERROR extension not enabled (vote) 20 21 gl_SubgroupEqMask; // ERROR extension not enabled (ballot) 22 gl_SubgroupGeMask; // ERROR extension not enabled (ballot) 23 gl_SubgroupGtMask; // ERROR extension not enabled (ballot) 24 gl_SubgroupLeMask; // ERROR extension not enabled (ballot) 25 gl_SubgroupLtMask; // ERROR extension not enabled (ballot) 26 subgroupBroadcast(f4, 0); // ERROR extension not enabled (ballot) 27 subgroupBroadcastFirst(f4); // ERROR extension not enabled (ballot) 28 uvec4 ballot = subgroupBallot(false); // ERROR extension not enabled (ballot) 29 subgroupInverseBallot(uvec4(0x1)); // ERROR extension not enabled (ballot) 30 subgroupBallotBitExtract(ballot, 0); // ERROR extension not enabled (ballot) 31 subgroupBallotBitCount(ballot); // ERROR extension not enabled (ballot) 32 subgroupBallotInclusiveBitCount(ballot); // ERROR extension not enabled (ballot) 33 subgroupBallotExclusiveBitCount(ballot); // ERROR extension not enabled (ballot) 34 subgroupBallotFindLSB(ballot); // ERROR extension not enabled (ballot) 35 subgroupBallotFindMSB(ballot); // ERROR extension not enabled (ballot) 36 37 subgroupShuffle(f4, 0); // ERROR extension not enabled (shuffle) 38 subgroupShuffleXor(f4, 0x1); // ERROR extension not enabled (shuffle) 39 subgroupShuffleUp(f4, 1); // ERROR extension not enabled (shuffle_relative) 40 subgroupShuffleDown(f4, 1); // ERROR extension not enabled (shuffle_relative) 41 42 result = subgroupAdd(f4); // ERROR, extension not enabled (arith) 43 subgroupMul(f4); // ERROR, extension not enabled (arith) 44 subgroupMin(f4); // ERROR, extension not enabled (arith) 45 subgroupMax(f4); // ERROR, extension not enabled (arith) 46 subgroupAnd(ballot); // ERROR, extension not enabled (arith) 47 subgroupOr(ballot); // ERROR, extension not enabled (arith) 48 subgroupXor(ballot); // ERROR, extension not enabled (arith) 49 subgroupInclusiveAdd(f4); // ERROR, extension not enabled (arith) 50 subgroupInclusiveMul(f4); // ERROR, extension not enabled (arith) 51 subgroupInclusiveMin(f4); // ERROR, extension not enabled (arith) 52 subgroupInclusiveMax(f4); // ERROR, extension not enabled (arith) 53 subgroupInclusiveAnd(ballot); // ERROR, extension not enabled (arith) 54 subgroupInclusiveOr(ballot); // ERROR, extension not enabled (arith) 55 subgroupInclusiveXor(ballot); // ERROR, extension not enabled (arith) 56 subgroupExclusiveAdd(f4); // ERROR, extension not enabled (arith) 57 subgroupExclusiveMul(f4); // ERROR, extension not enabled (arith) 58 subgroupExclusiveMin(f4); // ERROR, extension not enabled (arith) 59 subgroupExclusiveMax(f4); // ERROR, extension not enabled (arith) 60 subgroupExclusiveAnd(ballot); // ERROR, extension not enabled (arith) 61 subgroupExclusiveOr(ballot); // ERROR, extension not enabled (arith) 62 subgroupExclusiveXor(ballot); // ERROR, extension not enabled (arith) 63 64 subgroupClusteredAdd(f4, 2); // ERROR, extension not enabled (clustered) 65 subgroupClusteredMul(f4, 2); // ERROR, extension not enabled (clustered) 66 subgroupClusteredMin(f4, 2); // ERROR, extension not enabled (clustered) 67 subgroupClusteredMax(f4, 2); // ERROR, extension not enabled (clustered) 68 subgroupClusteredAnd(ballot, 2); // ERROR, extension not enabled (clustered) 69 subgroupClusteredOr(ballot, 2); // ERROR, extension not enabled (clustered) 70 subgroupClusteredXor(ballot, 2); // ERROR, extension not enabled (clustered) 71 72 subgroupQuadBroadcast(f4, 0); // ERROR, extension not enabled (quad) 73 subgroupQuadSwapHorizontal(f4); // ERROR, extension not enabled (quad) 74 subgroupQuadSwapVertical(f4); // ERROR, extension not enabled (quad) 75 subgroupQuadSwapDiagonal(f4); // ERROR, extension not enabled (quad) 76 77 uvec4 parti = subgroupPartitionNV(f4); // ERROR, extension not enabled (partitioned) 78 subgroupPartitionedAddNV(f4, parti); // ERROR, extension not enabled (partitioned) 79 subgroupPartitionedMulNV(f4, parti); // ERROR, extension not enabled (partitioned) 80 subgroupPartitionedMinNV(f4, parti); // ERROR, extension not enabled (partitioned) 81 subgroupPartitionedMaxNV(f4, parti); // ERROR, extension not enabled (partitioned) 82 subgroupPartitionedAndNV(ballot, parti); // ERROR, extension not enabled (partitioned) 83 subgroupPartitionedOrNV(ballot, parti); // ERROR, extension not enabled (partitioned) 84 subgroupPartitionedXorNV(ballot, parti); // ERROR, extension not enabled (partitioned) 85 subgroupPartitionedInclusiveAddNV(f4, parti); // ERROR, extension not enabled (partitioned) 86 subgroupPartitionedInclusiveMulNV(f4, parti); // ERROR, extension not enabled (partitioned) 87 subgroupPartitionedInclusiveMinNV(f4, parti); // ERROR, extension not enabled (partitioned) 88 subgroupPartitionedInclusiveMaxNV(f4, parti); // ERROR, extension not enabled (partitioned) 89 subgroupPartitionedInclusiveAndNV(ballot, parti); // ERROR, extension not enabled (partitioned) 90 subgroupPartitionedInclusiveOrNV(ballot, parti); // ERROR, extension not enabled (partitioned) 91 subgroupPartitionedInclusiveXorNV(ballot, parti); // ERROR, extension not enabled (partitioned) 92 subgroupPartitionedExclusiveAddNV(f4, parti); // ERROR, extension not enabled (partitioned) 93 subgroupPartitionedExclusiveMulNV(f4, parti); // ERROR, extension not enabled (partitioned) 94 subgroupPartitionedExclusiveMinNV(f4, parti); // ERROR, extension not enabled (partitioned) 95 subgroupPartitionedExclusiveMaxNV(f4, parti); // ERROR, extension not enabled (partitioned) 96 subgroupPartitionedExclusiveAndNV(ballot, parti); // ERROR, extension not enabled (partitioned) 97 subgroupPartitionedExclusiveOrNV(ballot, parti); // ERROR, extension not enabled (partitioned) 98 subgroupPartitionedExclusiveXorNV(ballot, parti); // ERROR, extension not enabled (partitioned) 99 100 return result; 101} 102 103#define MAX_VIEWS gl_MaxMeshViewCountNV 104 105#define BARRIER() \ 106 memoryBarrierShared(); \ 107 barrier(); 108 109#extension GL_NV_mesh_shader : enable 110 111layout(local_size_x = 32) in; 112 113// test use of shared memory in task shaders: 114layout(binding=0) writeonly uniform image2D uni_image; 115uniform block0 { 116 uint uni_value; 117}; 118shared vec4 mem[10]; 119 120// test use of task memory in task shaders: 121taskNV out Task { 122 vec2 dummy; 123 vec2 submesh[3]; 124 uint viewID; 125} mytask; 126 127void main() 128{ 129 uint iid = gl_LocalInvocationID.x; 130 uint gid = gl_WorkGroupID.x; 131 uint viewID = gl_MeshViewIndicesNV[gl_MeshViewCountNV%MAX_VIEWS]; 132 133 // 1. shared memory load and stores 134 for (uint i = 0; i < 10; ++i) { 135 mem[i] = vec4(i + uni_value); 136 } 137 imageStore(uni_image, ivec2(iid), mem[gid]); 138 imageStore(uni_image, ivec2(iid), mem[gid+1]); 139 140 BARRIER(); 141 142 // 2. task memory stores 143 144 mytask.dummy = vec2(30.0, 31.0); 145 mytask.submesh[0] = vec2(32.0, 33.0); 146 mytask.submesh[1] = vec2(34.0, 35.0); 147 mytask.submesh[2] = mytask.submesh[gid%2]; 148 mytask.viewID = viewID; 149 150 BARRIER(); 151 152 // 3. set task count 153 gl_TaskCountNV = 3; 154} 155 156#extension GL_KHR_shader_subgroup_basic: enable 157void basic_works (void) 158{ 159 gl_SubgroupSize; 160 gl_SubgroupInvocationID; 161 subgroupBarrier(); 162 subgroupMemoryBarrier(); 163 subgroupMemoryBarrierBuffer(); 164 subgroupMemoryBarrierImage(); 165 subgroupElect(); 166 gl_NumSubgroups; // allowed in task 167 gl_SubgroupID; // allowed in task 168 subgroupMemoryBarrierShared(); // allowed in task 169} 170 171#extension GL_KHR_shader_subgroup_ballot: enable 172void ballot_works(vec4 f4) { 173 gl_SubgroupEqMask; 174 gl_SubgroupGeMask; 175 gl_SubgroupGtMask; 176 gl_SubgroupLeMask; 177 gl_SubgroupLtMask; 178 subgroupBroadcast(f4, 0); 179 subgroupBroadcastFirst(f4); 180 uvec4 ballot = subgroupBallot(false); 181 subgroupInverseBallot(uvec4(0x1)); 182 subgroupBallotBitExtract(ballot, 0); 183 subgroupBallotBitCount(ballot); 184 subgroupBallotInclusiveBitCount(ballot); 185 subgroupBallotExclusiveBitCount(ballot); 186 subgroupBallotFindLSB(ballot); 187 subgroupBallotFindMSB(ballot); 188} 189 190#extension GL_KHR_shader_subgroup_vote: enable 191void vote_works(vec4 f4) 192{ 193 subgroupAll(true); 194 subgroupAny(false); 195 subgroupAllEqual(f4); 196} 197 198#extension GL_KHR_shader_subgroup_shuffle: enable 199#extension GL_KHR_shader_subgroup_shuffle_relative: enable 200void shuffle_works(vec4 f4) 201{ 202 subgroupShuffle(f4, 0); 203 subgroupShuffleXor(f4, 0x1); 204 subgroupShuffleUp(f4, 1); 205 subgroupShuffleDown(f4, 1); 206} 207 208#extension GL_KHR_shader_subgroup_arithmetic: enable 209void arith_works(vec4 f4) 210{ 211 uvec4 ballot; 212 subgroupAdd(f4); 213 subgroupMul(f4); 214 subgroupMin(f4); 215 subgroupMax(f4); 216 subgroupAnd(ballot); 217 subgroupOr(ballot); 218 subgroupXor(ballot); 219 subgroupInclusiveAdd(f4); 220 subgroupInclusiveMul(f4); 221 subgroupInclusiveMin(f4); 222 subgroupInclusiveMax(f4); 223 subgroupInclusiveAnd(ballot); 224 subgroupInclusiveOr(ballot); 225 subgroupInclusiveXor(ballot); 226 subgroupExclusiveAdd(f4); 227 subgroupExclusiveMul(f4); 228 subgroupExclusiveMin(f4); 229 subgroupExclusiveMax(f4); 230 subgroupExclusiveAnd(ballot); 231 subgroupExclusiveOr(ballot); 232 subgroupExclusiveXor(ballot); 233} 234 235#extension GL_KHR_shader_subgroup_clustered: enable 236void clustered_works(vec4 f4) 237{ 238 uvec4 ballot = uvec4(0x55,0,0,0); 239 subgroupClusteredAdd(f4, 2); 240 subgroupClusteredMul(f4, 2); 241 subgroupClusteredMin(f4, 2); 242 subgroupClusteredMax(f4, 2); 243 subgroupClusteredAnd(ballot, 2); 244 subgroupClusteredOr(ballot, 2); 245 subgroupClusteredXor(ballot, 2); 246} 247 248#extension GL_KHR_shader_subgroup_quad: enable 249void quad_works(vec4 f4) 250{ 251 subgroupQuadBroadcast(f4, 0); 252 subgroupQuadSwapHorizontal(f4); 253 subgroupQuadSwapVertical(f4); 254 subgroupQuadSwapDiagonal(f4); 255} 256 257#extension GL_NV_shader_subgroup_partitioned: enable 258void partitioned_works(vec4 f4) 259{ 260 uvec4 parti = subgroupPartitionNV(f4); 261 uvec4 ballot = uvec4(0x55,0,0,0); 262 subgroupPartitionedAddNV(f4, parti); 263 subgroupPartitionedMulNV(f4, parti); 264 subgroupPartitionedMinNV(f4, parti); 265 subgroupPartitionedMaxNV(f4, parti); 266 subgroupPartitionedAndNV(ballot, parti); 267 subgroupPartitionedOrNV(ballot, parti); 268 subgroupPartitionedXorNV(ballot, parti); 269 subgroupPartitionedInclusiveAddNV(f4, parti); 270 subgroupPartitionedInclusiveMulNV(f4, parti); 271 subgroupPartitionedInclusiveMinNV(f4, parti); 272 subgroupPartitionedInclusiveMaxNV(f4, parti); 273 subgroupPartitionedInclusiveAndNV(ballot, parti); 274 subgroupPartitionedInclusiveOrNV(ballot, parti); 275 subgroupPartitionedInclusiveXorNV(ballot, parti); 276 subgroupPartitionedExclusiveAddNV(f4, parti); 277 subgroupPartitionedExclusiveMulNV(f4, parti); 278 subgroupPartitionedExclusiveMinNV(f4, parti); 279 subgroupPartitionedExclusiveMaxNV(f4, parti); 280 subgroupPartitionedExclusiveAndNV(ballot, parti); 281 subgroupPartitionedExclusiveOrNV(ballot, parti); 282 subgroupPartitionedExclusiveXorNV(ballot, parti); 283} 284 285// tests for NV_shader_sm_builtins 286void sm_builtins_err() 287{ 288 gl_WarpsPerSMNV; // ERROR, no extension 289 gl_SMCountNV; // ERROR, no extension 290 gl_WarpIDNV; // ERROR, no extension 291 gl_SMIDNV; // ERROR, no extension 292} 293 294#ifdef GL_NV_shader_sm_builtins 295#extension GL_NV_shader_sm_builtins : enable 296#endif 297 298void sm_builtins() 299{ 300 gl_WarpsPerSMNV; 301 gl_SMCountNV; 302 gl_WarpIDNV; 303 gl_SMIDNV; 304} 305