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