[PATCH 3/3] d3d9: Finish the COM cleanup of the IDirect3DDevice9Ex iface.

Michael Stefaniuc mstefani at redhat.de
Sun Apr 24 14:34:30 CDT 2011


---
 dlls/d3d9/buffer.c            |    4 ++--
 dlls/d3d9/cubetexture.c       |    2 +-
 dlls/d3d9/d3d9_private.h      |   10 +++-------
 dlls/d3d9/device.c            |   28 +++++++++++++++-------------
 dlls/d3d9/directx.c           |    2 +-
 dlls/d3d9/query.c             |    2 +-
 dlls/d3d9/shader.c            |    4 ++--
 dlls/d3d9/stateblock.c        |    2 +-
 dlls/d3d9/surface.c           |    2 +-
 dlls/d3d9/swapchain.c         |    2 +-
 dlls/d3d9/texture.c           |    2 +-
 dlls/d3d9/vertexdeclaration.c |    2 +-
 dlls/d3d9/volumetexture.c     |    2 +-
 13 files changed, 31 insertions(+), 33 deletions(-)

diff --git a/dlls/d3d9/buffer.c b/dlls/d3d9/buffer.c
index 827a191..f10e531 100644
--- a/dlls/d3d9/buffer.c
+++ b/dlls/d3d9/buffer.c
@@ -281,7 +281,7 @@ HRESULT vertexbuffer_init(IDirect3DVertexBuffer9Impl *buffer, IDirect3DDevice9Im
         return hr;
     }
 
-    buffer->parentDevice = (IDirect3DDevice9Ex *)device;
+    buffer->parentDevice = &device->IDirect3DDevice9Ex_iface;
     IDirect3DDevice9Ex_AddRef(buffer->parentDevice);
 
     return D3D_OK;
@@ -544,7 +544,7 @@ HRESULT indexbuffer_init(IDirect3DIndexBuffer9Impl *buffer, IDirect3DDevice9Impl
         return hr;
     }
 
-    buffer->parentDevice = (IDirect3DDevice9Ex *)device;
+    buffer->parentDevice = &device->IDirect3DDevice9Ex_iface;
     IDirect3DDevice9Ex_AddRef(buffer->parentDevice);
 
     return D3D_OK;
diff --git a/dlls/d3d9/cubetexture.c b/dlls/d3d9/cubetexture.c
index 95f133a..0a3c569 100644
--- a/dlls/d3d9/cubetexture.c
+++ b/dlls/d3d9/cubetexture.c
@@ -480,7 +480,7 @@ HRESULT cubetexture_init(IDirect3DCubeTexture9Impl *texture, IDirect3DDevice9Imp
         return hr;
     }
 
-    texture->parentDevice = (IDirect3DDevice9Ex *)device;
+    texture->parentDevice = &device->IDirect3DDevice9Ex_iface;
     IDirect3DDevice9Ex_AddRef(texture->parentDevice);
 
     return D3D_OK;
