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
10.7 KiB334 linesraw
1//TEST:SIMPLE(filecheck=CHECK_GLSL): -allow-glsl -stage raygeneration -entry main -target glsl
2//TEST:SIMPLE(filecheck=CHECK_SPV): -allow-glsl -emit-spirv-directly -stage raygeneration -entry main -target spirv-assembly
3
4layout(binding = 0) uniform accelerationStructureEXT as;
5
6//TEST_INPUT:ubuffer(data=[0], stride=4):out,name=outputBuffer
7buffer MyBlockName
8{
9    uint data[];
10} outputBuffer;
11
12// CHECK_GLSL-DAG: rayPayloadEXT
13// CHECK_SPV-DAG: RayPayload{{NV|KHR}}
14layout(location = 2) rayPayloadEXT vec4 payload;
15// CHECK_GLSL-DAG: hitObjectAttributeNV
16// CHECK_SPV-DAG: HitObjectAttributeNV
17layout(location = 2) hitObjectAttributeNV vec4 attrMain;
18// CHECK_GLSL-DAG: callableDataEXT
19// CHECK_SPV-DAG: CallableData{{NV|KHR}}
20layout(location = 0) callableDataEXT vec4 outcall;
21
22__generic<T : __BuiltinFloatingPointType, let N : int, let M : int>
23bool equals(matrix<T, N, M> lhs, matrix<T, N, M> rhs)
24{
25    for (int i = 0; i < N; i++)
26    {
27        for (int j = 0; j < M; j++)
28        {
29            if (
30                lhs[i][j] 
31                !=
32                rhs[i][j]
33                )
34            {
35                return false;
36            }
37        }
38    }
39    return true;
40}
41
42bool testHitObjectTraceRay() {
43    hitObjectNV hit;
44// CHECK_GLSL-DAG: hitObjectTraceRayNV
45// CHECK_SPV-DAG: OpHitObjectTraceRayNV
46    hitObjectTraceRayNV(hit, as, gl_RayFlagsNoneEXT, 0xff, 0, 0, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 2);
47    return true
48// CHECK_GLSL-DAG: hitObjectIsHitNV
49// CHECK_SPV-DAG: OpHitObjectIsHitNV
50        && hitObjectIsHitNV(hit) == true
51        ;
52}
53
54bool testHitObjectTraceRayWithAuxInfo() {
55    hitObjectNV hit;
56// CHECK_GLSL-DAG: hitObjectTraceRayNV
57// CHECK_SPV-DAG: OpHitObjectTraceRayNV
58    hitObjectTraceRayNV(hit, as, gl_RayFlagsNoneEXT, 0xff, 0, 0, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 2);
59// CHECK_GLSL-DAG: hitObjectGetAttributesNV
60// CHECK_SPV-DAG: OpHitObjectGetAttributesNV
61    hitObjectGetAttributesNV(hit, 2);
62    vec4 testCopy = attrMain;
63
64// CHECK_GLSL-DAG: reorderThreadNV
65// CHECK_SPV-DAG: OpReorderThreadWithHintNV
66    reorderThreadNV(0, 3);
67// CHECK_GLSL-DAG: reorderThreadNV
68// CHECK_SPV-DAG: OpReorderThreadWithHitObjectNV
69    reorderThreadNV(hit);
70// CHECK_GLSL-DAG: reorderThreadNV
71// CHECK_SPV-DAG: OpReorderThreadWithHitObjectNV
72    reorderThreadNV(hit, 0, 3);
73
74    return true
75// CHECK_GLSL-DAG: hitObjectGetShaderBindingTableRecordIndexNV
76// CHECK_SPV-DAG: OpHitObjectGetShaderBindingTableRecordIndexNV
77        && hitObjectGetShaderBindingTableRecordIndexNV(hit) == 0
78// CHECK_GLSL-DAG: hitObjectGetShaderRecordBufferHandleNV
79// CHECK_SPV-DAG: OpHitObjectGetShaderRecordBufferHandleNV
80        && hitObjectGetShaderRecordBufferHandleNV(hit) != uvec2(0) // valid Handles are never 0, but not predictable either
81        && testCopy == vec4(1)
82// CHECK_GLSL-DAG: hitObjectIsHitNV
83// CHECK_SPV-DAG: OpHitObjectIsHitNV
84        && hitObjectIsHitNV(hit) == true
85// CHECK_GLSL-DAG: hitObjectGetRayTMinNV
86// CHECK_SPV-DAG: OpHitObjectGetRayTMinNV
87        && hitObjectGetRayTMinNV(hit) == 0.01f
88// CHECK_GLSL-DAG: hitObjectGetRayTMaxNV
89// CHECK_SPV-DAG: OpHitObjectGetRayTMaxNV
90        && hitObjectGetRayTMaxNV(hit) == 1e4f
91// CHECK_GLSL-DAG: hitObjectGetObjectRayOriginNV
92// CHECK_SPV-DAG: OpHitObjectGetObjectRayOriginNV
93        && hitObjectGetObjectRayOriginNV(hit) == vec3(0.1, 0.1, 0.0) 
94// CHECK_GLSL-DAG: hitObjectGetObjectRayDirectionNV
95// CHECK_SPV-DAG: OpHitObjectGetObjectRayDirectionNV
96        && hitObjectGetObjectRayDirectionNV(hit) == vec3(0, 0, 1)
97// CHECK_GLSL-DAG: hitObjectGetWorldRayOriginNV
98// CHECK_SPV-DAG: OpHitObjectGetWorldRayOriginNV
99        && hitObjectGetWorldRayOriginNV(hit) == vec3(0.1, 0.1, 0.0) 
100// CHECK_GLSL-DAG: hitObjectGetWorldRayDirectionNV
101// CHECK_SPV-DAG: OpHitObjectGetWorldRayDirectionNV
102        && hitObjectGetWorldRayDirectionNV(hit) == vec3(0, 0, 1)
103// CHECK_GLSL-DAG: hitObjectGetObjectToWorldNV
104// CHECK_SPV-DAG: OpHitObjectGetObjectToWorldNV
105        && !equals(hitObjectGetObjectToWorldNV(hit), mat4x3(0))
106// CHECK_GLSL-DAG: hitObjectGetWorldToObjectNV
107// CHECK_SPV-DAG: OpHitObjectGetWorldToObjectNV
108        && !equals(hitObjectGetWorldToObjectNV(hit), mat4x3(0))
109// CHECK_GLSL-DAG: hitObjectGetInstanceCustomIndexNV
110// CHECK_SPV-DAG: OpHitObjectGetInstanceCustomIndexNV
111        && hitObjectGetInstanceCustomIndexNV(hit) == 0
112// CHECK_GLSL-DAG: hitObjectGetInstanceIdNV
113// CHECK_SPV-DAG: OpHitObjectGetInstanceIdNV
114        && hitObjectGetInstanceIdNV(hit) == 0
115// CHECK_GLSL-DAG: hitObjectGetGeometryIndexNV
116// CHECK_SPV-DAG: OpHitObjectGetGeometryIndexNV
117        && hitObjectGetGeometryIndexNV(hit) == 0
118// CHECK_GLSL-DAG: hitObjectGetPrimitiveIndexNV
119// CHECK_SPV-DAG: OpHitObjectGetPrimitiveIndexNV
120        && hitObjectGetPrimitiveIndexNV(hit) == 0
121// CHECK_GLSL-DAG: hitObjectGetHitKindNV
122// CHECK_SPV-DAG: OpHitObjectGetHitKindNV
123        && hitObjectGetHitKindNV(hit) == gl_HitKindFrontFacingTriangleEXT
124        ;
125}
126
127bool testHitObjectTraceRayLaunchSubShaders() {
128    hitObjectNV hit;
129// CHECK_GLSL-DAG: hitObjectTraceRayNV
130// CHECK_SPV-DAG: OpHitObjectTraceRayNV
131    hitObjectTraceRayNV(hit, as, gl_RayFlagsNoneEXT, 0xff, 0, 0, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 2);
132// CHECK_GLSL-DAG: hitObjectExecuteShaderNV
133// CHECK_SPV-DAG: OpHitObjectExecuteShaderNV
134    hitObjectExecuteShaderNV(hit, 2);
135    return true
136// CHECK_GLSL-DAG: hitObjectIsHitNV
137// CHECK_SPV-DAG: OpHitObjectIsHitNV
138        && hitObjectIsHitNV(hit) == true
139        ;
140}
141
142bool testHitObjectTraceRayMotion() {
143    hitObjectNV hit;
144// CHECK_GLSL-DAG: hitObjectTraceRayMotionNV
145// CHECK_SPV-DAG: OpHitObjectTraceRayMotionNV
146    hitObjectTraceRayMotionNV(hit, as, gl_RayFlagsNoneEXT, 0xff, 0, 0, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 0.0f, 2);
147    return true
148// CHECK_GLSL-DAG: hitObjectIsHitNV
149// CHECK_SPV-DAG: OpHitObjectIsHitNV
150        && hitObjectIsHitNV(hit) == true
151// CHECK_GLSL-DAG: hitObjectGetCurrentTimeNV
152// CHECK_SPV-DAG: OpHitObjectGetCurrentTimeNV
153        && hitObjectGetCurrentTimeNV(hit) == 0.0f
154        ;
155}
156
157bool testTraceRayFunctions() {
158// CHECK_GLSL-DAG: traceRayEXT
159// CHECK_SPV-DAG: OpTraceRayKHR
160    traceRayEXT(as, 0, 0, 0, 0, 0, vec3(0), 0, vec3(0), 0, 2);
161    return true
162        ;
163}
164
165bool testTraceRayCalls() {
166    return true
167        && testHitObjectTraceRay()
168        && testHitObjectTraceRayWithAuxInfo()
169        && testHitObjectTraceRayLaunchSubShaders()
170        && testHitObjectTraceRayMotion()
171        && testTraceRayFunctions()
172        ;
173}
174
175bool testHitObjectRecord() {
176    hitObjectNV hit;
177// CHECK_GLSL-DAG: hitObjectRecordHitNV
178// CHECK_SPV-DAG: OpHitObjectRecordHitNV
179    hitObjectRecordHitNV(hit, as, 0, 0, 0, gl_HitKindFrontFacingTriangleEXT, 0, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 2);
180    return true
181// CHECK_GLSL-DAG: hitObjectIsHitNV
182// CHECK_SPV-DAG: OpHitObjectIsHitNV
183        && hitObjectIsHitNV(hit) == true
184        ;
185}
186
187bool testHitObjectRecordIndex() {
188    hitObjectNV hit;
189// CHECK_GLSL-DAG: hitObjectRecordHitWithIndexNV
190// CHECK_SPV-DAG: OpHitObjectRecordHitWithIndexNV
191    hitObjectRecordHitWithIndexNV(hit, as, 0, 0, 0, gl_HitKindFrontFacingTriangleEXT, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 2);
192    return true
193// CHECK_GLSL-DAG: hitObjectIsHitNV
194// CHECK_SPV-DAG: OpHitObjectIsHitNV
195        && hitObjectIsHitNV(hit) == true
196        ;
197}
198
199bool testHitObjectRecordMotion() {
200    hitObjectNV hit;
201// CHECK_GLSL-DAG: hitObjectRecordHitMotionNV
202// CHECK_SPV-DAG: OpHitObjectRecordHitMotionNV
203    hitObjectRecordHitMotionNV(hit, as, 0, 0, 0, gl_HitKindFrontFacingTriangleEXT, 0, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 0.0f, 2);
204    return true
205// CHECK_GLSL-DAG: hitObjectIsHitNV
206// CHECK_SPV-DAG: OpHitObjectIsHitNV
207        && hitObjectIsHitNV(hit) == true
208        ;
209}
210
211bool testHitObjectRecordIndexMotion() {
212    hitObjectNV hit;
213// CHECK_GLSL-DAG: hitObjectRecordHitWithIndexMotionNV
214// CHECK_SPV-DAG: OpHitObjectRecordHitWithIndexMotionNV
215    hitObjectRecordHitWithIndexMotionNV(hit, as, 0, 0, 0, gl_HitKindFrontFacingTriangleEXT, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 0.0f, 2);
216    return true
217// CHECK_GLSL-DAG: hitObjectIsHitNV
218// CHECK_SPV-DAG: OpHitObjectIsHitNV
219        && hitObjectIsHitNV(hit) == true
220        ;
221}
222
223bool testRecordHitCalls() {
224    return true
225    && testHitObjectRecord()
226    && testHitObjectRecordIndex()
227    && testHitObjectRecordMotion()
228    && testHitObjectRecordIndexMotion()
229    ;
230}
231
232bool testHitObjectRecordMiss() {
233    hitObjectNV hit;
234// CHECK_GLSL-DAG: hitObjectRecordMissNV
235// CHECK_SPV-DAG: OpHitObjectRecordMissNV
236    hitObjectRecordMissNV(hit, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f);
237    return true
238// CHECK_GLSL-DAG: hitObjectIsMissNV
239// CHECK_SPV-DAG: OpHitObjectIsMissNV
240        && hitObjectIsMissNV(hit) == true
241        ;
242}
243
244bool testHitObjectRecordMissMotion() {
245    hitObjectNV hit;
246// CHECK_GLSL-DAG: hitObjectRecordMissMotionNV
247// CHECK_SPV-DAG: OpHitObjectRecordMissMotionNV
248    hitObjectRecordMissMotionNV(hit, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 0.0f);
249    return true
250// CHECK_GLSL-DAG: hitObjectIsMissNV
251// CHECK_SPV-DAG: OpHitObjectIsMissNV
252        && hitObjectIsMissNV(hit) == true
253        ;
254}
255
256bool testRecordMissCalls() {
257    return true
258    && testHitObjectRecordMiss()
259    && testHitObjectRecordMissMotion()
260    ;
261}
262
263bool testHitObjectRecordEmpty() {
264    hitObjectNV hit;
265// CHECK_GLSL-DAG: hitObjectRecordEmptyNV
266// CHECK_SPV-DAG: OpHitObjectRecordEmptyNV
267    hitObjectRecordEmptyNV(hit);
268    return true
269// CHECK_GLSL-DAG: hitObjectIsEmptyNV
270// CHECK_SPV-DAG: OpHitObjectIsEmptyNV
271        && hitObjectIsEmptyNV(hit) == true
272        ;
273}
274
275bool testRecordEmptyCalls() {
276    return true
277    && testHitObjectRecordEmpty()
278    ;
279}
280
281bool testTraceRayMotion() {
282// CHECK_GLSL-DAG: traceRayMotionNV
283// CHECK_SPV-DAG: OpTraceRayMotionNV
284    traceRayMotionNV(as, gl_RayFlagsNoneEXT, 0xff, 0, 0, 0, vec3(0.1, 0.1, 0.0), 0.01f, vec3(0, 0, 1), 1e4f, 0.0f, 2);
285    attrMain = vec4(1); //ensure traceRayMotionNV does not get optimized out 
286    return true &&
287        attrMain == vec4(1)
288        ;       
289}
290
291bool testPayloadReadWrite() {
292    payload = vec4(2);
293    vec4 read = payload;
294    return true
295        && read != vec4(0)
296        ;
297}
298
299bool testAttributeReadWrite() {
300    attrMain = vec4(2);
301    vec4 read = attrMain;
302    return true
303        && read != vec4(0)
304        ;
305}
306
307bool testCallableReadWrite() {
308    outcall = vec4(2);
309    vec4 read = outcall;
310    return true
311        && read != vec4(0)
312        ;
313}
314
315bool testReadWriteOfObjects(){
316    return true
317        && testPayloadReadWrite()
318        && testAttributeReadWrite()
319        && testCallableReadWrite();
320        ;       
321}
322
323void main()
324{
325    outputBuffer.data[0] = true
326        && testTraceRayCalls()
327        && testRecordHitCalls()
328        && testRecordMissCalls()
329        && testRecordEmptyCalls()
330        && testTraceRayMotion()
331        && testReadWriteOfObjects()
332        ;    
333    //BUF: 1
334}