[PATCH 4/4] d3d9: COM cleanup for the IDirect3DSwapChain9 iface.

Michael Stefaniuc mstefani at redhat.de
Mon Apr 11 21:23:41 CDT 2011


---
 dlls/d3d9/d3d9_private.h |    7 ++---
 dlls/d3d9/device.c       |    8 +++---
 dlls/d3d9/swapchain.c    |   61 ++++++++++++++++++++++++++++++----------------
 3 files changed, 47 insertions(+), 29 deletions(-)

diff --git a/dlls/d3d9/d3d9_private.h b/dlls/d3d9/d3d9_private.h
index 4e854a3..afccd3f 100644
--- a/dlls/d3d9/d3d9_private.h
+++ b/dlls/d3d9/d3d9_private.h
@@ -213,18 +213,17 @@ HRESULT volume_init(IDirect3DVolume9Impl *volume, IDirect3DDevice9Impl *device,
  */
 typedef struct IDirect3DSwapChain9Impl
 {
-    /* IUnknown fields */
-    const IDirect3DSwapChain9Vtbl *lpVtbl;
+    IDirect3DSwapChain9     IDirect3DSwapChain9_iface;
     LONG                    ref;
 
     /* IDirect3DSwapChain9 fields */
     IWineD3DSwapChain      *wineD3DSwapChain;
 
     /* Parent reference */
-    LPDIRECT3DDEVICE9EX       parentDevice;
+    IDirect3DDevice9Ex     *parentDevice;
 
     /* Flags an implicit swap chain */
-    BOOL                        isImplicit;
+    BOOL                    isImplicit;
 } IDirect3DSwapChain9Impl;
 
 HRESULT swapchain_init(IDirect3DSwapChain9Impl *swapchain, IDirect3DDevice9Impl *device,
diff --git a/dlls/d3d9/device.c b/dlls/d3d9/device.c
index e88947d..e69374a 100644
--- a/dlls/d3d9/device.c
+++ b/dlls/d3d9/device.c
@@ -189,8 +189,8 @@ static ULONG WINAPI D3D9CB_DestroySwapChain(IWineD3DSwapChain *swapchain)
 
     parent = IWineD3DSwapChain_GetParent(swapchain);
     parent->isImplicit = FALSE;
-    IDirect3DSwapChain9_AddRef((IDirect3DSwapChain9 *)parent);
-    return IDirect3DSwapChain9_Release((IDirect3DSwapChain9 *)parent);
+    IDirect3DSwapChain9_AddRef(&parent->IDirect3DSwapChain9_iface);
+    return IDirect3DSwapChain9_Release(&parent->IDirect3DSwapChain9_iface);
 }
 
 /* IDirect3D IUnknown parts follow: */
@@ -485,7 +485,7 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DDevice9Impl_CreateAdditionalSwa
     }
 
     TRACE("Created swapchain %p.\n", object);
-    *swapchain = (IDirect3DSwapChain9 *)object;
+    *swapchain = &object->IDirect3DSwapChain9_iface;
 
     return D3D_OK;
 }
