Enable MVK_CONFIG_USE_METAL_ARGUMENT_BUFFERS for Apple
This commit is contained in:
parent
128f78bee4
commit
c02d041b23
2 changed files with 68 additions and 7 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue