1 // Copyright 2019 The Amber Authors.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or parseried.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include "gtest/gtest.h"
16 #include "src/amberscript/parser.h"
17
18 namespace amber {
19 namespace amberscript {
20
21 using AmberScriptParserTest = testing::Test;
22
TEST_F(AmberScriptParserTest,BindColorBuffer)23 TEST_F(AmberScriptParserTest, BindColorBuffer) {
24 std::string in = R"(
25 SHADER vertex my_shader PASSTHROUGH
26 SHADER fragment my_fragment GLSL
27 # GLSL Shader
28 END
29 BUFFER my_fb FORMAT R32G32B32A32_SFLOAT
30
31 PIPELINE graphics my_pipeline
32 ATTACH my_shader
33 ATTACH my_fragment
34
35 BIND BUFFER my_fb AS color LOCATION 0
36 END)";
37
38 Parser parser;
39 Result r = parser.Parse(in);
40 ASSERT_TRUE(r.IsSuccess()) << r.Error();
41
42 auto script = parser.GetScript();
43 const auto& pipelines = script->GetPipelines();
44 ASSERT_EQ(1U, pipelines.size());
45
46 const auto* pipeline = pipelines[0].get();
47 const auto& color_buffers = pipeline->GetColorAttachments();
48 ASSERT_EQ(1U, color_buffers.size());
49
50 const auto& buf_info = color_buffers[0];
51 ASSERT_TRUE(buf_info.buffer != nullptr);
52 EXPECT_EQ(0, buf_info.location);
53 EXPECT_EQ(250 * 250, buf_info.buffer->ElementCount());
54 EXPECT_EQ(250 * 250 * 4, buf_info.buffer->ValueCount());
55 EXPECT_EQ(250 * 250 * 4 * sizeof(float), buf_info.buffer->GetSizeInBytes());
56 }
57
TEST_F(AmberScriptParserTest,BindColorBufferTwice)58 TEST_F(AmberScriptParserTest, BindColorBufferTwice) {
59 std::string in = R"(
60 SHADER vertex my_shader PASSTHROUGH
61 SHADER fragment my_fragment GLSL
62 # GLSL Shader
63 END
64 BUFFER my_fb FORMAT R32G32B32A32_SFLOAT
65
66 PIPELINE graphics my_pipeline
67 ATTACH my_shader
68 ATTACH my_fragment
69
70 BIND BUFFER my_fb AS color LOCATION 0
71 BIND BUFFER my_fb AS color LOCATION 1
72 END)";
73
74 Parser parser;
75 Result r = parser.Parse(in);
76 ASSERT_FALSE(r.IsSuccess());
77 EXPECT_EQ("13: color buffer may only be bound to a PIPELINE once", r.Error());
78 }
79
TEST_F(AmberScriptParserTest,BindColorBufferMissingBuffer)80 TEST_F(AmberScriptParserTest, BindColorBufferMissingBuffer) {
81 std::string in = R"(
82 SHADER vertex my_shader PASSTHROUGH
83 SHADER fragment my_fragment GLSL
84 # GLSL Shader
85 END
86 BUFFER my_fb FORMAT R32G32B32A32_SFLOAT
87
88 PIPELINE graphics my_pipeline
89 ATTACH my_shader
90 ATTACH my_fragment
91
92 BIND BUFFER AS color LOCATION 0
93 END)";
94
95 Parser parser;
96 Result r = parser.Parse(in);
97 ASSERT_FALSE(r.IsSuccess());
98 EXPECT_EQ("12: unknown buffer: AS", r.Error());
99 }
100
TEST_F(AmberScriptParserTest,BindColorBufferNonDeclaredBuffer)101 TEST_F(AmberScriptParserTest, BindColorBufferNonDeclaredBuffer) {
102 std::string in = R"(
103 SHADER vertex my_shader PASSTHROUGH
104 SHADER fragment my_fragment GLSL
105 # GLSL Shader
106 END
107
108 PIPELINE graphics my_pipeline
109 ATTACH my_shader
110 ATTACH my_fragment
111
112 BIND BUFFER my_fb AS color LOCATION 0
113 END)";
114
115 Parser parser;
116 Result r = parser.Parse(in);
117 ASSERT_FALSE(r.IsSuccess());
118 EXPECT_EQ("11: unknown buffer: my_fb", r.Error());
119 }
120
TEST_F(AmberScriptParserTest,BindColorBufferMissingLocation)121 TEST_F(AmberScriptParserTest, BindColorBufferMissingLocation) {
122 std::string in = R"(
123 SHADER vertex my_shader PASSTHROUGH
124 SHADER fragment my_fragment GLSL
125 # GLSL Shader
126 END
127 BUFFER my_fb FORMAT R32G32B32A32_SFLOAT
128
129 PIPELINE graphics my_pipeline
130 ATTACH my_shader
131 ATTACH my_fragment
132
133 BIND BUFFER my_fb AS color
134 END)";
135
136 Parser parser;
137 Result r = parser.Parse(in);
138 ASSERT_FALSE(r.IsSuccess());
139 EXPECT_EQ("13: BIND missing LOCATION", r.Error());
140 }
141
TEST_F(AmberScriptParserTest,BindColorBufferMissingLocationIndex)142 TEST_F(AmberScriptParserTest, BindColorBufferMissingLocationIndex) {
143 std::string in = R"(
144 SHADER vertex my_shader PASSTHROUGH
145 SHADER fragment my_fragment GLSL
146 # GLSL Shader
147 END
148 BUFFER my_fb FORMAT R32G32B32A32_SFLOAT
149
150 PIPELINE graphics my_pipeline
151 ATTACH my_shader
152 ATTACH my_fragment
153
154 BIND BUFFER my_fb AS color LOCATION
155 END)";
156
157 Parser parser;
158 Result r = parser.Parse(in);
159 ASSERT_FALSE(r.IsSuccess());
160 EXPECT_EQ("13: invalid value for BIND LOCATION", r.Error());
161 }
162
TEST_F(AmberScriptParserTest,BindColorBufferInvalidLocationIndex)163 TEST_F(AmberScriptParserTest, BindColorBufferInvalidLocationIndex) {
164 std::string in = R"(
165 SHADER vertex my_shader PASSTHROUGH
166 SHADER fragment my_fragment GLSL
167 # GLSL Shader
168 END
169 BUFFER my_fb FORMAT R32G32B32A32_SFLOAT
170
171 PIPELINE graphics my_pipeline
172 ATTACH my_shader
173 ATTACH my_fragment
174
175 BIND BUFFER my_fb AS color LOCATION INVALID
176 END)";
177
178 Parser parser;
179 Result r = parser.Parse(in);
180 ASSERT_FALSE(r.IsSuccess());
181 EXPECT_EQ("12: invalid value for BIND LOCATION", r.Error());
182 }
183
TEST_F(AmberScriptParserTest,BindColorBufferExtraParams)184 TEST_F(AmberScriptParserTest, BindColorBufferExtraParams) {
185 std::string in = R"(
186 SHADER vertex my_shader PASSTHROUGH
187 SHADER fragment my_fragment GLSL
188 # GLSL Shader
189 END
190 BUFFER my_fb FORMAT R32G32B32A32_SFLOAT
191
192 PIPELINE graphics my_pipeline
193 ATTACH my_shader
194 ATTACH my_fragment
195
196 BIND BUFFER my_fb AS color LOCATION 0 EXTRA
197 END)";
198
199 Parser parser;
200 Result r = parser.Parse(in);
201 ASSERT_FALSE(r.IsSuccess());
202 EXPECT_EQ("12: extra parameters after BIND command", r.Error());
203 }
204
TEST_F(AmberScriptParserTest,BindColorBufferDuplicateLocation)205 TEST_F(AmberScriptParserTest, BindColorBufferDuplicateLocation) {
206 std::string in = R"(
207 SHADER vertex my_shader PASSTHROUGH
208 SHADER fragment my_fragment GLSL
209 # GLSL Shader
210 END
211 BUFFER my_fb FORMAT R32G32B32A32_SFLOAT
212 BUFFER sec_fb FORMAT R32G32B32A32_SFLOAT
213
214 PIPELINE graphics my_pipeline
215 ATTACH my_shader
216 ATTACH my_fragment
217
218 BIND BUFFER my_fb AS color LOCATION 0
219 BIND BUFFER sec_fb AS color LOCATION 0
220 END)";
221
222 Parser parser;
223 Result r = parser.Parse(in);
224 ASSERT_FALSE(r.IsSuccess());
225 EXPECT_EQ("14: can not bind two color buffers to the same LOCATION",
226 r.Error());
227 }
228
TEST_F(AmberScriptParserTest,BindColorToTwoPipelinesRequiresMatchingSize)229 TEST_F(AmberScriptParserTest, BindColorToTwoPipelinesRequiresMatchingSize) {
230 std::string in = R"(
231 SHADER vertex my_shader PASSTHROUGH
232 SHADER fragment my_fragment GLSL
233 # GLSL Shader
234 END
235 BUFFER my_fb FORMAT R32G32B32A32_SFLOAT
236
237 PIPELINE graphics my_pipeline
238 ATTACH my_shader
239 ATTACH my_fragment
240
241 BIND BUFFER my_fb AS color LOCATION 0
242 END
243 PIPELINE graphics second_pipeline
244 ATTACH my_shader
245 ATTACH my_fragment
246
247 BIND BUFFER my_fb AS color LOCATION 0
248 FRAMEBUFFER_SIZE 256 300
249 END)";
250
251 Parser parser;
252 Result r = parser.Parse(in);
253 ASSERT_FALSE(r.IsSuccess());
254 EXPECT_EQ("shared framebuffer must have same size over all PIPELINES",
255 r.Error());
256 }
257
TEST_F(AmberScriptParserTest,BindColorTwoPipelines)258 TEST_F(AmberScriptParserTest, BindColorTwoPipelines) {
259 std::string in = R"(
260 SHADER vertex my_shader PASSTHROUGH
261 SHADER fragment my_fragment GLSL
262 # GLSL Shader
263 END
264 BUFFER my_fb FORMAT R32G32B32A32_SFLOAT
265 BUFFER second_fb FORMAT R8G8B8A8_UINT
266 BUFFER depth_1 FORMAT D32_SFLOAT_S8_UINT
267 BUFFER depth_2 FORMAT D32_SFLOAT_S8_UINT
268
269 PIPELINE graphics my_pipeline
270 ATTACH my_shader
271 ATTACH my_fragment
272
273 BIND BUFFER my_fb AS color LOCATION 0
274 BIND BUFFER depth_1 AS depth_stencil
275 FRAMEBUFFER_SIZE 90 180
276 END
277 PIPELINE graphics second_pipeline
278 ATTACH my_shader
279 ATTACH my_fragment
280
281 BIND BUFFER second_fb AS color LOCATION 9
282 BIND BUFFER depth_2 AS depth_stencil
283 FRAMEBUFFER_SIZE 256 300
284 END)";
285
286 Parser parser;
287 Result r = parser.Parse(in);
288 ASSERT_TRUE(r.IsSuccess()) << r.Error();
289
290 auto script = parser.GetScript();
291 const auto& pipelines = script->GetPipelines();
292 ASSERT_EQ(2U, pipelines.size());
293
294 const auto* pipeline = pipelines[0].get();
295 const auto& color_buffers1 = pipeline->GetColorAttachments();
296 ASSERT_EQ(1U, color_buffers1.size());
297
298 const auto& buf1 = color_buffers1[0];
299 ASSERT_TRUE(buf1.buffer != nullptr);
300 EXPECT_EQ(0, buf1.location);
301 EXPECT_EQ(90 * 180, buf1.buffer->ElementCount());
302 EXPECT_EQ(90 * 180 * 4, buf1.buffer->ValueCount());
303 EXPECT_EQ(90 * 180 * 4 * sizeof(float), buf1.buffer->GetSizeInBytes());
304
305 pipeline = pipelines[1].get();
306 const auto& color_buffers2 = pipeline->GetColorAttachments();
307 const auto& buf2 = color_buffers2[0];
308 ASSERT_TRUE(buf2.buffer != nullptr);
309 EXPECT_EQ(9, buf2.location);
310 EXPECT_EQ(256 * 300, buf2.buffer->ElementCount());
311 EXPECT_EQ(256 * 300 * 4, buf2.buffer->ValueCount());
312 EXPECT_EQ(256 * 300 * 4 * sizeof(uint8_t), buf2.buffer->GetSizeInBytes());
313 }
314
TEST_F(AmberScriptParserTest,BindColorFBSizeSetBeforeBuffer)315 TEST_F(AmberScriptParserTest, BindColorFBSizeSetBeforeBuffer) {
316 std::string in = R"(
317 SHADER vertex my_shader PASSTHROUGH
318 SHADER fragment my_fragment GLSL
319 # GLSL Shader
320 END
321 BUFFER my_fb FORMAT R32G32B32A32_SFLOAT
322
323 PIPELINE graphics my_pipeline
324 ATTACH my_shader
325 ATTACH my_fragment
326
327 FRAMEBUFFER_SIZE 90 180
328 BIND BUFFER my_fb AS color LOCATION 0
329 END)";
330
331 Parser parser;
332 Result r = parser.Parse(in);
333 ASSERT_TRUE(r.IsSuccess()) << r.Error();
334
335 auto script = parser.GetScript();
336 const auto& pipelines = script->GetPipelines();
337 ASSERT_EQ(1U, pipelines.size());
338
339 const auto* pipeline = pipelines[0].get();
340 const auto& color_buffers1 = pipeline->GetColorAttachments();
341 ASSERT_EQ(1U, color_buffers1.size());
342
343 const auto& buf1 = color_buffers1[0];
344 ASSERT_TRUE(buf1.buffer != nullptr);
345 EXPECT_EQ(0, buf1.location);
346 EXPECT_EQ(90 * 180, buf1.buffer->ElementCount());
347 EXPECT_EQ(90 * 180 * 4, buf1.buffer->ValueCount());
348 EXPECT_EQ(90 * 180 * 4 * sizeof(float), buf1.buffer->GetSizeInBytes());
349 }
350
TEST_F(AmberScriptParserTest,BindColorFBSizeSetAfterBuffer)351 TEST_F(AmberScriptParserTest, BindColorFBSizeSetAfterBuffer) {
352 std::string in = R"(
353 SHADER vertex my_shader PASSTHROUGH
354 SHADER fragment my_fragment GLSL
355 # GLSL Shader
356 END
357 BUFFER my_fb FORMAT R32G32B32A32_SFLOAT
358
359 PIPELINE graphics my_pipeline
360 ATTACH my_shader
361 ATTACH my_fragment
362
363 BIND BUFFER my_fb AS color LOCATION 0
364 FRAMEBUFFER_SIZE 90 180
365 END)";
366
367 Parser parser;
368 Result r = parser.Parse(in);
369 ASSERT_TRUE(r.IsSuccess()) << r.Error();
370
371 auto script = parser.GetScript();
372 const auto& pipelines = script->GetPipelines();
373 ASSERT_EQ(1U, pipelines.size());
374
375 const auto* pipeline = pipelines[0].get();
376 const auto& color_buffers1 = pipeline->GetColorAttachments();
377 ASSERT_EQ(1U, color_buffers1.size());
378
379 const auto& buf1 = color_buffers1[0];
380 ASSERT_TRUE(buf1.buffer != nullptr);
381 EXPECT_EQ(0, buf1.location);
382 EXPECT_EQ(90 * 180, buf1.buffer->ElementCount());
383 EXPECT_EQ(90 * 180 * 4, buf1.buffer->ValueCount());
384 EXPECT_EQ(90 * 180 * 4 * sizeof(float), buf1.buffer->GetSizeInBytes());
385 }
386
TEST_F(AmberScriptParserTest,BindDepthBuffer)387 TEST_F(AmberScriptParserTest, BindDepthBuffer) {
388 std::string in = R"(
389 SHADER vertex my_shader PASSTHROUGH
390 SHADER fragment my_fragment GLSL
391 # GLSL Shader
392 END
393 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
394
395 PIPELINE graphics my_pipeline
396 ATTACH my_shader
397 ATTACH my_fragment
398
399 BIND BUFFER my_buf AS depth_stencil
400 FRAMEBUFFER_SIZE 90 180
401 END)";
402
403 Parser parser;
404 Result r = parser.Parse(in);
405 ASSERT_TRUE(r.IsSuccess()) << r.Error();
406
407 auto script = parser.GetScript();
408 const auto& pipelines = script->GetPipelines();
409 ASSERT_EQ(1U, pipelines.size());
410
411 const auto* pipeline = pipelines[0].get();
412 const auto& buf = pipeline->GetDepthBuffer();
413 ASSERT_TRUE(buf.buffer != nullptr);
414 EXPECT_EQ(90 * 180, buf.buffer->ElementCount());
415 EXPECT_EQ(90 * 180 * 4, buf.buffer->ValueCount());
416 EXPECT_EQ(90 * 180 * 4 * sizeof(float), buf.buffer->GetSizeInBytes());
417 }
418
TEST_F(AmberScriptParserTest,BindDepthBufferExtraParams)419 TEST_F(AmberScriptParserTest, BindDepthBufferExtraParams) {
420 std::string in = R"(
421 SHADER vertex my_shader PASSTHROUGH
422 SHADER fragment my_fragment GLSL
423 # GLSL Shader
424 END
425 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
426
427 PIPELINE graphics my_pipeline
428 ATTACH my_shader
429 ATTACH my_fragment
430
431 BIND BUFFER my_buf AS depth_stencil EXTRA
432 FRAMEBUFFER_SIZE 90 180
433 END)";
434
435 Parser parser;
436 Result r = parser.Parse(in);
437 ASSERT_FALSE(r.IsSuccess());
438 EXPECT_EQ("12: extra parameters after BIND command", r.Error());
439 }
440
TEST_F(AmberScriptParserTest,BindBufferMissingBufferName)441 TEST_F(AmberScriptParserTest, BindBufferMissingBufferName) {
442 std::string in = R"(
443 SHADER vertex my_shader PASSTHROUGH
444 SHADER fragment my_fragment GLSL
445 # GLSL Shader
446 END
447 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
448
449 PIPELINE graphics my_pipeline
450 ATTACH my_shader
451 ATTACH my_fragment
452
453 BIND BUFFER AS depth_stencil
454 FRAMEBUFFER_SIZE 90 180
455 END)";
456
457 Parser parser;
458 Result r = parser.Parse(in);
459 ASSERT_FALSE(r.IsSuccess());
460 EXPECT_EQ("12: unknown buffer: AS", r.Error());
461 }
462
TEST_F(AmberScriptParserTest,BindBufferAsMissingType)463 TEST_F(AmberScriptParserTest, BindBufferAsMissingType) {
464 std::string in = R"(
465 SHADER vertex my_shader PASSTHROUGH
466 SHADER fragment my_fragment GLSL
467 # GLSL Shader
468 END
469 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
470
471 PIPELINE graphics my_pipeline
472 ATTACH my_shader
473 ATTACH my_fragment
474
475 BIND BUFFER my_buf AS
476 FRAMEBUFFER_SIZE 90 180
477 END)";
478
479 Parser parser;
480 Result r = parser.Parse(in);
481 ASSERT_FALSE(r.IsSuccess());
482 EXPECT_EQ("13: invalid token for BUFFER type", r.Error());
483 }
484
TEST_F(AmberScriptParserTest,BindBufferAsInvalidType)485 TEST_F(AmberScriptParserTest, BindBufferAsInvalidType) {
486 std::string in = R"(
487 SHADER vertex my_shader PASSTHROUGH
488 SHADER fragment my_fragment GLSL
489 # GLSL Shader
490 END
491 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
492
493 PIPELINE graphics my_pipeline
494 ATTACH my_shader
495 ATTACH my_fragment
496
497 BIND BUFFER my_buf AS
498 FRAMEBUFFER_SIZE 90 180
499 END)";
500
501 Parser parser;
502 Result r = parser.Parse(in);
503 ASSERT_FALSE(r.IsSuccess());
504 EXPECT_EQ("13: invalid token for BUFFER type", r.Error());
505 }
506
TEST_F(AmberScriptParserTest,BindDepthBufferUnknownBuffer)507 TEST_F(AmberScriptParserTest, BindDepthBufferUnknownBuffer) {
508 std::string in = R"(
509 SHADER vertex my_shader PASSTHROUGH
510 SHADER fragment my_fragment GLSL
511 # GLSL Shader
512 END
513
514 PIPELINE graphics my_pipeline
515 ATTACH my_shader
516 ATTACH my_fragment
517
518 BIND BUFFER my_buf AS depth_stencil
519 FRAMEBUFFER_SIZE 90 180
520 END)";
521
522 Parser parser;
523 Result r = parser.Parse(in);
524 ASSERT_FALSE(r.IsSuccess());
525 EXPECT_EQ("11: unknown buffer: my_buf", r.Error());
526 }
527
TEST_F(AmberScriptParserTest,BindBufferMultipleDepthBuffers)528 TEST_F(AmberScriptParserTest, BindBufferMultipleDepthBuffers) {
529 std::string in = R"(
530 SHADER vertex my_shader PASSTHROUGH
531 SHADER fragment my_fragment GLSL
532 # GLSL Shader
533 END
534 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
535 BUFFER my_buf2 FORMAT R32G32B32A32_SFLOAT
536
537 PIPELINE graphics my_pipeline
538 ATTACH my_shader
539 ATTACH my_fragment
540
541 BIND BUFFER my_buf AS depth_stencil
542 BIND BUFFER my_buf AS depth_stencil
543 END)";
544
545 Parser parser;
546 Result r = parser.Parse(in);
547 ASSERT_FALSE(r.IsSuccess());
548 EXPECT_EQ("14: can only bind one depth buffer in a PIPELINE", r.Error());
549 }
550
TEST_F(AmberScriptParserTest,BindVertexData)551 TEST_F(AmberScriptParserTest, BindVertexData) {
552 std::string in = R"(
553 SHADER vertex my_shader PASSTHROUGH
554 SHADER fragment my_fragment GLSL
555 # GLSL Shader
556 END
557 BUFFER my_buf DATA_TYPE int8 SIZE 5 FILL 5
558 BUFFER my_buf2 DATA_TYPE int8 SIZE 5 FILL 5
559
560 PIPELINE graphics my_pipeline
561 ATTACH my_shader
562 ATTACH my_fragment
563
564 VERTEX_DATA my_buf LOCATION 0
565 VERTEX_DATA my_buf2 LOCATION 1
566 END)";
567
568 Parser parser;
569 Result r = parser.Parse(in);
570 ASSERT_TRUE(r.IsSuccess()) << r.Error();
571
572 auto script = parser.GetScript();
573 const auto& pipelines = script->GetPipelines();
574 ASSERT_EQ(1U, pipelines.size());
575
576 const auto* pipeline = pipelines[0].get();
577 const auto& vertex_buffers = pipeline->GetVertexBuffers();
578 ASSERT_EQ(2, vertex_buffers.size());
579
580 const auto& info1 = vertex_buffers[0];
581 ASSERT_TRUE(info1.buffer != nullptr);
582 EXPECT_EQ(0, info1.location);
583
584 const auto& info2 = vertex_buffers[1];
585 ASSERT_TRUE(info2.buffer != nullptr);
586 EXPECT_EQ(1, info2.location);
587 }
588
TEST_F(AmberScriptParserTest,BindVertexDataDuplicateLocation)589 TEST_F(AmberScriptParserTest, BindVertexDataDuplicateLocation) {
590 std::string in = R"(
591 SHADER vertex my_shader PASSTHROUGH
592 SHADER fragment my_fragment GLSL
593 # GLSL Shader
594 END
595 BUFFER my_buf DATA_TYPE int8 SIZE 50 FILL 5
596 BUFFER my_buf2 DATA_TYPE int8 SIZE 50 FILL 5
597
598 PIPELINE graphics my_pipeline
599 ATTACH my_shader
600 ATTACH my_fragment
601
602 VERTEX_DATA my_buf LOCATION 0
603 VERTEX_DATA my_buf2 LOCATION 0
604 END)";
605
606 Parser parser;
607 Result r = parser.Parse(in);
608 ASSERT_FALSE(r.IsSuccess());
609 EXPECT_EQ("14: can not bind two vertex buffers to the same LOCATION",
610 r.Error());
611 }
612
TEST_F(AmberScriptParserTest,BindVertexDataDuplicateBinding)613 TEST_F(AmberScriptParserTest, BindVertexDataDuplicateBinding) {
614 std::string in = R"(
615 SHADER vertex my_shader PASSTHROUGH
616 SHADER fragment my_fragment GLSL
617 # GLSL Shader
618 END
619 BUFFER my_buf DATA_TYPE int8 SIZE 50 FILL 5
620
621 PIPELINE graphics my_pipeline
622 ATTACH my_shader
623 ATTACH my_fragment
624
625 VERTEX_DATA my_buf LOCATION 0
626 VERTEX_DATA my_buf LOCATION 1
627 END)";
628
629 Parser parser;
630 Result r = parser.Parse(in);
631 ASSERT_FALSE(r.IsSuccess());
632 EXPECT_EQ("13: vertex buffer may only be bound to a PIPELINE once",
633 r.Error());
634 }
635
TEST_F(AmberScriptParserTest,BindVertexDataMissingBuffer)636 TEST_F(AmberScriptParserTest, BindVertexDataMissingBuffer) {
637 std::string in = R"(
638 SHADER vertex my_shader PASSTHROUGH
639 SHADER fragment my_fragment GLSL
640 # GLSL Shader
641 END
642 BUFFER my_buf DATA_TYPE int8 SIZE 50 FILL 5
643
644 PIPELINE graphics my_pipeline
645 ATTACH my_shader
646 ATTACH my_fragment
647
648 VERTEX_DATA LOCATION 0
649 END)";
650
651 Parser parser;
652 Result r = parser.Parse(in);
653 ASSERT_FALSE(r.IsSuccess());
654 EXPECT_EQ("12: unknown buffer: LOCATION", r.Error());
655 }
656
TEST_F(AmberScriptParserTest,BindVertexDataUnknownBuffer)657 TEST_F(AmberScriptParserTest, BindVertexDataUnknownBuffer) {
658 std::string in = R"(
659 SHADER vertex my_shader PASSTHROUGH
660 SHADER fragment my_fragment GLSL
661 # GLSL Shader
662 END
663
664 PIPELINE graphics my_pipeline
665 ATTACH my_shader
666 ATTACH my_fragment
667
668 VERTEX_DATA my_buf LOCATION 0
669 END)";
670
671 Parser parser;
672 Result r = parser.Parse(in);
673 ASSERT_FALSE(r.IsSuccess());
674 EXPECT_EQ("11: unknown buffer: my_buf", r.Error());
675 }
676
TEST_F(AmberScriptParserTest,BindVertexDataMissingLocation)677 TEST_F(AmberScriptParserTest, BindVertexDataMissingLocation) {
678 std::string in = R"(
679 SHADER vertex my_shader PASSTHROUGH
680 SHADER fragment my_fragment GLSL
681 # GLSL Shader
682 END
683 BUFFER my_buf DATA_TYPE int8 SIZE 50 FILL 5
684
685 PIPELINE graphics my_pipeline
686 ATTACH my_shader
687 ATTACH my_fragment
688
689 VERTEX_DATA my_buf
690 END)";
691
692 Parser parser;
693 Result r = parser.Parse(in);
694 ASSERT_FALSE(r.IsSuccess());
695 EXPECT_EQ("13: VERTEX_DATA missing LOCATION", r.Error());
696 }
697
TEST_F(AmberScriptParserTest,BindVertexDataMissingLocationValue)698 TEST_F(AmberScriptParserTest, BindVertexDataMissingLocationValue) {
699 std::string in = R"(
700 SHADER vertex my_shader PASSTHROUGH
701 SHADER fragment my_fragment GLSL
702 # GLSL Shader
703 END
704 BUFFER my_buf DATA_TYPE int8 SIZE 50 FILL 5
705
706 PIPELINE graphics my_pipeline
707 ATTACH my_shader
708 ATTACH my_fragment
709
710 VERTEX_DATA my_buf LOCATION
711 END)";
712
713 Parser parser;
714 Result r = parser.Parse(in);
715 ASSERT_FALSE(r.IsSuccess());
716 EXPECT_EQ("13: invalid value for VERTEX_DATA LOCATION", r.Error());
717 }
718
TEST_F(AmberScriptParserTest,BindVertexDataExtraParameters)719 TEST_F(AmberScriptParserTest, BindVertexDataExtraParameters) {
720 std::string in = R"(
721 SHADER vertex my_shader PASSTHROUGH
722 SHADER fragment my_fragment GLSL
723 # GLSL Shader
724 END
725 BUFFER my_buf DATA_TYPE int8 SIZE 50 FILL 5
726
727 PIPELINE graphics my_pipeline
728 ATTACH my_shader
729 ATTACH my_fragment
730
731 VERTEX_DATA my_buf LOCATION 0 EXTRA
732 END)";
733
734 Parser parser;
735 Result r = parser.Parse(in);
736 ASSERT_FALSE(r.IsSuccess());
737 EXPECT_EQ("12: extra parameters after VERTEX_DATA command", r.Error());
738 }
739
TEST_F(AmberScriptParserTest,BindIndexData)740 TEST_F(AmberScriptParserTest, BindIndexData) {
741 std::string in = R"(
742 SHADER vertex my_shader PASSTHROUGH
743 SHADER fragment my_fragment GLSL
744 # GLSL Shader
745 END
746 BUFFER my_buf DATA_TYPE int8 SIZE 50 FILL 5
747
748 PIPELINE graphics my_pipeline
749 ATTACH my_shader
750 ATTACH my_fragment
751
752 INDEX_DATA my_buf
753 END)";
754
755 Parser parser;
756 Result r = parser.Parse(in);
757 ASSERT_TRUE(r.IsSuccess()) << r.Error();
758
759 auto script = parser.GetScript();
760 const auto& pipelines = script->GetPipelines();
761 ASSERT_EQ(1U, pipelines.size());
762
763 const auto* pipeline = pipelines[0].get();
764 const auto* buf = pipeline->GetIndexBuffer();
765 ASSERT_TRUE(buf != nullptr);
766 }
767
TEST_F(AmberScriptParserTest,BindIndexataMissingBuffer)768 TEST_F(AmberScriptParserTest, BindIndexataMissingBuffer) {
769 std::string in = R"(
770 SHADER vertex my_shader PASSTHROUGH
771 SHADER fragment my_fragment GLSL
772 # GLSL Shader
773 END
774 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
775
776 PIPELINE graphics my_pipeline
777 ATTACH my_shader
778 ATTACH my_fragment
779
780 INDEX_DATA
781 END)";
782
783 Parser parser;
784 Result r = parser.Parse(in);
785 ASSERT_FALSE(r.IsSuccess());
786 EXPECT_EQ("13: missing buffer name in INDEX_DATA command", r.Error());
787 }
788
TEST_F(AmberScriptParserTest,BindIndexDataUnknownBuffer)789 TEST_F(AmberScriptParserTest, BindIndexDataUnknownBuffer) {
790 std::string in = R"(
791 SHADER vertex my_shader PASSTHROUGH
792 SHADER fragment my_fragment GLSL
793 # GLSL Shader
794 END
795
796 PIPELINE graphics my_pipeline
797 ATTACH my_shader
798 ATTACH my_fragment
799
800 INDEX_DATA my_buf
801 END)";
802
803 Parser parser;
804 Result r = parser.Parse(in);
805 ASSERT_FALSE(r.IsSuccess());
806 EXPECT_EQ("11: unknown buffer: my_buf", r.Error());
807 }
808
TEST_F(AmberScriptParserTest,BindIndexDataExtraParameters)809 TEST_F(AmberScriptParserTest, BindIndexDataExtraParameters) {
810 std::string in = R"(
811 SHADER vertex my_shader PASSTHROUGH
812 SHADER fragment my_fragment GLSL
813 # GLSL Shader
814 END
815 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
816
817 PIPELINE graphics my_pipeline
818 ATTACH my_shader
819 ATTACH my_fragment
820
821 INDEX_DATA my_buf EXTRA
822 END)";
823
824 Parser parser;
825 Result r = parser.Parse(in);
826 ASSERT_FALSE(r.IsSuccess());
827 EXPECT_EQ("12: extra parameters after INDEX_DATA command", r.Error());
828 }
829
TEST_F(AmberScriptParserTest,BindIndexDataMultiple)830 TEST_F(AmberScriptParserTest, BindIndexDataMultiple) {
831 std::string in = R"(
832 SHADER vertex my_shader PASSTHROUGH
833 SHADER fragment my_fragment GLSL
834 # GLSL Shader
835 END
836 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
837
838 PIPELINE graphics my_pipeline
839 ATTACH my_shader
840 ATTACH my_fragment
841
842 INDEX_DATA my_buf
843 INDEX_DATA my_buf
844 END)";
845
846 Parser parser;
847 Result r = parser.Parse(in);
848 ASSERT_FALSE(r.IsSuccess());
849 EXPECT_EQ("13: can only bind one INDEX_DATA buffer in a pipeline", r.Error());
850 }
851
TEST_F(AmberScriptParserTest,BindBuffer)852 TEST_F(AmberScriptParserTest, BindBuffer) {
853 std::string in = R"(
854 SHADER vertex my_shader PASSTHROUGH
855 SHADER fragment my_fragment GLSL
856 # GLSL Shader
857 END
858 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
859
860 PIPELINE graphics my_pipeline
861 ATTACH my_shader
862 ATTACH my_fragment
863
864 BIND BUFFER my_buf AS uniform DESCRIPTOR_SET 1 BINDING 2
865 END
866 )";
867
868 Parser parser;
869 Result r = parser.Parse(in);
870 ASSERT_TRUE(r.IsSuccess()) << r.Error();
871
872 auto script = parser.GetScript();
873 const auto& pipelines = script->GetPipelines();
874 ASSERT_EQ(1U, pipelines.size());
875
876 const auto* pipeline = pipelines[0].get();
877 const auto& bufs = pipeline->GetBuffers();
878 ASSERT_EQ(1U, bufs.size());
879 EXPECT_EQ(BufferType::kUniform, bufs[0].buffer->GetBufferType());
880 EXPECT_EQ(1U, bufs[0].descriptor_set);
881 EXPECT_EQ(2U, bufs[0].binding);
882 EXPECT_EQ(static_cast<uint32_t>(0), bufs[0].location);
883 EXPECT_EQ(FormatType::kR32G32B32A32_SFLOAT,
884 bufs[0].buffer->GetFormat()->GetFormatType());
885 }
886
TEST_F(AmberScriptParserTest,BindBufferMissingBindingValue)887 TEST_F(AmberScriptParserTest, BindBufferMissingBindingValue) {
888 std::string in = R"(
889 SHADER vertex my_shader PASSTHROUGH
890 SHADER fragment my_fragment GLSL
891 # GLSL Shader
892 END
893 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
894
895 PIPELINE graphics my_pipeline
896 ATTACH my_shader
897 ATTACH my_fragment
898
899 BIND BUFFER my_buf AS uniform DESCRIPTOR_SET 1 BINDING
900 END)";
901
902 Parser parser;
903 Result r = parser.Parse(in);
904 ASSERT_FALSE(r.IsSuccess());
905 EXPECT_EQ("13: invalid value for BINDING in BIND command", r.Error());
906 }
907
TEST_F(AmberScriptParserTest,BindBufferMissingBinding)908 TEST_F(AmberScriptParserTest, BindBufferMissingBinding) {
909 std::string in = R"(
910 SHADER vertex my_shader PASSTHROUGH
911 SHADER fragment my_fragment GLSL
912 # GLSL Shader
913 END
914 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
915
916 PIPELINE graphics my_pipeline
917 ATTACH my_shader
918 ATTACH my_fragment
919
920 BIND BUFFER my_buf AS uniform DESCRIPTOR_SET 1
921 END)";
922
923 Parser parser;
924 Result r = parser.Parse(in);
925 ASSERT_FALSE(r.IsSuccess());
926 EXPECT_EQ("13: missing BINDING for BIND command", r.Error());
927 }
928
TEST_F(AmberScriptParserTest,BindBufferMissingDescriptorSetValue)929 TEST_F(AmberScriptParserTest, BindBufferMissingDescriptorSetValue) {
930 std::string in = R"(
931 SHADER vertex my_shader PASSTHROUGH
932 SHADER fragment my_fragment GLSL
933 # GLSL Shader
934 END
935 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
936
937 PIPELINE graphics my_pipeline
938 ATTACH my_shader
939 ATTACH my_fragment
940
941 BIND BUFFER my_buf AS uniform DESCRIPTOR_SET BINDING 2
942 END)";
943
944 Parser parser;
945 Result r = parser.Parse(in);
946 ASSERT_FALSE(r.IsSuccess());
947 EXPECT_EQ("12: invalid value for DESCRIPTOR_SET in BIND command", r.Error());
948 }
949
TEST_F(AmberScriptParserTest,BindBufferMissingDescriptorSet)950 TEST_F(AmberScriptParserTest, BindBufferMissingDescriptorSet) {
951 std::string in = R"(
952 SHADER vertex my_shader PASSTHROUGH
953 SHADER fragment my_fragment GLSL
954 # GLSL Shader
955 END
956 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
957
958 PIPELINE graphics my_pipeline
959 ATTACH my_shader
960 ATTACH my_fragment
961
962 BIND BUFFER my_buf AS uniform BINDING 2
963 END)";
964
965 Parser parser;
966 Result r = parser.Parse(in);
967 ASSERT_FALSE(r.IsSuccess());
968 EXPECT_EQ("12: missing DESCRIPTOR_SET or KERNEL for BIND command", r.Error());
969 }
970
TEST_F(AmberScriptParserTest,BindingBufferExtraParams)971 TEST_F(AmberScriptParserTest, BindingBufferExtraParams) {
972 std::string in = R"(
973 SHADER vertex my_shader PASSTHROUGH
974 SHADER fragment my_fragment GLSL
975 # GLSL Shader
976 END
977 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
978
979 PIPELINE graphics my_pipeline
980 ATTACH my_shader
981 ATTACH my_fragment
982
983 BIND BUFFER my_buf AS uniform DESCRIPTOR_SET 1 BINDING 2 EXTRA
984 END)";
985
986 Parser parser;
987 Result r = parser.Parse(in);
988 ASSERT_FALSE(r.IsSuccess());
989 EXPECT_EQ("12: extra parameters after BIND command", r.Error());
990 }
991
TEST_F(AmberScriptParserTest,BindingBufferInvalidBindingValue)992 TEST_F(AmberScriptParserTest, BindingBufferInvalidBindingValue) {
993 std::string in = R"(
994 SHADER vertex my_shader PASSTHROUGH
995 SHADER fragment my_fragment GLSL
996 # GLSL Shader
997 END
998 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
999
1000 PIPELINE graphics my_pipeline
1001 ATTACH my_shader
1002 ATTACH my_fragment
1003
1004 BIND BUFFER my_buf AS uniform DESCRIPTOR_SET 1 BINDING INVALID
1005 END)";
1006
1007 Parser parser;
1008 Result r = parser.Parse(in);
1009 ASSERT_FALSE(r.IsSuccess());
1010 EXPECT_EQ("12: invalid value for BINDING in BIND command", r.Error());
1011 }
1012
TEST_F(AmberScriptParserTest,BindingBufferInvalidDescriptorSetValue)1013 TEST_F(AmberScriptParserTest, BindingBufferInvalidDescriptorSetValue) {
1014 std::string in = R"(
1015 SHADER vertex my_shader PASSTHROUGH
1016 SHADER fragment my_fragment GLSL
1017 # GLSL Shader
1018 END
1019 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
1020
1021 PIPELINE graphics my_pipeline
1022 ATTACH my_shader
1023 ATTACH my_fragment
1024
1025 BIND BUFFER my_buf AS uniform DESCRIPTOR_SET INVALID BINDING 2
1026 END)";
1027
1028 Parser parser;
1029 Result r = parser.Parse(in);
1030 ASSERT_FALSE(r.IsSuccess());
1031 EXPECT_EQ("12: invalid value for DESCRIPTOR_SET in BIND command", r.Error());
1032 }
1033
TEST_F(AmberScriptParserTest,BindingBufferInvalidBufferType)1034 TEST_F(AmberScriptParserTest, BindingBufferInvalidBufferType) {
1035 std::string in = R"(
1036 SHADER vertex my_shader PASSTHROUGH
1037 SHADER fragment my_fragment GLSL
1038 # GLSL Shader
1039 END
1040 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
1041
1042 PIPELINE graphics my_pipeline
1043 ATTACH my_shader
1044 ATTACH my_fragment
1045
1046 BIND BUFFER my_buf AS INVALID DESCRIPTOR_SET 1 BINDING 2
1047 END)";
1048
1049 Parser parser;
1050 Result r = parser.Parse(in);
1051 ASSERT_FALSE(r.IsSuccess());
1052 EXPECT_EQ("12: unknown buffer_type: INVALID", r.Error());
1053 }
1054
1055 struct BufferTypeData {
1056 const char* name;
1057 BufferType type;
1058 };
1059
1060 using AmberScriptParserBufferTypeTest = testing::TestWithParam<BufferTypeData>;
TEST_P(AmberScriptParserBufferTypeTest,BufferType)1061 TEST_P(AmberScriptParserBufferTypeTest, BufferType) {
1062 auto test_data = GetParam();
1063
1064 std::string in = R"(
1065 SHADER vertex my_shader PASSTHROUGH
1066 SHADER fragment my_fragment GLSL
1067 # GLSL Shader
1068 END
1069 BUFFER my_buf FORMAT R32G32B32A32_SFLOAT
1070
1071 PIPELINE graphics my_pipeline
1072 ATTACH my_shader
1073 ATTACH my_fragment
1074
1075 BIND BUFFER my_buf AS )" +
1076 std::string(test_data.name) +
1077 " DESCRIPTOR_SET 0 BINDING 0\nEND";
1078
1079 Parser parser;
1080 Result r = parser.Parse(in);
1081 ASSERT_TRUE(r.IsSuccess()) << r.Error();
1082
1083 auto script = parser.GetScript();
1084 const auto& pipelines = script->GetPipelines();
1085 ASSERT_EQ(1U, pipelines.size());
1086
1087 const auto* pipeline = pipelines[0].get();
1088 const auto& bufs = pipeline->GetBuffers();
1089 ASSERT_EQ(1U, bufs.size());
1090 EXPECT_EQ(test_data.type, bufs[0].buffer->GetBufferType());
1091 }
1092 INSTANTIATE_TEST_SUITE_P(
1093 AmberScriptParserBufferTypeTestSamples,
1094 AmberScriptParserBufferTypeTest,
1095 testing::Values(BufferTypeData{"uniform", BufferType::kUniform},
1096 BufferTypeData{
1097 "storage",
1098 BufferType::kStorage})); // NOLINT(whitespace/parens)
1099
TEST_F(AmberScriptParserTest,BindPushConstants)1100 TEST_F(AmberScriptParserTest, BindPushConstants) {
1101 std::string in = R"(
1102 SHADER vertex my_shader PASSTHROUGH
1103 SHADER fragment my_fragment GLSL
1104 # GLSL Shader
1105 END
1106 BUFFER my_buf DATA_TYPE float SIZE 20 FILL 5
1107
1108 PIPELINE graphics my_pipeline
1109 ATTACH my_shader
1110 ATTACH my_fragment
1111
1112 BIND BUFFER my_buf AS push_constant
1113 END)";
1114
1115 Parser parser;
1116 Result r = parser.Parse(in);
1117 ASSERT_TRUE(r.IsSuccess()) << r.Error();
1118
1119 auto script = parser.GetScript();
1120 const auto& pipelines = script->GetPipelines();
1121 ASSERT_EQ(1U, pipelines.size());
1122
1123 const auto* pipeline = pipelines[0].get();
1124 const auto& buf = pipeline->GetPushConstantBuffer();
1125 ASSERT_TRUE(buf.buffer != nullptr);
1126 EXPECT_EQ(20, buf.buffer->ElementCount());
1127 EXPECT_EQ(20, buf.buffer->ValueCount());
1128 EXPECT_EQ(20 * sizeof(float), buf.buffer->GetSizeInBytes());
1129 }
1130
TEST_F(AmberScriptParserTest,BindPushConstantsExtraParams)1131 TEST_F(AmberScriptParserTest, BindPushConstantsExtraParams) {
1132 std::string in = R"(
1133 SHADER vertex my_shader PASSTHROUGH
1134 SHADER fragment my_fragment GLSL
1135 # GLSL Shader
1136 END
1137 BUFFER my_buf DATA_TYPE float SIZE 20 FILL 5
1138
1139 PIPELINE graphics my_pipeline
1140 ATTACH my_shader
1141 ATTACH my_fragment
1142
1143 BIND BUFFER my_buf AS push_constant EXTRA
1144 END)";
1145
1146 Parser parser;
1147 Result r = parser.Parse(in);
1148 ASSERT_FALSE(r.IsSuccess());
1149 EXPECT_EQ("12: extra parameters after BIND command", r.Error());
1150 }
1151
TEST_F(AmberScriptParserTest,BindBufferOpenCLArgName)1152 TEST_F(AmberScriptParserTest, BindBufferOpenCLArgName) {
1153 std::string in = R"(
1154 SHADER compute my_shader OPENCL-C
1155 #shader
1156 END
1157 BUFFER my_buf DATA_TYPE uint32 DATA 1 END
1158
1159 PIPELINE compute my_pipeline
1160 ATTACH my_shader
1161 BIND BUFFER my_buf AS storage KERNEL ARG_NAME arg
1162 END)";
1163
1164 Parser parser;
1165 Result r = parser.Parse(in);
1166 ASSERT_TRUE(r.IsSuccess());
1167 }
1168
TEST_F(AmberScriptParserTest,BindBufferOpenCLArgNumber)1169 TEST_F(AmberScriptParserTest, BindBufferOpenCLArgNumber) {
1170 std::string in = R"(
1171 SHADER compute my_shader OPENCL-C
1172 #shader
1173 END
1174 BUFFER my_buf DATA_TYPE uint32 DATA 1 END
1175
1176 PIPELINE compute my_pipeline
1177 ATTACH my_shader
1178 BIND BUFFER my_buf AS storage KERNEL ARG_NUMBER 0
1179 END)";
1180
1181 Parser parser;
1182 Result r = parser.Parse(in);
1183 ASSERT_TRUE(r.IsSuccess());
1184 }
1185
TEST_F(AmberScriptParserTest,BindBufferOpenCLArgNameTypeless)1186 TEST_F(AmberScriptParserTest, BindBufferOpenCLArgNameTypeless) {
1187 std::string in = R"(
1188 SHADER compute my_shader OPENCL-C
1189 #shader
1190 END
1191 BUFFER my_buf DATA_TYPE uint32 DATA 1 END
1192
1193 PIPELINE compute my_pipeline
1194 ATTACH my_shader
1195 BIND BUFFER my_buf KERNEL ARG_NAME arg
1196 END)";
1197
1198 Parser parser;
1199 Result r = parser.Parse(in);
1200 ASSERT_TRUE(r.IsSuccess());
1201 }
1202
TEST_F(AmberScriptParserTest,BindBufferOpenCLArgNumberTypeless)1203 TEST_F(AmberScriptParserTest, BindBufferOpenCLArgNumberTypeless) {
1204 std::string in = R"(
1205 SHADER compute my_shader OPENCL-C
1206 #shader
1207 END
1208 BUFFER my_buf DATA_TYPE uint32 DATA 1 END
1209
1210 PIPELINE compute my_pipeline
1211 ATTACH my_shader
1212 BIND BUFFER my_buf KERNEL ARG_NUMBER 0
1213 END)";
1214
1215 Parser parser;
1216 Result r = parser.Parse(in);
1217 ASSERT_TRUE(r.IsSuccess());
1218 }
1219
TEST_F(AmberScriptParserTest,BindBufferOpenCLMissingKernel)1220 TEST_F(AmberScriptParserTest, BindBufferOpenCLMissingKernel) {
1221 std::string in = R"(
1222 SHADER compute my_shader OPENCL-C
1223 #shader
1224 END
1225 BUFFER my_buf DATA_TYPE uint32 DATA 1 END
1226
1227 PIPELINE compute my_pipeline
1228 ATTACH my_shader
1229 BIND BUFFER my_buf AS storage ARG_NAME arg
1230 END)";
1231
1232 Parser parser;
1233 Result r = parser.Parse(in);
1234 ASSERT_FALSE(r.IsSuccess());
1235 EXPECT_EQ("9: missing DESCRIPTOR_SET or KERNEL for BIND command", r.Error());
1236 }
1237
TEST_F(AmberScriptParserTest,BindBufferOpenCLMissingArg)1238 TEST_F(AmberScriptParserTest, BindBufferOpenCLMissingArg) {
1239 std::string in = R"(
1240 SHADER compute my_shader OPENCL-C
1241 #shader
1242 END
1243 BUFFER my_buf DATA_TYPE uint32 DATA 1 END
1244
1245 PIPELINE compute my_pipeline
1246 ATTACH my_shader
1247 BIND BUFFER my_buf AS storage KERNEL arg
1248 END)";
1249
1250 Parser parser;
1251 Result r = parser.Parse(in);
1252 ASSERT_FALSE(r.IsSuccess());
1253 EXPECT_EQ("9: missing ARG_NAME or ARG_NUMBER keyword", r.Error());
1254 }
1255
TEST_F(AmberScriptParserTest,BindBufferOpenCLMissingArgName)1256 TEST_F(AmberScriptParserTest, BindBufferOpenCLMissingArgName) {
1257 std::string in = R"(
1258 SHADER compute my_shader OPENCL-C
1259 #shader
1260 END
1261 BUFFER my_buf DATA_TYPE uint32 DATA 1 END
1262
1263 PIPELINE compute my_pipeline
1264 ATTACH my_shader
1265 BIND BUFFER my_buf KERNEL ARG_NAME
1266 END)";
1267
1268 Parser parser;
1269 Result r = parser.Parse(in);
1270 ASSERT_FALSE(r.IsSuccess());
1271 EXPECT_EQ("10: expected argument identifier", r.Error());
1272 }
1273
TEST_F(AmberScriptParserTest,BindBufferOpenCLMissingArgNumber)1274 TEST_F(AmberScriptParserTest, BindBufferOpenCLMissingArgNumber) {
1275 std::string in = R"(
1276 SHADER compute my_shader OPENCL-C
1277 #shader
1278 END
1279 BUFFER my_buf DATA_TYPE uint32 DATA 1 END
1280
1281 PIPELINE compute my_pipeline
1282 ATTACH my_shader
1283 BIND BUFFER my_buf AS storage KERNEL ARG_NUMBER
1284 END)";
1285
1286 Parser parser;
1287 Result r = parser.Parse(in);
1288 ASSERT_FALSE(r.IsSuccess());
1289 EXPECT_EQ("10: expected argument number", r.Error());
1290 }
1291
TEST_F(AmberScriptParserTest,BindBufferOpenCLArgNameNotString)1292 TEST_F(AmberScriptParserTest, BindBufferOpenCLArgNameNotString) {
1293 std::string in = R"(
1294 SHADER compute my_shader OPENCL-C
1295 #shader
1296 END
1297 BUFFER my_buf DATA_TYPE uint32 DATA 1 END
1298
1299 PIPELINE compute my_pipeline
1300 ATTACH my_shader
1301 BIND BUFFER my_buf AS storage KERNEL ARG_NAME 0
1302 END)";
1303
1304 Parser parser;
1305 Result r = parser.Parse(in);
1306 ASSERT_FALSE(r.IsSuccess());
1307 EXPECT_EQ("9: expected argument identifier", r.Error());
1308 }
1309
TEST_F(AmberScriptParserTest,BindBufferOpenCLArgNumberNotInteger)1310 TEST_F(AmberScriptParserTest, BindBufferOpenCLArgNumberNotInteger) {
1311 std::string in = R"(
1312 SHADER compute my_shader OPENCL-C
1313 #shader
1314 END
1315 BUFFER my_buf DATA_TYPE uint32 DATA 1 END
1316
1317 PIPELINE compute my_pipeline
1318 ATTACH my_shader
1319 BIND BUFFER my_buf KERNEL ARG_NUMBER in
1320 END)";
1321
1322 Parser parser;
1323 Result r = parser.Parse(in);
1324 ASSERT_FALSE(r.IsSuccess());
1325 EXPECT_EQ("9: expected argument number", r.Error());
1326 }
1327
1328 } // namespace amberscript
1329 } // namespace amber
1330