yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
ad379b7c5
master
1//TEST:SIMPLE(filecheck=CHECK_GLSL): -allow-glsl -stage raygeneration -entry main -target glsl 2//TEST:SIMPLE(filecheck=CHECK_SPV): -allow-glsl -emit-spirv-directly -stage raygeneration -entry main -target spirv-assembly 3 4layout(binding = 0) uniform accelerationStructureEXT as; 5 6//TEST_INPUT:ubuffer(data=[0], stride=4):out,name=outputBuffer 7buffer MyBlockName 8{ 9 uint data[]; 10} outputBuffer; 11 12// CHECK_GLSL-DAG: rayPayloadEXT 13// CHECK_SPV-DAG: RayPayload{{NV|KHR}} 14layout(location = 2) rayPayloadEXT vec4 payload; 15// CHECK_GLSL-DAG: hitObjectAttributeNV 16// CHECK_SPV-DAG: HitObjectAttributeNV 17layout(location = 2) hitObjectAttributeNV vec4 attrMain; 18// CHECK_GLSL-DAG: callableDataEXT 19// CHECK_SPV-DAG: CallableData{{NV|KHR}} 20layout(location = 0) callableDataEXT vec4 outcall; 21 22__generic<T : __BuiltinFloatingPointType, let N : int, let M : int> 23bool equals(matrix<T, N, M> lhs, matrix<T, N, M> rhs) 24{ 25 for (int i = 0; i < N; i++) 26 { 27 for (int j = 0; j < M; j++) 28 { 29 if ( 30 lhs[i][j] 31 != 32 rhs[i][j] 33 ) 34 { 35 return false; 36 } 37 } 38 } 39 return true; 40} 41 42bool testHitObjectTraceRay() { 43 hitObjectNV hit; 44// CHECK_GLSL-DAG: hitObjectTraceRayNV 45// CHECK_SPV-DAG: OpHitObjectTraceRayNV 46 hitObjectTraceRayNV(hit, as, gl_RayFlagsNoneEXT, 0xff, 0, 0, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 2); 47 return true 48// CHECK_GLSL-DAG: hitObjectIsHitNV 49// CHECK_SPV-DAG: OpHitObjectIsHitNV 50 && hitObjectIsHitNV(hit) == true 51 ; 52} 53 54bool testHitObjectTraceRayWithAuxInfo() { 55 hitObjectNV hit; 56// CHECK_GLSL-DAG: hitObjectTraceRayNV 57// CHECK_SPV-DAG: OpHitObjectTraceRayNV 58 hitObjectTraceRayNV(hit, as, gl_RayFlagsNoneEXT, 0xff, 0, 0, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 2); 59// CHECK_GLSL-DAG: hitObjectGetAttributesNV 60// CHECK_SPV-DAG: OpHitObjectGetAttributesNV 61 hitObjectGetAttributesNV(hit, 2); 62 vec4 testCopy = attrMain; 63 64// CHECK_GLSL-DAG: reorderThreadNV 65// CHECK_SPV-DAG: OpReorderThreadWithHintNV 66 reorderThreadNV(0, 3); 67// CHECK_GLSL-DAG: reorderThreadNV 68// CHECK_SPV-DAG: OpReorderThreadWithHitObjectNV 69 reorderThreadNV(hit); 70// CHECK_GLSL-DAG: reorderThreadNV 71// CHECK_SPV-DAG: OpReorderThreadWithHitObjectNV 72 reorderThreadNV(hit, 0, 3); 73 74 return true 75// CHECK_GLSL-DAG: hitObjectGetShaderBindingTableRecordIndexNV 76// CHECK_SPV-DAG: OpHitObjectGetShaderBindingTableRecordIndexNV 77 && hitObjectGetShaderBindingTableRecordIndexNV(hit) == 0 78// CHECK_GLSL-DAG: hitObjectGetShaderRecordBufferHandleNV 79// CHECK_SPV-DAG: OpHitObjectGetShaderRecordBufferHandleNV 80 && hitObjectGetShaderRecordBufferHandleNV(hit) != uvec2(0) // valid Handles are never 0, but not predictable either 81 && testCopy == vec4(1) 82// CHECK_GLSL-DAG: hitObjectIsHitNV 83// CHECK_SPV-DAG: OpHitObjectIsHitNV 84 && hitObjectIsHitNV(hit) == true 85// CHECK_GLSL-DAG: hitObjectGetRayTMinNV 86// CHECK_SPV-DAG: OpHitObjectGetRayTMinNV 87 && hitObjectGetRayTMinNV(hit) == 0.01f 88// CHECK_GLSL-DAG: hitObjectGetRayTMaxNV 89// CHECK_SPV-DAG: OpHitObjectGetRayTMaxNV 90 && hitObjectGetRayTMaxNV(hit) == 1e4f 91// CHECK_GLSL-DAG: hitObjectGetObjectRayOriginNV 92// CHECK_SPV-DAG: OpHitObjectGetObjectRayOriginNV 93 && hitObjectGetObjectRayOriginNV(hit) == vec3(0.1, 0.1, 0.0) 94// CHECK_GLSL-DAG: hitObjectGetObjectRayDirectionNV 95// CHECK_SPV-DAG: OpHitObjectGetObjectRayDirectionNV 96 && hitObjectGetObjectRayDirectionNV(hit) == vec3(0, 0, 1) 97// CHECK_GLSL-DAG: hitObjectGetWorldRayOriginNV 98// CHECK_SPV-DAG: OpHitObjectGetWorldRayOriginNV 99 && hitObjectGetWorldRayOriginNV(hit) == vec3(0.1, 0.1, 0.0) 100// CHECK_GLSL-DAG: hitObjectGetWorldRayDirectionNV 101// CHECK_SPV-DAG: OpHitObjectGetWorldRayDirectionNV 102 && hitObjectGetWorldRayDirectionNV(hit) == vec3(0, 0, 1) 103// CHECK_GLSL-DAG: hitObjectGetObjectToWorldNV 104// CHECK_SPV-DAG: OpHitObjectGetObjectToWorldNV 105 && !equals(hitObjectGetObjectToWorldNV(hit), mat4x3(0)) 106// CHECK_GLSL-DAG: hitObjectGetWorldToObjectNV 107// CHECK_SPV-DAG: OpHitObjectGetWorldToObjectNV 108 && !equals(hitObjectGetWorldToObjectNV(hit), mat4x3(0)) 109// CHECK_GLSL-DAG: hitObjectGetInstanceCustomIndexNV 110// CHECK_SPV-DAG: OpHitObjectGetInstanceCustomIndexNV 111 && hitObjectGetInstanceCustomIndexNV(hit) == 0 112// CHECK_GLSL-DAG: hitObjectGetInstanceIdNV 113// CHECK_SPV-DAG: OpHitObjectGetInstanceIdNV 114 && hitObjectGetInstanceIdNV(hit) == 0 115// CHECK_GLSL-DAG: hitObjectGetGeometryIndexNV 116// CHECK_SPV-DAG: OpHitObjectGetGeometryIndexNV 117 && hitObjectGetGeometryIndexNV(hit) == 0 118// CHECK_GLSL-DAG: hitObjectGetPrimitiveIndexNV 119// CHECK_SPV-DAG: OpHitObjectGetPrimitiveIndexNV 120 && hitObjectGetPrimitiveIndexNV(hit) == 0 121// CHECK_GLSL-DAG: hitObjectGetHitKindNV 122// CHECK_SPV-DAG: OpHitObjectGetHitKindNV 123 && hitObjectGetHitKindNV(hit) == gl_HitKindFrontFacingTriangleEXT 124 ; 125} 126 127bool testHitObjectTraceRayLaunchSubShaders() { 128 hitObjectNV hit; 129// CHECK_GLSL-DAG: hitObjectTraceRayNV 130// CHECK_SPV-DAG: OpHitObjectTraceRayNV 131 hitObjectTraceRayNV(hit, as, gl_RayFlagsNoneEXT, 0xff, 0, 0, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 2); 132// CHECK_GLSL-DAG: hitObjectExecuteShaderNV 133// CHECK_SPV-DAG: OpHitObjectExecuteShaderNV 134 hitObjectExecuteShaderNV(hit, 2); 135 return true 136// CHECK_GLSL-DAG: hitObjectIsHitNV 137// CHECK_SPV-DAG: OpHitObjectIsHitNV 138 && hitObjectIsHitNV(hit) == true 139 ; 140} 141 142bool testHitObjectTraceRayMotion() { 143 hitObjectNV hit; 144// CHECK_GLSL-DAG: hitObjectTraceRayMotionNV 145// CHECK_SPV-DAG: OpHitObjectTraceRayMotionNV 146 hitObjectTraceRayMotionNV(hit, as, gl_RayFlagsNoneEXT, 0xff, 0, 0, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 0.0f, 2); 147 return true 148// CHECK_GLSL-DAG: hitObjectIsHitNV 149// CHECK_SPV-DAG: OpHitObjectIsHitNV 150 && hitObjectIsHitNV(hit) == true 151// CHECK_GLSL-DAG: hitObjectGetCurrentTimeNV 152// CHECK_SPV-DAG: OpHitObjectGetCurrentTimeNV 153 && hitObjectGetCurrentTimeNV(hit) == 0.0f 154 ; 155} 156 157bool testTraceRayFunctions() { 158// CHECK_GLSL-DAG: traceRayEXT 159// CHECK_SPV-DAG: OpTraceRayKHR 160 traceRayEXT(as, 0, 0, 0, 0, 0, vec3(0), 0, vec3(0), 0, 2); 161 return true 162 ; 163} 164 165bool testTraceRayCalls() { 166 return true 167 && testHitObjectTraceRay() 168 && testHitObjectTraceRayWithAuxInfo() 169 && testHitObjectTraceRayLaunchSubShaders() 170 && testHitObjectTraceRayMotion() 171 && testTraceRayFunctions() 172 ; 173} 174 175bool testHitObjectRecord() { 176 hitObjectNV hit; 177// CHECK_GLSL-DAG: hitObjectRecordHitNV 178// CHECK_SPV-DAG: OpHitObjectRecordHitNV 179 hitObjectRecordHitNV(hit, as, 0, 0, 0, gl_HitKindFrontFacingTriangleEXT, 0, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 2); 180 return true 181// CHECK_GLSL-DAG: hitObjectIsHitNV 182// CHECK_SPV-DAG: OpHitObjectIsHitNV 183 && hitObjectIsHitNV(hit) == true 184 ; 185} 186 187bool testHitObjectRecordIndex() { 188 hitObjectNV hit; 189// CHECK_GLSL-DAG: hitObjectRecordHitWithIndexNV 190// CHECK_SPV-DAG: OpHitObjectRecordHitWithIndexNV 191 hitObjectRecordHitWithIndexNV(hit, as, 0, 0, 0, gl_HitKindFrontFacingTriangleEXT, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 2); 192 return true 193// CHECK_GLSL-DAG: hitObjectIsHitNV 194// CHECK_SPV-DAG: OpHitObjectIsHitNV 195 && hitObjectIsHitNV(hit) == true 196 ; 197} 198 199bool testHitObjectRecordMotion() { 200 hitObjectNV hit; 201// CHECK_GLSL-DAG: hitObjectRecordHitMotionNV 202// CHECK_SPV-DAG: OpHitObjectRecordHitMotionNV 203 hitObjectRecordHitMotionNV(hit, as, 0, 0, 0, gl_HitKindFrontFacingTriangleEXT, 0, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 0.0f, 2); 204 return true 205// CHECK_GLSL-DAG: hitObjectIsHitNV 206// CHECK_SPV-DAG: OpHitObjectIsHitNV 207 && hitObjectIsHitNV(hit) == true 208 ; 209} 210 211bool testHitObjectRecordIndexMotion() { 212 hitObjectNV hit; 213// CHECK_GLSL-DAG: hitObjectRecordHitWithIndexMotionNV 214// CHECK_SPV-DAG: OpHitObjectRecordHitWithIndexMotionNV 215 hitObjectRecordHitWithIndexMotionNV(hit, as, 0, 0, 0, gl_HitKindFrontFacingTriangleEXT, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 0.0f, 2); 216 return true 217// CHECK_GLSL-DAG: hitObjectIsHitNV 218// CHECK_SPV-DAG: OpHitObjectIsHitNV 219 && hitObjectIsHitNV(hit) == true 220 ; 221} 222 223bool testRecordHitCalls() { 224 return true 225 && testHitObjectRecord() 226 && testHitObjectRecordIndex() 227 && testHitObjectRecordMotion() 228 && testHitObjectRecordIndexMotion() 229 ; 230} 231 232bool testHitObjectRecordMiss() { 233 hitObjectNV hit; 234// CHECK_GLSL-DAG: hitObjectRecordMissNV 235// CHECK_SPV-DAG: OpHitObjectRecordMissNV 236 hitObjectRecordMissNV(hit, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f); 237 return true 238// CHECK_GLSL-DAG: hitObjectIsMissNV 239// CHECK_SPV-DAG: OpHitObjectIsMissNV 240 && hitObjectIsMissNV(hit) == true 241 ; 242} 243 244bool testHitObjectRecordMissMotion() { 245 hitObjectNV hit; 246// CHECK_GLSL-DAG: hitObjectRecordMissMotionNV 247// CHECK_SPV-DAG: OpHitObjectRecordMissMotionNV 248 hitObjectRecordMissMotionNV(hit, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 0.0f); 249 return true 250// CHECK_GLSL-DAG: hitObjectIsMissNV 251// CHECK_SPV-DAG: OpHitObjectIsMissNV 252 && hitObjectIsMissNV(hit) == true 253 ; 254} 255 256bool testRecordMissCalls() { 257 return true 258 && testHitObjectRecordMiss() 259 && testHitObjectRecordMissMotion() 260 ; 261} 262 263bool testHitObjectRecordEmpty() { 264 hitObjectNV hit; 265// CHECK_GLSL-DAG: hitObjectRecordEmptyNV 266// CHECK_SPV-DAG: OpHitObjectRecordEmptyNV 267 hitObjectRecordEmptyNV(hit); 268 return true 269// CHECK_GLSL-DAG: hitObjectIsEmptyNV 270// CHECK_SPV-DAG: OpHitObjectIsEmptyNV 271 && hitObjectIsEmptyNV(hit) == true 272 ; 273} 274 275bool testRecordEmptyCalls() { 276 return true 277 && testHitObjectRecordEmpty() 278 ; 279} 280 281bool testTraceRayMotion() { 282// CHECK_GLSL-DAG: traceRayMotionNV 283// CHECK_SPV-DAG: OpTraceRayMotionNV 284 traceRayMotionNV(as, gl_RayFlagsNoneEXT, 0xff, 0, 0, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 0.0f, 2); 285 attrMain = vec4(1); //ensure traceRayMotionNV does not get optimized out 286 return true && 287 attrMain == vec4(1) 288 ; 289} 290 291bool testPayloadReadWrite() { 292 payload = vec4(2); 293 vec4 read = payload; 294 return true 295 && read != vec4(0) 296 ; 297} 298 299bool testAttributeReadWrite() { 300 attrMain = vec4(2); 301 vec4 read = attrMain; 302 return true 303 && read != vec4(0) 304 ; 305} 306 307bool testCallableReadWrite() { 308 outcall = vec4(2); 309 vec4 read = outcall; 310 return true 311 && read != vec4(0) 312 ; 313} 314 315bool testReadWriteOfObjects(){ 316 return true 317 && testPayloadReadWrite() 318 && testAttributeReadWrite() 319 && testCallableReadWrite(); 320 ; 321} 322 323void main() 324{ 325 outputBuffer.data[0] = true 326 && testTraceRayCalls() 327 && testRecordHitCalls() 328 && testRecordMissCalls() 329 && testRecordEmptyCalls() 330 && testTraceRayMotion() 331 && testReadWriteOfObjects() 332 ; 333 //BUF: 1 334}