Enable MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS for Apple

This commit is contained in:
Magnus Norddahl 2024-06-30 19:44:00 +02:00
commit c02d041b23
2 changed files with 68 additions and 7 deletions

View file

@ -65,7 +65,7 @@ public:
std::vector<VkLayerProperties> AvailableLayers;
std::vector<VkExtensionProperties> AvailableExtensions;
std::set<std::string> EnabledValidationLayers;
std::set<std::string> EnabledLayers;
std::set<std::string> EnabledExtensions;
std::vector<VulkanPhysicalDevice> PhysicalDevices;

View file

@ -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<VkLayerSettingEXT> 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<const char*> enabledValidationLayersCStr;
for (const std::string& layer : EnabledValidationLayers)
enabledValidationLayersCStr.push_back(layer.c_str());
std::vector<const char*> enabledLayersCStr;
for (const std::string& layer : EnabledLayers)
enabledLayersCStr.push_back(layer.c_str());
std::vector<const char*> 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)
{