diff options
author | dan sinclair <dj2@everburning.com> | 2019-02-20 15:00:04 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-02-20 15:00:04 -0500 |
commit | ff296ea40354da2f891b27dbd52a3d1685e31d8b (patch) | |
tree | c34158fa84317463b43f9393452d4eea819bdded | |
parent | f2a13b59ad5cbff97c7a672e59766291a2eddaee (diff) | |
download | amber-ff296ea40354da2f891b27dbd52a3d1685e31d8b.tar.gz |
Add -ps option to allow compiling shaders. (#303)
This CL adds a -ps option to the sample app to allow parsing the script
and creating the pipeline. This will cause the driver SPIR-V compiler to
execute. The script is not run against the engine (and the engine is
not created).
-rw-r--r-- | include/amber/amber.h | 2 | ||||
-rw-r--r-- | samples/amber.cc | 5 | ||||
-rw-r--r-- | src/amber.cc | 5 | ||||
-rw-r--r-- | src/executor.cc | 43 | ||||
-rw-r--r-- | src/executor.h | 9 | ||||
-rw-r--r-- | src/executor_test.cc | 87 |
6 files changed, 104 insertions, 47 deletions
diff --git a/include/amber/amber.h b/include/amber/amber.h index 56de8d1..5b55164 100644 --- a/include/amber/amber.h +++ b/include/amber/amber.h @@ -61,6 +61,8 @@ struct Options { std::string spv_env; /// Lists the buffers to extract at the end of the execution std::vector<BufferInfo> extractions; + /// Terminate after creating the pipelines. + bool pipeline_create_only; }; /// Main interface to the Amber environment. diff --git a/samples/amber.cc b/samples/amber.cc index ed92d83..33fcf70 100644 --- a/samples/amber.cc +++ b/samples/amber.cc @@ -39,6 +39,7 @@ struct Options { uint32_t engine_major = 1; uint32_t engine_minor = 0; bool parse_only = false; + bool pipeline_create_only = false; bool disable_validation_layer = false; bool show_summary = false; bool show_help = false; @@ -51,6 +52,7 @@ const char kUsage[] = R"(Usage: amber [options] SCRIPT [SCRIPTS...] options: -p -- Parse input files only; Don't execute. + -ps -- Parse input files, create pipelines; Don't execute. -s -- Print summary of pass/failure. -d -- Disable validation layers. -t <spirv_env> -- The target SPIR-V environment. Defaults to SPV_ENV_UNIVERSAL_1_0. @@ -145,6 +147,8 @@ bool ParseArgs(const std::vector<std::string>& args, Options* opts) { opts->show_version_info = true; } else if (arg == "-p") { opts->parse_only = true; + } else if (arg == "-ps") { + opts->pipeline_create_only = true; } else if (arg == "-d") { opts->disable_validation_layer = true; } else if (arg == "-s") { @@ -264,6 +268,7 @@ int main(int argc, const char** argv) { amber::Options amber_options; amber_options.engine = options.engine; amber_options.spv_env = options.spv_env; + amber_options.pipeline_create_only = options.pipeline_create_only; std::set<std::string> required_features; std::set<std::string> required_extensions; diff --git a/src/amber.cc b/src/amber.cc index 1506112..ddebe93 100644 --- a/src/amber.cc +++ b/src/amber.cc @@ -78,7 +78,10 @@ amber::Result Amber::ExecuteWithShaderData(const amber::Recipe* recipe, return r; Executor executor; - r = executor.Execute(engine.get(), script, shader_data); + r = executor.Execute(engine.get(), script, shader_data, + opts->pipeline_create_only + ? ExecutionType::kPipelineCreateOnly + : ExecutionType::kExecute); if (!r.IsSuccess()) { // Clean up Vulkan/Dawn objects engine->Shutdown(); diff --git a/src/executor.cc b/src/executor.cc index b560ac1..6f72a87 100644 --- a/src/executor.cc +++ b/src/executor.cc @@ -28,9 +28,28 @@ Executor::Executor() = default; Executor::~Executor() = default; +Result Executor::CompileShaders(const amber::Script* script, + const ShaderMap& shader_map) { + for (auto& pipeline : script->GetPipelines()) { + for (auto& shader_info : pipeline->GetShaders()) { + ShaderCompiler sc(script->GetSpvTargetEnv()); + + Result r; + std::vector<uint32_t> data; + std::tie(r, data) = sc.Compile(shader_info.GetShader(), shader_map); + if (!r.IsSuccess()) + return r; + + shader_info.SetData(std::move(data)); + } + } + return {}; +} + Result Executor::Execute(Engine* engine, const amber::Script* script, - const ShaderMap& shader_map) { + const ShaderMap& shader_map, + ExecutionType executionType) { engine->SetEngineData(script->GetEngineData()); if (script->GetPipelines().empty()) @@ -40,24 +59,16 @@ Result Executor::Execute(Engine* engine, if (script->GetPipelines().size() > 1) return Result("only single pipeline supported currently"); - auto* pipeline = script->GetPipelines()[0].get(); - - // Compile Shaders - for (auto& shader_info : pipeline->GetShaders()) { - ShaderCompiler sc(script->GetSpvTargetEnv()); - - Result r; - std::vector<uint32_t> data; - std::tie(r, data) = sc.Compile(shader_info.GetShader(), shader_map); - if (!r.IsSuccess()) - return r; - - shader_info.SetData(std::move(data)); - } + Result r = CompileShaders(script, shader_map); + if (!r.IsSuccess()) + return r; - Result r = engine->CreatePipeline(pipeline); + auto* pipeline = script->GetPipelines()[0].get(); + r = engine->CreatePipeline(pipeline); if (!r.IsSuccess()) return r; + if (executionType == ExecutionType::kPipelineCreateOnly) + return {}; // Process Commands for (const auto& cmd : script->GetCommands()) { diff --git a/src/executor.h b/src/executor.h index a05ca76..8c57503 100644 --- a/src/executor.h +++ b/src/executor.h @@ -22,6 +22,8 @@ namespace amber { +enum class ExecutionType { kExecute = 0, kPipelineCreateOnly }; + /// The executor is responsible for running the given script against an engine. class Executor { public: @@ -32,9 +34,14 @@ class Executor { /// Executes |script| against |engine|. For each shader described in |script| /// if the shader name exists in |map| the value for that map'd key will be /// used as the shader binary. - Result Execute(Engine* engine, const Script* script, const ShaderMap& map); + Result Execute(Engine* engine, + const Script* script, + const ShaderMap& map, + ExecutionType executionType); private: + Result CompileShaders(const Script* script, const ShaderMap& shader_map); + Verifier verifier_; }; diff --git a/src/executor_test.cc b/src/executor_test.cc index c81c12a..d6e91bc 100644 --- a/src/executor_test.cc +++ b/src/executor_test.cc @@ -227,7 +227,8 @@ logicOp)"; script->RequiredExtensions()); Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap()); + Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), + ExecutionType::kExecute); ASSERT_TRUE(r.IsSuccess()); const auto& features = ToStub(engine.get())->GetFeatures(); @@ -255,7 +256,8 @@ VK_KHR_variable_pointers)"; script->RequiredExtensions()); Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap()); + Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), + ExecutionType::kExecute); ASSERT_TRUE(r.IsSuccess()); const auto& features = ToStub(engine.get())->GetFeatures(); @@ -283,7 +285,8 @@ depthstencil D24_UNORM_S8_UINT)"; script->RequiredExtensions()); Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap()); + Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), + ExecutionType::kExecute); ASSERT_TRUE(r.IsSuccess()); const auto& features = ToStub(engine.get())->GetFeatures(); @@ -308,7 +311,8 @@ fence_timeout 12345)"; script->RequiredExtensions()); Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap()); + Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), + ExecutionType::kExecute); ASSERT_TRUE(r.IsSuccess()); const auto& features = ToStub(engine.get())->GetFeatures(); @@ -339,7 +343,8 @@ fence_timeout 12345)"; script->RequiredExtensions()); Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap()); + Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), + ExecutionType::kExecute); ASSERT_TRUE(r.IsSuccess()); const auto& features = ToStub(engine.get())->GetFeatures(); @@ -367,7 +372,8 @@ clear)"; auto script = parser.GetScript(); Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap()); + Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), + ExecutionType::kExecute); ASSERT_TRUE(r.IsSuccess()); EXPECT_TRUE(ToStub(engine.get())->DidClearCommand()); } @@ -385,7 +391,8 @@ clear)"; auto script = parser.GetScript(); Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap()); + Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), + ExecutionType::kExecute); ASSERT_FALSE(r.IsSuccess()); EXPECT_EQ("clear command failed", r.Error()); } @@ -402,7 +409,8 @@ clear color 244 123 123 13)"; auto script = parser.GetScript(); Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap()); + Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), + ExecutionType::kExecute); ASSERT_TRUE(r.IsSuccess()); ASSERT_TRUE(ToStub(engine.get())->DidClearColorCommand()); @@ -429,7 +437,8 @@ clear color 123 123 123 123)"; auto script = parser.GetScript(); Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap()); + Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), + ExecutionType::kExecute); ASSERT_FALSE(r.IsSuccess()); EXPECT_EQ("clear color command failed", r.Error()); } @@ -446,7 +455,8 @@ clear depth 24)"; auto script = parser.GetScript(); Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap()); + Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), + ExecutionType::kExecute); ASSERT_TRUE(r.IsSuccess()); ASSERT_TRUE(ToStub(engine.get())->DidClearDepthCommand()); } @@ -464,7 +474,8 @@ clear depth 24)"; auto script = parser.GetScript(); Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap()); + Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), + ExecutionType::kExecute); ASSERT_FALSE(r.IsSuccess()); EXPECT_EQ("clear depth command failed", r.Error()); } @@ -481,7 +492,8 @@ clear stencil 24)"; auto script = parser.GetScript(); Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap()); + Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), + ExecutionType::kExecute); ASSERT_TRUE(r.IsSuccess()); ASSERT_TRUE(ToStub(engine.get())->DidClearStencilCommand()); } @@ -499,7 +511,8 @@ clear stencil 24)"; auto script = parser.GetScript(); Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap()); + Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), + ExecutionType::kExecute); ASSERT_FALSE(r.IsSuccess()); EXPECT_EQ("clear stencil command failed", r.Error()); } @@ -516,7 +529,8 @@ draw rect 2 4 10 20)"; auto script = parser.GetScript(); Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap()); + Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), + ExecutionType::kExecute); ASSERT_TRUE(r.IsSuccess()); ASSERT_TRUE(ToStub(engine.get())->DidDrawRectCommand()); } @@ -534,7 +548,8 @@ draw rect 2 4 10 20)"; auto script = parser.GetScript(); Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap()); + Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), + ExecutionType::kExecute); ASSERT_FALSE(r.IsSuccess()); EXPECT_EQ("draw rect command failed", r.Error()); } @@ -551,7 +566,8 @@ draw arrays TRIANGLE_LIST 0 0)"; auto script = parser.GetScript(); Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap()); + Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), + ExecutionType::kExecute); ASSERT_TRUE(r.IsSuccess()); ASSERT_TRUE(ToStub(engine.get())->DidDrawArraysCommand()); } @@ -569,7 +585,8 @@ draw arrays TRIANGLE_LIST 0 0)"; auto script = parser.GetScript(); Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap()); + Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), + ExecutionType::kExecute); ASSERT_FALSE(r.IsSuccess()); EXPECT_EQ("draw arrays command failed", r.Error()); } @@ -586,7 +603,8 @@ compute 2 3 4)"; auto script = parser.GetScript(); Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap()); + Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), + ExecutionType::kExecute); ASSERT_TRUE(r.IsSuccess()); ASSERT_TRUE(ToStub(engine.get())->DidComputeCommand()); } @@ -604,7 +622,8 @@ compute 2 3 4)"; auto script = parser.GetScript(); Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap()); + Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), + ExecutionType::kExecute); ASSERT_FALSE(r.IsSuccess()); EXPECT_EQ("compute command failed", r.Error()); } @@ -621,7 +640,8 @@ vertex entrypoint main)"; auto script = parser.GetScript(); Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap()); + Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), + ExecutionType::kExecute); ASSERT_TRUE(r.IsSuccess()); ASSERT_TRUE(ToStub(engine.get())->DidEntryPointCommand()); } @@ -639,7 +659,8 @@ vertex entrypoint main)"; auto script = parser.GetScript(); Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap()); + Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), + ExecutionType::kExecute); ASSERT_FALSE(r.IsSuccess()); EXPECT_EQ("entrypoint command failed", r.Error()); } @@ -656,7 +677,8 @@ patch parameter vertices 10)"; auto script = parser.GetScript(); Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap()); + Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), + ExecutionType::kExecute); ASSERT_TRUE(r.IsSuccess()); ASSERT_TRUE(ToStub(engine.get())->DidPatchParameterVerticesCommand()); } @@ -674,7 +696,8 @@ patch parameter vertices 10)"; auto script = parser.GetScript(); Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap()); + Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), + ExecutionType::kExecute); ASSERT_FALSE(r.IsSuccess()); EXPECT_EQ("patch command failed", r.Error()); } @@ -691,7 +714,8 @@ probe rect rgba 2 3 40 40 0.2 0.4 0.4 0.3)"; auto script = parser.GetScript(); Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap()); + Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), + ExecutionType::kExecute); ASSERT_TRUE(r.IsSuccess()); // ASSERT_TRUE(ToStub(engine.get())->DidProbeCommand()); } @@ -709,7 +733,8 @@ probe rect rgba 2 3 40 40 0.2 0.4 0.4 0.3)"; auto script = parser.GetScript(); Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap()); + Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), + ExecutionType::kExecute); ASSERT_FALSE(r.IsSuccess()); EXPECT_EQ("probe command failed", r.Error()); } @@ -726,7 +751,8 @@ ssbo 0 24)"; auto script = parser.GetScript(); Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap()); + Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), + ExecutionType::kExecute); ASSERT_TRUE(r.IsSuccess()); ASSERT_TRUE(ToStub(engine.get())->DidBufferCommand()); } @@ -744,7 +770,8 @@ ssbo 0 24)"; auto script = parser.GetScript(); Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap()); + Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), + ExecutionType::kExecute); ASSERT_FALSE(r.IsSuccess()); EXPECT_EQ("buffer command failed", r.Error()); } @@ -761,7 +788,8 @@ probe ssbo vec3 0 2 <= 2 3 4)"; auto script = parser.GetScript(); Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap()); + Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), + ExecutionType::kExecute); ASSERT_TRUE(r.IsSuccess()); // ASSERT_TRUE(ToStub(engine.get())->DidProbeSSBOCommand()); } @@ -779,7 +807,8 @@ probe ssbo vec3 0 2 <= 2 3 4)"; auto script = parser.GetScript(); Executor ex; - Result r = ex.Execute(engine.get(), script.get(), ShaderMap()); + Result r = ex.Execute(engine.get(), script.get(), ShaderMap(), + ExecutionType::kExecute); ASSERT_FALSE(r.IsSuccess()); EXPECT_EQ("probe ssbo command failed", r.Error()); } |