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
6.7 KiB203 linesraw
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}