aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordan sinclair <dj2@everburning.com>2019-02-20 15:00:04 -0500
committerGitHub <noreply@github.com>2019-02-20 15:00:04 -0500
commitff296ea40354da2f891b27dbd52a3d1685e31d8b (patch)
treec34158fa84317463b43f9393452d4eea819bdded
parentf2a13b59ad5cbff97c7a672e59766291a2eddaee (diff)
downloadamber-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.h2
-rw-r--r--samples/amber.cc5
-rw-r--r--src/amber.cc5
-rw-r--r--src/executor.cc43
-rw-r--r--src/executor.h9
-rw-r--r--src/executor_test.cc87
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());
}