From 239c458a14313e6a8b7af7907636569b58de75f4 Mon Sep 17 00:00:00 2001 From: Niko Date: Sat, 27 Aug 2022 14:04:35 -0400 Subject: [PATCH] attempt fix nvidia multithread pipeline --- .../Renderer/Vulkan/VulkanPipelineStableCache.cpp | 7 +++++-- .../HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp | 14 +++++++++++++- src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.h | 5 ++++- 3 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanPipelineStableCache.cpp b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanPipelineStableCache.cpp index ddf5e273..739341e6 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanPipelineStableCache.cpp +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanPipelineStableCache.cpp @@ -46,8 +46,11 @@ uint32 VulkanPipelineStableCache::BeginLoading(uint64 cacheTitleId) m_numCompilationThreads = std::clamp(cpuCoreCount, 1u, 8u); if (g_renderer->GetVendor() == GfxVendor::Nvidia) { - forceLog_printf("Disable multi-threaded pipeline loading due to an issue with Nvidia drivers"); - m_numCompilationThreads = 1; + if (VulkanRenderer::GetInstance()->GetDriverVersion() < 515.0f) + { + forceLog_printf("Disable multi-threaded pipeline loading due to an issue with Nvidia drivers"); + m_numCompilationThreads = 1; + } } for (uint32 i = 0; i < m_numCompilationThreads; i++) { diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp index 383c0fd8..2164772e 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.cpp @@ -194,10 +194,22 @@ void VulkanRenderer::DetermineVendor() m_vendor = GfxVendor::Mesa; forceLog_printf("Using GPU: %s", properties.properties.deviceName); + if (m_featureControl.deviceExtensions.driver_properties) - forceLog_printf("Driver version: %s", driverProperties.driverInfo) + { + forceLog_printf("Driver version: %s", driverProperties.driverInfo); + + // needed for multithreaded pipelines on nvidia (requires 515.0 or higher) + sscanf(driverProperties.driverInfo, "%f", &driverVersion); + } + else + { forceLog_printf("Driver version (as stored in device info): %08X", properties.properties.driverVersion); + + // disables multithreaded pipeline loading on nvidia (requires 515.0 or higher) + driverVersion = 0.0f; + } } void VulkanRenderer::GetDeviceFeatures() diff --git a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.h b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.h index b77bfa53..1c310386 100644 --- a/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.h +++ b/src/Cafe/HW/Latte/Renderer/Vulkan/VulkanRenderer.h @@ -1012,7 +1012,8 @@ private: public: - bool useTFViaSSBO() { return m_featureControl.mode.useTFEmulationViaSSBO; }; + float GetDriverVersion() { return driverVersion; } + bool useTFViaSSBO() { return m_featureControl.mode.useTFEmulationViaSSBO; } bool IsDebugUtilsEnabled() const { return m_featureControl.debugMarkersSupported && m_featureControl.instanceExtensions.debug_utils; @@ -1020,6 +1021,8 @@ public: private: + float driverVersion; + // debug void debug_genericBarrier();