From 126e33dc0183b276bd4cee283ed8df71fa9848ff Mon Sep 17 00:00:00 2001 From: Roman Rihter Date: Mon, 9 Jun 2025 22:07:48 +0300 Subject: [PATCH] Fix MoltenVK on Apple Silicon --- src/Veldrid/Vk/CommonStrings.cs | 1 + src/Veldrid/Vk/VkGraphicsDevice.cs | 12 ++++++++++++ 2 files changed, 13 insertions(+) diff --git a/src/Veldrid/Vk/CommonStrings.cs b/src/Veldrid/Vk/CommonStrings.cs index 57f3caaf4..639ebf3bc 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 7271e02b0..2e9da67e2 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;