1 // Copyright 2018 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 implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 #include "src/executor.h"
16
17 #include <memory>
18 #include <string>
19 #include <utility>
20 #include <vector>
21
22 #include "gtest/gtest.h"
23 #include "src/engine.h"
24 #include "src/make_unique.h"
25 #include "src/vkscript/parser.h"
26
27 namespace amber {
28 namespace vkscript {
29 namespace {
30
31 class EngineStub : public Engine {
32 public:
EngineStub()33 EngineStub() : Engine() {}
34 ~EngineStub() override = default;
35
36 // Engine
Initialize(EngineConfig *,Delegate *,const std::vector<std::string> & features,const std::vector<std::string> & instance_exts,const std::vector<std::string> & device_exts)37 Result Initialize(EngineConfig*,
38 Delegate*,
39 const std::vector<std::string>& features,
40 const std::vector<std::string>& instance_exts,
41 const std::vector<std::string>& device_exts) override {
42 features_ = features;
43 instance_extensions_ = instance_exts;
44 device_extensions_ = device_exts;
45 return {};
46 }
47
GetFeatures() const48 const std::vector<std::string>& GetFeatures() const { return features_; }
GetDeviceExtensions() const49 const std::vector<std::string>& GetDeviceExtensions() const {
50 return device_extensions_;
51 }
GetFenceTimeoutMs()52 uint32_t GetFenceTimeoutMs() { return GetEngineData().fence_timeout_ms; }
53
CreatePipeline(Pipeline *)54 Result CreatePipeline(Pipeline*) override { return {}; }
55
FailClearColorCommand()56 void FailClearColorCommand() { fail_clear_color_command_ = true; }
DidClearColorCommand()57 bool DidClearColorCommand() { return did_clear_color_command_ = true; }
GetLastClearColorCommand()58 ClearColorCommand* GetLastClearColorCommand() { return last_clear_color_; }
DoClearColor(const ClearColorCommand * cmd)59 Result DoClearColor(const ClearColorCommand* cmd) override {
60 did_clear_color_command_ = true;
61
62 if (fail_clear_color_command_)
63 return Result("clear color command failed");
64
65 last_clear_color_ = const_cast<ClearColorCommand*>(cmd);
66 return {};
67 }
68
FailClearStencilCommand()69 void FailClearStencilCommand() { fail_clear_stencil_command_ = true; }
DidClearStencilCommand() const70 bool DidClearStencilCommand() const { return did_clear_stencil_command_; }
DoClearStencil(const ClearStencilCommand *)71 Result DoClearStencil(const ClearStencilCommand*) override {
72 did_clear_stencil_command_ = true;
73
74 if (fail_clear_stencil_command_)
75 return Result("clear stencil command failed");
76
77 return {};
78 }
79
FailClearDepthCommand()80 void FailClearDepthCommand() { fail_clear_depth_command_ = true; }
DidClearDepthCommand() const81 bool DidClearDepthCommand() const { return did_clear_depth_command_; }
DoClearDepth(const ClearDepthCommand *)82 Result DoClearDepth(const ClearDepthCommand*) override {
83 did_clear_depth_command_ = true;
84
85 if (fail_clear_depth_command_)
86 return Result("clear depth command failed");
87
88 return {};
89 }
90
FailClearCommand()91 void FailClearCommand() { fail_clear_command_ = true; }
DidClearCommand() const92 bool DidClearCommand() const { return did_clear_command_; }
DoClear(const ClearCommand *)93 Result DoClear(const ClearCommand*) override {
94 did_clear_command_ = true;
95
96 if (fail_clear_command_)
97 return Result("clear command failed");
98 return {};
99 }
100
FailDrawRectCommand()101 void FailDrawRectCommand() { fail_draw_rect_command_ = true; }
DidDrawRectCommand() const102 bool DidDrawRectCommand() const { return did_draw_rect_command_; }
DoDrawRect(const DrawRectCommand *)103 Result DoDrawRect(const DrawRectCommand*) override {
104 did_draw_rect_command_ = true;
105
106 if (fail_draw_rect_command_)
107 return Result("draw rect command failed");
108 return {};
109 }
110
FailDrawArraysCommand()111 void FailDrawArraysCommand() { fail_draw_arrays_command_ = true; }
DidDrawArraysCommand() const112 bool DidDrawArraysCommand() const { return did_draw_arrays_command_; }
DoDrawArrays(const DrawArraysCommand *)113 Result DoDrawArrays(const DrawArraysCommand*) override {
114 did_draw_arrays_command_ = true;
115
116 if (fail_draw_arrays_command_)
117 return Result("draw arrays command failed");
118 return {};
119 }
120
FailComputeCommand()121 void FailComputeCommand() { fail_compute_command_ = true; }
DidComputeCommand() const122 bool DidComputeCommand() const { return did_compute_command_; }
DoCompute(const ComputeCommand *)123 Result DoCompute(const ComputeCommand*) override {
124 did_compute_command_ = true;
125
126 if (fail_compute_command_)
127 return Result("compute command failed");
128 return {};
129 }
130
FailEntryPointCommand()131 void FailEntryPointCommand() { fail_entry_point_command_ = true; }
DidEntryPointCommand() const132 bool DidEntryPointCommand() const { return did_entry_point_command_; }
DoEntryPoint(const EntryPointCommand *)133 Result DoEntryPoint(const EntryPointCommand*) override {
134 did_entry_point_command_ = true;
135
136 if (fail_entry_point_command_)
137 return Result("entrypoint command failed");
138 return {};
139 }
140
FailPatchParameterVerticesCommand()141 void FailPatchParameterVerticesCommand() { fail_patch_command_ = true; }
DidPatchParameterVerticesCommand() const142 bool DidPatchParameterVerticesCommand() const { return did_patch_command_; }
DoPatchParameterVertices(const PatchParameterVerticesCommand *)143 Result DoPatchParameterVertices(
144 const PatchParameterVerticesCommand*) override {
145 did_patch_command_ = true;
146
147 if (fail_patch_command_)
148 return Result("patch command failed");
149 return {};
150 }
151
FailBufferCommand()152 void FailBufferCommand() { fail_buffer_command_ = true; }
DidBufferCommand() const153 bool DidBufferCommand() const { return did_buffer_command_; }
DoBuffer(const BufferCommand *)154 Result DoBuffer(const BufferCommand*) override {
155 did_buffer_command_ = true;
156
157 if (fail_buffer_command_)
158 return Result("buffer command failed");
159 return {};
160 }
161
162 private:
163 bool fail_clear_command_ = false;
164 bool fail_clear_color_command_ = false;
165 bool fail_clear_stencil_command_ = false;
166 bool fail_clear_depth_command_ = false;
167 bool fail_draw_rect_command_ = false;
168 bool fail_draw_arrays_command_ = false;
169 bool fail_compute_command_ = false;
170 bool fail_entry_point_command_ = false;
171 bool fail_patch_command_ = false;
172 bool fail_buffer_command_ = false;
173
174 bool did_clear_command_ = false;
175 bool did_clear_color_command_ = false;
176 bool did_clear_stencil_command_ = false;
177 bool did_clear_depth_command_ = false;
178 bool did_draw_rect_command_ = false;
179 bool did_draw_arrays_command_ = false;
180 bool did_compute_command_ = false;
181 bool did_entry_point_command_ = false;
182 bool did_patch_command_ = false;
183 bool did_buffer_command_ = false;
184
185 std::vector<std::string> features_;
186 std::vector<std::string> instance_extensions_;
187 std::vector<std::string> device_extensions_;
188
189 ClearColorCommand* last_clear_color_ = nullptr;
190 };
191
192 class VkScriptExecutorTest : public testing::Test {
193 public:
194 VkScriptExecutorTest() = default;
195 ~VkScriptExecutorTest() = default;
196
MakeEngine()197 std::unique_ptr<Engine> MakeEngine() { return MakeUnique<EngineStub>(); }
MakeAndInitializeEngine(const std::vector<std::string> & features,const std::vector<std::string> & instance_extensions,const std::vector<std::string> & device_extensions)198 std::unique_ptr<Engine> MakeAndInitializeEngine(
199 const std::vector<std::string>& features,
200 const std::vector<std::string>& instance_extensions,
201 const std::vector<std::string>& device_extensions) {
202 auto engine = MakeUnique<EngineStub>();
203 engine->Initialize(nullptr, nullptr, features, instance_extensions,
204 device_extensions);
205 return std::move(engine);
206 }
ToStub(Engine * engine)207 EngineStub* ToStub(Engine* engine) {
208 return static_cast<EngineStub*>(engine);
209 }
210 };
211
212 } // namespace
213
TEST_F(VkScriptExecutorTest,ExecutesRequiredFeatures)214 TEST_F(VkScriptExecutorTest, ExecutesRequiredFeatures) {
215 std::string input = R"(
216 [require]
217 robustBufferAccess
218 logicOp)";
219
220 Parser parser;
221 parser.SkipValidationForTest();
222 ASSERT_TRUE(parser.Parse(input).IsSuccess());
223
224 auto script = parser.GetScript();
225 auto engine = MakeAndInitializeEngine(script->GetRequiredFeatures(),
226 script->GetRequiredInstanceExtensions(),
227 script->GetRequiredDeviceExtensions());
228
229 Options options;
230 Executor ex;
231 Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options);
232 ASSERT_TRUE(r.IsSuccess());
233
234 const auto& features = ToStub(engine.get())->GetFeatures();
235 ASSERT_EQ(2U, features.size());
236 EXPECT_EQ("robustBufferAccess", features[0]);
237 EXPECT_EQ("logicOp", features[1]);
238
239 const auto& extensions = ToStub(engine.get())->GetDeviceExtensions();
240 ASSERT_EQ(static_cast<size_t>(0U), extensions.size());
241 }
242
TEST_F(VkScriptExecutorTest,ExecutesRequiredExtensions)243 TEST_F(VkScriptExecutorTest, ExecutesRequiredExtensions) {
244 std::string input = R"(
245 [require]
246 VK_KHR_storage_buffer_storage_class
247 VK_KHR_variable_pointers)";
248
249 Parser parser;
250 parser.SkipValidationForTest();
251 ASSERT_TRUE(parser.Parse(input).IsSuccess());
252
253 auto script = parser.GetScript();
254 auto engine = MakeAndInitializeEngine(script->GetRequiredFeatures(),
255 script->GetRequiredInstanceExtensions(),
256 script->GetRequiredDeviceExtensions());
257
258 Options options;
259 Executor ex;
260 Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options);
261 ASSERT_TRUE(r.IsSuccess());
262
263 const auto& features = ToStub(engine.get())->GetFeatures();
264 ASSERT_EQ(static_cast<size_t>(0U), features.size());
265
266 const auto& extensions = ToStub(engine.get())->GetDeviceExtensions();
267 ASSERT_EQ(2U, extensions.size());
268 EXPECT_EQ("VK_KHR_storage_buffer_storage_class", extensions[0]);
269 EXPECT_EQ("VK_KHR_variable_pointers", extensions[1]);
270 }
271
TEST_F(VkScriptExecutorTest,ExecutesRequiredFrameBuffers)272 TEST_F(VkScriptExecutorTest, ExecutesRequiredFrameBuffers) {
273 std::string input = R"(
274 [require]
275 framebuffer R32G32B32A32_SFLOAT
276 depthstencil D24_UNORM_S8_UINT)";
277
278 Parser parser;
279 parser.SkipValidationForTest();
280 ASSERT_TRUE(parser.Parse(input).IsSuccess());
281
282 auto script = parser.GetScript();
283 auto engine = MakeAndInitializeEngine(script->GetRequiredFeatures(),
284 script->GetRequiredInstanceExtensions(),
285 script->GetRequiredDeviceExtensions());
286
287 Options options;
288 Executor ex;
289 Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options);
290 ASSERT_TRUE(r.IsSuccess());
291
292 const auto& features = ToStub(engine.get())->GetFeatures();
293 ASSERT_EQ(static_cast<size_t>(0U), features.size());
294
295 const auto& extensions = ToStub(engine.get())->GetDeviceExtensions();
296 ASSERT_EQ(static_cast<size_t>(0U), extensions.size());
297 }
298
TEST_F(VkScriptExecutorTest,ExecutesRequiredFenceTimeout)299 TEST_F(VkScriptExecutorTest, ExecutesRequiredFenceTimeout) {
300 std::string input = R"(
301 [require]
302 fence_timeout 12345)";
303
304 Parser parser;
305 parser.SkipValidationForTest();
306 ASSERT_TRUE(parser.Parse(input).IsSuccess());
307
308 auto script = parser.GetScript();
309 auto engine = MakeAndInitializeEngine(script->GetRequiredFeatures(),
310 script->GetRequiredInstanceExtensions(),
311 script->GetRequiredDeviceExtensions());
312
313 Options options;
314 Executor ex;
315 Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options);
316 ASSERT_TRUE(r.IsSuccess());
317
318 const auto& features = ToStub(engine.get())->GetFeatures();
319 ASSERT_EQ(static_cast<size_t>(0U), features.size());
320
321 const auto& extensions = ToStub(engine.get())->GetDeviceExtensions();
322 ASSERT_EQ(static_cast<size_t>(0U), extensions.size());
323
324 EXPECT_EQ(12345U, ToStub(engine.get())->GetFenceTimeoutMs());
325 }
326
TEST_F(VkScriptExecutorTest,ExecutesRequiredAll)327 TEST_F(VkScriptExecutorTest, ExecutesRequiredAll) {
328 std::string input = R"(
329 [require]
330 robustBufferAccess
331 logicOp
332 VK_KHR_storage_buffer_storage_class
333 VK_KHR_variable_pointers
334 framebuffer R32G32B32A32_SFLOAT
335 depthstencil D24_UNORM_S8_UINT
336 fence_timeout 12345)";
337
338 Parser parser;
339 parser.SkipValidationForTest();
340 ASSERT_TRUE(parser.Parse(input).IsSuccess());
341
342 auto script = parser.GetScript();
343 auto engine = MakeAndInitializeEngine(script->GetRequiredFeatures(),
344 script->GetRequiredInstanceExtensions(),
345 script->GetRequiredDeviceExtensions());
346
347 Options options;
348 Executor ex;
349 Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options);
350 ASSERT_TRUE(r.IsSuccess());
351
352 const auto& features = ToStub(engine.get())->GetFeatures();
353 ASSERT_EQ(2U, features.size());
354 EXPECT_EQ("robustBufferAccess", features[0]);
355 EXPECT_EQ("logicOp", features[1]);
356
357 const auto& extensions = ToStub(engine.get())->GetDeviceExtensions();
358 ASSERT_EQ(2U, extensions.size());
359 EXPECT_EQ("VK_KHR_storage_buffer_storage_class", extensions[0]);
360 EXPECT_EQ("VK_KHR_variable_pointers", extensions[1]);
361
362 EXPECT_EQ(12345U, ToStub(engine.get())->GetFenceTimeoutMs());
363 }
364
TEST_F(VkScriptExecutorTest,ClearCommand)365 TEST_F(VkScriptExecutorTest, ClearCommand) {
366 std::string input = R"(
367 [test]
368 clear)";
369
370 Parser parser;
371 parser.SkipValidationForTest();
372 ASSERT_TRUE(parser.Parse(input).IsSuccess());
373
374 auto engine = MakeEngine();
375 auto script = parser.GetScript();
376
377 Options options;
378 Executor ex;
379 Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options);
380 ASSERT_TRUE(r.IsSuccess());
381 EXPECT_TRUE(ToStub(engine.get())->DidClearCommand());
382 }
383
TEST_F(VkScriptExecutorTest,ClearCommandFailure)384 TEST_F(VkScriptExecutorTest, ClearCommandFailure) {
385 std::string input = R"(
386 [test]
387 clear)";
388
389 Parser parser;
390 parser.SkipValidationForTest();
391 ASSERT_TRUE(parser.Parse(input).IsSuccess());
392
393 auto engine = MakeEngine();
394 ToStub(engine.get())->FailClearCommand();
395 auto script = parser.GetScript();
396
397 Options options;
398 Executor ex;
399 Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options);
400 ASSERT_FALSE(r.IsSuccess());
401 EXPECT_EQ("clear command failed", r.Error());
402 }
403
TEST_F(VkScriptExecutorTest,ClearColorCommand)404 TEST_F(VkScriptExecutorTest, ClearColorCommand) {
405 std::string input = R"(
406 [test]
407 clear color 244 123 123 13)";
408
409 Parser parser;
410 parser.SkipValidationForTest();
411 ASSERT_TRUE(parser.Parse(input).IsSuccess());
412
413 auto engine = MakeEngine();
414 auto script = parser.GetScript();
415
416 Options options;
417 Executor ex;
418 Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options);
419 ASSERT_TRUE(r.IsSuccess());
420 ASSERT_TRUE(ToStub(engine.get())->DidClearColorCommand());
421
422 auto* cmd = ToStub(engine.get())->GetLastClearColorCommand();
423 ASSERT_TRUE(cmd != nullptr);
424 ASSERT_TRUE(cmd->IsClearColor());
425
426 EXPECT_EQ(244U, cmd->GetR());
427 EXPECT_EQ(123U, cmd->GetG());
428 EXPECT_EQ(123U, cmd->GetB());
429 EXPECT_EQ(13U, cmd->GetA());
430 }
431
TEST_F(VkScriptExecutorTest,ClearColorCommandFailure)432 TEST_F(VkScriptExecutorTest, ClearColorCommandFailure) {
433 std::string input = R"(
434 [test]
435 clear color 123 123 123 123)";
436
437 Parser parser;
438 parser.SkipValidationForTest();
439 ASSERT_TRUE(parser.Parse(input).IsSuccess());
440
441 auto engine = MakeEngine();
442 ToStub(engine.get())->FailClearColorCommand();
443 auto script = parser.GetScript();
444
445 Options options;
446 Executor ex;
447 Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options);
448 ASSERT_FALSE(r.IsSuccess());
449 EXPECT_EQ("clear color command failed", r.Error());
450 }
451
TEST_F(VkScriptExecutorTest,ClearDepthCommand)452 TEST_F(VkScriptExecutorTest, ClearDepthCommand) {
453 std::string input = R"(
454 [test]
455 clear depth 24)";
456
457 Parser parser;
458 parser.SkipValidationForTest();
459 ASSERT_TRUE(parser.Parse(input).IsSuccess());
460
461 auto engine = MakeEngine();
462 auto script = parser.GetScript();
463
464 Options options;
465 Executor ex;
466 Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options);
467 ASSERT_TRUE(r.IsSuccess());
468 ASSERT_TRUE(ToStub(engine.get())->DidClearDepthCommand());
469 }
470
TEST_F(VkScriptExecutorTest,ClearDepthCommandFailure)471 TEST_F(VkScriptExecutorTest, ClearDepthCommandFailure) {
472 std::string input = R"(
473 [test]
474 clear depth 24)";
475
476 Parser parser;
477 parser.SkipValidationForTest();
478 ASSERT_TRUE(parser.Parse(input).IsSuccess());
479
480 auto engine = MakeEngine();
481 ToStub(engine.get())->FailClearDepthCommand();
482 auto script = parser.GetScript();
483
484 Options options;
485 Executor ex;
486 Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options);
487 ASSERT_FALSE(r.IsSuccess());
488 EXPECT_EQ("clear depth command failed", r.Error());
489 }
490
TEST_F(VkScriptExecutorTest,ClearStencilCommand)491 TEST_F(VkScriptExecutorTest, ClearStencilCommand) {
492 std::string input = R"(
493 [test]
494 clear stencil 24)";
495
496 Parser parser;
497 parser.SkipValidationForTest();
498 ASSERT_TRUE(parser.Parse(input).IsSuccess());
499
500 auto engine = MakeEngine();
501 auto script = parser.GetScript();
502
503 Options options;
504 Executor ex;
505 Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options);
506 ASSERT_TRUE(r.IsSuccess());
507 ASSERT_TRUE(ToStub(engine.get())->DidClearStencilCommand());
508 }
509
TEST_F(VkScriptExecutorTest,ClearStencilCommandFailure)510 TEST_F(VkScriptExecutorTest, ClearStencilCommandFailure) {
511 std::string input = R"(
512 [test]
513 clear stencil 24)";
514
515 Parser parser;
516 parser.SkipValidationForTest();
517 ASSERT_TRUE(parser.Parse(input).IsSuccess());
518
519 auto engine = MakeEngine();
520 ToStub(engine.get())->FailClearStencilCommand();
521 auto script = parser.GetScript();
522
523 Options options;
524 Executor ex;
525 Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options);
526 ASSERT_FALSE(r.IsSuccess());
527 EXPECT_EQ("clear stencil command failed", r.Error());
528 }
529
TEST_F(VkScriptExecutorTest,DrawRectCommand)530 TEST_F(VkScriptExecutorTest, DrawRectCommand) {
531 std::string input = R"(
532 [test]
533 draw rect 2 4 10 20)";
534
535 Parser parser;
536 parser.SkipValidationForTest();
537 ASSERT_TRUE(parser.Parse(input).IsSuccess());
538
539 auto engine = MakeEngine();
540 auto script = parser.GetScript();
541
542 Options options;
543 Executor ex;
544 Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options);
545 ASSERT_TRUE(r.IsSuccess());
546 ASSERT_TRUE(ToStub(engine.get())->DidDrawRectCommand());
547 }
548
TEST_F(VkScriptExecutorTest,DrawRectCommandFailure)549 TEST_F(VkScriptExecutorTest, DrawRectCommandFailure) {
550 std::string input = R"(
551 [test]
552 draw rect 2 4 10 20)";
553
554 Parser parser;
555 parser.SkipValidationForTest();
556 ASSERT_TRUE(parser.Parse(input).IsSuccess());
557
558 auto engine = MakeEngine();
559 ToStub(engine.get())->FailDrawRectCommand();
560 auto script = parser.GetScript();
561
562 Options options;
563 Executor ex;
564 Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options);
565 ASSERT_FALSE(r.IsSuccess());
566 EXPECT_EQ("draw rect command failed", r.Error());
567 }
568
TEST_F(VkScriptExecutorTest,DrawArraysCommand)569 TEST_F(VkScriptExecutorTest, DrawArraysCommand) {
570 std::string input = R"(
571 [test]
572 draw arrays TRIANGLE_LIST 0 0)";
573
574 Parser parser;
575 parser.SkipValidationForTest();
576 ASSERT_TRUE(parser.Parse(input).IsSuccess());
577
578 auto engine = MakeEngine();
579 auto script = parser.GetScript();
580
581 Options options;
582 Executor ex;
583 Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options);
584 ASSERT_TRUE(r.IsSuccess());
585 ASSERT_TRUE(ToStub(engine.get())->DidDrawArraysCommand());
586 }
587
TEST_F(VkScriptExecutorTest,DrawArraysCommandFailure)588 TEST_F(VkScriptExecutorTest, DrawArraysCommandFailure) {
589 std::string input = R"(
590 [test]
591 draw arrays TRIANGLE_LIST 0 0)";
592
593 Parser parser;
594 parser.SkipValidationForTest();
595 ASSERT_TRUE(parser.Parse(input).IsSuccess());
596
597 auto engine = MakeEngine();
598 ToStub(engine.get())->FailDrawArraysCommand();
599 auto script = parser.GetScript();
600
601 Options options;
602 Executor ex;
603 Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options);
604 ASSERT_FALSE(r.IsSuccess());
605 EXPECT_EQ("draw arrays command failed", r.Error());
606 }
607
TEST_F(VkScriptExecutorTest,ComputeCommand)608 TEST_F(VkScriptExecutorTest, ComputeCommand) {
609 std::string input = R"(
610 [test]
611 compute 2 3 4)";
612
613 Parser parser;
614 parser.SkipValidationForTest();
615 ASSERT_TRUE(parser.Parse(input).IsSuccess());
616
617 auto engine = MakeEngine();
618 auto script = parser.GetScript();
619
620 Options options;
621 Executor ex;
622 Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options);
623 ASSERT_TRUE(r.IsSuccess());
624 ASSERT_TRUE(ToStub(engine.get())->DidComputeCommand());
625 }
626
TEST_F(VkScriptExecutorTest,ComputeCommandFailure)627 TEST_F(VkScriptExecutorTest, ComputeCommandFailure) {
628 std::string input = R"(
629 [test]
630 compute 2 3 4)";
631
632 Parser parser;
633 parser.SkipValidationForTest();
634 ASSERT_TRUE(parser.Parse(input).IsSuccess());
635
636 auto engine = MakeEngine();
637 ToStub(engine.get())->FailComputeCommand();
638 auto script = parser.GetScript();
639
640 Options options;
641 Executor ex;
642 Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options);
643 ASSERT_FALSE(r.IsSuccess());
644 EXPECT_EQ("compute command failed", r.Error());
645 }
646
TEST_F(VkScriptExecutorTest,EntryPointCommand)647 TEST_F(VkScriptExecutorTest, EntryPointCommand) {
648 std::string input = R"(
649 [test]
650 vertex entrypoint main)";
651
652 Parser parser;
653 parser.SkipValidationForTest();
654 ASSERT_TRUE(parser.Parse(input).IsSuccess());
655
656 auto engine = MakeEngine();
657 auto script = parser.GetScript();
658
659 Options options;
660 Executor ex;
661 Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options);
662 ASSERT_TRUE(r.IsSuccess());
663 ASSERT_TRUE(ToStub(engine.get())->DidEntryPointCommand());
664 }
665
TEST_F(VkScriptExecutorTest,EntryPointCommandFailure)666 TEST_F(VkScriptExecutorTest, EntryPointCommandFailure) {
667 std::string input = R"(
668 [test]
669 vertex entrypoint main)";
670
671 Parser parser;
672 parser.SkipValidationForTest();
673 ASSERT_TRUE(parser.Parse(input).IsSuccess());
674
675 auto engine = MakeEngine();
676 ToStub(engine.get())->FailEntryPointCommand();
677 auto script = parser.GetScript();
678
679 Options options;
680 Executor ex;
681 Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options);
682 ASSERT_FALSE(r.IsSuccess());
683 EXPECT_EQ("entrypoint command failed", r.Error());
684 }
685
TEST_F(VkScriptExecutorTest,PatchParameterVerticesCommand)686 TEST_F(VkScriptExecutorTest, PatchParameterVerticesCommand) {
687 std::string input = R"(
688 [test]
689 patch parameter vertices 10)";
690
691 Parser parser;
692 parser.SkipValidationForTest();
693 ASSERT_TRUE(parser.Parse(input).IsSuccess());
694
695 auto engine = MakeEngine();
696 auto script = parser.GetScript();
697
698 Options options;
699 Executor ex;
700 Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options);
701 ASSERT_TRUE(r.IsSuccess());
702 ASSERT_TRUE(ToStub(engine.get())->DidPatchParameterVerticesCommand());
703 }
704
TEST_F(VkScriptExecutorTest,PatchParameterVerticesCommandFailure)705 TEST_F(VkScriptExecutorTest, PatchParameterVerticesCommandFailure) {
706 std::string input = R"(
707 [test]
708 patch parameter vertices 10)";
709
710 Parser parser;
711 parser.SkipValidationForTest();
712 ASSERT_TRUE(parser.Parse(input).IsSuccess());
713
714 auto engine = MakeEngine();
715 ToStub(engine.get())->FailPatchParameterVerticesCommand();
716 auto script = parser.GetScript();
717
718 Options options;
719 Executor ex;
720 Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options);
721 ASSERT_FALSE(r.IsSuccess());
722 EXPECT_EQ("patch command failed", r.Error());
723 }
724
TEST_F(VkScriptExecutorTest,DISABLED_ProbeCommand)725 TEST_F(VkScriptExecutorTest, DISABLED_ProbeCommand) {
726 std::string input = R"(
727 [test]
728 probe rect rgba 2 3 40 40 0.2 0.4 0.4 0.3)";
729
730 Parser parser;
731 ASSERT_TRUE(parser.Parse(input).IsSuccess());
732
733 auto engine = MakeEngine();
734 auto script = parser.GetScript();
735
736 Options options;
737 Executor ex;
738 Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options);
739 ASSERT_TRUE(r.IsSuccess());
740 // ASSERT_TRUE(ToStub(engine.get())->DidProbeCommand());
741 }
742
TEST_F(VkScriptExecutorTest,DISABLED_ProbeCommandFailure)743 TEST_F(VkScriptExecutorTest, DISABLED_ProbeCommandFailure) {
744 std::string input = R"(
745 [test]
746 probe rect rgba 2 3 40 40 0.2 0.4 0.4 0.3)";
747
748 Parser parser;
749 ASSERT_TRUE(parser.Parse(input).IsSuccess());
750
751 auto engine = MakeEngine();
752 // ToStub(engine.get())->FailProbeCommand();
753 auto script = parser.GetScript();
754
755 Options options;
756 Executor ex;
757 Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options);
758 ASSERT_FALSE(r.IsSuccess());
759 EXPECT_EQ("probe command failed", r.Error());
760 }
761
TEST_F(VkScriptExecutorTest,BufferCommand)762 TEST_F(VkScriptExecutorTest, BufferCommand) {
763 std::string input = R"(
764 [test]
765 ssbo 0 24)";
766
767 Parser parser;
768 parser.SkipValidationForTest();
769 ASSERT_TRUE(parser.Parse(input).IsSuccess());
770
771 auto engine = MakeEngine();
772 auto script = parser.GetScript();
773
774 Options options;
775 Executor ex;
776 Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options);
777 ASSERT_TRUE(r.IsSuccess());
778 ASSERT_TRUE(ToStub(engine.get())->DidBufferCommand());
779 }
780
TEST_F(VkScriptExecutorTest,BufferCommandFailure)781 TEST_F(VkScriptExecutorTest, BufferCommandFailure) {
782 std::string input = R"(
783 [test]
784 ssbo 0 24)";
785
786 Parser parser;
787 parser.SkipValidationForTest();
788 ASSERT_TRUE(parser.Parse(input).IsSuccess());
789
790 auto engine = MakeEngine();
791 ToStub(engine.get())->FailBufferCommand();
792 auto script = parser.GetScript();
793
794 Options options;
795 Executor ex;
796 Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options);
797 ASSERT_FALSE(r.IsSuccess());
798 EXPECT_EQ("buffer command failed", r.Error());
799 }
800
TEST_F(VkScriptExecutorTest,DISABLED_ProbeSSBOCommand)801 TEST_F(VkScriptExecutorTest, DISABLED_ProbeSSBOCommand) {
802 std::string input = R"(
803 [test]
804 probe ssbo vec3 0 2 <= 2 3 4)";
805
806 Parser parser;
807 ASSERT_TRUE(parser.Parse(input).IsSuccess());
808
809 auto engine = MakeEngine();
810 auto script = parser.GetScript();
811
812 Options options;
813 Executor ex;
814 Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options);
815 ASSERT_TRUE(r.IsSuccess());
816 // ASSERT_TRUE(ToStub(engine.get())->DidProbeSSBOCommand());
817 }
818
TEST_F(VkScriptExecutorTest,DISABLED_ProbeSSBOCommandFailure)819 TEST_F(VkScriptExecutorTest, DISABLED_ProbeSSBOCommandFailure) {
820 std::string input = R"(
821 [test]
822 probe ssbo vec3 0 2 <= 2 3 4)";
823
824 Parser parser;
825 ASSERT_TRUE(parser.Parse(input).IsSuccess());
826
827 auto engine = MakeEngine();
828 // ToStub(engine.get())->FailProbeSSBOCommand();
829 auto script = parser.GetScript();
830
831 Options options;
832 Executor ex;
833 Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options);
834 ASSERT_FALSE(r.IsSuccess());
835 EXPECT_EQ("probe ssbo command failed", r.Error());
836 }
837
838 } // namespace vkscript
839 } // namespace amber
840