1#version 460 2#extension GL_NV_ray_tracing : enable 3 4vec4 undeclared_errors(vec4 f4) 5{ 6 vec4 result; 7 gl_SubgroupSize; // ERROR, extension not enabled (basic) 8 gl_SubgroupInvocationID; // ERROR, extension not enabled (basic) 9 subgroupBarrier(); // ERROR, extension not enabled (basic) 10 subgroupMemoryBarrier(); // ERROR, extension not enabled (basic) 11 subgroupMemoryBarrierBuffer(); // ERROR, extension not enabled (basic) 12 subgroupMemoryBarrierImage(); // ERROR, extension not enabled (basic) 13 subgroupElect(); // ERROR, extension not enabled (basic) 14 gl_NumSubgroups; // ERROR, only defined in compute 15 gl_SubgroupID; // ERROR, only defined in compute 16 subgroupMemoryBarrierShared(); // ERROR, only defined in compute 17 18 subgroupAll(true); // ERROR extension not enabled (vote) 19 subgroupAny(false); // ERROR extension not enabled (vote) 20 subgroupAllEqual(f4); // ERROR extension not enabled (vote) 21 22 gl_SubgroupEqMask; // ERROR extension not enabled (ballot) 23 gl_SubgroupGeMask; // ERROR extension not enabled (ballot) 24 gl_SubgroupGtMask; // ERROR extension not enabled (ballot) 25 gl_SubgroupLeMask; // ERROR extension not enabled (ballot) 26 gl_SubgroupLtMask; // ERROR extension not enabled (ballot) 27 subgroupBroadcast(f4, 0); // ERROR extension not enabled (ballot) 28 subgroupBroadcastFirst(f4); // ERROR extension not enabled (ballot) 29 uvec4 ballot = subgroupBallot(false); // ERROR extension not enabled (ballot) 30 subgroupInverseBallot(uvec4(0x1)); // ERROR extension not enabled (ballot) 31 subgroupBallotBitExtract(ballot, 0); // ERROR extension not enabled (ballot) 32 subgroupBallotBitCount(ballot); // ERROR extension not enabled (ballot) 33 subgroupBallotInclusiveBitCount(ballot); // ERROR extension not enabled (ballot) 34 subgroupBallotExclusiveBitCount(ballot); // ERROR extension not enabled (ballot) 35 subgroupBallotFindLSB(ballot); // ERROR extension not enabled (ballot) 36 subgroupBallotFindMSB(ballot); // ERROR extension not enabled (ballot) 37 38 subgroupShuffle(f4, 0); // ERROR extension not enabled (shuffle) 39 subgroupShuffleXor(f4, 0x1); // ERROR extension not enabled (shuffle) 40 subgroupShuffleUp(f4, 1); // ERROR extension not enabled (shuffle_relative) 41 subgroupShuffleDown(f4, 1); // ERROR extension not enabled (shuffle_relative) 42 43 result = subgroupAdd(f4); // ERROR, extension not enabled (arith) 44 subgroupMul(f4); // ERROR, extension not enabled (arith) 45 subgroupMin(f4); // ERROR, extension not enabled (arith) 46 subgroupMax(f4); // ERROR, extension not enabled (arith) 47 subgroupAnd(ballot); // ERROR, extension not enabled (arith) 48 subgroupOr(ballot); // ERROR, extension not enabled (arith) 49 subgroupXor(ballot); // ERROR, extension not enabled (arith) 50 subgroupInclusiveAdd(f4); // ERROR, extension not enabled (arith) 51 subgroupInclusiveMul(f4); // ERROR, extension not enabled (arith) 52 subgroupInclusiveMin(f4); // ERROR, extension not enabled (arith) 53 subgroupInclusiveMax(f4); // ERROR, extension not enabled (arith) 54 subgroupInclusiveAnd(ballot); // ERROR, extension not enabled (arith) 55 subgroupInclusiveOr(ballot); // ERROR, extension not enabled (arith) 56 subgroupInclusiveXor(ballot); // ERROR, extension not enabled (arith) 57 subgroupExclusiveAdd(f4); // ERROR, extension not enabled (arith) 58 subgroupExclusiveMul(f4); // ERROR, extension not enabled (arith) 59 subgroupExclusiveMin(f4); // ERROR, extension not enabled (arith) 60 subgroupExclusiveMax(f4); // ERROR, extension not enabled (arith) 61 subgroupExclusiveAnd(ballot); // ERROR, extension not enabled (arith) 62 subgroupExclusiveOr(ballot); // ERROR, extension not enabled (arith) 63 subgroupExclusiveXor(ballot); // ERROR, extension not enabled (arith) 64 65 subgroupClusteredAdd(f4, 2); // ERROR, extension not enabled (clustered) 66 subgroupClusteredMul(f4, 2); // ERROR, extension not enabled (clustered) 67 subgroupClusteredMin(f4, 2); // ERROR, extension not enabled (clustered) 68 subgroupClusteredMax(f4, 2); // ERROR, extension not enabled (clustered) 69 subgroupClusteredAnd(ballot, 2); // ERROR, extension not enabled (clustered) 70 subgroupClusteredOr(ballot, 2); // ERROR, extension not enabled (clustered) 71 subgroupClusteredXor(ballot, 2); // ERROR, extension not enabled (clustered) 72 73 subgroupQuadBroadcast(f4, 0); // ERROR, extension not enabled (quad) 74 subgroupQuadSwapHorizontal(f4); // ERROR, extension not enabled (quad) 75 subgroupQuadSwapVertical(f4); // ERROR, extension not enabled (quad) 76 subgroupQuadSwapDiagonal(f4); // ERROR, extension not enabled (quad) 77 78 uvec4 parti = subgroupPartitionNV(f4); // ERROR, extension not enabled (partitioned) 79 subgroupPartitionedAddNV(f4, parti); // ERROR, extension not enabled (partitioned) 80 subgroupPartitionedMulNV(f4, parti); // ERROR, extension not enabled (partitioned) 81 subgroupPartitionedMinNV(f4, parti); // ERROR, extension not enabled (partitioned) 82 subgroupPartitionedMaxNV(f4, parti); // ERROR, extension not enabled (partitioned) 83 subgroupPartitionedAndNV(ballot, parti); // ERROR, extension not enabled (partitioned) 84 subgroupPartitionedOrNV(ballot, parti); // ERROR, extension not enabled (partitioned) 85 subgroupPartitionedXorNV(ballot, parti); // ERROR, extension not enabled (partitioned) 86 subgroupPartitionedInclusiveAddNV(f4, parti); // ERROR, extension not enabled (partitioned) 87 subgroupPartitionedInclusiveMulNV(f4, parti); // ERROR, extension not enabled (partitioned) 88 subgroupPartitionedInclusiveMinNV(f4, parti); // ERROR, extension not enabled (partitioned) 89 subgroupPartitionedInclusiveMaxNV(f4, parti); // ERROR, extension not enabled (partitioned) 90 subgroupPartitionedInclusiveAndNV(ballot, parti); // ERROR, extension not enabled (partitioned) 91 subgroupPartitionedInclusiveOrNV(ballot, parti); // ERROR, extension not enabled (partitioned) 92 subgroupPartitionedInclusiveXorNV(ballot, parti); // ERROR, extension not enabled (partitioned) 93 subgroupPartitionedExclusiveAddNV(f4, parti); // ERROR, extension not enabled (partitioned) 94 subgroupPartitionedExclusiveMulNV(f4, parti); // ERROR, extension not enabled (partitioned) 95 subgroupPartitionedExclusiveMinNV(f4, parti); // ERROR, extension not enabled (partitioned) 96 subgroupPartitionedExclusiveMaxNV(f4, parti); // ERROR, extension not enabled (partitioned) 97 subgroupPartitionedExclusiveAndNV(ballot, parti); // ERROR, extension not enabled (partitioned) 98 subgroupPartitionedExclusiveOrNV(ballot, parti); // ERROR, extension not enabled (partitioned) 99 subgroupPartitionedExclusiveXorNV(ballot, parti); // ERROR, extension not enabled (partitioned) 100 101 return result; 102} 103 104 105layout(location = 1) rayPayloadInNV vec4 incomingPayload; 106void main() 107{ 108 uvec3 v0 = gl_LaunchIDNV; 109 uvec3 v1 = gl_LaunchSizeNV; 110 int v2 = gl_PrimitiveID; 111 int v3 = gl_InstanceID; 112 int v4 = gl_InstanceCustomIndexNV; 113 vec3 v5 = gl_WorldRayOriginNV; 114 vec3 v6 = gl_WorldRayDirectionNV; 115 vec3 v7 = gl_ObjectRayOriginNV; 116 vec3 v8 = gl_ObjectRayDirectionNV; 117 float v9 = gl_RayTminNV; 118 float v10 = gl_RayTmaxNV; 119 float v11 = gl_HitTNV; 120 uint v12 = gl_HitKindNV; 121 mat4x3 v13 = gl_ObjectToWorldNV; 122 mat4x3 v14 = gl_WorldToObjectNV; 123 incomingPayload = vec4(0.5f); 124 if (v2 == 1) 125 ignoreIntersectionNV(); 126 else 127 terminateRayNV(); 128} 129 130#extension GL_KHR_shader_subgroup_basic: enable 131void basic_works (void) 132{ 133 gl_SubgroupSize; 134 gl_SubgroupInvocationID; 135 subgroupBarrier(); 136 subgroupMemoryBarrier(); 137 subgroupMemoryBarrierBuffer(); 138 subgroupMemoryBarrierImage(); 139 subgroupElect(); 140} 141 142#extension GL_KHR_shader_subgroup_ballot: enable 143void ballot_works(vec4 f4) { 144 gl_SubgroupEqMask; 145 gl_SubgroupGeMask; 146 gl_SubgroupGtMask; 147 gl_SubgroupLeMask; 148 gl_SubgroupLtMask; 149 subgroupBroadcast(f4, 0); 150 subgroupBroadcastFirst(f4); 151 uvec4 ballot = subgroupBallot(false); 152 subgroupInverseBallot(uvec4(0x1)); 153 subgroupBallotBitExtract(ballot, 0); 154 subgroupBallotBitCount(ballot); 155 subgroupBallotInclusiveBitCount(ballot); 156 subgroupBallotExclusiveBitCount(ballot); 157 subgroupBallotFindLSB(ballot); 158 subgroupBallotFindMSB(ballot); 159} 160 161#extension GL_KHR_shader_subgroup_vote: enable 162void vote_works(vec4 f4) 163{ 164 subgroupAll(true); 165 subgroupAny(false); 166 subgroupAllEqual(f4); 167} 168 169#extension GL_KHR_shader_subgroup_shuffle: enable 170#extension GL_KHR_shader_subgroup_shuffle_relative: enable 171void shuffle_works(vec4 f4) 172{ 173 subgroupShuffle(f4, 0); 174 subgroupShuffleXor(f4, 0x1); 175 subgroupShuffleUp(f4, 1); 176 subgroupShuffleDown(f4, 1); 177} 178 179#extension GL_KHR_shader_subgroup_arithmetic: enable 180void arith_works(vec4 f4) 181{ 182 uvec4 ballot; 183 subgroupAdd(f4); 184 subgroupMul(f4); 185 subgroupMin(f4); 186 subgroupMax(f4); 187 subgroupAnd(ballot); 188 subgroupOr(ballot); 189 subgroupXor(ballot); 190 subgroupInclusiveAdd(f4); 191 subgroupInclusiveMul(f4); 192 subgroupInclusiveMin(f4); 193 subgroupInclusiveMax(f4); 194 subgroupInclusiveAnd(ballot); 195 subgroupInclusiveOr(ballot); 196 subgroupInclusiveXor(ballot); 197 subgroupExclusiveAdd(f4); 198 subgroupExclusiveMul(f4); 199 subgroupExclusiveMin(f4); 200 subgroupExclusiveMax(f4); 201 subgroupExclusiveAnd(ballot); 202 subgroupExclusiveOr(ballot); 203 subgroupExclusiveXor(ballot); 204} 205 206#extension GL_KHR_shader_subgroup_clustered: enable 207void clustered_works(vec4 f4) 208{ 209 uvec4 ballot = uvec4(0x55,0,0,0); 210 subgroupClusteredAdd(f4, 2); 211 subgroupClusteredMul(f4, 2); 212 subgroupClusteredMin(f4, 2); 213 subgroupClusteredMax(f4, 2); 214 subgroupClusteredAnd(ballot, 2); 215 subgroupClusteredOr(ballot, 2); 216 subgroupClusteredXor(ballot, 2); 217} 218 219#extension GL_KHR_shader_subgroup_quad: enable 220void quad_works(vec4 f4) 221{ 222 subgroupQuadBroadcast(f4, 0); 223 subgroupQuadSwapHorizontal(f4); 224 subgroupQuadSwapVertical(f4); 225 subgroupQuadSwapDiagonal(f4); 226} 227 228#extension GL_NV_shader_subgroup_partitioned: enable 229void partitioned_works(vec4 f4) 230{ 231 uvec4 parti = subgroupPartitionNV(f4); 232 uvec4 ballot = uvec4(0x55,0,0,0); 233 subgroupPartitionedAddNV(f4, parti); 234 subgroupPartitionedMulNV(f4, parti); 235 subgroupPartitionedMinNV(f4, parti); 236 subgroupPartitionedMaxNV(f4, parti); 237 subgroupPartitionedAndNV(ballot, parti); 238 subgroupPartitionedOrNV(ballot, parti); 239 subgroupPartitionedXorNV(ballot, parti); 240 subgroupPartitionedInclusiveAddNV(f4, parti); 241 subgroupPartitionedInclusiveMulNV(f4, parti); 242 subgroupPartitionedInclusiveMinNV(f4, parti); 243 subgroupPartitionedInclusiveMaxNV(f4, parti); 244 subgroupPartitionedInclusiveAndNV(ballot, parti); 245 subgroupPartitionedInclusiveOrNV(ballot, parti); 246 subgroupPartitionedInclusiveXorNV(ballot, parti); 247 subgroupPartitionedExclusiveAddNV(f4, parti); 248 subgroupPartitionedExclusiveMulNV(f4, parti); 249 subgroupPartitionedExclusiveMinNV(f4, parti); 250 subgroupPartitionedExclusiveMaxNV(f4, parti); 251 subgroupPartitionedExclusiveAndNV(ballot, parti); 252 subgroupPartitionedExclusiveOrNV(ballot, parti); 253 subgroupPartitionedExclusiveXorNV(ballot, parti); 254} 255 256// tests for NV_shader_sm_builtins 257void sm_builtins_err() 258{ 259 gl_WarpsPerSMNV; // ERROR, no extension 260 gl_SMCountNV; // ERROR, no extension 261 gl_WarpIDNV; // ERROR, no extension 262 gl_SMIDNV; // ERROR, no extension 263} 264 265#ifdef GL_NV_shader_sm_builtins 266#extension GL_NV_shader_sm_builtins : enable 267#endif 268 269void sm_builtins() 270{ 271 gl_WarpsPerSMNV; 272 gl_SMCountNV; 273 gl_WarpIDNV; 274 gl_SMIDNV; 275} 276