yum-mirror/slang

Making it easier to work with shaders

git clone https://git.yummers.dev/yum-mirror/slang

Jay KwakUpdate spirv-header and spirv-tools to Jun/2024 (#4679)ad379b7c5

master
9.8 KiB287 linesraw
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}