Skip to content

Commit a55625c

Browse files
authored
Added support for the Vulkan performance pipeline runtime layer (#1025)
This commit adds a new option that will allow amber to measure the runtime of a pipeline using the Vulkan performance layers.
1 parent bb702e5 commit a55625c

File tree

7 files changed

+44
-14
lines changed

7 files changed

+44
-14
lines changed

samples/amber.cc

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ struct Options {
6868
bool log_graphics_calls_time = false;
6969
bool log_execute_calls = false;
7070
bool disable_spirv_validation = false;
71+
bool enable_pipeline_runtime_layer = false;
7172
std::string shader_filename;
7273
amber::EngineType engine = amber::kEngineTypeVulkan;
7374
std::string spv_env;
@@ -103,6 +104,7 @@ const char kUsage[] = R"(Usage: amber [options] SCRIPT [SCRIPTS...]
103104
--log-graphics-calls-time -- Log timing of graphics API calls timing (Vulkan only).
104105
--log-execute-calls -- Log each execute call before run.
105106
--disable-spirv-val -- Disable SPIR-V validation.
107+
--enable-runtime-layer -- Enable pipeline runtime layer.
106108
-h -- This help text.
107109
)";
108110

@@ -280,6 +282,8 @@ bool ParseArgs(const std::vector<std::string>& args, Options* opts) {
280282
opts->log_execute_calls = true;
281283
} else if (arg == "--disable-spirv-val") {
282284
opts->disable_spirv_validation = true;
285+
} else if (arg == "--enable-runtime-layer") {
286+
opts->enable_pipeline_runtime_layer = true;
283287
} else if (arg.size() > 0 && arg[0] == '-') {
284288
std::cerr << "Unrecognized option " << arg << std::endl;
285289
return false;
@@ -567,7 +571,8 @@ int main(int argc, const char** argv) {
567571
required_instance_extensions.end()),
568572
std::vector<std::string>(required_device_extensions.begin(),
569573
required_device_extensions.end()),
570-
options.disable_validation_layer, options.show_version_info, &config);
574+
options.disable_validation_layer, options.enable_pipeline_runtime_layer,
575+
options.show_version_info, &config);
571576

572577
if (!r.IsSuccess()) {
573578
std::cout << r.Error() << std::endl;

samples/config_helper.cc

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ amber::Result ConfigHelper::CreateConfig(
4545
const std::vector<std::string>& required_instance_extensions,
4646
const std::vector<std::string>& required_device_extensions,
4747
bool disable_validation_layer,
48+
bool enable_pipeline_runtime_layer,
4849
bool show_version_info,
4950
std::unique_ptr<amber::EngineConfig>* config) {
5051
switch (engine) {
@@ -70,7 +71,8 @@ amber::Result ConfigHelper::CreateConfig(
7071
return impl_->CreateConfig(
7172
engine_major, engine_minor, selected_device, required_features,
7273
required_instance_extensions, required_device_extensions,
73-
disable_validation_layer, show_version_info, config);
74+
disable_validation_layer, enable_pipeline_runtime_layer,
75+
show_version_info, config);
7476
}
7577

7678
} // namespace sample

samples/config_helper.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ class ConfigHelperImpl {
4040
const std::vector<std::string>& required_instance_extensions,
4141
const std::vector<std::string>& required_device_extensions,
4242
bool disable_validation_layer,
43+
bool enable_pipeline_runtime_layer,
4344
bool show_version_info,
4445
std::unique_ptr<amber::EngineConfig>* config) = 0;
4546
};
@@ -64,6 +65,7 @@ class ConfigHelper {
6465
const std::vector<std::string>& required_instance_extensions,
6566
const std::vector<std::string>& required_device_extensions,
6667
bool disable_validation_layer,
68+
bool enable_pipeline_runtime_layer,
6769
bool show_version_info,
6870
std::unique_ptr<amber::EngineConfig>* config);
6971

