From 30dba1ed36d7c817a83a1e5f3fa77a8199a73298 Mon Sep 17 00:00:00 2001 From: KeatonTheBot Date: Wed, 27 May 2026 11:51:44 -0500 Subject: [PATCH] macOS: Fix black screen on Metal versions older than 3.1 Fixes a black screen on Metal versions older than 3.1 by disabling `VK_EXT_extended_dynamic_state` (and `VK_DYNAMIC_STATE_VERTEX_INPUT_BINDING_STRIDE`). Fix imported from sunshineinabox's unpublished extended dynamic states branch. Co-authored-by: sunshineinabox --- src/Ryujinx.Graphics.Vulkan/PipelineState.cs | 4 +++- src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineState.cs b/src/Ryujinx.Graphics.Vulkan/PipelineState.cs index eed783930..39c4e6590 100644 --- a/src/Ryujinx.Graphics.Vulkan/PipelineState.cs +++ b/src/Ryujinx.Graphics.Vulkan/PipelineState.cs @@ -582,8 +582,10 @@ namespace Ryujinx.Graphics.Vulkan dynamicStates[5] = DynamicState.StencilReference; dynamicStates[6] = DynamicState.BlendConstants; - if (supportsExtDynamicState) + if (supportsExtDynamicState && (gd.SupportsMTL31 || !gd.IsMoltenVk)) { + // Requires Metal 3.1 and new MoltenVK, however extended dynamic states extension is not + // available on older versions of MVK, so we can safely check only OS version. dynamicStates[dynamicStatesCount++] = DynamicState.VertexInputBindingStrideExt; } diff --git a/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs b/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs index 3c2477f63..1c3e4c187 100644 --- a/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs +++ b/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs @@ -96,6 +96,7 @@ namespace Ryujinx.Graphics.Vulkan internal bool IsIntelArc { get; private set; } internal bool IsQualcommProprietary { get; private set; } internal bool IsMoltenVk { get; private set; } + internal bool SupportsMTL31 { get; private set; } internal bool IsTBDR { get; private set; } internal bool IsSharedMemory { get; private set; } @@ -125,6 +126,8 @@ namespace Ryujinx.Graphics.Vulkan // Any device running on MacOS is using MoltenVK, even Intel and AMD vendors. IsMoltenVk = true; } + + SupportsMTL31 = OperatingSystem.IsMacOSVersionAtLeast(14); } private unsafe void LoadFeatures(uint maxQueueCount, uint queueFamilyIndex)