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=SPIRV):-target spirv-assembly -entry main -stage closesthit -emit-spirv-via-glsl 2//TEST:SIMPLE(filecheck=SPIRV):-target spirv -entry main -stage closesthit 3// Motion rays not supported on HLSL impl currently, so disable with NOMOTION define: 4//TEST:SIMPLE(filecheck=DXIL):-target dxil-assembly -entry main -stage closesthit -profile sm_6_5 -DNOMOTION 5 6// SPIRV-NOT: OpCapability RayQueryKHR 7// SPIRV-DAG: RayTracingKHR 8// SPIRV-DAG: RayTracingMotionBlurNV 9// SPIRV-DAG: SPV_KHR_ray_tracing 10// SPIRV-DAG: SPV_NV_ray_tracing_motion_blur 11 12// SPIRV: OpEntryPoint 13 14// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn LaunchId{{NV|KHR}} 15// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn LaunchSize{{NV|KHR}} 16// SPIRV-DAG: OpDecorate %{{.*}} Binding 0 17// SPIRV-DAG: OpDecorate %{{.*}} DescriptorSet 0 18// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn WorldRayOrigin{{NV|KHR}} 19// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn WorldRayDirection{{NV|KHR}} 20// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn RayTmin{{NV|KHR}} 21// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn RayTmax{{NV|KHR}} 22// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn IncomingRayFlags{{NV|KHR}} 23// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn InstanceId 24// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn InstanceCustomIndex{{NV|KHR}} 25// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn RayGeometryIndexKHR 26// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn PrimitiveId 27// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn ObjectRayOrigin{{NV|KHR}} 28// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn ObjectRayDirection{{NV|KHR}} 29// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn ObjectToWorld{{NV|KHR}} 30// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn WorldToObject{{NV|KHR}} 31// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn HitKind{{NV|KHR}} 32 33// SPIRV-DAG: OpTypePointer IncomingRayPayload{{NV|KHR}} 34// SPIRV-DAG: OpTypePointer RayPayload{{NV|KHR}} 35// SPIRV-DAG: OpTypeAccelerationStructureKHR 36// SPIRV-DAG: OpTypePointer HitAttribute{{NV|KHR}} 37// SPIRV-DAG: OpTypePointer CallableData{{NV|KHR}} 38 39// SPIRV: OpTraceRayKHR 40// SPIRV: OpTraceRayMotionNV 41// SPIRV: OpExecuteCallableKHR 42 43// DXIL: main 44 45// DXIL: call i32 @dx.op.dispatchRaysIndex.i32 46// DXIL: call i32 @dx.op.dispatchRaysDimensions.i32 47// DXIL: call void @dx.op.traceRay.struct.RayPayload_0 48 49// DXIL: call float @dx.op.worldRayOrigin.f32 50// DXIL: call float @dx.op.worldRayDirection.f32 51// DXIL: call float @dx.op.rayTMin.f32 52// DXIL: call float @dx.op.rayTCurrent.f32 53// DXIL: call i32 @dx.op.rayFlags.i32 54 55// DXIL: call i32 @dx.op.instanceIndex.i32 56// DXIL: call i32 @dx.op.instanceID.i32 57// DXIL: call i32 @dx.op.geometryIndex.i32 58// DXIL: call i32 @dx.op.primitiveIndex.i32 59// DXIL: call float @dx.op.objectRayOrigin.f32 60// DXIL: call float @dx.op.objectRayDirection.f32 61// DXIL: call float @dx.op.objectToWorld.f32 62// DXIL: call float @dx.op.worldToObject.f32 63// DXIL: call i32 @dx.op.hitKind.i32 64 65// DXIL: call void @dx.op.callShader.struct.CallableParams_0 66 67 68[[vk::binding(0)]] 69uniform RaytracingAccelerationStructure accelStruct : register(t0); 70 71struct RayPayload 72{ 73 float RayHitT; 74}; 75 76struct CallableParams 77{ 78 float value; 79}; 80 81#define T_MIN 0.01f 82#define T_MAX 1e4f 83 84float CheckRayDispatchValues() 85{ 86 float val = 0.0f; 87 88 uint3 ri = DispatchRaysIndex(); 89 uint3 rd = DispatchRaysDimensions(); 90 91 val += ri.x; val += ri.y; val += ri.z; 92 val += rd.x; val += rd.y; val += rd.z; 93 94 return val; 95} 96 97float CheckRaySystemValues() 98{ 99 float val = 0.0f; 100 101 float3 wro = WorldRayOrigin(); 102 val += wro.x; val += wro.y; val += wro.z; 103 104 float3 wrd = WorldRayDirection(); 105 val += wrd.x; val += wrd.y; val += wrd.z; 106 107 float rayTMin = RayTMin(); 108 val += rayTMin; 109 110 float rayTCurrent = RayTCurrent(); 111 val += rayTCurrent; 112 113 uint rayFlags = RayFlags(); 114 switch (rayFlags) 115 { 116 case RAY_FLAG_NONE: 117 case RAY_FLAG_FORCE_OPAQUE: 118 case RAY_FLAG_FORCE_NON_OPAQUE: 119 case RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH: 120 case RAY_FLAG_SKIP_CLOSEST_HIT_SHADER: 121 case RAY_FLAG_CULL_BACK_FACING_TRIANGLES: 122 case RAY_FLAG_CULL_FRONT_FACING_TRIANGLES: 123 case RAY_FLAG_CULL_OPAQUE: 124 case RAY_FLAG_CULL_NON_OPAQUE: 125 case RAY_FLAG_SKIP_TRIANGLES: 126 case RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES: 127 val += 1.0f; 128 break; 129 130 default: 131 break; 132 } 133 134 return val; 135} 136 137float CheckObjectSpaceSystemValues() 138{ 139 float val = 0.0f; 140 141 val += InstanceIndex(); 142 val += InstanceID(); 143 val += GeometryIndex(); 144 val += PrimitiveIndex(); 145 146 float3 oro = ObjectRayOrigin(); 147 val += oro.x; val += oro.y; val += oro.z; 148 149 float3 ord = ObjectRayDirection(); 150 val += ord.x; val += ord.y; val += ord.z; 151 152 float3x4 f3x4 = ObjectToWorld3x4(); 153 val += f3x4._11; val += f3x4._12; val += f3x4._13; val += f3x4._14; 154 val += f3x4._21; val += f3x4._22; val += f3x4._23; val += f3x4._24; 155 val += f3x4._31; val += f3x4._32; val += f3x4._33; val += f3x4._34; 156 157 float4x3 f4x3 = ObjectToWorld4x3(); 158 val += f4x3._11; val += f4x3._12; val += f4x3._13; 159 val += f4x3._21; val += f4x3._22; val += f4x3._23; 160 val += f4x3._31; val += f4x3._32; val += f4x3._33; 161 val += f4x3._41; val += f4x3._42; val += f4x3._43; 162 163 f3x4 = WorldToObject3x4(); 164 val += f3x4._11; val += f3x4._12; val += f3x4._13; val += f3x4._14; 165 val += f3x4._21; val += f3x4._22; val += f3x4._23; val += f3x4._24; 166 val += f3x4._31; val += f3x4._32; val += f3x4._33; val += f3x4._34; 167 168 f4x3 = WorldToObject4x3(); 169 val += f4x3._11; val += f4x3._12; val += f4x3._13; 170 val += f4x3._21; val += f4x3._22; val += f4x3._23; 171 val += f4x3._31; val += f4x3._32; val += f4x3._33; 172 val += f4x3._41; val += f4x3._42; val += f4x3._43; 173 174 return val; 175} 176 177float CheckHitSpecificSystemValues() 178{ 179 float val = 0.0f; 180 181 uint hitKind = HitKind(); 182 if (hitKind == HIT_KIND_TRIANGLE_FRONT_FACE || hitKind == HIT_KIND_TRIANGLE_BACK_FACE) 183 { 184 val += 1.0f; 185 } 186 187 return val; 188} 189 190float CheckTraceRay(RayPayload payload, RayDesc rayDesc) 191{ 192 float val = 0.0f; 193 float currentTime = 1; 194 195 TraceRay(accelStruct, RAY_FLAG_NONE, ~0, 0, 1, 0, rayDesc, payload); 196 val += payload.RayHitT; 197 TraceRay(accelStruct, RAY_FLAG_FORCE_OPAQUE, ~0, 0, 1, 0, rayDesc, payload); 198 val += payload.RayHitT; 199 TraceRay(accelStruct, RAY_FLAG_FORCE_NON_OPAQUE, ~0, 0, 1, 0, rayDesc, payload); 200 val += payload.RayHitT; 201 TraceRay(accelStruct, RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH, ~0, 0, 1, 0, rayDesc, payload); 202 val += payload.RayHitT; 203 TraceRay(accelStruct, RAY_FLAG_SKIP_CLOSEST_HIT_SHADER, ~0, 0, 1, 0, rayDesc, payload); 204 val += payload.RayHitT; 205 TraceRay(accelStruct, RAY_FLAG_CULL_BACK_FACING_TRIANGLES, ~0, 0, 1, 0, rayDesc, payload); 206 val += payload.RayHitT; 207 TraceRay(accelStruct, RAY_FLAG_CULL_FRONT_FACING_TRIANGLES, ~0, 0, 1, 0, rayDesc, payload); 208 val += payload.RayHitT; 209 TraceRay(accelStruct, RAY_FLAG_CULL_OPAQUE, ~0, 0, 1, 0, rayDesc, payload); 210 val += payload.RayHitT; 211 TraceRay(accelStruct, RAY_FLAG_CULL_NON_OPAQUE, ~0, 0, 1, 0, rayDesc, payload); 212 val += payload.RayHitT; 213 TraceRay(accelStruct, RAY_FLAG_SKIP_TRIANGLES, ~0, 0, 1, 0, rayDesc, payload); 214 val += payload.RayHitT; 215 TraceRay(accelStruct, RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES, ~0, 0, 1, 0, rayDesc, payload); 216 val += payload.RayHitT; 217 218#if !defined(NOMOTION) 219 TraceMotionRay(accelStruct, RAY_FLAG_NONE, ~0, 0, 1, 0, rayDesc, currentTime, payload); 220 val += payload.RayHitT; 221 TraceMotionRay(accelStruct, RAY_FLAG_FORCE_OPAQUE, ~0, 0, 1, 0, rayDesc, currentTime, payload); 222 val += payload.RayHitT; 223 TraceMotionRay(accelStruct, RAY_FLAG_FORCE_NON_OPAQUE, ~0, 0, 1, 0, rayDesc, currentTime, payload); 224 val += payload.RayHitT; 225 TraceMotionRay(accelStruct, RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH, ~0, 0, 1, 0, rayDesc, currentTime, payload); 226 val += payload.RayHitT; 227 TraceMotionRay(accelStruct, RAY_FLAG_SKIP_CLOSEST_HIT_SHADER, ~0, 0, 1, 0, rayDesc, currentTime, payload); 228 val += payload.RayHitT; 229 TraceMotionRay(accelStruct, RAY_FLAG_CULL_BACK_FACING_TRIANGLES, ~0, 0, 1, 0, rayDesc, currentTime, payload); 230 val += payload.RayHitT; 231 TraceMotionRay(accelStruct, RAY_FLAG_CULL_FRONT_FACING_TRIANGLES, ~0, 0, 1, 0, rayDesc, currentTime, payload); 232 val += payload.RayHitT; 233 TraceMotionRay(accelStruct, RAY_FLAG_CULL_OPAQUE, ~0, 0, 1, 0, rayDesc, currentTime, payload); 234 val += payload.RayHitT; 235 TraceMotionRay(accelStruct, RAY_FLAG_CULL_NON_OPAQUE, ~0, 0, 1, 0, rayDesc, currentTime, payload); 236 val += payload.RayHitT; 237 TraceMotionRay(accelStruct, RAY_FLAG_SKIP_TRIANGLES, ~0, 0, 1, 0, rayDesc, currentTime, payload); 238 val += payload.RayHitT; 239 TraceMotionRay(accelStruct, RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES, ~0, 0, 1, 0, rayDesc, currentTime, payload); 240 val += payload.RayHitT; 241#endif 242 243 return val; 244} 245 246float CheckSysValueIntrinsics() 247{ 248 float val = 0.0f; 249 250 val += CheckRayDispatchValues(); 251 val += CheckRaySystemValues(); 252 val += CheckObjectSpaceSystemValues(); 253 val += CheckHitSpecificSystemValues(); 254 255 return val; 256} 257 258[shader("closesthit")] 259void main( inout RayPayload payload, in BuiltInTriangleIntersectionAttributes attribs ) 260{ 261 float2 dir = (DispatchRaysIndex().xy / DispatchRaysDimensions().xy) * 2.0f - 1.0f; 262 float aspectRatio = DispatchRaysDimensions().x / DispatchRaysDimensions().y; 263 264 RayDesc rayDesc; 265 rayDesc.Origin = float3(0.0f, 0.0f, 0.0f); 266 rayDesc.Direction = normalize(float3(dir.x * aspectRatio, -dir.y, 1)); ; 267 rayDesc.TMin = T_MIN; 268 rayDesc.TMax = T_MAX; 269 270 //RayPayload payload; 271 payload.RayHitT = T_MAX; 272 273 float val = 0.0f; 274 275 val += CheckTraceRay(payload, rayDesc); 276 277 val += CheckSysValueIntrinsics(); 278 279 float3 barycentrics = float3(1.0 - attribs.barycentrics.x - attribs.barycentrics.y, attribs.barycentrics.x, attribs.barycentrics.y); 280 val += barycentrics.x; val += barycentrics.y; val += barycentrics.z; 281 282 CallableParams params; 283 CallShader( 0, params ); 284 val += params.value; 285 286 payload.RayHitT = val; 287}