Use separate Vulkan implementation with Barrier changes on RDNA3 cards only

Use SPIRV binaries & shaders in main Vulkan project instead of duplicating them
This commit is contained in:
Evan Husted
2025-01-05 23:29:46 -06:00
parent b54c9c7d68
commit ac8b485d7c
10 changed files with 51 additions and 22 deletions

View File

@@ -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()
};