@@ -44,6 +44,8 @@ const char* const kRequiredValidationLayers[] = {
4444const size_t kNumberOfRequiredValidationLayers =
4545 sizeof (kRequiredValidationLayers ) / sizeof (const char *);
4646
47+ const char kPipelineRuntimeLayerName [] = " VK_LAYER_STADIA_pipeline_runtime" ;
48+
4749const char kVariablePointers [] = " VariablePointerFeatures.variablePointers" ;
4850const 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
0 commit comments