diff --git a/src/Ryujinx.Common/Helpers/Patterns.cs b/src/Ryujinx.Common/Helpers/Patterns.cs index 84cc1353a..943debc3b 100644 --- a/src/Ryujinx.Common/Helpers/Patterns.cs +++ b/src/Ryujinx.Common/Helpers/Patterns.cs @@ -9,6 +9,7 @@ namespace Ryujinx.Common.Helper public static readonly Regex Numeric = NumericRegex(); public static readonly Regex AmdGcn = AmdGcnRegex(); + public static readonly Regex AmdRdna3 = AmdRdna3Regex(); public static readonly Regex NvidiaConsumerClass = NvidiaConsumerClassRegex(); public static readonly Regex DomainLp1Ns = DomainLp1NsRegex(); @@ -46,6 +47,9 @@ namespace Ryujinx.Common.Helper "Radeon (((HD|R(5|7|9|X)) )?((M?[2-6]\\d{2}(\\D|$))|([7-8]\\d{3}(\\D|$))|Fury|Nano))|(Pro Duo)")] internal static partial Regex AmdGcnRegex(); + [GeneratedRegex("Radeon ([7-8](\\d{2}\\d?)[MS]|PRO [VW]7(\\d{2}\\d?)|RX 7\\d{3}([MS]?| XTX?| GRE)?)")] + public static partial Regex AmdRdna3Regex(); + [GeneratedRegex("NVIDIA GeForce (R|G)?TX? (\\d{3}\\d?)M?")] internal static partial Regex NvidiaConsumerClassRegex(); diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs b/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs index 191811593..49fe133dd 100644 --- a/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs +++ b/src/Ryujinx.Graphics.Vulkan/PipelineBase.cs @@ -1527,24 +1527,28 @@ namespace Ryujinx.Graphics.Vulkan private bool ChangeFeedbackLoop(FeedbackLoopAspects aspects) { - if (_feedbackLoop != aspects) + // AMD RDNA 3 GPUs only + if (Gd.IsAmdRdna3) { - if (Gd.Capabilities.SupportsDynamicAttachmentFeedbackLoop) + if (_feedbackLoop != aspects) { - DynamicState.SetFeedbackLoop(aspects); - } - else - { - _newState.FeedbackLoopAspects = aspects; - } + if (Gd.Capabilities.SupportsDynamicAttachmentFeedbackLoop) + { + DynamicState.SetFeedbackLoop(aspects); + } + else + { + _newState.FeedbackLoopAspects = aspects; + } - _feedbackLoop = aspects; + _feedbackLoop = aspects; - return true; + return true; + } } return false; - } + } [MethodImpl(MethodImplOptions.AggressiveInlining)] private bool UpdateFeedbackLoop() diff --git a/src/Ryujinx.Graphics.Vulkan/PipelineDynamicState.cs b/src/Ryujinx.Graphics.Vulkan/PipelineDynamicState.cs index ad26ff7b3..b6105589e 100644 --- a/src/Ryujinx.Graphics.Vulkan/PipelineDynamicState.cs +++ b/src/Ryujinx.Graphics.Vulkan/PipelineDynamicState.cs @@ -1,6 +1,7 @@ using Ryujinx.Common.Memory; using Silk.NET.Vulkan; using Silk.NET.Vulkan.Extensions.EXT; +using System; namespace Ryujinx.Graphics.Vulkan { @@ -27,6 +28,7 @@ namespace Ryujinx.Graphics.Vulkan public uint ViewportsCount; public Array16 Viewports; + [Flags] private enum DirtyFlags { None = 0, @@ -190,14 +192,14 @@ namespace Ryujinx.Graphics.Vulkan private readonly void RecordFeedbackLoop(ExtAttachmentFeedbackLoopDynamicState api, CommandBuffer commandBuffer) { - ImageAspectFlags aspects = (_feedbackLoopAspects & FeedbackLoopAspects.Color) != 0 ? ImageAspectFlags.ColorBit : 0; + ImageAspectFlags aspects = (_feedbackLoopAspects & FeedbackLoopAspects.Color) != 0 ? ImageAspectFlags.ColorBit : 0; - if ((_feedbackLoopAspects & FeedbackLoopAspects.Depth) != 0) - { - aspects |= ImageAspectFlags.DepthBit | ImageAspectFlags.StencilBit; - } + if ((_feedbackLoopAspects & FeedbackLoopAspects.Depth) != 0) + { + aspects |= ImageAspectFlags.DepthBit | ImageAspectFlags.StencilBit; + } - api.CmdSetAttachmentFeedbackLoopEnable(commandBuffer, aspects); + api.CmdSetAttachmentFeedbackLoopEnable(commandBuffer, aspects); } } } diff --git a/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs b/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs index e90606dcf..1dc55ca0a 100644 --- a/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs +++ b/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs @@ -92,6 +92,7 @@ namespace Ryujinx.Graphics.Vulkan internal bool IsAmdWindows { get; private set; } internal bool IsIntelWindows { get; private set; } internal bool IsAmdGcn { get; private set; } + internal bool IsAmdRdna3 { get; private set; } internal bool IsNvidiaPreTuring { get; private set; } internal bool IsIntelArc { get; private set; } internal bool IsQualcommProprietary { get; private set; } @@ -377,6 +378,10 @@ namespace Ryujinx.Graphics.Vulkan GpuVersion = $"Vulkan v{ParseStandardVulkanVersion(properties.ApiVersion)}, Driver v{ParseDriverVersion(ref properties)}"; IsAmdGcn = !IsMoltenVk && Vendor == Vendor.Amd && Patterns.AmdGcn.IsMatch(GpuRenderer); + + IsAmdRdna3 = Vendor == Vendor.Amd && (Patterns.AmdRdna3.IsMatch(GpuRenderer) + // ROG Ally (X) Device IDs + || properties.DeviceID is 0x15BF or 0x15C8); if (Vendor == Vendor.Nvidia) {