diff --git a/libraries/ZVulkan/include/zvulkan/vulkaninstance.h b/libraries/ZVulkan/include/zvulkan/vulkaninstance.h index 1074ce420..ae8ec33e3 100644 --- a/libraries/ZVulkan/include/zvulkan/vulkaninstance.h +++ b/libraries/ZVulkan/include/zvulkan/vulkaninstance.h @@ -65,7 +65,7 @@ public: std::vector AvailableLayers; std::vector AvailableExtensions; - std::set EnabledValidationLayers; + std::set EnabledLayers; std::set EnabledExtensions; std::vector PhysicalDevices; diff --git a/libraries/ZVulkan/src/vulkaninstance.cpp b/libraries/ZVulkan/src/vulkaninstance.cpp index 0641d3987..cc5719ced 100644 --- a/libraries/ZVulkan/src/vulkaninstance.cpp +++ b/libraries/ZVulkan/src/vulkaninstance.cpp @@ -65,7 +65,7 @@ void VulkanInstance::CreateInstance() { if (layer.layerName == debugLayer) { - EnabledValidationLayers.insert(layer.layerName); + EnabledLayers.insert(layer.layerName); EnabledExtensions.insert(VK_EXT_DEBUG_UTILS_EXTENSION_NAME); debugLayerFound = true; break; @@ -73,6 +73,61 @@ void VulkanInstance::CreateInstance() } } + // Are we running on Apple's horrible platform? + std::string moltenVKLayer = "MoltenVK"; // kMVKMoltenVKDriverLayerName + bool moltenVKLayerFound = false; + for (const VkLayerProperties& layer : AvailableLayers) + { + if (layer.layerName == moltenVKLayer) + { + EnabledLayers.insert(layer.layerName); + EnabledExtensions.insert("VK_EXT_layer_settings"); + moltenVKLayerFound = true; + break; + } + } + + // Provided by VK_EXT_layer_settings (not sure why volk doesn't have this...) + enum VkLayerSettingTypeEXT + { + VK_LAYER_SETTING_TYPE_BOOL32_EXT = 0, + VK_LAYER_SETTING_TYPE_INT32_EXT = 1, + VK_LAYER_SETTING_TYPE_INT64_EXT = 2, + VK_LAYER_SETTING_TYPE_UINT32_EXT = 3, + VK_LAYER_SETTING_TYPE_UINT64_EXT = 4, + VK_LAYER_SETTING_TYPE_FLOAT32_EXT = 5, + VK_LAYER_SETTING_TYPE_FLOAT64_EXT = 6, + VK_LAYER_SETTING_TYPE_STRING_EXT = 7, + }; + struct VkLayerSettingEXT + { + const char* pLayerName; + const char* pSettingName; + VkLayerSettingTypeEXT type; + uint32_t valueCount; + const void* pValues; + }; + struct VkLayerSettingsCreateInfoEXT + { + VkStructureType sType; + const void* pNext; + uint32_t settingCount; + const VkLayerSettingEXT* pSettings; + }; + const VkStructureType VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT = (VkStructureType)1000496000; + + std::vector layersettings; + int32_t mkvalue2 = 2; + if (moltenVKLayerFound) + { + VkLayerSettingEXT setting = {}; + setting.pLayerName = "MoltenVK"; + setting.pSettingName = "MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS"; + setting.type = VK_LAYER_SETTING_TYPE_INT32_EXT; + setting.pValues = &mkvalue2; // Use Metal Argument Buffers only if the VK_EXT_descriptor_indexing extension is enabled + layersettings.push_back(setting); + } + // Enable optional instance extensions we are interested in for (const auto& ext : AvailableExtensions) { @@ -82,9 +137,9 @@ void VulkanInstance::CreateInstance() } } - std::vector enabledValidationLayersCStr; - for (const std::string& layer : EnabledValidationLayers) - enabledValidationLayersCStr.push_back(layer.c_str()); + std::vector enabledLayersCStr; + for (const std::string& layer : EnabledLayers) + enabledLayersCStr.push_back(layer.c_str()); std::vector enabledExtensionsCStr; for (const std::string& ext : EnabledExtensions) @@ -106,10 +161,16 @@ void VulkanInstance::CreateInstance() createInfo.sType = VK_STRUCTURE_TYPE_INSTANCE_CREATE_INFO; createInfo.pApplicationInfo = &appInfo; createInfo.enabledExtensionCount = (uint32_t)EnabledExtensions.size(); - createInfo.enabledLayerCount = (uint32_t)enabledValidationLayersCStr.size(); - createInfo.ppEnabledLayerNames = enabledValidationLayersCStr.data(); + createInfo.enabledLayerCount = (uint32_t)enabledLayersCStr.size(); + createInfo.ppEnabledLayerNames = enabledLayersCStr.data(); createInfo.ppEnabledExtensionNames = enabledExtensionsCStr.data(); + VkLayerSettingsCreateInfoEXT layerSettingsInfo = { VK_STRUCTURE_TYPE_LAYER_SETTINGS_CREATE_INFO_EXT }; + layerSettingsInfo.settingCount = (uint32_t)layersettings.size(); + layerSettingsInfo.pSettings = layersettings.data(); + if (moltenVKLayerFound) + createInfo.pNext = &layerSettingsInfo; + result = vkCreateInstance(&createInfo, nullptr, &Instance); if (result >= VK_SUCCESS) {