d3d10core: Standardize COM aggregation for d3d10_device.

Michael Stefaniuc mstefani at redhat.de
Thu Mar 22 11:18:47 CDT 2012


---
Fixes two bugs:
- Assigning This to ppv.
- TRACE was still talking about "opbject" instead of "ppv" (thanks
  Henri)


 dlls/d3d10core/d3d10core_main.c    |    2 +-
 dlls/d3d10core/d3d10core_private.h |    4 +-
 dlls/d3d10core/device.c            |   65 ++++++++++++++++--------------------
 3 files changed, 32 insertions(+), 39 deletions(-)

diff --git a/dlls/d3d10core/d3d10core_main.c b/dlls/d3d10core/d3d10core_main.c
index 9d0c5d7..e977afa 100644
--- a/dlls/d3d10core/d3d10core_main.c
+++ b/dlls/d3d10core/d3d10core_main.c
@@ -82,7 +82,7 @@ static HRESULT WINAPI layer_create(enum dxgi_device_layer_id id, void **layer_ba
 
     object = *layer_base;
     d3d10_device_init(object, device_object);
-    *device_layer = &object->inner_unknown_vtbl;
+    *device_layer = &object->IUnknown_inner;
 
     TRACE("Created d3d10 device at %p\n", object);
 
diff --git a/dlls/d3d10core/d3d10core_private.h b/dlls/d3d10core/d3d10core_private.h
index 21e2e95..d99a337 100644
--- a/dlls/d3d10core/d3d10core_private.h
+++ b/dlls/d3d10core/d3d10core_private.h
@@ -69,10 +69,10 @@ HRESULT parse_dxbc(const char *data, SIZE_T data_size,
 /* IDirect3D10Device */
 struct d3d10_device
 {
+    IUnknown IUnknown_inner;
     ID3D10Device ID3D10Device_iface;
-    const struct IUnknownVtbl *inner_unknown_vtbl;
     IWineDXGIDeviceParent IWineDXGIDeviceParent_iface;
-    IUnknown *outer_unknown;
+    IUnknown *outer_unk;
     LONG refcount;
 
     struct wined3d_device_parent device_parent;
diff --git a/dlls/d3d10core/device.c b/dlls/d3d10core/device.c
index 7ca4409..cf21bba 100644
--- a/dlls/d3d10core/device.c
+++ b/dlls/d3d10core/device.c
@@ -26,41 +26,36 @@ WINE_DEFAULT_DEBUG_CHANNEL(d3d10core);
 
 /* Inner IUnknown methods */
 
-static inline struct d3d10_device *d3d10_device_from_inner_unknown(IUnknown *iface)
+static inline struct d3d10_device *impl_from_IUnknown(IUnknown *iface)
 {
-    return (struct d3d10_device *)((char*)iface - FIELD_OFFSET(struct d3d10_device, inner_unknown_vtbl));
+    return CONTAINING_RECORD(iface, struct d3d10_device, IUnknown_inner);
 }
 
-static HRESULT STDMETHODCALLTYPE d3d10_device_inner_QueryInterface(IUnknown *iface, REFIID riid, void **object)
+static HRESULT STDMETHODCALLTYPE d3d10_device_inner_QueryInterface(IUnknown *iface, REFIID riid,
+        void **ppv)
 {
-    struct d3d10_device *This = d3d10_device_from_inner_unknown(iface);
+    struct d3d10_device *This = impl_from_IUnknown(iface);
 
-    TRACE("iface %p, riid %s, object %p\n", iface, debugstr_guid(riid), object);
+    TRACE("iface %p, riid %s, ppv %p\n", iface, debugstr_guid(riid), ppv);
 
-    if (IsEqualGUID(riid, &IID_IUnknown)
-            || IsEqualGUID(riid, &IID_ID3D10Device))
+    if (IsEqualGUID(riid, &IID_IUnknown) || IsEqualGUID(riid, &IID_ID3D10Device))
+        *ppv = &This->ID3D10Device_iface;
+    else if (IsEqualGUID(riid, &IID_IWineDXGIDeviceParent))
+        *ppv = &This->IWineDXGIDeviceParent_iface;
+    else
     {
-        ID3D10Device_AddRef(&This->ID3D10Device_iface);
-        *object = This;
-        return S_OK;
+        WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(riid));
+        *ppv = NULL;
+        return E_NOINTERFACE;
     }
 
-    if (IsEqualGUID(riid, &IID_IWineDXGIDeviceParent))
-    {
-        IWineDXGIDeviceParent_AddRef(&This->IWineDXGIDeviceParent_iface);
-        *object = &This->IWineDXGIDeviceParent_iface;
-        return S_OK;
-    }
-
-    WARN("%s not implemented, returning E_NOINTERFACE\n", debugstr_guid(riid));
-
-    *object = NULL;
-    return E_NOINTERFACE;
+    IUnknown_AddRef((IUnknown*)*ppv);
+    return S_OK;
 }
 
 static ULONG STDMETHODCALLTYPE d3d10_device_inner_AddRef(IUnknown *iface)
 {
-    struct d3d10_device *This = d3d10_device_from_inner_unknown(iface);
+    struct d3d10_device *This = impl_from_IUnknown(iface);
     ULONG refcount = InterlockedIncrement(&This->refcount);
 
     TRACE("%p increasing refcount to %u\n", This, refcount);
@@ -70,7 +65,7 @@ static ULONG STDMETHODCALLTYPE d3d10_device_inner_AddRef(IUnknown *iface)
 
 static ULONG STDMETHODCALLTYPE d3d10_device_inner_Release(IUnknown *iface)
 {
-    struct d3d10_device *This = d3d10_device_from_inner_unknown(iface);
+    struct d3d10_device *This = impl_from_IUnknown(iface);
     ULONG refcount = InterlockedDecrement(&This->refcount);
 
     TRACE("%p decreasing refcount to %u\n", This, refcount);
@@ -92,25 +87,22 @@ static inline struct d3d10_device *impl_from_ID3D10Device(ID3D10Device *iface)
 }
 
 static HRESULT STDMETHODCALLTYPE d3d10_device_QueryInterface(ID3D10Device *iface, REFIID riid,
-        void **object)
+        void **ppv)
 {
     struct d3d10_device *This = impl_from_ID3D10Device(iface);
-    TRACE("Forwarding to outer IUnknown\n");
-    return IUnknown_QueryInterface(This->outer_unknown, riid, object);
+    return IUnknown_QueryInterface(This->outer_unk, riid, ppv);
 }
 
 static ULONG STDMETHODCALLTYPE d3d10_device_AddRef(ID3D10Device *iface)
 {
     struct d3d10_device *This = impl_from_ID3D10Device(iface);
-    TRACE("Forwarding to outer IUnknown\n");
-    return IUnknown_AddRef(This->outer_unknown);
+    return IUnknown_AddRef(This->outer_unk);
 }
 
 static ULONG STDMETHODCALLTYPE d3d10_device_Release(ID3D10Device *iface)
 {
     struct d3d10_device *This = impl_from_ID3D10Device(iface);
-    TRACE("Forwarding to outer IUnknown\n");
-    return IUnknown_Release(This->outer_unknown);
+    return IUnknown_Release(This->outer_unk);
 }
 
 /* ID3D10Device methods */
@@ -1306,22 +1298,22 @@ static inline struct d3d10_device *device_from_dxgi_device_parent(IWineDXGIDevic
 }
 
 static HRESULT STDMETHODCALLTYPE dxgi_device_parent_QueryInterface(IWineDXGIDeviceParent *iface,
-        REFIID riid, void **object)
+        REFIID riid, void **ppv)
 {
     struct d3d10_device *device = device_from_dxgi_device_parent(iface);
-    return d3d10_device_QueryInterface(&device->ID3D10Device_iface, riid, object);
+    return IUnknown_QueryInterface(device->outer_unk, riid, ppv);
 }
 
 static ULONG STDMETHODCALLTYPE dxgi_device_parent_AddRef(IWineDXGIDeviceParent *iface)
 {
     struct d3d10_device *device = device_from_dxgi_device_parent(iface);
-    return d3d10_device_AddRef(&device->ID3D10Device_iface);
+    return IUnknown_AddRef(device->outer_unk);
 }
 
 static ULONG STDMETHODCALLTYPE dxgi_device_parent_Release(IWineDXGIDeviceParent *iface)
 {
     struct d3d10_device *device = device_from_dxgi_device_parent(iface);
-    return d3d10_device_Release(&device->ID3D10Device_iface);
+    return IUnknown_Release(device->outer_unk);
 }
 
 static struct wined3d_device_parent * STDMETHODCALLTYPE dxgi_device_parent_get_wined3d_device_parent(
@@ -1554,9 +1546,10 @@ static const struct wined3d_device_parent_ops d3d10_wined3d_device_parent_ops =
 void d3d10_device_init(struct d3d10_device *device, void *outer_unknown)
 {
     device->ID3D10Device_iface.lpVtbl = &d3d10_device_vtbl;
-    device->inner_unknown_vtbl = &d3d10_device_inner_unknown_vtbl;
+    device->IUnknown_inner.lpVtbl = &d3d10_device_inner_unknown_vtbl;
     device->IWineDXGIDeviceParent_iface.lpVtbl = &d3d10_dxgi_device_parent_vtbl;
     device->device_parent.ops = &d3d10_wined3d_device_parent_ops;
     device->refcount = 1;
-    device->outer_unknown = outer_unknown;
+    /* COM aggregation always takes place */
+    device->outer_unk = outer_unknown;
 }
-- 
1.7.6.5



More information about the wine-patches mailing list