/ src / Ryujinx.Graphics.Vulkan / MoltenVK / MVKInitialization.cs
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  }