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 @@
+