diff --git a/src/Veldrid/Vk/CommonStrings.cs b/src/Veldrid/Vk/CommonStrings.cs index 57f3caaf..639ebf3b 100644 --- a/src/Veldrid/Vk/CommonStrings.cs +++ b/src/Veldrid/Vk/CommonStrings.cs @@ -19,5 +19,6 @@ internal static class CommonStrings public static FixedUtf8String Main { get; } = "main"; public static FixedUtf8String VkKhrGetPhysicalDeviceProperties2 { get; } = "VK_KHR_get_physical_device_properties2"; public static FixedUtf8String VkKhrPortabilitySubset { get; } = "VK_KHR_portability_subset"; + public static FixedUtf8String VkKhrPortabilityEnumeration { get; } = "VK_KHR_portability_enumeration"; } } diff --git a/src/Veldrid/Vk/VkGraphicsDevice.cs b/src/Veldrid/Vk/VkGraphicsDevice.cs index 7271e02b..2e9da67e 100644 --- a/src/Veldrid/Vk/VkGraphicsDevice.cs +++ b/src/Veldrid/Vk/VkGraphicsDevice.cs @@ -766,6 +766,13 @@ private void createInstance(bool debug, VulkanDeviceOptions options) if (availableInstanceExtensions.Contains(CommonStrings.VkKhrPortabilitySubset)) surfaceExtensions.Add(CommonStrings.VkKhrPortabilitySubset); + bool hasPortabilityEnumeration = false; + if (availableInstanceExtensions.Contains(CommonStrings.VkKhrPortabilityEnumeration)) + { + hasPortabilityEnumeration = true; + surfaceExtensions.Add(CommonStrings.VkKhrPortabilityEnumeration); + } + if (availableInstanceExtensions.Contains(CommonStrings.VkKhrSurfaceExtensionName)) surfaceExtensions.Add(CommonStrings.VkKhrSurfaceExtensionName); if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) @@ -839,6 +846,11 @@ private void createInstance(bool debug, VulkanDeviceOptions options) instanceCi.enabledExtensionCount = instanceExtensions.Count; instanceCi.ppEnabledExtensionNames = (byte**)instanceExtensions.Data; + if (hasPortabilityEnumeration && RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) { + // Required for MoltenVK to work on Apple Silicon. + instanceCi.flags |= (uint)VkInstanceCreateFlagBits.PortabilityBitKHR; + } + instanceCi.enabledLayerCount = instanceLayers.Count; if (instanceLayers.Count > 0) instanceCi.ppEnabledLayerNames = (byte**)instanceLayers.Data;