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.0 KiB197 linesraw
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}