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