From 2973c1805564bd5110db9025cbd6878273117902 Mon Sep 17 00:00:00 2001 From: Philip Rebohle Date: Mon, 2 Apr 2018 12:52:02 +0200 Subject: [PATCH] [dxgi/d3d11] Remove COM_QUERY_INTERFACE macro, reset pointers May fix some crashes in applications that rely on the returned pointer being set to nullptr before returning. --- src/d3d11/d3d11_blend.cpp | 13 +++++++---- src/d3d11/d3d11_buffer.cpp | 13 +++++++---- src/d3d11/d3d11_class_linkage.cpp | 11 ++++++--- src/d3d11/d3d11_cmdlist.cpp | 11 ++++++--- src/d3d11/d3d11_context.cpp | 17 ++++++++------ src/d3d11/d3d11_depth_stencil.cpp | 11 ++++++--- src/d3d11/d3d11_device.cpp | 2 ++ src/d3d11/d3d11_input_layout.cpp | 11 ++++++--- src/d3d11/d3d11_query.cpp | 20 +++++++++++----- src/d3d11/d3d11_rasterizer.cpp | 13 +++++++---- src/d3d11/d3d11_sampler.cpp | 11 ++++++--- src/d3d11/d3d11_shader.h | 11 ++++++--- src/d3d11/d3d11_texture.cpp | 39 +++++++++++++++++++++---------- src/d3d11/d3d11_view_dsv.cpp | 13 +++++++---- src/d3d11/d3d11_view_rtv.cpp | 13 +++++++---- src/d3d11/d3d11_view_srv.cpp | 13 +++++++---- src/d3d11/d3d11_view_uav.cpp | 13 +++++++---- src/dxgi/dxgi_adapter.cpp | 15 ++++++++---- src/dxgi/dxgi_factory.cpp | 17 ++++++++------ src/dxgi/dxgi_output.cpp | 11 ++++++--- src/dxgi/dxgi_swapchain.cpp | 13 +++++++---- src/util/com/com_object.h | 9 ------- 22 files changed, 201 insertions(+), 99 deletions(-) diff --git a/src/d3d11/d3d11_blend.cpp b/src/d3d11/d3d11_blend.cpp index c6357637..4801e696 100644 --- a/src/d3d11/d3d11_blend.cpp +++ b/src/d3d11/d3d11_blend.cpp @@ -40,10 +40,15 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11BlendState::QueryInterface(REFIID riid, void** ppvObject) { - COM_QUERY_IFACE(riid, ppvObject, IUnknown); - COM_QUERY_IFACE(riid, ppvObject, ID3D11DeviceChild); - COM_QUERY_IFACE(riid, ppvObject, ID3D11BlendState); - COM_QUERY_IFACE(riid, ppvObject, ID3D11BlendState1); + *ppvObject = nullptr; + + if (riid == __uuidof(IUnknown) + || riid == __uuidof(ID3D11DeviceChild) + || riid == __uuidof(ID3D11BlendState) + || riid == __uuidof(ID3D11BlendState1)) { + *ppvObject = ref(this); + return S_OK; + } Logger::warn("D3D11BlendState::QueryInterface: Unknown interface query"); Logger::warn(str::format(riid)); diff --git a/src/d3d11/d3d11_buffer.cpp b/src/d3d11/d3d11_buffer.cpp index 47496433..176fe1f7 100644 --- a/src/d3d11/d3d11_buffer.cpp +++ b/src/d3d11/d3d11_buffer.cpp @@ -23,10 +23,15 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11Buffer::QueryInterface(REFIID riid, void** ppvObject) { - COM_QUERY_IFACE(riid, ppvObject, IUnknown); - COM_QUERY_IFACE(riid, ppvObject, ID3D11DeviceChild); - COM_QUERY_IFACE(riid, ppvObject, ID3D11Resource); - COM_QUERY_IFACE(riid, ppvObject, ID3D11Buffer); + *ppvObject = nullptr; + + if (riid == __uuidof(IUnknown) + || riid == __uuidof(ID3D11DeviceChild) + || riid == __uuidof(ID3D11Resource) + || riid == __uuidof(ID3D11Buffer)) { + *ppvObject = ref(this); + return S_OK; + } Logger::warn("D3D11Buffer::QueryInterface: Unknown interface query"); Logger::warn(str::format(riid)); diff --git a/src/d3d11/d3d11_class_linkage.cpp b/src/d3d11/d3d11_class_linkage.cpp index b45327ed..563fd01b 100644 --- a/src/d3d11/d3d11_class_linkage.cpp +++ b/src/d3d11/d3d11_class_linkage.cpp @@ -16,9 +16,14 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11ClassLinkage::QueryInterface(REFIID riid, void** ppvObject) { - COM_QUERY_IFACE(riid, ppvObject, IUnknown); - COM_QUERY_IFACE(riid, ppvObject, ID3D11DeviceChild); - COM_QUERY_IFACE(riid, ppvObject, ID3D11ClassLinkage); + *ppvObject = nullptr; + + if (riid == __uuidof(IUnknown) + || riid == __uuidof(ID3D11DeviceChild) + || riid == __uuidof(ID3D11ClassLinkage)) { + *ppvObject = ref(this); + return S_OK; + } Logger::warn("D3D11ClassLinkage::QueryInterface: Unknown interface query"); Logger::warn(str::format(riid)); diff --git a/src/d3d11/d3d11_cmdlist.cpp b/src/d3d11/d3d11_cmdlist.cpp index ed43b8d9..c4e12eae 100644 --- a/src/d3d11/d3d11_cmdlist.cpp +++ b/src/d3d11/d3d11_cmdlist.cpp @@ -16,9 +16,14 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11CommandList::QueryInterface(REFIID riid, void** ppvObject) { - COM_QUERY_IFACE(riid, ppvObject, IUnknown); - COM_QUERY_IFACE(riid, ppvObject, ID3D11DeviceChild); - COM_QUERY_IFACE(riid, ppvObject, ID3D11CommandList); + *ppvObject = nullptr; + + if (riid == __uuidof(IUnknown) + || riid == __uuidof(ID3D11DeviceChild) + || riid == __uuidof(ID3D11CommandList)) { + *ppvObject = ref(this); + return S_OK; + } Logger::warn("D3D11CommandList::QueryInterface: Unknown interface query"); Logger::warn(str::format(riid)); diff --git a/src/d3d11/d3d11_context.cpp b/src/d3d11/d3d11_context.cpp index 1d9f3100..7ca12393 100644 --- a/src/d3d11/d3d11_context.cpp +++ b/src/d3d11/d3d11_context.cpp @@ -39,13 +39,16 @@ namespace dxvk { } - HRESULT STDMETHODCALLTYPE D3D11DeviceContext::QueryInterface( - REFIID riid, - void** ppvObject) { - COM_QUERY_IFACE(riid, ppvObject, IUnknown); - COM_QUERY_IFACE(riid, ppvObject, ID3D11DeviceChild); - COM_QUERY_IFACE(riid, ppvObject, ID3D11DeviceContext); - COM_QUERY_IFACE(riid, ppvObject, ID3D11DeviceContext1); + HRESULT STDMETHODCALLTYPE D3D11DeviceContext::QueryInterface(REFIID riid, void** ppvObject) { + *ppvObject = nullptr; + + if (riid == __uuidof(IUnknown) + || riid == __uuidof(ID3D11DeviceChild) + || riid == __uuidof(ID3D11DeviceContext) + || riid == __uuidof(ID3D11DeviceContext1)) { + *ppvObject = ref(this); + return S_OK; + } if (riid == __uuidof(ID3DUserDefinedAnnotation)) return E_NOINTERFACE; diff --git a/src/d3d11/d3d11_depth_stencil.cpp b/src/d3d11/d3d11_depth_stencil.cpp index 66886166..87add538 100644 --- a/src/d3d11/d3d11_depth_stencil.cpp +++ b/src/d3d11/d3d11_depth_stencil.cpp @@ -25,9 +25,14 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11DepthStencilState::QueryInterface(REFIID riid, void** ppvObject) { - COM_QUERY_IFACE(riid, ppvObject, IUnknown); - COM_QUERY_IFACE(riid, ppvObject, ID3D11DeviceChild); - COM_QUERY_IFACE(riid, ppvObject, ID3D11DepthStencilState); + *ppvObject = nullptr; + + if (riid == __uuidof(IUnknown) + || riid == __uuidof(ID3D11DeviceChild) + || riid == __uuidof(ID3D11DepthStencilState)) { + *ppvObject = ref(this); + return S_OK; + } Logger::warn("D3D11DepthStencilState::QueryInterface: Unknown interface query"); Logger::warn(str::format(riid)); diff --git a/src/d3d11/d3d11_device.cpp b/src/d3d11/d3d11_device.cpp index 84350db8..82116d95 100644 --- a/src/d3d11/d3d11_device.cpp +++ b/src/d3d11/d3d11_device.cpp @@ -28,6 +28,8 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11DeviceContainer::QueryInterface(REFIID riid, void** ppvObject) { + *ppvObject = nullptr; + if (riid == __uuidof(IUnknown) || riid == __uuidof(IDXGIObject)) { *ppvObject = ref(this); diff --git a/src/d3d11/d3d11_input_layout.cpp b/src/d3d11/d3d11_input_layout.cpp index 17c0491c..a19aa915 100644 --- a/src/d3d11/d3d11_input_layout.cpp +++ b/src/d3d11/d3d11_input_layout.cpp @@ -27,9 +27,14 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11InputLayout::QueryInterface(REFIID riid, void** ppvObject) { - COM_QUERY_IFACE(riid, ppvObject, IUnknown); - COM_QUERY_IFACE(riid, ppvObject, ID3D11DeviceChild); - COM_QUERY_IFACE(riid, ppvObject, ID3D11InputLayout); + *ppvObject = nullptr; + + if (riid == __uuidof(IUnknown) + || riid == __uuidof(ID3D11DeviceChild) + || riid == __uuidof(ID3D11InputLayout)) { + *ppvObject = ref(this); + return S_OK; + } Logger::warn("D3D11InputLayout::QueryInterface: Unknown interface query"); Logger::warn(str::format(riid)); diff --git a/src/d3d11/d3d11_query.cpp b/src/d3d11/d3d11_query.cpp index 1bbe5610..9a51e3bf 100644 --- a/src/d3d11/d3d11_query.cpp +++ b/src/d3d11/d3d11_query.cpp @@ -48,13 +48,21 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11Query::QueryInterface(REFIID riid, void** ppvObject) { - COM_QUERY_IFACE(riid, ppvObject, IUnknown); - COM_QUERY_IFACE(riid, ppvObject, ID3D11DeviceChild); - COM_QUERY_IFACE(riid, ppvObject, ID3D11Asynchronous); - COM_QUERY_IFACE(riid, ppvObject, ID3D11Query); + *ppvObject = nullptr; - if (m_desc.Query == D3D11_QUERY_OCCLUSION_PREDICATE) - COM_QUERY_IFACE(riid, ppvObject, ID3D11Predicate); + if (riid == __uuidof(IUnknown) + || riid == __uuidof(ID3D11DeviceChild) + || riid == __uuidof(ID3D11Asynchronous) + || riid == __uuidof(ID3D11Query)) { + *ppvObject = ref(this); + return S_OK; + } + + if (riid == __uuidof(ID3D11Predicate) + && m_desc.Query == D3D11_QUERY_OCCLUSION_PREDICATE) { + *ppvObject = ref(this); + return S_OK; + } Logger::warn("D3D11Query: Unknown interface query"); Logger::warn(str::format(riid)); diff --git a/src/d3d11/d3d11_rasterizer.cpp b/src/d3d11/d3d11_rasterizer.cpp index 733317dd..2cc5e542 100644 --- a/src/d3d11/d3d11_rasterizer.cpp +++ b/src/d3d11/d3d11_rasterizer.cpp @@ -69,10 +69,15 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11RasterizerState::QueryInterface(REFIID riid, void** ppvObject) { - COM_QUERY_IFACE(riid, ppvObject, IUnknown); - COM_QUERY_IFACE(riid, ppvObject, ID3D11DeviceChild); - COM_QUERY_IFACE(riid, ppvObject, ID3D11RasterizerState); - COM_QUERY_IFACE(riid, ppvObject, ID3D11RasterizerState1); + *ppvObject = nullptr; + + if (riid == __uuidof(IUnknown) + || riid == __uuidof(ID3D11DeviceChild) + || riid == __uuidof(ID3D11RasterizerState) + || riid == __uuidof(ID3D11RasterizerState1)) { + *ppvObject = ref(this); + return S_OK; + } Logger::warn("D3D11RasterizerState::QueryInterface: Unknown interface query"); Logger::warn(str::format(riid)); diff --git a/src/d3d11/d3d11_sampler.cpp b/src/d3d11/d3d11_sampler.cpp index b74f0b2b..cf0fce54 100644 --- a/src/d3d11/d3d11_sampler.cpp +++ b/src/d3d11/d3d11_sampler.cpp @@ -53,9 +53,14 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11SamplerState::QueryInterface(REFIID riid, void** ppvObject) { - COM_QUERY_IFACE(riid, ppvObject, IUnknown); - COM_QUERY_IFACE(riid, ppvObject, ID3D11DeviceChild); - COM_QUERY_IFACE(riid, ppvObject, ID3D11SamplerState); + *ppvObject = nullptr; + + if (riid == __uuidof(IUnknown) + || riid == __uuidof(ID3D11DeviceChild) + || riid == __uuidof(ID3D11SamplerState)) { + *ppvObject = ref(this); + return S_OK; + } Logger::warn("D3D11SamplerState::QueryInterface: Unknown interface query"); Logger::warn(str::format(riid)); diff --git a/src/d3d11/d3d11_shader.h b/src/d3d11/d3d11_shader.h index 0882582e..c3c1bd40 100644 --- a/src/d3d11/d3d11_shader.h +++ b/src/d3d11/d3d11_shader.h @@ -73,9 +73,14 @@ namespace dxvk { ~D3D11Shader() { } HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void** ppvObject) final { - COM_QUERY_IFACE(riid, ppvObject, IUnknown); - COM_QUERY_IFACE(riid, ppvObject, ID3D11DeviceChild); - COM_QUERY_IFACE(riid, ppvObject, Base); + *ppvObject = nullptr; + + if (riid == __uuidof(IUnknown) + || riid == __uuidof(ID3D11DeviceChild) + || riid == __uuidof(Base)) { + *ppvObject = ref(this); + return S_OK; + } Logger::warn("D3D11Shader::QueryInterface: Unknown interface query"); return E_NOINTERFACE; diff --git a/src/d3d11/d3d11_texture.cpp b/src/d3d11/d3d11_texture.cpp index a0f76ef0..ff19c352 100644 --- a/src/d3d11/d3d11_texture.cpp +++ b/src/d3d11/d3d11_texture.cpp @@ -295,10 +295,15 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11Texture1D::QueryInterface(REFIID riid, void** ppvObject) { - COM_QUERY_IFACE(riid, ppvObject, IUnknown); - COM_QUERY_IFACE(riid, ppvObject, ID3D11DeviceChild); - COM_QUERY_IFACE(riid, ppvObject, ID3D11Resource); - COM_QUERY_IFACE(riid, ppvObject, ID3D11Texture1D); + *ppvObject = nullptr; + + if (riid == __uuidof(IUnknown) + || riid == __uuidof(ID3D11DeviceChild) + || riid == __uuidof(ID3D11Resource) + || riid == __uuidof(ID3D11Texture1D)) { + *ppvObject = ref(this); + return S_OK; + } Logger::warn("D3D11Texture1D::QueryInterface: Unknown interface query"); Logger::warn(str::format(riid)); @@ -355,10 +360,15 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11Texture2D::QueryInterface(REFIID riid, void** ppvObject) { - COM_QUERY_IFACE(riid, ppvObject, IUnknown); - COM_QUERY_IFACE(riid, ppvObject, ID3D11DeviceChild); - COM_QUERY_IFACE(riid, ppvObject, ID3D11Resource); - COM_QUERY_IFACE(riid, ppvObject, ID3D11Texture2D); + *ppvObject = nullptr; + + if (riid == __uuidof(IUnknown) + || riid == __uuidof(ID3D11DeviceChild) + || riid == __uuidof(ID3D11Resource) + || riid == __uuidof(ID3D11Texture2D)) { + *ppvObject = ref(this); + return S_OK; + } Logger::warn("D3D11Texture2D::QueryInterface: Unknown interface query"); Logger::warn(str::format(riid)); @@ -417,10 +427,15 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11Texture3D::QueryInterface(REFIID riid, void** ppvObject) { - COM_QUERY_IFACE(riid, ppvObject, IUnknown); - COM_QUERY_IFACE(riid, ppvObject, ID3D11DeviceChild); - COM_QUERY_IFACE(riid, ppvObject, ID3D11Resource); - COM_QUERY_IFACE(riid, ppvObject, ID3D11Texture3D); + *ppvObject = nullptr; + + if (riid == __uuidof(IUnknown) + || riid == __uuidof(ID3D11DeviceChild) + || riid == __uuidof(ID3D11Resource) + || riid == __uuidof(ID3D11Texture3D)) { + *ppvObject = ref(this); + return S_OK; + } Logger::warn("D3D11Texture3D::QueryInterface: Unknown interface query"); Logger::warn(str::format(riid)); diff --git a/src/d3d11/d3d11_view_dsv.cpp b/src/d3d11/d3d11_view_dsv.cpp index 9e700c67..463b491e 100644 --- a/src/d3d11/d3d11_view_dsv.cpp +++ b/src/d3d11/d3d11_view_dsv.cpp @@ -20,10 +20,15 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11DepthStencilView::QueryInterface(REFIID riid, void** ppvObject) { - COM_QUERY_IFACE(riid, ppvObject, IUnknown); - COM_QUERY_IFACE(riid, ppvObject, ID3D11DeviceChild); - COM_QUERY_IFACE(riid, ppvObject, ID3D11View); - COM_QUERY_IFACE(riid, ppvObject, ID3D11DepthStencilView); + *ppvObject = nullptr; + + if (riid == __uuidof(IUnknown) + || riid == __uuidof(ID3D11DeviceChild) + || riid == __uuidof(ID3D11View) + || riid == __uuidof(ID3D11DepthStencilView)) { + *ppvObject = ref(this); + return S_OK; + } Logger::warn("D3D11DepthStencilView::QueryInterface: Unknown interface query"); Logger::warn(str::format(riid)); diff --git a/src/d3d11/d3d11_view_rtv.cpp b/src/d3d11/d3d11_view_rtv.cpp index 1b0c218b..db343c38 100644 --- a/src/d3d11/d3d11_view_rtv.cpp +++ b/src/d3d11/d3d11_view_rtv.cpp @@ -20,10 +20,15 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11RenderTargetView::QueryInterface(REFIID riid, void** ppvObject) { - COM_QUERY_IFACE(riid, ppvObject, IUnknown); - COM_QUERY_IFACE(riid, ppvObject, ID3D11DeviceChild); - COM_QUERY_IFACE(riid, ppvObject, ID3D11View); - COM_QUERY_IFACE(riid, ppvObject, ID3D11RenderTargetView); + *ppvObject = nullptr; + + if (riid == __uuidof(IUnknown) + || riid == __uuidof(ID3D11DeviceChild) + || riid == __uuidof(ID3D11View) + || riid == __uuidof(ID3D11RenderTargetView)) { + *ppvObject = ref(this); + return S_OK; + } Logger::warn("D3D11RenderTargetView::QueryInterface: Unknown interface query"); Logger::warn(str::format(riid)); diff --git a/src/d3d11/d3d11_view_srv.cpp b/src/d3d11/d3d11_view_srv.cpp index 1facb974..c6be3f18 100644 --- a/src/d3d11/d3d11_view_srv.cpp +++ b/src/d3d11/d3d11_view_srv.cpp @@ -29,10 +29,15 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11ShaderResourceView::QueryInterface(REFIID riid, void** ppvObject) { - COM_QUERY_IFACE(riid, ppvObject, IUnknown); - COM_QUERY_IFACE(riid, ppvObject, ID3D11DeviceChild); - COM_QUERY_IFACE(riid, ppvObject, ID3D11View); - COM_QUERY_IFACE(riid, ppvObject, ID3D11ShaderResourceView); + *ppvObject = nullptr; + + if (riid == __uuidof(IUnknown) + || riid == __uuidof(ID3D11DeviceChild) + || riid == __uuidof(ID3D11View) + || riid == __uuidof(ID3D11ShaderResourceView)) { + *ppvObject = ref(this); + return S_OK; + } Logger::warn("D3D11ShaderResourceView::QueryInterface: Unknown interface query"); Logger::warn(str::format(riid)); diff --git a/src/d3d11/d3d11_view_uav.cpp b/src/d3d11/d3d11_view_uav.cpp index 971da6c2..e60d555d 100644 --- a/src/d3d11/d3d11_view_uav.cpp +++ b/src/d3d11/d3d11_view_uav.cpp @@ -34,10 +34,15 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE D3D11UnorderedAccessView::QueryInterface(REFIID riid, void** ppvObject) { - COM_QUERY_IFACE(riid, ppvObject, IUnknown); - COM_QUERY_IFACE(riid, ppvObject, ID3D11DeviceChild); - COM_QUERY_IFACE(riid, ppvObject, ID3D11View); - COM_QUERY_IFACE(riid, ppvObject, ID3D11UnorderedAccessView); + *ppvObject = nullptr; + + if (riid == __uuidof(IUnknown) + || riid == __uuidof(ID3D11DeviceChild) + || riid == __uuidof(ID3D11View) + || riid == __uuidof(ID3D11UnorderedAccessView)) { + *ppvObject = ref(this); + return S_OK; + } Logger::warn("D3D11UnorderedAccessView::QueryInterface: Unknown interface query"); Logger::warn(str::format(riid)); diff --git a/src/dxgi/dxgi_adapter.cpp b/src/dxgi/dxgi_adapter.cpp index 677d8c54..9415932e 100644 --- a/src/dxgi/dxgi_adapter.cpp +++ b/src/dxgi/dxgi_adapter.cpp @@ -26,11 +26,16 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE DxgiAdapter::QueryInterface(REFIID riid, void** ppvObject) { - COM_QUERY_IFACE(riid, ppvObject, IUnknown); - COM_QUERY_IFACE(riid, ppvObject, IDXGIObject); - COM_QUERY_IFACE(riid, ppvObject, IDXGIAdapter); - COM_QUERY_IFACE(riid, ppvObject, IDXGIAdapter1); - COM_QUERY_IFACE(riid, ppvObject, IDXGIVkAdapter); + *ppvObject = nullptr; + + if (riid == __uuidof(IUnknown) + || riid == __uuidof(IDXGIObject) + || riid == __uuidof(IDXGIAdapter) + || riid == __uuidof(IDXGIAdapter1) + || riid == __uuidof(IDXGIVkAdapter)) { + *ppvObject = ref(this); + return S_OK; + } Logger::warn("DxgiAdapter::QueryInterface: Unknown interface query"); Logger::warn(str::format(riid)); diff --git a/src/dxgi/dxgi_factory.cpp b/src/dxgi/dxgi_factory.cpp index 0207ad38..a835d0f9 100644 --- a/src/dxgi/dxgi_factory.cpp +++ b/src/dxgi/dxgi_factory.cpp @@ -16,13 +16,16 @@ namespace dxvk { } - HRESULT STDMETHODCALLTYPE DxgiFactory::QueryInterface( - REFIID riid, - void** ppvObject) { - COM_QUERY_IFACE(riid, ppvObject, IUnknown); - COM_QUERY_IFACE(riid, ppvObject, IDXGIObject); - COM_QUERY_IFACE(riid, ppvObject, IDXGIFactory); - COM_QUERY_IFACE(riid, ppvObject, IDXGIFactory1); + HRESULT STDMETHODCALLTYPE DxgiFactory::QueryInterface(REFIID riid, void** ppvObject) { + *ppvObject = nullptr; + + if (riid == __uuidof(IUnknown) + || riid == __uuidof(IDXGIObject) + || riid == __uuidof(IDXGIFactory) + || riid == __uuidof(IDXGIFactory1)) { + *ppvObject = ref(this); + return S_OK; + } Logger::warn("DxgiFactory::QueryInterface: Unknown interface query"); Logger::warn(str::format(riid)); diff --git a/src/dxgi/dxgi_output.cpp b/src/dxgi/dxgi_output.cpp index a140f33d..759147a5 100644 --- a/src/dxgi/dxgi_output.cpp +++ b/src/dxgi/dxgi_output.cpp @@ -26,9 +26,14 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE DxgiOutput::QueryInterface(REFIID riid, void** ppvObject) { - COM_QUERY_IFACE(riid, ppvObject, IUnknown); - COM_QUERY_IFACE(riid, ppvObject, IDXGIObject); - COM_QUERY_IFACE(riid, ppvObject, IDXGIOutput); + *ppvObject = nullptr; + + if (riid == __uuidof(IUnknown) + || riid == __uuidof(IDXGIObject) + || riid == __uuidof(IDXGIOutput)) { + *ppvObject = ref(this); + return S_OK; + } Logger::warn("DxgiOutput::QueryInterface: Unknown interface query"); Logger::warn(str::format(riid)); diff --git a/src/dxgi/dxgi_swapchain.cpp b/src/dxgi/dxgi_swapchain.cpp index 50b447a6..aec79519 100644 --- a/src/dxgi/dxgi_swapchain.cpp +++ b/src/dxgi/dxgi_swapchain.cpp @@ -60,10 +60,15 @@ namespace dxvk { HRESULT STDMETHODCALLTYPE DxgiSwapChain::QueryInterface(REFIID riid, void** ppvObject) { - COM_QUERY_IFACE(riid, ppvObject, IUnknown); - COM_QUERY_IFACE(riid, ppvObject, IDXGIObject); - COM_QUERY_IFACE(riid, ppvObject, IDXGIDeviceSubObject); - COM_QUERY_IFACE(riid, ppvObject, IDXGISwapChain); + *ppvObject = nullptr; + + if (riid == __uuidof(IUnknown) + || riid == __uuidof(IDXGIObject) + || riid == __uuidof(IDXGIDeviceSubObject) + || riid == __uuidof(IDXGISwapChain)) { + *ppvObject = ref(this); + return S_OK; + } Logger::warn("DxgiSwapChain::QueryInterface: Unknown interface query"); Logger::warn(str::format(riid)); diff --git a/src/util/com/com_object.h b/src/util/com/com_object.h index 9781c686..fdd00fc5 100644 --- a/src/util/com/com_object.h +++ b/src/util/com/com_object.h @@ -3,15 +3,6 @@ #include #include "com_include.h" - -#define COM_QUERY_IFACE(riid, ppvObject, Iface) \ - do { \ - if (riid == __uuidof(Iface)) { \ - this->AddRef(); \ - *ppvObject = static_cast(this); \ - return S_OK; \ - } \ - } while (0) namespace dxvk {