@@ -3208,7 +3208,7 @@ static HRESULT STDMETHODCALLTYPE device_parent_CreateSwapChain(IWineD3DDevicePar
     *swapchain = d3d_swapchain->wineD3DSwapChain;
     d3d_swapchain->isImplicit = TRUE;
     /* Implicit swap chains are created with an refcount of 0 */
-    IDirect3DSwapChain9_Release((IDirect3DSwapChain9 *)d3d_swapchain);
+    IDirect3DSwapChain9_Release(&d3d_swapchain->IDirect3DSwapChain9_iface);
 
     /* Copy back the presentation parameters */
     present_parameters->BackBufferWidth = local_parameters.BackBufferWidth;
diff --git a/dlls/d3d9/swapchain.c b/dlls/d3d9/swapchain.c
index df1cc77..11e3090 100644
--- a/dlls/d3d9/swapchain.c
+++ b/dlls/d3d9/swapchain.c
@@ -25,10 +25,15 @@
 
 WINE_DEFAULT_DEBUG_CHANNEL(d3d9);
 
-/* IDirect3DSwapChain IUnknown parts follow: */
-static HRESULT WINAPI IDirect3DSwapChain9Impl_QueryInterface(LPDIRECT3DSWAPCHAIN9 iface, REFIID riid, LPVOID* ppobj)
+static inline IDirect3DSwapChain9Impl *impl_from_IDirect3DSwapChain9(IDirect3DSwapChain9 *iface)
 {
-    IDirect3DSwapChain9Impl *This = (IDirect3DSwapChain9Impl *)iface;
+    return CONTAINING_RECORD(iface, IDirect3DSwapChain9Impl, IDirect3DSwapChain9_iface);
+}
+
+static HRESULT WINAPI IDirect3DSwapChain9Impl_QueryInterface(IDirect3DSwapChain9 *iface,
+        REFIID riid, void **ppobj)
+{
+    IDirect3DSwapChain9Impl *This = impl_from_IDirect3DSwapChain9(iface);
 
     TRACE("iface %p, riid %s, object %p.\n", iface, debugstr_guid(riid), ppobj);
 
@@ -44,8 +49,9 @@ static HRESULT WINAPI IDirect3DSwapChain9Impl_QueryInterface(LPDIRECT3DSWAPCHAIN
     return E_NOINTERFACE;
 }
 
-static ULONG WINAPI IDirect3DSwapChain9Impl_AddRef(LPDIRECT3DSWAPCHAIN9 iface) {
-    IDirect3DSwapChain9Impl *This = (IDirect3DSwapChain9Impl *)iface;
+static ULONG WINAPI IDirect3DSwapChain9Impl_AddRef(IDirect3DSwapChain9 *iface)
+{
+    IDirect3DSwapChain9Impl *This = impl_from_IDirect3DSwapChain9(iface);
     ULONG ref = InterlockedIncrement(&This->ref);
 
     TRACE("%p increasing refcount to %u.\n", iface, ref);
@@ -66,8 +72,9 @@ static ULONG WINAPI IDirect3DSwapChain9Impl_AddRef(LPDIRECT3DSWAPCHAIN9 iface) {
     return ref;
 }
 
-static ULONG WINAPI IDirect3DSwapChain9Impl_Release(LPDIRECT3DSWAPCHAIN9 iface) {
-    IDirect3DSwapChain9Impl *This = (IDirect3DSwapChain9Impl *)iface;
+static ULONG WINAPI IDirect3DSwapChain9Impl_Release(IDirect3DSwapChain9 *iface)
+{
+    IDirect3DSwapChain9Impl *This = impl_from_IDirect3DSwapChain9(iface);
     ULONG ref = InterlockedDecrement(&This->ref);
 
     TRACE("%p decreasing refcount to %u.\n", iface, ref);
@@ -88,8 +95,11 @@ static ULONG WINAPI IDirect3DSwapChain9Impl_Release(LPDIRECT3DSWAPCHAIN9 iface)
 }
 
 /* IDirect3DSwapChain9 parts follow: */
-static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DSwapChain9Impl_Present(LPDIRECT3DSWAPCHAIN9 iface, CONST RECT* pSourceRect, CONST RECT* pDestRect, HWND hDestWindowOverride, CONST RGNDATA* pDirtyRegion, DWORD dwFlags) {
-    IDirect3DSwapChain9Impl *This = (IDirect3DSwapChain9Impl *)iface;
+static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DSwapChain9Impl_Present(IDirect3DSwapChain9 *iface,
+        const RECT *pSourceRect, const RECT *pDestRect, HWND hDestWindowOverride,
+        const RGNDATA *pDirtyRegion, DWORD dwFlags)
+{
+    IDirect3DSwapChain9Impl *This = impl_from_IDirect3DSwapChain9(iface);
     HRESULT hr;
 
     TRACE("iface %p, src_rect %p, dst_rect %p, dst_window_override %p, dirty_region %p, flags %#x.\n",
@@ -102,8 +112,10 @@ static HRESULT WINAPI DECLSPEC_HOTPATCH IDirect3DSwapChain9Impl_Present(LPDIRECT
     return hr;
 }
 
-static HRESULT WINAPI IDirect3DSwapChain9Impl_GetFrontBufferData(LPDIRECT3DSWAPCHAIN9 iface, IDirect3DSurface9* pDestSurface) {
-    IDirect3DSwapChain9Impl *This = (IDirect3DSwapChain9Impl *)iface;
+static HRESULT WINAPI IDirect3DSwapChain9Impl_GetFrontBufferData(IDirect3DSwapChain9 *iface,
+        IDirect3DSurface9 *pDestSurface)
+{
+    IDirect3DSwapChain9Impl *This = impl_from_IDirect3DSwapChain9(iface);
     HRESULT hr;
 
     TRACE("iface %p, surface %p.\n", iface, pDestSurface);
@@ -118,7 +130,7 @@ static HRESULT WINAPI IDirect3DSwapChain9Impl_GetFrontBufferData(LPDIRECT3DSWAPC
 static HRESULT WINAPI IDirect3DSwapChain9Impl_GetBackBuffer(IDirect3DSwapChain9 *iface,
         UINT iBackBuffer, D3DBACKBUFFER_TYPE Type, IDirect3DSurface9 **ppBackBuffer)
 {
-    IDirect3DSwapChain9Impl *This = (IDirect3DSwapChain9Impl *)iface;
+    IDirect3DSwapChain9Impl *This = impl_from_IDirect3DSwapChain9(iface);
     IWineD3DSurface *mySurface = NULL;
     HRESULT hr;
 
@@ -140,8 +152,10 @@ static HRESULT WINAPI IDirect3DSwapChain9Impl_GetBackBuffer(IDirect3DSwapChain9
     return hr;
 }
 
-static HRESULT WINAPI IDirect3DSwapChain9Impl_GetRasterStatus(LPDIRECT3DSWAPCHAIN9 iface, D3DRASTER_STATUS* pRasterStatus) {
-    IDirect3DSwapChain9Impl *This = (IDirect3DSwapChain9Impl *)iface;
+static HRESULT WINAPI IDirect3DSwapChain9Impl_GetRasterStatus(IDirect3DSwapChain9 *iface,
+        D3DRASTER_STATUS *pRasterStatus)
+{
+    IDirect3DSwapChain9Impl *This = impl_from_IDirect3DSwapChain9(iface);
     HRESULT hr;
 
     TRACE("iface %p, raster_status %p.\n", iface, pRasterStatus);
@@ -153,8 +167,10 @@ static HRESULT WINAPI IDirect3DSwapChain9Impl_GetRasterStatus(LPDIRECT3DSWAPCHAI
     return hr;
 }
 
-static HRESULT WINAPI IDirect3DSwapChain9Impl_GetDisplayMode(LPDIRECT3DSWAPCHAIN9 iface, D3DDISPLAYMODE* pMode) {
-    IDirect3DSwapChain9Impl *This = (IDirect3DSwapChain9Impl *)iface;
+static HRESULT WINAPI IDirect3DSwapChain9Impl_GetDisplayMode(IDirect3DSwapChain9 *iface,
+        D3DDISPLAYMODE *pMode)
+{
+    IDirect3DSwapChain9Impl *This = impl_from_IDirect3DSwapChain9(iface);
     HRESULT hr;
 
     TRACE("iface %p, mode %p.\n", iface, pMode);
@@ -168,9 +184,10 @@ static HRESULT WINAPI IDirect3DSwapChain9Impl_GetDisplayMode(LPDIRECT3DSWAPCHAIN
     return hr;
 }
 
-static HRESULT WINAPI IDirect3DSwapChain9Impl_GetDevice(IDirect3DSwapChain9 *iface, IDirect3DDevice9 **device)
+static HRESULT WINAPI IDirect3DSwapChain9Impl_GetDevice(IDirect3DSwapChain9 *iface,
+        IDirect3DDevice9 **device)
 {
-    IDirect3DSwapChain9Impl *This = (IDirect3DSwapChain9Impl *)iface;
+    IDirect3DSwapChain9Impl *This = impl_from_IDirect3DSwapChain9(iface);
 
     TRACE("iface %p, device %p.\n", iface, device);
 
@@ -182,8 +199,10 @@ static HRESULT WINAPI IDirect3DSwapChain9Impl_GetDevice(IDirect3DSwapChain9 *ifa
     return D3D_OK;
 }
 
-static HRESULT WINAPI IDirect3DSwapChain9Impl_GetPresentParameters(LPDIRECT3DSWAPCHAIN9 iface, D3DPRESENT_PARAMETERS* pPresentationParameters) {
-    IDirect3DSwapChain9Impl *This = (IDirect3DSwapChain9Impl *)iface;
+static HRESULT WINAPI IDirect3DSwapChain9Impl_GetPresentParameters(IDirect3DSwapChain9 *iface,
+        D3DPRESENT_PARAMETERS *pPresentationParameters)
+{
+    IDirect3DSwapChain9Impl *This = impl_from_IDirect3DSwapChain9(iface);
     WINED3DPRESENT_PARAMETERS winePresentParameters;
     HRESULT hr;
 
@@ -243,7 +262,7 @@ HRESULT swapchain_init(IDirect3DSwapChain9Impl *swapchain, IDirect3DDevice9Impl
     HRESULT hr;
 
     swapchain->ref = 1;
-    swapchain->lpVtbl = &Direct3DSwapChain9_Vtbl;
+    swapchain->IDirect3DSwapChain9_iface.lpVtbl = &Direct3DSwapChain9_Vtbl;
 
     wined3d_parameters.BackBufferWidth = present_parameters->BackBufferWidth;
     wined3d_parameters.BackBufferHeight = present_parameters->BackBufferHeight;
-- 
1.7.4.2



More information about the wine-patches mailing list