From ad841a034105b15b2d5095236f5232c6cf992c6d Mon Sep 17 00:00:00 2001 From: baldurk Date: Thu, 25 Jan 2018 10:36:16 +0000 Subject: [PATCH] Add a limit for warning on unknown GUID QueryInterface calls --- renderdoc/driver/d3d11/d3d11_context.cpp | 2 +- renderdoc/driver/d3d11/d3d11_device.cpp | 4 ++-- renderdoc/driver/d3d12/d3d12_commands.cpp | 6 ++--- renderdoc/driver/d3d12/d3d12_device.cpp | 8 +++---- renderdoc/driver/d3d8/d3d8_device.cpp | 3 ++- renderdoc/driver/d3d9/d3d9_device.cpp | 3 ++- renderdoc/driver/dxgi/dxgi_common.cpp | 29 +++++++++++++++++++++++ renderdoc/driver/dxgi/dxgi_common.h | 2 ++ renderdoc/driver/dxgi/dxgi_wrapped.cpp | 18 +++++--------- 9 files changed, 49 insertions(+), 26 deletions(-) diff --git a/renderdoc/driver/d3d11/d3d11_context.cpp b/renderdoc/driver/d3d11/d3d11_context.cpp index 75c177229..071bd60b5 100644 --- a/renderdoc/driver/d3d11/d3d11_context.cpp +++ b/renderdoc/driver/d3d11/d3d11_context.cpp @@ -1389,7 +1389,7 @@ HRESULT STDMETHODCALLTYPE WrappedID3D11DeviceContext::QueryInterface(REFIID riid } else { - RDCWARN("Querying ID3D11DeviceContext for interface: %s", ToStr(riid).c_str()); + WarnUnknownGUID("ID3D11DeviceContext", riid); } return RefCounter::QueryInterface(riid, ppvObject); diff --git a/renderdoc/driver/d3d11/d3d11_device.cpp b/renderdoc/driver/d3d11/d3d11_device.cpp index 690bf9990..f8aded2aa 100644 --- a/renderdoc/driver/d3d11/d3d11_device.cpp +++ b/renderdoc/driver/d3d11/d3d11_device.cpp @@ -356,7 +356,7 @@ HRESULT STDMETHODCALLTYPE WrappedID3D11Debug::QueryInterface(REFIID riid, void * return S_OK; } - RDCWARN("Querying ID3D11Debug for interface: %s", ToStr(riid).c_str()); + WarnUnknownGUID("ID3D11Debug", riid); return m_pDebug->QueryInterface(riid, ppvObject); } @@ -615,7 +615,7 @@ HRESULT WrappedID3D11Device::QueryInterface(REFIID riid, void **ppvObject) } else { - RDCWARN("Querying ID3D11Device for interface: %s", ToStr(riid).c_str()); + WarnUnknownGUID("ID3D11Device", riid); } return m_RefCounter.QueryInterface(riid, ppvObject); diff --git a/renderdoc/driver/d3d12/d3d12_commands.cpp b/renderdoc/driver/d3d12/d3d12_commands.cpp index 3613caf60..a38c728fa 100644 --- a/renderdoc/driver/d3d12/d3d12_commands.cpp +++ b/renderdoc/driver/d3d12/d3d12_commands.cpp @@ -220,8 +220,7 @@ HRESULT STDMETHODCALLTYPE WrappedID3D12CommandQueue::QueryInterface(REFIID riid, } else { - string guid = ToStr(riid); - RDCWARN("Querying ID3D12CommandQueue for interface: %s", guid.c_str()); + WarnUnknownGUID("ID3D12CommandQueue", riid); } return RefCounter12::QueryInterface(riid, ppvObject); @@ -835,8 +834,7 @@ HRESULT STDMETHODCALLTYPE WrappedID3D12GraphicsCommandList::QueryInterface(REFII } else { - string guid = ToStr(riid); - RDCWARN("Querying ID3D12GraphicsCommandList for interface: %s", guid.c_str()); + WarnUnknownGUID("ID3D12GraphicsCommandList", riid); } return RefCounter12::QueryInterface(riid, ppvObject); diff --git a/renderdoc/driver/d3d12/d3d12_device.cpp b/renderdoc/driver/d3d12/d3d12_device.cpp index f7abad992..02b6390be 100644 --- a/renderdoc/driver/d3d12/d3d12_device.cpp +++ b/renderdoc/driver/d3d12/d3d12_device.cpp @@ -84,7 +84,7 @@ HRESULT STDMETHODCALLTYPE DummyID3D12DebugDevice::QueryInterface(REFIID riid, vo return S_OK; } - RDCWARN("Querying ID3D12DebugDevice for interface: %s", ToStr(riid).c_str()); + WarnUnknownGUID("ID3D12DebugDevice", riid); return E_NOINTERFACE; } @@ -114,8 +114,7 @@ HRESULT STDMETHODCALLTYPE WrappedID3D12DebugDevice::QueryInterface(REFIID riid, return S_OK; } - string guid = ToStr(riid); - RDCWARN("Querying ID3D12DebugDevice for interface: %s", guid.c_str()); + WarnUnknownGUID("ID3D12DebugDevice", riid); return m_pDebug->QueryInterface(riid, ppvObject); } @@ -481,8 +480,7 @@ HRESULT WrappedID3D12Device::QueryInterface(REFIID riid, void **ppvObject) } else { - string guid = ToStr(riid); - RDCWARN("Querying ID3D12Device for interface: %s", guid.c_str()); + WarnUnknownGUID("ID3D12Device", riid); } return m_RefCounter.QueryInterface(riid, ppvObject); diff --git a/renderdoc/driver/d3d8/d3d8_device.cpp b/renderdoc/driver/d3d8/d3d8_device.cpp index 2817323fd..487a9d553 100644 --- a/renderdoc/driver/d3d8/d3d8_device.cpp +++ b/renderdoc/driver/d3d8/d3d8_device.cpp @@ -24,6 +24,7 @@ #include "d3d8_device.h" #include "core/core.h" +#include "driver/dxgi/dxgi_common.h" #include "serialise/serialiser.h" #include "d3d8_debug.h" #include "d3d8_resources.h" @@ -145,7 +146,7 @@ HRESULT WrappedD3DDevice8::QueryInterface(REFIID riid, void **ppvObject) } else { - RDCWARN("Querying IDirect3DDevice8 for interface: %s", ToStr(riid).c_str()); + WarnUnknownGUID("IDirect3DDevice8", riid); } return m_device->QueryInterface(riid, ppvObject); diff --git a/renderdoc/driver/d3d9/d3d9_device.cpp b/renderdoc/driver/d3d9/d3d9_device.cpp index 1edf5f0f3..b58b25710 100644 --- a/renderdoc/driver/d3d9/d3d9_device.cpp +++ b/renderdoc/driver/d3d9/d3d9_device.cpp @@ -24,6 +24,7 @@ #include "d3d9_device.h" #include "core/core.h" +#include "driver/dxgi/dxgi_common.h" #include "serialise/serialiser.h" #include "d3d9_debug.h" @@ -99,7 +100,7 @@ HRESULT WrappedD3DDevice9::QueryInterface(REFIID riid, void **ppvObject) } else { - RDCWARN("Querying IDirect3DDevice9 for interface: %s", ToStr(riid).c_str()); + WarnUnknownGUID("IDirect3DDevice9", riid); } return m_device->QueryInterface(riid, ppvObject); diff --git a/renderdoc/driver/dxgi/dxgi_common.cpp b/renderdoc/driver/dxgi/dxgi_common.cpp index 4a2bca76b..46c610b8d 100644 --- a/renderdoc/driver/dxgi/dxgi_common.cpp +++ b/renderdoc/driver/dxgi/dxgi_common.cpp @@ -24,6 +24,7 @@ #include "dxgi_common.h" #include "common/common.h" +#include "common/threading.h" #include "serialise/serialiser.h" UINT GetFormatBPP(DXGI_FORMAT f) @@ -1338,6 +1339,34 @@ D3D_PRIMITIVE_TOPOLOGY MakeD3DPrimitiveTopology(Topology Topo) return D3D_PRIMITIVE_TOPOLOGY_UNDEFINED; } +void WarnUnknownGUID(const char *name, REFIID riid) +{ + static Threading::CriticalSection lock; + // we use a vector here, because the number of *distinct* unknown GUIDs encountered is likely to + // be low (e.g. less than 10). + static std::vector > warned; + + { + SCOPED_LOCK(lock); + + for(std::pair &w : warned) + { + if(w.first == riid) + { + w.second++; + if(w.second > 5) + return; + + RDCWARN("Querying %s for interface: %s", name, ToStr(riid).c_str()); + return; + } + } + + RDCWARN("Querying %s for interface: %s", name, ToStr(riid).c_str()); + warned.push_back(std::make_pair(riid, 1)); + } +} + Topology MakePrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY Topo) { switch(Topo) diff --git a/renderdoc/driver/dxgi/dxgi_common.h b/renderdoc/driver/dxgi/dxgi_common.h index 8ab40ec82..dac3f5d7c 100644 --- a/renderdoc/driver/dxgi/dxgi_common.h +++ b/renderdoc/driver/dxgi/dxgi_common.h @@ -61,6 +61,8 @@ bool IsYUVFormat(DXGI_FORMAT f); Topology MakePrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY Topo); D3D_PRIMITIVE_TOPOLOGY MakeD3DPrimitiveTopology(Topology Topo); +void WarnUnknownGUID(const char *name, REFIID riid); + DECLARE_REFLECTION_STRUCT(DXGI_SAMPLE_DESC); DECLARE_REFLECTION_STRUCT(IID); DECLARE_REFLECTION_ENUM(DXGI_FORMAT); diff --git a/renderdoc/driver/dxgi/dxgi_wrapped.cpp b/renderdoc/driver/dxgi/dxgi_wrapped.cpp index d20b362e1..79652837d 100644 --- a/renderdoc/driver/dxgi/dxgi_wrapped.cpp +++ b/renderdoc/driver/dxgi/dxgi_wrapped.cpp @@ -163,8 +163,7 @@ bool RefCountDXGIObject::HandleWrap(REFIID riid, void **ppvObject) } else { - string guid = ToStr(riid); - RDCWARN("Querying IDXGIObject for interface: %s", guid.c_str()); + WarnUnknownGUID("IDXGIObject", riid); } return false; @@ -291,8 +290,7 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGISwapChain4::QueryInterface(REFIID riid, vo } else { - string guid = ToStr(riid); - RDCWARN("Querying IDXGISwapChain for interface: %s", guid.c_str()); + WarnUnknownGUID("IDXGISwapChain", riid); } return RefCountDXGIObject::QueryInterface(riid, ppvObject); @@ -652,8 +650,7 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGIOutput5::QueryInterface(REFIID riid, void } else { - string guid = ToStr(riid); - RDCWARN("Querying IDXGIOutput for interface: %s", guid.c_str()); + WarnUnknownGUID("IDXGIOutput", riid); } return RefCountDXGIObject::QueryInterface(riid, ppvObject); @@ -727,8 +724,7 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGIAdapter3::QueryInterface(REFIID riid, void } else { - string guid = ToStr(riid); - RDCWARN("Querying IDXGIAdapter for interface: %s", guid.c_str()); + WarnUnknownGUID("IDXGIAdapter", riid); } return RefCountDXGIObject::QueryInterface(riid, ppvObject); @@ -827,8 +823,7 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGIDevice4::QueryInterface(REFIID riid, void } else { - string guid = ToStr(riid); - RDCWARN("Querying IDXGIDevice for interface: %s", guid.c_str()); + WarnUnknownGUID("IDXGIDevice", riid); } return RefCountDXGIObject::QueryInterface(riid, ppvObject); @@ -934,8 +929,7 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGIFactory5::QueryInterface(REFIID riid, void } else { - string guid = ToStr(riid); - RDCWARN("Querying IDXGIFactory for interface: %s", guid.c_str()); + WarnUnknownGUID("IDXGIFactory", riid); } return RefCountDXGIObject::QueryInterface(riid, ppvObject);