From c98b61ade8be308d0662ddb2366ca8c76a5be015 Mon Sep 17 00:00:00 2001 From: riperiperi Date: Sat, 11 Jun 2022 18:33:03 +0100 Subject: [PATCH] Use RobustBufferAccess on NVIDIA gpus Avoids the SMO waterfall triangle on older NVIDIA gpus. --- Ryujinx.Graphics.Vulkan/Vendor.cs | 15 +++++++++++++++ Ryujinx.Graphics.Vulkan/VulkanGraphicsDevice.cs | 9 +-------- Ryujinx.Graphics.Vulkan/VulkanInitialization.cs | 6 +++++- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/Ryujinx.Graphics.Vulkan/Vendor.cs b/Ryujinx.Graphics.Vulkan/Vendor.cs index d55a8b3db..228b304ab 100644 --- a/Ryujinx.Graphics.Vulkan/Vendor.cs +++ b/Ryujinx.Graphics.Vulkan/Vendor.cs @@ -8,4 +8,19 @@ namespace Ryujinx.Graphics.Vulkan Qualcomm, Unknown } + + static class VendorUtils + { + public static Vendor FromId(uint id) + { + return id switch + { + 0x1002 => Vendor.Amd, + 0x10DE => Vendor.Nvidia, + 0x8086 => Vendor.Intel, + 0x5143 => Vendor.Qualcomm, + _ => Vendor.Unknown + }; + } + } } diff --git a/Ryujinx.Graphics.Vulkan/VulkanGraphicsDevice.cs b/Ryujinx.Graphics.Vulkan/VulkanGraphicsDevice.cs index adf36d54c..3cf155c51 100644 --- a/Ryujinx.Graphics.Vulkan/VulkanGraphicsDevice.cs +++ b/Ryujinx.Graphics.Vulkan/VulkanGraphicsDevice.cs @@ -477,14 +477,7 @@ namespace Ryujinx.Graphics.Vulkan _ => $"0x{properties.VendorID:X}" }; - Vendor = properties.VendorID switch - { - 0x1002 => Vendor.Amd, - 0x10DE => Vendor.Nvidia, - 0x8086 => Vendor.Intel, - 0x5143 => Vendor.Qualcomm, - _ => Vendor.Unknown - }; + Vendor = VendorUtils.FromId(properties.VendorID); IsAmdWindows = Vendor == Vendor.Amd && RuntimeInformation.IsOSPlatform(OSPlatform.Windows); IsIntelWindows = Vendor == Vendor.Intel && RuntimeInformation.IsOSPlatform(OSPlatform.Windows); diff --git a/Ryujinx.Graphics.Vulkan/VulkanInitialization.cs b/Ryujinx.Graphics.Vulkan/VulkanInitialization.cs index add847898..fd3578e2d 100644 --- a/Ryujinx.Graphics.Vulkan/VulkanInitialization.cs +++ b/Ryujinx.Graphics.Vulkan/VulkanInitialization.cs @@ -300,6 +300,9 @@ namespace Ryujinx.Graphics.Vulkan PQueuePriorities = queuePriorities }; + api.GetPhysicalDeviceProperties(physicalDevice, out var properties); + bool useRobustBufferAccess = VendorUtils.FromId(properties.VendorID) == Vendor.Nvidia; + var supportedFeatures = api.GetPhysicalDeviceFeature(physicalDevice); var features = new PhysicalDeviceFeatures() @@ -321,7 +324,8 @@ namespace Ryujinx.Graphics.Vulkan // ShaderStorageImageReadWithoutFormat = true, // ShaderStorageImageWriteWithoutFormat = true, TessellationShader = true, - VertexPipelineStoresAndAtomics = true + VertexPipelineStoresAndAtomics = true, + RobustBufferAccess = useRobustBufferAccess }; void* pExtendedFeatures = null;