1 // Copyright 2024 The Amber Authors.
2 // Copyright (C) 2024 Advanced Micro Devices, Inc. All rights reserved.
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or parseried.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15
16 #include "gtest/gtest.h"
17 #include "src/amberscript/parser.h"
18
19 namespace amber {
20 namespace amberscript {
21
22 using AmberScriptParserTest = testing::Test;
23
TEST_F(AmberScriptParserTest,RayTracingBlasName)24 TEST_F(AmberScriptParserTest, RayTracingBlasName) {
25 std::string in = R"(
26 ACCELERATION_STRUCTURE BOTTOM_LEVEL
27 END)";
28
29 Parser parser;
30 Result r = parser.Parse(in);
31 ASSERT_FALSE(r.IsSuccess());
32 EXPECT_EQ("3: Bottom level acceleration structure requires a name",
33 r.Error());
34 }
35
TEST_F(AmberScriptParserTest,RayTracingBlasNameDup)36 TEST_F(AmberScriptParserTest, RayTracingBlasNameDup) {
37 std::string in = R"(
38 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
39 END
40 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
41 END)";
42
43 Parser parser;
44 Result r = parser.Parse(in);
45 ASSERT_FALSE(r.IsSuccess());
46 EXPECT_EQ(
47 "4: Bottom level acceleration structure with this name already defined",
48 r.Error());
49 }
50
TEST_F(AmberScriptParserTest,RayTracingBlasNameNoEOL)51 TEST_F(AmberScriptParserTest, RayTracingBlasNameNoEOL) {
52 std::string in = R"(
53 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name END)";
54
55 Parser parser;
56 Result r = parser.Parse(in);
57 ASSERT_FALSE(r.IsSuccess());
58 EXPECT_EQ("2: New line expected", r.Error());
59 }
60
TEST_F(AmberScriptParserTest,RayTracingBlasNoEND)61 TEST_F(AmberScriptParserTest, RayTracingBlasNoEND) {
62 std::string in = R"(
63 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
64 )";
65
66 Parser parser;
67 Result r = parser.Parse(in);
68 ASSERT_FALSE(r.IsSuccess());
69 EXPECT_EQ("3: END command missing", r.Error());
70 }
71
TEST_F(AmberScriptParserTest,RayTracingBlasNoId)72 TEST_F(AmberScriptParserTest, RayTracingBlasNoId) {
73 std::string in = R"(
74 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
75 1)";
76
77 Parser parser;
78 Result r = parser.Parse(in);
79 ASSERT_FALSE(r.IsSuccess());
80 EXPECT_EQ("3: Identifier expected", r.Error());
81 }
82
TEST_F(AmberScriptParserTest,RayTracingBlasUnexpId)83 TEST_F(AmberScriptParserTest, RayTracingBlasUnexpId) {
84 std::string in = R"(
85 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
86 UNEXPECTED)";
87
88 Parser parser;
89 Result r = parser.Parse(in);
90 ASSERT_FALSE(r.IsSuccess());
91 EXPECT_EQ("3: Unexpected identifier", r.Error());
92 }
93
TEST_F(AmberScriptParserTest,RayTracingBlasUnexpGeomId)94 TEST_F(AmberScriptParserTest, RayTracingBlasUnexpGeomId) {
95 std::string in = R"(
96 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
97 GEOMETRY 1)";
98
99 Parser parser;
100 Result r = parser.Parse(in);
101 ASSERT_FALSE(r.IsSuccess());
102 EXPECT_EQ("3: Identifier expected", r.Error());
103 }
104
TEST_F(AmberScriptParserTest,RayTracingBlasUnexpGeom)105 TEST_F(AmberScriptParserTest, RayTracingBlasUnexpGeom) {
106 std::string in = R"(
107 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
108 GEOMETRY UNEXPECTED)";
109
110 Parser parser;
111 Result r = parser.Parse(in);
112 ASSERT_FALSE(r.IsSuccess());
113 EXPECT_EQ("3: Unexpected geometry type", r.Error());
114 }
115
TEST_F(AmberScriptParserTest,RayTracingBlasGeomSingleType)116 TEST_F(AmberScriptParserTest, RayTracingBlasGeomSingleType) {
117 std::string in = R"(
118 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
119 GEOMETRY TRIANGLES
120 0 0 0 0 1 0 1 0 0
121 END
122 GEOMETRY AABBS
123 0 0 0 1 1 1
124 END
125 END)";
126
127 Parser parser;
128 Result r = parser.Parse(in);
129 ASSERT_FALSE(r.IsSuccess());
130 EXPECT_EQ("9: Only one type of geometry is allowed within a BLAS", r.Error());
131 }
132
TEST_F(AmberScriptParserTest,RayTracingBlasTriangleEmpty)133 TEST_F(AmberScriptParserTest, RayTracingBlasTriangleEmpty) {
134 std::string in = R"(
135 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
136 GEOMETRY TRIANGLES
137 END
138 END)";
139
140 Parser parser;
141 Result r = parser.Parse(in);
142 ASSERT_FALSE(r.IsSuccess());
143 EXPECT_EQ("4: No triangles have been specified.", r.Error());
144 }
145
TEST_F(AmberScriptParserTest,RayTracingBlasTriangleThreeVertices)146 TEST_F(AmberScriptParserTest, RayTracingBlasTriangleThreeVertices) {
147 std::string in = R"(
148 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
149 GEOMETRY TRIANGLES
150 0.0 0.0 0.0 0.0 0.0 0.0
151 END
152 END)";
153
154 Parser parser;
155 Result r = parser.Parse(in);
156 ASSERT_FALSE(r.IsSuccess());
157 EXPECT_EQ("5: Each triangle should include three vertices.", r.Error());
158 }
159
TEST_F(AmberScriptParserTest,RayTracingBlasTriangleThreeFloats)160 TEST_F(AmberScriptParserTest, RayTracingBlasTriangleThreeFloats) {
161 std::string in = R"(
162 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
163 GEOMETRY TRIANGLES
164 0.0 0.0 0.0 0.0 0.0 0.0 0.0
165 END
166 END)";
167
168 Parser parser;
169 Result r = parser.Parse(in);
170 ASSERT_FALSE(r.IsSuccess());
171 EXPECT_EQ("5: Each vertex consists of three float coordinates.", r.Error());
172 }
173
TEST_F(AmberScriptParserTest,RayTracingBlasTriangleNoEND)174 TEST_F(AmberScriptParserTest, RayTracingBlasTriangleNoEND) {
175 std::string in = R"(
176 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
177 GEOMETRY TRIANGLES
178 )";
179
180 Parser parser;
181 Result r = parser.Parse(in);
182 ASSERT_FALSE(r.IsSuccess());
183 EXPECT_EQ("4: END expected", r.Error());
184 }
185
TEST_F(AmberScriptParserTest,RayTracingBlasTriangleUnexpDataType)186 TEST_F(AmberScriptParserTest, RayTracingBlasTriangleUnexpDataType) {
187 std::string in = R"(
188 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
189 GEOMETRY TRIANGLES "unexpected_string"
190 )";
191
192 Parser parser;
193 Result r = parser.Parse(in);
194 ASSERT_FALSE(r.IsSuccess());
195 EXPECT_EQ("3: Unexpected data type", r.Error());
196 }
197
TEST_F(AmberScriptParserTest,RayTracingBlasTriangleGeometryFlags)198 TEST_F(AmberScriptParserTest, RayTracingBlasTriangleGeometryFlags) {
199 {
200 std::string in = R"(
201 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
202 GEOMETRY TRIANGLES
203 FLAGS OPAQUE NO_DUPLICATE_ANY_HIT NO_SUCH_FLAG
204 )";
205
206 Parser parser;
207 Result r = parser.Parse(in);
208 ASSERT_FALSE(r.IsSuccess());
209 EXPECT_EQ("4: Unknown flag: NO_SUCH_FLAG", r.Error());
210 }
211 {
212 std::string in = R"(
213 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
214 GEOMETRY TRIANGLES
215 FLAGS 1
216 )";
217
218 Parser parser;
219 Result r = parser.Parse(in);
220 ASSERT_FALSE(r.IsSuccess());
221 EXPECT_EQ("4: Identifier expected", r.Error());
222 }
223 }
224
TEST_F(AmberScriptParserTest,RayTracingBlasAABBEmpty)225 TEST_F(AmberScriptParserTest, RayTracingBlasAABBEmpty) {
226 std::string in = R"(
227 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
228 GEOMETRY AABBS
229 END
230 END)";
231
232 Parser parser;
233 Result r = parser.Parse(in);
234 ASSERT_FALSE(r.IsSuccess());
235 EXPECT_EQ("4: No AABBs have been specified.", r.Error());
236 }
237
TEST_F(AmberScriptParserTest,RayTracingBlasAABBInvalidData)238 TEST_F(AmberScriptParserTest, RayTracingBlasAABBInvalidData) {
239 std::string in = R"(
240 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
241 GEOMETRY AABBS
242 0.0 0.0 0.0 0.0 0.0 0.0 0.0
243 END
244 END)";
245
246 Parser parser;
247 Result r = parser.Parse(in);
248 ASSERT_FALSE(r.IsSuccess());
249 EXPECT_EQ(
250 "5: Each vertex consists of three float coordinates. Each AABB should "
251 "include two vertices.",
252 r.Error());
253 }
254
TEST_F(AmberScriptParserTest,RayTracingBlasAABBNoEND)255 TEST_F(AmberScriptParserTest, RayTracingBlasAABBNoEND) {
256 std::string in = R"(
257 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
258 GEOMETRY AABBS
259 )";
260
261 Parser parser;
262 Result r = parser.Parse(in);
263 ASSERT_FALSE(r.IsSuccess());
264 EXPECT_EQ("4: END expected", r.Error());
265 }
266
TEST_F(AmberScriptParserTest,RayTracingBlasAABBUnexpDataType)267 TEST_F(AmberScriptParserTest, RayTracingBlasAABBUnexpDataType) {
268 std::string in = R"(
269 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
270 GEOMETRY AABBS "unexpected_string"
271 )";
272
273 Parser parser;
274 Result r = parser.Parse(in);
275 ASSERT_FALSE(r.IsSuccess());
276 EXPECT_EQ("3: Unexpected data type", r.Error());
277 }
278
TEST_F(AmberScriptParserTest,RayTracingBlasAABBGeometryFlags)279 TEST_F(AmberScriptParserTest, RayTracingBlasAABBGeometryFlags) {
280 {
281 std::string in = R"(
282 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
283 GEOMETRY AABBS
284 FLAGS OPAQUE NO_DUPLICATE_ANY_HIT NO_SUCH_FLAG
285 )";
286
287 Parser parser;
288 Result r = parser.Parse(in);
289 ASSERT_FALSE(r.IsSuccess());
290 EXPECT_EQ("4: Unknown flag: NO_SUCH_FLAG", r.Error());
291 }
292 {
293 std::string in = R"(
294 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
295 GEOMETRY AABBS
296 FLAGS 1
297 )";
298
299 Parser parser;
300 Result r = parser.Parse(in);
301 ASSERT_FALSE(r.IsSuccess());
302 EXPECT_EQ("4: Identifier expected", r.Error());
303 }
304 }
305
TEST_F(AmberScriptParserTest,RayTracingTlasName)306 TEST_F(AmberScriptParserTest, RayTracingTlasName) {
307 std::string in = R"(
308 ACCELERATION_STRUCTURE TOP_LEVEL
309 END)";
310
311 Parser parser;
312 Result r = parser.Parse(in);
313 ASSERT_FALSE(r.IsSuccess());
314 EXPECT_EQ("3: invalid TLAS name provided", r.Error());
315 }
316
TEST_F(AmberScriptParserTest,RayTracingTlasNameDup)317 TEST_F(AmberScriptParserTest, RayTracingTlasNameDup) {
318 std::string in = R"(
319 ACCELERATION_STRUCTURE TOP_LEVEL tlas_name
320 END
321 ACCELERATION_STRUCTURE TOP_LEVEL tlas_name
322 END)";
323
324 Parser parser;
325 Result r = parser.Parse(in);
326 ASSERT_FALSE(r.IsSuccess());
327 EXPECT_EQ("5: duplicate TLAS name provided", r.Error());
328 }
329
TEST_F(AmberScriptParserTest,RayTracingTlasNameNoEOL)330 TEST_F(AmberScriptParserTest, RayTracingTlasNameNoEOL) {
331 std::string in = R"(
332 ACCELERATION_STRUCTURE TOP_LEVEL tlas_name END)";
333
334 Parser parser;
335 Result r = parser.Parse(in);
336 ASSERT_FALSE(r.IsSuccess());
337 EXPECT_EQ("2: New line expected", r.Error());
338 }
339
TEST_F(AmberScriptParserTest,RayTracingTlasNoEND)340 TEST_F(AmberScriptParserTest, RayTracingTlasNoEND) {
341 std::string in = R"(
342 ACCELERATION_STRUCTURE TOP_LEVEL tlas_name
343 )";
344
345 Parser parser;
346 Result r = parser.Parse(in);
347 ASSERT_FALSE(r.IsSuccess());
348 EXPECT_EQ("3: END command missing", r.Error());
349 }
350
TEST_F(AmberScriptParserTest,RayTracingTlasNoId)351 TEST_F(AmberScriptParserTest, RayTracingTlasNoId) {
352 std::string in = R"(
353 ACCELERATION_STRUCTURE TOP_LEVEL tlas_name
354 1)";
355
356 Parser parser;
357 Result r = parser.Parse(in);
358 ASSERT_FALSE(r.IsSuccess());
359 EXPECT_EQ("3: expected identifier", r.Error());
360 }
361
TEST_F(AmberScriptParserTest,RayTracingTlasUnexpId)362 TEST_F(AmberScriptParserTest, RayTracingTlasUnexpId) {
363 std::string in = R"(
364 ACCELERATION_STRUCTURE TOP_LEVEL tlas_name
365 UNEXPECTED)";
366
367 Parser parser;
368 Result r = parser.Parse(in);
369 ASSERT_FALSE(r.IsSuccess());
370 EXPECT_EQ("3: unknown token: UNEXPECTED", r.Error());
371 }
372
TEST_F(AmberScriptParserTest,RayTracingTlasBlasInstNoName)373 TEST_F(AmberScriptParserTest, RayTracingTlasBlasInstNoName) {
374 std::string in = R"(
375 ACCELERATION_STRUCTURE TOP_LEVEL tlas1
376 BOTTOM_LEVEL_INSTANCE)";
377
378 Parser parser;
379 Result r = parser.Parse(in);
380 ASSERT_FALSE(r.IsSuccess());
381 EXPECT_EQ("3: Bottom level acceleration structure name expected", r.Error());
382 }
383
TEST_F(AmberScriptParserTest,RayTracingTlasBlasInstNoBlas)384 TEST_F(AmberScriptParserTest, RayTracingTlasBlasInstNoBlas) {
385 std::string in = R"(
386 ACCELERATION_STRUCTURE TOP_LEVEL tlas1
387 BOTTOM_LEVEL_INSTANCE blas1)";
388
389 Parser parser;
390 Result r = parser.Parse(in);
391 ASSERT_FALSE(r.IsSuccess());
392 EXPECT_EQ("3: Bottom level acceleration structure with given name not found",
393 r.Error());
394 }
395
TEST_F(AmberScriptParserTest,RayTracingTlasBlasInstUnexpEnd)396 TEST_F(AmberScriptParserTest, RayTracingTlasBlasInstUnexpEnd) {
397 std::string in = R"(
398 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
399 GEOMETRY AABBS
400 0.0 0.0 0.0 1.0 1.0 1.0
401 END
402 END
403
404 ACCELERATION_STRUCTURE TOP_LEVEL tlas1
405 BOTTOM_LEVEL_INSTANCE blas_name)";
406
407 Parser parser;
408 Result r = parser.Parse(in);
409 ASSERT_FALSE(r.IsSuccess());
410 EXPECT_EQ("9: Unexpected end", r.Error());
411 }
412
TEST_F(AmberScriptParserTest,RayTracingTlasBlasInstExpId)413 TEST_F(AmberScriptParserTest, RayTracingTlasBlasInstExpId) {
414 std::string in = R"(
415 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
416 GEOMETRY AABBS
417 0.0 0.0 0.0 1.0 1.0 1.0
418 END
419 END
420
421 ACCELERATION_STRUCTURE TOP_LEVEL tlas1
422 BOTTOM_LEVEL_INSTANCE blas_name 1)";
423
424 Parser parser;
425 Result r = parser.Parse(in);
426 ASSERT_FALSE(r.IsSuccess());
427 EXPECT_EQ("9: expected identifier", r.Error());
428 }
429
TEST_F(AmberScriptParserTest,RayTracingTlasBlasInstInvalidToken)430 TEST_F(AmberScriptParserTest, RayTracingTlasBlasInstInvalidToken) {
431 std::string in = R"(
432 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
433 GEOMETRY AABBS
434 0.0 0.0 0.0 1.0 1.0 1.0
435 END
436 END
437
438 ACCELERATION_STRUCTURE TOP_LEVEL tlas1
439 BOTTOM_LEVEL_INSTANCE blas_name TOKEN)";
440
441 Parser parser;
442 Result r = parser.Parse(in);
443 ASSERT_FALSE(r.IsSuccess());
444 EXPECT_EQ("9: Unknown token in BOTTOM_LEVEL_INSTANCE block: TOKEN",
445 r.Error());
446 }
447
TEST_F(AmberScriptParserTest,RayTracingTlasBlasInstMask)448 TEST_F(AmberScriptParserTest, RayTracingTlasBlasInstMask) {
449 std::string in = R"(
450 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
451 GEOMETRY AABBS
452 0.0 0.0 0.0 1.0 1.0 1.0
453 END
454 END
455
456 ACCELERATION_STRUCTURE TOP_LEVEL tlas1
457 BOTTOM_LEVEL_INSTANCE blas_name MASK no_mask)";
458
459 Parser parser;
460 Result r = parser.Parse(in);
461 ASSERT_FALSE(r.IsSuccess());
462 EXPECT_EQ("9: Integer or hex value expected", r.Error());
463 }
464
TEST_F(AmberScriptParserTest,RayTracingTlasBlasInstOffset)465 TEST_F(AmberScriptParserTest, RayTracingTlasBlasInstOffset) {
466 std::string in = R"(
467 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
468 GEOMETRY AABBS
469 0.0 0.0 0.0 1.0 1.0 1.0
470 END
471 END
472
473 ACCELERATION_STRUCTURE TOP_LEVEL tlas1
474 BOTTOM_LEVEL_INSTANCE blas_name OFFSET no_offset)";
475
476 Parser parser;
477 Result r = parser.Parse(in);
478 ASSERT_FALSE(r.IsSuccess());
479 EXPECT_EQ("9: Integer or hex value expected", r.Error());
480 }
481
TEST_F(AmberScriptParserTest,RayTracingTlasBlasInstIndex)482 TEST_F(AmberScriptParserTest, RayTracingTlasBlasInstIndex) {
483 std::string in = R"(
484 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
485 GEOMETRY AABBS
486 0.0 0.0 0.0 1.0 1.0 1.0
487 END
488 END
489
490 ACCELERATION_STRUCTURE TOP_LEVEL tlas1
491 BOTTOM_LEVEL_INSTANCE blas_name INDEX no_index)";
492
493 Parser parser;
494 Result r = parser.Parse(in);
495 ASSERT_FALSE(r.IsSuccess());
496 EXPECT_EQ("9: Integer or hex value expected", r.Error());
497 }
498
TEST_F(AmberScriptParserTest,RayTracingTlasBlasInstFlagsEmpty)499 TEST_F(AmberScriptParserTest, RayTracingTlasBlasInstFlagsEmpty) {
500 std::string in = R"(
501 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
502 GEOMETRY AABBS
503 0.0 0.0 0.0 1.0 1.0 1.0
504 END
505 END
506
507 ACCELERATION_STRUCTURE TOP_LEVEL tlas1
508 BOTTOM_LEVEL_INSTANCE blas_name FLAGS)";
509
510 Parser parser;
511 Result r = parser.Parse(in);
512 ASSERT_FALSE(r.IsSuccess());
513 EXPECT_EQ("9: END command missing", r.Error());
514 }
515
TEST_F(AmberScriptParserTest,RayTracingTlasBlasInstFlagsUnkFlag)516 TEST_F(AmberScriptParserTest, RayTracingTlasBlasInstFlagsUnkFlag) {
517 std::string in = R"(
518 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
519 GEOMETRY AABBS
520 0.0 0.0 0.0 1.0 1.0 1.0
521 END
522 END
523
524 ACCELERATION_STRUCTURE TOP_LEVEL tlas1
525 BOTTOM_LEVEL_INSTANCE blas_name FLAGS 16 0x0F NO_SUCH_FLAG)";
526
527 Parser parser;
528 Result r = parser.Parse(in);
529 ASSERT_FALSE(r.IsSuccess());
530 EXPECT_EQ("9: Unknown flag: NO_SUCH_FLAG", r.Error());
531 }
532
TEST_F(AmberScriptParserTest,RayTracingTlasBlasInstFlagsIdExp)533 TEST_F(AmberScriptParserTest, RayTracingTlasBlasInstFlagsIdExp) {
534 std::string in = R"(
535 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
536 GEOMETRY AABBS
537 0.0 0.0 0.0 1.0 1.0 1.0
538 END
539 END
540
541 ACCELERATION_STRUCTURE TOP_LEVEL tlas1
542 BOTTOM_LEVEL_INSTANCE blas_name FLAGS "no_id")";
543
544 Parser parser;
545 Result r = parser.Parse(in);
546 ASSERT_FALSE(r.IsSuccess());
547 EXPECT_EQ("9: Identifier expected", r.Error());
548 }
549
TEST_F(AmberScriptParserTest,RayTracingTlasBlasInstTransformNoEnd)550 TEST_F(AmberScriptParserTest, RayTracingTlasBlasInstTransformNoEnd) {
551 std::string in = R"(
552 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
553 GEOMETRY AABBS
554 0.0 0.0 0.0 1.0 1.0 1.0
555 END
556 END
557
558 ACCELERATION_STRUCTURE TOP_LEVEL tlas1
559 BOTTOM_LEVEL_INSTANCE blas_name
560 TRANSFORM
561 1 0 0 0 0 1 0 0 0 0 1 0
562 )";
563
564 Parser parser;
565 Result r = parser.Parse(in);
566 ASSERT_FALSE(r.IsSuccess());
567 EXPECT_EQ("12: END command missing", r.Error());
568 }
569
TEST_F(AmberScriptParserTest,RayTracingTlasBlasInstTransformUnknownToken)570 TEST_F(AmberScriptParserTest, RayTracingTlasBlasInstTransformUnknownToken) {
571 std::string in = R"(
572 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
573 GEOMETRY AABBS
574 0.0 0.0 0.0 1.0 1.0 1.0
575 END
576 END
577
578 ACCELERATION_STRUCTURE TOP_LEVEL tlas1
579 BOTTOM_LEVEL_INSTANCE blas_name TRANSFORM
580 INVALID_TOKEN
581 )";
582
583 Parser parser;
584 Result r = parser.Parse(in);
585 ASSERT_FALSE(r.IsSuccess());
586 EXPECT_EQ("10: Unknown token: INVALID_TOKEN", r.Error());
587 }
588
TEST_F(AmberScriptParserTest,RayTracingTlasBlasInstTransformIncomplete)589 TEST_F(AmberScriptParserTest, RayTracingTlasBlasInstTransformIncomplete) {
590 std::string in = R"(
591 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
592 GEOMETRY AABBS
593 0.0 0.0 0.0 1.0 1.0 1.0
594 END
595 END
596
597 ACCELERATION_STRUCTURE TOP_LEVEL tlas1
598 BOTTOM_LEVEL_INSTANCE blas_name TRANSFORM
599 1 2
600 END
601 )";
602
603 Parser parser;
604 Result r = parser.Parse(in);
605 ASSERT_FALSE(r.IsSuccess());
606 EXPECT_EQ("11: Transform matrix expected to have 12 numbers", r.Error());
607 }
608
TEST_F(AmberScriptParserTest,RayTracingPipelineBind)609 TEST_F(AmberScriptParserTest, RayTracingPipelineBind) {
610 std::string in = R"(
611 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
612 GEOMETRY AABBS
613 0.0 0.0 0.0 1.0 1.0 1.0
614 END
615 END
616
617 ACCELERATION_STRUCTURE TOP_LEVEL tlas1
618 BOTTOM_LEVEL_INSTANCE blas_name
619 END
620 END
621
622 PIPELINE raytracing my_rtpipeline
623 BIND 0 tlas1 DESCRIPTOR_SET 0 BINDING 0
624 END
625 )";
626
627 Parser parser;
628 Result r = parser.Parse(in);
629 ASSERT_FALSE(r.IsSuccess());
630 EXPECT_EQ(
631 "14: missing BUFFER, BUFFER_ARRAY, SAMPLER, SAMPLER_ARRAY, or "
632 "ACCELERATION_STRUCTURE in BIND command",
633 r.Error());
634 }
635
TEST_F(AmberScriptParserTest,RayTracingPipelineBindNothing)636 TEST_F(AmberScriptParserTest, RayTracingPipelineBindNothing) {
637 std::string in = R"(
638 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
639 GEOMETRY AABBS
640 0.0 0.0 0.0 1.0 1.0 1.0
641 END
642 END
643
644 ACCELERATION_STRUCTURE TOP_LEVEL tlas1
645 BOTTOM_LEVEL_INSTANCE blas_name
646 END
647 END
648
649 PIPELINE raytracing my_rtpipeline
650 BIND ACCELERATION_STRUCTURE 0
651 END
652 )";
653
654 Parser parser;
655 Result r = parser.Parse(in);
656 ASSERT_FALSE(r.IsSuccess());
657 EXPECT_EQ("14: missing top level acceleration structure name in BIND command",
658 r.Error());
659 }
660
TEST_F(AmberScriptParserTest,RayTracingPipelineBindNoTlas)661 TEST_F(AmberScriptParserTest, RayTracingPipelineBindNoTlas) {
662 std::string in = R"(
663 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
664 GEOMETRY AABBS
665 0.0 0.0 0.0 1.0 1.0 1.0
666 END
667 END
668
669 ACCELERATION_STRUCTURE TOP_LEVEL tlas1
670 BOTTOM_LEVEL_INSTANCE blas_name
671 END
672 END
673
674 PIPELINE raytracing my_rtpipeline
675 BIND ACCELERATION_STRUCTURE no_tlas
676 END
677 )";
678
679 Parser parser;
680 Result r = parser.Parse(in);
681 ASSERT_FALSE(r.IsSuccess());
682 EXPECT_EQ("14: unknown top level acceleration structure: no_tlas", r.Error());
683 }
684
TEST_F(AmberScriptParserTest,RayTracingPipelineBindNoSetOrBinding)685 TEST_F(AmberScriptParserTest, RayTracingPipelineBindNoSetOrBinding) {
686 std::string in = R"(
687 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
688 GEOMETRY AABBS
689 0.0 0.0 0.0 1.0 1.0 1.0
690 END
691 END
692
693 ACCELERATION_STRUCTURE TOP_LEVEL tlas1
694 BOTTOM_LEVEL_INSTANCE blas_name
695 END
696 END
697
698 PIPELINE raytracing my_rtpipeline
699 BIND ACCELERATION_STRUCTURE tlas1 NO_TOKEN
700 END
701 )";
702
703 Parser parser;
704 Result r = parser.Parse(in);
705 ASSERT_FALSE(r.IsSuccess());
706 EXPECT_EQ("14: missing DESCRIPTOR_SET or BINDING in BIND command", r.Error());
707 }
708
TEST_F(AmberScriptParserTest,RayTracingPipelineBindBadSet)709 TEST_F(AmberScriptParserTest, RayTracingPipelineBindBadSet) {
710 std::string in = R"(
711 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
712 GEOMETRY AABBS
713 0.0 0.0 0.0 1.0 1.0 1.0
714 END
715 END
716
717 ACCELERATION_STRUCTURE TOP_LEVEL tlas1
718 BOTTOM_LEVEL_INSTANCE blas_name
719 END
720 END
721
722 PIPELINE raytracing my_rtpipeline
723 BIND ACCELERATION_STRUCTURE tlas1 DESCRIPTOR_SET 0.0
724 END
725 )";
726
727 Parser parser;
728 Result r = parser.Parse(in);
729 ASSERT_FALSE(r.IsSuccess());
730 EXPECT_EQ("14: invalid value for DESCRIPTOR_SET in BIND command", r.Error());
731 }
732
TEST_F(AmberScriptParserTest,RayTracingPipelineBindBadBindingKeyword)733 TEST_F(AmberScriptParserTest, RayTracingPipelineBindBadBindingKeyword) {
734 std::string in = R"(
735 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
736 GEOMETRY AABBS
737 0.0 0.0 0.0 1.0 1.0 1.0
738 END
739 END
740
741 ACCELERATION_STRUCTURE TOP_LEVEL tlas1
742 BOTTOM_LEVEL_INSTANCE blas_name
743 END
744 END
745
746 PIPELINE raytracing my_rtpipeline
747 BIND ACCELERATION_STRUCTURE tlas1 DESCRIPTOR_SET 0 NOT_BINDING
748 END
749 )";
750
751 Parser parser;
752 Result r = parser.Parse(in);
753 ASSERT_FALSE(r.IsSuccess());
754 EXPECT_EQ("14: missing BINDING for BIND command", r.Error());
755 }
756
TEST_F(AmberScriptParserTest,RayTracingPipelineBindBadBindingValue)757 TEST_F(AmberScriptParserTest, RayTracingPipelineBindBadBindingValue) {
758 std::string in = R"(
759 ACCELERATION_STRUCTURE BOTTOM_LEVEL blas_name
760 GEOMETRY AABBS
761 0.0 0.0 0.0 1.0 1.0 1.0
762 END
763 END
764
765 ACCELERATION_STRUCTURE TOP_LEVEL tlas1
766 BOTTOM_LEVEL_INSTANCE blas_name
767 END
768 END
769
770 PIPELINE raytracing my_rtpipeline
771 BIND ACCELERATION_STRUCTURE tlas1 DESCRIPTOR_SET 0 BINDING 0.0
772 END
773 )";
774
775 Parser parser;
776 Result r = parser.Parse(in);
777 ASSERT_FALSE(r.IsSuccess());
778 EXPECT_EQ("14: invalid value for BINDING in BIND command", r.Error());
779 }
780
TEST_F(AmberScriptParserTest,RayTracingPipelineBindShaderGroupNoName)781 TEST_F(AmberScriptParserTest, RayTracingPipelineBindShaderGroupNoName) {
782 std::string in = R"(
783 PIPELINE raytracing my_rtpipeline
784 SHADER_GROUP 1
785 END
786 )";
787
788 Parser parser;
789 Result r = parser.Parse(in);
790 ASSERT_FALSE(r.IsSuccess());
791 EXPECT_EQ("3: Group name expected", r.Error());
792 }
793
TEST_F(AmberScriptParserTest,RayTracingPipelineBindShaderGroupNoNameDup)794 TEST_F(AmberScriptParserTest, RayTracingPipelineBindShaderGroupNoNameDup) {
795 std::string in = R"(
796 SHADER ray_generation raygen1 GLSL
797 #version 460 core
798 void main() {}
799 END
800
801 PIPELINE raytracing my_rtpipeline
802 SHADER_GROUP group raygen1
803 SHADER_GROUP group raygen1
804 END
805 )";
806
807 Parser parser;
808 Result r = parser.Parse(in);
809 ASSERT_FALSE(r.IsSuccess());
810 EXPECT_EQ("9: Group name already exists", r.Error());
811 }
812
TEST_F(AmberScriptParserTest,RayTracingPipelineBindShaderGroupEmpty)813 TEST_F(AmberScriptParserTest, RayTracingPipelineBindShaderGroupEmpty) {
814 std::string in = R"(
815 PIPELINE raytracing my_rtpipeline
816 SHADER_GROUP group
817 END
818 )";
819
820 Parser parser;
821 Result r = parser.Parse(in);
822 ASSERT_TRUE(r.IsSuccess());
823 }
824
TEST_F(AmberScriptParserTest,RayTracingPipelineBindShaderGroupNoShaderName)825 TEST_F(AmberScriptParserTest, RayTracingPipelineBindShaderGroupNoShaderName) {
826 std::string in = R"(
827 PIPELINE raytracing my_rtpipeline
828 SHADER_GROUP group 1
829 END
830 )";
831
832 Parser parser;
833 Result r = parser.Parse(in);
834 ASSERT_FALSE(r.IsSuccess());
835 EXPECT_EQ("3: Shader name expected", r.Error());
836 }
837
TEST_F(AmberScriptParserTest,RayTracingPipelineBindShaderGroupNoShader)838 TEST_F(AmberScriptParserTest, RayTracingPipelineBindShaderGroupNoShader) {
839 std::string in = R"(
840 PIPELINE raytracing my_rtpipeline
841 SHADER_GROUP group no_shader
842 END
843 )";
844
845 Parser parser;
846 Result r = parser.Parse(in);
847 ASSERT_FALSE(r.IsSuccess());
848 EXPECT_EQ("3: Shader not found: no_shader", r.Error());
849 }
850
TEST_F(AmberScriptParserTest,RayTracingPipelineBindShaderGroupInvalidShader)851 TEST_F(AmberScriptParserTest, RayTracingPipelineBindShaderGroupInvalidShader) {
852 std::string in = R"(
853 SHADER vertex vertex1 GLSL
854 #version 460 core
855 void main() {}
856 END
857
858 PIPELINE raytracing my_rtpipeline
859 SHADER_GROUP group vertex1
860 END
861 )";
862
863 Parser parser;
864 Result r = parser.Parse(in);
865 ASSERT_FALSE(r.IsSuccess());
866 EXPECT_EQ("8: Shader must be of raytracing type", r.Error());
867 }
868
TEST_F(AmberScriptParserTest,RayTracingPipelineBindShaderGroupTwoGeneral)869 TEST_F(AmberScriptParserTest, RayTracingPipelineBindShaderGroupTwoGeneral) {
870 std::string in = R"(
871 SHADER ray_generation raygen1 GLSL
872 #version 460 core
873 void main() {}
874 END
875
876 SHADER ray_generation raygen2 GLSL
877 #version 460 core
878 void main() {}
879 END
880
881 PIPELINE raytracing my_rtpipeline
882 SHADER_GROUP group raygen1 raygen2
883 END
884 )";
885
886 Parser parser;
887 Result r = parser.Parse(in);
888 ASSERT_FALSE(r.IsSuccess());
889 EXPECT_EQ("13: Two general shaders cannot be in one group", r.Error());
890 }
891
TEST_F(AmberScriptParserTest,RayTracingPipelineBindShaderGroupAddGenToHit)892 TEST_F(AmberScriptParserTest, RayTracingPipelineBindShaderGroupAddGenToHit) {
893 std::string in = R"(
894 SHADER ray_generation raygen1 GLSL
895 #version 460 core
896 void main() {}
897 END
898
899 SHADER intersection intersection1 GLSL
900 #version 460 core
901 void main() {}
902 END
903
904 PIPELINE raytracing my_rtpipeline
905 SHADER_GROUP hit_group intersection1 raygen1
906 END
907 )";
908
909 Parser parser;
910 Result r = parser.Parse(in);
911 ASSERT_FALSE(r.IsSuccess());
912 EXPECT_EQ("13: Hit group cannot contain general shaders", r.Error());
913 }
914
TEST_F(AmberScriptParserTest,RayTracingPipelineBindShaderGroupAddAHitToGen)915 TEST_F(AmberScriptParserTest, RayTracingPipelineBindShaderGroupAddAHitToGen) {
916 std::string in = R"(
917 SHADER ray_generation raygen1 GLSL
918 #version 460 core
919 void main() {}
920 END
921
922 SHADER any_hit ahit1 GLSL
923 #version 460 core
924 void main() {}
925 END
926
927 PIPELINE raytracing my_rtpipeline
928 SHADER_GROUP gen_group raygen1 ahit1
929 END
930 )";
931
932 Parser parser;
933 Result r = parser.Parse(in);
934 ASSERT_FALSE(r.IsSuccess());
935 EXPECT_EQ("13: General group cannot contain any hit shaders", r.Error());
936 }
937
TEST_F(AmberScriptParserTest,RayTracingPipelineBindShaderGroupAddCHitToGen)938 TEST_F(AmberScriptParserTest, RayTracingPipelineBindShaderGroupAddCHitToGen) {
939 std::string in = R"(
940 SHADER ray_generation raygen1 GLSL
941 #version 460 core
942 void main() {}
943 END
944
945 SHADER closest_hit chit1 GLSL
946 #version 460 core
947 void main() {}
948 END
949
950 PIPELINE raytracing my_rtpipeline
951 SHADER_GROUP gen_group raygen1 chit1
952 END
953 )";
954
955 Parser parser;
956 Result r = parser.Parse(in);
957 ASSERT_FALSE(r.IsSuccess());
958 EXPECT_EQ("13: General group cannot contain closest hit shaders", r.Error());
959 }
960
TEST_F(AmberScriptParserTest,RayTracingPipelineBindShaderGroupAddSectToGen)961 TEST_F(AmberScriptParserTest, RayTracingPipelineBindShaderGroupAddSectToGen) {
962 std::string in = R"(
963 SHADER ray_generation raygen1 GLSL
964 #version 460 core
965 void main() {}
966 END
967
968 SHADER intersection sect1 GLSL
969 #version 460 core
970 void main() {}
971 END
972
973 PIPELINE raytracing my_rtpipeline
974 SHADER_GROUP gen_group raygen1 sect1
975 END
976 )";
977
978 Parser parser;
979 Result r = parser.Parse(in);
980 ASSERT_FALSE(r.IsSuccess());
981 EXPECT_EQ("13: General group cannot contain intersection shaders", r.Error());
982 }
983
TEST_F(AmberScriptParserTest,RayTracingPipelineBindShaderGroupAHitDouble)984 TEST_F(AmberScriptParserTest, RayTracingPipelineBindShaderGroupAHitDouble) {
985 std::string in = R"(
986 SHADER any_hit ahit1 GLSL
987 #version 460 core
988 void main() {}
989 END
990
991 SHADER any_hit ahit2 GLSL
992 #version 460 core
993 void main() {}
994 END
995
996 PIPELINE raytracing my_rtpipeline
997 SHADER_GROUP gen_group ahit1 ahit2
998 END
999 )";
1000
1001 Parser parser;
1002 Result r = parser.Parse(in);
1003 ASSERT_FALSE(r.IsSuccess());
1004 EXPECT_EQ("13: Two any hit shaders cannot be in one group", r.Error());
1005 }
1006
TEST_F(AmberScriptParserTest,RayTracingPipelineBindShaderGroupCHitDouble)1007 TEST_F(AmberScriptParserTest, RayTracingPipelineBindShaderGroupCHitDouble) {
1008 std::string in = R"(
1009 SHADER closest_hit chit1 GLSL
1010 #version 460 core
1011 void main() {}
1012 END
1013
1014 SHADER closest_hit chit2 GLSL
1015 #version 460 core
1016 void main() {}
1017 END
1018
1019 PIPELINE raytracing my_rtpipeline
1020 SHADER_GROUP gen_group chit1 chit2
1021 END
1022 )";
1023
1024 Parser parser;
1025 Result r = parser.Parse(in);
1026 ASSERT_FALSE(r.IsSuccess());
1027 EXPECT_EQ("13: Two closest hit shaders cannot be in one group", r.Error());
1028 }
1029
TEST_F(AmberScriptParserTest,RayTracingPipelineBindShaderGroupSectDouble)1030 TEST_F(AmberScriptParserTest, RayTracingPipelineBindShaderGroupSectDouble) {
1031 std::string in = R"(
1032 SHADER intersection sect1 GLSL
1033 #version 460 core
1034 void main() {}
1035 END
1036
1037 SHADER intersection sect2 GLSL
1038 #version 460 core
1039 void main() {}
1040 END
1041
1042 PIPELINE raytracing my_rtpipeline
1043 SHADER_GROUP gen_group sect1 sect2
1044 END
1045 )";
1046
1047 Parser parser;
1048 Result r = parser.Parse(in);
1049 ASSERT_FALSE(r.IsSuccess());
1050 EXPECT_EQ("13: Two intersection shaders cannot be in one group", r.Error());
1051 }
1052
TEST_F(AmberScriptParserTest,RayTracingPipelineSBTNoName)1053 TEST_F(AmberScriptParserTest, RayTracingPipelineSBTNoName) {
1054 std::string in = R"(
1055 PIPELINE raytracing my_rtpipeline
1056 SHADER_BINDING_TABLE
1057 )";
1058
1059 Parser parser;
1060 Result r = parser.Parse(in);
1061 ASSERT_FALSE(r.IsSuccess());
1062 EXPECT_EQ("4: SHADER_BINDINGS_TABLE requires a name", r.Error());
1063 }
1064
TEST_F(AmberScriptParserTest,RayTracingPipelineSBTDup)1065 TEST_F(AmberScriptParserTest, RayTracingPipelineSBTDup) {
1066 std::string in = R"(
1067 SHADER ray_generation raygen1 GLSL
1068 #version 460 core
1069 void main() {}
1070 END
1071
1072 PIPELINE raytracing my_rtpipeline
1073 SHADER_GROUP gen_group raygen1
1074 SHADER_BINDING_TABLE sbt1
1075 END
1076 SHADER_BINDING_TABLE sbt1
1077 END
1078 END
1079 )";
1080
1081 Parser parser;
1082 Result r = parser.Parse(in);
1083 ASSERT_FALSE(r.IsSuccess());
1084 EXPECT_EQ("11: SHADER_BINDINGS_TABLE with this name already defined",
1085 r.Error());
1086 }
1087
TEST_F(AmberScriptParserTest,RayTracingPipelineSBTExtraToken)1088 TEST_F(AmberScriptParserTest, RayTracingPipelineSBTExtraToken) {
1089 std::string in = R"(
1090 PIPELINE raytracing my_rtpipeline
1091 SHADER_BINDING_TABLE sbt1 extra_token
1092 )";
1093
1094 Parser parser;
1095 Result r = parser.Parse(in);
1096 ASSERT_FALSE(r.IsSuccess());
1097 EXPECT_EQ("3: New line expected", r.Error());
1098 }
1099
TEST_F(AmberScriptParserTest,RayTracingPipelineSBTNoEnd)1100 TEST_F(AmberScriptParserTest, RayTracingPipelineSBTNoEnd) {
1101 std::string in = R"(
1102 PIPELINE raytracing my_rtpipeline
1103 SHADER_BINDING_TABLE sbt1
1104 )";
1105
1106 Parser parser;
1107 Result r = parser.Parse(in);
1108 ASSERT_FALSE(r.IsSuccess());
1109 EXPECT_EQ("4: END command missing", r.Error());
1110 }
1111
TEST_F(AmberScriptParserTest,RayTracingPipelineSBTNoId)1112 TEST_F(AmberScriptParserTest, RayTracingPipelineSBTNoId) {
1113 std::string in = R"(
1114 PIPELINE raytracing my_rtpipeline
1115 SHADER_BINDING_TABLE sbt1
1116 0
1117 )";
1118
1119 Parser parser;
1120 Result r = parser.Parse(in);
1121 ASSERT_FALSE(r.IsSuccess());
1122 EXPECT_EQ("4: Identifier expected", r.Error());
1123 }
1124
TEST_F(AmberScriptParserTest,RayTracingRun)1125 TEST_F(AmberScriptParserTest, RayTracingRun) {
1126 std::string in = R"(
1127 SHADER ray_generation raygen1 GLSL
1128 #version 460 core
1129 void main() {}
1130 END
1131
1132 PIPELINE raytracing my_rtpipeline
1133 SHADER_GROUP g1 raygen1
1134 SHADER_BINDING_TABLE sbt1
1135 g1
1136 END
1137 END
1138
1139 RUN my_rtpipeline RAYGEN sbt1 1 1 z
1140 )";
1141
1142 Parser parser;
1143 Result r = parser.Parse(in);
1144 ASSERT_FALSE(r.IsSuccess());
1145 EXPECT_EQ("14: invalid parameter for RUN command: z", r.Error());
1146 }
1147
TEST_F(AmberScriptParserTest,RayTracingRunIncomplete)1148 TEST_F(AmberScriptParserTest, RayTracingRunIncomplete) {
1149 std::string in = R"(
1150 SHADER ray_generation raygen1 GLSL
1151 #version 460 core
1152 void main() {}
1153 END
1154
1155 PIPELINE raytracing my_rtpipeline
1156 SHADER_GROUP g1 raygen1
1157 SHADER_BINDING_TABLE sbt1
1158 g1
1159 END
1160 END
1161
1162 RUN my_rtpipeline
1163 )";
1164
1165 Parser parser;
1166 Result r = parser.Parse(in);
1167 ASSERT_FALSE(r.IsSuccess());
1168 EXPECT_EQ("15: Incomplete RUN command", r.Error());
1169 }
1170
TEST_F(AmberScriptParserTest,RayTracingRunExpectsSBTType)1171 TEST_F(AmberScriptParserTest, RayTracingRunExpectsSBTType) {
1172 std::string in = R"(
1173 SHADER ray_generation raygen1 GLSL
1174 #version 460 core
1175 void main() {}
1176 END
1177
1178 PIPELINE raytracing my_rtpipeline
1179 SHADER_GROUP g1 raygen1
1180 SHADER_BINDING_TABLE sbt1
1181 g1
1182 END
1183 END
1184
1185 RUN my_rtpipeline 0.0
1186 )";
1187
1188 Parser parser;
1189 Result r = parser.Parse(in);
1190 ASSERT_FALSE(r.IsSuccess());
1191 EXPECT_EQ("14: Shader binding table type is expected", r.Error());
1192 }
1193
1194
TEST_F(AmberScriptParserTest,RayTracingRunExpectsSBTName)1195 TEST_F(AmberScriptParserTest, RayTracingRunExpectsSBTName) {
1196 std::string in = R"(
1197 SHADER ray_generation raygen1 GLSL
1198 #version 460 core
1199 void main() {}
1200 END
1201
1202 PIPELINE raytracing my_rtpipeline
1203 SHADER_GROUP g1 raygen1
1204 SHADER_BINDING_TABLE sbt1
1205 g1
1206 END
1207 END
1208
1209 RUN my_rtpipeline RAYGEN 0.0
1210 )";
1211
1212 Parser parser;
1213 Result r = parser.Parse(in);
1214 ASSERT_FALSE(r.IsSuccess());
1215 EXPECT_EQ("14: Shader binding table name expected", r.Error());
1216 }
1217
TEST_F(AmberScriptParserTest,RayTracingRunExpectsSBTUndefined)1218 TEST_F(AmberScriptParserTest, RayTracingRunExpectsSBTUndefined) {
1219 std::string in = R"(
1220 PIPELINE raytracing my_rtpipeline
1221 END
1222 RUN my_rtpipeline RAYGEN sbt3
1223 )";
1224
1225 Parser parser;
1226 Result r = parser.Parse(in);
1227 ASSERT_FALSE(r.IsSuccess());
1228 EXPECT_EQ("4: Shader binding table with this name was not defined",
1229 r.Error());
1230 }
1231
TEST_F(AmberScriptParserTest,RayTracingRunExpectsSBTUnknownType)1232 TEST_F(AmberScriptParserTest, RayTracingRunExpectsSBTUnknownType) {
1233 std::string in = R"(
1234 SHADER ray_generation raygen1 GLSL
1235 #version 460 core
1236 void main() {}
1237 END
1238
1239 PIPELINE raytracing my_rtpipeline
1240 SHADER_GROUP g1 raygen1
1241 SHADER_BINDING_TABLE sbt1
1242 g1
1243 END
1244 END
1245
1246 RUN my_rtpipeline RAYGEN2 sbt1
1247 )";
1248
1249 Parser parser;
1250 Result r = parser.Parse(in);
1251 ASSERT_FALSE(r.IsSuccess());
1252 EXPECT_EQ("14: Unknown shader binding table type", r.Error());
1253 }
1254
TEST_F(AmberScriptParserTest,RayTracingRunSBTRGenDup)1255 TEST_F(AmberScriptParserTest, RayTracingRunSBTRGenDup) {
1256 std::string in = R"(
1257 SHADER ray_generation raygen1 GLSL
1258 #version 460 core
1259 void main() {}
1260 END
1261
1262 PIPELINE raytracing my_rtpipeline
1263 SHADER_GROUP g1 raygen1
1264 SHADER_BINDING_TABLE sbt1
1265 g1
1266 END
1267 END
1268
1269 RUN my_rtpipeline RAYGEN sbt1 RAYGEN sbt1
1270 )";
1271
1272 Parser parser;
1273 Result r = parser.Parse(in);
1274 ASSERT_FALSE(r.IsSuccess());
1275 EXPECT_EQ("14: RAYGEN shader binding table can specified only once",
1276 r.Error());
1277 }
1278
TEST_F(AmberScriptParserTest,RayTracingRunSBTMissDup)1279 TEST_F(AmberScriptParserTest, RayTracingRunSBTMissDup) {
1280 std::string in = R"(
1281 SHADER miss miss1 GLSL
1282 #version 460 core
1283 void main() {}
1284 END
1285
1286 PIPELINE raytracing my_rtpipeline
1287 SHADER_GROUP g1 miss1
1288 SHADER_BINDING_TABLE sbt1
1289 g1
1290 END
1291 END
1292
1293 RUN my_rtpipeline MISS sbt1 MISS sbt1
1294 )";
1295
1296 Parser parser;
1297 Result r = parser.Parse(in);
1298 ASSERT_FALSE(r.IsSuccess());
1299 EXPECT_EQ("14: MISS shader binding table can specified only once",
1300 r.Error());
1301 }
1302
TEST_F(AmberScriptParserTest,RayTracingRunSBTHitDup)1303 TEST_F(AmberScriptParserTest, RayTracingRunSBTHitDup) {
1304 std::string in = R"(
1305 SHADER any_hit ahit1 GLSL
1306 #version 460 core
1307 void main() {}
1308 END
1309
1310 PIPELINE raytracing my_rtpipeline
1311 SHADER_GROUP g1 ahit1
1312 SHADER_BINDING_TABLE sbt1
1313 g1
1314 END
1315 END
1316
1317 RUN my_rtpipeline HIT sbt1 HIT sbt1
1318 )";
1319
1320 Parser parser;
1321 Result r = parser.Parse(in);
1322 ASSERT_FALSE(r.IsSuccess());
1323 EXPECT_EQ("14: HIT shader binding table can specified only once", r.Error());
1324 }
1325
TEST_F(AmberScriptParserTest,RayTracingRunSBTCallDup)1326 TEST_F(AmberScriptParserTest, RayTracingRunSBTCallDup) {
1327 std::string in = R"(
1328 SHADER callable call1 GLSL
1329 #version 460 core
1330 void main() {}
1331 END
1332
1333 PIPELINE raytracing my_rtpipeline
1334 SHADER_GROUP g1 call1
1335 SHADER_BINDING_TABLE sbt1
1336 g1
1337 END
1338 END
1339
1340 RUN my_rtpipeline CALL sbt1 CALL sbt1
1341 )";
1342
1343 Parser parser;
1344 Result r = parser.Parse(in);
1345 ASSERT_FALSE(r.IsSuccess());
1346 EXPECT_EQ("14: CALL shader binding table can specified only once", r.Error());
1347 }
1348
TEST_F(AmberScriptParserTest,RayTracingPipelineMaxRaypayloadSize)1349 TEST_F(AmberScriptParserTest, RayTracingPipelineMaxRaypayloadSize) {
1350 {
1351 std::string in = R"(
1352 PIPELINE compute my_pipeline
1353 MAX_RAY_PAYLOAD_SIZE 16
1354 )";
1355
1356 Parser parser;
1357 Result r = parser.Parse(in);
1358 ASSERT_FALSE(r.IsSuccess());
1359 EXPECT_EQ(
1360 "3: Ray payload size parameter is allowed only for ray tracing "
1361 "pipeline",
1362 r.Error());
1363 }
1364 {
1365 std::string in = R"(
1366 PIPELINE graphics my_pipeline
1367 MAX_RAY_PAYLOAD_SIZE 16
1368 )";
1369
1370 Parser parser;
1371 Result r = parser.Parse(in);
1372 ASSERT_FALSE(r.IsSuccess());
1373 EXPECT_EQ(
1374 "3: Ray payload size parameter is allowed only for ray tracing "
1375 "pipeline",
1376 r.Error());
1377 }
1378 {
1379 std::string in = R"(
1380 PIPELINE raytracing my_pipeline
1381 MAX_RAY_PAYLOAD_SIZE a
1382 )";
1383
1384 Parser parser;
1385 Result r = parser.Parse(in);
1386 ASSERT_FALSE(r.IsSuccess());
1387 EXPECT_EQ("3: Ray payload size expects an integer", r.Error());
1388 }
1389 }
1390
TEST_F(AmberScriptParserTest,RayTracingPipelineMaxRayHitAttributeSize)1391 TEST_F(AmberScriptParserTest, RayTracingPipelineMaxRayHitAttributeSize) {
1392 {
1393 std::string in = R"(
1394 PIPELINE compute my_pipeline
1395 MAX_RAY_HIT_ATTRIBUTE_SIZE 16
1396 )";
1397
1398 Parser parser;
1399 Result r = parser.Parse(in);
1400 ASSERT_FALSE(r.IsSuccess());
1401 EXPECT_EQ(
1402 "3: Ray hit attribute size is allowed only for ray tracing pipeline",
1403 r.Error());
1404 }
1405 {
1406 std::string in = R"(
1407 PIPELINE graphics my_pipeline
1408 MAX_RAY_HIT_ATTRIBUTE_SIZE 16
1409 )";
1410
1411 Parser parser;
1412 Result r = parser.Parse(in);
1413 ASSERT_FALSE(r.IsSuccess());
1414 EXPECT_EQ(
1415 "3: Ray hit attribute size is allowed only for ray tracing pipeline",
1416 r.Error());
1417 }
1418 {
1419 std::string in = R"(
1420 PIPELINE raytracing my_pipeline
1421 MAX_RAY_HIT_ATTRIBUTE_SIZE a
1422 )";
1423
1424 Parser parser;
1425 Result r = parser.Parse(in);
1426 ASSERT_FALSE(r.IsSuccess());
1427 EXPECT_EQ("3: Ray hit attribute size expects an integer", r.Error());
1428 }
1429 }
1430
TEST_F(AmberScriptParserTest,RayTracingPipelineMaxRecursionDepthSize)1431 TEST_F(AmberScriptParserTest, RayTracingPipelineMaxRecursionDepthSize) {
1432 {
1433 std::string in = R"(
1434 PIPELINE compute my_pipeline
1435 MAX_RAY_RECURSION_DEPTH 1
1436 )";
1437
1438 Parser parser;
1439 Result r = parser.Parse(in);
1440 ASSERT_FALSE(r.IsSuccess());
1441 EXPECT_EQ("3: Ray recursion depth is allowed only for ray tracing pipeline",
1442 r.Error());
1443 }
1444 {
1445 std::string in = R"(
1446 PIPELINE graphics my_pipeline
1447 MAX_RAY_RECURSION_DEPTH 1
1448 )";
1449
1450 Parser parser;
1451 Result r = parser.Parse(in);
1452 ASSERT_FALSE(r.IsSuccess());
1453 EXPECT_EQ("3: Ray recursion depth is allowed only for ray tracing pipeline",
1454 r.Error());
1455 }
1456 {
1457 std::string in = R"(
1458 PIPELINE raytracing my_pipeline
1459 MAX_RAY_RECURSION_DEPTH a
1460 )";
1461
1462 Parser parser;
1463 Result r = parser.Parse(in);
1464 ASSERT_FALSE(r.IsSuccess());
1465 EXPECT_EQ("3: Ray recursion depth expects an integer", r.Error());
1466 }
1467 }
1468
TEST_F(AmberScriptParserTest,RayTracingPipelineFlags)1469 TEST_F(AmberScriptParserTest, RayTracingPipelineFlags) {
1470 {
1471 std::string in = R"(
1472 PIPELINE compute my_pipeline
1473 FLAGS LIBRARY
1474 )";
1475
1476 Parser parser;
1477 Result r = parser.Parse(in);
1478 ASSERT_FALSE(r.IsSuccess());
1479 EXPECT_EQ("3: Flags are allowed only for ray tracing pipeline", r.Error());
1480 }
1481 {
1482 std::string in = R"(
1483 PIPELINE graphics my_pipeline
1484 FLAGS LIBRARY
1485 )";
1486
1487 Parser parser;
1488 Result r = parser.Parse(in);
1489 ASSERT_FALSE(r.IsSuccess());
1490 EXPECT_EQ("3: Flags are allowed only for ray tracing pipeline", r.Error());
1491 }
1492 {
1493 std::string in = R"(
1494 PIPELINE raytracing my_pipeline
1495 FLAGS
1496 LIBRARY
1497 )";
1498
1499 Parser parser;
1500 Result r = parser.Parse(in);
1501 ASSERT_FALSE(r.IsSuccess());
1502 EXPECT_EQ("5: END command missing", r.Error());
1503 }
1504 {
1505 std::string in = R"(
1506 PIPELINE raytracing my_pipeline
1507 FLAGS UNKNOWN_FLAG
1508 )";
1509
1510 Parser parser;
1511 Result r = parser.Parse(in);
1512 ASSERT_FALSE(r.IsSuccess());
1513 EXPECT_EQ("3: Unknown flag: UNKNOWN_FLAG", r.Error());
1514 }
1515 {
1516 std::string in = R"(
1517 PIPELINE raytracing my_pipeline
1518 FLAGS 1.0
1519 )";
1520
1521 Parser parser;
1522 Result r = parser.Parse(in);
1523 ASSERT_FALSE(r.IsSuccess());
1524 EXPECT_EQ("3: Identifier expected", r.Error());
1525 }
1526 }
1527
TEST_F(AmberScriptParserTest,RayTracingPipelineUseLibrary)1528 TEST_F(AmberScriptParserTest, RayTracingPipelineUseLibrary) {
1529 {
1530 std::string in = R"(
1531 PIPELINE raytracing base_pipeline_lib
1532 FLAGS LIBRARY
1533 END
1534
1535 PIPELINE compute my_pipeline
1536 USE_LIBRARY base_pipeline_lib
1537 )";
1538
1539 Parser parser;
1540 Result r = parser.Parse(in);
1541 ASSERT_FALSE(r.IsSuccess());
1542 EXPECT_EQ("7: Use library is allowed only for ray tracing pipeline",
1543 r.Error());
1544 }
1545 {
1546 std::string in = R"(
1547 PIPELINE raytracing base_pipeline_lib
1548 FLAGS LIBRARY
1549 END
1550
1551 PIPELINE graphics my_pipeline
1552 USE_LIBRARY base_pipeline_lib
1553 )";
1554
1555 Parser parser;
1556 Result r = parser.Parse(in);
1557 ASSERT_FALSE(r.IsSuccess());
1558 EXPECT_EQ("7: Use library is allowed only for ray tracing pipeline",
1559 r.Error());
1560 }
1561 {
1562 std::string in = R"(
1563 PIPELINE raytracing my_pipeline
1564 USE_LIBRARY base_pipeline_lib
1565 )";
1566
1567 Parser parser;
1568 Result r = parser.Parse(in);
1569 ASSERT_FALSE(r.IsSuccess());
1570 EXPECT_EQ("3: Pipeline not found: base_pipeline_lib", r.Error());
1571 }
1572 {
1573 std::string in = R"(
1574 PIPELINE raytracing my_pipeline
1575 USE_LIBRARY)";
1576
1577 Parser parser;
1578 Result r = parser.Parse(in);
1579 ASSERT_FALSE(r.IsSuccess());
1580 EXPECT_EQ("3: EOL expected", r.Error());
1581 }
1582 {
1583 std::string in = R"(
1584 PIPELINE raytracing my_pipeline
1585 USE_LIBRARY 1
1586 )";
1587
1588 Parser parser;
1589 Result r = parser.Parse(in);
1590 ASSERT_FALSE(r.IsSuccess());
1591 EXPECT_EQ("3: Unexpected data type", r.Error());
1592 }
1593 }
1594
1595 } // namespace amberscript
1596 } // namespace amber
1597