=?UTF-8?Q?J=C3=B3zef=20Kucia=20?=: dxgi: Allow wrapping adapter objects.

Alexandre Julliard julliard at winehq.org
Mon Jan 29 14:48:16 CST 2018


Module: wine
Branch: master
Commit: de28d86057764efa2d8eaf35552449e734f2cd7a
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=de28d86057764efa2d8eaf35552449e734f2cd7a

Author: Józef Kucia <jkucia at codeweavers.com>
Date:   Fri Jan 26 22:09:02 2018 +0100

dxgi: Allow wrapping adapter objects.

Signed-off-by: Józef Kucia <jkucia at codeweavers.com>
Signed-off-by: Henri Verbeet <hverbeet at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dxgi/adapter.c       | 18 +++++++++++++++---
 include/wine/winedxgi.idl |  9 +++++++++
 2 files changed, 24 insertions(+), 3 deletions(-)

diff --git a/dlls/dxgi/adapter.c b/dlls/dxgi/adapter.c
index 5440f2a..2ebf24e 100644
--- a/dlls/dxgi/adapter.c
+++ b/dlls/dxgi/adapter.c
@@ -33,7 +33,8 @@ static HRESULT STDMETHODCALLTYPE dxgi_adapter_QueryInterface(IDXGIAdapter1 *ifac
 {
     TRACE("iface %p, iid %s, out %p.\n", iface, debugstr_guid(iid), out);
 
-    if (IsEqualGUID(iid, &IID_IDXGIAdapter1)
+    if (IsEqualGUID(iid, &IID_IWineDXGIAdapter)
+            || IsEqualGUID(iid, &IID_IDXGIAdapter1)
             || IsEqualGUID(iid, &IID_IDXGIAdapter)
             || IsEqualGUID(iid, &IID_IDXGIObject)
             || IsEqualGUID(iid, &IID_IUnknown))
@@ -260,10 +261,21 @@ static const struct IDXGIAdapter1Vtbl dxgi_adapter_vtbl =
 
 struct dxgi_adapter *unsafe_impl_from_IDXGIAdapter1(IDXGIAdapter1 *iface)
 {
+    IWineDXGIAdapter *wine_adapter;
+    struct dxgi_adapter *adapter;
+    HRESULT hr;
+
     if (!iface)
         return NULL;
-    assert(iface->lpVtbl == &dxgi_adapter_vtbl);
-    return CONTAINING_RECORD(iface, struct dxgi_adapter, IDXGIAdapter1_iface);
+    if (FAILED(hr = IDXGIAdapter1_QueryInterface(iface, &IID_IWineDXGIAdapter, (void **)&wine_adapter)))
+    {
+        ERR("Failed to get IWineDXGIAdapter interface, hr %#x.\n", hr);
+        return NULL;
+    }
+    assert(wine_adapter->lpVtbl == (void *)&dxgi_adapter_vtbl);
+    adapter = CONTAINING_RECORD(wine_adapter, struct dxgi_adapter, IDXGIAdapter1_iface);
+    IWineDXGIAdapter_Release(wine_adapter);
+    return adapter;
 }
 
 static void dxgi_adapter_init(struct dxgi_adapter *adapter, struct dxgi_factory *factory, UINT ordinal)
diff --git a/include/wine/winedxgi.idl b/include/wine/winedxgi.idl
index a4f715b..983cdba 100644
--- a/include/wine/winedxgi.idl
+++ b/include/wine/winedxgi.idl
@@ -50,3 +50,12 @@ interface IWineDXGIDeviceParent : IUnknown
 {
     struct wined3d_device_parent *get_wined3d_device_parent();
 }
+
+[
+    object,
+    local,
+    uuid(17399d75-964e-4c03-99f8-9d4fd196dd62)
+]
+interface IWineDXGIAdapter : IDXGIAdapter1
+{
+}




More information about the wine-cvs mailing list