MVKInitialization.cs
1 using Silk.NET.Core.Loader; 2 using Silk.NET.Vulkan; 3 using System; 4 using System.Runtime.InteropServices; 5 using System.Runtime.Versioning; 6 7 namespace Ryujinx.Graphics.Vulkan.MoltenVK 8 { 9 [SupportedOSPlatform("macos")] 10 public static partial class MVKInitialization 11 { 12 private const string VulkanLib = "libvulkan.dylib"; 13 14 [LibraryImport("libMoltenVK.dylib")] 15 private static partial Result vkGetMoltenVKConfigurationMVK(IntPtr unusedInstance, out MVKConfiguration config, in IntPtr configSize); 16 17 [LibraryImport("libMoltenVK.dylib")] 18 private static partial Result vkSetMoltenVKConfigurationMVK(IntPtr unusedInstance, in MVKConfiguration config, in IntPtr configSize); 19 20 public static void Initialize() 21 { 22 var configSize = (IntPtr)Marshal.SizeOf<MVKConfiguration>(); 23 24 vkGetMoltenVKConfigurationMVK(IntPtr.Zero, out MVKConfiguration config, configSize); 25 26 config.UseMetalArgumentBuffers = true; 27 28 config.SemaphoreSupportStyle = MVKVkSemaphoreSupportStyle.MVK_CONFIG_VK_SEMAPHORE_SUPPORT_STYLE_SINGLE_QUEUE; 29 config.SynchronousQueueSubmits = false; 30 31 config.ResumeLostDevice = true; 32 33 vkSetMoltenVKConfigurationMVK(IntPtr.Zero, config, configSize); 34 } 35 36 private static string[] Resolver(string path) 37 { 38 if (path.EndsWith(VulkanLib)) 39 { 40 path = path[..^VulkanLib.Length] + "libMoltenVK.dylib"; 41 return [path]; 42 } 43 return Array.Empty<string>(); 44 } 45 46 public static void InitializeResolver() 47 { 48 ((DefaultPathResolver)PathResolver.Default).Resolvers.Insert(0, Resolver); 49 } 50 } 51 }