| 716 | } |
| 717 | |
| 718 | inline bool enable_layer_setting(vk::LayerSettingEXT const &requested_layer_setting, |
| 719 | uint32_t enabled_layers_count, |
| 720 | char const *const *enabled_layers, |
| 721 | std::vector<vk::LayerSettingEXT> &enabled_layer_settings) |
| 722 | { |
| 723 | // We are checking if the layer is available. |
| 724 | // Vulkan does not provide a reflection API for layer settings. Layer settings are described in each layer JSON manifest. |
| 725 | bool is_available = std::any_of( |
| 726 | enabled_layers, enabled_layers + enabled_layers_count, [&requested_layer_setting](auto const &enabled_layer) { return strcmp(enabled_layer, requested_layer_setting.pLayerName) == 0; }); |
| 727 | |
| 728 | #if defined(PLATFORM__MACOS) |
| 729 | // On Apple the MoltenVK driver configuration layer is implicitly enabled and available, and cannot be explicitly added or checked via enabled_layers. |
| 730 | if (!is_available && strcmp(requested_layer_setting.pLayerName, "MoltenVK") == 0) |
| 731 | { |
| 732 | // Check for VK_EXT_layer_settings extension in the driver which indicates MoltenVK vs. KosmicKrisp (note: VK_MVK_moltenvk extension is deprecated). |
| 733 | std::vector<vk::ExtensionProperties> available_instance_extensions = vk::enumerateInstanceExtensionProperties(); |
| 734 | if (std::ranges::any_of(available_instance_extensions, |
| 735 | [](vk::ExtensionProperties const &extension) { return strcmp(extension.extensionName, VK_EXT_LAYER_SETTINGS_EXTENSION_NAME) == 0; })) |
| 736 | { |
| 737 | is_available = true; |
| 738 | } |
| 739 | } |
| 740 | #endif |
| 741 | |
| 742 | if (!is_available) |
| 743 | { |
| 744 | LOGW("Layer: {} not found. Disabling layer setting: {}", requested_layer_setting.pLayerName, requested_layer_setting.pSettingName); |
| 745 | return false; |
| 746 | } |
| 747 | |
| 748 | bool is_already_enabled = std::ranges::any_of(enabled_layer_settings, |
| 749 | [&requested_layer_setting](vk::LayerSettingEXT const &enabled_layer_setting) { |
| 750 | return (strcmp(requested_layer_setting.pLayerName, enabled_layer_setting.pLayerName) == 0) && |
| 751 | (strcmp(requested_layer_setting.pSettingName, enabled_layer_setting.pSettingName) == 0); |
| 752 | }); |
| 753 | |
| 754 | if (is_already_enabled) |
| 755 | { |
| 756 | LOGW("Ignoring duplicated layer setting {} in layer {}.", requested_layer_setting.pSettingName, requested_layer_setting.pLayerName); |
| 757 | return false; |
| 758 | } |
| 759 | |
| 760 | LOGI("Enabling layer setting {} in layer {}.", requested_layer_setting.pSettingName, requested_layer_setting.pLayerName); |
| 761 | enabled_layer_settings.push_back(requested_layer_setting); |
| 762 | return true; |
| 763 | } |
| 764 | |
| 765 | inline bool enable_layer_setting(VkLayerSettingEXT const &requested_layer_setting, |
| 766 | uint32_t enabled_layers_count, |
no outgoing calls
no test coverage detected