From 588d2052792ab00026659dffa283e6ab793c4fa7 Mon Sep 17 00:00:00 2001 From: Jonathan Glines Date: Wed, 21 Dec 2022 16:19:26 +0000 Subject: [PATCH] Show errors from NvPerfUtility in the RenderDoc UI Errors related to collecting NVIDIA hardware counters are now shown in the "Errors and Warnings" window of the Renderdoc UI. Previously, these errors were only visible in stderr. This includes errors for device compatibility, resource availability, and insufficient privileges. --- renderdoc/driver/d3d12/d3d12_replay.cpp | 2 +- renderdoc/driver/gl/gl_replay.cpp | 2 +- renderdoc/driver/ihv/nv/nv_d3d11_counters.cpp | 64 ++++++++++++---- renderdoc/driver/ihv/nv/nv_d3d12_counters.cpp | 76 ++++++++++++++----- renderdoc/driver/ihv/nv/nv_d3d12_counters.h | 3 +- renderdoc/driver/ihv/nv/nv_gl_counters.cpp | 72 +++++++++++++----- renderdoc/driver/ihv/nv/nv_gl_counters.h | 2 +- renderdoc/driver/ihv/nv/nv_vk_counters.cpp | 66 ++++++++++++---- 8 files changed, 220 insertions(+), 67 deletions(-) diff --git a/renderdoc/driver/d3d12/d3d12_replay.cpp b/renderdoc/driver/d3d12/d3d12_replay.cpp index 9d07f7806..351131b90 100644 --- a/renderdoc/driver/d3d12/d3d12_replay.cpp +++ b/renderdoc/driver/d3d12/d3d12_replay.cpp @@ -176,7 +176,7 @@ void D3D12Replay::CreateResources() NVD3D12Counters *countersNV = new NVD3D12Counters(); bool initSuccess = false; - if(countersNV && countersNV->Init(m_pDevice->GetReal())) + if(countersNV && countersNV->Init(*m_pDevice)) { m_pNVCounters = countersNV; initSuccess = true; diff --git a/renderdoc/driver/gl/gl_replay.cpp b/renderdoc/driver/gl/gl_replay.cpp index 73a368fad..8c02d0071 100644 --- a/renderdoc/driver/gl/gl_replay.cpp +++ b/renderdoc/driver/gl/gl_replay.cpp @@ -370,7 +370,7 @@ void GLReplay::SetReplayData(GLWindowingData data) } #if DISABLED(RDOC_ANDROID) && DISABLED(RDOC_APPLE) - if(countersNV && countersNV->Init()) + if(countersNV && countersNV->Init(m_pDriver)) { m_pNVCounters = countersNV; } diff --git a/renderdoc/driver/ihv/nv/nv_d3d11_counters.cpp b/renderdoc/driver/ihv/nv/nv_d3d11_counters.cpp index d390dae27..7e7058bd1 100644 --- a/renderdoc/driver/ihv/nv/nv_d3d11_counters.cpp +++ b/renderdoc/driver/ihv/nv/nv_d3d11_counters.cpp @@ -46,6 +46,24 @@ struct NVD3D11Counters::Impl CounterEnumerator = NULL; } + static void LogNvPerfAsDebugMessage(const char *pPrefix, const char *pDate, const char *pTime, + const char *pFunctionName, const char *pMessage, void *pData) + { + WrappedID3D11Device *device = (WrappedID3D11Device *)pData; + rdcstr message = + StringFormat::Fmt("NVIDIA Nsight Perf SDK\n%s%s\n%s", pPrefix, pFunctionName, pMessage); + device->AddDebugMessage(MessageCategory::Miscellaneous, MessageSeverity::High, + MessageSource::RuntimeWarning, message); + } + + static void LogDebugMessage(const char *pFunctionName, const char *pMessage, + WrappedID3D11Device *device) + { + rdcstr message = StringFormat::Fmt("NVIDIA Nsight Perf SDK\n%s\n%s", pFunctionName, pMessage); + device->AddDebugMessage(MessageCategory::Miscellaneous, MessageSeverity::High, + MessageSource::RuntimeWarning, message); + } + bool TryInitializePerfSDK(WrappedID3D11Device *device) { if(!NVCounterEnumerator::InitializeNvPerf()) @@ -60,13 +78,15 @@ struct NVD3D11Counters::Impl if(!nv::perf::D3D11LoadDriver()) { - RDCERR("NvPerf failed to load D3D11 driver"); + Impl::LogDebugMessage("NVD3D11Counters::Impl::TryInitializePerfSDK", + "NvPerf failed to load D3D11 driver", device); return false; } if(!nv::perf::profiler::D3D11IsGpuSupported(device->GetReal())) { - RDCERR("NvPerf does not support profiling on this GPU"); + Impl::LogDebugMessage("NVD3D11Counters::Impl::TryInitializePerfSDK", + "NvPerf does not support profiling on this GPU", device); return false; } @@ -74,7 +94,8 @@ struct NVD3D11Counters::Impl nv::perf::D3D11GetDeviceIdentifiers(device->GetReal()); if(!deviceIdentifiers.pChipName) { - RDCERR("NvPerf could not determine chip name"); + Impl::LogDebugMessage("NVD3D11Counters::Impl::TryInitializePerfSDK", + "NvPerf could not determine chip name", device); return false; } @@ -82,7 +103,9 @@ struct NVD3D11Counters::Impl nv::perf::D3D11CalculateMetricsEvaluatorScratchBufferSize(deviceIdentifiers.pChipName); if(!scratchBufferSize) { - RDCERR("NvPerf could not determine scratch buffer size for metrics evaluation"); + Impl::LogDebugMessage("NVD3D11Counters::Impl::TryInitializePerfSDK", + "NvPerf could not determine scratch buffer size for metrics evaluation", + device); return false; } @@ -92,7 +115,8 @@ struct NVD3D11Counters::Impl scratchBuffer.data(), scratchBuffer.size(), deviceIdentifiers.pChipName); if(!pMetricsEvaluator) { - RDCERR("NvPerf could not initialize metrics evaluator"); + Impl::LogDebugMessage("NVD3D11Counters::Impl::TryInitializePerfSDK", + "NvPerf could not initialize metrics evaluator", device); return false; } @@ -101,7 +125,8 @@ struct NVD3D11Counters::Impl CounterEnumerator = new NVCounterEnumerator; if(!CounterEnumerator->Init(std::move(metricsEvaluator))) { - RDCERR("NvPerf could not initialize metrics evaluator"); + Impl::LogDebugMessage("NVD3D11Counters::Impl::TryInitializePerfSDK", + "NvPerf could not initialize metrics evaluator", device); delete CounterEnumerator; return false; } @@ -177,6 +202,9 @@ bool NVD3D11Counters::Init(WrappedID3D11Device *device) if(!m_Impl) return false; + nv::perf::UserLogEnableCustom(NVD3D11Counters::Impl::LogNvPerfAsDebugMessage, (void *)device); + auto logGuard = nv::perf::ScopeExitGuard([]() { nv::perf::UserLogDisableCustom(); }); + const bool initSuccess = m_Impl->TryInitializePerfSDK(device); if(!initSuccess) { @@ -227,6 +255,9 @@ rdcarray NVD3D11Counters::FetchCounters(const rdcarrayGetReal(); ID3D11DeviceContext *d3dImmediateContext = immediateContext->GetReal(); @@ -249,7 +280,8 @@ rdcarray NVD3D11Counters::FetchCounters(const rdcarray NVD3D11Counters::FetchCounters(const rdcarray NVD3D11Counters::FetchCounters(const rdcarray NVD3D11Counters::FetchCounters(const rdcarray NVD3D11Counters::FetchCounters(const rdcarrayCounterEnumerator->EvaluateMetrics(counterDataImage.data(), counterDataImage.size(), results)) { - RDCERR("NvPerf failed to evaluate metrics from counter data"); + Impl::LogDebugMessage("NVD3D11Counters::FetchCounters", + "NvPerf failed to evaluate metrics from counter data", device); return {}; } diff --git a/renderdoc/driver/ihv/nv/nv_d3d12_counters.cpp b/renderdoc/driver/ihv/nv/nv_d3d12_counters.cpp index dceb92edb..83de37687 100644 --- a/renderdoc/driver/ihv/nv/nv_d3d12_counters.cpp +++ b/renderdoc/driver/ihv/nv/nv_d3d12_counters.cpp @@ -49,7 +49,25 @@ struct NVD3D12Counters::Impl CounterEnumerator = NULL; } - bool TryInitializePerfSDK(ID3D12Device *device) + static void LogNvPerfAsDebugMessage(const char *pPrefix, const char *pDate, const char *pTime, + const char *pFunctionName, const char *pMessage, void *pData) + { + WrappedID3D12Device *device = (WrappedID3D12Device *)pData; + rdcstr message = + StringFormat::Fmt("NVIDIA Nsight Perf SDK\n%s%s\n%s", pPrefix, pFunctionName, pMessage); + device->AddDebugMessage(MessageCategory::Miscellaneous, MessageSeverity::High, + MessageSource::RuntimeWarning, message); + } + + static void LogDebugMessage(const char *pFunctionName, const char *pMessage, + WrappedID3D12Device &device) + { + rdcstr message = StringFormat::Fmt("NVIDIA Nsight Perf SDK\n%s\n%s", pFunctionName, pMessage); + device.AddDebugMessage(MessageCategory::Miscellaneous, MessageSeverity::High, + MessageSource::RuntimeWarning, message); + } + + bool TryInitializePerfSDK(WrappedID3D12Device &device) { if(!NVCounterEnumerator::InitializeNvPerf()) { @@ -63,20 +81,24 @@ struct NVD3D12Counters::Impl if(!nv::perf::D3D12LoadDriver()) { - RDCERR("NvPerf failed to load D3D12 driver"); + Impl::LogDebugMessage("NVD3D12Counters::Impl::TryInitializePerfSDK", + "NvPerf failed to load D3D12 driver", device); return false; } - if(!nv::perf::profiler::D3D12IsGpuSupported(device)) + if(!nv::perf::profiler::D3D12IsGpuSupported(device.GetReal())) { - RDCERR("NvPerf does not support profiling on this GPU"); + Impl::LogDebugMessage("NVD3D12Counters::Impl::TryInitializePerfSDK", + "NvPerf does not support profiling on this GPU", device); return false; } - nv::perf::DeviceIdentifiers deviceIdentifiers = nv::perf::D3D12GetDeviceIdentifiers(device); + nv::perf::DeviceIdentifiers deviceIdentifiers = + nv::perf::D3D12GetDeviceIdentifiers(device.GetReal()); if(!deviceIdentifiers.pChipName) { - RDCERR("NvPerf could not determine chip name"); + Impl::LogDebugMessage("NVD3D12Counters::Impl::TryInitializePerfSDK", + "NvPerf could not determine chip name", device); return false; } @@ -84,7 +106,9 @@ struct NVD3D12Counters::Impl nv::perf::D3D12CalculateMetricsEvaluatorScratchBufferSize(deviceIdentifiers.pChipName); if(!scratchBufferSize) { - RDCERR("NvPerf could not determine the scratch buffer size for metrics evaluation"); + Impl::LogDebugMessage( + "NVD3D12Counters::Impl::TryInitializePerfSDK", + "NvPerf could not determine the scratch buffer size for metrics evaluation", device); return false; } @@ -94,7 +118,8 @@ struct NVD3D12Counters::Impl scratchBuffer.data(), scratchBuffer.size(), deviceIdentifiers.pChipName); if(!pMetricsEvaluator) { - RDCERR("NvPerf could not initialize metrics evaluator"); + Impl::LogDebugMessage("NVD3D12Counters::Impl::TryInitializePerfSDK", + "NvPerf could not initialize metrics evaluator", device); return false; } @@ -103,7 +128,8 @@ struct NVD3D12Counters::Impl CounterEnumerator = new NVCounterEnumerator; if(!CounterEnumerator->Init(std::move(metricsEvaluator))) { - RDCERR("NvPerf could not initialize metrics evaluator"); + Impl::LogDebugMessage("NVD3D12Counters::Impl::TryInitializePerfSDK", + "NvPerf could not initialize metrics evaluator", device); delete CounterEnumerator; return false; } @@ -149,13 +175,16 @@ NVD3D12Counters::~NVD3D12Counters() m_Impl = NULL; } -bool NVD3D12Counters::Init(ID3D12Device *device) +bool NVD3D12Counters::Init(WrappedID3D12Device &device) { m_Impl = new Impl; if(!m_Impl) return false; + nv::perf::UserLogEnableCustom(NVD3D12Counters::Impl::LogNvPerfAsDebugMessage, (void *)&device); + auto logGuard = nv::perf::ScopeExitGuard([]() { nv::perf::UserLogDisableCustom(); }); + bool initSuccess = m_Impl->TryInitializePerfSDK(device); if(!initSuccess) { @@ -265,6 +294,9 @@ rdcarray NVD3D12Counters::FetchCounters(const rdcarrayGetMaxEID(); ID3D12Device *d3dDevice = device.GetReal(); @@ -316,7 +348,8 @@ rdcarray NVD3D12Counters::FetchCounters(const rdcarray NVD3D12Counters::FetchCounters(const rdcarray NVD3D12Counters::FetchCounters(const rdcarray NVD3D12Counters::FetchCounters(const rdcarray NVD3D12Counters::FetchCounters(const rdcarray NVD3D12Counters::FetchCounters(const rdcarray= maxNumReplayPasses - 1) { - RDCERR("NvPerf exceeded the maximum expected number of replay passes"); + Impl::LogDebugMessage("NVD3D12Counters::FetchCounters", + "NvPerf exceeded the maximum expected number of replay passes", device); break; // Failure } } if(counterDataImage.empty()) { - RDCERR("No data found in NvPerf counter data image"); + Impl::LogDebugMessage("NVD3D12Counters::FetchCounters", + "No data found in NvPerf counter data image", device); return {}; } if(!m_Impl->CounterEnumerator->EvaluateMetrics(counterDataImage.data(), counterDataImage.size(), results)) { - RDCERR("NvPerf failed to evaluate metrics from counter data"); + Impl::LogDebugMessage("NVD3D12Counters::FetchCounters", + "NvPerf failed to evaluate metrics from counter data", device); return {}; } } diff --git a/renderdoc/driver/ihv/nv/nv_d3d12_counters.h b/renderdoc/driver/ihv/nv/nv_d3d12_counters.h index f120879e3..126a5a311 100644 --- a/renderdoc/driver/ihv/nv/nv_d3d12_counters.h +++ b/renderdoc/driver/ihv/nv/nv_d3d12_counters.h @@ -28,7 +28,6 @@ #include "api/replay/rdcarray.h" #include "api/replay/replay_enums.h" -struct ID3D12Device; class WrappedID3D12Device; class NVD3D12Counters final @@ -37,7 +36,7 @@ public: NVD3D12Counters(); ~NVD3D12Counters(); - bool Init(ID3D12Device *device); + bool Init(WrappedID3D12Device &device); rdcarray EnumerateCounters() const; bool HasCounter(GPUCounter counterID) const; diff --git a/renderdoc/driver/ihv/nv/nv_gl_counters.cpp b/renderdoc/driver/ihv/nv/nv_gl_counters.cpp index e9e8dd73f..4d23c6ffd 100644 --- a/renderdoc/driver/ihv/nv/nv_gl_counters.cpp +++ b/renderdoc/driver/ihv/nv/nv_gl_counters.cpp @@ -37,6 +37,23 @@ struct NVGLCounters::Impl NVCounterEnumerator *CounterEnumerator; bool LibraryNotFound = false; + static void LogNvPerfAsDebugMessage(const char *pPrefix, const char *pDate, const char *pTime, + const char *pFunctionName, const char *pMessage, void *pData) + { + WrappedOpenGL *driver = (WrappedOpenGL *)pData; + rdcstr message = + StringFormat::Fmt("NVIDIA Nsight Perf SDK\n%s%s\n%s", pPrefix, pFunctionName, pMessage); + driver->AddDebugMessage(MessageCategory::Miscellaneous, MessageSeverity::High, + MessageSource::RuntimeWarning, message); + } + + static void LogDebugMessage(const char *pFunctionName, const char *pMessage, WrappedOpenGL *driver) + { + rdcstr message = StringFormat::Fmt("NVIDIA Nsight Perf SDK\n%s\n%s", pFunctionName, pMessage); + driver->AddDebugMessage(MessageCategory::Miscellaneous, MessageSeverity::High, + MessageSource::RuntimeWarning, message); + } + Impl() : CounterEnumerator(NULL) {} ~Impl() { @@ -44,7 +61,7 @@ struct NVGLCounters::Impl CounterEnumerator = NULL; } - bool TryInitializePerfSDK() + bool TryInitializePerfSDK(WrappedOpenGL *driver) { if(!NVCounterEnumerator::InitializeNvPerf()) { @@ -58,20 +75,23 @@ struct NVGLCounters::Impl if(!nv::perf::OpenGLLoadDriver()) { - RDCERR("NvPerf failed to load OpenGL driver"); + Impl::LogDebugMessage("NVGLCounters::Impl::TryInitializePerfSDK", + "NvPerf failed to load OpenGL driver", driver); return false; } if(!nv::perf::profiler::OpenGLIsGpuSupported()) { - RDCERR("NvPerf does not support profiling on this GPU"); + Impl::LogDebugMessage("NVGLCounters::Impl::TryInitializePerfSDK", + "NvPerf does not support profiling on this GPU", driver); return false; } nv::perf::DeviceIdentifiers deviceIdentifiers = nv::perf::OpenGLGetDeviceIdentifiers(); if(!deviceIdentifiers.pChipName) { - RDCERR("NvPerf could not determine chip name"); + Impl::LogDebugMessage("NVGLCounters::Impl::TryInitializePerfSDK", + "NvPerf could not determine chip name", driver); return false; } @@ -79,7 +99,9 @@ struct NVGLCounters::Impl nv::perf::OpenGLCalculateMetricsEvaluatorScratchBufferSize(deviceIdentifiers.pChipName); if(!scratchBufferSize) { - RDCERR("NvPerf could not determine scratch buffer size for metrics evaluation"); + Impl::LogDebugMessage("NVGLCounters::Impl::TryInitializePerfSDK", + "NvPerf could not determine scratch buffer size for metrics evaluation", + driver); return false; } @@ -89,7 +111,8 @@ struct NVGLCounters::Impl scratchBuffer.data(), scratchBuffer.size(), deviceIdentifiers.pChipName); if(!pMetricsEvaluator) { - RDCERR("NvPerf could not initialize metrics evaluator"); + Impl::LogDebugMessage("NVGLCounters::Impl::TryInitializePerfSDK", + "NvPerf could not initialize metrics evaluator", driver); return false; } @@ -98,7 +121,8 @@ struct NVGLCounters::Impl CounterEnumerator = new NVCounterEnumerator; if(!CounterEnumerator->Init(std::move(metricsEvaluator))) { - RDCERR("NvPerf could not initialize metrics evaluator"); + Impl::LogDebugMessage("NVGLCounters::Impl::TryInitializePerfSDK", + "NvPerf could not initialize metrics evaluator", driver); delete CounterEnumerator; return false; } @@ -168,13 +192,16 @@ NVGLCounters::~NVGLCounters() m_Impl = NULL; } -bool NVGLCounters::Init() +bool NVGLCounters::Init(WrappedOpenGL *driver) { m_Impl = new Impl; if(!m_Impl) return false; - const bool initSuccess = m_Impl->TryInitializePerfSDK(); + nv::perf::UserLogEnableCustom(NVGLCounters::Impl::LogNvPerfAsDebugMessage, (void *)driver); + auto logGuard = nv::perf::ScopeExitGuard([]() { nv::perf::UserLogDisableCustom(); }); + + const bool initSuccess = m_Impl->TryInitializePerfSDK(driver); if(!initSuccess) { delete m_Impl; @@ -222,6 +249,9 @@ rdcarray NVGLCounters::FetchCounters(const rdcarray & return {}; } + nv::perf::UserLogEnableCustom(NVGLCounters::Impl::LogNvPerfAsDebugMessage, (void *)driver); + auto logGuard = nv::perf::ScopeExitGuard([]() { nv::perf::UserLogDisableCustom(); }); + uint32_t maxNumRanges; { uint32_t numEvents = 0u; @@ -241,7 +271,8 @@ rdcarray NVGLCounters::FetchCounters(const rdcarray & if(!rangeProfiler.BeginSession(sessionOptions)) { - RDCERR("NvPerf failed to start profiling session"); + Impl::LogDebugMessage("NVGLCounters::FetchCounters", "NvPerf failed to start profiling session", + driver); return {}; // Failure } auto sessionGuard = nv::perf::ScopeExitGuard([&rangeProfiler]() { rangeProfiler.EndSession(); }); @@ -267,7 +298,8 @@ rdcarray NVGLCounters::FetchCounters(const rdcarray & if(!rangeProfiler.EnqueueCounterCollection(setConfigParams)) { - RDCERR("NvPerf failed to schedule counter collection"); + Impl::LogDebugMessage("NVGLCounters::FetchCounters", + "NvPerf failed to schedule counter collection", driver); return {}; // Failure } @@ -276,7 +308,8 @@ rdcarray NVGLCounters::FetchCounters(const rdcarray & { if(!rangeProfiler.BeginPass()) { - RDCERR("NvPerf failed to start counter collection pass"); + Impl::LogDebugMessage("NVGLCounters::FetchCounters", + "NvPerf failed to start counter collection pass", driver); break; // Failure } @@ -285,14 +318,16 @@ rdcarray NVGLCounters::FetchCounters(const rdcarray & if(!rangeProfiler.EndPass()) { - RDCERR("NvPerf failed to end counter collection pass!"); + Impl::LogDebugMessage("NVGLCounters::FetchCounters", + "NvPerf failed to end counter collection pass!", driver); break; // Failure } nv::perf::profiler::DecodeResult decodeResult; if(!rangeProfiler.DecodeCounters(decodeResult)) { - RDCERR("NvPerf failed to decode counters in collection pass"); + Impl::LogDebugMessage("NVGLCounters::FetchCounters", + "NvPerf failed to decode counters in collection pass", driver); break; // Failure } @@ -304,21 +339,24 @@ rdcarray NVGLCounters::FetchCounters(const rdcarray & if(replayPass >= maxNumReplayPasses - 1) { - RDCERR("NvPerf exceeded the maximum expected number of replay passes"); + Impl::LogDebugMessage("NVGLCounters::FetchCounters", + "NvPerf exceeded the maximum expected number of replay passes", driver); break; // Failure } } if(counterDataImage.empty()) { - RDCERR("No data found in NvPerf counter data image"); + Impl::LogDebugMessage("NVGLCounters::FetchCounters", + "No data found in NvPerf counter data image", driver); return {}; // Failure } if(!m_Impl->CounterEnumerator->EvaluateMetrics(counterDataImage.data(), counterDataImage.size(), results)) { - RDCERR("NvPerf failed to evaluate metrics from counter data"); + Impl::LogDebugMessage("NVGLCounters::FetchCounters", + "NvPerf failed to evaluate metrics from counter data", driver); return {}; } diff --git a/renderdoc/driver/ihv/nv/nv_gl_counters.h b/renderdoc/driver/ihv/nv/nv_gl_counters.h index eea230bc1..81cce7812 100644 --- a/renderdoc/driver/ihv/nv/nv_gl_counters.h +++ b/renderdoc/driver/ihv/nv/nv_gl_counters.h @@ -36,7 +36,7 @@ public: NVGLCounters(); ~NVGLCounters(); - bool Init(); + bool Init(WrappedOpenGL *driver); rdcarray EnumerateCounters() const; bool HasCounter(GPUCounter counterID) const; diff --git a/renderdoc/driver/ihv/nv/nv_vk_counters.cpp b/renderdoc/driver/ihv/nv/nv_vk_counters.cpp index 92fb7c101..3df69008b 100644 --- a/renderdoc/driver/ihv/nv/nv_vk_counters.cpp +++ b/renderdoc/driver/ihv/nv/nv_vk_counters.cpp @@ -46,6 +46,23 @@ struct NVVulkanCounters::Impl CounterEnumerator = NULL; } + static void LogNvPerfAsDebugMessage(const char *pPrefix, const char *pDate, const char *pTime, + const char *pFunctionName, const char *pMessage, void *pData) + { + WrappedVulkan *driver = (WrappedVulkan *)pData; + rdcstr message = + StringFormat::Fmt("NVIDIA Nsight Perf SDK\n%s%s\n%s", pPrefix, pFunctionName, pMessage); + driver->AddDebugMessage(MessageCategory::Miscellaneous, MessageSeverity::High, + MessageSource::RuntimeWarning, message); + } + + static void LogDebugMessage(const char *pFunctionName, const char *pMessage, WrappedVulkan *driver) + { + rdcstr message = StringFormat::Fmt("NVIDIA Nsight Perf SDK\n%s\n%s", pFunctionName, pMessage); + driver->AddDebugMessage(MessageCategory::Miscellaneous, MessageSeverity::High, + MessageSource::RuntimeWarning, message); + } + bool TryInitializePerfSDK(WrappedVulkan *driver) { if(!NVCounterEnumerator::InitializeNvPerf()) @@ -60,7 +77,8 @@ struct NVVulkanCounters::Impl if(!nv::perf::VulkanLoadDriver(Unwrap(driver->GetInstance()))) { - RDCERR("NvPerf failed to load Vulkan driver"); + Impl::LogDebugMessage("NVVulkanCounters::Impl::TryInitializePerfSDK", + "NvPerf failed to load Vulkan driver", driver); return false; } @@ -69,7 +87,8 @@ struct NVVulkanCounters::Impl ObjDisp(driver->GetInstance())->GetInstanceProcAddr, ObjDisp(driver->GetDev())->GetDeviceProcAddr)) { - RDCERR("NvPerf does not support profiling on this GPU"); + Impl::LogDebugMessage("NVVulkanCounters::Impl::TryInitializePerfSDK", + "NvPerf does not support profiling on this GPU", driver); return false; } @@ -79,7 +98,8 @@ struct NVVulkanCounters::Impl ObjDisp(driver->GetDev())->GetDeviceProcAddr); if(!deviceIdentifiers.pChipName) { - RDCERR("NvPerf could not determine chip name"); + Impl::LogDebugMessage("NVVulkanCounters::Impl::TryInitializePerfSDK", + "NvPerf could not determine chip name", driver); return false; } @@ -87,7 +107,9 @@ struct NVVulkanCounters::Impl nv::perf::VulkanCalculateMetricsEvaluatorScratchBufferSize(deviceIdentifiers.pChipName); if(!scratchBufferSize) { - RDCERR("NvPerf could not determine scratch buffer size for metrics evaluation"); + Impl::LogDebugMessage("NVVulkanCounters::Impl::TryInitializePerfSDK", + "NvPerf could not determine scratch buffer size for metrics evaluation", + driver); return false; } @@ -97,7 +119,8 @@ struct NVVulkanCounters::Impl scratchBuffer.data(), scratchBuffer.size(), deviceIdentifiers.pChipName); if(!pMetricsEvaluator) { - RDCERR("NvPerf could not initialize metrics evaluator"); + Impl::LogDebugMessage("NVVulkanCounters::Impl::TryInitializePerfSDK", + "NvPerf could not initialize metrics evaluator", driver); return false; } @@ -106,7 +129,8 @@ struct NVVulkanCounters::Impl CounterEnumerator = new NVCounterEnumerator; if(!CounterEnumerator->Init(std::move(metricsEvaluator))) { - RDCERR("NvPerf could not initialize metrics evaluator"); + Impl::LogDebugMessage("NVVulkanCounters::Impl::TryInitializePerfSDK", + "NvPerf could not initialize metrics evaluator", driver); delete CounterEnumerator; return false; } @@ -158,6 +182,9 @@ bool NVVulkanCounters::Init(WrappedVulkan *driver) if(!m_Impl) return false; + nv::perf::UserLogEnableCustom(NVVulkanCounters::Impl::LogNvPerfAsDebugMessage, (void *)driver); + auto logGuard = nv::perf::ScopeExitGuard([]() { nv::perf::UserLogDisableCustom(); }); + const bool initSuccess = m_Impl->TryInitializePerfSDK(driver); if(!initSuccess) { @@ -259,6 +286,9 @@ rdcarray NVVulkanCounters::FetchCounters(const rdcarrayGetMaxEID(); uint32_t maxNumRanges = 0; @@ -287,7 +317,8 @@ rdcarray NVVulkanCounters::FetchCounters(const rdcarrayGetInstance())->GetInstanceProcAddr, ObjDisp(driver->GetDev())->GetDeviceProcAddr)) { - RDCERR("NvPerf failed to start profiling session"); + Impl::LogDebugMessage("NVVulkanCounters::FetchCounters", + "NvPerf failed to start profiling session", driver); return {}; // Failure } auto sessionGuard = nv::perf::ScopeExitGuard([&rangeProfiler]() { rangeProfiler.EndSession(); }); @@ -318,7 +349,8 @@ rdcarray NVVulkanCounters::FetchCounters(const rdcarray NVVulkanCounters::FetchCounters(const rdcarray NVVulkanCounters::FetchCounters(const rdcarray NVVulkanCounters::FetchCounters(const rdcarray NVVulkanCounters::FetchCounters(const rdcarray= maxNumReplayPasses - 1) { - RDCERR("NvPerf exceeded the maximum expected number of replay passes"); + Impl::LogDebugMessage("NVVulkanCounters::FetchCounters", + "NvPerf exceeded the maximum expected number of replay passes", driver); break; // Failure } } if(counterDataImage.empty()) { - RDCERR("No data found in NvPerf counter data image"); + Impl::LogDebugMessage("NVVulkanCounters::FetchCounters", + "No data found in NvPerf counter data image", driver); return {}; } if(!m_Impl->CounterEnumerator->EvaluateMetrics(counterDataImage.data(), counterDataImage.size(), results)) { - RDCERR("NvPerf failed to evaluate metrics from counter data"); + Impl::LogDebugMessage("NVVulkanCounters::FetchCounters", + "NvPerf failed to evaluate metrics from counter data", driver); return {}; } }