Tidy up logging of unknown interface queries

This commit is contained in:
baldurk
2020-10-30 16:49:57 +00:00
parent 8548892939
commit 41c57c0b68
14 changed files with 85 additions and 119 deletions
+2 -5
View File
@@ -1526,12 +1526,9 @@ HRESULT STDMETHODCALLTYPE WrappedID3D11DeviceContext::QueryInterface(REFIID riid
{
return m_WrappedVideo.QueryInterface(riid, ppvObject);
}
else
{
WarnUnknownGUID("ID3D11DeviceContext", riid);
}
return RefCountDXGIObject::WrapQueryInterface(m_pRealContext, riid, ppvObject);
return RefCountDXGIObject::WrapQueryInterface(m_pRealContext, "ID3D11DeviceContext", riid,
ppvObject);
}
#pragma region Record Statistics
+1 -3
View File
@@ -795,9 +795,7 @@ HRESULT WrappedID3D11Device::QueryInterface(REFIID riid, void **ppvObject)
return m_WrappedVideo.QueryInterface(riid, ppvObject);
}
WarnUnknownGUID("ID3D11Device", riid);
return RefCountDXGIObject::WrapQueryInterface(m_pDevice, riid, ppvObject);
return RefCountDXGIObject::WrapQueryInterface(m_pDevice, "ID3D11Device", riid, ppvObject);
}
rdcstr WrappedID3D11Device::GetChunkName(uint32_t idx)
+2 -1
View File
@@ -82,7 +82,8 @@ void D3D11Replay::Shutdown()
void D3D11Replay::CreateResources(IDXGIFactory *factory)
{
bool wrapped = RefCountDXGIObject::HandleWrap(__uuidof(IDXGIFactory), (void **)&factory);
bool wrapped =
RefCountDXGIObject::HandleWrap("D3D11Replay", __uuidof(IDXGIFactory), (void **)&factory);
RDCASSERT(wrapped);
m_pFactory = factory;
+1 -1
View File
@@ -316,7 +316,7 @@ public:
return S_OK;
}
return RefCountDXGIObject::WrapQueryInterface(m_pReal, riid, ppvObject);
return RefCountDXGIObject::WrapQueryInterface(m_pReal, "ID3D11DeviceChild", riid, ppvObject);
}
//////////////////////////////
+1 -1
View File
@@ -1452,7 +1452,7 @@ Wrapped11VideoDeviceChild<NestedType, NestedType1>::QueryInterface(REFIID riid,
return m_pDevice->QueryInterface(riid, ppvObject);
}
return RefCountDXGIObject::WrapQueryInterface(m_pReal, riid, ppvObject);
return RefCountDXGIObject::WrapQueryInterface(m_pReal, "ID3D11Video", riid, ppvObject);
}
template <typename NestedType, typename NestedType1>
+2 -10
View File
@@ -525,12 +525,8 @@ HRESULT STDMETHODCALLTYPE WrappedID3D12CommandQueue::QueryInterface(REFIID riid,
return E_NOINTERFACE;
}
}
else
{
WarnUnknownGUID("ID3D12CommandQueue", riid);
}
return RefCounter12::QueryInterface(riid, ppvObject);
return RefCounter12::QueryInterface("ID3D12CommandQueue", riid, ppvObject);
}
void WrappedID3D12CommandQueue::ClearAfterCapture()
@@ -1372,12 +1368,8 @@ HRESULT STDMETHODCALLTYPE WrappedID3D12GraphicsCommandList::QueryInterface(REFII
AddRef();
return S_OK;
}
else
{
WarnUnknownGUID("ID3D12GraphicsCommandList", riid);
}
return m_RefCounter.QueryInterface(riid, ppvObject);
return m_RefCounter.QueryInterface("ID3D12GraphicsCommandList", riid, ppvObject);
}
void BakedCmdListInfo::ShiftForRemoved(uint32_t shiftDrawID, uint32_t shiftEID, size_t idx)
+6 -1
View File
@@ -179,11 +179,16 @@ public:
//////////////////////////////
// implement IUnknown
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject)
{
return QueryInterface("ID3D12Object", riid, ppvObject);
}
HRESULT STDMETHODCALLTYPE QueryInterface(const char *ifaceName, REFIID riid, void **ppvObject)
{
if(!m_pReal)
return E_NOINTERFACE;
return RefCountDXGIObject::WrapQueryInterface(m_pReal, riid, ppvObject);
return RefCountDXGIObject::WrapQueryInterface(m_pReal, ifaceName, riid, ppvObject);
}
ULONG STDMETHODCALLTYPE AddRef()
+17 -3
View File
@@ -805,6 +805,11 @@ HRESULT WrappedID3D12Device::QueryInterface(REFIID riid, void **ppvObject)
static const GUID ID3D12CompatibilityDevice_uuid = {
0x8f1c0e3c, 0xfae3, 0x4a82, {0xb0, 0x98, 0xbf, 0xe1, 0x70, 0x82, 0x07, 0xff}};
// unknown/undocumented internal interface
// {de18ef3a-0x2089-0x4936-0xa3 0xf3- 0xec 0x78 0x7a 0xc6 0xa4 0x0d}
static const GUID ID3D12DeviceDriverDetails_RS5_uuid = {
0xde18ef3a, 0x2089, 0x4936, {0xa3, 0xf3, 0xec, 0x78, 0x7a, 0xc6, 0xa4, 0x0d}};
HRESULT hr = S_OK;
if(riid == __uuidof(IUnknown))
@@ -1160,12 +1165,21 @@ HRESULT WrappedID3D12Device::QueryInterface(REFIID riid, void **ppvObject)
return E_NOINTERFACE;
}
}
else
else if(riid == ID3D12DeviceDriverDetails_RS5_uuid)
{
WarnUnknownGUID("ID3D12Device", riid);
static bool printed = false;
if(!printed)
{
RDCWARN(
"Querying ID3D12Device for unsupported/undocumented interface: "
"ID3D12DeviceDriverDetails_RS5");
printed = true;
}
// return the real thing unwrapped and hope this is OK
return m_pDevice->QueryInterface(riid, ppvObject);
}
return m_RefCounter.QueryInterface(riid, ppvObject);
return m_RefCounter.QueryInterface("ID3D12Device", riid, ppvObject);
}
ID3D12Resource *WrappedID3D12Device::GetUploadBuffer(uint64_t chunkOffset, uint64_t byteSize)
+1 -1
View File
@@ -76,7 +76,7 @@ void D3D12Replay::Initialise(IDXGIFactory1 *factory)
if(m_pFactory)
{
RefCountDXGIObject::HandleWrap(__uuidof(IDXGIFactory1), (void **)&m_pFactory);
RefCountDXGIObject::HandleWrap("D3D12Replay", __uuidof(IDXGIFactory1), (void **)&m_pFactory);
LUID luid = m_pDevice->GetAdapterLuid();
+1 -1
View File
@@ -258,7 +258,7 @@ public:
return S_OK;
}
return RefCounter12::QueryInterface(riid, ppvObject);
return RefCounter12::QueryInterface("ID3D12DeviceChild", riid, ppvObject);
}
//////////////////////////////
+18 -2
View File
@@ -1619,6 +1619,22 @@ D3D_PRIMITIVE_TOPOLOGY MakeD3DPrimitiveTopology(Topology Topo)
void WarnUnknownGUID(const char *name, REFIID riid)
{
// unknown/undocumented internal interface
// {7abb6563-02bc-47c4-8ef9-acc4795edbcf}
static const GUID IDXGIAdapterInternal2_uuid = {
0x7abb6563, 0x02bc, 0x47c4, {0x8e, 0xf9, 0xac, 0xc4, 0x79, 0x5e, 0xdb, 0xcf}};
if(riid == IDXGIAdapterInternal2_uuid)
{
static bool printed = false;
if(!printed)
{
printed = true;
RDCWARN("Querying %s for unsupported/undocumented interface: IDXGIAdapterInternal2", name);
}
return;
}
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).
@@ -1635,12 +1651,12 @@ void WarnUnknownGUID(const char *name, REFIID riid)
if(w.second > 5)
return;
RDCWARN("Querying %s for interface: %s", name, ToStr(riid).c_str());
RDCWARN("Querying %s for unknown/unhandled interface: %s", name, ToStr(riid).c_str());
return;
}
}
RDCWARN("Querying %s for interface: %s", name, ToStr(riid).c_str());
RDCWARN("Querying %s for unknown/unhandled interface: %s", name, ToStr(riid).c_str());
warned.push_back(make_rdcpair(riid, 1));
}
}
+3 -3
View File
@@ -277,7 +277,7 @@ private:
HRESULT ret = dxgihooks.CreateDXGIFactory()(riid, ppFactory);
if(SUCCEEDED(ret))
RefCountDXGIObject::HandleWrap(riid, ppFactory);
RefCountDXGIObject::HandleWrap("CreateDXGIFactory", riid, ppFactory);
return ret;
}
@@ -289,7 +289,7 @@ private:
HRESULT ret = dxgihooks.CreateDXGIFactory1()(riid, ppFactory);
if(SUCCEEDED(ret))
RefCountDXGIObject::HandleWrap(riid, ppFactory);
RefCountDXGIObject::HandleWrap("CreateDXGIFactory1", riid, ppFactory);
return ret;
}
@@ -301,7 +301,7 @@ private:
HRESULT ret = dxgihooks.CreateDXGIFactory2()(Flags, riid, ppFactory);
if(SUCCEEDED(ret))
RefCountDXGIObject::HandleWrap(riid, ppFactory);
RefCountDXGIObject::HandleWrap("CreateDXGIFactory2", riid, ppFactory);
return ret;
}
+18 -58
View File
@@ -48,11 +48,11 @@ ID3DDevice *GetD3DDevice(IUnknown *pDevice)
return wrapDevice;
}
bool RefCountDXGIObject::HandleWrap(REFIID riid, void **ppvObject)
bool RefCountDXGIObject::HandleWrap(const char *ifaceName, REFIID riid, void **ppvObject)
{
if(ppvObject == NULL || *ppvObject == NULL)
{
RDCWARN("HandleWrap called with NULL ppvObject");
RDCWARN("HandleWrap called with NULL ppvObject querying %s", ifaceName);
return false;
}
@@ -66,15 +66,10 @@ bool RefCountDXGIObject::HandleWrap(REFIID riid, void **ppvObject)
static const GUID ID3D10Texture2D_uuid = {
0x9b7e4c04, 0x342c, 0x4106, {0xa1, 0x9f, 0x4f, 0x27, 0x04, 0xf6, 0x89, 0xf0}};
// unknown/undocumented internal interface
// {7abb6563-02bc-47c4-8ef9-acc4795edbcf}
static const GUID IDXGIAdapterInternal2_uuid = {
0x7abb6563, 0x02bc, 0x47c4, {0x8e, 0xf9, 0xac, 0xc4, 0x79, 0x5e, 0xdb, 0xcf}};
if(riid == __uuidof(IDXGIDevice))
{
// should have been handled elsewhere, so we can properly create this device
RDCERR("Unexpected uuid in RefCountDXGIObject::HandleWrap");
RDCERR("Unexpected uuid in RefCountDXGIObject::HandleWrap querying %s", ifaceName);
return false;
}
else if(riid == __uuidof(IDXGIAdapter))
@@ -122,7 +117,7 @@ bool RefCountDXGIObject::HandleWrap(REFIID riid, void **ppvObject)
else if(riid == __uuidof(IDXGIDevice1))
{
// should have been handled elsewhere, so we can properly create this device
RDCERR("Unexpected uuid in RefCountDXGIObject::HandleWrap");
RDCERR("Unexpected uuid in RefCountDXGIObject::HandleWrap querying %s", ifaceName);
return false;
}
else if(riid == __uuidof(IDXGIFactory1))
@@ -173,19 +168,7 @@ bool RefCountDXGIObject::HandleWrap(REFIID riid, void **ppvObject)
if(!printed)
{
printed = true;
RDCWARN("Querying IDXGIObject for unsupported D3D10 interface: %s", ToStr(riid).c_str());
}
return false;
}
else if(riid == IDXGIAdapterInternal2_uuid)
{
static bool printed = false;
if(!printed)
{
printed = true;
RDCWARN(
"Querying IDXGIObject for unsupported/undocumented IDXGIAdapterInternal2 interface: %s",
ToStr(riid).c_str());
RDCWARN("Querying %s for unsupported D3D10 interface: %s", ifaceName, ToStr(riid).c_str());
}
return false;
}
@@ -195,12 +178,12 @@ bool RefCountDXGIObject::HandleWrap(REFIID riid, void **ppvObject)
if(!printed)
{
printed = true;
RDCWARN("Querying IDXGIObject for unknown GUID: %s", ToStr(riid).c_str());
RDCWARN("Querying %s for unknown GUID: %s", ifaceName, ToStr(riid).c_str());
}
}
else
{
WarnUnknownGUID("IDXGIObject", riid);
WarnUnknownGUID(ifaceName, riid);
}
return false;
@@ -213,17 +196,18 @@ HRESULT STDMETHODCALLTYPE RefCountDXGIObject::GetParent(
HRESULT ret = m_pReal->GetParent(riid, ppParent);
if(SUCCEEDED(ret))
HandleWrap(riid, ppParent);
HandleWrap("GetParent", riid, ppParent);
return ret;
}
HRESULT RefCountDXGIObject::WrapQueryInterface(IUnknown *real, REFIID riid, void **ppvObject)
HRESULT RefCountDXGIObject::WrapQueryInterface(IUnknown *real, const char *ifaceName, REFIID riid,
void **ppvObject)
{
HRESULT ret = real->QueryInterface(riid, ppvObject);
if(SUCCEEDED(ret))
HandleWrap(riid, ppvObject);
HandleWrap(ifaceName, riid, ppvObject);
return ret;
}
@@ -344,12 +328,8 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGISwapChain4::QueryInterface(REFIID riid, vo
return E_NOINTERFACE;
}
}
else
{
WarnUnknownGUID("IDXGISwapChain", riid);
}
return RefCountDXGIObject::QueryInterface(riid, ppvObject);
return RefCountDXGIObject::QueryInterface("IDXGISwapChain", riid, ppvObject);
}
void WrappedIDXGISwapChain4::ReleaseBuffersForResize(UINT QueueCount, IUnknown *const *ppPresentQueue,
@@ -566,7 +546,7 @@ HRESULT WrappedIDXGISwapChain4::GetDevice(
*ppDevice = this;
AddRef();
}
else if(!HandleWrap(riid, ppDevice))
else if(!HandleWrap("GetDevice", riid, ppDevice))
{
// can probably get away with returning the real result here,
// but it worries me a bit.
@@ -857,12 +837,8 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGIOutput6::QueryInterface(REFIID riid, void
return E_NOINTERFACE;
}
}
else
{
WarnUnknownGUID("IDXGIOutput", riid);
}
return RefCountDXGIObject::QueryInterface(riid, ppvObject);
return RefCountDXGIObject::QueryInterface("IDXGIOutput", riid, ppvObject);
}
WrappedIDXGIAdapter4::WrappedIDXGIAdapter4(IDXGIAdapter *real)
@@ -947,12 +923,8 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGIAdapter4::QueryInterface(REFIID riid, void
return E_NOINTERFACE;
}
}
else
{
WarnUnknownGUID("IDXGIAdapter", riid);
}
return RefCountDXGIObject::QueryInterface(riid, ppvObject);
return RefCountDXGIObject::QueryInterface("IDXGIAdapter", riid, ppvObject);
}
WrappedIDXGIDevice4::WrappedIDXGIDevice4(IDXGIDevice *real, ID3DDevice *d3d)
@@ -1051,12 +1023,8 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGIDevice4::QueryInterface(REFIID riid, void
return E_NOINTERFACE;
}
}
else
{
WarnUnknownGUID("IDXGIDevice", riid);
}
return RefCountDXGIObject::QueryInterface(riid, ppvObject);
return RefCountDXGIObject::QueryInterface("IDXGIDevice", riid, ppvObject);
}
rdcarray<IDXGIResource *> UnwrapResourceSet(UINT NumResources, IDXGIResource *const *ppResources)
@@ -1259,12 +1227,8 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGIFactory::QueryInterface(REFIID riid, void
RDCWARN("Blocking QueryInterface for IDXGIFactoryDWM8");
return E_NOINTERFACE;
}
else
{
WarnUnknownGUID("IDXGIFactory", riid);
}
return RefCountDXGIObject::QueryInterface(riid, ppvObject);
return RefCountDXGIObject::QueryInterface("IDXGIFactory", riid, ppvObject);
}
HRESULT WrappedIDXGIFactory::CreateSwapChain(IUnknown *pDevice, DXGI_SWAP_CHAIN_DESC *pDesc,
@@ -1488,10 +1452,6 @@ HRESULT STDMETHODCALLTYPE WrappedIDXGIOutputDuplication::QueryInterface(REFIID r
*ppvObject = (IDXGIOutputDuplication *)this;
return S_OK;
}
else
{
WarnUnknownGUID("IDXGIOutputDuplication", riid);
}
return RefCountDXGIObject::QueryInterface(riid, ppvObject);
return RefCountDXGIObject::QueryInterface("IDXGIOutputDuplication", riid, ppvObject);
}
+12 -29
View File
@@ -48,8 +48,9 @@ class RefCountDXGIObject : public IDXGIObject
public:
RefCountDXGIObject(IDXGIObject *real) : m_pReal(real), m_iRefcount(1) {}
virtual ~RefCountDXGIObject() {}
static bool HandleWrap(REFIID riid, void **ppvObject);
static HRESULT WrapQueryInterface(IUnknown *real, REFIID riid, void **ppvObject);
static bool HandleWrap(const char *ifaceName, REFIID riid, void **ppvObject);
static HRESULT WrapQueryInterface(IUnknown *real, const char *ifaceName, REFIID riid,
void **ppvObject);
//////////////////////////////
// implement IUnknown
@@ -57,6 +58,13 @@ public:
/* [in] */ REFIID riid,
/* [annotation][iid_is][out] */
__RPC__deref_out void **ppvObject)
{
return QueryInterface("IUnknown", riid, ppvObject);
}
// optional overload that's useful for passing down the name of the current interface to put in
// any 'unknown interface' query logs.
HRESULT STDMETHODCALLTYPE QueryInterface(const char *ifaceName, REFIID riid, void **ppvObject)
{
if(riid == __uuidof(IUnknown))
{
@@ -65,7 +73,7 @@ public:
return S_OK;
}
return WrapQueryInterface(m_pReal, riid, ppvObject);
return WrapQueryInterface(m_pReal, ifaceName, riid, ppvObject);
}
ULONG STDMETHODCALLTYPE AddRef()
@@ -112,30 +120,6 @@ public:
/* [retval][out] */ void **ppParent);
};
#define IMPLEMENT_IDXGIOBJECT_WITH_REFCOUNTDXGIOBJECT \
ULONG STDMETHODCALLTYPE AddRef() { return RefCountDXGIObject::AddRef(); } \
ULONG STDMETHODCALLTYPE Release() { return RefCountDXGIObject::Release(); } \
HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject) \
{ \
return RefCountDXGIObject::QueryInterface(riid, ppvObject); \
} \
HRESULT STDMETHODCALLTYPE SetPrivateData(REFIID Name, UINT DataSize, const void *pData) \
{ \
return RefCountDXGIObject::SetPrivateData(Name, DataSize, pData); \
} \
HRESULT STDMETHODCALLTYPE SetPrivateDataInterface(REFIID Name, const IUnknown *pUnknown) \
{ \
return RefCountDXGIObject::SetPrivateDataInterface(Name, pUnknown); \
} \
HRESULT STDMETHODCALLTYPE GetPrivateData(REFIID Name, UINT *pDataSize, void *pData) \
{ \
return RefCountDXGIObject::GetPrivateData(Name, pDataSize, pData); \
} \
HRESULT STDMETHODCALLTYPE GetParent(REFIID riid, void **ppvObject) \
{ \
return RefCountDXGIObject::GetParent(riid, ppvObject); \
}
#define IMPLEMENT_IDXGIOBJECT_WITH_REFCOUNTDXGIOBJECT_CUSTOMQUERY \
ULONG STDMETHODCALLTYPE AddRef() { return RefCountDXGIObject::AddRef(); } \
ULONG STDMETHODCALLTYPE Release() { return RefCountDXGIObject::Release(); } \
@@ -1692,8 +1676,7 @@ public:
}
else
{
RDCWARN("Wrapping unknown adapter GUID %s", ToStr(riid).c_str());
RefCountDXGIObject::HandleWrap(riid, ppvAdapter);
RefCountDXGIObject::HandleWrap("IDXGIAdapter", riid, ppvAdapter);
}
}