From a0f20713f47c79b751526cd11ca6c0aa0260c22b Mon Sep 17 00:00:00 2001 From: baldurk Date: Mon, 11 Apr 2016 23:14:24 +0200 Subject: [PATCH] Add checks for QueryInterface(IUnknown) to return 'this'. Refs #238 --- renderdoc/driver/d3d11/d3d11_context.cpp | 8 +++++++- renderdoc/driver/d3d11/d3d11_device.cpp | 15 ++++++++++++++- renderdoc/driver/d3d11/d3d11_resources.h | 14 +++++++++++++- renderdoc/driver/dxgi/dxgi_wrapped.h | 11 ++++++++++- 4 files changed, 44 insertions(+), 4 deletions(-) diff --git a/renderdoc/driver/d3d11/d3d11_context.cpp b/renderdoc/driver/d3d11/d3d11_context.cpp index c46f00454..4141d8ba4 100644 --- a/renderdoc/driver/d3d11/d3d11_context.cpp +++ b/renderdoc/driver/d3d11/d3d11_context.cpp @@ -1326,7 +1326,13 @@ void WrappedID3D11DeviceContext::ClearMaps() HRESULT STDMETHODCALLTYPE WrappedID3D11DeviceContext::QueryInterface( REFIID riid, void **ppvObject ) { - if(riid == __uuidof(ID3D11DeviceContext)) + if(riid == __uuidof(IUnknown)) + { + *ppvObject = (IUnknown *)(ID3D11DeviceContext *)this; + AddRef(); + return S_OK; + } + else if(riid == __uuidof(ID3D11DeviceContext)) { *ppvObject = (ID3D11DeviceContext *)this; AddRef(); diff --git a/renderdoc/driver/d3d11/d3d11_device.cpp b/renderdoc/driver/d3d11/d3d11_device.cpp index e663f2239..e9bbf07cf 100644 --- a/renderdoc/driver/d3d11/d3d11_device.cpp +++ b/renderdoc/driver/d3d11/d3d11_device.cpp @@ -490,6 +490,13 @@ HRESULT STDMETHODCALLTYPE WrappedID3D11Debug::QueryInterface(REFIID riid, void * ) return m_pDevice->QueryInterface(riid, ppvObject); + if(riid == __uuidof(IUnknown)) + { + *ppvObject = (IUnknown *)(ID3D11Debug *)this; + AddRef(); + return S_OK; + } + string guid = ToStr::Get(riid); RDCWARN("Querying ID3D11Debug for interface: %s", guid.c_str()); @@ -524,7 +531,13 @@ HRESULT WrappedID3D11Device::QueryInterface(REFIID riid, void **ppvObject) HRESULT hr = S_OK; - if(riid == __uuidof(IDXGIDevice)) + if(riid == __uuidof(IUnknown)) + { + *ppvObject = (IUnknown *)(ID3D11Device2 *)this; + AddRef(); + return S_OK; + } + else if(riid == __uuidof(IDXGIDevice)) { hr = m_pDevice->QueryInterface(riid, ppvObject); diff --git a/renderdoc/driver/d3d11/d3d11_resources.h b/renderdoc/driver/d3d11/d3d11_resources.h index d87367758..67b3b3841 100644 --- a/renderdoc/driver/d3d11/d3d11_resources.h +++ b/renderdoc/driver/d3d11/d3d11_resources.h @@ -148,7 +148,13 @@ public: { return hr; } - + + if(riid == __uuidof(IUnknown)) + { + *ppvObject = (IUnknown *)(IDXGIKeyedMutex *)this; + AddRef(); + return S_OK; + } if(riid == __uuidof(IDXGIObject)) { *ppvObject = (IDXGIObject *)(IDXGIKeyedMutex *)this; @@ -515,6 +521,12 @@ public: HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject) { + if(riid == __uuidof(IUnknown)) + { + *ppvObject = (IUnknown *)(NestedType *)this; + AddRef(); + return S_OK; + } if(riid == __uuidof(NestedType)) { *ppvObject = (NestedType *)this; diff --git a/renderdoc/driver/dxgi/dxgi_wrapped.h b/renderdoc/driver/dxgi/dxgi_wrapped.h index 91e64941b..324806f8e 100644 --- a/renderdoc/driver/dxgi/dxgi_wrapped.h +++ b/renderdoc/driver/dxgi/dxgi_wrapped.h @@ -49,7 +49,16 @@ public: /* [in] */ REFIID riid, /* [annotation][iid_is][out] */ __RPC__deref_out void **ppvObject) - { return WrapQueryInterface(m_pReal, riid, ppvObject); } + { + if(riid == __uuidof(IUnknown)) + { + AddRef(); + *ppvObject = (IUnknown *)(IDXGIObject *)this; + return S_OK; + } + + return WrapQueryInterface(m_pReal, riid, ppvObject); + } ULONG STDMETHODCALLTYPE AddRef() { return ++m_iRefcount; } ULONG STDMETHODCALLTYPE Release() { ULONG ret = --m_iRefcount; if(m_iRefcount == 0) delete this; return ret; }