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