• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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