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 intersection -emit-spirv-via-glsl 2//TEST:SIMPLE(filecheck=SPIRV):-target spirv -entry main -stage intersection 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 intersection -profile sm_6_5 -DNOMOTION 5 6// SPIRV-NOT: OpCapability RayQueryKHR 7// SPIRV-DAG: OpCapability RayTracingKHR 8// SPIRV-DAG: OpExtension "SPV_KHR_ray_tracing" 9 10// SPIRV: OpEntryPoint 11 12// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn WorldRayOrigin{{NV|KHR}} 13// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn WorldRayDirection{{NV|KHR}} 14// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn LaunchId{{NV|KHR}} 15// SPIRV-DAG: OpDecorate %{{.*}} BuiltIn LaunchSize{{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 28// SPIRV-DAG: OpTypePointer HitAttribute{{NV|KHR}} 29// SPIRV-DAG: OpVariable %{{.*}} HitAttribute{{NV|KHR}} 30 31// SPIRV: OpReportIntersectionKHR 32 33// DXIL: main 34 35// DXIL: call float @dx.op.worldRayOrigin.f32 36// DXIL: call float @dx.op.worldRayDirection.f32 37 38// DXIL: call i32 @dx.op.dispatchRaysIndex.i32 39// DXIL: call i32 @dx.op.dispatchRaysDimensions.i32 40 41// DXIL: call float @dx.op.rayTMin.f32 42// DXIL: call float @dx.op.rayTCurrent.f32 43// DXIL: call i32 @dx.op.rayFlags.i32 44 45// DXIL: call i32 @dx.op.instanceIndex.i32 46// DXIL: call i32 @dx.op.instanceID.i32 47// DXIL: call i32 @dx.op.geometryIndex.i32 48// DXIL: call i32 @dx.op.primitiveIndex.i32 49// DXIL: call float @dx.op.objectRayOrigin.f32 50// DXIL: call float @dx.op.objectRayDirection.f32 51// DXIL: call float @dx.op.objectToWorld.f32 52// DXIL: call float @dx.op.worldToObject.f32 53 54// DXIL: call i1 @dx.op.reportHit.struct.MyAttributes_0 55 56float CheckRayDispatchValues() // all 57{ 58 float val = 0.0f; 59 60 uint3 ri = DispatchRaysIndex(); 61 uint3 rd = DispatchRaysDimensions(); 62 63 val += ri.x; val += ri.y; val += ri.z; 64 val += rd.x; val += rd.y; val += rd.z; 65 66 return val; 67} 68 69float CheckRaySystemValues() // chit/anyhit/intersection 70{ 71 float val = 0.0f; 72 73 float3 wro = WorldRayOrigin(); 74 val += wro.x; val += wro.y; val += wro.z; 75 76 float3 wrd = WorldRayDirection(); 77 val += wrd.x; val += wrd.y; val += wrd.z; 78 79 float rayTMin = RayTMin(); 80 val += rayTMin; 81 82 float rayTCurrent = RayTCurrent(); 83 val += rayTCurrent; 84 85 uint rayFlags = RayFlags(); 86 switch (rayFlags) 87 { 88 case RAY_FLAG_NONE: 89 case RAY_FLAG_FORCE_OPAQUE: 90 case RAY_FLAG_FORCE_NON_OPAQUE: 91 case RAY_FLAG_ACCEPT_FIRST_HIT_AND_END_SEARCH: 92 case RAY_FLAG_SKIP_CLOSEST_HIT_SHADER: 93 case RAY_FLAG_CULL_BACK_FACING_TRIANGLES: 94 case RAY_FLAG_CULL_FRONT_FACING_TRIANGLES: 95 case RAY_FLAG_CULL_OPAQUE: 96 case RAY_FLAG_CULL_NON_OPAQUE: 97 case RAY_FLAG_SKIP_TRIANGLES: 98 case RAY_FLAG_SKIP_PROCEDURAL_PRIMITIVES: 99 val += 1.0f; 100 break; 101 102 default: 103 break; 104 } 105 106 return val; 107} 108 109float CheckObjectSpaceSystemValues() 110{ 111 float val = 0.0f; 112 113 val += InstanceIndex(); 114 val += InstanceID(); 115 val += GeometryIndex(); 116 val += PrimitiveIndex(); 117 118 float3 oro = ObjectRayOrigin(); 119 val += oro.x; val += oro.y; val += oro.z; 120 121 float3 ord = ObjectRayDirection(); 122 val += ord.x; val += ord.y; val += ord.z; 123 124 float3x4 f3x4 = ObjectToWorld3x4(); 125 val += f3x4._11; val += f3x4._12; val += f3x4._13; val += f3x4._14; 126 val += f3x4._21; val += f3x4._22; val += f3x4._23; val += f3x4._24; 127 val += f3x4._31; val += f3x4._32; val += f3x4._33; val += f3x4._34; 128 129 float4x3 f4x3 = ObjectToWorld4x3(); 130 val += f4x3._11; val += f4x3._12; val += f4x3._13; 131 val += f4x3._21; val += f4x3._22; val += f4x3._23; 132 val += f4x3._31; val += f4x3._32; val += f4x3._33; 133 val += f4x3._41; val += f4x3._42; val += f4x3._43; 134 135 f3x4 = WorldToObject3x4(); 136 val += f3x4._11; val += f3x4._12; val += f3x4._13; val += f3x4._14; 137 val += f3x4._21; val += f3x4._22; val += f3x4._23; val += f3x4._24; 138 val += f3x4._31; val += f3x4._32; val += f3x4._33; val += f3x4._34; 139 140 f4x3 = WorldToObject4x3(); 141 val += f4x3._11; val += f4x3._12; val += f4x3._13; 142 val += f4x3._21; val += f4x3._22; val += f4x3._23; 143 val += f4x3._31; val += f4x3._32; val += f4x3._33; 144 val += f4x3._41; val += f4x3._42; val += f4x3._43; 145 146 return val; 147} 148 149float CheckSysValueIntrinsics() 150{ 151 float val = 0.0f; 152 153 val += CheckRayDispatchValues(); 154 val += CheckRaySystemValues(); 155 val += CheckObjectSpaceSystemValues(); 156 157 return val; 158} 159 160struct MyAttributes 161{ 162 float attr; 163}; 164 165[shader("intersection")] 166void main() 167{ 168 float val = 0.0f; 169 MyAttributes IDs; 170 171 float3 center = float3( 0.0f, 0.0f, 1.0f ); 172 float radius = 5.0f; 173 174 float3 oc = WorldRayOrigin() - center; 175 float a = dot(WorldRayDirection(), WorldRayDirection()); 176 float b = dot(oc, WorldRayDirection()); 177 float c = dot(oc, oc) - radius * radius; 178 float discriminant = b * b - a * c; 179 180 val += CheckSysValueIntrinsics(); 181 182 if (discriminant >= 0.0f) 183 { 184 val += discriminant; 185 186 float t1 = (-b - sqrt(discriminant)) / a; 187 float t2 = (-b + sqrt(discriminant)) / a; 188 189 float rayTMin = RayTMin(); 190 float rayTMax = RayTCurrent(); 191 if ((rayTMin <= t1 && t1 < rayTMax) || (rayTMin <= t2 && t2 < rayTMax)) 192 { 193 IDs.attr = val; 194 ReportHit( (rayTMin <= t1 && t1 < rayTMax) ? t1 : t2, 0, IDs ); 195 } 196 } 197}