samples/config_helper_dawn.cc

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ amber::Result ConfigHelperDawn::CreateConfig(
5757
const std::vector<std::string>&,
5858
bool,
5959
bool,
60+
bool,
6061
std::unique_ptr<amber::EngineConfig>* config) {
6162
// Set procedure table and error callback.
6263
DawnProcTable backendProcs = dawn_native::GetProcs();

samples/config_helper_dawn.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ class ConfigHelperDawn : public ConfigHelperImpl {
4444
const std::vector<std::string>& required_instance_extensions,
4545
const std::vector<std::string>& required_device_extensions,
4646
bool disable_validation_layer,
47+
bool enable_pipeline_runtime_layer,
4748
bool show_version_info,
4849
std::unique_ptr<amber::EngineConfig>* config) override;
4950

samples/config_helper_vulkan.cc

Lines changed: 28 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,8 @@ const char* const kRequiredValidationLayers[] = {
4444
const size_t kNumberOfRequiredValidationLayers =
4545
sizeof(kRequiredValidationLayers) / sizeof(const char*);
4646

47+
const char kPipelineRuntimeLayerName[] = "VK_LAYER_STADIA_pipeline_runtime";
48+
4749
const char kVariablePointers[] = "VariablePointerFeatures.variablePointers";
4850
const char kVariablePointersStorageBuffer[] =
4951
"VariablePointerFeatures.variablePointersStorageBuffer";
@@ -672,7 +674,8 @@ amber::Result ConfigHelperVulkan::CreateVulkanInstance(
672674
uint32_t engine_major,
673675
uint32_t engine_minor,
674676
std::vector<std::string> required_extensions,
675-
bool disable_validation_layer) {
677+
bool disable_validation_layer,
678+
bool enable_pipeline_runtime_layer) {
676679
VkApplicationInfo app_info = VkApplicationInfo();
677680
app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
678681

@@ -685,19 +688,29 @@ amber::Result ConfigHelperVulkan::CreateVulkanInstance(
685688
instance_info.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO;
686689
instance_info.pApplicationInfo = &app_info;
687690

691+
std::vector<const char*> layer_names;
692+
688693
if (!disable_validation_layer) {
689694
if (!AreAllValidationLayersSupported())
690695
return amber::Result("Sample: not all validation layers are supported");
691696
if (!AreAllValidationExtensionsSupported()) {
692697
return amber::Result(
693698
"Sample: extensions of validation layers are not supported");
694699
}
695-
instance_info.enabledLayerCount = kNumberOfRequiredValidationLayers;
696-
instance_info.ppEnabledLayerNames = kRequiredValidationLayers;
697-
700+
for (size_t i = 0; i < kNumberOfRequiredValidationLayers; ++i) {
701+
layer_names.push_back(kRequiredValidationLayers[i]);
702+
}
698703
required_extensions.push_back(kExtensionForValidationLayer);
699704
}
700705

706+
if (enable_pipeline_runtime_layer) {
707+
layer_names.push_back(kPipelineRuntimeLayerName);
708+
}
709+
710+
instance_info.enabledLayerCount = static_cast<uint32_t>(layer_names.size());
711+
instance_info.ppEnabledLayerNames =
712+
instance_info.enabledLayerCount > 0 ? layer_names.data() : nullptr;
713+
701714
available_instance_extensions_ = GetAvailableInstanceExtensions();
702715
if (!required_extensions.empty()) {
703716
if (!AreAllExtensionsSupported(available_instance_extensions_,
@@ -729,9 +742,12 @@ amber::Result ConfigHelperVulkan::CreateVulkanInstance(
729742
static_cast<uint32_t>(required_extensions_in_char.size());
730743
instance_info.ppEnabledExtensionNames = required_extensions_in_char.data();
731744

732-
if (vkCreateInstance(&instance_info, nullptr, &vulkan_instance_) !=
733-
VK_SUCCESS) {
734-
return amber::Result("Unable to create vulkan instance");
745+
const VkResult result =
746+
vkCreateInstance(&instance_info, nullptr, &vulkan_instance_);
747+
if (result != VK_SUCCESS) {
748+
std::stringstream error_message;
749+
error_message << "Unable to create vulkan instance (code=" << result << ")";
750+
return amber::Result(error_message.str());
735751
}
736752
return {};
737753
}
@@ -805,7 +821,7 @@ amber::Result ConfigHelperVulkan::CheckVulkanPhysicalDeviceRequirements(
805821
: nullptr;
806822

807823
shader_subgroup_extended_types_features.sType =
808-
// NOLINTNEXTLINE(whitespace/line_length)
824+
// NOLINTNEXTLINE(whitespace/line_length)
809825
VK_STRUCTURE_TYPE_PHYSICAL_DEVICE_SHADER_SUBGROUP_EXTENDED_TYPES_FEATURES;
810826
shader_subgroup_extended_types_features.pNext = &variable_pointers_features;
811827

@@ -1227,11 +1243,12 @@ amber::Result ConfigHelperVulkan::CreateConfig(
12271243
const std::vector<std::string>& required_instance_extensions,
12281244
const std::vector<std::string>& required_device_extensions,
12291245
bool disable_validation_layer,
1246+
bool enable_pipeline_runtime_layer,
12301247
bool show_version_info,
12311248
std::unique_ptr<amber::EngineConfig>* cfg_holder) {
1232-
amber::Result r = CreateVulkanInstance(engine_major, engine_minor,
1233-
required_instance_extensions,
1234-
disable_validation_layer);
1249+
amber::Result r = CreateVulkanInstance(
1250+
engine_major, engine_minor, required_instance_extensions,
1251+
disable_validation_layer, enable_pipeline_runtime_layer);
12351252
if (!r.IsSuccess())
12361253
return r;
12371254

samples/config_helper_vulkan.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ class ConfigHelperVulkan : public ConfigHelperImpl {
4949
const std::vector<std::string>& required_instance_extensions,
5050
const std::vector<std::string>& required_device_extensions,
5151
bool disable_validation_layer,
52+
bool enable_pipeline_runtime_layer,
5253
bool show_version_info,
5354
std::unique_ptr<amber::EngineConfig>* config) override;
5455

@@ -58,7 +59,8 @@ class ConfigHelperVulkan : public ConfigHelperImpl {
5859
uint32_t engine_major,
5960
uint32_t engine_minor,
6061
std::vector<std::string> required_instance_extensions,
61-
bool disable_validation_layer);
62+
bool disable_validation_layer,
63+
bool enable_pipeline_runtime_layer);
6264

6365
/// Create |vulkan_callback_| that reports validation layer errors
6466
/// via debugCallback() function in config_helper_vulkan.cc.

0 commit comments

Comments
 (0)