yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
6f3b8351c
master
1//TEST:SIMPLE(filecheck=SPIRV):-target spirv-assembly -entry main -stage anyhit -emit-spirv-via-glsl 2//TEST:SIMPLE(filecheck=SPIRV):-target spirv -entry main -stage anyhit 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 anyhit -profile sm_6_5 -DNOMOTION 5 6// SPIRV-NOT: OpCapability RayQueryKHR 7// SPIRV-DAG: RayTracingKHR 8// SPIRV-DAG: SPV_KHR_ray_tracing 9 10// SPIRV: OpEntryPoint 11 12// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn LaunchId{{NV|KHR}} 13// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn LaunchSize{{NV|KHR}} 14// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn WorldRayOrigin{{NV|KHR}} 15// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn WorldRayDirection{{NV|KHR}} 16// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn RayTmin{{NV|KHR}} 17// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn RayTmax{{NV|KHR}} 18// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn IncomingRayFlags{{NV|KHR}} 19// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn InstanceId 20// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn InstanceCustomIndex{{NV|KHR}} 21// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn RayGeometryIndexKHR 22// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn PrimitiveId 23// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn ObjectRayOrigin{{NV|KHR}} 24// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn ObjectRayDirection{{NV|KHR}} 25// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn ObjectToWorld{{NV|KHR}} 26// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn WorldToObject{{NV|KHR}} 27// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn HitKind{{NV|KHR}} 28 29// SPIRV-DAG: OpTypePointer HitAttribute{{NV|KHR}} 30// SPIRV-DAG: OpTypePointer IncomingRayPayload{{NV|KHR}} 31 32// SPIRV-DAG: OpTerminateRayKHR 33// SPIRV-DAG: OpIgnoreIntersectionKHR 34 35// DXIL: main 36 37// DXIL: call i32 @dx.op.dispatchRaysIndex.i32 38// DXIL: call i32 @dx.op.dispatchRaysDimensions.i32 39 40// DXIL: call float @dx.op.worldRayOrigin.f32 41// DXIL: call float @dx.op.worldRayDirection.f32 42// DXIL: call float @dx.op.rayTMin.f32 43// DXIL: call float @dx.op.rayTCurrent.f32 44// DXIL: call i32 @dx.op.rayFlags.i32 45 46// DXIL: call i32 @dx.op.instanceIndex.i32 47// DXIL: call i32 @dx.op.instanceID.i32 48// DXIL: call i32 @dx.op.geometryIndex.i32 49// DXIL: call i32 @dx.op.primitiveIndex.i32 50 51// DXIL: call float @dx.op.objectRayOrigin.f32 52// DXIL: call float @dx.op.objectRayDirection.f32 53// DXIL: call float @dx.op.objectToWorld.f32 54// DXIL: call float @dx.op.worldToObject.f32 55// DXIL: call i32 @dx.op.hitKind.i32 56 57// DXIL: call void @dx.op.acceptHitAndEndSearch 58// DXIL: call void @dx.op.ignoreHit 59 60 61struct RayPayload 62{ 63 float RayHitT; 64}; 65 66float CheckRayDispatchValues() 67{ 68 float val = 0.0f; 69 70 uint3 ri = DispatchRaysIndex(); 71 uint3 rd = DispatchRaysDimensions(); 72 73 val += ri.x; val += ri.y; val += ri.z; 74 val += rd.x; val += rd.y; val += rd.z; 75 76 return val; 77} 78 79float CheckRaySystemValues() 80{ 81 float val = 0.0f; 82 83 float3 wro = WorldRayOrigin(); 84 val += wro.x; val += wro.y; val += wro.z; 85 86 float3 wrd = WorldRayDirection(); 87 val += wrd.x; val += wrd.y; val += wrd.z; 88 89 float rayTMin = RayTMin(); 90 val += rayTMin; 91 92 float rayTCurrent = RayTCurrent(); 93 val += rayTCurrent; 94 95 uint rayFlags = RayFlags(); 96 switch (rayFlags) 97 { 98 case RAY_FLAG_NONE: 99 case RAY_FLAG_FORCE_OPAQUE: 100 case RAY_FLAG_FORCE_NON_OPAQUE: 101 case RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH: 102 case RAY_FLAG_SKIP_CLOSEST_HIT_SHADER: 103 case RAY_FLAG_CULL_BACK_FACING_TRIANGLES: 104 case RAY_FLAG_CULL_FRONT_FACING_TRIANGLES: 105 case RAY_FLAG_CULL_OPAQUE: 106 case RAY_FLAG_CULL_NON_OPAQUE: 107 case RAY_FLAG_SKIP_TRIANGLES: 108 case RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES: 109 val += 1.0f; 110 break; 111 112 default: 113 break; 114 } 115 116 return val; 117} 118 119float CheckObjectSpaceSystemValues() 120{ 121 float val = 0.0f; 122 123 val += InstanceIndex(); 124 val += InstanceID(); 125 val += GeometryIndex(); 126 val += PrimitiveIndex(); 127 128 float3 oro = ObjectRayOrigin(); 129 val += oro.x; val += oro.y; val += oro.z; 130 131 float3 ord = ObjectRayDirection(); 132 val += ord.x; val += ord.y; val += ord.z; 133 134 float3x4 f3x4 = ObjectToWorld3x4(); 135 val += f3x4._11; val += f3x4._12; val += f3x4._13; val += f3x4._14; 136 val += f3x4._21; val += f3x4._22; val += f3x4._23; val += f3x4._24; 137 val += f3x4._31; val += f3x4._32; val += f3x4._33; val += f3x4._34; 138 139 float4x3 f4x3 = ObjectToWorld4x3(); 140 val += f4x3._11; val += f4x3._12; val += f4x3._13; 141 val += f4x3._21; val += f4x3._22; val += f4x3._23; 142 val += f4x3._31; val += f4x3._32; val += f4x3._33; 143 val += f4x3._41; val += f4x3._42; val += f4x3._43; 144 145 f3x4 = WorldToObject3x4(); 146 val += f3x4._11; val += f3x4._12; val += f3x4._13; val += f3x4._14; 147 val += f3x4._21; val += f3x4._22; val += f3x4._23; val += f3x4._24; 148 val += f3x4._31; val += f3x4._32; val += f3x4._33; val += f3x4._34; 149 150 f4x3 = WorldToObject4x3(); 151 val += f4x3._11; val += f4x3._12; val += f4x3._13; 152 val += f4x3._21; val += f4x3._22; val += f4x3._23; 153 val += f4x3._31; val += f4x3._32; val += f4x3._33; 154 val += f4x3._41; val += f4x3._42; val += f4x3._43; 155 156 return val; 157} 158 159float CheckHitSpecificSystemValues() 160{ 161 float val = 0.0f; 162 163 uint hitKind = HitKind(); 164 if (hitKind == HIT_KIND_TRIANGLE_FRONT_FACE || hitKind == HIT_KIND_TRIANGLE_BACK_FACE) 165 { 166 val += 1.0f; 167 } 168 169 return val; 170} 171 172float CheckSysValueIntrinsics() 173{ 174 float val = 0.0f; 175 176 val += CheckRayDispatchValues(); 177 val += CheckRaySystemValues(); 178 val += CheckObjectSpaceSystemValues(); 179 val += CheckHitSpecificSystemValues(); 180 181 return val; 182} 183 184[shader("anyhit")] 185void main( inout RayPayload payload, in BuiltInTriangleIntersectionAttributes attribs: SV_IntersectionAttributes ) 186{ 187 float val = 0.0f; 188 189 val += CheckSysValueIntrinsics(); 190 191 float3 barycentrics = float3(1.0 - attribs.barycentrics.x - attribs.barycentrics.y, attribs.barycentrics.x, attribs.barycentrics.y); 192 val += barycentrics.x; val += barycentrics.y; val += barycentrics.z; 193 194 float3 hitLocation = ObjectRayOrigin() + ObjectRayDirection() * RayTCurrent(); 195 196 if (hitLocation.x > 0.0f) 197 { 198 payload.RayHitT = val; 199 AcceptHitAndEndSearch(); 200 } 201 else if (hitLocation.y < 0.0f) 202 { 203 payload.RayHitT = val; 204 IgnoreHit(); 205 } 206 207 payload.RayHitT = val; 208}