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
5.6 KiB163 linesraw
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}