Renable Nvidia Multithreaded Pipeline compile after driver 515 (#91)

This commit is contained in:
niko1point0 2022-08-30 09:58:43 -04:00 committed by GitHub
parent 60074c440d
commit 584938d8f3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 32 additions and 7 deletions

View File

@ -34,26 +34,29 @@ uint32 VulkanPipelineStableCache::BeginLoading(uint64 cacheTitleId)
std::error_code ec;
fs::create_directories(ActiveSettings::GetPath("shaderCache/transferable"), ec);
const auto pathCacheFile = ActiveSettings::GetPath("shaderCache/transferable/{:016x}_vkpipeline.bin", cacheTitleId);
// init cache loader state
g_vkCacheState.pipelineLoadIndex = 0;
g_vkCacheState.pipelineMaxFileIndex = 0;
g_vkCacheState.pipelinesLoaded = 0;
g_vkCacheState.pipelinesQueued = 0;
// start async compilation threads
m_compilationCount.store(0);
m_compilationQueue.clear();
// get core count
uint32 cpuCoreCount = GetPhysicalCoreCount();
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");
if (VulkanRenderer::GetInstance()->GetDisableMultithreadedCompilation())
m_numCompilationThreads = 1;
}
for (uint32 i = 0; i < m_numCompilationThreads; i++)
{
std::thread compileThread(&VulkanPipelineStableCache::CompilerThread, this);
compileThread.detach();
}
// open cache file or create it
cemu_assert_debug(s_cache == nullptr);
const uint32 cacheFileVersion = 1;

View File

@ -12,6 +12,7 @@
#include "Cafe/CafeSystem.h"
#include "util/helpers/helpers.h"
#include "util/helpers/StringHelpers.h"
#include "config/ActiveSettings.h"
#include "config/CemuConfig.h"
@ -194,10 +195,29 @@ 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);
if(m_vendor == GfxVendor::Nvidia)
{
// multithreaded pipelines on nvidia (requires 515 or higher)
m_featureControl.disableMultithreadedCompilation = (StringHelpers::ToInt(std::string(driverProperties.driverInfo)) < 515);
}
}
else
{
forceLog_printf("Driver version (as stored in device info): %08X", properties.properties.driverVersion);
if(m_vendor == GfxVendor::Nvidia)
{
// if the driver does not support the extension,
// it is assumed the driver is under version 515
m_featureControl.disableMultithreadedCompilation = true;
}
}
}
void VulkanRenderer::GetDeviceFeatures()

View File

@ -547,7 +547,8 @@ private:
uint32 nonCoherentAtomSize = 256;
}limits;
bool debugMarkersSupported = false; // frame debugger is attached
bool debugMarkersSupported = false; // frame debugger is attached
bool disableMultithreadedCompilation = false; // for old nvidia drivers
}m_featureControl{};
static bool CheckDeviceExtensionSupport(const VkPhysicalDevice device, FeatureControl& info);
@ -1012,7 +1013,8 @@ private:
public:
bool useTFViaSSBO() { return m_featureControl.mode.useTFEmulationViaSSBO; };
bool GetDisableMultithreadedCompilation() { return m_featureControl.disableMultithreadedCompilation; }
bool useTFViaSSBO() { return m_featureControl.mode.useTFEmulationViaSSBO; }
bool IsDebugUtilsEnabled() const
{
return m_featureControl.debugMarkersSupported && m_featureControl.instanceExtensions.debug_utils;