From f7d4394212ad6a05295006cde9fb5fbd68c892b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ari=20Suonp=C3=A4=C3=A4?= Date: Wed, 15 Apr 2020 11:26:48 +0300 Subject: [PATCH 1/4] Moved delegate from options to Amber object. Added buffer data loading from a text file. --- docs/amber_script.md | 5 + include/amber/amber.h | 10 +- samples/amber.cc | 20 +-- src/amber.cc | 26 +-- src/amberscript/parser.cc | 219 +++++++++++++++----------- src/amberscript/parser.h | 2 + src/amberscript/parser_buffer_test.cc | 30 +--- src/buffer.h | 14 -- src/executor.cc | 33 +--- src/executor.h | 3 +- src/executor_test.cc | 87 ++++++---- src/parser.cc | 3 +- src/parser.h | 3 +- src/vkscript/parser.cc | 3 +- src/vkscript/parser.h | 1 + tests/cases/buffer_load_text.amber | 55 +++++++ tests/cases/vec4data.txt | 1 + 17 files changed, 293 insertions(+), 222 deletions(-) create mode 100644 tests/cases/buffer_load_text.amber create mode 100644 tests/cases/vec4data.txt diff --git a/docs/amber_script.md b/docs/amber_script.md index c935d5bf1..3eafe6a91 100644 --- a/docs/amber_script.md +++ b/docs/amber_script.md @@ -198,6 +198,11 @@ BUFFER {name} DATA_TYPE {type} {STD140 | STD430} WIDTH {w} HEIGHT {h} \ BUFFER {name} DATA_TYPE {type} {STD140 | STD430} SIZE _size_in_items_ \ FILE BINARY {file_name} +# Defines a buffer which is filled with text data parsed from a file specified +# by `FILE`. +BUFFER {name} DATA_TYPE {type} {STD140 | STD430} SIZE _size_in_items_ \ + FILE TEXT {file_name} + # Creates a buffer which will store the given `FORMAT` of data. These # buffers are used as image and depth buffers in the `PIPELINE` commands. # The buffer will be sized based on the `RENDER_SIZE` of the `PIPELINE`. diff --git a/include/amber/amber.h b/include/amber/amber.h index ddf5779b4..0c679a314 100644 --- a/include/amber/amber.h +++ b/include/amber/amber.h @@ -130,14 +130,12 @@ struct Options { /// If true, disables SPIR-V validation. If false, SPIR-V shaders will be /// validated using the Validator component (spirv-val) from SPIRV-Tools. bool disable_spirv_validation; - /// Delegate implementation - Delegate* delegate; }; /// Main interface to the Amber environment. class Amber { public: - Amber(); + explicit Amber(Delegate* delegate); ~Amber(); /// Parse the given |data| into the |recipe|. @@ -161,6 +159,12 @@ class Amber { amber::Result ExecuteWithShaderData(const amber::Recipe* recipe, Options* opts, const ShaderMap& shader_data); + + /// Returns the delegate object. + Delegate* GetDelegate() const { return delegate_; } + + private: + Delegate* delegate_; }; } // namespace amber diff --git a/samples/amber.cc b/samples/amber.cc index 01ff15990..50bf25385 100644 --- a/samples/amber.cc +++ b/samples/amber.cc @@ -336,7 +336,7 @@ class SampleDelegate : public amber::Delegate { #else return amber::Result("PNG support is not enabled in compile options."); #endif // AMBER_ENABLE_LODEPNG - } else if (file_type == amber::BufferDataFileType::kBinary) { + } else { auto data = ReadFile(path_ + file_name); if (data.empty()) return amber::Result("Failed to load buffer data " + file_name); @@ -349,11 +349,6 @@ class SampleDelegate : public amber::Delegate { buffer->width = 1; buffer->height = 1; - - } else { - assert(file_type == amber::BufferDataFileType::kText); - - // TODO(asuonpaa): Read text file and pass it to parser. } return {}; @@ -418,6 +413,7 @@ std::string disassemble(const std::string& env, int main(int argc, const char** argv) { std::vector args(argv, argv + argc); Options options; + SampleDelegate delegate; if (!ParseArgs(args, &options)) { std::cerr << "Failed to parse arguments." << std::endl; @@ -457,7 +453,10 @@ int main(int argc, const char** argv) { continue; } - amber::Amber am; + // Parse file path and set it for delegate to use when loading buffer data. + delegate.SetScriptPath(file.substr(0, file.find_last_of("/\\") + 1)); + + amber::Amber am(&delegate); std::unique_ptr recipe = amber::MakeUnique(); result = am.Parse(data, recipe.get()); @@ -478,7 +477,6 @@ int main(int argc, const char** argv) { if (options.parse_only) return 0; - SampleDelegate delegate; if (options.log_graphics_calls) delegate.SetLogGraphicsCalls(true); if (options.log_graphics_calls_time) @@ -492,7 +490,6 @@ int main(int argc, const char** argv) { amber_options.execution_type = options.pipeline_create_only ? amber::ExecutionType::kPipelineCreateOnly : amber::ExecutionType::kExecute; - amber_options.delegate = &delegate; amber_options.disable_spirv_validation = options.disable_spirv_validation; std::set required_features; @@ -568,10 +565,7 @@ int main(int argc, const char** argv) { const auto* recipe = recipe_data_elem.recipe.get(); const auto& file = recipe_data_elem.file; - // Parse file path and set it for delegate to use when loading buffer data. - delegate.SetScriptPath(file.substr(0, file.find_last_of("/\\") + 1)); - - amber::Amber am; + amber::Amber am(&delegate); result = am.Execute(recipe, &amber_options); if (!result.IsSuccess()) { std::cerr << file << ": " << result.Error() << std::endl; diff --git a/src/amber.cc b/src/amber.cc index 43d358ec7..9bf806e9d 100644 --- a/src/amber.cc +++ b/src/amber.cc @@ -68,8 +68,7 @@ Options::Options() : engine(amber::EngineType::kEngineTypeVulkan), config(nullptr), execution_type(ExecutionType::kExecute), - disable_spirv_validation(false), - delegate(nullptr) {} + disable_spirv_validation(false) {} Options::~Options() = default; @@ -83,7 +82,7 @@ BufferInfo& BufferInfo::operator=(const BufferInfo&) = default; Delegate::~Delegate() = default; -Amber::Amber() = default; +Amber::Amber(Delegate* delegate) : delegate_(delegate) {} Amber::~Amber() = default; @@ -93,9 +92,9 @@ amber::Result Amber::Parse(const std::string& input, amber::Recipe* recipe) { std::unique_ptr parser; if (input.substr(0, 7) == "#!amber") - parser = MakeUnique(); + parser = MakeUnique(GetDelegate()); else - parser = MakeUnique(); + parser = MakeUnique(GetDelegate()); Result r = parser->Parse(input); if (!r.IsSuccess()) @@ -113,6 +112,7 @@ namespace { // pointer is borrowed, and should not be freed. Result CreateEngineAndCheckRequirements(const Recipe* recipe, Options* opts, + Delegate* delegate, std::unique_ptr* engine_ptr, Script** script_ptr) { if (!recipe) @@ -131,10 +131,10 @@ Result CreateEngineAndCheckRequirements(const Recipe* recipe, // Engine initialization checks requirements. Current backends don't do // much else. Refactor this if they end up doing to much here. - Result r = engine->Initialize(opts->config, opts->delegate, - script->GetRequiredFeatures(), - script->GetRequiredInstanceExtensions(), - script->GetRequiredDeviceExtensions()); + Result r = + engine->Initialize(opts->config, delegate, script->GetRequiredFeatures(), + script->GetRequiredInstanceExtensions(), + script->GetRequiredDeviceExtensions()); if (!r.IsSuccess()) return r; @@ -150,7 +150,8 @@ amber::Result Amber::AreAllRequirementsSupported(const amber::Recipe* recipe, std::unique_ptr engine; Script* script = nullptr; - return CreateEngineAndCheckRequirements(recipe, opts, &engine, &script); + return CreateEngineAndCheckRequirements(recipe, opts, GetDelegate(), &engine, + &script); } amber::Result Amber::Execute(const amber::Recipe* recipe, Options* opts) { @@ -163,14 +164,15 @@ amber::Result Amber::ExecuteWithShaderData(const amber::Recipe* recipe, const ShaderMap& shader_data) { std::unique_ptr engine; Script* script = nullptr; - Result r = CreateEngineAndCheckRequirements(recipe, opts, &engine, &script); + Result r = CreateEngineAndCheckRequirements(recipe, opts, GetDelegate(), + &engine, &script); if (!r.IsSuccess()) return r; script->SetSpvTargetEnv(opts->spv_env); Executor executor; Result executor_result = - executor.Execute(engine.get(), script, shader_data, opts); + executor.Execute(engine.get(), script, shader_data, opts, GetDelegate()); // Hold the executor result until the extractions are complete. This will let // us dump any buffers requested even on failure. diff --git a/src/amberscript/parser.cc b/src/amberscript/parser.cc index bc182711d..653a96f84 100644 --- a/src/amberscript/parser.cc +++ b/src/amberscript/parser.cc @@ -152,9 +152,79 @@ ImageDimension StrToImageDimension(const std::string& str) { return ImageDimension::kUnknown; } +Result ParseBufferData(Buffer* buffer, + Tokenizer* tokenizer, + bool from_data_file) { + auto fmt = buffer->GetFormat(); + const auto& segs = fmt->GetSegments(); + size_t seg_idx = 0; + uint32_t value_count = 0; + + std::vector values; + for (auto token = tokenizer->NextToken();; token = tokenizer->NextToken()) { + if (token->IsEOL()) + continue; + if (token->IsEOS()) { + if (from_data_file) { + break; + } else { + return Result("missing BUFFER END command"); + } + } + if (token->IsIdentifier() && token->AsString() == "END") + break; + if (!token->IsInteger() && !token->IsDouble() && !token->IsHex()) + return Result("invalid BUFFER data value: " + token->ToOriginalString()); + + while (segs[seg_idx].IsPadding()) { + ++seg_idx; + if (seg_idx >= segs.size()) + seg_idx = 0; + } + + Value v; + if (type::Type::IsFloat(segs[seg_idx].GetFormatMode())) { + token->ConvertToDouble(); + + double val = token->IsHex() ? static_cast(token->AsHex()) + : token->AsDouble(); + v.SetDoubleValue(val); + ++value_count; + } else { + if (token->IsDouble()) { + return Result("invalid BUFFER data value: " + + token->ToOriginalString()); + } + + uint64_t val = token->IsHex() ? token->AsHex() : token->AsUint64(); + v.SetIntValue(val); + ++value_count; + } + ++seg_idx; + if (seg_idx >= segs.size()) + seg_idx = 0; + + values.emplace_back(v); + } + // Write final padding bytes + while (segs[seg_idx].IsPadding()) { + ++seg_idx; + if (seg_idx >= segs.size()) + break; + } + + buffer->SetValueCount(value_count); + Result r = buffer->SetData(std::move(values)); + if (!r.IsSuccess()) + return r; + + return {}; +} + } // namespace -Parser::Parser() : amber::Parser() {} +Parser::Parser() : amber::Parser(nullptr) {} +Parser::Parser(Delegate* delegate) : amber::Parser(delegate) {} Parser::~Parser() = default; @@ -1260,27 +1330,10 @@ Result Parser::ParseBuffer() { buffer->SetMipLevels(token->AsUint32()); } else if (token->AsString() == "FILE") { tokenizer_->NextToken(); - token = tokenizer_->NextToken(); - - if (!token->IsIdentifier()) - return Result("invalid value for FILE"); - - BufferDataFileType file_type = BufferDataFileType::kPng; - - if (token->AsString() == "TEXT") { - file_type = BufferDataFileType::kText; - token = tokenizer_->NextToken(); - } else if (token->AsString() == "BINARY") { - file_type = BufferDataFileType::kBinary; - token = tokenizer_->NextToken(); - } else if (token->AsString() == "PNG") { - token = tokenizer_->NextToken(); - } + Result r = ParseBufferInitializerFile(buffer.get()); - if (!token->IsIdentifier()) - return Result("missing file name for FILE"); - - buffer->SetDataFile(token->AsString(), file_type); + if (!r.IsSuccess()) + return r; } else { break; } @@ -1531,31 +1584,8 @@ Result Parser::ParseBufferInitializerSize(Buffer* buffer) { return ParseBufferInitializerFill(buffer, size_in_items); if (token->AsString() == "SERIES_FROM") return ParseBufferInitializerSeries(buffer, size_in_items); - if (token->AsString() == "FILE") { - token = tokenizer_->NextToken(); - - if (!token->IsIdentifier()) - return Result("invalid value for FILE"); - - BufferDataFileType file_type = BufferDataFileType::kPng; - - if (token->AsString() == "TEXT") { - file_type = BufferDataFileType::kText; - token = tokenizer_->NextToken(); - } else if (token->AsString() == "BINARY") { - file_type = BufferDataFileType::kBinary; - token = tokenizer_->NextToken(); - } else if (token->AsString() == "PNG") { - token = tokenizer_->NextToken(); - } - - if (!token->IsIdentifier()) - return Result("missing file name for FILE"); - - buffer->SetDataFile(token->AsString(), file_type); - - return {}; - } + if (token->AsString() == "FILE") + return ParseBufferInitializerFile(buffer); return Result("invalid BUFFER initializer provided"); } @@ -1647,65 +1677,66 @@ Result Parser::ParseBufferInitializerSeries(Buffer* buffer, } Result Parser::ParseBufferInitializerData(Buffer* buffer) { - auto fmt = buffer->GetFormat(); - const auto& segs = fmt->GetSegments(); - size_t seg_idx = 0; - uint32_t value_count = 0; + Result r = ParseBufferData(buffer, tokenizer_.get(), false); - std::vector values; - for (auto token = tokenizer_->NextToken();; token = tokenizer_->NextToken()) { - if (token->IsEOL()) - continue; - if (token->IsEOS()) - return Result("missing BUFFER END command"); - if (token->IsIdentifier() && token->AsString() == "END") - break; - if (!token->IsInteger() && !token->IsDouble() && !token->IsHex()) - return Result("invalid BUFFER data value: " + token->ToOriginalString()); + if (!r.IsSuccess()) + return r; - while (segs[seg_idx].IsPadding()) { - ++seg_idx; - if (seg_idx >= segs.size()) - seg_idx = 0; - } + return ValidateEndOfStatement("BUFFER data command"); +} - Value v; - if (type::Type::IsFloat(segs[seg_idx].GetFormatMode())) { - token->ConvertToDouble(); +Result Parser::ParseBufferInitializerFile(Buffer* buffer) { + auto token = tokenizer_->NextToken(); - double val = token->IsHex() ? static_cast(token->AsHex()) - : token->AsDouble(); - v.SetDoubleValue(val); - ++value_count; - } else { - if (token->IsDouble()) { - return Result("invalid BUFFER data value: " + - token->ToOriginalString()); - } + if (!token->IsIdentifier()) + return Result("invalid value for FILE"); - uint64_t val = token->IsHex() ? token->AsHex() : token->AsUint64(); - v.SetIntValue(val); - ++value_count; - } - ++seg_idx; - if (seg_idx >= segs.size()) - seg_idx = 0; + BufferDataFileType file_type = BufferDataFileType::kPng; - values.emplace_back(v); - } - // Write final padding bytes - while (segs[seg_idx].IsPadding()) { - ++seg_idx; - if (seg_idx >= segs.size()) - break; + if (token->AsString() == "TEXT") { + file_type = BufferDataFileType::kText; + token = tokenizer_->NextToken(); + } else if (token->AsString() == "BINARY") { + file_type = BufferDataFileType::kBinary; + token = tokenizer_->NextToken(); + } else if (token->AsString() == "PNG") { + token = tokenizer_->NextToken(); } - buffer->SetValueCount(value_count); - Result r = buffer->SetData(std::move(values)); + if (!token->IsIdentifier()) + return Result("missing file name for FILE"); + + if (!delegate_) + return Result("missing delegate"); + + BufferInfo info; + Result r = delegate_->LoadBufferData(token->AsString(), file_type, &info); + if (!r.IsSuccess()) return r; - return ValidateEndOfStatement("BUFFER data command"); + std::vector* data = buffer->ValuePtr(); + + data->clear(); + data->reserve(info.values.size()); + for (auto v : info.values) { + data->push_back(v.AsUint8()); + } + + if (file_type == BufferDataFileType::kText) { + auto s = std::string(data->begin(), data->end()); + Tokenizer tok(s); + r = ParseBufferData(buffer, &tok, true); + if (!r.IsSuccess()) + return r; + } else { + buffer->SetElementCount(static_cast(data->size()) / + buffer->GetFormat()->SizeInBytes()); + buffer->SetWidth(info.width); + buffer->SetHeight(info.height); + } + + return {}; } Result Parser::ParseRun() { diff --git a/src/amberscript/parser.h b/src/amberscript/parser.h index 524cb43b8..c78d29d01 100644 --- a/src/amberscript/parser.h +++ b/src/amberscript/parser.h @@ -35,6 +35,7 @@ namespace amberscript { class Parser : public amber::Parser { public: Parser(); + explicit Parser(Delegate* delegate); ~Parser() override; // amber::Parser @@ -56,6 +57,7 @@ class Parser : public amber::Parser { Result ParseBufferInitializerFill(Buffer*, uint32_t); Result ParseBufferInitializerSeries(Buffer*, uint32_t); Result ParseBufferInitializerData(Buffer*); + Result ParseBufferInitializerFile(Buffer*); Result ParseShaderBlock(); Result ParsePipelineBlock(); Result ParsePipelineAttach(Pipeline*); diff --git a/src/amberscript/parser_buffer_test.cc b/src/amberscript/parser_buffer_test.cc index 023b9ba09..100bfbcb5 100644 --- a/src/amberscript/parser_buffer_test.cc +++ b/src/amberscript/parser_buffer_test.cc @@ -1092,15 +1092,9 @@ TEST_F(AmberScriptParserTest, BufferDataFilePng) { Parser parser; Result r = parser.Parse(in); - ASSERT_TRUE(r.IsSuccess()) << r.Error(); - - auto script = parser.GetScript(); - const auto& buffers = script->GetBuffers(); - ASSERT_EQ(1U, buffers.size()); + ASSERT_FALSE(r.IsSuccess()); - ASSERT_TRUE(buffers[0] != nullptr); - EXPECT_EQ("foo.png", buffers[0]->GetDataFile()); - EXPECT_EQ(BufferDataFileType::kPng, buffers[0]->GetDataFileType()); + EXPECT_EQ("1: missing delegate", r.Error()); } TEST_F(AmberScriptParserTest, BufferMissingDataFileBinary) { @@ -1119,15 +1113,9 @@ TEST_F(AmberScriptParserTest, BufferDataFileBinary) { Parser parser; Result r = parser.Parse(in); - ASSERT_TRUE(r.IsSuccess()) << r.Error(); - - auto script = parser.GetScript(); - const auto& buffers = script->GetBuffers(); - ASSERT_EQ(1U, buffers.size()); + ASSERT_FALSE(r.IsSuccess()); - ASSERT_TRUE(buffers[0] != nullptr); - EXPECT_EQ("data.bin", buffers[0]->GetDataFile()); - EXPECT_EQ(BufferDataFileType::kBinary, buffers[0]->GetDataFileType()); + EXPECT_EQ("1: missing delegate", r.Error()); } TEST_F(AmberScriptParserTest, BufferMissingDataFileText) { @@ -1146,15 +1134,9 @@ TEST_F(AmberScriptParserTest, BufferDataFileText) { Parser parser; Result r = parser.Parse(in); - ASSERT_TRUE(r.IsSuccess()) << r.Error(); - - auto script = parser.GetScript(); - const auto& buffers = script->GetBuffers(); - ASSERT_EQ(1U, buffers.size()); + ASSERT_FALSE(r.IsSuccess()); - ASSERT_TRUE(buffers[0] != nullptr); - EXPECT_EQ("data.txt", buffers[0]->GetDataFile()); - EXPECT_EQ(BufferDataFileType::kText, buffers[0]->GetDataFileType()); + EXPECT_EQ("1: missing delegate", r.Error()); } } // namespace amberscript diff --git a/src/buffer.h b/src/buffer.h index be44a1fd0..ba51f847a 100644 --- a/src/buffer.h +++ b/src/buffer.h @@ -197,18 +197,6 @@ class Buffer { /// Returns the number of mip levels. uint32_t GetMipLevels() const { return mip_levels_; } - /// Sets the file name for loading data into the buffer. - void SetDataFile(std::string data_file, BufferDataFileType type) { - data_file_ = data_file; - data_file_type_ = type; - } - - /// Returns the file name used to load buffer data from. - std::string GetDataFile() { return data_file_; } - - /// Returns the file type to load buffer data from. - BufferDataFileType GetDataFileType() const { return data_file_type_; } - /// Returns a pointer to the internal storage of the buffer. std::vector* ValuePtr() { return &bytes_; } /// Returns a pointer to the internal storage of the buffer. @@ -265,8 +253,6 @@ class Buffer { Format* format_ = nullptr; Sampler* sampler_ = nullptr; ImageDimension image_dim_ = ImageDimension::kUnknown; - std::string data_file_; - BufferDataFileType data_file_type_ = BufferDataFileType::kUnknown; }; } // namespace amber diff --git a/src/executor.cc b/src/executor.cc index 3470cbebc..7df9a1fbc 100644 --- a/src/executor.cc +++ b/src/executor.cc @@ -53,7 +53,8 @@ Result Executor::CompileShaders(const amber::Script* script, Result Executor::Execute(Engine* engine, const amber::Script* script, const ShaderMap& shader_map, - Options* options) { + Options* options, + Delegate* delegate) { engine->SetEngineData(script->GetEngineData()); if (!script->GetPipelines().empty()) { @@ -89,36 +90,10 @@ Result Executor::Execute(Engine* engine, Engine::Debugger* debugger = nullptr; - // Load data to buffers - for (const auto& buf : script->GetBuffers()) { - if (buf->GetDataFile().empty()) - continue; - - BufferInfo info; - Result r = options->delegate->LoadBufferData(buf->GetDataFile(), - buf->GetDataFileType(), &info); - if (!r.IsSuccess()) - return r; - - std::vector* data = buf->ValuePtr(); - - data->clear(); - data->reserve(info.values.size()); - for (auto v : info.values) { - data->push_back(v.AsUint8()); - } - - buf->SetElementCount(static_cast(data->size()) / - buf->GetFormat()->SizeInBytes()); - buf->SetWidth(info.width); - buf->SetHeight(info.height); - } - // Process Commands for (const auto& cmd : script->GetCommands()) { - if (options->delegate && options->delegate->LogExecuteCalls()) { - options->delegate->Log(std::to_string(cmd->GetLine()) + ": " + - cmd->ToString()); + if (delegate && delegate->LogExecuteCalls()) { + delegate->Log(std::to_string(cmd->GetLine()) + ": " + cmd->ToString()); } auto dbg_script = cmd->GetDebugScript(); diff --git a/src/executor.h b/src/executor.h index de5c794b5..e918634a5 100644 --- a/src/executor.h +++ b/src/executor.h @@ -36,7 +36,8 @@ class Executor { Result Execute(Engine* engine, const Script* script, const ShaderMap& map, - Options* options); + Options* options, + Delegate* delegate); private: Result CompileShaders(const Script* script, diff --git a/src/executor_test.cc b/src/executor_test.cc index 2afdfb59b..6a35d9eaf 100644 --- a/src/executor_test.cc +++ b/src/executor_test.cc @@ -243,7 +243,8 @@ logicOp)"; Options options; Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options); + Result r = + ex.Execute(engine.get(), script.get(), ShaderMap(), &options, nullptr); ASSERT_TRUE(r.IsSuccess()); const auto& features = ToStub(engine.get())->GetFeatures(); @@ -272,7 +273,8 @@ VK_KHR_variable_pointers)"; Options options; Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options); + Result r = + ex.Execute(engine.get(), script.get(), ShaderMap(), &options, nullptr); ASSERT_TRUE(r.IsSuccess()); const auto& features = ToStub(engine.get())->GetFeatures(); @@ -301,7 +303,8 @@ depthstencil D24_UNORM_S8_UINT)"; Options options; Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options); + Result r = + ex.Execute(engine.get(), script.get(), ShaderMap(), &options, nullptr); ASSERT_TRUE(r.IsSuccess()); const auto& features = ToStub(engine.get())->GetFeatures(); @@ -327,7 +330,8 @@ fence_timeout 12345)"; Options options; Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options); + Result r = + ex.Execute(engine.get(), script.get(), ShaderMap(), &options, nullptr); ASSERT_TRUE(r.IsSuccess()); const auto& features = ToStub(engine.get())->GetFeatures(); @@ -361,7 +365,8 @@ fence_timeout 12345)"; Options options; Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options); + Result r = + ex.Execute(engine.get(), script.get(), ShaderMap(), &options, nullptr); ASSERT_TRUE(r.IsSuccess()); const auto& features = ToStub(engine.get())->GetFeatures(); @@ -391,7 +396,8 @@ clear)"; Options options; Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options); + Result r = + ex.Execute(engine.get(), script.get(), ShaderMap(), &options, nullptr); ASSERT_TRUE(r.IsSuccess()); EXPECT_TRUE(ToStub(engine.get())->DidClearCommand()); } @@ -411,7 +417,8 @@ clear)"; Options options; Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options); + Result r = + ex.Execute(engine.get(), script.get(), ShaderMap(), &options, nullptr); ASSERT_FALSE(r.IsSuccess()); EXPECT_EQ("clear command failed", r.Error()); } @@ -430,7 +437,8 @@ clear color 244 123 123 13)"; Options options; Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options); + Result r = + ex.Execute(engine.get(), script.get(), ShaderMap(), &options, nullptr); ASSERT_TRUE(r.IsSuccess()); ASSERT_TRUE(ToStub(engine.get())->DidClearColorCommand()); @@ -459,7 +467,8 @@ clear color 123 123 123 123)"; Options options; Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options); + Result r = + ex.Execute(engine.get(), script.get(), ShaderMap(), &options, nullptr); ASSERT_FALSE(r.IsSuccess()); EXPECT_EQ("clear color command failed", r.Error()); } @@ -478,7 +487,8 @@ clear depth 24)"; Options options; Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options); + Result r = + ex.Execute(engine.get(), script.get(), ShaderMap(), &options, nullptr); ASSERT_TRUE(r.IsSuccess()); ASSERT_TRUE(ToStub(engine.get())->DidClearDepthCommand()); } @@ -498,7 +508,8 @@ clear depth 24)"; Options options; Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options); + Result r = + ex.Execute(engine.get(), script.get(), ShaderMap(), &options, nullptr); ASSERT_FALSE(r.IsSuccess()); EXPECT_EQ("clear depth command failed", r.Error()); } @@ -517,7 +528,8 @@ clear stencil 24)"; Options options; Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options); + Result r = + ex.Execute(engine.get(), script.get(), ShaderMap(), &options, nullptr); ASSERT_TRUE(r.IsSuccess()); ASSERT_TRUE(ToStub(engine.get())->DidClearStencilCommand()); } @@ -537,7 +549,8 @@ clear stencil 24)"; Options options; Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options); + Result r = + ex.Execute(engine.get(), script.get(), ShaderMap(), &options, nullptr); ASSERT_FALSE(r.IsSuccess()); EXPECT_EQ("clear stencil command failed", r.Error()); } @@ -556,7 +569,8 @@ draw rect 2 4 10 20)"; Options options; Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options); + Result r = + ex.Execute(engine.get(), script.get(), ShaderMap(), &options, nullptr); ASSERT_TRUE(r.IsSuccess()); ASSERT_TRUE(ToStub(engine.get())->DidDrawRectCommand()); } @@ -576,7 +590,8 @@ draw rect 2 4 10 20)"; Options options; Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options); + Result r = + ex.Execute(engine.get(), script.get(), ShaderMap(), &options, nullptr); ASSERT_FALSE(r.IsSuccess()); EXPECT_EQ("draw rect command failed", r.Error()); } @@ -595,7 +610,8 @@ draw arrays TRIANGLE_LIST 0 0)"; Options options; Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options); + Result r = + ex.Execute(engine.get(), script.get(), ShaderMap(), &options, nullptr); ASSERT_TRUE(r.IsSuccess()); ASSERT_TRUE(ToStub(engine.get())->DidDrawArraysCommand()); } @@ -615,7 +631,8 @@ draw arrays TRIANGLE_LIST 0 0)"; Options options; Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options); + Result r = + ex.Execute(engine.get(), script.get(), ShaderMap(), &options, nullptr); ASSERT_FALSE(r.IsSuccess()); EXPECT_EQ("draw arrays command failed", r.Error()); } @@ -634,7 +651,8 @@ compute 2 3 4)"; Options options; Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options); + Result r = + ex.Execute(engine.get(), script.get(), ShaderMap(), &options, nullptr); ASSERT_TRUE(r.IsSuccess()); ASSERT_TRUE(ToStub(engine.get())->DidComputeCommand()); } @@ -654,7 +672,8 @@ compute 2 3 4)"; Options options; Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options); + Result r = + ex.Execute(engine.get(), script.get(), ShaderMap(), &options, nullptr); ASSERT_FALSE(r.IsSuccess()); EXPECT_EQ("compute command failed", r.Error()); } @@ -673,7 +692,8 @@ vertex entrypoint main)"; Options options; Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options); + Result r = + ex.Execute(engine.get(), script.get(), ShaderMap(), &options, nullptr); ASSERT_TRUE(r.IsSuccess()); ASSERT_TRUE(ToStub(engine.get())->DidEntryPointCommand()); } @@ -693,7 +713,8 @@ vertex entrypoint main)"; Options options; Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options); + Result r = + ex.Execute(engine.get(), script.get(), ShaderMap(), &options, nullptr); ASSERT_FALSE(r.IsSuccess()); EXPECT_EQ("entrypoint command failed", r.Error()); } @@ -712,7 +733,8 @@ patch parameter vertices 10)"; Options options; Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options); + Result r = + ex.Execute(engine.get(), script.get(), ShaderMap(), &options, nullptr); ASSERT_TRUE(r.IsSuccess()); ASSERT_TRUE(ToStub(engine.get())->DidPatchParameterVerticesCommand()); } @@ -732,7 +754,8 @@ patch parameter vertices 10)"; Options options; Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options); + Result r = + ex.Execute(engine.get(), script.get(), ShaderMap(), &options, nullptr); ASSERT_FALSE(r.IsSuccess()); EXPECT_EQ("patch command failed", r.Error()); } @@ -750,7 +773,8 @@ probe rect rgba 2 3 40 40 0.2 0.4 0.4 0.3)"; Options options; Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options); + Result r = + ex.Execute(engine.get(), script.get(), ShaderMap(), &options, nullptr); ASSERT_TRUE(r.IsSuccess()); // ASSERT_TRUE(ToStub(engine.get())->DidProbeCommand()); } @@ -769,7 +793,8 @@ probe rect rgba 2 3 40 40 0.2 0.4 0.4 0.3)"; Options options; Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options); + Result r = + ex.Execute(engine.get(), script.get(), ShaderMap(), &options, nullptr); ASSERT_FALSE(r.IsSuccess()); EXPECT_EQ("probe command failed", r.Error()); } @@ -788,7 +813,8 @@ ssbo 0 24)"; Options options; Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options); + Result r = + ex.Execute(engine.get(), script.get(), ShaderMap(), &options, nullptr); ASSERT_TRUE(r.IsSuccess()); ASSERT_TRUE(ToStub(engine.get())->DidBufferCommand()); } @@ -808,7 +834,8 @@ ssbo 0 24)"; Options options; Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options); + Result r = + ex.Execute(engine.get(), script.get(), ShaderMap(), &options, nullptr); ASSERT_FALSE(r.IsSuccess()); EXPECT_EQ("buffer command failed", r.Error()); } @@ -826,7 +853,8 @@ probe ssbo vec3 0 2 <= 2 3 4)"; Options options; Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options); + Result r = + ex.Execute(engine.get(), script.get(), ShaderMap(), &options, nullptr); ASSERT_TRUE(r.IsSuccess()); // ASSERT_TRUE(ToStub(engine.get())->DidProbeSSBOCommand()); } @@ -845,7 +873,8 @@ probe ssbo vec3 0 2 <= 2 3 4)"; Options options; Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), &options); + Result r = + ex.Execute(engine.get(), script.get(), ShaderMap(), &options, nullptr); ASSERT_FALSE(r.IsSuccess()); EXPECT_EQ("probe ssbo command failed", r.Error()); } diff --git a/src/parser.cc b/src/parser.cc index 7e0a6e325..df8ee98de 100644 --- a/src/parser.cc +++ b/src/parser.cc @@ -18,7 +18,8 @@ namespace amber { -Parser::Parser() : script_(MakeUnique