yum-mirror/slang

Making it easier to work with shaders

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

Jay KwakUse coopvec supporting dxcompiler.dll and dxil.dll (#6719)6f3b8351c

master
6.2 KiB208 linesraw
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}