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 raygeneration -emit-spirv-via-glsl 2//TEST:SIMPLE(filecheck=SPIRV):-target spirv -entry main -stage raygeneration 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 raygeneration -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 %{{.*}} Binding 1 19// SPIRV-DAG: OpDecorate %{{.*}} DescriptorSet 0 20 21// SPIRV: OpTraceRayKHR 22// SPIRV: OpTraceRayMotionNV 23 24// SPIRV: OpExecuteCallableKHR 25 26// DXIL: main 27 28// DXIL: call i32 @dx.op.dispatchRaysIndex.i32 29// DXIL: call i32 @dx.op.dispatchRaysDimensions.i32 30// DXIL: call void @dx.op.traceRay.struct.RayPayload_0 31// DXIL: call void @dx.op.callShader.struct.CallableParams_0 32 33 34[[vk::binding(0)]] 35uniform RaytracingAccelerationStructure accelStruct : register(t0); 36 37[[vk::binding(1)]] 38RWTexture2D<float4> screenOutput : register(u0); 39 40struct RayPayload 41{ 42 float RayHitT; 43}; 44 45struct CallableParams 46{ 47 float value; 48}; 49 50#define T_MIN 0.01f 51#define T_MAX 1e4f 52 53float CheckRayDispatchValues() 54{ 55 float val = 0.0f; 56 57 uint3 ri = DispatchRaysIndex(); 58 uint3 rd = DispatchRaysDimensions(); 59 60 val += ri.x; val += ri.y; val += ri.z; 61 val += rd.x; val += rd.y; val += rd.z; 62 63 return val; 64} 65 66float CheckTraceRay(RayPayload payload, RayDesc rayDesc) 67{ 68 float val = 0.0f; 69 float currentTime = 1; 70 71 TraceRay(accelStruct, RAY_FLAG_NONE, ~0, 0, 1, 0, rayDesc, payload); 72 val += payload.RayHitT; 73 TraceRay(accelStruct, RAY_FLAG_FORCE_OPAQUE, ~0, 0, 1, 0, rayDesc, payload); 74 val += payload.RayHitT; 75 TraceRay(accelStruct, RAY_FLAG_FORCE_NON_OPAQUE, ~0, 0, 1, 0, rayDesc, payload); 76 val += payload.RayHitT; 77 TraceRay(accelStruct, RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH, ~0, 0, 1, 0, rayDesc, payload); 78 val += payload.RayHitT; 79 TraceRay(accelStruct, RAY_FLAG_SKIP_CLOSEST_HIT_SHADER, ~0, 0, 1, 0, rayDesc, payload); 80 val += payload.RayHitT; 81 TraceRay(accelStruct, RAY_FLAG_CULL_BACK_FACING_TRIANGLES, ~0, 0, 1, 0, rayDesc, payload); 82 val += payload.RayHitT; 83 TraceRay(accelStruct, RAY_FLAG_CULL_FRONT_FACING_TRIANGLES, ~0, 0, 1, 0, rayDesc, payload); 84 val += payload.RayHitT; 85 TraceRay(accelStruct, RAY_FLAG_CULL_OPAQUE, ~0, 0, 1, 0, rayDesc, payload); 86 val += payload.RayHitT; 87 TraceRay(accelStruct, RAY_FLAG_CULL_NON_OPAQUE, ~0, 0, 1, 0, rayDesc, payload); 88 val += payload.RayHitT; 89 TraceRay(accelStruct, RAY_FLAG_SKIP_TRIANGLES, ~0, 0, 1, 0, rayDesc, payload); 90 val += payload.RayHitT; 91 TraceRay(accelStruct, RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES, ~0, 0, 1, 0, rayDesc, payload); 92 val += payload.RayHitT; 93 94#if !defined(NOMOTION) 95 TraceMotionRay(accelStruct, RAY_FLAG_NONE, ~0, 0, 1, 0, rayDesc, currentTime, payload); 96 val += payload.RayHitT; 97 TraceMotionRay(accelStruct, RAY_FLAG_FORCE_OPAQUE, ~0, 0, 1, 0, rayDesc, currentTime, payload); 98 val += payload.RayHitT; 99 TraceMotionRay(accelStruct, RAY_FLAG_FORCE_NON_OPAQUE, ~0, 0, 1, 0, rayDesc, currentTime, payload); 100 val += payload.RayHitT; 101 TraceMotionRay(accelStruct, RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH, ~0, 0, 1, 0, rayDesc, currentTime, payload); 102 val += payload.RayHitT; 103 TraceMotionRay(accelStruct, RAY_FLAG_SKIP_CLOSEST_HIT_SHADER, ~0, 0, 1, 0, rayDesc, currentTime, payload); 104 val += payload.RayHitT; 105 TraceMotionRay(accelStruct, RAY_FLAG_CULL_BACK_FACING_TRIANGLES, ~0, 0, 1, 0, rayDesc, currentTime, payload); 106 val += payload.RayHitT; 107 TraceMotionRay(accelStruct, RAY_FLAG_CULL_FRONT_FACING_TRIANGLES, ~0, 0, 1, 0, rayDesc, currentTime, payload); 108 val += payload.RayHitT; 109 TraceMotionRay(accelStruct, RAY_FLAG_CULL_OPAQUE, ~0, 0, 1, 0, rayDesc, currentTime, payload); 110 val += payload.RayHitT; 111 TraceMotionRay(accelStruct, RAY_FLAG_CULL_NON_OPAQUE, ~0, 0, 1, 0, rayDesc, currentTime, payload); 112 val += payload.RayHitT; 113 TraceMotionRay(accelStruct, RAY_FLAG_SKIP_TRIANGLES, ~0, 0, 1, 0, rayDesc, currentTime, payload); 114 val += payload.RayHitT; 115 TraceMotionRay(accelStruct, RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES, ~0, 0, 1, 0, rayDesc, currentTime, payload); 116 val += payload.RayHitT; 117#endif 118 119 return val; 120} 121 122float CheckSysValueIntrinsics() 123{ 124 float val = 0.0f; 125 126 val += CheckRayDispatchValues(); 127 128 return val; 129} 130 131[shader("raygeneration")] 132void main() 133{ 134 135 float2 dir = (DispatchRaysIndex().xy / DispatchRaysDimensions().xy) * 2.0f - 1.0f; 136 float aspectRatio = DispatchRaysDimensions().x / DispatchRaysDimensions().y; 137 138 RayDesc rayDesc; 139 rayDesc.Origin = float3(0.0f, 0.0f, 0.0f); 140 rayDesc.Direction = normalize(float3(dir.x * aspectRatio, -dir.y, 1));; 141 rayDesc.TMin = T_MIN; 142 rayDesc.TMax = T_MAX; 143 144 RayPayload payload; 145 payload.RayHitT = T_MAX; 146 147 float val = 0.0f; 148 149 val += CheckTraceRay(payload, rayDesc); 150 151 if( val < T_MAX ) 152 { 153 val += CheckSysValueIntrinsics(); 154 screenOutput[DispatchRaysIndex().xy] = float4(val, val, val, 1); 155 } 156 else 157 { 158 CallableParams params; 159 CallShader(0, params); 160 161 screenOutput[DispatchRaysIndex().xy] = float4(params.value, params.value, params.value, params.value); 162 } 163}