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 miss -emit-spirv-via-glsl 2//TEST:SIMPLE(filecheck=SPIRV):-target spirv -entry main -stage miss 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 miss -profile sm_6_5 -DNOMOTION 5 6// SPIRV-NOT: OpCapability RayQueryKHR 7// SPIRV-DAG: OpCapability RayTracingKHR 8// SPIRV-DAG: OpCapability 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 24// SPIRV: OpTraceRayKHR 25// SPIRV: OpTraceRayMotionNV 26// SPIRV: OpExecuteCallableKHR 27 28// DXIL: main 29 30// DXIL: call i32 @dx.op.dispatchRaysIndex.i32 31// DXIL: call i32 @dx.op.dispatchRaysDimensions.i32 32// DXIL: call void @dx.op.traceRay.struct.RayPayload_0 33 34// DXIL: call float @dx.op.worldRayOrigin.f32 35// DXIL: call float @dx.op.worldRayDirection.f32 36// DXIL: call float @dx.op.rayTMin.f32 37// DXIL: call float @dx.op.rayTCurrent.f32 38// DXIL: call i32 @dx.op.rayFlags.i32 39 40// DXIL: call void @dx.op.callShader.struct.CallableParams_0 41 42[[vk::binding(0)]] 43uniform RaytracingAccelerationStructure accelStruct : register(t0); 44 45struct RayPayload 46{ 47 float RayHitT; 48}; 49 50struct CallableParams 51{ 52 float value; 53}; 54 55#define T_MIN 0.01f 56#define T_MAX 1e4f 57 58float CheckRayDispatchValues() 59{ 60 float val = 0.0f; 61 62 uint3 ri = DispatchRaysIndex(); 63 uint3 rd = DispatchRaysDimensions(); 64 65 val += ri.x; val += ri.y; val += ri.z; 66 val += rd.x; val += rd.y; val += rd.z; 67 68 return val; 69} 70 71float CheckRaySystemValues() 72{ 73 float val = 0.0f; 74 75 float3 wro = WorldRayOrigin(); 76 val += wro.x; val += wro.y; val += wro.z; 77 78 float3 wrd = WorldRayDirection(); 79 val += wrd.x; val += wrd.y; val += wrd.z; 80 81 float rayTMin = RayTMin(); 82 val += rayTMin; 83 84 float rayTCurrent = RayTCurrent(); 85 val += rayTCurrent; 86 87 uint rayFlags = RayFlags(); 88 switch (rayFlags) 89 { 90 case RAY_FLAG_NONE: 91 case RAY_FLAG_FORCE_OPAQUE: 92 case RAY_FLAG_FORCE_NON_OPAQUE: 93 case RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH: 94 case RAY_FLAG_SKIP_CLOSEST_HIT_SHADER: 95 case RAY_FLAG_CULL_BACK_FACING_TRIANGLES: 96 case RAY_FLAG_CULL_FRONT_FACING_TRIANGLES: 97 case RAY_FLAG_CULL_OPAQUE: 98 case RAY_FLAG_CULL_NON_OPAQUE: 99 case RAY_FLAG_SKIP_TRIANGLES: 100 case RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES: 101 val += 1.0f; 102 break; 103 104 default: 105 break; 106 } 107 108 return val; 109} 110 111float CheckTraceRay(RayPayload payload, RayDesc rayDesc) 112{ 113 float val = 0.0f; 114 float currentTime = 1; 115 116 TraceRay(accelStruct, RAY_FLAG_NONE, ~0, 0, 1, 0, rayDesc, payload); 117 val += payload.RayHitT; 118 TraceRay(accelStruct, RAY_FLAG_FORCE_OPAQUE, ~0, 0, 1, 0, rayDesc, payload); 119 val += payload.RayHitT; 120 TraceRay(accelStruct, RAY_FLAG_FORCE_NON_OPAQUE, ~0, 0, 1, 0, rayDesc, payload); 121 val += payload.RayHitT; 122 TraceRay(accelStruct, RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH, ~0, 0, 1, 0, rayDesc, payload); 123 val += payload.RayHitT; 124 TraceRay(accelStruct, RAY_FLAG_SKIP_CLOSEST_HIT_SHADER, ~0, 0, 1, 0, rayDesc, payload); 125 val += payload.RayHitT; 126 TraceRay(accelStruct, RAY_FLAG_CULL_BACK_FACING_TRIANGLES, ~0, 0, 1, 0, rayDesc, payload); 127 val += payload.RayHitT; 128 TraceRay(accelStruct, RAY_FLAG_CULL_FRONT_FACING_TRIANGLES, ~0, 0, 1, 0, rayDesc, payload); 129 val += payload.RayHitT; 130 TraceRay(accelStruct, RAY_FLAG_CULL_OPAQUE, ~0, 0, 1, 0, rayDesc, payload); 131 val += payload.RayHitT; 132 TraceRay(accelStruct, RAY_FLAG_CULL_NON_OPAQUE, ~0, 0, 1, 0, rayDesc, payload); 133 val += payload.RayHitT; 134 TraceRay(accelStruct, RAY_FLAG_SKIP_TRIANGLES, ~0, 0, 1, 0, rayDesc, payload); 135 val += payload.RayHitT; 136 TraceRay(accelStruct, RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES, ~0, 0, 1, 0, rayDesc, payload); 137 val += payload.RayHitT; 138 139#if !defined(NOMOTION) 140 TraceMotionRay(accelStruct, RAY_FLAG_NONE, ~0, 0, 1, 0, rayDesc, currentTime, payload); 141 val += payload.RayHitT; 142 TraceMotionRay(accelStruct, RAY_FLAG_FORCE_OPAQUE, ~0, 0, 1, 0, rayDesc, currentTime, payload); 143 val += payload.RayHitT; 144 TraceMotionRay(accelStruct, RAY_FLAG_FORCE_NON_OPAQUE, ~0, 0, 1, 0, rayDesc, currentTime, payload); 145 val += payload.RayHitT; 146 TraceMotionRay(accelStruct, RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH, ~0, 0, 1, 0, rayDesc, currentTime, payload); 147 val += payload.RayHitT; 148 TraceMotionRay(accelStruct, RAY_FLAG_SKIP_CLOSEST_HIT_SHADER, ~0, 0, 1, 0, rayDesc, currentTime, payload); 149 val += payload.RayHitT; 150 TraceMotionRay(accelStruct, RAY_FLAG_CULL_BACK_FACING_TRIANGLES, ~0, 0, 1, 0, rayDesc, currentTime, payload); 151 val += payload.RayHitT; 152 TraceMotionRay(accelStruct, RAY_FLAG_CULL_FRONT_FACING_TRIANGLES, ~0, 0, 1, 0, rayDesc, currentTime, payload); 153 val += payload.RayHitT; 154 TraceMotionRay(accelStruct, RAY_FLAG_CULL_OPAQUE, ~0, 0, 1, 0, rayDesc, currentTime, payload); 155 val += payload.RayHitT; 156 TraceMotionRay(accelStruct, RAY_FLAG_CULL_NON_OPAQUE, ~0, 0, 1, 0, rayDesc, currentTime, payload); 157 val += payload.RayHitT; 158 TraceMotionRay(accelStruct, RAY_FLAG_SKIP_TRIANGLES, ~0, 0, 1, 0, rayDesc, currentTime, payload); 159 val += payload.RayHitT; 160 TraceMotionRay(accelStruct, RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES, ~0, 0, 1, 0, rayDesc, currentTime, payload); 161 val += payload.RayHitT; 162#endif 163 164 return val; 165} 166 167float CheckSysValueIntrinsics() 168{ 169 float val = 0.0f; 170 171 val += CheckRayDispatchValues(); 172 val += CheckRaySystemValues(); 173 174 return val; 175} 176 177[shader("miss")] 178void main( inout RayPayload payload ) 179{ 180 float2 dir = (DispatchRaysIndex().xy / DispatchRaysDimensions().xy) * 2.0f - 1.0f; 181 float aspectRatio = DispatchRaysDimensions().x / DispatchRaysDimensions().y; 182 183 RayDesc rayDesc; 184 rayDesc.Origin = float3(0.0f, 0.0f, 0.0f); 185 rayDesc.Direction = normalize(float3(dir.x * aspectRatio, -dir.y, 1)); ; 186 rayDesc.TMin = T_MIN; 187 rayDesc.TMax = T_MAX; 188 189 //RayPayload payload; 190 payload.RayHitT = T_MAX; 191 192 float val = 0.0f; 193 194 val += CheckTraceRay(payload, rayDesc); 195 196 val += CheckSysValueIntrinsics(); 197 198 CallableParams params; 199 CallShader( 0, params ); 200 val += params.value; 201 202 payload.RayHitT = val; 203}