From d03952a87460dafa334ff129a7c175a19ac69a94 Mon Sep 17 00:00:00 2001 From: Jonathan Glines Date: Fri, 2 Jan 2026 11:08:51 -0800 Subject: [PATCH] Fix crash in NVIDIA HasCounter() called without EnumerateCounters() This fix avoids a NULL-pointer dereference when HasCounter() is called without a preceding call to EnumerateCounters() for NVIDIA Nsight Perf SDK counters. --- renderdoc/driver/ihv/nv/nv_d3d11_counters.cpp | 4 ++++ renderdoc/driver/ihv/nv/nv_d3d12_counters.cpp | 10 ++++++++++ renderdoc/driver/ihv/nv/nv_gl_counters.cpp | 4 ++++ renderdoc/driver/ihv/nv/nv_vk_counters.cpp | 4 ++++ 4 files changed, 22 insertions(+) diff --git a/renderdoc/driver/ihv/nv/nv_d3d11_counters.cpp b/renderdoc/driver/ihv/nv/nv_d3d11_counters.cpp index 6c99c4e59..b1033c5a8 100644 --- a/renderdoc/driver/ihv/nv/nv_d3d11_counters.cpp +++ b/renderdoc/driver/ihv/nv/nv_d3d11_counters.cpp @@ -296,6 +296,10 @@ bool NVD3D11Counters::HasCounter(GPUCounter counterID) const { return counterID == GPUCounter::FirstNvidia; } + if(!m_Impl->CounterEnumerator) + { + return false; + } return m_Impl->CounterEnumerator->HasCounter(counterID); } diff --git a/renderdoc/driver/ihv/nv/nv_d3d12_counters.cpp b/renderdoc/driver/ihv/nv/nv_d3d12_counters.cpp index ffc4a3f87..c704eb728 100644 --- a/renderdoc/driver/ihv/nv/nv_d3d12_counters.cpp +++ b/renderdoc/driver/ihv/nv/nv_d3d12_counters.cpp @@ -293,6 +293,12 @@ rdcarray NVD3D12Counters::EnumerateCounters(WrappedID3D12Device &dev { return {GPUCounter::FirstNvidia}; } + // NOTE: Nsight Perf SDK needs access to a D3D12 device handle and command + // queue in order to determine which counters are available on a + // particular NVIDIA device. However, since the D3D12 command queue is + // not available at the time NVD3D12Counters::Init() is called this + // determination must be deferred until the first time + // NVD3D12Counters::EnumerateCounters() is called. if(!m_Impl->InitCounterEnumerator(device)) { return {GPUCounter::FirstNvidia}; @@ -306,6 +312,10 @@ bool NVD3D12Counters::HasCounter(GPUCounter counterID) const { return counterID == GPUCounter::FirstNvidia; } + if(!m_Impl->CounterEnumerator) + { + return false; + } return m_Impl->CounterEnumerator->HasCounter(counterID); } diff --git a/renderdoc/driver/ihv/nv/nv_gl_counters.cpp b/renderdoc/driver/ihv/nv/nv_gl_counters.cpp index 8cdafdbda..1c71abaa8 100644 --- a/renderdoc/driver/ihv/nv/nv_gl_counters.cpp +++ b/renderdoc/driver/ihv/nv/nv_gl_counters.cpp @@ -292,6 +292,10 @@ bool NVGLCounters::HasCounter(GPUCounter counterID) const { return counterID == GPUCounter::FirstNvidia; } + if(!m_Impl->CounterEnumerator) + { + return false; + } return m_Impl->CounterEnumerator->HasCounter(counterID); } diff --git a/renderdoc/driver/ihv/nv/nv_vk_counters.cpp b/renderdoc/driver/ihv/nv/nv_vk_counters.cpp index 83b0f577f..da00d40e0 100644 --- a/renderdoc/driver/ihv/nv/nv_vk_counters.cpp +++ b/renderdoc/driver/ihv/nv/nv_vk_counters.cpp @@ -282,6 +282,10 @@ bool NVVulkanCounters::HasCounter(GPUCounter counterID) const { return counterID == GPUCounter::FirstNvidia; } + if(!m_Impl->CounterEnumerator) + { + return false; + } return m_Impl->CounterEnumerator->HasCounter(counterID); }