diff --git a/src/Ryujinx.Graphics.Rdna3Vulkan/Effects/AreaScalingFilter.cs b/src/Ryujinx.Graphics.Rdna3Vulkan/Effects/AreaScalingFilter.cs index a51956694..dde019df7 100644 --- a/src/Ryujinx.Graphics.Rdna3Vulkan/Effects/AreaScalingFilter.cs +++ b/src/Ryujinx.Graphics.Rdna3Vulkan/Effects/AreaScalingFilter.cs @@ -41,7 +41,7 @@ namespace Ryujinx.Graphics.Rdna3Vulkan.Effects _pipeline.Initialize(); - var scalingShader = EmbeddedResources.Read("Ryujinx.Graphics.Rdna3Vulkan/Effects/Shaders/AreaScaling.spv"); + var scalingShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/AreaScaling.spv"); var scalingResourceLayout = new ResourceLayoutBuilder() .Add(ResourceStages.Compute, ResourceType.UniformBuffer, 2) diff --git a/src/Ryujinx.Graphics.Rdna3Vulkan/Effects/FsrScalingFilter.cs b/src/Ryujinx.Graphics.Rdna3Vulkan/Effects/FsrScalingFilter.cs index 801d29418..1b12d12c8 100644 --- a/src/Ryujinx.Graphics.Rdna3Vulkan/Effects/FsrScalingFilter.cs +++ b/src/Ryujinx.Graphics.Rdna3Vulkan/Effects/FsrScalingFilter.cs @@ -53,8 +53,8 @@ namespace Ryujinx.Graphics.Rdna3Vulkan.Effects _pipeline.Initialize(); - var scalingShader = EmbeddedResources.Read("Ryujinx.Graphics.Rdna3Vulkan/Effects/Shaders/FsrScaling.spv"); - var sharpeningShader = EmbeddedResources.Read("Ryujinx.Graphics.Rdna3Vulkan/Effects/Shaders/FsrSharpening.spv"); + var scalingShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/FsrScaling.spv"); + var sharpeningShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/FsrSharpening.spv"); var scalingResourceLayout = new ResourceLayoutBuilder() .Add(ResourceStages.Compute, ResourceType.UniformBuffer, 2) diff --git a/src/Ryujinx.Graphics.Rdna3Vulkan/Effects/FxaaPostProcessingEffect.cs b/src/Ryujinx.Graphics.Rdna3Vulkan/Effects/FxaaPostProcessingEffect.cs index 69cecec97..53318b30c 100644 --- a/src/Ryujinx.Graphics.Rdna3Vulkan/Effects/FxaaPostProcessingEffect.cs +++ b/src/Ryujinx.Graphics.Rdna3Vulkan/Effects/FxaaPostProcessingEffect.cs @@ -37,7 +37,7 @@ namespace Ryujinx.Graphics.Rdna3Vulkan.Effects { _pipeline.Initialize(); - var shader = EmbeddedResources.Read("Ryujinx.Graphics.Rdna3Vulkan/Effects/Shaders/Fxaa.spv"); + var shader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/Fxaa.spv"); var resourceLayout = new ResourceLayoutBuilder() .Add(ResourceStages.Compute, ResourceType.UniformBuffer, 2) diff --git a/src/Ryujinx.Graphics.Rdna3Vulkan/Effects/SmaaPostProcessingEffect.cs b/src/Ryujinx.Graphics.Rdna3Vulkan/Effects/SmaaPostProcessingEffect.cs index 308f1b59c..10f42d7e5 100644 --- a/src/Ryujinx.Graphics.Rdna3Vulkan/Effects/SmaaPostProcessingEffect.cs +++ b/src/Ryujinx.Graphics.Rdna3Vulkan/Effects/SmaaPostProcessingEffect.cs @@ -74,9 +74,9 @@ namespace Ryujinx.Graphics.Rdna3Vulkan.Effects _pipeline.Initialize(); - var edgeShader = EmbeddedResources.Read("Ryujinx.Graphics.Rdna3Vulkan/Effects/Shaders/SmaaEdge.spv"); - var blendShader = EmbeddedResources.Read("Ryujinx.Graphics.Rdna3Vulkan/Effects/Shaders/SmaaBlend.spv"); - var neighbourShader = EmbeddedResources.Read("Ryujinx.Graphics.Rdna3Vulkan/Effects/Shaders/SmaaNeighbour.spv"); + var edgeShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/SmaaEdge.spv"); + var blendShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/SmaaBlend.spv"); + var neighbourShader = EmbeddedResources.Read("Ryujinx.Graphics.Vulkan/Effects/Shaders/SmaaNeighbour.spv"); var edgeResourceLayout = new ResourceLayoutBuilder() .Add(ResourceStages.Compute, ResourceType.UniformBuffer, 2) @@ -174,8 +174,8 @@ namespace Ryujinx.Graphics.Rdna3Vulkan.Effects SwizzleComponent.Blue, SwizzleComponent.Alpha); - var areaTexture = EmbeddedResources.ReadFileToRentedMemory("Ryujinx.Graphics.Rdna3Vulkan/Effects/Textures/SmaaAreaTexture.bin"); - var searchTexture = EmbeddedResources.ReadFileToRentedMemory("Ryujinx.Graphics.Rdna3Vulkan/Effects/Textures/SmaaSearchTexture.bin"); + var areaTexture = EmbeddedResources.ReadFileToRentedMemory("Ryujinx.Graphics.Vulkan/Effects/Textures/SmaaAreaTexture.bin"); + var searchTexture = EmbeddedResources.ReadFileToRentedMemory("Ryujinx.Graphics.Vulkan/Effects/Textures/SmaaSearchTexture.bin"); _areaTexture = _renderer.CreateTexture(areaInfo) as TextureView; _searchTexture = _renderer.CreateTexture(searchInfo) as TextureView; diff --git a/src/Ryujinx.Graphics.Rdna3Vulkan/HelperShader.cs b/src/Ryujinx.Graphics.Rdna3Vulkan/HelperShader.cs index 730e081af..c000aa817 100644 --- a/src/Ryujinx.Graphics.Rdna3Vulkan/HelperShader.cs +++ b/src/Ryujinx.Graphics.Rdna3Vulkan/HelperShader.cs @@ -27,7 +27,7 @@ namespace Ryujinx.Graphics.Rdna3Vulkan { private const int UniformBufferAlignment = 256; private const int ConvertElementsPerWorkgroup = 32 * 100; // Work group size of 32 times 100 elements. - private const string ShaderBinariesPath = "Ryujinx.Graphics.Rdna3Vulkan/Shaders/SpirvBinaries"; + private const string ShaderBinariesPath = "Ryujinx.Graphics.Vulkan/Shaders/SpirvBinaries"; private readonly PipelineHelperShader _pipeline; private readonly ISampler _samplerLinear; diff --git a/src/Ryujinx.Graphics.Rdna3Vulkan/Ryujinx.Graphics.Rdna3Vulkan.csproj b/src/Ryujinx.Graphics.Rdna3Vulkan/Ryujinx.Graphics.Rdna3Vulkan.csproj index 9753b0644..02237af4a 100644 --- a/src/Ryujinx.Graphics.Rdna3Vulkan/Ryujinx.Graphics.Rdna3Vulkan.csproj +++ b/src/Ryujinx.Graphics.Rdna3Vulkan/Ryujinx.Graphics.Rdna3Vulkan.csproj @@ -1,5 +1,4 @@  - $(DefaultItemExcludes);._* @@ -24,5 +23,4 @@ - diff --git a/src/Ryujinx.Graphics.Vulkan/Vendor.cs b/src/Ryujinx.Graphics.Vulkan/Vendor.cs index 55ae0cd81..c0a9bab14 100644 --- a/src/Ryujinx.Graphics.Vulkan/Vendor.cs +++ b/src/Ryujinx.Graphics.Vulkan/Vendor.cs @@ -3,7 +3,7 @@ using System.Text.RegularExpressions; namespace Ryujinx.Graphics.Vulkan { - enum Vendor + public enum Vendor { Amd, ImgTec, @@ -16,13 +16,21 @@ namespace Ryujinx.Graphics.Vulkan Unknown, } - static partial class VendorUtils + public static partial class VendorUtils { + public static readonly Regex AmdGcnPattern = AmdGcnRegex(); + public static readonly Regex NvidiaConsumerClassPattern = NvidiaConsumerClassRegex(); + public static readonly Regex AmdRdna3Pattern = AmdRdna3Regex(); + + [GeneratedRegex("Radeon (((HD|R(5|7|9|X)) )?((M?[2-6]\\d{2}(\\D|$))|([7-8]\\d{3}(\\D|$))|Fury|Nano))|(Pro Duo)")] - public static partial Regex AmdGcnRegex(); + private static partial Regex AmdGcnRegex(); [GeneratedRegex("NVIDIA GeForce (R|G)?TX? (\\d{3}\\d?)M?")] - public static partial Regex NvidiaConsumerClassRegex(); + private static partial Regex NvidiaConsumerClassRegex(); + + [GeneratedRegex("(AMD )?Radeon (RX |Pro W)7(6|7|8|9)00 ?(XT|XTX|GRE|Dual Slot)?")] + private static partial Regex AmdRdna3Regex(); public static Vendor FromId(uint id) { diff --git a/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs b/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs index 141be40f5..737b2649b 100644 --- a/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs +++ b/src/Ryujinx.Graphics.Vulkan/VulkanRenderer.cs @@ -342,11 +342,11 @@ namespace Ryujinx.Graphics.Vulkan GpuVersion = $"Vulkan v{ParseStandardVulkanVersion(properties.ApiVersion)}, Driver v{ParseDriverVersion(ref properties)}"; - IsAmdGcn = !IsMoltenVk && Vendor == Vendor.Amd && VendorUtils.AmdGcnRegex().IsMatch(GpuRenderer); + IsAmdGcn = !IsMoltenVk && Vendor == Vendor.Amd && VendorUtils.AmdGcnPattern.IsMatch(GpuRenderer); if (Vendor == Vendor.Nvidia) { - var match = VendorUtils.NvidiaConsumerClassRegex().Match(GpuRenderer); + var match = VendorUtils.NvidiaConsumerClassPattern.Match(GpuRenderer); if (match != null && int.TryParse(match.Groups[2].Value, out int gpuNumber)) { diff --git a/src/Ryujinx/AppHost.cs b/src/Ryujinx/AppHost.cs index a35a79e86..8cb92c935 100644 --- a/src/Ryujinx/AppHost.cs +++ b/src/Ryujinx/AppHost.cs @@ -48,6 +48,7 @@ using System; using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.Linq; using System.Runtime.InteropServices; using System.Threading; using System.Threading.Tasks; @@ -62,6 +63,8 @@ using Size = Avalonia.Size; using Switch = Ryujinx.HLE.Switch; using VSyncMode = Ryujinx.Common.Configuration.VSyncMode; +using Rdna3VulkanRenderer = Ryujinx.Graphics.Rdna3Vulkan.VulkanRenderer; + namespace Ryujinx.Ava { internal class AppHost @@ -885,6 +888,28 @@ namespace Ryujinx.Ava Logger.Info?.Print(LogClass.Emulation, "Emulation was paused"); } + private IRenderer CreateVulkanRenderer() + { + var physicalDevices = VulkanRenderer.GetPhysicalDevices(); + var selectedDevice = physicalDevices.First(d => d.Id == ConfigurationState.Instance.Graphics.PreferredGpu); + + var isRdna3 = VendorUtils.AmdRdna3Pattern.IsMatch(selectedDevice.Name); + + Logger.Info?.Print(LogClass.Gpu, $"{selectedDevice.Name}: {(isRdna3 ? "RDNA" : "NOT RDNA3")}"); + + if (VendorUtils.AmdRdna3Pattern.IsMatch(selectedDevice.Name)) + return Rdna3VulkanRenderer.Create( + ConfigurationState.Instance.Graphics.PreferredGpu, + (RendererHost.EmbeddedWindow as EmbeddedWindowVulkan)!.CreateSurface, + VulkanHelper.GetRequiredInstanceExtensions); + + return VulkanRenderer.Create( + ConfigurationState.Instance.Graphics.PreferredGpu, + (RendererHost.EmbeddedWindow as EmbeddedWindowVulkan)!.CreateSurface, + VulkanHelper.GetRequiredInstanceExtensions); + } + + private void InitializeSwitchInstance() { // Initialize KeySet. @@ -899,10 +924,7 @@ namespace Ryujinx.Ava // SelectGraphicsBackend does a check for Mac, on top of checking if it's an ARM Mac. This isn't a problem. GraphicsBackend.Metal => new MetalRenderer((RendererHost.EmbeddedWindow as EmbeddedWindowMetal)!.CreateSurface), #pragma warning restore CA1416 - GraphicsBackend.Vulkan => VulkanRenderer.Create( - ConfigurationState.Instance.Graphics.PreferredGpu, - (RendererHost.EmbeddedWindow as EmbeddedWindowVulkan)!.CreateSurface, - VulkanHelper.GetRequiredInstanceExtensions), + GraphicsBackend.Vulkan => CreateVulkanRenderer(), _ => new OpenGLRenderer() }; diff --git a/src/Ryujinx/Ryujinx.csproj b/src/Ryujinx/Ryujinx.csproj index 0991cf9ce..903137f4b 100644 --- a/src/Ryujinx/Ryujinx.csproj +++ b/src/Ryujinx/Ryujinx.csproj @@ -71,6 +71,7 @@ +