diff --git a/dlls/d3d9/d3d9_private.h b/dlls/d3d9/d3d9_private.h
index c3392d7..fe68b53 100644
--- a/dlls/d3d9/d3d9_private.h
+++ b/dlls/d3d9/d3d9_private.h
@@ -162,14 +162,10 @@ void filter_caps(D3DCAPS9* pCaps) DECLSPEC_HIDDEN;
  */
 typedef struct IDirect3DDevice9Impl
 {
-    /* IUnknown fields */
-    const IDirect3DDevice9ExVtbl   *lpVtbl;
+    IDirect3DDevice9Ex IDirect3DDevice9Ex_iface;
     const IWineD3DDeviceParentVtbl *device_parent_vtbl;
-    LONG                          ref;
-
-    /* IDirect3DDevice9 fields */
-    IWineD3DDevice               *WineD3DDevice;
-
+    LONG ref;
+    IWineD3DDevice *WineD3DDevice;
     /* Avoids recursion with nested ReleaseRef to 0 */
     BOOL                          inDestruction;
 
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c
index c316e8c..5e70b45 100644
--- a/dlls/d3d9/device.c
+++ b/dlls/d3d9/device.c
@@ -183,7 +183,7 @@ static UINT vertex_count_from_primitive_count(D3DPRIMITIVETYPE primitive_type, U
 
 static inline IDirect3DDevice9Impl *impl_from_IDirect3DDevice9Ex(IDirect3DDevice9Ex *iface)
 {
-    return CONTAINING_RECORD(iface, IDirect3DDevice9Impl, lpVtbl);
+    return CONTAINING_RECORD(iface, IDirect3DDevice9Impl, IDirect3DDevice9Ex_iface);
 }
 
 static HRESULT WINAPI IDirect3DDevice9Impl_QueryInterface(IDirect3DDevice9Ex *iface, REFIID riid,
@@ -2213,7 +2213,8 @@ static IDirect3DVertexDeclaration9 *getConvertedDecl(IDirect3DDevice9Impl *This,
     hr = vdecl_convert_fvf(fvf, &elements);
     if (hr != S_OK) return NULL;
 
-    hr = IDirect3DDevice9Impl_CreateVertexDeclaration((IDirect3DDevice9Ex *) This, elements, &pDecl);
+    hr = IDirect3DDevice9Impl_CreateVertexDeclaration(&This->IDirect3DDevice9Ex_iface, elements,
+            &pDecl);
     HeapFree(GetProcessHeap(), 0, elements); /* CreateVertexDeclaration makes a copy */
     if (hr != S_OK) return NULL;
 
@@ -3142,22 +3143,23 @@ static inline struct IDirect3DDevice9Impl *device_from_device_parent(IWineD3DDev
             - FIELD_OFFSET(struct IDirect3DDevice9Impl, device_parent_vtbl));
 }
 
-static HRESULT STDMETHODCALLTYPE device_parent_QueryInterface(IWineD3DDeviceParent *iface, REFIID riid, void **object)
+static HRESULT STDMETHODCALLTYPE device_parent_QueryInterface(IWineD3DDeviceParent *iface,
+        REFIID riid, void **object)
 {
     struct IDirect3DDevice9Impl *This = device_from_device_parent(iface);
-    return IDirect3DDevice9Impl_QueryInterface((IDirect3DDevice9Ex *)This, riid, object);
+    return IDirect3DDevice9Impl_QueryInterface(&This->IDirect3DDevice9Ex_iface, riid, object);
 }
 
 static ULONG STDMETHODCALLTYPE device_parent_AddRef(IWineD3DDeviceParent *iface)
 {
     struct IDirect3DDevice9Impl *This = device_from_device_parent(iface);
-    return IDirect3DDevice9Impl_AddRef((IDirect3DDevice9Ex *)This);
+    return IDirect3DDevice9Impl_AddRef(&This->IDirect3DDevice9Ex_iface);
 }
 
 static ULONG STDMETHODCALLTYPE device_parent_Release(IWineD3DDeviceParent *iface)
 {
     struct IDirect3DDevice9Impl *This = device_from_device_parent(iface);
-    return IDirect3DDevice9Impl_Release((IDirect3DDevice9Ex *)This);
+    return IDirect3DDevice9Impl_Release(&This->IDirect3DDevice9Ex_iface);
 }
 
 /* IWineD3DDeviceParent methods */
@@ -3218,7 +3220,7 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateRenderTarget(IWineD3DDevice
             "\tmultisample_quality %u, lockable %u, surface %p\n",
             iface, container_parent, width, height, format, multisample_type, multisample_quality, lockable, surface);
 
-    hr = IDirect3DDevice9Impl_CreateRenderTarget((IDirect3DDevice9Ex *)This, width, height,
+    hr = IDirect3DDevice9Impl_CreateRenderTarget(&This->IDirect3DDevice9Ex_iface, width, height,
             d3dformat_from_wined3dformat(format), multisample_type, multisample_quality, lockable,
             (IDirect3DSurface9 **)&d3d_surface, NULL);
     if (FAILED(hr))
@@ -3249,9 +3251,9 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateDepthStencilSurface(IWineD3
             "\tmultisample_quality %u, discard %u, surface %p\n",
             iface, width, height, format, multisample_type, multisample_quality, discard, surface);
 
-    hr = IDirect3DDevice9Impl_CreateDepthStencilSurface((IDirect3DDevice9Ex *)This, width, height,
-            d3dformat_from_wined3dformat(format), multisample_type, multisample_quality, discard,
-            (IDirect3DSurface9 **)&d3d_surface, NULL);
+    hr = IDirect3DDevice9Impl_CreateDepthStencilSurface(&This->IDirect3DDevice9Ex_iface, width,
+            height, d3dformat_from_wined3dformat(format), multisample_type, multisample_quality,
+            discard, (IDirect3DSurface9 **)&d3d_surface, NULL);
     if (FAILED(hr))
     {
         ERR("(%p) CreateDepthStencilSurface failed, returning %#x\n", iface, hr);
@@ -3260,7 +3262,7 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateDepthStencilSurface(IWineD3
 
     *surface = d3d_surface->wineD3DSurface;
     IWineD3DSurface_AddRef(*surface);
-    d3d_surface->container = (IUnknown *)This;
+    d3d_surface->container = (IUnknown *)&This->IDirect3DDevice9Ex_iface;
     /* Implicit surfaces are created with an refcount of 0 */
     IDirect3DSurface9_Release((IDirect3DSurface9 *)d3d_surface);
 
@@ -3333,7 +3335,7 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateSwapChain(IWineD3DDevicePar
     local_parameters.FullScreen_RefreshRateInHz = present_parameters->FullScreen_RefreshRateInHz;
     local_parameters.PresentationInterval = present_parameters->PresentationInterval;
 
-    hr = IDirect3DDevice9Impl_CreateAdditionalSwapChain((IDirect3DDevice9Ex *)This,
+    hr = IDirect3DDevice9Impl_CreateAdditionalSwapChain(&This->IDirect3DDevice9Ex_iface,
             &local_parameters, &d3d_swapchain);
     if (FAILED(hr))
     {
@@ -3402,7 +3404,7 @@ HRESULT device_init(IDirect3DDevice9Impl *device, struct wined3d *wined3d, UINT
     if (mode)
         FIXME("Ignoring display mode.\n");
 
-    device->lpVtbl = &Direct3DDevice9_Vtbl;
+    device->IDirect3DDevice9Ex_iface.lpVtbl = &Direct3DDevice9_Vtbl;
     device->device_parent_vtbl = &d3d9_wined3d_device_parent_vtbl;
     device->ref = 1;
 
diff --git a/dlls/d3d9/directx.c b/dlls/d3d9/directx.c
index 71ae870..7a22c30 100644
--- a/dlls/d3d9/directx.c
+++ b/dlls/d3d9/directx.c
@@ -516,7 +516,7 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3D9ExImpl_CreateDeviceEx(IDirect3
     }
 
     TRACE("Created device %p.\n", object);
-    *device = (IDirect3DDevice9Ex *)object;
+    *device = &object->IDirect3DDevice9Ex_iface;
 
     return D3D_OK;
 }
diff --git a/dlls/d3d9/query.c b/dlls/d3d9/query.c
index 918c21f..5e1bf12 100644
--- a/dlls/d3d9/query.c
+++ b/dlls/d3d9/query.c
@@ -179,7 +179,7 @@ HRESULT query_init(IDirect3DQuery9Impl *query, IDirect3DDevice9Impl *device, D3D
         return hr;
     }
 
-    query->parentDevice = (IDirect3DDevice9Ex *)device;
+    query->parentDevice = &device->IDirect3DDevice9Ex_iface;
     IDirect3DDevice9Ex_AddRef(query->parentDevice);
 
     return D3D_OK;
diff --git a/dlls/d3d9/shader.c b/dlls/d3d9/shader.c
index 0c11562..d4bc4c0 100644
--- a/dlls/d3d9/shader.c
+++ b/dlls/d3d9/shader.c
@@ -144,7 +144,7 @@ HRESULT vertexshader_init(IDirect3DVertexShader9Impl *shader, IDirect3DDevice9Im
         return hr;
     }
 
-    shader->parentDevice = (IDirect3DDevice9Ex *)device;
+    shader->parentDevice = &device->IDirect3DDevice9Ex_iface;
     IDirect3DDevice9Ex_AddRef(shader->parentDevice);
 
     return D3D_OK;
@@ -271,7 +271,7 @@ HRESULT pixelshader_init(IDirect3DPixelShader9Impl *shader, IDirect3DDevice9Impl
         return hr;
     }
 
-    shader->parentDevice = (IDirect3DDevice9Ex *)device;
+    shader->parentDevice = &device->IDirect3DDevice9Ex_iface;
     IDirect3DDevice9Ex_AddRef(shader->parentDevice);
 
     return D3D_OK;
diff --git a/dlls/d3d9/stateblock.c b/dlls/d3d9/stateblock.c
index 46a4de5..58994c0 100644
--- a/dlls/d3d9/stateblock.c
+++ b/dlls/d3d9/stateblock.c
@@ -159,7 +159,7 @@ HRESULT stateblock_init(IDirect3DStateBlock9Impl *stateblock, IDirect3DDevice9Im
         }
     }
 
-    stateblock->parentDevice = (IDirect3DDevice9Ex *)device;
+    stateblock->parentDevice = &device->IDirect3DDevice9Ex_iface;
     IDirect3DDevice9Ex_AddRef(stateblock->parentDevice);
 
     return D3D_OK;
diff --git a/dlls/d3d9/surface.c b/dlls/d3d9/surface.c
index 7cca2d6..8e81092 100644
--- a/dlls/d3d9/surface.c
+++ b/dlls/d3d9/surface.c
@@ -402,7 +402,7 @@ HRESULT surface_init(IDirect3DSurface9Impl *surface, IDirect3DDevice9Impl *devic
         return hr;
     }
 
-    surface->parentDevice = (IDirect3DDevice9Ex *)device;
+    surface->parentDevice = &device->IDirect3DDevice9Ex_iface;
     IDirect3DDevice9Ex_AddRef(surface->parentDevice);
 
     return D3D_OK;
diff --git a/dlls/d3d9/swapchain.c b/dlls/d3d9/swapchain.c
index 8f5ed9c..8730d16 100644
--- a/dlls/d3d9/swapchain.c
+++ b/dlls/d3d9/swapchain.c
@@ -285,7 +285,7 @@ HRESULT swapchain_init(IDirect3DSwapChain9Impl *swapchain, IDirect3DDevice9Impl
         return hr;
     }
 
-    swapchain->parentDevice = (IDirect3DDevice9Ex *)device;
+    swapchain->parentDevice = &device->IDirect3DDevice9Ex_iface;
     IDirect3DDevice9Ex_AddRef(swapchain->parentDevice);
 
     return D3D_OK;
diff --git a/dlls/d3d9/texture.c b/dlls/d3d9/texture.c
index a2bbb37..21fb910 100644
--- a/dlls/d3d9/texture.c
+++ b/dlls/d3d9/texture.c
@@ -467,7 +467,7 @@ HRESULT texture_init(IDirect3DTexture9Impl *texture, IDirect3DDevice9Impl *devic
         return hr;
     }
 
-    texture->parentDevice = (IDirect3DDevice9Ex *)device;
+    texture->parentDevice = &device->IDirect3DDevice9Ex_iface;
     IDirect3DDevice9Ex_AddRef(texture->parentDevice);
 
     return D3D_OK;
diff --git a/dlls/d3d9/vertexdeclaration.c b/dlls/d3d9/vertexdeclaration.c
index a478813..ec260e4 100644
--- a/dlls/d3d9/vertexdeclaration.c
+++ b/dlls/d3d9/vertexdeclaration.c
@@ -406,7 +406,7 @@ HRESULT vertexdeclaration_init(IDirect3DVertexDeclaration9Impl *declaration,
         return hr;
     }
 
-    declaration->parentDevice = (IDirect3DDevice9Ex *)device;
+    declaration->parentDevice = &device->IDirect3DDevice9Ex_iface;
     IDirect3DDevice9Ex_AddRef(declaration->parentDevice);
 
     return D3D_OK;
diff --git a/dlls/d3d9/volumetexture.c b/dlls/d3d9/volumetexture.c
index 7f4f217..914be0a 100644
--- a/dlls/d3d9/volumetexture.c
+++ b/dlls/d3d9/volumetexture.c
@@ -453,7 +453,7 @@ HRESULT volumetexture_init(IDirect3DVolumeTexture9Impl *texture, IDirect3DDevice
         return hr;
     }
 
-    texture->parentDevice = (IDirect3DDevice9Ex *)device;
+    texture->parentDevice = &device->IDirect3DDevice9Ex_iface;
     IDirect3DDevice9Ex_AddRef(texture->parentDevice);
 
     return D3D_OK;
-- 
1.7.4.4



More information about the wine-patches mailing list