aboutsummaryrefslogtreecommitdiff
path: root/Ryujinx.Graphics.Vulkan/MoltenVK
diff options
context:
space:
mode:
authorriperiperi <rhy3756547@hotmail.com>2023-01-13 00:31:21 +0000
committerGitHub <noreply@github.com>2023-01-13 01:31:21 +0100
commit8fa248ceb4cbc9d199bbac1d968df8b168106c2c (patch)
tree678ca26d2a909c6a85aba13a1b03df704cabfa2e /Ryujinx.Graphics.Vulkan/MoltenVK
parent30862b5ffd6848b1296da23bc8bb7e9f96bb7e60 (diff)
Vulkan: Add workarounds for MoltenVK (#4202)
* Add MVK basics. * Use appropriate output attribute types * 4kb vertex alignment, bunch of fixes * Add reduced shader precision mode for mvk. * Disable ASTC on MVK for now * Only request robustnes2 when it is available. * It's just the one feature actually * Add triangle fan conversion * Allow NullDescriptor on MVK for some reason. * Force safe blit on MoltenVK * Use ASTC only when formats are all available. * Disable multilevel 3d texture views * Filter duplicate render targets (on backend) * Add Automatic MoltenVK Configuration * Do not create color attachment views with formats that are not RT compatible * Make sure that the host format matches the vertex shader input types for invalid/unknown guest formats * FIx rebase for Vertex Attrib State * Fix 4b alignment for vertex * Use asynchronous queue submits for MVK * Ensure color clear shader has correct output type * Update MoltenVK config * Always use MoltenVK workarounds on MacOS * Make MVK supersede all vendors * Fix rebase * Various fixes on rebase * Get portability flags from extension * Fix some minor rebasing issues * Style change * Use LibraryImport for MVKConfiguration * Rename MoltenVK vendor to Apple Intel and AMD GPUs on moltenvk report with the those vendors - only apple silicon reports with vendor 0x106B. * Fix features2 rebase conflict * Rename fragment output type * Add missing check for fragment output types Might have caused the crash in MK8 * Only do fragment output specialization on MoltenVK * Avoid copy when passing capabilities * Self feedback * Address feedback Co-authored-by: gdk <gab.dark.100@gmail.com> Co-authored-by: nastys <nastys@users.noreply.github.com>
Diffstat (limited to 'Ryujinx.Graphics.Vulkan/MoltenVK')
-rw-r--r--Ryujinx.Graphics.Vulkan/MoltenVK/MVKConfiguration.cs104
-rw-r--r--Ryujinx.Graphics.Vulkan/MoltenVK/MVKInitialization.cs31
2 files changed, 135 insertions, 0 deletions
diff --git a/Ryujinx.Graphics.Vulkan/MoltenVK/MVKConfiguration.cs b/Ryujinx.Graphics.Vulkan/MoltenVK/MVKConfiguration.cs
new file mode 100644
index 00000000..4fbae86e
--- /dev/null
+++ b/Ryujinx.Graphics.Vulkan/MoltenVK/MVKConfiguration.cs
@@ -0,0 +1,104 @@
+using System;
+using System.Runtime.InteropServices;
+
+namespace Ryujinx.Graphics.Vulkan.MoltenVK
+{
+ enum MVKConfigLogLevel : int
+ {
+ None = 0,
+ Error = 1,
+ Warning = 2,
+ Info = 3,
+ Debug = 4
+ }
+
+ enum MVKConfigTraceVulkanCalls : int
+ {
+ None = 0,
+ Enter = 1,
+ EnterExit = 2,
+ Duration = 3
+ }
+
+ enum MVKConfigAutoGPUCaptureScope : int
+ {
+ None = 0,
+ Device = 1,
+ Frame = 2
+ }
+
+ [Flags]
+ enum MVKConfigAdvertiseExtensions : int
+ {
+ All = 0x00000001,
+ MoltenVK = 0x00000002,
+ WSI = 0x00000004,
+ Portability = 0x00000008
+ }
+
+ enum MVKVkSemaphoreSupportStyle : int
+ {
+ MVK_CONFIG_VK_SEMAPHORE_SUPPORT_STYLE_SINGLE_QUEUE = 0,
+ MVK_CONFIG_VK_SEMAPHORE_SUPPORT_STYLE_METAL_EVENTS_WHERE_SAFE = 1,
+ MVK_CONFIG_VK_SEMAPHORE_SUPPORT_STYLE_METAL_EVENTS = 2,
+ MVK_CONFIG_VK_SEMAPHORE_SUPPORT_STYLE_CALLBACK = 3,
+ MVK_CONFIG_VK_SEMAPHORE_SUPPORT_STYLE_MAX_ENUM = 0x7FFFFFFF
+ }
+
+ readonly struct Bool32
+ {
+ uint Value { get; }
+
+ public Bool32(uint value)
+ {
+ Value = value;
+ }
+
+ public Bool32(bool value)
+ {
+ Value = value ? 1u : 0u;
+ }
+
+ public static implicit operator bool(Bool32 val) => val.Value == 1;
+ public static implicit operator Bool32(bool val) => new Bool32(val);
+ }
+
+ [StructLayout(LayoutKind.Sequential)]
+ struct MVKConfiguration
+ {
+ public Bool32 DebugMode;
+ public Bool32 ShaderConversionFlipVertexY;
+ public Bool32 SynchronousQueueSubmits;
+ public Bool32 PrefillMetalCommandBuffers;
+ public uint MaxActiveMetalCommandBuffersPerQueue;
+ public Bool32 SupportLargeQueryPools;
+ public Bool32 PresentWithCommandBuffer;
+ public Bool32 SwapchainMagFilterUseNearest;
+ public ulong MetalCompileTimeout;
+ public Bool32 PerformanceTracking;
+ public uint PerformanceLoggingFrameCount;
+ public Bool32 DisplayWatermark;
+ public Bool32 SpecializedQueueFamilies;
+ public Bool32 SwitchSystemGPU;
+ public Bool32 FullImageViewSwizzle;
+ public uint DefaultGPUCaptureScopeQueueFamilyIndex;
+ public uint DefaultGPUCaptureScopeQueueIndex;
+ public Bool32 FastMathEnabled;
+ public MVKConfigLogLevel LogLevel;
+ public MVKConfigTraceVulkanCalls TraceVulkanCalls;
+ public Bool32 ForceLowPowerGPU;
+ public Bool32 SemaphoreUseMTLFence;
+ public MVKVkSemaphoreSupportStyle SemaphoreSupportStyle;
+ public MVKConfigAutoGPUCaptureScope AutoGPUCaptureScope;
+ public IntPtr AutoGPUCaptureOutputFilepath;
+ public Bool32 Texture1DAs2D;
+ public Bool32 PreallocateDescriptors;
+ public Bool32 UseCommandPooling;
+ public Bool32 UseMTLHeap;
+ public Bool32 LogActivityPerformanceInline;
+ public uint ApiVersionToAdvertise;
+ public MVKConfigAdvertiseExtensions AdvertiseExtensions;
+ public Bool32 ResumeLostDevice;
+ public Bool32 UseMetalArgumentBuffers;
+ }
+}
diff --git a/Ryujinx.Graphics.Vulkan/MoltenVK/MVKInitialization.cs b/Ryujinx.Graphics.Vulkan/MoltenVK/MVKInitialization.cs
new file mode 100644
index 00000000..ca2fbfb9
--- /dev/null
+++ b/Ryujinx.Graphics.Vulkan/MoltenVK/MVKInitialization.cs
@@ -0,0 +1,31 @@
+using Silk.NET.Vulkan;
+using System;
+using System.Runtime.Versioning;
+using System.Runtime.InteropServices;
+
+namespace Ryujinx.Graphics.Vulkan.MoltenVK
+{
+ [SupportedOSPlatform("macos")]
+ public static partial class MVKInitialization
+ {
+ [LibraryImport("libMoltenVK.dylib")]
+ private static partial Result vkGetMoltenVKConfigurationMVK(IntPtr unusedInstance, out MVKConfiguration config, in IntPtr configSize);
+
+ [LibraryImport("libMoltenVK.dylib")]
+ private static partial Result vkSetMoltenVKConfigurationMVK(IntPtr unusedInstance, in MVKConfiguration config, in IntPtr configSize);
+
+ public static void Initialize()
+ {
+ var configSize = (IntPtr)Marshal.SizeOf<MVKConfiguration>();
+
+ vkGetMoltenVKConfigurationMVK(IntPtr.Zero, out MVKConfiguration config, configSize);
+
+ config.UseMetalArgumentBuffers = true;
+
+ config.SemaphoreSupportStyle = MVKVkSemaphoreSupportStyle.MVK_CONFIG_VK_SEMAPHORE_SUPPORT_STYLE_SINGLE_QUEUE;
+ config.SynchronousQueueSubmits = false;
+
+ vkSetMoltenVKConfigurationMVK(IntPtr.Zero, config, configSize);
+ }
+ }
+} \ No newline at end of file